summaryrefslogtreecommitdiff
path: root/gcc/genflags.c
diff options
context:
space:
mode:
authorbonzini <bonzini@138bc75d-0d04-0410-961f-82ee72b054a4>2009-04-08 15:00:34 +0000
committerbonzini <bonzini@138bc75d-0d04-0410-961f-82ee72b054a4>2009-04-08 15:00:34 +0000
commitcbb955b0d43c611d8d408f8d1b237385c906648f (patch)
treea0c23b6e97fff3605468cc753addf1d49c74ad81 /gcc/genflags.c
parentd70ba424573058e6bcba5d31131ae0083e413269 (diff)
downloadgcc-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.c27
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;