mirror of git://gcc.gnu.org/git/gcc.git
genoutput.c (data): Use a file_location to record the source position.
gcc/ * genoutput.c (data): Use a file_location to record the source position. (nothing): Delete. (idata, idata_end): Remove initialization. (constraint_data): Replace lineno with a file_location. (output_insn_data): Update after changes to data. (gen_insn, gen_peephole, gen_expand, gen_split): Likewise. (scan_operands): Likewise, using *_at rather than *_with_line functions. (process_template): Likewise. (validate_insn_alternatives): Likewise. (validate_insn_operands): Likewise. (validate_optab_operands): Likewise. (init_insn_for_nothing): Initialize idata and idata_end. (note_constraint): Update after changes to constraint_data, using at rather than with_line functions. (mdep_constraint_len): Take a file_location rather than a line number. Use at rather than with_line functions. From-SVN: r225881
This commit is contained in:
parent
8f2463105b
commit
ca018d3cc0
|
|
@ -1,3 +1,24 @@
|
||||||
|
2015-07-16 Richard Sandiford <richard.sandiford@arm.com>
|
||||||
|
|
||||||
|
* genoutput.c (data): Use a file_location to record the source
|
||||||
|
position.
|
||||||
|
(nothing): Delete.
|
||||||
|
(idata, idata_end): Remove initialization.
|
||||||
|
(constraint_data): Replace lineno with a file_location.
|
||||||
|
(output_insn_data): Update after changes to data.
|
||||||
|
(gen_insn, gen_peephole, gen_expand, gen_split): Likewise.
|
||||||
|
(scan_operands): Likewise, using *_at rather than *_with_line
|
||||||
|
functions.
|
||||||
|
(process_template): Likewise.
|
||||||
|
(validate_insn_alternatives): Likewise.
|
||||||
|
(validate_insn_operands): Likewise.
|
||||||
|
(validate_optab_operands): Likewise.
|
||||||
|
(init_insn_for_nothing): Initialize idata and idata_end.
|
||||||
|
(note_constraint): Update after changes to constraint_data,
|
||||||
|
using at rather than with_line functions.
|
||||||
|
(mdep_constraint_len): Take a file_location rather than a
|
||||||
|
line number. Use at rather than with_line functions.
|
||||||
|
|
||||||
2015-07-16 Richard Sandiford <richard.sandiford@arm.com>
|
2015-07-16 Richard Sandiford <richard.sandiford@arm.com>
|
||||||
|
|
||||||
* read-md.h (fatal_at): Declare.
|
* read-md.h (fatal_at): Declare.
|
||||||
|
|
|
||||||
126
gcc/genoutput.c
126
gcc/genoutput.c
|
|
@ -154,9 +154,8 @@ struct data
|
||||||
struct data *next;
|
struct data *next;
|
||||||
const char *name;
|
const char *name;
|
||||||
const char *template_code;
|
const char *template_code;
|
||||||
|
file_location loc;
|
||||||
int code_number;
|
int code_number;
|
||||||
const char *filename;
|
|
||||||
int lineno;
|
|
||||||
int n_generator_args; /* Number of arguments passed to generator */
|
int n_generator_args; /* Number of arguments passed to generator */
|
||||||
int n_operands; /* Number of operands this insn recognizes */
|
int n_operands; /* Number of operands this insn recognizes */
|
||||||
int n_dups; /* Number times match_dup appears in pattern */
|
int n_dups; /* Number times match_dup appears in pattern */
|
||||||
|
|
@ -166,15 +165,12 @@ struct data
|
||||||
struct operand_data operand[MAX_MAX_OPERANDS];
|
struct operand_data operand[MAX_MAX_OPERANDS];
|
||||||
};
|
};
|
||||||
|
|
||||||
/* A dummy insn, for CODE_FOR_nothing. */
|
|
||||||
static struct data nothing;
|
|
||||||
|
|
||||||
/* This variable points to the first link in the insn chain. */
|
/* This variable points to the first link in the insn chain. */
|
||||||
static struct data *idata = ¬hing;
|
static struct data *idata;
|
||||||
|
|
||||||
/* This variable points to the end of the insn chain. This is where
|
/* This variable points to the end of the insn chain. This is where
|
||||||
everything relevant from the machien description is appended to. */
|
everything relevant from the machien description is appended to. */
|
||||||
static struct data **idata_end = ¬hing.next;
|
static struct data **idata_end;
|
||||||
|
|
||||||
|
|
||||||
static void output_prologue (void);
|
static void output_prologue (void);
|
||||||
|
|
@ -196,9 +192,9 @@ static void gen_split (rtx, int);
|
||||||
struct constraint_data
|
struct constraint_data
|
||||||
{
|
{
|
||||||
struct constraint_data *next_this_letter;
|
struct constraint_data *next_this_letter;
|
||||||
int lineno;
|
file_location loc;
|
||||||
unsigned int namelen;
|
unsigned int namelen;
|
||||||
const char name[1];
|
char name[1];
|
||||||
};
|
};
|
||||||
|
|
||||||
/* All machine-independent constraint characters (except digits) that
|
/* All machine-independent constraint characters (except digits) that
|
||||||
|
|
@ -208,7 +204,7 @@ static const char indep_constraints[] = ",=+%*?!^$#&g";
|
||||||
static struct constraint_data *
|
static struct constraint_data *
|
||||||
constraints_by_letter_table[1 << CHAR_BIT];
|
constraints_by_letter_table[1 << CHAR_BIT];
|
||||||
|
|
||||||
static int mdep_constraint_len (const char *, int, int);
|
static int mdep_constraint_len (const char *, file_location, int);
|
||||||
static void note_constraint (rtx, int);
|
static void note_constraint (rtx, int);
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
|
@ -306,7 +302,7 @@ output_insn_data (void)
|
||||||
|
|
||||||
for (d = idata; d; d = d->next)
|
for (d = idata; d; d = d->next)
|
||||||
{
|
{
|
||||||
printf (" /* %s:%d */\n", d->filename, d->lineno);
|
printf (" /* %s:%d */\n", d->loc.filename, d->loc.lineno);
|
||||||
printf (" {\n");
|
printf (" {\n");
|
||||||
|
|
||||||
if (d->name)
|
if (d->name)
|
||||||
|
|
@ -449,11 +445,11 @@ scan_operands (struct data *d, rtx part, int this_address_p,
|
||||||
opno = XINT (part, 0);
|
opno = XINT (part, 0);
|
||||||
if (opno >= MAX_MAX_OPERANDS)
|
if (opno >= MAX_MAX_OPERANDS)
|
||||||
{
|
{
|
||||||
error_with_line (d->lineno, "maximum number of operands exceeded");
|
error_at (d->loc, "maximum number of operands exceeded");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (d->operand[opno].seen)
|
if (d->operand[opno].seen)
|
||||||
error_with_line (d->lineno, "repeated operand number %d\n", opno);
|
error_at (d->loc, "repeated operand number %d\n", opno);
|
||||||
|
|
||||||
d->operand[opno].seen = 1;
|
d->operand[opno].seen = 1;
|
||||||
d->operand[opno].mode = GET_MODE (part);
|
d->operand[opno].mode = GET_MODE (part);
|
||||||
|
|
@ -470,11 +466,11 @@ scan_operands (struct data *d, rtx part, int this_address_p,
|
||||||
opno = XINT (part, 0);
|
opno = XINT (part, 0);
|
||||||
if (opno >= MAX_MAX_OPERANDS)
|
if (opno >= MAX_MAX_OPERANDS)
|
||||||
{
|
{
|
||||||
error_with_line (d->lineno, "maximum number of operands exceeded");
|
error_at (d->loc, "maximum number of operands exceeded");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (d->operand[opno].seen)
|
if (d->operand[opno].seen)
|
||||||
error_with_line (d->lineno, "repeated operand number %d\n", opno);
|
error_at (d->loc, "repeated operand number %d\n", opno);
|
||||||
|
|
||||||
d->operand[opno].seen = 1;
|
d->operand[opno].seen = 1;
|
||||||
d->operand[opno].mode = GET_MODE (part);
|
d->operand[opno].mode = GET_MODE (part);
|
||||||
|
|
@ -492,11 +488,11 @@ scan_operands (struct data *d, rtx part, int this_address_p,
|
||||||
opno = XINT (part, 0);
|
opno = XINT (part, 0);
|
||||||
if (opno >= MAX_MAX_OPERANDS)
|
if (opno >= MAX_MAX_OPERANDS)
|
||||||
{
|
{
|
||||||
error_with_line (d->lineno, "maximum number of operands exceeded");
|
error_at (d->loc, "maximum number of operands exceeded");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (d->operand[opno].seen)
|
if (d->operand[opno].seen)
|
||||||
error_with_line (d->lineno, "repeated operand number %d\n", opno);
|
error_at (d->loc, "repeated operand number %d\n", opno);
|
||||||
|
|
||||||
d->operand[opno].seen = 1;
|
d->operand[opno].seen = 1;
|
||||||
d->operand[opno].mode = GET_MODE (part);
|
d->operand[opno].mode = GET_MODE (part);
|
||||||
|
|
@ -708,8 +704,7 @@ process_template (struct data *d, const char *template_code)
|
||||||
sp = ep + 1;
|
sp = ep + 1;
|
||||||
|
|
||||||
if (sp != ep)
|
if (sp != ep)
|
||||||
message_with_line (d->lineno,
|
message_at (d->loc, "trailing whitespace in output template");
|
||||||
"trailing whitespace in output template");
|
|
||||||
|
|
||||||
while (cp < sp)
|
while (cp < sp)
|
||||||
{
|
{
|
||||||
|
|
@ -732,11 +727,11 @@ process_template (struct data *d, const char *template_code)
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
if (i == 1)
|
if (i == 1)
|
||||||
message_with_line (d->lineno,
|
message_at (d->loc, "'@' is redundant for output template with"
|
||||||
"'@' is redundant for output template with single alternative");
|
" single alternative");
|
||||||
if (i != d->n_alternatives)
|
if (i != d->n_alternatives)
|
||||||
error_with_line (d->lineno,
|
error_at (d->loc, "wrong number of alternatives in the output"
|
||||||
"wrong number of alternatives in the output template");
|
" template");
|
||||||
|
|
||||||
if (found_star)
|
if (found_star)
|
||||||
puts (" default: gcc_unreachable ();\n }\n}");
|
puts (" default: gcc_unreachable ();\n }\n}");
|
||||||
|
|
@ -773,9 +768,8 @@ validate_insn_alternatives (struct data *d)
|
||||||
{
|
{
|
||||||
if ((c == '%' || c == '=' || c == '+')
|
if ((c == '%' || c == '=' || c == '+')
|
||||||
&& p != d->operand[start].constraint)
|
&& p != d->operand[start].constraint)
|
||||||
error_with_line (d->lineno,
|
error_at (d->loc, "character '%c' can only be used at the"
|
||||||
"character '%c' can only be used at the"
|
" beginning of a constraint string", c);
|
||||||
" beginning of a constraint string", c);
|
|
||||||
|
|
||||||
if (c == '=' || c == '+')
|
if (c == '=' || c == '+')
|
||||||
seen_write = true;
|
seen_write = true;
|
||||||
|
|
@ -783,10 +777,8 @@ validate_insn_alternatives (struct data *d)
|
||||||
/* Earlyclobber operands must always be marked write-only
|
/* Earlyclobber operands must always be marked write-only
|
||||||
or read/write. */
|
or read/write. */
|
||||||
if (!seen_write && c == '&')
|
if (!seen_write && c == '&')
|
||||||
error_with_line (d->lineno,
|
error_at (d->loc, "earlyclobber operands may not be"
|
||||||
"earlyclobber operands may not be"
|
" read-only in alternative %d", which_alternative);
|
||||||
" read-only in alternative %d",
|
|
||||||
which_alternative);
|
|
||||||
|
|
||||||
if (ISSPACE (c) || strchr (indep_constraints, c))
|
if (ISSPACE (c) || strchr (indep_constraints, c))
|
||||||
len = 1;
|
len = 1;
|
||||||
|
|
@ -799,7 +791,7 @@ validate_insn_alternatives (struct data *d)
|
||||||
len = q - p;
|
len = q - p;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
len = mdep_constraint_len (p, d->lineno, start);
|
len = mdep_constraint_len (p, d->loc, start);
|
||||||
|
|
||||||
if (c == ',')
|
if (c == ',')
|
||||||
{
|
{
|
||||||
|
|
@ -810,17 +802,15 @@ validate_insn_alternatives (struct data *d)
|
||||||
for (i = 1; i < len; i++)
|
for (i = 1; i < len; i++)
|
||||||
if (p[i] == '\0')
|
if (p[i] == '\0')
|
||||||
{
|
{
|
||||||
error_with_line (d->lineno,
|
error_at (d->loc, "NUL in alternative %d of operand %d",
|
||||||
"NUL in alternative %d of operand %d",
|
which_alternative, start);
|
||||||
which_alternative, start);
|
|
||||||
alternative_count_unsure = 1;
|
alternative_count_unsure = 1;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
else if (strchr (",#*", p[i]))
|
else if (strchr (",#*", p[i]))
|
||||||
{
|
{
|
||||||
error_with_line (d->lineno,
|
error_at (d->loc, "'%c' in alternative %d of operand %d",
|
||||||
"'%c' in alternative %d of operand %d",
|
p[i], which_alternative, start);
|
||||||
p[i], which_alternative, start);
|
|
||||||
alternative_count_unsure = 1;
|
alternative_count_unsure = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -829,9 +819,8 @@ validate_insn_alternatives (struct data *d)
|
||||||
if (n == 0)
|
if (n == 0)
|
||||||
n = d->operand[start].n_alternatives;
|
n = d->operand[start].n_alternatives;
|
||||||
else if (n != d->operand[start].n_alternatives)
|
else if (n != d->operand[start].n_alternatives)
|
||||||
error_with_line (d->lineno,
|
error_at (d->loc, "wrong number of alternatives in operand %d",
|
||||||
"wrong number of alternatives in operand %d",
|
start);
|
||||||
start);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -848,7 +837,7 @@ validate_insn_operands (struct data *d)
|
||||||
|
|
||||||
for (i = 0; i < d->n_operands; ++i)
|
for (i = 0; i < d->n_operands; ++i)
|
||||||
if (d->operand[i].seen == 0)
|
if (d->operand[i].seen == 0)
|
||||||
error_with_line (d->lineno, "missing operand %d", i);
|
error_at (d->loc, "missing operand %d", i);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
|
@ -862,7 +851,7 @@ validate_optab_operands (struct data *d)
|
||||||
&& d->name[strlen (d->name) - 1] == '4'
|
&& d->name[strlen (d->name) - 1] == '4'
|
||||||
&& d->operand[0].mode == VOIDmode)
|
&& d->operand[0].mode == VOIDmode)
|
||||||
{
|
{
|
||||||
message_with_line (d->lineno, "missing mode for operand 0 of cstore");
|
message_at (d->loc, "missing mode for operand 0 of cstore");
|
||||||
have_error = 1;
|
have_error = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -875,12 +864,11 @@ static void
|
||||||
gen_insn (rtx insn, int lineno)
|
gen_insn (rtx insn, int lineno)
|
||||||
{
|
{
|
||||||
struct pattern_stats stats;
|
struct pattern_stats stats;
|
||||||
struct data *d = XNEW (struct data);
|
data *d = new data;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
d->code_number = next_code_number;
|
d->code_number = next_code_number;
|
||||||
d->filename = read_md_filename;
|
d->loc = file_location (read_md_filename, lineno);
|
||||||
d->lineno = lineno;
|
|
||||||
if (XSTR (insn, 0)[0])
|
if (XSTR (insn, 0)[0])
|
||||||
d->name = XSTR (insn, 0);
|
d->name = XSTR (insn, 0);
|
||||||
else
|
else
|
||||||
|
|
@ -917,12 +905,11 @@ static void
|
||||||
gen_peephole (rtx peep, int lineno)
|
gen_peephole (rtx peep, int lineno)
|
||||||
{
|
{
|
||||||
struct pattern_stats stats;
|
struct pattern_stats stats;
|
||||||
struct data *d = XNEW (struct data);
|
data *d = new data;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
d->code_number = next_code_number;
|
d->code_number = next_code_number;
|
||||||
d->filename = read_md_filename;
|
d->loc = file_location (read_md_filename, lineno);
|
||||||
d->lineno = lineno;
|
|
||||||
d->name = 0;
|
d->name = 0;
|
||||||
|
|
||||||
/* Build up the list in the same order as the insns are seen
|
/* Build up the list in the same order as the insns are seen
|
||||||
|
|
@ -956,12 +943,11 @@ static void
|
||||||
gen_expand (rtx insn, int lineno)
|
gen_expand (rtx insn, int lineno)
|
||||||
{
|
{
|
||||||
struct pattern_stats stats;
|
struct pattern_stats stats;
|
||||||
struct data *d = XNEW (struct data);
|
data *d = new data;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
d->code_number = next_code_number;
|
d->code_number = next_code_number;
|
||||||
d->filename = read_md_filename;
|
d->loc = file_location (read_md_filename, lineno);
|
||||||
d->lineno = lineno;
|
|
||||||
if (XSTR (insn, 0)[0])
|
if (XSTR (insn, 0)[0])
|
||||||
d->name = XSTR (insn, 0);
|
d->name = XSTR (insn, 0);
|
||||||
else
|
else
|
||||||
|
|
@ -1001,12 +987,11 @@ static void
|
||||||
gen_split (rtx split, int lineno)
|
gen_split (rtx split, int lineno)
|
||||||
{
|
{
|
||||||
struct pattern_stats stats;
|
struct pattern_stats stats;
|
||||||
struct data *d = XNEW (struct data);
|
data *d = new data;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
d->code_number = next_code_number;
|
d->code_number = next_code_number;
|
||||||
d->filename = read_md_filename;
|
d->loc = file_location (read_md_filename, lineno);
|
||||||
d->lineno = lineno;
|
|
||||||
d->name = 0;
|
d->name = 0;
|
||||||
|
|
||||||
/* Build up the list in the same order as the insns are seen
|
/* Build up the list in the same order as the insns are seen
|
||||||
|
|
@ -1037,9 +1022,11 @@ gen_split (rtx split, int lineno)
|
||||||
static void
|
static void
|
||||||
init_insn_for_nothing (void)
|
init_insn_for_nothing (void)
|
||||||
{
|
{
|
||||||
memset (¬hing, 0, sizeof (nothing));
|
idata = XCNEW (struct data);
|
||||||
nothing.name = "*placeholder_for_nothing";
|
new (idata) data ();
|
||||||
nothing.filename = "<internal>";
|
idata->name = "*placeholder_for_nothing";
|
||||||
|
idata->loc = file_location ("<internal>", 0);
|
||||||
|
idata_end = &idata->next;
|
||||||
}
|
}
|
||||||
|
|
||||||
extern int main (int, char **);
|
extern int main (int, char **);
|
||||||
|
|
@ -1189,28 +1176,30 @@ note_constraint (rtx exp, int lineno)
|
||||||
if (!strcmp ((*iter)->name, name))
|
if (!strcmp ((*iter)->name, name))
|
||||||
{
|
{
|
||||||
error_with_line (lineno, "redefinition of constraint '%s'", name);
|
error_with_line (lineno, "redefinition of constraint '%s'", name);
|
||||||
message_with_line ((*iter)->lineno, "previous definition is here");
|
message_at ((*iter)->loc, "previous definition is here");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
else if (!strncmp ((*iter)->name, name, (*iter)->namelen))
|
else if (!strncmp ((*iter)->name, name, (*iter)->namelen))
|
||||||
{
|
{
|
||||||
error_with_line (lineno, "defining constraint '%s' here", name);
|
error_with_line (lineno, "defining constraint '%s' here", name);
|
||||||
message_with_line ((*iter)->lineno, "renders constraint '%s' "
|
message_at ((*iter)->loc, "renders constraint '%s' "
|
||||||
"(defined here) a prefix", (*iter)->name);
|
"(defined here) a prefix", (*iter)->name);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
else if (!strncmp ((*iter)->name, name, namelen))
|
else if (!strncmp ((*iter)->name, name, namelen))
|
||||||
{
|
{
|
||||||
error_with_line (lineno, "constraint '%s' is a prefix", name);
|
error_with_line (lineno, "constraint '%s' is a prefix", name);
|
||||||
message_with_line ((*iter)->lineno, "of constraint '%s' "
|
message_at ((*iter)->loc, "of constraint '%s' "
|
||||||
"(defined here)", (*iter)->name);
|
"(defined here)", (*iter)->name);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
new_cdata = XNEWVAR (struct constraint_data, sizeof (struct constraint_data) + namelen);
|
new_cdata = XNEWVAR (struct constraint_data,
|
||||||
|
sizeof (struct constraint_data) + namelen);
|
||||||
|
new (new_cdata) constraint_data ();
|
||||||
strcpy (CONST_CAST (char *, new_cdata->name), name);
|
strcpy (CONST_CAST (char *, new_cdata->name), name);
|
||||||
new_cdata->namelen = namelen;
|
new_cdata->namelen = namelen;
|
||||||
new_cdata->lineno = lineno;
|
new_cdata->loc = file_location (read_md_filename, lineno);
|
||||||
new_cdata->next_this_letter = *slot;
|
new_cdata->next_this_letter = *slot;
|
||||||
*slot = new_cdata;
|
*slot = new_cdata;
|
||||||
}
|
}
|
||||||
|
|
@ -1220,7 +1209,7 @@ note_constraint (rtx exp, int lineno)
|
||||||
is no such constraint. Does not expect to be called for generic
|
is no such constraint. Does not expect to be called for generic
|
||||||
constraints. */
|
constraints. */
|
||||||
static int
|
static int
|
||||||
mdep_constraint_len (const char *s, int lineno, int opno)
|
mdep_constraint_len (const char *s, file_location loc, int opno)
|
||||||
{
|
{
|
||||||
struct constraint_data *p;
|
struct constraint_data *p;
|
||||||
|
|
||||||
|
|
@ -1231,9 +1220,8 @@ mdep_constraint_len (const char *s, int lineno, int opno)
|
||||||
if (!strncmp (s, p->name, p->namelen))
|
if (!strncmp (s, p->name, p->namelen))
|
||||||
return p->namelen;
|
return p->namelen;
|
||||||
|
|
||||||
error_with_line (lineno,
|
error_at (loc, "error: undefined machine-specific constraint "
|
||||||
"error: undefined machine-specific constraint "
|
"at this point: \"%s\"", s);
|
||||||
"at this point: \"%s\"", s);
|
message_at (loc, "note: in operand %d", opno);
|
||||||
message_with_line (lineno, "note: in operand %d", opno);
|
|
||||||
return 1; /* safe */
|
return 1; /* safe */
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue