00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include "hconfig.h"
00023 #include "system.h"
00024
00025 #define NO_GENRTL_H
00026 #include "rtl.h"
00027 #undef abort
00028
00029 #include "real.h"
00030
00031 struct rtx_definition
00032 {
00033 const char *const enumname, *const name, *const format;
00034 };
00035
00036 #define DEF_RTL_EXPR(ENUM, NAME, FORMAT, CLASS) { STRINGX(ENUM), NAME, FORMAT },
00037
00038 static const struct rtx_definition defs[] =
00039 {
00040 #include "rtl.def"
00041 };
00042
00043 static const char *formats[NUM_RTX_CODE];
00044
00045 static const char *type_from_format PARAMS ((int));
00046 static const char *accessor_from_format PARAMS ((int));
00047 static int special_format PARAMS ((const char *));
00048 static int special_rtx PARAMS ((int));
00049 static int excluded_rtx PARAMS ((int));
00050 static void find_formats PARAMS ((void));
00051 static void gendecl PARAMS ((const char *));
00052 static void genmacro PARAMS ((int));
00053 static void gendef PARAMS ((const char *));
00054 static void genlegend PARAMS ((void));
00055 static void genheader PARAMS ((void));
00056 static void gencode PARAMS ((void));
00057
00058
00059
00060 static const char *
00061 type_from_format (c)
00062 int c;
00063 {
00064 switch (c)
00065 {
00066 case 'i':
00067 return "int ";
00068
00069 case 'w':
00070 return "HOST_WIDE_INT ";
00071
00072 case 's':
00073 return "const char *";
00074
00075 case 'e': case 'u':
00076 return "rtx ";
00077
00078 case 'E':
00079 return "rtvec ";
00080 case 'b':
00081 return "struct bitmap_head_def *";
00082 case 't':
00083 return "union tree_node *";
00084 case 'B':
00085 return "struct basic_block_def *";
00086 default:
00087 abort ();
00088 }
00089 }
00090
00091
00092
00093 static const char *
00094 accessor_from_format (c)
00095 int c;
00096 {
00097 switch (c)
00098 {
00099 case 'i':
00100 return "XINT";
00101
00102 case 'w':
00103 return "XWINT";
00104
00105 case 's':
00106 return "XSTR";
00107
00108 case 'e': case 'u':
00109 return "XEXP";
00110
00111 case 'E':
00112 return "XVEC";
00113
00114 case 'b':
00115 return "XBITMAP";
00116
00117 case 't':
00118 return "XTREE";
00119
00120 case 'B':
00121 return "XBBDEF";
00122
00123 default:
00124 abort ();
00125 }
00126 }
00127
00128
00129
00130
00131 static int
00132 special_format (fmt)
00133 const char *fmt;
00134 {
00135 return (strchr (fmt, '*') != 0
00136 || strchr (fmt, 'V') != 0
00137 || strchr (fmt, 'S') != 0
00138 || strchr (fmt, 'n') != 0);
00139 }
00140
00141
00142
00143
00144
00145 static int
00146 special_rtx (idx)
00147 int idx;
00148 {
00149 return (strcmp (defs[idx].enumname, "CONST_INT") == 0
00150 || strcmp (defs[idx].enumname, "REG") == 0
00151 || strcmp (defs[idx].enumname, "SUBREG") == 0
00152 || strcmp (defs[idx].enumname, "MEM") == 0
00153 || strcmp (defs[idx].enumname, "CONST_VECTOR") == 0);
00154 }
00155
00156
00157
00158
00159
00160 static int
00161 excluded_rtx (idx)
00162 int idx;
00163 {
00164 return (strcmp (defs[idx].enumname, "CONST_DOUBLE") == 0);
00165 }
00166
00167
00168
00169 static void
00170 find_formats ()
00171 {
00172 int i;
00173
00174 for (i = 0; i < NUM_RTX_CODE; i++)
00175 {
00176 const char **f;
00177
00178 if (special_format (defs[i].format))
00179 continue;
00180
00181 for (f = formats; *f; f++)
00182 if (! strcmp (*f, defs[i].format))
00183 break;
00184
00185 if (*f == 0)
00186 *f = defs[i].format;
00187 }
00188 }
00189
00190
00191
00192 static void
00193 gendecl (format)
00194 const char *format;
00195 {
00196 const char *p;
00197 int i, pos;
00198
00199 printf ("extern rtx gen_rtx_fmt_%s\tPARAMS ((RTX_CODE, ", format);
00200 printf ("enum machine_mode mode");
00201
00202
00203
00204 for (p = format, i = 0, pos = 75; *p != 0; p++)
00205 if (*p != '0')
00206 {
00207 int ourlen = strlen (type_from_format (*p)) + 6 + (i > 9);
00208
00209 printf (",");
00210 if (pos + ourlen > 76)
00211 printf ("\n\t\t\t\t "), pos = 39;
00212
00213 printf (" %sarg%d", type_from_format (*p), i++);
00214 pos += ourlen;
00215 }
00216
00217 printf ("));\n");
00218 }
00219
00220
00221
00222
00223 static void
00224 genmacro (idx)
00225 int idx;
00226 {
00227 const char *p;
00228 int i;
00229
00230
00231
00232
00233 if (excluded_rtx (idx))
00234
00235 return;
00236
00237 printf ("#define gen_rtx_%s%s(MODE",
00238 special_rtx (idx) ? "raw_" : "", defs[idx].enumname);
00239
00240 for (p = defs[idx].format, i = 0; *p != 0; p++)
00241 if (*p != '0')
00242 printf (", ARG%d", i++);
00243
00244 printf (") \\\n gen_rtx_fmt_%s (%s, (MODE)",
00245 defs[idx].format, defs[idx].enumname);
00246
00247 for (p = defs[idx].format, i = 0; *p != 0; p++)
00248 if (*p != '0')
00249 printf (", (ARG%d)", i++);
00250
00251 puts (")");
00252 }
00253
00254
00255
00256
00257 static void
00258 gendef (format)
00259 const char *format;
00260 {
00261 const char *p;
00262 int i, j;
00263
00264
00265
00266
00267 printf ("rtx\ngen_rtx_fmt_%s (code, mode", format);
00268 for (p = format, i = 0; *p != 0; p++)
00269 if (*p != '0')
00270 printf (", arg%d", i++);
00271
00272 puts (")\n RTX_CODE code;\n enum machine_mode mode;");
00273 for (p = format, i = 0; *p != 0; p++)
00274 if (*p != '0')
00275 printf (" %sarg%d;\n", type_from_format (*p), i++);
00276
00277
00278
00279 puts ("{");
00280 puts (" rtx rt;");
00281 printf (" rt = ggc_alloc_rtx (%d);\n", (int) strlen (format));
00282
00283 puts (" memset (rt, 0, sizeof (struct rtx_def) - sizeof (rtunion));\n");
00284 puts (" PUT_CODE (rt, code);");
00285 puts (" PUT_MODE (rt, mode);");
00286
00287 for (p = format, i = j = 0; *p ; ++p, ++i)
00288 if (*p != '0')
00289 printf (" %s (rt, %d) = arg%d;\n", accessor_from_format (*p), i, j++);
00290 else
00291 printf (" X0EXP (rt, %d) = NULL_RTX;\n", i);
00292
00293 puts ("\n return rt;\n}\n");
00294 }
00295
00296
00297
00298 static void
00299 genlegend ()
00300 {
00301 puts ("/* Generated automatically by gengenrtl from rtl.def. */\n");
00302 }
00303
00304
00305
00306 static void
00307 genheader ()
00308 {
00309 int i;
00310 const char **fmt;
00311
00312 puts ("#ifndef GCC_GENRTL_H");
00313 puts ("#define GCC_GENRTL_H\n");
00314
00315 for (fmt = formats; *fmt; ++fmt)
00316 gendecl (*fmt);
00317
00318 putchar ('\n');
00319
00320 for (i = 0; i < NUM_RTX_CODE; i++)
00321 if (! special_format (defs[i].format))
00322 genmacro (i);
00323
00324 puts ("\n#endif /* GCC_GENRTL_H */");
00325 }
00326
00327
00328
00329 static void
00330 gencode ()
00331 {
00332 const char **fmt;
00333
00334 puts ("#include \"config.h\"");
00335 puts ("#include \"system.h\"");
00336 puts ("#include \"obstack.h\"");
00337 puts ("#include \"rtl.h\"");
00338 puts ("#include \"ggc.h\"\n");
00339 puts ("extern struct obstack *rtl_obstack;\n");
00340
00341 for (fmt = formats; *fmt != 0; fmt++)
00342 gendef (*fmt);
00343 }
00344
00345
00346
00347
00348 extern int main PARAMS ((int, char **));
00349
00350 int
00351 main (argc, argv)
00352 int argc;
00353 char **argv;
00354 {
00355 find_formats ();
00356 genlegend ();
00357
00358 if (argc == 2 && argv[1][0] == '-' && argv[1][1] == 'h')
00359 genheader ();
00360 else
00361 gencode ();
00362
00363 if (ferror (stdout) || fflush (stdout) || fclose (stdout))
00364 return FATAL_EXIT_CODE;
00365
00366 return SUCCESS_EXIT_CODE;
00367 }