read-rtl.c (string_obstack): New file-scope variable.

* read-rtl.c (string_obstack): New file-scope variable.
	(read_string, read_quoted_string, read_braced_string)
	(read_escape): Remove obstack parameter and use string_obstack instead.
	(read_rtx): Remove function-local rtl_obstack and initialize
	string_obstack instead.  Update call to read_string.

From-SVN: r86402
This commit is contained in:
Richard Sandiford 2004-08-23 05:51:25 +00:00 committed by Richard Sandiford
parent 9fc3b39aa9
commit a269d6c8b7
2 changed files with 47 additions and 37 deletions

View File

@ -1,3 +1,11 @@
2004-08-23 Richard Sandiford <rsandifo@redhat.com>
* read-rtl.c (string_obstack): New file-scope variable.
(read_string, read_quoted_string, read_braced_string)
(read_escape): Remove obstack parameter and use string_obstack instead.
(read_rtx): Remove function-local rtl_obstack and initialize
string_obstack instead. Update call to read_string.
2004-08-22 Andrew Pinski <apinski@apple.com>
PR c/15262

View File

@ -34,15 +34,18 @@ static void fatal_with_file_and_line (FILE *, const char *, ...)
ATTRIBUTE_PRINTF_2 ATTRIBUTE_NORETURN;
static void fatal_expected_char (FILE *, int, int) ATTRIBUTE_NORETURN;
static void read_name (char *, FILE *);
static char *read_string (struct obstack *, FILE *, int);
static char *read_quoted_string (struct obstack *, FILE *);
static char *read_braced_string (struct obstack *, FILE *);
static void read_escape (struct obstack *, FILE *);
static char *read_string (FILE *, int);
static char *read_quoted_string (FILE *);
static char *read_braced_string (FILE *);
static void read_escape (FILE *);
static hashval_t def_hash (const void *);
static int def_name_eq_p (const void *, const void *);
static void read_constants (FILE *infile, char *tmp_char);
static void validate_const_int (FILE *, const char *);
/* Obstack used for allocating RTL strings. */
static struct obstack string_obstack;
/* Subroutines of read_rtx. */
/* The current line number for the file. */
@ -203,7 +206,7 @@ read_name (char *str, FILE *infile)
/* Subroutine of the string readers. Handles backslash escapes.
Caller has read the backslash, but not placed it into the obstack. */
static void
read_escape (struct obstack *ob, FILE *infile)
read_escape (FILE *infile)
{
int c = getc (infile);
@ -232,31 +235,31 @@ read_escape (struct obstack *ob, FILE *infile)
case 'a': case 'b': case 'f': case 'n': case 'r': case 't': case 'v':
case '0': case '1': case '2': case '3': case '4': case '5': case '6':
case '7': case 'x':
obstack_1grow (ob, '\\');
obstack_1grow (&string_obstack, '\\');
break;
/* \; makes stuff for a C string constant containing
newline and tab. */
case ';':
obstack_grow (ob, "\\n\\t", 4);
obstack_grow (&string_obstack, "\\n\\t", 4);
return;
/* pass anything else through, but issue a warning. */
default:
fprintf (stderr, "%s:%d: warning: unrecognized escape \\%c\n",
read_rtx_filename, read_rtx_lineno, c);
obstack_1grow (ob, '\\');
obstack_1grow (&string_obstack, '\\');
break;
}
obstack_1grow (ob, c);
obstack_1grow (&string_obstack, c);
}
/* Read a double-quoted string onto the obstack. Caller has scanned
the leading quote. */
static char *
read_quoted_string (struct obstack *ob, FILE *infile)
read_quoted_string (FILE *infile)
{
int c;
@ -267,30 +270,30 @@ read_quoted_string (struct obstack *ob, FILE *infile)
read_rtx_lineno++;
else if (c == '\\')
{
read_escape (ob, infile);
read_escape (infile);
continue;
}
else if (c == '"')
break;
obstack_1grow (ob, c);
obstack_1grow (&string_obstack, c);
}
obstack_1grow (ob, 0);
return (char *) obstack_finish (ob);
obstack_1grow (&string_obstack, 0);
return (char *) obstack_finish (&string_obstack);
}
/* Read a braced string (a la Tcl) onto the obstack. Caller has
scanned the leading brace. Note that unlike quoted strings,
/* Read a braced string (a la Tcl) onto the string obstack. Caller
has scanned the leading brace. Note that unlike quoted strings,
the outermost braces _are_ included in the string constant. */
static char *
read_braced_string (struct obstack *ob, FILE *infile)
read_braced_string (FILE *infile)
{
int c;
int brace_depth = 1; /* caller-processed */
unsigned long starting_read_rtx_lineno = read_rtx_lineno;
obstack_1grow (ob, '{');
obstack_1grow (&string_obstack, '{');
while (brace_depth)
{
c = getc (infile); /* Read the string */
@ -303,7 +306,7 @@ read_braced_string (struct obstack *ob, FILE *infile)
brace_depth--;
else if (c == '\\')
{
read_escape (ob, infile);
read_escape (infile);
continue;
}
else if (c == EOF)
@ -311,11 +314,11 @@ read_braced_string (struct obstack *ob, FILE *infile)
(infile, "missing closing } for opening brace on line %lu",
starting_read_rtx_lineno);
obstack_1grow (ob, c);
obstack_1grow (&string_obstack, c);
}
obstack_1grow (ob, 0);
return (char *) obstack_finish (ob);
obstack_1grow (&string_obstack, 0);
return (char *) obstack_finish (&string_obstack);
}
/* Read some kind of string constant. This is the high-level routine
@ -323,7 +326,7 @@ read_braced_string (struct obstack *ob, FILE *infile)
and dispatch to the appropriate string constant reader. */
static char *
read_string (struct obstack *ob, FILE *infile, int star_if_braced)
read_string (FILE *infile, int star_if_braced)
{
char *stringbuf;
int saw_paren = 0;
@ -337,12 +340,12 @@ read_string (struct obstack *ob, FILE *infile, int star_if_braced)
}
if (c == '"')
stringbuf = read_quoted_string (ob, infile);
stringbuf = read_quoted_string (infile);
else if (c == '{')
{
if (star_if_braced)
obstack_1grow (ob, '*');
stringbuf = read_braced_string (ob, infile);
obstack_1grow (&string_obstack, '*');
stringbuf = read_braced_string (infile);
}
else
fatal_with_file_and_line (infile, "expected `\"' or `{', found `%c'", c);
@ -521,8 +524,6 @@ read_rtx (FILE *infile)
int tmp_int;
HOST_WIDE_INT tmp_wide;
/* Obstack used for allocating RTL objects. */
static struct obstack rtl_obstack;
static int initialized;
/* Linked list structure for making RTXs: */
@ -532,10 +533,11 @@ read_rtx (FILE *infile)
rtx value; /* Value of this node. */
};
if (!initialized) {
obstack_init (&rtl_obstack);
initialized = 1;
}
if (!initialized)
{
obstack_init (&string_obstack);
initialized = 1;
}
again:
c = read_skip_spaces (infile); /* Should be open paren. */
@ -676,7 +678,7 @@ again:
written with a brace block instead of a string constant. */
star_if_braced = (format_ptr[-1] == 'T');
stringbuf = read_string (&rtl_obstack, infile, star_if_braced);
stringbuf = read_string (infile, star_if_braced);
/* For insn patterns, we want to provide a default name
based on the file and line, like "*foo.md:12", if the
@ -693,11 +695,11 @@ again:
for (slash = fn; *slash; slash ++)
if (*slash == '/' || *slash == '\\' || *slash == ':')
fn = slash + 1;
obstack_1grow (&rtl_obstack, '*');
obstack_grow (&rtl_obstack, fn, strlen (fn));
obstack_1grow (&string_obstack, '*');
obstack_grow (&string_obstack, fn, strlen (fn));
sprintf (line_name, ":%d", read_rtx_lineno);
obstack_grow (&rtl_obstack, line_name, strlen (line_name)+1);
stringbuf = (char *) obstack_finish (&rtl_obstack);
obstack_grow (&string_obstack, line_name, strlen (line_name)+1);
stringbuf = (char *) obstack_finish (&string_obstack);
}
if (star_if_braced)