14e98e3e1Schristos /* The IGEN simulator generator for GDB, the GNU Debugger. 24e98e3e1Schristos 3*71f62182Schristos Copyright 2002-2024 Free Software Foundation, Inc. 44e98e3e1Schristos 54e98e3e1Schristos Contributed by Andrew Cagney. 64e98e3e1Schristos 74e98e3e1Schristos This file is part of GDB. 84e98e3e1Schristos 94e98e3e1Schristos This program is free software; you can redistribute it and/or modify 104e98e3e1Schristos it under the terms of the GNU General Public License as published by 114e98e3e1Schristos the Free Software Foundation; either version 3 of the License, or 124e98e3e1Schristos (at your option) any later version. 134e98e3e1Schristos 144e98e3e1Schristos This program is distributed in the hope that it will be useful, 154e98e3e1Schristos but WITHOUT ANY WARRANTY; without even the implied warranty of 164e98e3e1Schristos MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 174e98e3e1Schristos GNU General Public License for more details. 184e98e3e1Schristos 194e98e3e1Schristos You should have received a copy of the GNU General Public License 204e98e3e1Schristos along with this program. If not, see <http://www.gnu.org/licenses/>. */ 214e98e3e1Schristos 224e98e3e1Schristos 234e98e3e1Schristos #include "misc.h" 244e98e3e1Schristos #include "lf.h" 254e98e3e1Schristos #include "table.h" 264e98e3e1Schristos #include "filter.h" 274e98e3e1Schristos 284e98e3e1Schristos #include "igen.h" 294e98e3e1Schristos 304e98e3e1Schristos #include "ld-insn.h" 314e98e3e1Schristos #include "ld-decode.h" 324e98e3e1Schristos 334e98e3e1Schristos #include "gen.h" 344e98e3e1Schristos 354e98e3e1Schristos #include "gen-semantics.h" 364e98e3e1Schristos #include "gen-support.h" 374e98e3e1Schristos 384e98e3e1Schristos static void 394e98e3e1Schristos print_support_function_name (lf *file, 404b169a6bSchristos const function_entry *function, 414e98e3e1Schristos int is_function_definition) 424e98e3e1Schristos { 434e98e3e1Schristos if (function->is_internal) 444e98e3e1Schristos { 454e98e3e1Schristos lf_print__function_type_function (file, print_semantic_function_type, 464e98e3e1Schristos "INLINE_SUPPORT", 474e98e3e1Schristos (is_function_definition ? "\n" : 484e98e3e1Schristos " ")); 494e98e3e1Schristos print_function_name (file, function->name, NULL, NULL, NULL, 504e98e3e1Schristos function_name_prefix_semantics); 514e98e3e1Schristos lf_printf (file, "\n("); 524e98e3e1Schristos lf_indent (file, +1); 534e98e3e1Schristos print_semantic_function_formal (file, 0); 544e98e3e1Schristos lf_indent (file, -1); 554e98e3e1Schristos lf_printf (file, ")"); 564e98e3e1Schristos if (!is_function_definition) 574e98e3e1Schristos lf_printf (file, ";"); 584e98e3e1Schristos lf_printf (file, "\n"); 594e98e3e1Schristos } 604e98e3e1Schristos else 614e98e3e1Schristos { 624e98e3e1Schristos /* map the name onto a globally valid name */ 634e98e3e1Schristos if (!is_function_definition 644e98e3e1Schristos && strcmp (options.module.support.prefix.l, "") != 0) 654e98e3e1Schristos { 664e98e3e1Schristos lf_indent_suppress (file); 674e98e3e1Schristos lf_printf (file, "#define %s %s%s\n", 684e98e3e1Schristos function->name, 694e98e3e1Schristos options.module.support.prefix.l, function->name); 704e98e3e1Schristos } 714e98e3e1Schristos lf_print__function_type (file, 724e98e3e1Schristos function->type, 734e98e3e1Schristos "INLINE_SUPPORT", 744e98e3e1Schristos (is_function_definition ? "\n" : " ")); 754e98e3e1Schristos lf_printf (file, "%s%s\n(", 764e98e3e1Schristos options.module.support.prefix.l, function->name); 774e98e3e1Schristos if (options.gen.smp) 784e98e3e1Schristos lf_printf (file, 794e98e3e1Schristos "sim_cpu *cpu, %sinstruction_address cia, int MY_INDEX", 804e98e3e1Schristos options.module.support.prefix.l); 814e98e3e1Schristos else 824e98e3e1Schristos lf_printf (file, 834e98e3e1Schristos "SIM_DESC sd, %sinstruction_address cia, int MY_INDEX", 844e98e3e1Schristos options.module.support.prefix.l); 854e98e3e1Schristos if (function->param != NULL && strlen (function->param) > 0) 864e98e3e1Schristos lf_printf (file, ", %s", function->param); 874e98e3e1Schristos lf_printf (file, ")%s", (is_function_definition ? "\n" : ";\n")); 884e98e3e1Schristos } 894e98e3e1Schristos } 904e98e3e1Schristos 914e98e3e1Schristos 924e98e3e1Schristos static void 934b169a6bSchristos support_h_function (lf *file, const function_entry *function, void *data) 944e98e3e1Schristos { 954e98e3e1Schristos ASSERT (function->type != NULL); 964e98e3e1Schristos print_support_function_name (file, function, 0 /*!is_definition */ ); 974e98e3e1Schristos lf_printf (file, "\n"); 984e98e3e1Schristos } 994e98e3e1Schristos 1004e98e3e1Schristos 1014e98e3e1Schristos extern void 1024b169a6bSchristos gen_support_h (lf *file, const insn_table *table) 1034e98e3e1Schristos { 1044e98e3e1Schristos /* output the definition of `SD_' */ 1054e98e3e1Schristos if (options.gen.smp) 1064e98e3e1Schristos { 1074e98e3e1Schristos lf_printf (file, "#define SD CPU_STATE (cpu)\n"); 1084e98e3e1Schristos lf_printf (file, "#define CPU cpu\n"); 1094e98e3e1Schristos lf_printf (file, "#define CPU_ cpu\n"); 1104e98e3e1Schristos } 1114e98e3e1Schristos else 1124e98e3e1Schristos { 1134e98e3e1Schristos lf_printf (file, "#define SD sd\n"); 1144e98e3e1Schristos lf_printf (file, "#define CPU (STATE_CPU (sd, 0))\n"); 1154e98e3e1Schristos lf_printf (file, "#define CPU_ sd\n"); 1164e98e3e1Schristos } 1174e98e3e1Schristos 1184e98e3e1Schristos lf_printf (file, "#define CIA_ cia\n"); 1194e98e3e1Schristos if (options.gen.delayed_branch) 1204e98e3e1Schristos { 1214e98e3e1Schristos lf_printf (file, "#define CIA cia.ip\n"); 1224e98e3e1Schristos lf_printf (file, 1234e98e3e1Schristos "/* #define NIA nia.dp -- do not define, ambigious */\n"); 1244e98e3e1Schristos } 1254e98e3e1Schristos else 1264e98e3e1Schristos { 1274e98e3e1Schristos lf_printf (file, "#define CIA cia\n"); 1284e98e3e1Schristos lf_printf (file, "#define NIA nia\n"); 1294e98e3e1Schristos } 1304e98e3e1Schristos lf_printf (file, "\n"); 1314e98e3e1Schristos 1324e98e3e1Schristos lf_printf (file, "#define SD_ CPU_, CIA_, MY_INDEX\n"); 1334e98e3e1Schristos lf_printf (file, "#define _SD SD_ /* deprecated */\n"); 1344e98e3e1Schristos lf_printf (file, "\n"); 1354e98e3e1Schristos 1364e98e3e1Schristos /* Map <PREFIX>_xxxx onto the shorter xxxx for the following names: 1374e98e3e1Schristos 1384e98e3e1Schristos instruction_word 1394e98e3e1Schristos idecode_issue 1404e98e3e1Schristos semantic_illegal 1414e98e3e1Schristos 1424e98e3e1Schristos Map defined here as name space problems are created when the name is 1434e98e3e1Schristos defined in idecode.h */ 1444e98e3e1Schristos if (strcmp (options.module.idecode.prefix.l, "") != 0) 1454e98e3e1Schristos { 1464e98e3e1Schristos lf_indent_suppress (file); 1474e98e3e1Schristos lf_printf (file, "#define %s %s%s\n", 1484e98e3e1Schristos "instruction_word", 1494e98e3e1Schristos options.module.idecode.prefix.l, "instruction_word"); 1504e98e3e1Schristos lf_printf (file, "\n"); 1514e98e3e1Schristos lf_indent_suppress (file); 1524e98e3e1Schristos lf_printf (file, "#define %s %s%s\n", 1534e98e3e1Schristos "idecode_issue", 1544e98e3e1Schristos options.module.idecode.prefix.l, "idecode_issue"); 1554e98e3e1Schristos lf_printf (file, "\n"); 1564e98e3e1Schristos lf_indent_suppress (file); 1574e98e3e1Schristos lf_printf (file, "#define %s %s%s\n", 1584e98e3e1Schristos "semantic_illegal", 1594e98e3e1Schristos options.module.idecode.prefix.l, "semantic_illegal"); 1604e98e3e1Schristos lf_printf (file, "\n"); 1614e98e3e1Schristos } 1624e98e3e1Schristos 1634e98e3e1Schristos /* output a declaration for all functions */ 1644e98e3e1Schristos function_entry_traverse (file, table->functions, support_h_function, NULL); 1654e98e3e1Schristos lf_printf (file, "\n"); 1664e98e3e1Schristos lf_printf (file, "#if defined(SUPPORT_INLINE)\n"); 1674e98e3e1Schristos lf_printf (file, "# if ((SUPPORT_INLINE & INCLUDE_MODULE)\\\n"); 1684e98e3e1Schristos lf_printf (file, " && (SUPPORT_INLINE & INCLUDED_BY_MODULE))\n"); 1694e98e3e1Schristos lf_printf (file, "# include \"%ssupport.c\"\n", 1704e98e3e1Schristos options.module.support.prefix.l); 1714e98e3e1Schristos lf_printf (file, "# endif\n"); 1724e98e3e1Schristos lf_printf (file, "#endif\n"); 1734e98e3e1Schristos } 1744e98e3e1Schristos 1754e98e3e1Schristos static void 1764b169a6bSchristos support_c_function (lf *file, const function_entry *function, void *data) 1774e98e3e1Schristos { 1784e98e3e1Schristos ASSERT (function->type != NULL); 1794e98e3e1Schristos print_support_function_name (file, function, 1 /*!is_definition */ ); 1804e98e3e1Schristos lf_printf (file, "{\n"); 1814e98e3e1Schristos lf_indent (file, +2); 1824e98e3e1Schristos if (function->code == NULL) 1834b169a6bSchristos error (function->line, "Function without body (or null statement)\n"); 1844e98e3e1Schristos lf_print__line_ref (file, function->code->line); 1854e98e3e1Schristos table_print_code (file, function->code); 1864e98e3e1Schristos if (function->is_internal) 1874e98e3e1Schristos { 1884e98e3e1Schristos lf_printf (file, 1894e98e3e1Schristos "sim_engine_abort (SD, CPU, cia, \"Internal function must longjump\\n\");\n"); 1904e98e3e1Schristos lf_printf (file, "return cia;\n"); 1914e98e3e1Schristos } 1924e98e3e1Schristos lf_indent (file, -2); 1934e98e3e1Schristos lf_printf (file, "}\n"); 1944e98e3e1Schristos lf_print__internal_ref (file); 1954e98e3e1Schristos lf_printf (file, "\n"); 1964e98e3e1Schristos } 1974e98e3e1Schristos 1984e98e3e1Schristos 1994e98e3e1Schristos void 2004b169a6bSchristos gen_support_c (lf *file, const insn_table *table) 2014e98e3e1Schristos { 2024e98e3e1Schristos lf_printf (file, "#include \"sim-main.h\"\n"); 2034e98e3e1Schristos lf_printf (file, "#include \"%sidecode.h\"\n", 2044e98e3e1Schristos options.module.idecode.prefix.l); 2054e98e3e1Schristos lf_printf (file, "#include \"%sitable.h\"\n", 2064e98e3e1Schristos options.module.itable.prefix.l); 2074e98e3e1Schristos lf_printf (file, "#include \"%ssupport.h\"\n", 2084e98e3e1Schristos options.module.support.prefix.l); 2094e98e3e1Schristos lf_printf (file, "\n"); 2104e98e3e1Schristos 2114e98e3e1Schristos /* output a definition (c-code) for all functions */ 2124e98e3e1Schristos function_entry_traverse (file, table->functions, support_c_function, NULL); 2134e98e3e1Schristos } 214