1 /* Generate code to allocate RTL structures.
2 Copyright (C) 1997, 1998, 1999 Free Software Foundation, Inc.
4 This file is part of GNU CC.
6 GNU CC is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2, or (at your option)
11 GNU CC is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with GNU CC; see the file COPYING. If not, write to
18 the Free Software Foundation, 59 Temple Place - Suite 330,
19 Boston, MA 02111-1307, USA. */
32 const char *enumname, *name, *format;
35 #define DEF_RTL_EXPR(ENUM, NAME, FORMAT, CLASS) { STRINGIFY(ENUM), NAME, FORMAT },
37 struct rtx_definition defs[] =
39 #include "rtl.def" /* rtl expressions are documented here */
42 const char *formats[NUM_RTX_CODE];
44 static const char *type_from_format PROTO((int));
45 static const char *accessor_from_format PROTO((int));
46 static int special_format PROTO((const char *));
47 static int special_rtx PROTO((int));
48 static void find_formats PROTO((void));
49 static void gendecl PROTO((FILE *, const char *));
50 static void genmacro PROTO((FILE *, int));
51 static void gendef PROTO((FILE *, const char *));
52 static void genlegend PROTO((FILE *));
53 static void genheader PROTO((FILE *));
54 static void gencode PROTO((FILE *));
56 /* Decode a format letter into a C type string. */
67 return "HOST_WIDE_INT";
75 /* ?!? These should be bitmap and tree respectively, but those types
76 are not available in many of the files which include the output
79 These are only used in prototypes, so I think we can assume that
90 /* Decode a format letter into the proper accessor function. */
93 accessor_from_format (c)
118 /* Return true if a format character doesn't need normal processing. */
124 return (strchr (fmt, '*') != 0
125 || strchr (fmt, 'V') != 0
126 || strchr (fmt, 'S') != 0
127 || strchr (fmt, 'n') != 0);
130 /* Return true if an rtx requires special processing. */
136 return (strcmp (defs[idx].enumname, "CONST_INT") == 0
137 || strcmp (defs[idx].enumname, "CONST_DOUBLE") == 0
138 || strcmp (defs[idx].enumname, "REG") == 0
139 || strcmp (defs[idx].enumname, "MEM") == 0);
142 /* Fill `formats' with all unique format strings. */
149 for (i = 0; i < NUM_RTX_CODE; ++i)
153 if (special_format (defs[i].format))
156 for (f = formats; *f ; ++f)
157 if (! strcmp (*f, defs[i].format))
165 /* Emit a prototype for the rtx generator for a format. */
175 fprintf (f, "extern rtx gen_rtx_fmt_%s PROTO((RTX_CODE, enum machine_mode mode",
177 for (p = format, i = 0; *p ; ++p)
179 fprintf (f, ", %s arg%d", type_from_format (*p), i++);
180 fprintf (f, "));\n");
183 /* Emit a define mapping an rtx code to the generator for its format. */
193 fprintf (f, "#define gen_rtx_%s%s(mode",
194 (special_rtx (idx) ? "raw_" : ""), defs[idx].enumname);
196 for (p = defs[idx].format, i = 0; *p ; ++p)
198 fprintf (f, ", arg%d", i++);
201 fprintf (f, "gen_rtx_fmt_%s(%s,(mode)", defs[idx].format, defs[idx].enumname);
202 for (p = defs[idx].format, i = 0; *p ; ++p)
204 fprintf (f, ",(arg%d)", i++);
208 /* Emit the implementation for the rtx generator for a format. */
218 fprintf (f, "rtx\ngen_rtx_fmt_%s (code, mode", format);
219 for (p = format, i = 0; *p ; ++p)
221 fprintf (f, ", arg%d", i++);
223 fprintf (f, ")\n RTX_CODE code;\n enum machine_mode mode;\n");
224 for (p = format, i = 0; *p ; ++p)
226 fprintf (f, " %s arg%d;\n", type_from_format (*p), i++);
228 /* See rtx_alloc in rtl.c for comments. */
230 fprintf (f, " rtx rt = obstack_alloc_rtx (sizeof (struct rtx_def) + %d * sizeof (rtunion));\n",
231 (int) strlen (format) - 1);
233 fprintf (f, " PUT_CODE (rt, code);\n");
234 fprintf (f, " PUT_MODE (rt, mode);\n");
236 for (p = format, i = j = 0; *p ; ++p, ++i)
239 fprintf (f, " %s (rt, %d) = arg%d;\n",
240 accessor_from_format (*p), i, j++);
243 fprintf (f, "\n return rt;\n}\n\n");
246 /* Emit the `do not edit' banner. */
252 fputs ("/* Generated automaticaly by the program `gengenrtl'\n", f);
253 fputs (" from the RTL description file `rtl.def' */\n\n", f);
256 /* Emit "genrtl.h". */
265 for (fmt = formats; *fmt; ++fmt)
270 for (i = 0; i < NUM_RTX_CODE; i++)
272 if (special_format (defs[i].format))
278 /* Emit "genrtl.c". */
286 fputs ("#include \"config.h\"\n", f);
287 fputs ("#include \"system.h\"\n", f);
288 fputs ("#include \"obstack.h\"\n", f);
289 fputs ("#include \"rtl.h\"\n\n", f);
290 fputs ("extern struct obstack *rtl_obstack;\n\n", f);
291 fputs ("static rtx obstack_alloc_rtx PROTO((int length));\n", f);
292 fputs ("static rtx obstack_alloc_rtx (length)\n", f);
293 fputs (" register int length;\n{\n", f);
294 fputs (" rtx rt = (rtx) obstack_alloc (rtl_obstack, length);\n\n", f);
295 fputs (" memset(rt, 0, sizeof(struct rtx_def) - sizeof(rtunion));\n\n", f);
296 fputs (" return rt;\n}\n\n", f);
298 for (fmt = formats; *fmt; ++fmt)
302 #if defined(USE_C_ALLOCA)
307 register PTR tmp = (PTR) malloc (nbytes);
311 fprintf (stderr, "can't allocate %d bytes (out of virtual memory)\n",
313 exit (FATAL_EXIT_CODE);
318 #endif /* USE_C_ALLOCA */
332 f = fopen (argv[1], "w");
342 f = fopen (argv[2], "w");