summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog12
-rw-r--r--gcc/genextract.c15
-rw-r--r--gcc/genflags.c27
-rw-r--r--gcc/genoutput.c18
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);
}