X-Git-Url: http://git.sourceforge.jp/view?a=blobdiff_plain;f=gcc%2Fgenoutput.c;h=44bc412d48840ad8094d8a516add5857cbaae653;hb=5c85204af0c6ee0dcada78b28ce2b87c106fee96;hp=044a64382d2a282eaaad825896399e1073e3768c;hpb=b9a7cc698921e2a5cee2afd48b6556af5f7fbf1f;p=pf3gnuchains%2Fgcc-fork.git diff --git a/gcc/genoutput.c b/gcc/genoutput.c index 044a64382d2..44bc412d488 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. @@ -174,7 +174,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 +242,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,6 +286,7 @@ 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) @@ -362,13 +323,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,11 +355,26 @@ 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 void *) 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 (); @@ -415,8 +400,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 +662,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 +682,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,7 +818,7 @@ 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; @@ -867,7 +859,7 @@ 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; @@ -905,7 +897,7 @@ 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; @@ -948,7 +940,7 @@ 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; @@ -1023,7 +1015,6 @@ main (int argc, char **argv) } printf("\n\n"); - output_predicate_decls (); output_operand_data (); output_insn_data (); output_get_insn_name (); @@ -1093,7 +1084,7 @@ constraint_len (const char *p, int genoutput_default_constraint_len) 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 + /* 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