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
This commit is contained in:
parent
ed57136d4a
commit
7ddf71e317
@ -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
|
||||
|
@ -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,7 +189,12 @@ 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);
|
||||
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
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user