X-Git-Url: http://git.sourceforge.jp/view?a=blobdiff_plain;f=gcc%2Fgengenrtl.c;h=ad1bc7fce0639477f84e61c7af15e63ba1df49c9;hb=d984cc458eb6494430712516c01e32b593ce6435;hp=e1addb640076447b6597fc1c0cd84f371e779fc5;hpb=ecbe6271cf193533d55f641b6ab892084e708b6d;p=pf3gnuchains%2Fgcc-fork.git diff --git a/gcc/gengenrtl.c b/gcc/gengenrtl.c index e1addb64007..ad1bc7fce06 100644 --- a/gcc/gengenrtl.c +++ b/gcc/gengenrtl.c @@ -1,22 +1,22 @@ /* Generate code to allocate RTL structures. - Copyright (C) 1997, 1998, 1999 Free Software Foundation, Inc. + Copyright (C) 1997, 1998, 1999, 2000 Free Software Foundation, Inc. -This file is part of GNU CC. +This file is part of GCC. -GNU CC is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 2, or (at your option) -any later version. +GCC is free software; you can redistribute it and/or modify it under +the terms of the GNU General Public License as published by the Free +Software Foundation; either version 2, or (at your option) any later +version. -GNU CC is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. +GCC is distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. You should have received a copy of the GNU General Public License -along with GNU CC; see the file COPYING. If not, write to -the Free Software Foundation, 59 Temple Place - Suite 330, -Boston, MA 02111-1307, USA. */ +along with GCC; see the file COPYING. If not, write to the Free +Software Foundation, 59 Temple Place - Suite 330, Boston, MA +02111-1307, USA. */ #include "hconfig.h" @@ -40,65 +40,84 @@ Boston, MA 02111-1307, USA. */ slots in a CONST_DOUBLE, so we provide them even if one would suffice. */ #ifdef REAL_ARITHMETIC -#if LONG_DOUBLE_TYPE_SIZE == 96 -#define REAL_WIDTH (11*8 + HOST_BITS_PER_WIDE_INT)/HOST_BITS_PER_WIDE_INT -#elif LONG_DOUBLE_TYPE_SIZE == 128 -#define REAL_WIDTH (19*8 + HOST_BITS_PER_WIDE_INT)/HOST_BITS_PER_WIDE_INT -#elif HOST_FLOAT_FORMAT != TARGET_FLOAT_FORMAT -#define REAL_WIDTH (7*8 + HOST_BITS_PER_WIDE_INT)/HOST_BITS_PER_WIDE_INT -#endif +# if MAX_LONG_DOUBLE_TYPE_SIZE == 96 +# define REAL_WIDTH \ + (11*8 + HOST_BITS_PER_WIDE_INT)/HOST_BITS_PER_WIDE_INT +# else +# if MAX_LONG_DOUBLE_TYPE_SIZE == 128 +# define REAL_WIDTH \ + (19*8 + HOST_BITS_PER_WIDE_INT)/HOST_BITS_PER_WIDE_INT +# else +# if HOST_FLOAT_FORMAT != TARGET_FLOAT_FORMAT +# define REAL_WIDTH \ + (7*8 + HOST_BITS_PER_WIDE_INT)/HOST_BITS_PER_WIDE_INT +# endif +# endif +# endif #endif /* REAL_ARITHMETIC */ #ifndef REAL_WIDTH -#if HOST_BITS_PER_WIDE_INT*2 >= LONG_DOUBLE_TYPE_SIZE -#define REAL_WIDTH 2 -#elif HOST_BITS_PER_WIDE_INT*3 >= LONG_DOUBLE_TYPE_SIZE -#define REAL_WIDTH 3 -#elif HOST_BITS_PER_WIDE_INT*4 >= LONG_DOUBLE_TYPE_SIZE -#define REAL_WIDTH 4 -#endif +# if HOST_BITS_PER_WIDE_INT*2 >= MAX_LONG_DOUBLE_TYPE_SIZE +# define REAL_WIDTH 2 +# else +# if HOST_BITS_PER_WIDE_INT*3 >= MAX_LONG_DOUBLE_TYPE_SIZE +# define REAL_WIDTH 3 +# else +# if HOST_BITS_PER_WIDE_INT*4 >= MAX_LONG_DOUBLE_TYPE_SIZE +# define REAL_WIDTH 4 +# endif +# endif +# endif #endif /* REAL_WIDTH */ #if REAL_WIDTH == 1 -#define CONST_DOUBLE_FORMAT "e0ww" -#elif REAL_WIDTH == 2 -#define CONST_DOUBLE_FORMAT "e0ww" -#elif REAL_WIDTH == 3 -#define CONST_DOUBLE_FORMAT "e0www" -#elif REAL_WIDTH == 4 -#define CONST_DOUBLE_FORMAT "e0wwww" -#elif REAL_WIDTH == 5 -#define CONST_DOUBLE_FORMAT "e0wwwww" +# define CONST_DOUBLE_FORMAT "0ww" #else -#define CONST_DOUBLE_FORMAT /* nothing - will cause syntax error */ +# if REAL_WIDTH == 2 +# define CONST_DOUBLE_FORMAT "0ww" +# else +# if REAL_WIDTH == 3 +# define CONST_DOUBLE_FORMAT "0www" +# else +# if REAL_WIDTH == 4 +# define CONST_DOUBLE_FORMAT "0wwww" +# else +# if REAL_WIDTH == 5 +# define CONST_DOUBLE_FORMAT "0wwwww" +# else +# define CONST_DOUBLE_FORMAT /* nothing - will cause syntax error */ +# endif +# endif +# endif +# endif #endif struct rtx_definition { - const char *enumname, *name, *format; + const char *const enumname, *const name, *const format; }; -#define DEF_RTL_EXPR(ENUM, NAME, FORMAT, CLASS) { STRINGIFY(ENUM), NAME, FORMAT }, +#define DEF_RTL_EXPR(ENUM, NAME, FORMAT, CLASS) { STRINGX(ENUM), NAME, FORMAT }, -struct rtx_definition defs[] = +const struct rtx_definition defs[] = { #include "rtl.def" /* rtl expressions are documented here */ }; const char *formats[NUM_RTX_CODE]; -static const char *type_from_format PROTO((int)); -static const char *accessor_from_format PROTO((int)); -static int special_format PROTO((const char *)); -static int special_rtx PROTO((int)); -static void find_formats PROTO((void)); -static void gendecl PROTO((const char *)); -static void genmacro PROTO((int)); -static void gendef PROTO((const char *)); -static void genlegend PROTO((void)); -static void genheader PROTO((void)); -static void gencode PROTO((void)); +static const char *type_from_format PARAMS ((int)); +static const char *accessor_from_format PARAMS ((int)); +static int special_format PARAMS ((const char *)); +static int special_rtx PARAMS ((int)); +static void find_formats PARAMS ((void)); +static void gendecl PARAMS ((const char *)); +static void genmacro PARAMS ((int)); +static void gendef PARAMS ((const char *)); +static void genlegend PARAMS ((void)); +static void genheader PARAMS ((void)); +static void gencode PARAMS ((void)); /* Decode a format letter into a C type string. */ @@ -115,7 +134,7 @@ type_from_format (c) return "HOST_WIDE_INT "; case 's': - return "char *"; + return "const char *"; case 'e': case 'u': return "rtx "; @@ -180,7 +199,7 @@ special_format (fmt) /* Return nonzero if the RTL code given by index IDX is one that we should not generate a gen_RTX_FOO function foo (because that function is present - elsewhere in the compiler. */ + elsewhere in the compiler). */ static int special_rtx (idx) @@ -189,10 +208,11 @@ special_rtx (idx) return (strcmp (defs[idx].enumname, "CONST_INT") == 0 || strcmp (defs[idx].enumname, "CONST_DOUBLE") == 0 || strcmp (defs[idx].enumname, "REG") == 0 + || strcmp (defs[idx].enumname, "SUBREG") == 0 || strcmp (defs[idx].enumname, "MEM") == 0); } -/* Place a list of all format specifiers we use into the array FORMAT. */ +/* Place a list of all format specifiers we use into the array FORMAT. */ static void find_formats () @@ -224,7 +244,7 @@ gendecl (format) const char *p; int i, pos; - printf ("extern rtx gen_rtx_fmt_%s\tPROTO((RTX_CODE, ", format); + printf ("extern rtx gen_rtx_fmt_%s\tPARAMS ((RTX_CODE, ", format); printf ("enum machine_mode mode"); /* Write each parameter that is needed and start a new line when the line @@ -272,7 +292,7 @@ genmacro (idx) if (*p != '0') printf (", (ARG%d)", i++); - printf (")\n"); + puts (")"); } /* Generate the code for the function to generate RTL whose @@ -293,30 +313,28 @@ gendef (format) if (*p != '0') printf (", arg%d", i++); - printf (")\n RTX_CODE code;\n enum machine_mode mode;\n"); + puts (")\n RTX_CODE code;\n enum machine_mode mode;"); for (p = format, i = 0; *p != 0; p++) if (*p != '0') printf (" %sarg%d;\n", type_from_format (*p), i++); /* Now write out the body of the function itself, which allocates the memory and initializes it. */ - printf ("{\n"); - printf (" rtx rt;\n"); - printf (" if (ggc_p)\n"); - printf (" rt = ggc_alloc_rtx (%d);\n", - (int) strlen (format)); - printf (" else\n"); - printf (" rt = obstack_alloc_rtx (sizeof (struct rtx_def) + %d * sizeof (rtunion));\n", - (int) strlen (format) - 1); - - printf (" PUT_CODE (rt, code);\n"); - printf (" PUT_MODE (rt, mode);\n"); + puts ("{"); + puts (" rtx rt;"); + printf (" rt = ggc_alloc_rtx (%d);\n", (int) strlen (format)); + + puts (" memset (rt, 0, sizeof (struct rtx_def) - sizeof (rtunion));\n"); + puts (" PUT_CODE (rt, code);"); + puts (" PUT_MODE (rt, mode);"); for (p = format, i = j = 0; *p ; ++p, ++i) if (*p != '0') printf (" %s (rt, %d) = arg%d;\n", accessor_from_format (*p), i, j++); + else + printf (" X0EXP (rt, %d) = NULL_RTX;\n", i); - printf ("\n return rt;\n}\n\n"); + puts ("\n return rt;\n}\n"); } /* Generate the documentation header for files we write. */ @@ -324,8 +342,7 @@ gendef (format) static void genlegend () { - printf ("/* Generated automaticaly by the program `gengenrtl'\n"); - printf (" from the RTL description file `rtl.def' */\n\n"); + puts ("/* Generated automatically by gengenrtl from rtl.def. */\n"); } /* Generate the text of the header file we make, genrtl.h. */ @@ -335,15 +352,20 @@ genheader () { int i; const char **fmt; - + + puts ("#ifndef GCC_GENRTL_H"); + puts ("#define GCC_GENRTL_H\n"); + for (fmt = formats; *fmt; ++fmt) gendecl (*fmt); - printf ("\n"); + putchar ('\n'); for (i = 0; i < NUM_RTX_CODE; i++) if (! special_format (defs[i].format)) genmacro (i); + + puts ("\n#endif /* GCC_GENRTL_H */"); } /* Generate the text of the code file we write, genrtl.c. */ @@ -353,18 +375,16 @@ gencode () { const char **fmt; - puts ("#include \"config.h\"\n"); - puts ("#include \"system.h\"\n"); - puts ("#include \"obstack.h\"\n"); - puts ("#include \"rtl.h\"\n"); - puts ("#include \"ggc.h\"\n\n"); - puts ("extern struct obstack *rtl_obstack;\n\n"); - puts ("static rtx obstack_alloc_rtx PROTO((int length));\n"); - puts ("static rtx obstack_alloc_rtx (length)\n"); - puts (" register int length;\n{\n"); - puts (" rtx rt = (rtx) obstack_alloc (rtl_obstack, length);\n\n"); - puts (" memset(rt, 0, sizeof(struct rtx_def) - sizeof(rtunion));\n\n"); - puts (" return rt;\n}\n\n"); + puts ("#include \"config.h\""); + puts ("#include \"system.h\""); + puts ("#include \"obstack.h\""); + puts ("#include \"rtl.h\""); + puts ("#include \"ggc.h\"\n"); + puts ("extern struct obstack *rtl_obstack;\n"); + puts ("#define obstack_alloc_rtx(n) \\"); + puts (" ((rtx) obstack_alloc (rtl_obstack, \\"); + puts (" sizeof (struct rtx_def) \\"); + puts (" + ((n) - 1) * sizeof (rtunion)))\n"); for (fmt = formats; *fmt != 0; fmt++) gendef (*fmt); @@ -375,7 +395,7 @@ PTR xmalloc (nbytes) size_t nbytes; { - register PTR tmp = (PTR) malloc (nbytes); + PTR tmp = (PTR) really_call_malloc (nbytes); if (!tmp) { @@ -391,6 +411,7 @@ xmalloc (nbytes) /* This is the main program. We accept only one argument, "-h", which says we are writing the genrtl.h file. Otherwise we are writing the genrtl.c file. */ +extern int main PARAMS ((int, char **)); int main (argc, argv) @@ -405,8 +426,8 @@ main (argc, argv) else gencode (); - fflush (stdout); - exit (ferror (stdout) != 0 ? FATAL_EXIT_CODE : SUCCESS_EXIT_CODE); - /* NOTREACHED */ - return 0; + if (ferror (stdout) || fflush (stdout) || fclose (stdout)) + return FATAL_EXIT_CODE; + + return SUCCESS_EXIT_CODE; }