read-rtl.c (struct macro_traverse_data): Add unknown_mode_attr field.

* read-rtl.c (struct macro_traverse_data): Add unknown_mode_attr
	field.
	(mode_attr_index): Remove check for defined attribute.  Remove
	infile parameter.  Change all callers.
	(apply_mode_maps): Add unknown parameter.  Change caller.  Always
	return after finding attribute.
	(apply_macro_to_rtx): Add unknown_mode_attr parameter.  Change
	callers.
	(apply_macro_traverse): Set mtd->unknown_mode_attr.
	(read_rtx): Use mtd.unknown_mode_attr to check for an undefined
	attribute used for a mode.

From-SVN: r99829
This commit is contained in:
Ian Lance Taylor 2005-05-17 12:50:32 +00:00 committed by Ian Lance Taylor
parent 6c2a63a3ed
commit fcf48de7bd
2 changed files with 56 additions and 30 deletions

View File

@ -1,3 +1,17 @@
2005-05-17 Ian Lance Taylor <ian@airs.com>
* read-rtl.c (struct macro_traverse_data): Add unknown_mode_attr
field.
(mode_attr_index): Remove check for defined attribute. Remove
infile parameter. Change all callers.
(apply_mode_maps): Add unknown parameter. Change caller. Always
return after finding attribute.
(apply_macro_to_rtx): Add unknown_mode_attr parameter. Change
callers.
(apply_macro_traverse): Set mtd->unknown_mode_attr.
(read_rtx): Use mtd.unknown_mode_attr to check for an undefined
attribute used for a mode.
2005-05-17 Paolo Bonzini <bonzini@gnu.org>
* tree-ssa-math-opts.c: New file.

View File

@ -96,6 +96,8 @@ struct macro_traverse_data {
struct map_value *mode_maps;
/* Input file. */
FILE *infile;
/* The last unknown attribute used as a mode. */
const char *unknown_mode_attr;
};
/* If CODE is the number of a code macro, return a real rtx code that
@ -114,7 +116,7 @@ static bool uses_code_macro_p (rtx, int);
static void apply_code_macro (rtx, int);
static const char *apply_macro_to_string (const char *, struct mapping *, int);
static rtx apply_macro_to_rtx (rtx, struct mapping *, int,
struct map_value *, FILE *);
struct map_value *, FILE *, const char **);
static bool uses_macro_p (rtx, struct mapping *);
static const char *add_condition_to_string (const char *, const char *);
static void add_condition_to_rtx (rtx, const char *);
@ -311,11 +313,9 @@ map_attr_string (const char *p, struct mapping *macro, int value)
apply_macro_to_rtx. */
static unsigned int
mode_attr_index (struct map_value **mode_maps, const char *string,
FILE *infile)
mode_attr_index (struct map_value **mode_maps, const char *string)
{
char *p;
char *attr;
struct map_value *mv;
/* Copy the attribute string into permanent storage, without the
@ -323,19 +323,6 @@ mode_attr_index (struct map_value **mode_maps, const char *string,
obstack_grow (&string_obstack, string + 1, strlen (string) - 2);
p = (char *) obstack_finish (&string_obstack);
/* Make sure the attribute is defined as either a code attribute or
a mode attribute. */
attr = strchr (p, ':');
if (attr == 0)
attr = p;
else
++attr;
if (!htab_find (modes.attrs, &attr) && !htab_find (codes.attrs, &attr))
fatal_with_file_and_line (infile,
"undefined attribute '%s' used for mode",
p);
mv = XNEW (struct map_value);
mv->number = *mode_maps == 0 ? 0 : (*mode_maps)->number + 1;
mv->string = p;
@ -348,11 +335,16 @@ mode_attr_index (struct map_value **mode_maps, const char *string,
return MAX_MACHINE_MODE + htab_elements (modes.macros) + mv->number;
}
/* Apply MODE_MAPS to the top level of X. */
/* Apply MODE_MAPS to the top level of X, expanding cases where an
attribute is used for a mode. MACRO is the current macro we are
expanding, and VALUE is the value to which we are expanding it.
INFILE is used for error messages. This sets *UNKNOWN to true if
we find a mode attribute which has not yet been defined, and does
not change it otherwise. */
static void
apply_mode_maps (rtx x, struct map_value *mode_maps, struct mapping *macro,
int value, FILE *infile)
int value, FILE *infile, const char **unknown)
{
unsigned int offset;
int indx;
@ -371,10 +363,10 @@ apply_mode_maps (rtx x, struct map_value *mode_maps, struct mapping *macro,
v = map_attr_string (pm->string, macro, value);
if (v)
{
PUT_MODE (x, find_mode (v->string, infile));
return;
}
PUT_MODE (x, find_mode (v->string, infile));
else
*unknown = pm->string;
return;
}
}
}
@ -420,11 +412,15 @@ apply_macro_to_string (const char *string, struct mapping *macro, int value)
}
/* Return a copy of ORIGINAL in which all uses of MACRO have been
replaced by VALUE. */
replaced by VALUE. MODE_MAPS holds information about attribute
strings used for modes. INFILE is used for error messages. This
sets *UNKNOWN_MODE_ATTR to the value of an unknown mode attribute,
and does not change it otherwise. */
static rtx
apply_macro_to_rtx (rtx original, struct mapping *macro, int value,
struct map_value *mode_maps, FILE *infile)
struct map_value *mode_maps, FILE *infile,
const char **unknown_mode_attr)
{
struct macro_group *group;
const char *format_ptr;
@ -446,7 +442,7 @@ apply_macro_to_rtx (rtx original, struct mapping *macro, int value,
group->apply_macro (x, value);
if (mode_maps)
apply_mode_maps (x, mode_maps, macro, value, infile);
apply_mode_maps (x, mode_maps, macro, value, infile, unknown_mode_attr);
/* Change each string and recursively change each rtx. */
format_ptr = GET_RTX_FORMAT (bellwether_code);
@ -464,7 +460,8 @@ apply_macro_to_rtx (rtx original, struct mapping *macro, int value,
case 'e':
XEXP (x, i) = apply_macro_to_rtx (XEXP (x, i), macro, value,
mode_maps, infile);
mode_maps, infile,
unknown_mode_attr);
break;
case 'V':
@ -475,7 +472,8 @@ apply_macro_to_rtx (rtx original, struct mapping *macro, int value,
for (j = 0; j < XVECLEN (x, i); j++)
XVECEXP (x, i, j) = apply_macro_to_rtx (XVECEXP (original, i, j),
macro, value, mode_maps,
infile);
infile,
unknown_mode_attr);
}
break;
@ -581,11 +579,20 @@ apply_macro_traverse (void **slot, void *data)
for (elem = mtd->queue; elem != 0; elem = XEXP (elem, 1))
if (uses_macro_p (XEXP (elem, 0), macro))
{
/* For each macro we expand, we set UNKNOWN_MODE_ATTR to NULL.
If apply_macro_rtx finds an unknown attribute for a mode,
it will set it to the attribute. We want to know whether
the attribute is unknown after we have expanded all
possible macros, so setting it to NULL here gives us the
right result when the hash table traversal is complete. */
mtd->unknown_mode_attr = NULL;
original = XEXP (elem, 0);
for (v = macro->values; v != 0; v = v->next)
{
x = apply_macro_to_rtx (original, macro, v->number,
mtd->mode_maps, mtd->infile);
mtd->mode_maps, mtd->infile,
&mtd->unknown_mode_attr);
add_condition_to_rtx (x, v->string);
if (v != macro->values)
{
@ -1362,8 +1369,13 @@ read_rtx (FILE *infile, rtx *x, int *lineno)
mtd.queue = queue_next;
mtd.mode_maps = mode_maps;
mtd.infile = infile;
mtd.unknown_mode_attr = mode_maps ? mode_maps->string : NULL;
htab_traverse (modes.macros, apply_macro_traverse, &mtd);
htab_traverse (codes.macros, apply_macro_traverse, &mtd);
if (mtd.unknown_mode_attr)
fatal_with_file_and_line (infile,
"undefined attribute '%s' used for mode",
mtd.unknown_mode_attr);
}
*x = XEXP (queue_next, 0);
@ -1457,7 +1469,7 @@ read_rtx_1 (FILE *infile, struct map_value **mode_maps)
if (tmp_char[0] != '<' || tmp_char[strlen (tmp_char) - 1] != '>')
mode = find_macro (&modes, tmp_char, infile);
else
mode = mode_attr_index (mode_maps, tmp_char, infile);
mode = mode_attr_index (mode_maps, tmp_char);
PUT_MODE (return_rtx, mode);
if (GET_MODE (return_rtx) != mode)
fatal_with_file_and_line (infile, "mode too large");