X-Git-Url: http://git.sourceforge.jp/view?a=blobdiff_plain;f=gcc%2Fgenoutput.c;h=a62c677c806f644ca1d49d4ff591f15810fef1c0;hb=cef4ba122c850a24e9781153f454c7f5a19dbea1;hp=2f464cf2a62ccdff8b77e321bffdb385c4849d59;hpb=1a97be37b9acd218052a467f7b1a26d3be1154f9;p=pf3gnuchains%2Fgcc-fork.git diff --git a/gcc/genoutput.c b/gcc/genoutput.c index 2f464cf2a62..a62c677c806 100644 --- a/gcc/genoutput.c +++ b/gcc/genoutput.c @@ -1,6 +1,6 @@ /* Generate code from to output assembler insns as recognized from rtl. Copyright (C) 1987, 1988, 1992, 1994, 1995, 1997, 1998, 1999, 2000, 2002, - 2003 Free Software Foundation, Inc. + 2003, 2004 Free Software Foundation, Inc. This file is part of GCC. @@ -160,6 +160,7 @@ struct data const char *template; int code_number; int index_number; + const char *filename; int lineno; int n_operands; /* Number of operands this insn recognizes */ int n_dups; /* Number times match_dup appears in pattern */ @@ -174,7 +175,6 @@ struct data static struct data *idata, **idata_end = &idata; static void output_prologue (void); -static void output_predicate_decls (void); static void output_operand_data (void); static void output_insn_data (void); static void output_get_insn_name (void); @@ -243,45 +243,6 @@ output_prologue (void) printf ("#include \"target.h\"\n"); } - -/* We need to define all predicates used. Keep a list of those we - have defined so far. There normally aren't very many predicates - used, so a linked list should be fast enough. */ -struct predicate { const char *name; struct predicate *next; }; - -static void -output_predicate_decls (void) -{ - struct predicate *predicates = 0; - struct operand_data *d; - struct predicate *p, *next; - - for (d = odata; d; d = d->next) - if (d->predicate && d->predicate[0]) - { - for (p = predicates; p; p = p->next) - if (strcmp (p->name, d->predicate) == 0) - break; - - if (p == 0) - { - printf ("extern int %s (rtx, enum machine_mode);\n", - d->predicate); - p = (struct predicate *) xmalloc (sizeof (struct predicate)); - p->name = d->predicate; - p->next = predicates; - predicates = p; - } - } - - printf ("\n\n"); - for (p = predicates; p; p = next) - { - next = p->next; - free (p); - } -} - static void output_operand_data (void) { @@ -326,10 +287,12 @@ output_insn_data (void) break; } + printf ("#if GCC_VERSION >= 2007\n__extension__\n#endif\n"); printf ("\nconst struct insn_data insn_data[] = \n{\n"); for (d = idata; d; d = d->next) { + printf (" /* %s:%d */\n", d->filename, d->lineno); printf (" {\n"); if (d->name) @@ -362,13 +325,22 @@ output_insn_data (void) switch (d->output_format) { case INSN_OUTPUT_FORMAT_NONE: - printf (" 0,\n"); + printf ("#if HAVE_DESIGNATED_INITIALIZERS\n"); + printf (" { 0 },\n"); + printf ("#else\n"); + printf (" { 0, 0, 0 },\n"); + printf ("#endif\n"); break; case INSN_OUTPUT_FORMAT_SINGLE: { const char *p = d->template; char prev = 0; + printf ("#if HAVE_DESIGNATED_INITIALIZERS\n"); + printf (" { .single =\n"); + printf ("#else\n"); + printf (" {\n"); + printf ("#endif\n"); printf (" \""); while (*p) { @@ -385,14 +357,29 @@ output_insn_data (void) ++p; } printf ("\",\n"); + printf ("#if HAVE_DESIGNATED_INITIALIZERS\n"); + printf (" },\n"); + printf ("#else\n"); + printf (" 0, 0 },\n"); + printf ("#endif\n"); } break; case INSN_OUTPUT_FORMAT_MULTI: + printf ("#if HAVE_DESIGNATED_INITIALIZERS\n"); + printf (" { .multi = output_%d },\n", d->code_number); + printf ("#else\n"); + printf (" { 0, output_%d, 0 },\n", d->code_number); + printf ("#endif\n"); + break; case INSN_OUTPUT_FORMAT_FUNCTION: - printf (" (const PTR) output_%d,\n", d->code_number); + printf ("#if HAVE_DESIGNATED_INITIALIZERS\n"); + printf (" { .function = output_%d },\n", d->code_number); + printf ("#else\n"); + printf (" { 0, 0, output_%d },\n", d->code_number); + printf ("#endif\n"); break; default: - abort (); + gcc_unreachable (); } if (d->name && d->name[0] != '*') @@ -415,8 +402,7 @@ static void output_get_insn_name (void) { printf ("const char *\n"); - printf ("get_insn_name (code)\n"); - printf (" int code;\n"); + printf ("get_insn_name (int code)\n"); printf ("{\n"); printf (" if (code == NOOP_MOVE_INSN_CODE)\n"); printf (" return \"NOOP_MOVE\";\n"); @@ -678,12 +664,9 @@ process_template (struct data *d, const char *template) d->template = 0; d->output_format = INSN_OUTPUT_FORMAT_FUNCTION; - printf ("\nstatic const char *output_%d (rtx *, rtx);\n", - d->code_number); puts ("\nstatic const char *"); - printf ("output_%d (operands, insn)\n", d->code_number); - puts (" rtx *operands ATTRIBUTE_UNUSED;"); - puts (" rtx insn ATTRIBUTE_UNUSED;"); + printf ("output_%d (rtx *operands ATTRIBUTE_UNUSED, rtx insn ATTRIBUTE_UNUSED)\n", + d->code_number); puts ("{"); puts (template + 1); @@ -701,11 +684,22 @@ process_template (struct data *d, const char *template) for (i = 0, cp = &template[1]; *cp; ) { + const char *ep, *sp; + while (ISSPACE (*cp)) cp++; printf (" \""); - while (!IS_VSPACE (*cp) && *cp != '\0') + + for (ep = sp = cp; !IS_VSPACE (*ep) && *ep != '\0'; ++ep) + if (!ISSPACE (*ep)) + sp = ep + 1; + + if (sp != ep) + message_with_line (d->lineno, + "trailing whitespace in output template"); + + while (cp < sp) { putchar (*cp); cp++; @@ -826,11 +820,12 @@ validate_insn_operands (struct data *d) static void gen_insn (rtx insn, int lineno) { - struct data *d = (struct data *) xmalloc (sizeof (struct data)); + struct data *d = xmalloc (sizeof (struct data)); int i; d->code_number = next_code_number; d->index_number = next_index_number; + d->filename = read_rtx_filename; d->lineno = lineno; if (XSTR (insn, 0)[0]) d->name = XSTR (insn, 0); @@ -867,11 +862,12 @@ gen_insn (rtx insn, int lineno) static void gen_peephole (rtx peep, int lineno) { - struct data *d = (struct data *) xmalloc (sizeof (struct data)); + struct data *d = xmalloc (sizeof (struct data)); int i; d->code_number = next_code_number; d->index_number = next_index_number; + d->filename = read_rtx_filename; d->lineno = lineno; d->name = 0; @@ -905,11 +901,12 @@ gen_peephole (rtx peep, int lineno) static void gen_expand (rtx insn, int lineno) { - struct data *d = (struct data *) xmalloc (sizeof (struct data)); + struct data *d = xmalloc (sizeof (struct data)); int i; d->code_number = next_code_number; d->index_number = next_index_number; + d->filename = read_rtx_filename; d->lineno = lineno; if (XSTR (insn, 0)[0]) d->name = XSTR (insn, 0); @@ -948,11 +945,12 @@ gen_expand (rtx insn, int lineno) static void gen_split (rtx split, int lineno) { - struct data *d = (struct data *) xmalloc (sizeof (struct data)); + struct data *d = xmalloc (sizeof (struct data)); int i; d->code_number = next_code_number; d->index_number = next_index_number; + d->filename = read_rtx_filename; d->lineno = lineno; d->name = 0; @@ -990,9 +988,6 @@ main (int argc, char **argv) progname = "genoutput"; - if (argc <= 1) - fatal ("no input file name"); - if (init_md_reader_args (argc, argv) != SUCCESS_EXIT_CODE) return (FATAL_EXIT_CODE); @@ -1023,7 +1018,6 @@ main (int argc, char **argv) } printf("\n\n"); - output_predicate_decls (); output_operand_data (); output_insn_data (); output_get_insn_name (); @@ -1082,8 +1076,7 @@ check_constraint_len (void) for (p = ",#*+=&%!1234567890"; *p; p++) for (d = -9; d < 9; d++) - if (constraint_len (p, d) != d) - abort (); + gcc_assert (constraint_len (p, d) == d); } static int @@ -1091,9 +1084,8 @@ constraint_len (const char *p, int genoutput_default_constraint_len) { /* Check that we still match defaults.h . First we do a generation-time check that fails if the value is not the expected one... */ - if (DEFAULT_CONSTRAINT_LEN (*p, p) != 1) - abort (); - /* And now a comile-time check that should give a diagnostic if the + gcc_assert (DEFAULT_CONSTRAINT_LEN (*p, p) == 1); + /* And now a compile-time check that should give a diagnostic if the definition doesn't exactly match. */ #define DEFAULT_CONSTRAINT_LEN(C,STR) 1 /* Now re-define DEFAULT_CONSTRAINT_LEN so that we can verify it is