From: Zack Weinberg Date: Sat, 30 Jun 2001 17:23:53 +0000 (+0000) Subject: rtl.def (DEFINE_INSN, [...]): Change output-template slot to format 'T'. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=1f3b37a3d55f2717cdcd349acaf0ed4c38df7ac4;p=gcc.git rtl.def (DEFINE_INSN, [...]): Change output-template slot to format 'T'. * rtl.def (DEFINE_INSN, DEFINE_INSN_AND_SPLIT, DEFINE_PEEPHOLE): Change output-template slot to format 'T'. * rtl.h (XTMPL): New. * read-rtl.c (read_escape): New function. (read_quoted_string, read_braced_string): Use it. (read_rtx): Set star_if_braced from the format string. Use XTMPL where appropriate. * genoutput.c (gen_insn, gen_peephole): Use XTMPL to get the template string. * rtl.c: Include errors.h for sake of rtl_check_failed* routines. Document 'T' in rtx format strings. * Makefile.in (rtl.o, $(HOST_PREFIX_1)rtl.o): Depend on errors.h. * errors.c (internal_error): Add missing ": " at end of string. * i860.md: Change triple backslashes to double backslashes at ends of lines in output templates. From-SVN: r43665 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index f4fbe8aac78..5eedd0fadfe 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,23 @@ +2001-06-30 Zack Weinberg + + * rtl.def (DEFINE_INSN, DEFINE_INSN_AND_SPLIT, DEFINE_PEEPHOLE): + Change output-template slot to format 'T'. + * rtl.h (XTMPL): New. + * read-rtl.c (read_escape): New function. + (read_quoted_string, read_braced_string): Use it. + (read_rtx): Set star_if_braced from the format string. + Use XTMPL where appropriate. + * genoutput.c (gen_insn, gen_peephole): Use XTMPL to get the + template string. + + * rtl.c: Include errors.h for sake of rtl_check_failed* routines. + Document 'T' in rtx format strings. + * Makefile.in (rtl.o, $(HOST_PREFIX_1)rtl.o): Depend on errors.h. + * errors.c (internal_error): Add missing ": " at end of string. + + * i860.md: Change triple backslashes to double backslashes at + ends of lines in output templates. + 2001-06-29 Nick Clifton * gcc.c (process_command): Append a DIR_SEPARATOR to a path @@ -1015,7 +1035,7 @@ Mon Jun 18 12:50:49 2001 Jeffrey A Law (law@cygnus.com) (delete_unreachable_blocks): Use find_unreachable_blocks. * basic-block.h (find_unreachable_blocks): Declare. - * dce.c (eliminate_dead_code): Fix formatting glitch. + * dce.c (eliminate_dead_code): Fix formatting glitch. 2001-06-18 Jason Merrill diff --git a/gcc/Makefile.in b/gcc/Makefile.in index 58ac2c18f03..e8493bacb3e 100644 --- a/gcc/Makefile.in +++ b/gcc/Makefile.in @@ -1345,7 +1345,7 @@ toplev.o : toplev.c $(CONFIG_H) $(SYSTEM_H) $(TREE_H) $(RTL_H) function.h \ -c $(srcdir)/toplev.c main.o : main.c toplev.h -rtl.o : rtl.c $(GCONFIG_H) $(SYSTEM_H) $(RTL_H) real.h $(GGC_H) +rtl.o : rtl.c $(GCONFIG_H) $(SYSTEM_H) $(RTL_H) real.h $(GGC_H) errors.h $(CC) -c $(ALL_CFLAGS) -DGENERATOR_FILE $(ALL_CPPFLAGS) $(INCLUDES) $< $(OUTPUT_OPTION) print-rtl.o : print-rtl.c $(GCONFIG_H) $(SYSTEM_H) $(RTL_H) hard-reg-set.h \ @@ -1822,7 +1822,7 @@ gengenrtl.o : gengenrtl.c $(RTL_BASE_H) $(HCONFIG_H) $(SYSTEM_H) real.h # and HOST_PREFIX_1 is `foobar', just to ensure these rules don't conflict # with the rules for rtl.o, etc. $(HOST_PREFIX_1)rtl.o: $(srcdir)/rtl.c $(HCONFIG_H) $(SYSTEM_H) $(RTL_H) \ - $(GGC_H) + $(GGC_H) errors.h rm -f $(HOST_PREFIX)rtl.c sed -e 's/config[.]h/hconfig.h/' $(srcdir)/rtl.c > $(HOST_PREFIX)rtl.c $(HOST_CC) -c $(HOST_CFLAGS) $(HOST_CPPFLAGS) $(INCLUDES) $(HOST_PREFIX)rtl.c diff --git a/gcc/config/i860/i860.md b/gcc/config/i860/i860.md index 5778964f5be..beeabe6927b 100644 --- a/gcc/config/i860/i860.md +++ b/gcc/config/i860/i860.md @@ -1958,17 +1958,17 @@ cc_status.flags |= CC_KNOW_HI_R31; cc_status.flags &= ~CC_HI_R31_ADJ; cc_status.mdep = CONST2_RTX (SFmode); - return \"frcp.dd %2,%3\;fmul.dd %2,%3,%0\;fmov.dd %?f0,%4\;\\\ -orh 0x4000,%?r0,%?r31\;ixfr %?r31,%R4\;fsub.dd %4,%0,%0\;\\\ -fmul.dd %3,%0,%3\;fmul.dd %2,%3,%0\;fsub.dd %4,%0,%0\;\\\ -fmul.dd %3,%0,%3\;fmul.dd %2,%3,%0\;fsub.dd %4,%0,%0\;\\\ + return \"frcp.dd %2,%3\;fmul.dd %2,%3,%0\;fmov.dd %?f0,%4\;\\ +orh 0x4000,%?r0,%?r31\;ixfr %?r31,%R4\;fsub.dd %4,%0,%0\;\\ +fmul.dd %3,%0,%3\;fmul.dd %2,%3,%0\;fsub.dd %4,%0,%0\;\\ +fmul.dd %3,%0,%3\;fmul.dd %2,%3,%0\;fsub.dd %4,%0,%0\;\\ fmul.dd %3,%1,%3\;fmul.dd %0,%3,%0\"; } else - return \"frcp.dd %2,%3\;fmul.dd %2,%3,%0\;fmov.dd %?f0,%4\;\\\ -ixfr %?r31,%R4\;fsub.dd %4,%0,%0\;\\\ -fmul.dd %3,%0,%3\;fmul.dd %2,%3,%0\;fsub.dd %4,%0,%0\;\\\ -fmul.dd %3,%0,%3\;fmul.dd %2,%3,%0\;fsub.dd %4,%0,%0\;\\\ + return \"frcp.dd %2,%3\;fmul.dd %2,%3,%0\;fmov.dd %?f0,%4\;\\ +ixfr %?r31,%R4\;fsub.dd %4,%0,%0\;\\ +fmul.dd %3,%0,%3\;fmul.dd %2,%3,%0\;fsub.dd %4,%0,%0\;\\ +fmul.dd %3,%0,%3\;fmul.dd %2,%3,%0\;fsub.dd %4,%0,%0\;\\ fmul.dd %3,%1,%3\;fmul.dd %0,%3,%0\"; }") @@ -1991,9 +1991,9 @@ fmul.dd %3,%1,%3\;fmul.dd %0,%3,%0\"; cc_status.mdep = CONST2_RTX (SFmode); output_asm_insn (\"orh 0x4000,%?r0,%?r31\", operands); } - return \"ixfr %?r31,%4\;frcp.ss %2,%0\;\\\ -fmul.ss %2,%0,%3\;fsub.ss %4,%3,%3\;fmul.ss %0,%3,%0\;\\\ -fmul.ss %2,%0,%3\;fsub.ss %4,%3,%3\;\\\ + return \"ixfr %?r31,%4\;frcp.ss %2,%0\;\\ +fmul.ss %2,%0,%3\;fsub.ss %4,%3,%3\;fmul.ss %0,%3,%0\;\\ +fmul.ss %2,%0,%3\;fsub.ss %4,%3,%3\;\\ fmul.ss %1,%0,%4\;fmul.ss %3,%4,%0\"; }") diff --git a/gcc/errors.c b/gcc/errors.c index e1a3f13a8fd..a61bb8801da 100644 --- a/gcc/errors.c +++ b/gcc/errors.c @@ -121,7 +121,7 @@ internal_error VPARAMS ((const char *format, ...)) format = va_arg (ap, const char *); #endif - fprintf (stderr, "%s: Internal error", progname); + fprintf (stderr, "%s: Internal error: ", progname); vfprintf (stderr, format, ap); va_end (ap); fputc ('\n', stderr); diff --git a/gcc/genoutput.c b/gcc/genoutput.c index c2cb124a536..bca9a623259 100644 --- a/gcc/genoutput.c +++ b/gcc/genoutput.c @@ -808,7 +808,7 @@ gen_insn (insn, lineno) validate_insn_operands (d); validate_insn_alternatives (d); place_operands (d); - process_template (d, XSTR (insn, 3)); + process_template (d, XTMPL (insn, 3)); } /* Look at a define_peephole just read. Assign its code number. @@ -849,7 +849,7 @@ gen_peephole (peep, lineno) validate_insn_alternatives (d); place_operands (d); - process_template (d, XSTR (peep, 2)); + process_template (d, XTMPL (peep, 2)); } /* Process a define_expand just read. Assign its code number, diff --git a/gcc/read-rtl.c b/gcc/read-rtl.c index febab50b968..7e0da18f0f8 100644 --- a/gcc/read-rtl.c +++ b/gcc/read-rtl.c @@ -37,6 +37,7 @@ static void read_name PARAMS ((char *, FILE *)); static char *read_string PARAMS ((struct obstack *, FILE *, int)); static char *read_quoted_string PARAMS ((struct obstack *, FILE *)); static char *read_braced_string PARAMS ((struct obstack *, FILE *)); +static void read_escape PARAMS ((struct obstack *, FILE *)); static unsigned def_hash PARAMS ((const void *)); static int def_name_eq_p PARAMS ((const void *, const void *)); static void read_constants PARAMS ((FILE *infile, char *tmp_char)); @@ -211,6 +212,60 @@ read_name (str, 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 (ob, infile) + struct obstack *ob; + FILE *infile; +{ + int c = getc (infile); + switch (c) + { + /* Backslash-newline is replaced by nothing, as in C. */ + case '\n': + read_rtx_lineno++; + return; + + /* \" \' \\ are replaced by the second character. */ + case '\\': + case '"': + case '\'': + break; + + /* Standard C string escapes: + \a \b \f \n \r \t \v + \[0-7] \x + all are passed through to the output string unmolested. + In normal use these wind up in a string constant processed + by the C compiler, which will translate them appropriately. + We do not bother checking that \[0-7] are followed by up to + two octal digits, or that \x is followed by N hex digits. + \? \u \U are left out because they are not in traditional C. */ + 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, '\\'); + break; + + /* \; makes stuff for a C string constant containing + newline and tab. */ + case ';': + obstack_grow (ob, "\\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, '\\'); + break; + } + + obstack_1grow (ob, c); +} + + /* Read a double-quoted string onto the obstack. Caller has scanned the leading quote. */ static char * @@ -226,27 +281,8 @@ read_quoted_string (ob, infile) read_rtx_lineno++; else if (c == '\\') { - c = getc (infile); /* Read the string */ - /* \; makes stuff for a C string constant containing - newline and tab. */ - if (c == ';') - { - obstack_grow (ob, "\\n\\t", 4); - continue; - } - else if (c == '\n') - /* \-newline: delete the backslash and update our idea of - the line number. */ - read_rtx_lineno++; - else if (c == '\\' || c == '"') - ; /* \", \\ are a literal quote and backslash. */ - else - /* Backslash escapes we do not recognize are left unmolested. - They may be handled by the C compiler (e.g. \n, \t) */ - { - ungetc (c, infile); /* put it back */ - c = '\\'; - } + read_escape (ob, infile); + continue; } else if (c == '"') break; @@ -281,27 +317,8 @@ read_braced_string (ob, infile) brace_depth--; else if (c == '\\') { - c = getc (infile); /* Read the string */ - /* \; makes stuff for a C string constant containing - newline and tab. */ - if (c == ';') - { - obstack_grow (ob, "\\n\\t", 4); - continue; - } - else if (c == '\n') - /* \-newline: delete the backslash and update our idea of - the line number. */ - read_rtx_lineno++; - else if (c == '\\') - ; /* \\ is a literal backslash */ - else - /* Backslash escapes we do not recognize are left unmolested. - They may be handled by the C compiler (e.g. \n, \t) */ - { - ungetc (c, infile); /* put it back */ - c = '\\'; - } + read_escape (ob, infile); + continue; } obstack_1grow (ob, c); @@ -643,6 +660,7 @@ again: break; } + case 'T': case 's': { char *stringbuf; @@ -651,10 +669,7 @@ again: DEFINE_INSN_AND_SPLIT, or DEFINE_PEEPHOLE automatically gets a star inserted as its first character, if it is written with a brace block instead of a string constant. */ - int star_if_braced = - ((i == 3 && (GET_CODE (return_rtx) == DEFINE_INSN - || GET_CODE (return_rtx) == DEFINE_INSN_AND_SPLIT)) - || (i == 2 && GET_CODE (return_rtx) == DEFINE_PEEPHOLE)); + int star_if_braced = (format_ptr[-1] == 'T'); stringbuf = read_string (&rtl_obstack, infile, star_if_braced); @@ -680,7 +695,10 @@ again: stringbuf = (char *) obstack_finish (&rtl_obstack); } - XSTR (return_rtx, i) = stringbuf; + if (star_if_braced) + XTMPL (return_rtx, i) = stringbuf; + else + XSTR (return_rtx, i) = stringbuf; } break; diff --git a/gcc/rtl.c b/gcc/rtl.c index 0c84d752e3e..0e4a9b33da5 100644 --- a/gcc/rtl.c +++ b/gcc/rtl.c @@ -24,6 +24,7 @@ Boston, MA 02111-1307, USA. */ #include "rtl.h" #include "real.h" #include "ggc.h" +#include "errors.h" /* Calculate the format for CONST_DOUBLE. This depends on the relative @@ -230,6 +231,8 @@ const char * const rtx_format[] = { prints the string "S" like "s", but optional: the containing rtx may end before this operand + "T" like "s", but treated specially by the RTL reader; + only found in machine description patterns. "e" a pointer to an rtl expression prints the expression "E" a pointer to a vector that points to a number of rtl expressions diff --git a/gcc/rtl.def b/gcc/rtl.def index 906255d2dcd..500301a334c 100644 --- a/gcc/rtl.def +++ b/gcc/rtl.def @@ -184,7 +184,7 @@ DEF_RTL_EXPR(MATCH_INSN, "match_insn", "is", 'm') template to use. 4: optionally, a vector of attributes for this insn. */ -DEF_RTL_EXPR(DEFINE_INSN, "define_insn", "sEssV", 'x') +DEF_RTL_EXPR(DEFINE_INSN, "define_insn", "sEsTV", 'x') /* Definition of a peephole optimization. 1st operand: vector of insn patterns to match @@ -192,7 +192,7 @@ DEF_RTL_EXPR(DEFINE_INSN, "define_insn", "sEssV", 'x') 3rd operand: template or C code to produce assembler output. 4: optionally, a vector of attributes for this insn. */ -DEF_RTL_EXPR(DEFINE_PEEPHOLE, "define_peephole", "EssV", 'x') +DEF_RTL_EXPR(DEFINE_PEEPHOLE, "define_peephole", "EsTV", 'x') /* Definition of a split operation. 1st operand: insn pattern to match @@ -229,7 +229,7 @@ DEF_RTL_EXPR(DEFINE_SPLIT, "define_split", "EsES", 'x') elements of `recog_operand' for use by the vector of insn-patterns. (`operands' is an alias here for `recog_operand'). 7: optionally, a vector of attributes for this insn. */ -DEF_RTL_EXPR(DEFINE_INSN_AND_SPLIT, "define_insn_and_split", "sEsssESV", 'x') +DEF_RTL_EXPR(DEFINE_INSN_AND_SPLIT, "define_insn_and_split", "sEsTsESV", 'x') /* Definition of an RTL peephole operation. Follows the same arguments as define_split. */ diff --git a/gcc/rtl.h b/gcc/rtl.h index ca35d3f33bc..84de8fe3d39 100644 --- a/gcc/rtl.h +++ b/gcc/rtl.h @@ -320,6 +320,7 @@ extern void rtvec_check_failed_bounds PARAMS ((rtvec, int, #define XBITMAP(RTX, N) (RTL_CHECK1(RTX, N, 'b').rtbit) #define XTREE(RTX, N) (RTL_CHECK1(RTX, N, 't').rttree) #define XBBDEF(RTX, N) (RTL_CHECK1(RTX, N, 'B').bb) +#define XTMPL(RTX, N) (RTL_CHECK1(RTX, N, 'T').rtstr) #define XVECEXP(RTX, N, M) RTVEC_ELT (XVEC (RTX, N), M) #define XVECLEN(RTX, N) GET_NUM_ELEM (XVEC (RTX, N))