]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - sim/igen/gen-support.c
GDB copyright headers update after running GDB's copyright.py script.
[thirdparty/binutils-gdb.git] / sim / igen / gen-support.c
CommitLineData
feaee4bd
AC
1/* The IGEN simulator generator for GDB, the GNU Debugger.
2
618f726f 3 Copyright 2002-2016 Free Software Foundation, Inc.
feaee4bd
AC
4
5 Contributed by Andrew Cagney.
6
7 This file is part of GDB.
8
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
4744ac1b 11 the Free Software Foundation; either version 3 of the License, or
feaee4bd
AC
12 (at your option) any later version.
13
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
18
19 You should have received a copy of the GNU General Public License
4744ac1b 20 along with this program. If not, see <http://www.gnu.org/licenses/>. */
feaee4bd 21
c906108c
SS
22
23#include "misc.h"
24#include "lf.h"
25#include "table.h"
26#include "filter.h"
27
28#include "igen.h"
29
30#include "ld-insn.h"
31#include "ld-decode.h"
32
33#include "gen.h"
34
35#include "gen-semantics.h"
36#include "gen-support.h"
37
38static void
39print_support_function_name (lf *file,
4e0bf4c4 40 function_entry * function,
c906108c
SS
41 int is_function_definition)
42{
43 if (function->is_internal)
44 {
45 lf_print__function_type_function (file, print_semantic_function_type,
46 "INLINE_SUPPORT",
4e0bf4c4
AC
47 (is_function_definition ? "\n" :
48 " "));
49 print_function_name (file, function->name, NULL, NULL, NULL,
c906108c
SS
50 function_name_prefix_semantics);
51 lf_printf (file, "\n(");
52 lf_indent (file, +1);
53 print_semantic_function_formal (file, 0);
54 lf_indent (file, -1);
55 lf_printf (file, ")");
56 if (!is_function_definition)
57 lf_printf (file, ";");
58 lf_printf (file, "\n");
59 }
60 else
61 {
62 /* map the name onto a globally valid name */
63 if (!is_function_definition
64 && strcmp (options.module.support.prefix.l, "") != 0)
65 {
66 lf_indent_suppress (file);
67 lf_printf (file, "#define %s %s%s\n",
68 function->name,
4e0bf4c4 69 options.module.support.prefix.l, function->name);
c906108c
SS
70 }
71 lf_print__function_type (file,
72 function->type,
73 "INLINE_SUPPORT",
74 (is_function_definition ? "\n" : " "));
75 lf_printf (file, "%s%s\n(",
4e0bf4c4 76 options.module.support.prefix.l, function->name);
c906108c
SS
77 if (options.gen.smp)
78 lf_printf (file,
79 "sim_cpu *cpu, %sinstruction_address cia, int MY_INDEX",
80 options.module.support.prefix.l);
81 else
82 lf_printf (file,
83 "SIM_DESC sd, %sinstruction_address cia, int MY_INDEX",
84 options.module.support.prefix.l);
4e0bf4c4 85 if (function->param != NULL && strlen (function->param) > 0)
c906108c
SS
86 lf_printf (file, ", %s", function->param);
87 lf_printf (file, ")%s", (is_function_definition ? "\n" : ";\n"));
88 }
89}
90
91
92static void
4e0bf4c4 93support_h_function (lf *file, function_entry * function, void *data)
c906108c
SS
94{
95 ASSERT (function->type != NULL);
4e0bf4c4
AC
96 print_support_function_name (file, function, 0 /*!is_definition */ );
97 lf_printf (file, "\n");
c906108c
SS
98}
99
100
101extern void
4e0bf4c4 102gen_support_h (lf *file, insn_table *table)
c906108c 103{
4e0bf4c4
AC
104 /* output the definition of `SD_' */
105 if (options.gen.smp)
c906108c 106 {
4e0bf4c4
AC
107 lf_printf (file, "#define SD CPU_STATE (cpu)\n");
108 lf_printf (file, "#define CPU cpu\n");
109 lf_printf (file, "#define CPU_ cpu\n");
c906108c
SS
110 }
111 else
112 {
4e0bf4c4
AC
113 lf_printf (file, "#define SD sd\n");
114 lf_printf (file, "#define CPU (STATE_CPU (sd, 0))\n");
115 lf_printf (file, "#define CPU_ sd\n");
c906108c
SS
116 }
117
4e0bf4c4 118 lf_printf (file, "#define CIA_ cia\n");
c906108c
SS
119 if (options.gen.delayed_branch)
120 {
4e0bf4c4
AC
121 lf_printf (file, "#define CIA cia.ip\n");
122 lf_printf (file,
123 "/* #define NIA nia.dp -- do not define, ambigious */\n");
c906108c
SS
124 }
125 else
126 {
4e0bf4c4
AC
127 lf_printf (file, "#define CIA cia\n");
128 lf_printf (file, "#define NIA nia\n");
c906108c 129 }
4e0bf4c4 130 lf_printf (file, "\n");
c906108c 131
4e0bf4c4
AC
132 lf_printf (file, "#define SD_ CPU_, CIA_, MY_INDEX\n");
133 lf_printf (file, "#define _SD SD_ /* deprecated */\n");
134 lf_printf (file, "\n");
c906108c 135
051b807a
DB
136 /* Map <PREFIX>_xxxx onto the shorter xxxx for the following names:
137
4e0bf4c4
AC
138 instruction_word
139 idecode_issue
140 semantic_illegal
051b807a
DB
141
142 Map defined here as name space problems are created when the name is
143 defined in idecode.h */
c906108c
SS
144 if (strcmp (options.module.idecode.prefix.l, "") != 0)
145 {
146 lf_indent_suppress (file);
147 lf_printf (file, "#define %s %s%s\n",
148 "instruction_word",
4e0bf4c4 149 options.module.idecode.prefix.l, "instruction_word");
c906108c
SS
150 lf_printf (file, "\n");
151 lf_indent_suppress (file);
152 lf_printf (file, "#define %s %s%s\n",
153 "idecode_issue",
4e0bf4c4 154 options.module.idecode.prefix.l, "idecode_issue");
c906108c 155 lf_printf (file, "\n");
051b807a
DB
156 lf_indent_suppress (file);
157 lf_printf (file, "#define %s %s%s\n",
158 "semantic_illegal",
4e0bf4c4 159 options.module.idecode.prefix.l, "semantic_illegal");
051b807a 160 lf_printf (file, "\n");
c906108c
SS
161 }
162
163 /* output a declaration for all functions */
4e0bf4c4
AC
164 function_entry_traverse (file, table->functions, support_h_function, NULL);
165 lf_printf (file, "\n");
166 lf_printf (file, "#if defined(SUPPORT_INLINE)\n");
167 lf_printf (file, "# if ((SUPPORT_INLINE & INCLUDE_MODULE)\\\n");
168 lf_printf (file, " && (SUPPORT_INLINE & INCLUDED_BY_MODULE))\n");
169 lf_printf (file, "# include \"%ssupport.c\"\n",
170 options.module.support.prefix.l);
171 lf_printf (file, "# endif\n");
172 lf_printf (file, "#endif\n");
c906108c
SS
173}
174
175static void
4e0bf4c4 176support_c_function (lf *file, function_entry * function, void *data)
c906108c
SS
177{
178 ASSERT (function->type != NULL);
4e0bf4c4 179 print_support_function_name (file, function, 1 /*!is_definition */ );
c906108c
SS
180 lf_printf (file, "{\n");
181 lf_indent (file, +2);
182 if (function->code == NULL)
4e0bf4c4 183 error (function->line, "Function without body (or null statement)");
c906108c
SS
184 lf_print__line_ref (file, function->code->line);
185 table_print_code (file, function->code);
186 if (function->is_internal)
187 {
4e0bf4c4
AC
188 lf_printf (file,
189 "sim_engine_abort (SD, CPU, cia, \"Internal function must longjump\\n\");\n");
c906108c
SS
190 lf_printf (file, "return cia;\n");
191 }
192 lf_indent (file, -2);
193 lf_printf (file, "}\n");
194 lf_print__internal_ref (file);
195 lf_printf (file, "\n");
196}
197
198
199void
4e0bf4c4 200gen_support_c (lf *file, insn_table *table)
c906108c 201{
4e0bf4c4
AC
202 lf_printf (file, "#include \"sim-main.h\"\n");
203 lf_printf (file, "#include \"%sidecode.h\"\n",
204 options.module.idecode.prefix.l);
205 lf_printf (file, "#include \"%sitable.h\"\n",
206 options.module.itable.prefix.l);
207 lf_printf (file, "#include \"%ssupport.h\"\n",
208 options.module.support.prefix.l);
209 lf_printf (file, "\n");
c906108c
SS
210
211 /* output a definition (c-code) for all functions */
4e0bf4c4 212 function_entry_traverse (file, table->functions, support_c_function, NULL);
c906108c 213}