From 0922b1b8057a504feec8f1326bb563ad7decf754 Mon Sep 17 00:00:00 2001 From: rth Date: Thu, 14 Oct 1999 03:43:49 +0000 Subject: [PATCH] * rtl.c (dump_and_abort): Remove. (fatal_with_file_and_line): New. (fatal_expected_char): New. (read_rtx_lineno, read_rtx_filename): New. (read_skip_spaces): Track line number. (read_name): Use fatal_with_file_and_line. (read_rtx): Use fatal_expected_char. Track line number. * rtl.h (read_rtx_filename, read_rtx_lineno): Declare. * print-rtl.c (print_rtx): Don't special case LABEL_REF argument if it isn't a CODE_LABEL. * genattr.c (main): Set read_rtx_filename. * genattrtab.c (main): Likewise. * gencodes.c (main): Likewise. * genconfig.c (main): Likewise. * genemit.c (main): Likewise. * genextract.c (main): Likewise. * genflags.c (main): Likewise. * genopinit.c (main): Likewise. * genoutput.c (main): Likewise. * genpeep.c (main): Likewise. * genrecog.c (decision_test.u.insn): Add `lineno'. (pattern_lineno, error_count): New variables. (message_with_line): New. (add_to_sequence): Break out checking code to ... (validate_pattern): ... here. Detect SET_DEST matching CONST_INT. (merge_insn): Use message_with_line. (make_insn_sequence): Use validate_pattern. Record insn lineno. (main): Set read_rtx_filename, pattern_lineno. Exit early on error. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@29957 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 34 +++++++++ gcc/genattr.c | 1 + gcc/genattrtab.c | 1 + gcc/gencodes.c | 1 + gcc/genconfig.c | 1 + gcc/genemit.c | 1 + gcc/genextract.c | 1 + gcc/genflags.c | 1 + gcc/genopinit.c | 1 + gcc/genoutput.c | 1 + gcc/genpeep.c | 1 + gcc/genrecog.c | 224 +++++++++++++++++++++++++++++++++++++++++++++---------- gcc/print-rtl.c | 4 + gcc/rtl.c | 154 +++++++++++++++++++++++++------------- gcc/rtl.h | 17 ++--- 15 files changed, 343 insertions(+), 100 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 1bdfbce58fe..96088ddcf02 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,37 @@ +Wed Oct 13 20:35:16 1999 Richard Henderson + + * rtl.c (dump_and_abort): Remove. + (fatal_with_file_and_line): New. + (fatal_expected_char): New. + (read_rtx_lineno, read_rtx_filename): New. + (read_skip_spaces): Track line number. + (read_name): Use fatal_with_file_and_line. + (read_rtx): Use fatal_expected_char. Track line number. + * rtl.h (read_rtx_filename, read_rtx_lineno): Declare. + + * print-rtl.c (print_rtx): Don't special case LABEL_REF argument + if it isn't a CODE_LABEL. + + * genattr.c (main): Set read_rtx_filename. + * genattrtab.c (main): Likewise. + * gencodes.c (main): Likewise. + * genconfig.c (main): Likewise. + * genemit.c (main): Likewise. + * genextract.c (main): Likewise. + * genflags.c (main): Likewise. + * genopinit.c (main): Likewise. + * genoutput.c (main): Likewise. + * genpeep.c (main): Likewise. + + * genrecog.c (decision_test.u.insn): Add `lineno'. + (pattern_lineno, error_count): New variables. + (message_with_line): New. + (add_to_sequence): Break out checking code to ... + (validate_pattern): ... here. Detect SET_DEST matching CONST_INT. + (merge_insn): Use message_with_line. + (make_insn_sequence): Use validate_pattern. Record insn lineno. + (main): Set read_rtx_filename, pattern_lineno. Exit early on error. + Wed Oct 13 22:01:35 1999 J"orn Rennecke * expr.c (store_constructor): Clear union if constructor is empty. diff --git a/gcc/genattr.c b/gcc/genattr.c index 4316c3540ba..c5611ffa285 100644 --- a/gcc/genattr.c +++ b/gcc/genattr.c @@ -251,6 +251,7 @@ main (argc, argv) perror (argv[1]); return (FATAL_EXIT_CODE); } + read_rtx_filename = argv[1]; printf ("/* Generated automatically by the program `genattr'\n\ from the machine description file `md'. */\n\n"); diff --git a/gcc/genattrtab.c b/gcc/genattrtab.c index 815f3f141d7..3494ad202ba 100644 --- a/gcc/genattrtab.c +++ b/gcc/genattrtab.c @@ -6000,6 +6000,7 @@ main (argc, argv) perror (argv[1]); return (FATAL_EXIT_CODE); } + read_rtx_filename = argv[1]; /* Set up true and false rtx's */ true_rtx = rtx_alloc (CONST_INT); diff --git a/gcc/gencodes.c b/gcc/gencodes.c index 7abe8833ecc..2dccfe56ebc 100644 --- a/gcc/gencodes.c +++ b/gcc/gencodes.c @@ -98,6 +98,7 @@ main (argc, argv) perror (argv[1]); return (FATAL_EXIT_CODE); } + read_rtx_filename = argv[1]; printf ("/* Generated automatically by the program `gencodes'\n\ from the machine description file `md'. */\n\n"); diff --git a/gcc/genconfig.c b/gcc/genconfig.c index bd31d7393c3..574e28623d0 100644 --- a/gcc/genconfig.c +++ b/gcc/genconfig.c @@ -297,6 +297,7 @@ main (argc, argv) perror (argv[1]); return (FATAL_EXIT_CODE); } + read_rtx_filename = argv[1]; printf ("/* Generated automatically by the program `genconfig'\n\ from the machine description file `md'. */\n\n"); diff --git a/gcc/genemit.c b/gcc/genemit.c index 3608e52a57c..0bec2093fa7 100644 --- a/gcc/genemit.c +++ b/gcc/genemit.c @@ -787,6 +787,7 @@ main (argc, argv) perror (argv[1]); return (FATAL_EXIT_CODE); } + read_rtx_filename = argv[1]; /* Assign sequential codes to all entries in the machine description in parallel with the tables in insn-output.c. */ diff --git a/gcc/genextract.c b/gcc/genextract.c index 7ce5cbfbafd..a2ac8721c39 100644 --- a/gcc/genextract.c +++ b/gcc/genextract.c @@ -400,6 +400,7 @@ main (argc, argv) perror (argv[1]); return (FATAL_EXIT_CODE); } + read_rtx_filename = argv[1]; /* Assign sequential codes to all entries in the machine description in parallel with the tables in insn-output.c. */ diff --git a/gcc/genflags.c b/gcc/genflags.c index 916519ed254..45cf4febbc5 100644 --- a/gcc/genflags.c +++ b/gcc/genflags.c @@ -224,6 +224,7 @@ main (argc, argv) perror (argv[1]); return (FATAL_EXIT_CODE); } + read_rtx_filename = argv[1]; printf ("/* Generated automatically by the program `genflags'\n\ from the machine description file `md'. */\n\n"); diff --git a/gcc/genopinit.c b/gcc/genopinit.c index 81366f02c38..4f950e5daa8 100644 --- a/gcc/genopinit.c +++ b/gcc/genopinit.c @@ -327,6 +327,7 @@ main (argc, argv) perror (argv[1]); return (FATAL_EXIT_CODE); } + read_rtx_filename = argv[1]; printf ("/* Generated automatically by the program `genopinit'\n\ from the machine description file `md'. */\n\n"); diff --git a/gcc/genoutput.c b/gcc/genoutput.c index 89302d43236..4cb9c00b649 100644 --- a/gcc/genoutput.c +++ b/gcc/genoutput.c @@ -907,6 +907,7 @@ main (argc, argv) perror (argv[1]); return (FATAL_EXIT_CODE); } + read_rtx_filename = argv[1]; output_prologue (); next_code_number = 0; diff --git a/gcc/genpeep.c b/gcc/genpeep.c index 5d6a4925e3a..992381dfb8b 100644 --- a/gcc/genpeep.c +++ b/gcc/genpeep.c @@ -424,6 +424,7 @@ main (argc, argv) perror (argv[1]); return (FATAL_EXIT_CODE); } + read_rtx_filename = argv[1]; printf ("/* Generated automatically by the program `genpeep'\n\ from the machine description file `md'. */\n\n"); diff --git a/gcc/genrecog.c b/gcc/genrecog.c index 0114bc17533..0be55586df3 100644 --- a/gcc/genrecog.c +++ b/gcc/genrecog.c @@ -115,6 +115,7 @@ struct decision_test struct { int code_number; /* Insn number matched. */ + int lineno; /* Line number of the insn. */ int num_clobbers_to_add; /* Number of CLOBBERs to be added. */ } insn; } u; @@ -170,6 +171,12 @@ static int next_index; allocate in each subroutine we make. */ static int max_depth; + +/* The line number of the start of the pattern currently being processed. */ +static int pattern_lineno; + +/* Count of errors. */ +static int error_count; /* This table contains a list of the rtl codes that can possibly match a predicate defined in recog.c. The function `maybe_both_true' uses it to @@ -213,6 +220,8 @@ static struct decision *new_decision PROTO((const char *, struct decision_head *)); static struct decision_test *new_decision_test PROTO((enum decision_type, struct decision_test ***)); +static void validate_pattern + PROTO((rtx, int)); static struct decision *add_to_sequence PROTO((rtx, struct decision_head *, const char *, enum routine_type, int)); @@ -284,6 +293,29 @@ static void debug_decision_2 extern void debug_decision PROTO((struct decision *)); +static void +message_with_line VPROTO ((int lineno, const char *msg, ...)) +{ +#ifndef ANSI_PROTOTYPES + int lineno; + const char *msg; +#endif + va_list ap; + + VA_START (ap, msg); + +#ifndef ANSI_PROTOTYPES + lineno = va_arg (ap, int); + msg = va_arg (ap, const char *); +#endif + + fprintf (stderr, "%s:%d: ", read_rtx_filename, lineno); + vfprintf (stderr, msg, ap); + fputc ('\n', stderr); + + va_end (ap); +} + /* Create a new node in sequence after LAST. */ static struct decision * @@ -324,6 +356,142 @@ new_decision_test (type, pplace) return test; } +/* Check for various errors in patterns. */ + +static void +validate_pattern (pattern, set_dest) + rtx pattern; + int set_dest; +{ + const char *fmt; + RTX_CODE code; + int i, j, len; + + code = GET_CODE (pattern); + switch (code) + { + case MATCH_SCRATCH: + case MATCH_INSN: + return; + + case MATCH_OPERAND: + { + const char *pred_name = XSTR (pattern, 1); + + if (pred_name[0] != 0) + { + /* See if we know about this predicate and save its number. If + we do, and it only accepts one code, note that fact. The + predicate `const_int_operand' only tests for a CONST_INT, so + if we do so we can avoid calling it at all. + + Finally, if we know that the predicate does not allow + CONST_INT, we know that the only way the predicate can match + is if the modes match (here we use the kludge of relying on + the fact that "address_operand" accepts CONST_INT; otherwise, + it would have to be a special case), so we can test the mode + (but we need not). This fact should considerably simplify the + generated code. */ + + for (i = 0; i < (int) NUM_KNOWN_PREDS; i++) + if (! strcmp (preds[i].name, pred_name)) + break; + + if (i < (int) NUM_KNOWN_PREDS) + { + int j, allows_const_int; + + allows_const_int = 0; + for (j = 0; preds[i].codes[j] != 0; j++) + if (preds[i].codes[j] == CONST_INT) + { + allows_const_int = 1; + break; + } + + if (allows_const_int && set_dest) + { + message_with_line (pattern_lineno, + "warning: `%s' accepts const_int,", + pred_name); + message_with_line (pattern_lineno, + " and used as destination of a set"); + } + } + else + { +#ifdef PREDICATE_CODES + /* If the port has a list of the predicates it uses but + omits one, warn. */ + message_with_line (pattern_lineno, "warning: `%s' not in PREDICATE_CODES", pred_name); +#endif + } + } + + return; + } + + case SET: + /* The operands of a SET must have the same mode unless one + is VOIDmode. */ + if (GET_MODE (SET_SRC (pattern)) != VOIDmode + && GET_MODE (SET_DEST (pattern)) != VOIDmode + && GET_MODE (SET_SRC (pattern)) != GET_MODE (SET_DEST (pattern)) + /* The mode of an ADDRESS_OPERAND is the mode of the memory + reference, not the mode of the address. */ + && ! (GET_CODE (SET_SRC (pattern)) == MATCH_OPERAND + && ! strcmp (XSTR (SET_SRC (pattern), 1), "address_operand"))) + { + message_with_line (pattern_lineno, + "mode mismatch in set: %smode vs %smode", + GET_MODE_NAME (GET_MODE (SET_DEST (pattern))), + GET_MODE_NAME (GET_MODE (SET_SRC (pattern)))); + error_count++; + } + + validate_pattern (SET_DEST (pattern), 1); + validate_pattern (SET_SRC (pattern), 0); + return; + + case LABEL_REF: + if (GET_MODE (XEXP (pattern, 0)) != VOIDmode) + { + message_with_line (pattern_lineno, + "operand to label_ref %smode not VOIDmode", + GET_MODE_NAME (GET_MODE (XEXP (pattern, 0)))); + error_count++; + } + break; + + default: + break; + } + + fmt = GET_RTX_FORMAT (code); + len = GET_RTX_LENGTH (code); + for (i = 0; i < len; i++) + { + switch (fmt[i]) + { + case 'e': case 'u': + validate_pattern (XEXP (pattern, i), 0); + break; + + case 'E': + for (j = 0; j < XVECLEN (pattern, i); j++) + validate_pattern (XVECEXP (pattern, i, j), 0); + break; + + case 'i': case 'w': case '0': case 's': + break; + + default: + abort (); + } + } + +} + /* Create a chain of nodes to verify that an rtl expression matches PATTERN. @@ -465,15 +633,7 @@ add_to_sequence (pattern, last, position, insn_type, top) } } else - { - test->u.pred.index = -1; -#ifdef PREDICATE_CODES - /* If the port has a list of the predicates it uses but - omits one, warn. */ - fprintf (stderr, "Warning: `%s' not in PREDICATE_CODES\n", - pred_name); -#endif - } + test->u.pred.index = -1; } /* Can't enforce a mode if we allow const_int. */ @@ -526,32 +686,6 @@ add_to_sequence (pattern, last, position, insn_type, top) pattern = XEXP (pattern, 0); goto restart; - case SET: - /* The operands of a SET must have the same mode unless one - is VOIDmode. */ - if (GET_MODE (SET_SRC (pattern)) != VOIDmode - && GET_MODE (SET_DEST (pattern)) != VOIDmode - && GET_MODE (SET_SRC (pattern)) != GET_MODE (SET_DEST (pattern)) - /* The mode of an ADDRESS_OPERAND is the mode of the memory - reference, not the mode of the address. */ - && ! (GET_CODE (SET_SRC (pattern)) == MATCH_OPERAND - && ! strcmp (XSTR (SET_SRC (pattern), 1), "address_operand"))) - { - print_rtl (stderr, pattern); - fputc ('\n', stderr); - fatal ("mode mismatch in SET"); - } - break; - - case LABEL_REF: - if (GET_MODE (XEXP (pattern, 0)) != VOIDmode) - { - print_rtl (stderr, pattern); - fputc ('\n', stderr); - fatal ("operand to LABEL_REF not VOIDmode"); - } - break; - default: break; } @@ -966,11 +1100,12 @@ merge_accept_insn (oldd, addd) } else { - fatal ("Two actions at one point in tree for insns \"%s\" (%d) and \"%s\" (%d)", - get_insn_name (old->u.insn.code_number), - old->u.insn.code_number, - get_insn_name (add->u.insn.code_number), - add->u.insn.code_number); + message_with_line (add->u.insn.lineno, "`%s' matches `%s'", + get_insn_name (add->u.insn.code_number), + get_insn_name (old->u.insn.code_number)); + message_with_line (old->u.insn.lineno, "previous definition of `%s'", + get_insn_name (old->u.insn.code_number)); + error_count++; } } @@ -2015,6 +2150,8 @@ make_insn_sequence (insn, type) PUT_MODE (x, VOIDmode); } + validate_pattern (x, 0); + memset(&head, 0, sizeof(head)); last = add_to_sequence (x, &head, "", type, 1); @@ -2037,6 +2174,7 @@ make_insn_sequence (insn, type) test = new_decision_test (DT_accept_insn, &place); test->u.insn.code_number = next_insn_code; + test->u.insn.lineno = pattern_lineno; test->u.insn.num_clobbers_to_add = 0; switch (type) @@ -2103,6 +2241,7 @@ make_insn_sequence (insn, type) test = new_decision_test (DT_accept_insn, &place); test->u.insn.code_number = next_insn_code; + test->u.insn.lineno = pattern_lineno; test->u.insn.num_clobbers_to_add = XVECLEN (x, 0) - i; merge_trees (&head, &clobber_head); @@ -2171,6 +2310,7 @@ main (argc, argv) perror (argv[1]); return FATAL_EXIT_CODE; } + read_rtx_filename = argv[1]; next_insn_code = 0; next_index = 0; @@ -2185,6 +2325,7 @@ main (argc, argv) if (c == EOF) break; ungetc (c, infile); + pattern_lineno = read_rtx_lineno; desc = read_rtx (infile); if (GET_CODE (desc) == DEFINE_INSN) @@ -2209,6 +2350,9 @@ main (argc, argv) next_index++; } + if (error_count) + return FATAL_EXIT_CODE; + puts ("\n\n"); process_tree (&recog_tree, RECOG); diff --git a/gcc/print-rtl.c b/gcc/print-rtl.c index d32ed18c363..1c503c103ea 100644 --- a/gcc/print-rtl.c +++ b/gcc/print-rtl.c @@ -200,6 +200,7 @@ print_rtx (in_rtx) break; case 'e': + do_e: indent += 2; if (!sawclose) fprintf (outfile, " "); @@ -298,6 +299,9 @@ print_rtx (in_rtx) case 'u': if (XEXP (in_rtx, i) != NULL) { + if (GET_CODE (XEXP (in_rtx, i)) != CODE_LABEL) + goto do_e; + if (flag_dump_unnumbered) fputc ('#', outfile); else diff --git a/gcc/rtl.c b/gcc/rtl.c index e181279010a..55687c81963 100644 --- a/gcc/rtl.c +++ b/gcc/rtl.c @@ -259,7 +259,9 @@ const char * const reg_note_name[] = { "", "REG_DEAD", "REG_INC", "REG_EQUIV", " "REG_FRAME_RELATED_EXPR", "REG_EH_REGION", "REG_EH_RETHROW", "REG_SAVE_NOTE" }; -static void dump_and_abort PROTO((int, int, FILE *)) ATTRIBUTE_NORETURN; +static void fatal_with_file_and_line PVPROTO((FILE *, const char *, ...)) + ATTRIBUTE_NORETURN; +static void fatal_expected_char PROTO((FILE *, int, int)) ATTRIBUTE_NORETURN; static void read_name PROTO((char *, FILE *)); static const char *trim_filename PROTO((const char *)); @@ -582,30 +584,64 @@ shallow_copy_rtx (orig) /* Subroutines of read_rtx. */ -/* Dump code after printing a message. Used when read_rtx finds - invalid data. */ +/* The current line number for the file. */ +int read_rtx_lineno = 1; + +/* The filename for aborting with file and line. */ +const char *read_rtx_filename = ""; static void -dump_and_abort (expected_c, actual_c, infile) - int expected_c, actual_c; - FILE *infile; +fatal_with_file_and_line VPROTO((FILE *infile, const char *msg, ...)) { - int c, i; - - if (expected_c >= 0) - fprintf (stderr, - "Expected character %c. Found character %c.", - expected_c, actual_c); - fprintf (stderr, " At file position: %ld\n", ftell (infile)); - fprintf (stderr, "Following characters are:\n\t"); - for (i = 0; i < 200; i++) +#ifndef ANSI_PROTOTYPES + FILE *infile; + const char *msg; +#endif + va_list ap; + char context[64]; + size_t i; + int c; + + VA_START (ap, msg); + +#ifndef ANSI_PROTOTYPES + infile = va_arg (ap, FILE *); + msg = va_arg (ap, const char *); +#endif + + fprintf (stderr, "%s:%d: ", read_rtx_filename, read_rtx_lineno); + vfprintf (stderr, msg, ap); + putc ('\n', stderr); + + /* Gather some following context. */ + for (i = 0; i < sizeof(context)-1; ++i) { c = getc (infile); - if (EOF == c) break; - putc (c, stderr); + if (c == EOF) + break; + if (c == '\r' || c == '\n') + break; + context[i] = c; } - fprintf (stderr, "Aborting.\n"); - abort (); + context[i] = '\0'; + + fprintf (stderr, "%s:%d: following context is `%s'\n", + read_rtx_filename, read_rtx_lineno, context); + + va_end (ap); + exit (1); +} + +/* Dump code after printing a message. Used when read_rtx finds + invalid data. */ + +static void +fatal_expected_char (infile, expected_c, actual_c) + FILE *infile; + int expected_c, actual_c; +{ + fatal_with_file_and_line (infile, "expected character `%c', found `%c'", + expected_c, actual_c); } /* Read chars from INFILE until a non-whitespace char @@ -618,33 +654,48 @@ read_skip_spaces (infile) FILE *infile; { register int c; - while ((c = getc (infile))) + while (1) { - if (c == ' ' || c == '\n' || c == '\t' || c == '\f') - ; - else if (c == ';') - { - while ((c = getc (infile)) && c != '\n' && c != EOF) - ; - } - else if (c == '/') + c = getc (infile); + switch (c) { - register int prevc; - c = getc (infile); - if (c != '*') - dump_and_abort ('*', c, infile); + case '\n': + read_rtx_lineno++; + break; + + case ' ': case '\t': case '\f': case '\r': + break; + + case ';': + do + c = getc (infile); + while (c != '\n' && c != EOF); + read_rtx_lineno++; + break; + + case '/': + { + register int prevc; + c = getc (infile); + if (c != '*') + fatal_expected_char (infile, '*', c); - prevc = 0; - while ((c = getc (infile)) && c != EOF) - { - if (prevc == '*' && c == '/') - break; - prevc = c; - } + prevc = 0; + while ((c = getc (infile)) && c != EOF) + { + if (c == '\n') + read_rtx_lineno++; + else if (prevc == '*' && c == '/') + break; + prevc = c; + } + } + break; + + default: + return c; } - else break; } - return c; } /* Read an rtx code name into the buffer STR[]. @@ -675,10 +726,9 @@ read_name (str, infile) c = getc (infile); } if (p == str) - { - fprintf (stderr, "missing name or number"); - dump_and_abort (-1, -1, infile); - } + fatal_with_file_and_line (infile, "missing name or number"); + if (c == '\n') + read_rtx_lineno++; *p = 0; } @@ -745,12 +795,12 @@ read_rtx (infile) struct rtx_list { struct rtx_list *next; - rtx value; /* Value of this node... */ + rtx value; /* Value of this node. */ }; c = read_skip_spaces (infile); /* Should be open paren. */ if (c != '(') - dump_and_abort ('(', c, infile); + fatal_expected_char (infile, '(', c); read_name (tmp_char, infile); @@ -831,7 +881,7 @@ read_rtx (infile) c = read_skip_spaces (infile); if (c != '[') - dump_and_abort ('[', c, infile); + fatal_expected_char (infile, '[', c); /* add expressions to a list, while keeping a count */ next_rtx = NULL; @@ -887,11 +937,13 @@ read_rtx (infile) c = read_skip_spaces (infile); } if (c != '"') - dump_and_abort ('"', c, infile); + fatal_expected_char (infile, '"', c); while (1) { c = getc (infile); /* Read the string */ + if (c == '\n') + read_rtx_lineno++; if (c == '\\') { c = getc (infile); /* Read the string */ @@ -916,7 +968,7 @@ read_rtx (infile) { c = read_skip_spaces (infile); if (c != ')') - dump_and_abort (')', c, infile); + fatal_expected_char (infile, ')', c); } XSTR (return_rtx, i) = stringbuf; } @@ -959,7 +1011,7 @@ read_rtx (infile) c = read_skip_spaces (infile); if (c != ')') - dump_and_abort (')', c, infile); + fatal_expected_char (infile, ')', c); return return_rtx; } diff --git a/gcc/rtl.h b/gcc/rtl.h index a234b62b6cf..575c01a3f46 100644 --- a/gcc/rtl.h +++ b/gcc/rtl.h @@ -963,10 +963,6 @@ extern rtx gen_rtx PVPROTO((enum rtx_code, enum machine_mode, ...)); extern rtvec gen_rtvec PVPROTO((int, ...)); -#ifdef BUFSIZ -extern rtx read_rtx PROTO((FILE *)); -#endif - extern char *oballoc PROTO((int)); extern char *permalloc PROTO((int)); extern rtx rtx_alloc PROTO((RTX_CODE)); @@ -1379,10 +1375,6 @@ extern void gcc_obstack_init PROTO ((struct obstack *)); extern void pop_obstacks PROTO ((void)); extern void push_obstacks PROTO ((struct obstack *, struct obstack *)); -#ifdef BUFSIZ -extern int read_skip_spaces PROTO ((FILE *)); -#endif - /* In cse.c */ struct cse_basic_block_data; extern int rtx_cost PROTO ((rtx, enum rtx_code)); @@ -1642,7 +1634,6 @@ extern void rrotate_double PROTO ((HOST_WIDE_INT, HOST_WIDE_INT, HOST_WIDE_INT *)); /* In calls.c */ -/* Emit library call. */ extern void emit_library_call PVPROTO ((rtx, int, enum machine_mode, int, ...)); extern rtx emit_library_call_value PVPROTO((rtx, rtx, int, @@ -1662,6 +1653,14 @@ extern void init_varasm_once PROTO ((void)); extern void init_rtl PROTO ((void)); extern void rtx_free PROTO ((rtx)); +#ifdef BUFSIZ +extern int read_skip_spaces PROTO ((FILE *)); +extern rtx read_rtx PROTO ((FILE *)); +#endif + +extern const char *read_rtx_filename; +extern int read_rtx_lineno; + /* Redefine abort to report an internal error w/o coredump, and reporting the location of the error in the source file. This logic is duplicated in rtl.h and tree.h because every file that needs the -- 2.11.0