Commit 7ddf71e3 by Paolo Bonzini Committed by Paolo Bonzini

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
parent ed57136d
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> 2009-04-08 Joseph Myers <joseph@codesourcery.com>
PR c/39614 PR c/39614
......
...@@ -80,6 +80,8 @@ struct accum_extract ...@@ -80,6 +80,8 @@ struct accum_extract
VEC(char,heap) *pathstr; VEC(char,heap) *pathstr;
}; };
int line_no;
/* Forward declarations. */ /* Forward declarations. */
static void walk_rtx (rtx, struct accum_extract *); static void walk_rtx (rtx, struct accum_extract *);
...@@ -187,7 +189,12 @@ VEC_safe_set_locstr (VEC(locstr,heap) **vp, unsigned int ix, char *str) ...@@ -187,7 +189,12 @@ VEC_safe_set_locstr (VEC(locstr,heap) **vp, unsigned int ix, char *str)
{ {
if (ix < VEC_length (locstr, *vp)) if (ix < VEC_length (locstr, *vp))
{ {
gcc_assert (VEC_index (locstr, *vp, ix) == 0); 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); VEC_replace (locstr, *vp, ix, str);
} }
else else
...@@ -399,7 +406,6 @@ main (int argc, char **argv) ...@@ -399,7 +406,6 @@ main (int argc, char **argv)
struct code_ptr *link; struct code_ptr *link;
const char *name; const char *name;
int insn_code_number; int insn_code_number;
int line_no;
progname = "genextract"; progname = "genextract";
...@@ -423,6 +429,9 @@ main (int argc, char **argv) ...@@ -423,6 +429,9 @@ main (int argc, char **argv)
} }
} }
if (have_error)
return FATAL_EXIT_CODE;
print_header (); print_header ();
/* Write out code to handle peepholes and the insn_codes that it should /* Write out code to handle peepholes and the insn_codes that it should
......
...@@ -43,7 +43,7 @@ static void max_operand_1 (rtx); ...@@ -43,7 +43,7 @@ static void max_operand_1 (rtx);
static int num_operands (rtx); static int num_operands (rtx);
static void gen_proto (rtx); static void gen_proto (rtx);
static void gen_macro (const char *, int, int); 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. */ /* Count the number of match_operand's found. */
...@@ -187,13 +187,32 @@ gen_proto (rtx insn) ...@@ -187,13 +187,32 @@ gen_proto (rtx insn)
} }
static void static void
gen_insn (rtx insn) gen_insn (int line_no, rtx insn)
{ {
const char *name = XSTR (insn, 0); const char *name = XSTR (insn, 0);
const char *p; const char *p;
const char *lt, *gt;
int len; int len;
int truth = maybe_eval_c_test (XSTR (insn, 2)); 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 /* Don't mention instructions whose names are the null string
or begin with '*'. They are in the machine description just or begin with '*'. They are in the machine description just
to be recognized. */ to be recognized. */
...@@ -260,7 +279,7 @@ main (int argc, char **argv) ...@@ -260,7 +279,7 @@ main (int argc, char **argv)
if (desc == NULL) if (desc == NULL)
break; break;
if (GET_CODE (desc) == DEFINE_INSN || GET_CODE (desc) == DEFINE_EXPAND) if (GET_CODE (desc) == DEFINE_INSN || GET_CODE (desc) == DEFINE_EXPAND)
gen_insn (desc); gen_insn (line_no, desc);
} }
/* Print out the prototypes now. */ /* Print out the prototypes now. */
...@@ -273,7 +292,7 @@ main (int argc, char **argv) ...@@ -273,7 +292,7 @@ main (int argc, char **argv)
puts("\n#endif /* GCC_INSN_FLAGS_H */"); 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 FATAL_EXIT_CODE;
return SUCCESS_EXIT_CODE; return SUCCESS_EXIT_CODE;
......
...@@ -831,6 +831,22 @@ validate_insn_operands (struct data *d) ...@@ -831,6 +831,22 @@ validate_insn_operands (struct data *d)
} }
} }
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 /* 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 on idata the template and the number of arguments. If the insn has
a hairy output action, output a function for now. */ a hairy output action, output a function for now. */
...@@ -871,6 +887,7 @@ gen_insn (rtx insn, int lineno) ...@@ -871,6 +887,7 @@ gen_insn (rtx insn, int lineno)
#endif #endif
validate_insn_operands (d); validate_insn_operands (d);
validate_insn_alternatives (d); validate_insn_alternatives (d);
validate_optab_operands (d);
place_operands (d); place_operands (d);
process_template (d, XTMPL (insn, 3)); process_template (d, XTMPL (insn, 3));
} }
...@@ -956,6 +973,7 @@ gen_expand (rtx insn, int lineno) ...@@ -956,6 +973,7 @@ gen_expand (rtx insn, int lineno)
d->output_format = INSN_OUTPUT_FORMAT_NONE; d->output_format = INSN_OUTPUT_FORMAT_NONE;
validate_insn_alternatives (d); validate_insn_alternatives (d);
validate_optab_operands (d);
place_operands (d); place_operands (d);
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment