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. */
31 const char *enumname
, *name
, *format
;
34 #define DEF_RTL_EXPR(ENUM, NAME, FORMAT, CLASS) { STRINGIFY(ENUM), NAME, FORMAT },
36 struct rtx_definition defs
[] =
38 #include "rtl.def" /* rtl expressions are documented here */
41 const char *formats
[NUM_RTX_CODE
];
43 static const char *type_from_format
PROTO((int));
44 static const char *accessor_from_format
PROTO((int));
45 static int special_format
PROTO((const char *));
46 static int special_rtx
PROTO((int));
47 static void find_formats
PROTO((void));
48 static void gendecl
PROTO((FILE *, const char *));
49 static void genmacro
PROTO((FILE *, int));
50 static void gendef
PROTO((FILE *, const char *));
51 static void genlegend
PROTO((FILE *));
52 static void genheader
PROTO((FILE *));
53 static void gencode
PROTO((FILE *));
55 /* Decode a format letter into a C type string. */
66 return "HOST_WIDE_INT";
74 /* ?!? These should be bitmap and tree respectively, but those types
75 are not available in many of the files which include the output
78 These are only used in prototypes, so I think we can assume that
89 /* Decode a format letter into the proper accessor function. */
92 accessor_from_format (c
)
117 /* Return true if a format character doesn't need normal processing. */
123 return (strchr (fmt
, '*') != 0
124 || strchr (fmt
, 'V') != 0
125 || strchr (fmt
, 'S') != 0
126 || strchr (fmt
, 'n') != 0);
129 /* Return true if an rtx requires special processing. */
135 return (strcmp (defs
[idx
].enumname
, "CONST_INT") == 0
136 || strcmp (defs
[idx
].enumname
, "CONST_DOUBLE") == 0
137 || strcmp (defs
[idx
].enumname
, "REG") == 0
138 || strcmp (defs
[idx
].enumname
, "MEM") == 0);
141 /* Fill `formats' with all unique format strings. */
148 for (i
= 0; i
< NUM_RTX_CODE
; ++i
)
152 if (special_format (defs
[i
].format
))
155 for (f
= formats
; *f
; ++f
)
156 if (! strcmp (*f
, defs
[i
].format
))
164 /* Emit a prototype for the rtx generator for a format. */
174 fprintf (f
, "extern rtx gen_rtx_fmt_%s PROTO((RTX_CODE, enum machine_mode mode",
176 for (p
= format
, i
= 0; *p
; ++p
)
178 fprintf (f
, ", %s arg%d", type_from_format (*p
), i
++);
179 fprintf (f
, "));\n");
182 /* Emit a define mapping an rtx code to the generator for its format. */
192 fprintf (f
, "#define gen_rtx_%s%s(mode",
193 (special_rtx (idx
) ? "raw_" : ""), defs
[idx
].enumname
);
195 for (p
= defs
[idx
].format
, i
= 0; *p
; ++p
)
197 fprintf (f
, ", arg%d", i
++);
200 fprintf (f
, "gen_rtx_fmt_%s(%s,(mode)", defs
[idx
].format
, defs
[idx
].enumname
);
201 for (p
= defs
[idx
].format
, i
= 0; *p
; ++p
)
203 fprintf (f
, ",(arg%d)", i
++);
207 /* Emit the implementation for the rtx generator for a format. */
217 fprintf (f
, "rtx\ngen_rtx_fmt_%s (code, mode", format
);
218 for (p
= format
, i
= 0; *p
; ++p
)
220 fprintf (f
, ", arg%d", i
++);
222 fprintf (f
, ")\n RTX_CODE code;\n enum machine_mode mode;\n");
223 for (p
= format
, i
= 0; *p
; ++p
)
225 fprintf (f
, " %s arg%d;\n", type_from_format (*p
), i
++);
227 /* See rtx_alloc in rtl.c for comments. */
229 fprintf (f
, " rtx rt = obstack_alloc_rtx (sizeof (struct rtx_def) + %d * sizeof (rtunion));\n",
230 (int) strlen (format
) - 1);
232 fprintf (f
, " PUT_CODE (rt, code);\n");
233 fprintf (f
, " PUT_MODE (rt, mode);\n");
235 for (p
= format
, i
= j
= 0; *p
; ++p
, ++i
)
238 fprintf (f
, " %s (rt, %d) = arg%d;\n",
239 accessor_from_format (*p
), i
, j
++);
242 fprintf (f
, "\n return rt;\n}\n\n");
245 /* Emit the `do not edit' banner. */
251 fputs ("/* Generated automaticaly by the program `gengenrtl'\n", f
);
252 fputs (" from the RTL description file `rtl.def' */\n\n", f
);
255 /* Emit "genrtl.h". */
264 for (fmt
= formats
; *fmt
; ++fmt
)
269 for (i
= 0; i
< NUM_RTX_CODE
; i
++)
271 if (special_format (defs
[i
].format
))
277 /* Emit "genrtl.c". */
285 fputs ("#include \"config.h\"\n", f
);
286 fputs ("#include \"system.h\"\n", f
);
287 fputs ("#include \"obstack.h\"\n", f
);
288 fputs ("#include \"rtl.h\"\n\n", f
);
289 fputs ("extern struct obstack *rtl_obstack;\n\n", f
);
290 fputs ("static rtx obstack_alloc_rtx PROTO((int length));\n", f
);
291 fputs ("static rtx obstack_alloc_rtx (length)\n", f
);
292 fputs (" register int length;\n{\n", f
);
293 fputs (" rtx rt = (rtx) obstack_alloc (rtl_obstack, length);\n\n", f
);
294 fputs (" memset(rt, 0, sizeof(struct rtx_def) - sizeof(rtunion));\n\n", f
);
295 fputs (" return rt;\n}\n\n", f
);
297 for (fmt
= formats
; *fmt
; ++fmt
)
301 #if defined(USE_C_ALLOCA)
306 register PTR tmp
= (PTR
) malloc (nbytes
);
310 fprintf (stderr
, "can't allocate %d bytes (out of virtual memory)\n",
312 exit (FATAL_EXIT_CODE
);
317 #endif /* USE_C_ALLOCA */
331 f
= fopen (argv
[1], "w");
341 f
= fopen (argv
[2], "w");