]>
git.ipfire.org Git - thirdparty/gcc.git/blob - gcc/gengenrtl.c
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
133 || strcmp (defs
[idx
].enumname
, "MEM") == 0);
141 for (i
= 0; i
< NUM_RTX_CODE
; ++i
)
145 if (special_format (defs
[i
].format
))
148 for (f
= formats
; *f
; ++f
)
149 if (!strcmp(*f
, defs
[i
].format
))
165 fprintf (f
, "extern rtx gen_rtx_fmt_%s PROTO((RTX_CODE, enum machine_mode mode",
167 for (p
= format
, i
= 0; *p
; ++p
)
169 fprintf (f
, ", %s arg%d", type_from_format (*p
), i
++);
170 fprintf (f
, "));\n");
181 fprintf (f
, "#define gen_rtx_%s%s(mode",
182 (special_rtx (idx
) ? "raw_" : ""), defs
[idx
].enumname
);
184 for (p
= defs
[idx
].format
, i
= 0; *p
; ++p
)
186 fprintf (f
, ", arg%d", i
++);
189 fprintf (f
, "gen_rtx_fmt_%s(%s,(mode)", defs
[idx
].format
, defs
[idx
].enumname
);
190 for (p
= defs
[idx
].format
, i
= 0; *p
; ++p
)
192 fprintf (f
, ",(arg%d)", i
++);
204 fprintf (f
, "rtx\ngen_rtx_fmt_%s (code, mode", format
);
205 for (p
= format
, i
= 0; *p
; ++p
)
207 fprintf (f
, ", arg%d", i
++);
209 fprintf (f
, ")\n RTX_CODE code;\n enum machine_mode mode;\n");
210 for (p
= format
, i
= 0; *p
; ++p
)
212 fprintf (f
, " %s arg%d;\n", type_from_format (*p
), i
++);
214 /* See rtx_alloc in rtl.c for comments. */
216 fprintf (f
, " rtx rt = obstack_alloc_rtx (sizeof (struct rtx_def) + %d * sizeof (rtunion));\n",
217 (int) strlen (format
) - 1);
219 fprintf (f
, " PUT_CODE (rt, code);\n");
220 fprintf (f
, " PUT_MODE (rt, mode);\n");
222 for (p
= format
, i
= j
= 0; *p
; ++p
, ++i
)
225 fprintf (f
, " %s (rt, %d) = arg%d;\n",
226 accessor_from_format (*p
), i
, j
++);
229 fprintf (f
, "\n return rt;\n}\n\n");
236 fprintf (f
, "/* Generated automaticaly by the program `gengenrtl'\n");
237 fprintf (f
, " from the RTL description file `rtl.def' */\n\n");
247 for (fmt
= formats
; *fmt
; ++fmt
)
252 for (i
= 0; i
< NUM_RTX_CODE
; i
++)
254 if (special_format (defs
[i
].format
))
266 fputs ("#include \"config.h\"\n", f
);
267 fputs ("#include \"system.h\"\n", f
);
268 fputs ("#include \"obstack.h\"\n", f
);
269 fputs ("#include \"rtl.h\"\n\n", f
);
270 fputs ("extern struct obstack *rtl_obstack;\n\n", f
);
271 fputs ("static rtx obstack_alloc_rtx PROTO((int length));\n", f
);
272 fputs ("static rtx obstack_alloc_rtx (length)\n", f
);
273 fputs (" register int length;\n{\n", f
);
274 fputs (" rtx rt = (rtx) obstack_alloc (rtl_obstack, length);\n\n", f
);
275 fputs (" if (sizeof(struct rtx_def) - sizeof(rtunion) == sizeof(int))\n", f
);
276 fputs (" *(int *)rt = 0;\n", f
);
277 fputs (" else if (sizeof(struct rtx_def) - sizeof(rtunion) == sizeof(HOST_WIDE_INT))\n", f
);
278 fputs (" *(HOST_WIDE_INT *)rt = 0;\n", f
);
279 fputs (" else\n", f
);
280 fputs (" bzero((char *) rt, sizeof(struct rtx_def) - sizeof(rtunion));\n\n", f
);
281 fputs (" return rt;\n}\n\n", f
);
283 for (fmt
= formats
; *fmt
; ++fmt
)
287 #if defined(USE_C_ALLOCA) && !defined(__GNUC__)
292 char *tmp
= (char *) malloc (nbytes
);
296 fprintf (stderr
, "can't allocate %d bytes (out of virtual memory)\n", nbytes
);
297 exit (FATAL_EXIT_CODE
);
302 #endif /* USE_C_ALLOCA && !__GNUC__ */
316 f
= fopen (argv
[1], "w");
326 f
= fopen (argv
[2], "w");