diff options
-rw-r--r-- | gcc/ChangeLog | 12 | ||||
-rw-r--r-- | gcc/genextract.c | 15 | ||||
-rw-r--r-- | gcc/genflags.c | 27 | ||||
-rw-r--r-- | gcc/genoutput.c | 18 |
4 files changed, 65 insertions, 7 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index c78d2129347..4f3d18d41e5 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,15 @@ +2009-04-08 Paolo Bonzini <bonzini@gnu.org> + + * genoutput.c (validate_optab_operands): New. + (gen_insn, gen_expand): Call it. + + * genflags.c (gen_insn): Detect misused iterators. + (main): Pass line_no to gen_insn, exit with status 1 on error. + + * genextract.c (line_no): Make global. + (VEC_safe_set_locstr): Change assertion to error message. + (main): Exit with status 1 on error. + 2009-04-08 Joseph Myers <joseph@codesourcery.com> PR c/39614 diff --git a/gcc/genextract.c b/gcc/genextract.c index c9831105c36..c414891bb6b 100644 --- a/gcc/genextract.c +++ b/gcc/genextract.c @@ -80,6 +80,8 @@ struct accum_extract VEC(char,heap) *pathstr; }; +int line_no; + /* Forward declarations. */ static void walk_rtx (rtx, struct accum_extract *); @@ -187,8 +189,13 @@ VEC_safe_set_locstr (VEC(locstr,heap) **vp, unsigned int ix, char *str) { if (ix < VEC_length (locstr, *vp)) { - gcc_assert (VEC_index (locstr, *vp, ix) == 0); - VEC_replace (locstr, *vp, ix, str); + if (VEC_index (locstr, *vp, ix)) + { + message_with_line (line_no, "repeated operand number %d", ix); + have_error = 1; + } + else + VEC_replace (locstr, *vp, ix, str); } else { @@ -399,7 +406,6 @@ main (int argc, char **argv) struct code_ptr *link; const char *name; int insn_code_number; - int line_no; progname = "genextract"; @@ -423,6 +429,9 @@ main (int argc, char **argv) } } + if (have_error) + return FATAL_EXIT_CODE; + print_header (); /* Write out code to handle peepholes and the insn_codes that it should diff --git a/gcc/genflags.c b/gcc/genflags.c index b2c878d0594..53641010935 100644 --- a/gcc/genflags.c +++ b/gcc/genflags.c @@ -43,7 +43,7 @@ static void max_operand_1 (rtx); static int num_operands (rtx); static void gen_proto (rtx); static void gen_macro (const char *, int, int); -static void gen_insn (rtx); +static void gen_insn (int, rtx); /* Count the number of match_operand's found. */ @@ -187,13 +187,32 @@ gen_proto (rtx insn) } static void -gen_insn (rtx insn) +gen_insn (int line_no, rtx insn) { const char *name = XSTR (insn, 0); const char *p; + const char *lt, *gt; int len; int truth = maybe_eval_c_test (XSTR (insn, 2)); + lt = strchr (name, '<'); + if (lt && strchr (lt + 1, '>')) + { + message_with_line (line_no, "unresolved iterator"); + have_error = 1; + return; + } + + gt = strchr (name, '>'); + if (lt || gt) + { + message_with_line (line_no, + "unmatched angle brackets, likely " + "an error in iterator syntax"); + have_error = 1; + return; + } + /* Don't mention instructions whose names are the null string or begin with '*'. They are in the machine description just to be recognized. */ @@ -260,7 +279,7 @@ main (int argc, char **argv) if (desc == NULL) break; if (GET_CODE (desc) == DEFINE_INSN || GET_CODE (desc) == DEFINE_EXPAND) - gen_insn (desc); + gen_insn (line_no, desc); } /* Print out the prototypes now. */ @@ -273,7 +292,7 @@ main (int argc, char **argv) puts("\n#endif /* GCC_INSN_FLAGS_H */"); - if (ferror (stdout) || fflush (stdout) || fclose (stdout)) + if (have_error || ferror (stdout) || fflush (stdout) || fclose (stdout)) return FATAL_EXIT_CODE; return SUCCESS_EXIT_CODE; diff --git a/gcc/genoutput.c b/gcc/genoutput.c index 39fc590f01f..e651cb4d878 100644 --- a/gcc/genoutput.c +++ b/gcc/genoutput.c @@ -830,6 +830,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 +887,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)); } @@ -956,6 +973,7 @@ gen_expand (rtx insn, int lineno) d->output_format = INSN_OUTPUT_FORMAT_NONE; validate_insn_alternatives (d); + validate_optab_operands (d); place_operands (d); } |