diff options
author | Paolo Bonzini <bonzini@gnu.org> | 2009-04-08 15:00:34 +0000 |
---|---|---|
committer | Paolo Bonzini <bonzini@gcc.gnu.org> | 2009-04-08 15:00:34 +0000 |
commit | 7ddf71e3171fb2d809e7baf6a94c9243b8d9fcac (patch) | |
tree | a0c23b6e97fff3605468cc753addf1d49c74ad81 /gcc | |
parent | ed57136d4a6bbf190126322a818175debee588b4 (diff) | |
download | gcc-7ddf71e3171fb2d809e7baf6a94c9243b8d9fcac.zip gcc-7ddf71e3171fb2d809e7baf6a94c9243b8d9fcac.tar.gz gcc-7ddf71e3171fb2d809e7baf6a94c9243b8d9fcac.tar.bz2 |
genoutput.c (validate_optab_operands): New.
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.
From-SVN: r145746
Diffstat (limited to 'gcc')
-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 c78d212..4f3d18d 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 c983110..c414891 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 b2c878d..5364101 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 39fc590..e651cb4 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); } |