diff options
-rw-r--r-- | gcc/ChangeLog | 29 | ||||
-rw-r--r-- | gcc/gensupport.c | 32 | ||||
-rw-r--r-- | gcc/read-md.c | 74 | ||||
-rw-r--r-- | gcc/read-md.h | 29 | ||||
-rw-r--r-- | gcc/read-rtl.c | 310 | ||||
-rw-r--r-- | gcc/rtl.h | 2 |
6 files changed, 255 insertions, 221 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 24618045727..26aafe8f8ea 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,34 @@ 2010-06-10 Richard Sandiford <rdsandiford@googlemail.com> + * read-md.h (read_md_file): Declare. + (read_char, unread_char): New functions. + (fatal_with_file_and_line, fatal_expected_char, read_skip_spaces) + (read_quoted_string, read_string): Remove FILE * argument. + * read-md.c (read_md_file): New variable. + (read_md_filename, read_md_lineno): Update comments and remove + unnecessary initialization. + (fatal_with_file_and_line, fatal_expected_char, read_skip_spaces) + (read_escape, read_quoted_string, read_braced_string, read_string): + Remove FILE * argument. Update calls accordingly, using read_char + and unread_char instead of getc and ungetc. + * rtl.h (read_rtx): Remove FILE * argument. + * read-rtl.c (iterator_group): Remove FILE * argument from + "find_builtin". + (iterator_traverse_data): Remove "infile" field. + (find_mode, find_code, apply_mode_maps, apply_iterator_to_rtx) + (add_mapping, read_name, read_constants, read_conditions) + (validate_const_int, find_iterator, read_mapping, check_code_iterator) + (read_rtx, read_rtx_1, read_rtx_variadic): Remove FILE * argument. + Remove file arguments from all calls, using read_char and unread_char + instead of getc and ungetc. + * gensupport.c (process_include): Preserve read_md_file around + the include. Set read_md_file to the handle of the included file. + Update call to read_rtx. + (init_md_reader_args_cb): Set read_md_file to the handle of the file + and remove local FILE *. Update calls to read_rtx. + +2010-06-10 Richard Sandiford <rdsandiford@googlemail.com> + * read-md.h (read_rtx_lineno): Rename to... (read_md_lineno): ...this. (read_rtx_filename): Rename to... diff --git a/gcc/gensupport.c b/gcc/gensupport.c index 0905ca78cee..061376f55ea 100644 --- a/gcc/gensupport.c +++ b/gcc/gensupport.c @@ -194,7 +194,7 @@ process_include (rtx desc, int lineno) const char *old_filename; int old_lineno; char *pathname; - FILE *input_file; + FILE *input_file, *old_file; /* If specified file name is absolute, skip the include stack. */ if (! IS_ABSOLUTE_PATH (filename)) @@ -231,8 +231,10 @@ process_include (rtx desc, int lineno) /* Save old cursor; setup new for the new file. Note that "lineno" the argument to this function is the beginning of the include statement, while read_md_lineno has already been advanced. */ + old_file = read_md_file; old_filename = read_md_filename; old_lineno = read_md_lineno; + read_md_file = input_file; read_md_filename = pathname; read_md_lineno = 1; @@ -240,12 +242,13 @@ process_include (rtx desc, int lineno) include_callback (pathname); /* Read the entire file. */ - while (read_rtx (input_file, &desc, &lineno)) + while (read_rtx (&desc, &lineno)) process_rtx (desc, lineno); /* Do not free pathname. It is attached to the various rtx queue elements. */ + read_md_file = old_file; read_md_filename = old_filename; read_md_lineno = old_lineno; @@ -902,7 +905,6 @@ save_string (const char *s, int len) int init_md_reader_args_cb (int argc, char **argv, bool (*parse_opt)(const char *)) { - FILE *input_file; int c, i, lineno; char *lastsl; rtx desc; @@ -988,14 +990,14 @@ init_md_reader_args_cb (int argc, char **argv, bool (*parse_opt)(const char *)) fatal ("cannot read standard input twice"); base_dir = NULL; + read_md_file = stdin; read_md_filename = in_fname = "<stdin>"; read_md_lineno = 1; - input_file = stdin; already_read_stdin = true; - while (read_rtx (input_file, &desc, &lineno)) + while (read_rtx (&desc, &lineno)) process_rtx (desc, lineno); - fclose (input_file); + fclose (read_md_file); continue; } else if (argv[i][1] == '-' && argv[i][2] == '\0') @@ -1018,18 +1020,18 @@ init_md_reader_args_cb (int argc, char **argv, bool (*parse_opt)(const char *)) else base_dir = NULL; - read_md_filename = in_fname; - read_md_lineno = 1; - input_file = fopen (in_fname, "r"); - if (input_file == 0) + read_md_file = fopen (in_fname, "r"); + if (read_md_file == 0) { perror (in_fname); return FATAL_EXIT_CODE; } + read_md_filename = in_fname; + read_md_lineno = 1; - while (read_rtx (input_file, &desc, &lineno)) + while (read_rtx (&desc, &lineno)) process_rtx (desc, lineno); - fclose (input_file); + fclose (read_md_file); } /* If we get to this point without having seen any files to process, @@ -1037,13 +1039,13 @@ init_md_reader_args_cb (int argc, char **argv, bool (*parse_opt)(const char *)) if (!in_fname) { base_dir = NULL; + read_md_file = stdin; read_md_filename = in_fname = "<stdin>"; read_md_lineno = 1; - input_file = stdin; - while (read_rtx (input_file, &desc, &lineno)) + while (read_rtx (&desc, &lineno)) process_rtx (desc, lineno); - fclose (input_file); + fclose (read_md_file); } /* Process define_cond_exec patterns. */ diff --git a/gcc/read-md.c b/gcc/read-md.c index 105b3bcd17d..a8c0d5c251e 100644 --- a/gcc/read-md.c +++ b/gcc/read-md.c @@ -52,11 +52,14 @@ static htab_t joined_conditions; /* An obstack for allocating joined_conditions entries. */ static struct obstack joined_conditions_obstack; -/* The current line number for the file. */ -int read_md_lineno = 1; +/* The file we are reading. */ +FILE *read_md_file; -/* The filename for error reporting. */ -const char *read_md_filename = "<unknown>"; +/* The filename of READ_MD_FILE. */ +const char *read_md_filename; + +/* The current line number in READ_MD_FILE. */ +int read_md_lineno; /* Return a hash value for the pointer pointed to by DEF. */ @@ -189,10 +192,10 @@ message_with_line (int lineno, const char *msg, ...) } /* A printf-like function for reporting an error against the current - position in the MD file, which is associated with INFILE. */ + position in the MD file. */ void -fatal_with_file_and_line (FILE *infile, const char *msg, ...) +fatal_with_file_and_line (const char *msg, ...) { char context[64]; size_t i; @@ -208,7 +211,7 @@ fatal_with_file_and_line (FILE *infile, const char *msg, ...) /* Gather some following context. */ for (i = 0; i < sizeof (context)-1; ++i) { - c = getc (infile); + c = read_char (); if (c == EOF) break; if (c == '\r' || c == '\n') @@ -225,31 +228,30 @@ fatal_with_file_and_line (FILE *infile, const char *msg, ...) } /* Report that we found character ACTUAL when we expected to find - character EXPECTED. INFILE is the file handle associated - with the current file. */ + character EXPECTED. */ void -fatal_expected_char (FILE *infile, int expected, int actual) +fatal_expected_char (int expected, int actual) { if (actual == EOF) - fatal_with_file_and_line (infile, "expected character `%c', found EOF", + fatal_with_file_and_line ("expected character `%c', found EOF", expected); else - fatal_with_file_and_line (infile, "expected character `%c', found `%c'", + fatal_with_file_and_line ("expected character `%c', found `%c'", expected, actual); } -/* Read chars from INFILE until a non-whitespace char and return that. +/* Read chars from the MD file until a non-whitespace char and return that. Comments, both Lisp style and C style, are treated as whitespace. */ int -read_skip_spaces (FILE *infile) +read_skip_spaces (void) { int c; while (1) { - c = getc (infile); + c = read_char (); switch (c) { case '\n': @@ -261,7 +263,7 @@ read_skip_spaces (FILE *infile) case ';': do - c = getc (infile); + c = read_char (); while (c != '\n' && c != EOF); read_md_lineno++; break; @@ -269,12 +271,12 @@ read_skip_spaces (FILE *infile) case '/': { int prevc; - c = getc (infile); + c = read_char (); if (c != '*') - fatal_expected_char (infile, '*', c); + fatal_expected_char ('*', c); prevc = 0; - while ((c = getc (infile)) && c != EOF) + while ((c = read_char ()) && c != EOF) { if (c == '\n') read_md_lineno++; @@ -295,9 +297,9 @@ read_skip_spaces (FILE *infile) Caller has read the backslash, but not placed it into the obstack. */ static void -read_escape (FILE *infile) +read_escape (void) { - int c = getc (infile); + int c = read_char (); switch (c) { @@ -348,18 +350,18 @@ read_escape (FILE *infile) the leading quote. */ char * -read_quoted_string (FILE *infile) +read_quoted_string (void) { int c; while (1) { - c = getc (infile); /* Read the string */ + c = read_char (); /* Read the string */ if (c == '\n') read_md_lineno++; else if (c == '\\') { - read_escape (infile); + read_escape (); continue; } else if (c == '"' || c == EOF) @@ -377,7 +379,7 @@ read_quoted_string (FILE *infile) the outermost braces _are_ included in the string constant. */ static char * -read_braced_string (FILE *infile) +read_braced_string (void) { int c; int brace_depth = 1; /* caller-processed */ @@ -386,7 +388,7 @@ read_braced_string (FILE *infile) obstack_1grow (&string_obstack, '{'); while (brace_depth) { - c = getc (infile); /* Read the string */ + c = read_char (); /* Read the string */ if (c == '\n') read_md_lineno++; @@ -396,12 +398,12 @@ read_braced_string (FILE *infile) brace_depth--; else if (c == '\\') { - read_escape (infile); + read_escape (); continue; } else if (c == EOF) fatal_with_file_and_line - (infile, "missing closing } for opening brace on line %lu", + ("missing closing } for opening brace on line %lu", starting_read_md_lineno); obstack_1grow (&string_obstack, c); @@ -416,36 +418,36 @@ read_braced_string (FILE *infile) and dispatch to the appropriate string constant reader. */ char * -read_string (FILE *infile, int star_if_braced) +read_string (int star_if_braced) { char *stringbuf; int saw_paren = 0; int c, old_lineno; - c = read_skip_spaces (infile); + c = read_skip_spaces (); if (c == '(') { saw_paren = 1; - c = read_skip_spaces (infile); + c = read_skip_spaces (); } old_lineno = read_md_lineno; if (c == '"') - stringbuf = read_quoted_string (infile); + stringbuf = read_quoted_string (); else if (c == '{') { if (star_if_braced) obstack_1grow (&string_obstack, '*'); - stringbuf = read_braced_string (infile); + stringbuf = read_braced_string (); } else - fatal_with_file_and_line (infile, "expected `\"' or `{', found `%c'", c); + fatal_with_file_and_line ("expected `\"' or `{', found `%c'", c); if (saw_paren) { - c = read_skip_spaces (infile); + c = read_skip_spaces (); if (c != ')') - fatal_expected_char (infile, ')', c); + fatal_expected_char (')', c); } set_md_ptr_loc (stringbuf, read_md_filename, old_lineno); diff --git a/gcc/read-md.h b/gcc/read-md.h index dd492beb1b2..a11d9113e4c 100644 --- a/gcc/read-md.h +++ b/gcc/read-md.h @@ -21,21 +21,38 @@ along with GCC; see the file COPYING3. If not see #include "obstack.h" +extern FILE *read_md_file; extern int read_md_lineno; extern const char *read_md_filename; extern struct obstack string_obstack; +/* Read the next character from the MD file. */ + +static inline int +read_char (void) +{ + return getc (read_md_file); +} + +/* Put back CH, which was the last character read from the MD file. */ + +static inline void +unread_char (int ch) +{ + ungetc (ch, read_md_file); +} + extern void copy_md_ptr_loc (const void *, const void *); extern void print_md_ptr_loc (const void *); extern const char *join_c_conditions (const char *, const char *); extern void print_c_condition (const char *); extern void message_with_line (int, const char *, ...) ATTRIBUTE_PRINTF_2; -extern void fatal_with_file_and_line (FILE *, const char *, ...) - ATTRIBUTE_PRINTF_2 ATTRIBUTE_NORETURN; -extern void fatal_expected_char (FILE *, int, int) ATTRIBUTE_NORETURN; -extern int read_skip_spaces (FILE *); -extern char *read_quoted_string (FILE *); -extern char *read_string (FILE *, int); +extern void fatal_with_file_and_line (const char *, ...) + ATTRIBUTE_PRINTF_1 ATTRIBUTE_NORETURN; +extern void fatal_expected_char (int, int) ATTRIBUTE_NORETURN; +extern int read_skip_spaces (void); +extern char *read_quoted_string (void); +extern char *read_string (int); extern int n_comma_elts (const char *); extern const char *scan_comma_elt (const char **); extern void init_md_reader (void); diff --git a/gcc/read-rtl.c b/gcc/read-rtl.c index 50bb5f1bf3c..9d564c77511 100644 --- a/gcc/read-rtl.c +++ b/gcc/read-rtl.c @@ -70,8 +70,8 @@ struct iterator_group { int num_builtins; /* Treat the given string as the name of a standard mode or code and - return its integer value. Use the given file for error reporting. */ - int (*find_builtin) (const char *, FILE *); + return its integer value. */ + int (*find_builtin) (const char *); /* Return true if the given rtx uses the given mode or code. */ bool (*uses_iterator_p) (rtx, int); @@ -87,8 +87,6 @@ struct iterator_traverse_data { rtx queue; /* Attributes seen for modes. */ struct map_value *mode_maps; - /* Input file. */ - FILE *infile; /* The last unknown attribute used as a mode. */ const char *unknown_mode_attr; }; @@ -98,35 +96,35 @@ struct iterator_traverse_data { #define BELLWETHER_CODE(CODE) \ ((CODE) < NUM_RTX_CODE ? CODE : bellwether_codes[CODE - NUM_RTX_CODE]) -static int find_mode (const char *, FILE *); +static int find_mode (const char *); static bool uses_mode_iterator_p (rtx, int); static void apply_mode_iterator (rtx, int); -static int find_code (const char *, FILE *); +static int find_code (const char *); static bool uses_code_iterator_p (rtx, int); static void apply_code_iterator (rtx, int); static const char *apply_iterator_to_string (const char *, struct mapping *, int); static rtx apply_iterator_to_rtx (rtx, struct mapping *, int, - struct map_value *, FILE *, const char **); + struct map_value *, const char **); static bool uses_iterator_p (rtx, struct mapping *); static const char *add_condition_to_string (const char *, const char *); static void add_condition_to_rtx (rtx, const char *); static int apply_iterator_traverse (void **, void *); static struct mapping *add_mapping (struct iterator_group *, htab_t t, - const char *, FILE *); + const char *); static struct map_value **add_map_value (struct map_value **, int, const char *); static void initialize_iterators (void); -static void read_name (char *, FILE *); +static void read_name (char *); 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 read_conditions (FILE *infile, char *tmp_char); -static void validate_const_int (FILE *, const char *); -static int find_iterator (struct iterator_group *, const char *, FILE *); -static struct mapping *read_mapping (struct iterator_group *, htab_t, FILE *); -static void check_code_iterator (struct mapping *, FILE *); -static rtx read_rtx_1 (FILE *, struct map_value **); -static rtx read_rtx_variadic (FILE *, struct map_value **, rtx); +static void read_constants (char *tmp_char); +static void read_conditions (char *tmp_char); +static void validate_const_int (const char *); +static int find_iterator (struct iterator_group *, const char *); +static struct mapping *read_mapping (struct iterator_group *, htab_t); +static void check_code_iterator (struct mapping *); +static rtx read_rtx_1 (struct map_value **); +static rtx read_rtx_variadic (struct map_value **, rtx); /* The mode and code iterator structures. */ static struct iterator_group modes, codes; @@ -137,7 +135,7 @@ static enum rtx_code *bellwether_codes; /* Implementations of the iterator_group callbacks for modes. */ static int -find_mode (const char *name, FILE *infile) +find_mode (const char *name) { int i; @@ -145,7 +143,7 @@ find_mode (const char *name, FILE *infile) if (strcmp (GET_MODE_NAME (i), name) == 0) return i; - fatal_with_file_and_line (infile, "unknown mode `%s'", name); + fatal_with_file_and_line ("unknown mode `%s'", name); } static bool @@ -163,7 +161,7 @@ apply_mode_iterator (rtx x, int mode) /* Implementations of the iterator_group callbacks for codes. */ static int -find_code (const char *name, FILE *infile) +find_code (const char *name) { int i; @@ -171,7 +169,7 @@ find_code (const char *name, FILE *infile) if (strcmp (GET_RTX_NAME (i), name) == 0) return i; - fatal_with_file_and_line (infile, "unknown rtx code `%s'", name); + fatal_with_file_and_line ("unknown rtx code `%s'", name); } static bool @@ -252,13 +250,12 @@ mode_attr_index (struct map_value **mode_maps, const char *string) /* Apply MODE_MAPS to the top level of X, expanding cases where an attribute is used for a mode. ITERATOR is the current iterator 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. */ + 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 *iterator, - int value, FILE *infile, const char **unknown) + int value, const char **unknown) { unsigned int offset; int indx; @@ -277,7 +274,7 @@ apply_mode_maps (rtx x, struct map_value *mode_maps, struct mapping *iterator, v = map_attr_string (pm->string, iterator, value); if (v) - PUT_MODE (x, (enum machine_mode) find_mode (v->string, infile)); + PUT_MODE (x, (enum machine_mode) find_mode (v->string)); else *unknown = pm->string; return; @@ -327,13 +324,12 @@ apply_iterator_to_string (const char *string, struct mapping *iterator, int valu /* Return a copy of ORIGINAL in which all uses of ITERATOR have been 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. */ + strings used for modes. This sets *UNKNOWN_MODE_ATTR to the value of + an unknown mode attribute, and does not change it otherwise. */ static rtx apply_iterator_to_rtx (rtx original, struct mapping *iterator, int value, - struct map_value *mode_maps, FILE *infile, + struct map_value *mode_maps, const char **unknown_mode_attr) { struct iterator_group *group; @@ -356,7 +352,7 @@ apply_iterator_to_rtx (rtx original, struct mapping *iterator, int value, group->apply_iterator (x, value); if (mode_maps) - apply_mode_maps (x, mode_maps, iterator, value, infile, unknown_mode_attr); + apply_mode_maps (x, mode_maps, iterator, value, unknown_mode_attr); /* Change each string and recursively change each rtx. */ format_ptr = GET_RTX_FORMAT (bellwether_code); @@ -374,8 +370,7 @@ apply_iterator_to_rtx (rtx original, struct mapping *iterator, int value, case 'e': XEXP (x, i) = apply_iterator_to_rtx (XEXP (x, i), iterator, value, - mode_maps, infile, - unknown_mode_attr); + mode_maps, unknown_mode_attr); break; case 'V': @@ -386,7 +381,6 @@ apply_iterator_to_rtx (rtx original, struct mapping *iterator, int value, for (j = 0; j < XVECLEN (x, i); j++) XVECEXP (x, i, j) = apply_iterator_to_rtx (XVECEXP (original, i, j), iterator, value, mode_maps, - infile, unknown_mode_attr); } break; @@ -505,7 +499,7 @@ apply_iterator_traverse (void **slot, void *data) for (v = iterator->values; v != 0; v = v->next) { x = apply_iterator_to_rtx (original, iterator, v->number, - mtd->mode_maps, mtd->infile, + mtd->mode_maps, &mtd->unknown_mode_attr); add_condition_to_rtx (x, v->string); if (v != iterator->values) @@ -524,12 +518,10 @@ apply_iterator_traverse (void **slot, void *data) } /* Add a new "mapping" structure to hashtable TABLE. NAME is the name - of the mapping, GROUP is the group to which it belongs, and INFILE - is the file that defined the mapping. */ + of the mapping and GROUP is the group to which it belongs. */ static struct mapping * -add_mapping (struct iterator_group *group, htab_t table, - const char *name, FILE *infile) +add_mapping (struct iterator_group *group, htab_t table, const char *name) { struct mapping *m; void **slot; @@ -542,7 +534,7 @@ add_mapping (struct iterator_group *group, htab_t table, slot = htab_find_slot (table, m, INSERT); if (*slot != 0) - fatal_with_file_and_line (infile, "`%s' already defined", name); + fatal_with_file_and_line ("`%s' already defined", name); *slot = m; return m; @@ -590,8 +582,8 @@ initialize_iterators (void) codes.uses_iterator_p = uses_code_iterator_p; codes.apply_iterator = apply_code_iterator; - lower = add_mapping (&modes, modes.attrs, "mode", 0); - upper = add_mapping (&modes, modes.attrs, "MODE", 0); + lower = add_mapping (&modes, modes.attrs, "mode"); + upper = add_mapping (&modes, modes.attrs, "MODE"); lower_ptr = &lower->values; upper_ptr = &upper->values; for (i = 0; i < MAX_MACHINE_MODE; i++) @@ -604,8 +596,8 @@ initialize_iterators (void) lower_ptr = add_map_value (lower_ptr, i, copy); } - lower = add_mapping (&codes, codes.attrs, "code", 0); - upper = add_mapping (&codes, codes.attrs, "CODE", 0); + lower = add_mapping (&codes, codes.attrs, "code"); + upper = add_mapping (&codes, codes.attrs, "CODE"); lower_ptr = &lower->values; upper_ptr = &upper->values; for (i = 0; i < NUM_RTX_CODE; i++) @@ -623,12 +615,12 @@ initialize_iterators (void) It is terminated by any of the punctuation chars of rtx printed syntax. */ static void -read_name (char *str, FILE *infile) +read_name (char *str) { char *p; int c; - c = read_skip_spaces (infile); + c = read_skip_spaces (); p = str; while (1) @@ -638,14 +630,14 @@ read_name (char *str, FILE *infile) if (c == ':' || c == ')' || c == ']' || c == '"' || c == '/' || c == '(' || c == '[') { - ungetc (c, infile); + unread_char (c); break; } *p++ = c; - c = getc (infile); + c = read_char (); } if (p == str) - fatal_with_file_and_line (infile, "missing name or number"); + fatal_with_file_and_line ("missing name or number"); if (c == '\n') read_md_lineno++; @@ -731,39 +723,37 @@ def_name_eq_p (const void *def1, const void *def2) *(const char *const *) def2); } -/* INFILE is a FILE pointer to read text from. TMP_CHAR is a buffer suitable - to read a name or number into. Process a define_constants directive, - starting with the optional space after the "define_constants". */ +/* TMP_CHAR is a buffer suitable to read a name or number into. Process + a define_constants directive, starting with the optional space after + the "define_constants". */ static void -read_constants (FILE *infile, char *tmp_char) +read_constants (char *tmp_char) { int c; htab_t defs; - c = read_skip_spaces (infile); + c = read_skip_spaces (); if (c != '[') - fatal_expected_char (infile, '[', c); + fatal_expected_char ('[', c); defs = md_constants; if (! defs) defs = htab_create (32, def_hash, def_name_eq_p, (htab_del) 0); /* Disable constant expansion during definition processing. */ md_constants = 0; - while ( (c = read_skip_spaces (infile)) != ']') + while ( (c = read_skip_spaces ()) != ']') { struct md_constant *def; void **entry_ptr; if (c != '(') - fatal_expected_char (infile, '(', c); + fatal_expected_char ('(', c); def = XNEW (struct md_constant); def->name = tmp_char; - read_name (tmp_char, infile); + read_name (tmp_char); entry_ptr = htab_find_slot (defs, def, INSERT); if (! *entry_ptr) def->name = xstrdup (tmp_char); - c = read_skip_spaces (infile); - ungetc (c, infile); - read_name (tmp_char, infile); + read_name (tmp_char); if (! *entry_ptr) { def->value = xstrdup (tmp_char); @@ -773,18 +763,17 @@ read_constants (FILE *infile, char *tmp_char) { def = (struct md_constant *) *entry_ptr; if (strcmp (def->value, tmp_char)) - fatal_with_file_and_line (infile, - "redefinition of %s, was %s, now %s", + fatal_with_file_and_line ("redefinition of %s, was %s, now %s", def->name, def->value, tmp_char); } - c = read_skip_spaces (infile); + c = read_skip_spaces (); if (c != ')') - fatal_expected_char (infile, ')', c); + fatal_expected_char (')', c); } md_constants = defs; - c = read_skip_spaces (infile); + c = read_skip_spaces (); if (c != ')') - fatal_expected_char (infile, ')', c); + fatal_expected_char (')', c); } /* For every constant definition, call CALLBACK with two arguments: @@ -797,9 +786,8 @@ traverse_md_constants (htab_trav callback, void *info) htab_traverse (md_constants, callback, info); } -/* INFILE is a FILE pointer to read text from. TMP_CHAR is a buffer - suitable to read a name or number into. Process a - define_conditions directive, starting with the optional space after +/* TMP_CHAR is a buffer suitable to read a name or number into. Process + a define_conditions directive, starting with the optional space after the "define_conditions". The directive looks like this: (define_conditions [ @@ -813,44 +801,44 @@ traverse_md_constants (htab_trav callback, void *info) slipped in at the beginning of the sequence of MD files read by most of the other generators. */ static void -read_conditions (FILE *infile, char *tmp_char) +read_conditions (char *tmp_char) { int c; - c = read_skip_spaces (infile); + c = read_skip_spaces (); if (c != '[') - fatal_expected_char (infile, '[', c); + fatal_expected_char ('[', c); - while ( (c = read_skip_spaces (infile)) != ']') + while ( (c = read_skip_spaces ()) != ']') { char *expr; int value; if (c != '(') - fatal_expected_char (infile, '(', c); + fatal_expected_char ('(', c); - read_name (tmp_char, infile); - validate_const_int (infile, tmp_char); + read_name (tmp_char); + validate_const_int (tmp_char); value = atoi (tmp_char); - c = read_skip_spaces (infile); + c = read_skip_spaces (); if (c != '"') - fatal_expected_char (infile, '"', c); - expr = read_quoted_string (infile); + fatal_expected_char ('"', c); + expr = read_quoted_string (); - c = read_skip_spaces (infile); + c = read_skip_spaces (); if (c != ')') - fatal_expected_char (infile, ')', c); + fatal_expected_char (')', c); add_c_test (expr, value); } - c = read_skip_spaces (infile); + c = read_skip_spaces (); if (c != ')') - fatal_expected_char (infile, ')', c); + fatal_expected_char (')', c); } static void -validate_const_int (FILE *infile, const char *string) +validate_const_int (const char *string) { const char *cp; int valid = 1; @@ -866,35 +854,35 @@ validate_const_int (FILE *infile, const char *string) if (! ISDIGIT (*cp)) valid = 0; if (!valid) - fatal_with_file_and_line (infile, "invalid decimal constant \"%s\"\n", string); + fatal_with_file_and_line ("invalid decimal constant \"%s\"\n", string); } /* Search GROUP for a mode or code called NAME and return its numerical - identifier. INFILE is the file that contained NAME. */ + identifier. */ static int -find_iterator (struct iterator_group *group, const char *name, FILE *infile) +find_iterator (struct iterator_group *group, const char *name) { struct mapping *m; m = (struct mapping *) htab_find (group->iterators, &name); if (m != 0) return m->index + group->num_builtins; - return group->find_builtin (name, infile); + return group->find_builtin (name); } /* Finish reading a declaration of the form: (define... <name> [<value1> ... <valuen>]) - from INFILE, where each <valuei> is either a bare symbol name or a + from the MD file, where each <valuei> is either a bare symbol name or a "(<name> <string>)" pair. The "(define..." part has already been read. Represent the declaration as a "mapping" structure; add it to TABLE (which belongs to GROUP) and return it. */ static struct mapping * -read_mapping (struct iterator_group *group, htab_t table, FILE *infile) +read_mapping (struct iterator_group *group, htab_t table) { char tmp_char[256]; struct mapping *m; @@ -903,44 +891,44 @@ read_mapping (struct iterator_group *group, htab_t table, FILE *infile) int number, c; /* Read the mapping name and create a structure for it. */ - read_name (tmp_char, infile); - m = add_mapping (group, table, tmp_char, infile); + read_name (tmp_char); + m = add_mapping (group, table, tmp_char); - c = read_skip_spaces (infile); + c = read_skip_spaces (); if (c != '[') - fatal_expected_char (infile, '[', c); + fatal_expected_char ('[', c); /* Read each value. */ end_ptr = &m->values; - c = read_skip_spaces (infile); + c = read_skip_spaces (); do { if (c != '(') { /* A bare symbol name that is implicitly paired to an empty string. */ - ungetc (c, infile); - read_name (tmp_char, infile); + unread_char (c); + read_name (tmp_char); string = ""; } else { /* A "(name string)" pair. */ - read_name (tmp_char, infile); - string = read_string (infile, false); - c = read_skip_spaces (infile); + read_name (tmp_char); + string = read_string (false); + c = read_skip_spaces (); if (c != ')') - fatal_expected_char (infile, ')', c); + fatal_expected_char (')', c); } - number = group->find_builtin (tmp_char, infile); + number = group->find_builtin (tmp_char); end_ptr = add_map_value (end_ptr, number, string); - c = read_skip_spaces (infile); + c = read_skip_spaces (); } while (c != ']'); - c = read_skip_spaces (infile); + c = read_skip_spaces (); if (c != ')') - fatal_expected_char (infile, ')', c); + fatal_expected_char (')', c); return m; } @@ -949,7 +937,7 @@ read_mapping (struct iterator_group *group, htab_t table, FILE *infile) same format. Initialize the iterator's entry in bellwether_codes. */ static void -check_code_iterator (struct mapping *iterator, FILE *infile) +check_code_iterator (struct mapping *iterator) { struct map_value *v; enum rtx_code bellwether; @@ -957,7 +945,7 @@ check_code_iterator (struct mapping *iterator, FILE *infile) bellwether = (enum rtx_code) iterator->values->number; for (v = iterator->values->next; v != 0; v = v->next) if (strcmp (GET_RTX_FORMAT (bellwether), GET_RTX_FORMAT (v->number)) != 0) - fatal_with_file_and_line (infile, "code iterator `%s' combines " + fatal_with_file_and_line ("code iterator `%s' combines " "different rtx formats", iterator->name); bellwether_codes = XRESIZEVEC (enum rtx_code, bellwether_codes, @@ -965,8 +953,8 @@ check_code_iterator (struct mapping *iterator, FILE *infile) bellwether_codes[iterator->index] = bellwether; } -/* Read an rtx in printed representation from INFILE and store its - core representation in *X. Also store the line number of the +/* Read an rtx in printed representation from the MD file and store + its core representation in *X. Also store the line number of the opening '(' in *LINENO. Return true on success or false if the end of file has been reached. @@ -974,7 +962,7 @@ check_code_iterator (struct mapping *iterator, FILE *infile) the utilities gen*.c that construct C code from machine descriptions. */ bool -read_rtx (FILE *infile, rtx *x, int *lineno) +read_rtx (rtx *x, int *lineno) { static rtx queue_head, queue_next; static int queue_lineno; @@ -994,14 +982,14 @@ read_rtx (FILE *infile, rtx *x, int *lineno) struct iterator_traverse_data mtd; rtx from_file; - c = read_skip_spaces (infile); + c = read_skip_spaces (); if (c == EOF) return false; - ungetc (c, infile); + unread_char (c); queue_lineno = read_md_lineno; mode_maps = 0; - from_file = read_rtx_1 (infile, &mode_maps); + from_file = read_rtx_1 (&mode_maps); if (from_file == 0) return false; /* This confuses a top level (nil) with end of file, but a top level (nil) would have @@ -1013,13 +1001,11 @@ 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.iterators, apply_iterator_traverse, &mtd); htab_traverse (codes.iterators, apply_iterator_traverse, &mtd); if (mtd.unknown_mode_attr) - fatal_with_file_and_line (infile, - "undefined attribute '%s' used for mode", + fatal_with_file_and_line ("undefined attribute '%s' used for mode", mtd.unknown_mode_attr); } @@ -1030,11 +1016,11 @@ read_rtx (FILE *infile, rtx *x, int *lineno) return true; } -/* Subroutine of read_rtx that reads one construct from INFILE but +/* Subroutine of read_rtx that reads one construct from the MD file but doesn't apply any iterators. */ static rtx -read_rtx_1 (FILE *infile, struct map_value **mode_maps) +read_rtx_1 (struct map_value **mode_maps) { int i; RTX_CODE real_code, bellwether_code; @@ -1056,55 +1042,54 @@ read_rtx_1 (FILE *infile, struct map_value **mode_maps) }; again: - c = read_skip_spaces (infile); /* Should be open paren. */ + c = read_skip_spaces (); /* Should be open paren. */ if (c == EOF) return 0; if (c != '(') - fatal_expected_char (infile, '(', c); + fatal_expected_char ('(', c); - read_name (tmp_char, infile); + read_name (tmp_char); if (strcmp (tmp_char, "nil") == 0) { /* (nil) stands for an expression that isn't there. */ - c = read_skip_spaces (infile); + c = read_skip_spaces (); if (c != ')') - fatal_expected_char (infile, ')', c); + fatal_expected_char (')', c); return 0; } if (strcmp (tmp_char, "define_constants") == 0) { - read_constants (infile, tmp_char); + read_constants (tmp_char); goto again; } if (strcmp (tmp_char, "define_conditions") == 0) { - read_conditions (infile, tmp_char); + read_conditions (tmp_char); goto again; } if (strcmp (tmp_char, "define_mode_attr") == 0) { - read_mapping (&modes, modes.attrs, infile); + read_mapping (&modes, modes.attrs); goto again; } if (strcmp (tmp_char, "define_mode_iterator") == 0) { - read_mapping (&modes, modes.iterators, infile); + read_mapping (&modes, modes.iterators); goto again; } if (strcmp (tmp_char, "define_code_attr") == 0) { - read_mapping (&codes, codes.attrs, infile); + read_mapping (&codes, codes.attrs); goto again; } if (strcmp (tmp_char, "define_code_iterator") == 0) { - check_code_iterator (read_mapping (&codes, codes.iterators, infile), - infile); + check_code_iterator (read_mapping (&codes, codes.iterators)); goto again; } - real_code = (enum rtx_code) find_iterator (&codes, tmp_char, infile); + real_code = (enum rtx_code) find_iterator (&codes, tmp_char); bellwether_code = BELLWETHER_CODE (real_code); /* If we end up with an insn expression then we free this space below. */ @@ -1115,22 +1100,22 @@ read_rtx_1 (FILE *infile, struct map_value **mode_maps) /* If what follows is `: mode ', read it and store the mode in the rtx. */ - i = read_skip_spaces (infile); + i = read_skip_spaces (); if (i == ':') { unsigned int mode; - read_name (tmp_char, infile); + read_name (tmp_char); if (tmp_char[0] != '<' || tmp_char[strlen (tmp_char) - 1] != '>') - mode = find_iterator (&modes, tmp_char, infile); + mode = find_iterator (&modes, tmp_char); else mode = mode_attr_index (mode_maps, tmp_char); PUT_MODE (return_rtx, (enum machine_mode) mode); if (GET_MODE (return_rtx) != mode) - fatal_with_file_and_line (infile, "mode too large"); + fatal_with_file_and_line ("mode too large"); } else - ungetc (i, infile); + unread_char (i); for (i = 0; format_ptr[i] != 0; i++) switch (format_ptr[i]) @@ -1142,14 +1127,14 @@ read_rtx_1 (FILE *infile, struct map_value **mode_maps) case 'e': case 'u': - XEXP (return_rtx, i) = read_rtx_1 (infile, mode_maps); + XEXP (return_rtx, i) = read_rtx_1 (mode_maps); break; case 'V': /* 'V' is an optional vector: if a closeparen follows, just store NULL for this element. */ - c = read_skip_spaces (infile); - ungetc (c, infile); + c = read_skip_spaces (); + unread_char (c); if (c == ')') { XVEC (return_rtx, i) = 0; @@ -1164,19 +1149,19 @@ read_rtx_1 (FILE *infile, struct map_value **mode_maps) int list_counter = 0; rtvec return_vec = NULL_RTVEC; - c = read_skip_spaces (infile); + c = read_skip_spaces (); if (c != '[') - fatal_expected_char (infile, '[', c); + fatal_expected_char ('[', c); /* Add expressions to a list, while keeping a count. */ obstack_init (&vector_stack); - while ((c = read_skip_spaces (infile)) && c != ']') + while ((c = read_skip_spaces ()) && c != ']') { if (c == EOF) - fatal_expected_char (infile, ']', c); - ungetc (c, infile); + fatal_expected_char (']', c); + unread_char (c); list_counter++; - obstack_ptr_grow (&vector_stack, read_rtx_1 (infile, mode_maps)); + obstack_ptr_grow (&vector_stack, read_rtx_1 (mode_maps)); } if (list_counter > 0) { @@ -1185,8 +1170,7 @@ read_rtx_1 (FILE *infile, struct map_value **mode_maps) list_counter * sizeof (rtx)); } else if (format_ptr[i] == 'E') - fatal_with_file_and_line (infile, - "vector must have at least one element"); + fatal_with_file_and_line ("vector must have at least one element"); XVEC (return_rtx, i) = return_vec; obstack_free (&vector_stack, NULL); /* close bracket gotten */ @@ -1200,8 +1184,8 @@ read_rtx_1 (FILE *infile, struct map_value **mode_maps) char *stringbuf; int star_if_braced; - c = read_skip_spaces (infile); - ungetc (c, infile); + c = read_skip_spaces (); + unread_char (c); if (c == ')') { /* 'S' fields are optional and should be NULL if no string @@ -1217,7 +1201,7 @@ read_rtx_1 (FILE *infile, struct map_value **mode_maps) written with a brace block instead of a string constant. */ star_if_braced = (format_ptr[i] == 'T'); - stringbuf = read_string (infile, star_if_braced); + stringbuf = read_string (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 @@ -1249,8 +1233,8 @@ read_rtx_1 (FILE *infile, struct map_value **mode_maps) break; case 'w': - read_name (tmp_char, infile); - validate_const_int (infile, tmp_char); + read_name (tmp_char); + validate_const_int (tmp_char); #if HOST_BITS_PER_WIDE_INT == HOST_BITS_PER_INT tmp_wide = atoi (tmp_char); #else @@ -1271,8 +1255,8 @@ read_rtx_1 (FILE *infile, struct map_value **mode_maps) case 'i': case 'n': - read_name (tmp_char, infile); - validate_const_int (infile, tmp_char); + read_name (tmp_char); + validate_const_int (tmp_char); tmp_int = atoi (tmp_char); XINT (return_rtx, i) = tmp_int; break; @@ -1281,16 +1265,16 @@ read_rtx_1 (FILE *infile, struct map_value **mode_maps) gcc_unreachable (); } - c = read_skip_spaces (infile); + c = read_skip_spaces (); if (c != ')') { /* Syntactic sugar for AND and IOR, allowing Lisp-like arbitrary number of arguments for them. */ if (c == '(' && (GET_CODE (return_rtx) == AND || GET_CODE (return_rtx) == IOR)) - return read_rtx_variadic (infile, mode_maps, return_rtx); + return read_rtx_variadic (mode_maps, return_rtx); else - fatal_expected_char (infile, ')', c); + fatal_expected_char (')', c); } return return_rtx; @@ -1303,29 +1287,29 @@ read_rtx_1 (FILE *infile, struct map_value **mode_maps) is just past the leading parenthesis of x3. Only works for THINGs which are dyadic expressions, e.g. AND, IOR. */ static rtx -read_rtx_variadic (FILE *infile, struct map_value **mode_maps, rtx form) +read_rtx_variadic (struct map_value **mode_maps, rtx form) { char c = '('; rtx p = form, q; do { - ungetc (c, infile); + unread_char (c); q = rtx_alloc (GET_CODE (p)); PUT_MODE (q, GET_MODE (p)); XEXP (q, 0) = XEXP (p, 1); - XEXP (q, 1) = read_rtx_1 (infile, mode_maps); + XEXP (q, 1) = read_rtx_1 (mode_maps); XEXP (p, 1) = q; p = q; - c = read_skip_spaces (infile); + c = read_skip_spaces (); } while (c == '('); if (c != ')') - fatal_expected_char (infile, ')', c); + fatal_expected_char (')', c); return form; } diff --git a/gcc/rtl.h b/gcc/rtl.h index be167e5e4b5..1ed8f73ebcf 100644 --- a/gcc/rtl.h +++ b/gcc/rtl.h @@ -2361,7 +2361,7 @@ extern void traverse_md_constants (int (*) (void **, void *), void *); struct md_constant { char *name, *value; }; /* In read-rtl.c */ -extern bool read_rtx (FILE *, rtx *, int *); +extern bool read_rtx (rtx *, int *); /* In alias.c */ extern rtx canon_rtx (rtx); |