diff options
author | bonzini <bonzini@138bc75d-0d04-0410-961f-82ee72b054a4> | 2009-04-08 15:00:34 +0000 |
---|---|---|
committer | bonzini <bonzini@138bc75d-0d04-0410-961f-82ee72b054a4> | 2009-04-08 15:00:34 +0000 |
commit | cbb955b0d43c611d8d408f8d1b237385c906648f (patch) | |
tree | a0c23b6e97fff3605468cc753addf1d49c74ad81 /gcc/genflags.c | |
parent | d70ba424573058e6bcba5d31131ae0083e413269 (diff) | |
download | gcc-cbb955b0d43c611d8d408f8d1b237385c906648f.tar.gz |
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.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@145746 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/genflags.c')
-rw-r--r-- | gcc/genflags.c | 27 |
1 files changed, 23 insertions, 4 deletions
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; |