1 /* Generate code to allocate RTL structures.
2 Copyright (C) 1997 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. */
26 #define obstack_chunk_alloc xmalloc
27 #define obstack_chunk_free free
35 const char *enumname
, *name
, *format
;
38 #define DEF_RTL_EXPR(ENUM, NAME, FORMAT, CLASS) { STRINGIFY(ENUM), NAME, FORMAT },
40 struct rtx_definition defs
[] =
42 #include "rtl.def" /* rtl expressions are documented here */
45 const char *formats
[NUM_RTX_CODE
];
47 static const char *type_from_format
PROTO((int));
48 static const char *accessor_from_format
PROTO((int));
49 static int special_format
PROTO((const char *));
50 static int special_rtx
PROTO((int));
51 static void find_formats
PROTO((void));
52 static void gendecl
PROTO((FILE *, const char *));
53 static void genmacro
PROTO((FILE *, int));
54 static void gendef
PROTO((FILE *, const char *));
55 static void genlegend
PROTO((FILE *));
56 static void genheader
PROTO((FILE *));
57 static void gencode
PROTO((FILE *));
68 return "HOST_WIDE_INT";
76 /* ?!? These should be bitmap and tree respectively, but those types
77 are not available in many of the files which include the output
80 These are only used in prototypes, so I think we can assume that
92 accessor_from_format (c
)
121 return (strchr (fmt
, '*') != 0
122 || strchr (fmt
, 'V') != 0
123 || strchr (fmt
, 'S') != 0
124 || strchr (fmt
, 'n') != 0);
131 return (strcmp (defs
[idx
].enumname
, "CONST_INT") == 0
132 || strcmp (defs
[idx
].enumname
, "REG") == 0);
140 for (i
= 0; i
< NUM_RTX_CODE
; ++i
)
144 if (special_format (defs
[i
].format
))
147 for (f
= formats
; *f
; ++f
)
148 if (!strcmp(*f
, defs
[i
].format
))
164 fprintf (f
, "extern rtx gen_rtx_fmt_%s PROTO((RTX_CODE, enum machine_mode mode",
166 for (p
= format
, i
= 0; *p
; ++p
)
168 fprintf (f
, ", %s arg%d", type_from_format (*p
), i
++);
169 fprintf (f
, "));\n");
180 fprintf (f
, "#define gen_rtx_%s%s(mode",
181 (special_rtx (idx
) ? "raw_" : ""), defs
[idx
].enumname
);
183 for (p
= defs
[idx
].format
, i
= 0; *p
; ++p
)
185 fprintf (f
, ", arg%d", i
++);
188 fprintf (f
, "gen_rtx_fmt_%s(%s,(mode)", defs
[idx
].format
, defs
[idx
].enumname
);
189 for (p
= defs
[idx
].format
, i
= 0; *p
; ++p
)
191 fprintf (f
, ",(arg%d)", i
++);
203 fprintf (f
, "rtx\ngen_rtx_fmt_%s (code, mode", format
);
204 for (p
= format
, i
= 0; *p
; ++p
)
206 fprintf (f
, ", arg%d", i
++);
208 fprintf (f
, ")\n RTX_CODE code;\n enum machine_mode mode;\n");
209 for (p
= format
, i
= 0; *p
; ++p
)
211 fprintf (f
, " %s arg%d;\n", type_from_format (*p
), i
++);
213 /* See rtx_alloc in rtl.c for comments. */
215 fprintf (f
, " rtx rt = obstack_alloc_rtx (sizeof (struct rtx_def) + %d * sizeof (rtunion));\n",
216 (int) strlen (format
) - 1);
218 fprintf (f
, " PUT_CODE (rt, code);\n");
219 fprintf (f
, " PUT_MODE (rt, mode);\n");
221 for (p
= format
, i
= j
= 0; *p
; ++p
, ++i
)
224 fprintf (f
, " %s (rt, %d) = arg%d;\n",
225 accessor_from_format (*p
), i
, j
++);
228 fprintf (f
, "\n return rt;\n}\n\n");
235 fprintf (f
, "/* Generated automaticaly by the program `gengenrtl'\n");
236 fprintf (f
, " from the RTL description file `rtl.def' */\n\n");
246 for (fmt
= formats
; *fmt
; ++fmt
)
251 for (i
= 0; i
< NUM_RTX_CODE
; i
++)
253 if (special_format (defs
[i
].format
))
265 fputs ("#include \"config.h\"\n", f
);
266 fputs ("#include \"system.h\"\n", f
);
267 fputs ("#include \"obstack.h\"\n", f
);
268 fputs ("#include \"rtl.h\"\n\n", f
);
269 fputs ("extern struct obstack *rtl_obstack;\n\n", f
);
270 fputs ("static rtx obstack_alloc_rtx PROTO((int length));\n", f
);
271 fputs ("static rtx obstack_alloc_rtx (length)\n", f
);
272 fputs (" register int length;\n{\n", f
);
273 fputs (" rtx rt = (rtx) obstack_alloc (rtl_obstack, length);\n\n", f
);
274 fputs (" if (sizeof(struct rtx_def) - sizeof(rtunion) == sizeof(int))\n", f
);
275 fputs (" *(int *)rt = 0;\n", f
);
276 fputs (" else if (sizeof(struct rtx_def) - sizeof(rtunion) == sizeof(HOST_WIDE_INT))\n", f
);
277 fputs (" *(HOST_WIDE_INT *)rt = 0;\n", f
);
278 fputs (" else\n", f
);
279 fputs (" bzero((char *) rt, sizeof(struct rtx_def) - sizeof(rtunion));\n\n", f
);
280 fputs (" return rt;\n}\n\n", f
);
282 for (fmt
= formats
; *fmt
; ++fmt
)
286 #if defined(USE_C_ALLOCA) && !defined(__GNUC__)
291 char *tmp
= (char *) malloc (nbytes
);
295 fprintf (stderr
, "can't allocate %d bytes (out of virtual memory)\n", nbytes
);
296 exit (FATAL_EXIT_CODE
);
301 #endif /* USE_C_ALLOCA && !__GNUC__ */
315 f
= fopen (argv
[1], "w");
325 f
= fopen (argv
[2], "w");