X-Git-Url: http://git.sourceforge.jp/view?a=blobdiff_plain;f=gcc%2Fgenoutput.c;h=b0be21c476b8462adf66d9cb77ab8616d433e538;hb=11f5d2b2b370f5e5cc06d4f207046275ef466ae4;hp=ba7fd4c24621b874a64640336b652ee3d85cb90c;hpb=8c4c00c181e6df4f0a9afc76e4c9edbbc1c2fd41;p=pf3gnuchains%2Fgcc-fork.git diff --git a/gcc/genoutput.c b/gcc/genoutput.c index ba7fd4c2462..b0be21c476b 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, 2004, 2005, 2007 Free Software Foundation, Inc. + 2003, 2004, 2005, 2007, 2008 Free Software Foundation, Inc. This file is part of GCC. @@ -154,7 +154,7 @@ struct data { struct data *next; const char *name; - const char *template; + const char *template_code; int code_number; int index_number; const char *filename; @@ -266,6 +266,8 @@ output_operand_data (void) printf (" %d,\n", d->strict_low); + printf (" %d,\n", d->constraint == NULL ? 1 : 0); + printf (" %d\n", d->eliminable); printf(" },\n"); @@ -336,7 +338,7 @@ output_insn_data (void) break; case INSN_OUTPUT_FORMAT_SINGLE: { - const char *p = d->template; + const char *p = d->template_code; char prev = 0; printf ("#if HAVE_DESIGNATED_INITIALIZERS\n"); @@ -656,36 +658,36 @@ place_operands (struct data *d) templates, or C code to generate the assembler code template. */ static void -process_template (struct data *d, const char *template) +process_template (struct data *d, const char *template_code) { const char *cp; int i; /* Templates starting with * contain straight code to be run. */ - if (template[0] == '*') + if (template_code[0] == '*') { - d->template = 0; + d->template_code = 0; d->output_format = INSN_OUTPUT_FORMAT_FUNCTION; puts ("\nstatic const char *"); printf ("output_%d (rtx *operands ATTRIBUTE_UNUSED, rtx insn ATTRIBUTE_UNUSED)\n", d->code_number); puts ("{"); - print_rtx_ptr_loc (template); - puts (template + 1); + print_rtx_ptr_loc (template_code); + puts (template_code + 1); puts ("}"); } /* If the assembler code template starts with a @ it is a newline-separated list of assembler code templates, one for each alternative. */ - else if (template[0] == '@') + else if (template_code[0] == '@') { - d->template = 0; + d->template_code = 0; d->output_format = INSN_OUTPUT_FORMAT_MULTI; printf ("\nstatic const char * const output_%d[] = {\n", d->code_number); - for (i = 0, cp = &template[1]; *cp; ) + for (i = 0, cp = &template_code[1]; *cp; ) { const char *ep, *sp; @@ -725,7 +727,7 @@ process_template (struct data *d, const char *template) } else { - d->template = template; + d->template_code = template_code; d->output_format = INSN_OUTPUT_FORMAT_SINGLE; } } @@ -830,6 +832,22 @@ validate_insn_operands (struct data *d) have_error = 1; } } + +static void +validate_optab_operands (struct data *d) +{ + if (!d->name || d->name[0] == '\0' || d->name[0] == '*') + return; + + /* Miscellaneous tests. */ + if (strncmp (d->name, "cstore", 6) == 0 + && d->name[strlen (d->name) - 1] == '4' + && d->operand[0].mode == VOIDmode) + { + message_with_line (d->lineno, "missing mode for operand 0 of cstore"); + have_error = 1; + } +} /* Look at a define_insn just read. Assign its code number. Record on idata the template and the number of arguments. If the insn has @@ -871,6 +889,7 @@ gen_insn (rtx insn, int lineno) #endif validate_insn_operands (d); validate_insn_alternatives (d); + validate_optab_operands (d); place_operands (d); process_template (d, XTMPL (insn, 3)); } @@ -952,10 +971,11 @@ gen_expand (rtx insn, int lineno) d->n_operands = max_opno + 1; d->n_dups = num_dups; - d->template = 0; + d->template_code = 0; d->output_format = INSN_OUTPUT_FORMAT_NONE; validate_insn_alternatives (d); + validate_optab_operands (d); place_operands (d); } @@ -993,7 +1013,7 @@ gen_split (rtx split, int lineno) d->n_operands = max_opno + 1; d->n_dups = 0; d->n_alternatives = 0; - d->template = 0; + d->template_code = 0; d->output_format = INSN_OUTPUT_FORMAT_NONE; place_operands (d); @@ -1120,9 +1140,12 @@ note_constraint (rtx exp, int lineno) { const char *name = XSTR (exp, 0); unsigned int namelen = strlen (name); - struct constraint_data **iter, **slot, *new; + struct constraint_data **iter, **slot, *new_cdata; - if (strchr (indep_constraints, name[0])) + /* The 'm' constraint is special here since that constraint letter + can be overridden by the back end by defining the + TARGET_MEM_CONSTRAINT macro. */ + if (strchr (indep_constraints, name[0]) && name[0] != 'm') { if (name[1] == '\0') message_with_line (lineno, "constraint letter '%s' cannot be " @@ -1170,12 +1193,12 @@ note_constraint (rtx exp, int lineno) return; } } - new = xmalloc (sizeof (struct constraint_data) + namelen); - strcpy ((char *)new + offsetof(struct constraint_data, name), name); - new->namelen = namelen; - new->lineno = lineno; - new->next_this_letter = *slot; - *slot = new; + new_cdata = XNEWVAR (struct constraint_data, sizeof (struct constraint_data) + namelen); + strcpy ((char *)new_cdata + offsetof(struct constraint_data, name), name); + new_cdata->namelen = namelen; + new_cdata->lineno = lineno; + new_cdata->next_this_letter = *slot; + *slot = new_cdata; } /* Return the length of the constraint name beginning at position S