diff options
author | Hans-Peter Nilsson <hp@axis.com> | 2001-11-28 02:37:44 +0000 |
---|---|---|
committer | Hans-Peter Nilsson <hp@gcc.gnu.org> | 2001-11-28 02:37:44 +0000 |
commit | 3d5568369fca6b8df9dcbd8d3100556b09c5f83a (patch) | |
tree | 0ef2873cde3d0bec88fd0b662d4a67074171ff39 | |
parent | fd2aba001d4f7cd247fb5300afca7312af7dd094 (diff) | |
download | gcc-3d5568369fca6b8df9dcbd8d3100556b09c5f83a.zip gcc-3d5568369fca6b8df9dcbd8d3100556b09c5f83a.tar.gz gcc-3d5568369fca6b8df9dcbd8d3100556b09c5f83a.tar.bz2 |
cris.c: Tweak spacing for prototypes.
* config/cris/cris.c: Tweak spacing for prototypes.
(LOSE_AND_RETURN): New macro.
(cris_operand_lossage): New function.
(cris_print_index, cris_print_base): Use cris_operand_lossage
rather than fatal_insn.
(cris_print_operand, cris_print_operand_address): Use
LOSE_AND_RETURN rather than fatal_insn and internal_error.
(cris_output_addr_const): Use LOSE_AND_RETURN and
output_operand_lossage rather than fatal_insn and internal_error
for valid but unexpected rtx expressions.
* config/cris/cris.c (cris_split_movdx): Don't call alter_subreg
for a SUBREG in src or dest, abort instead.
From-SVN: r47395
-rw-r--r-- | gcc/ChangeLog | 16 | ||||
-rw-r--r-- | gcc/config/cris/cris.c | 118 |
2 files changed, 82 insertions, 52 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index a6d1082..6a87c32 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,19 @@ +2001-11-28 Hans-Peter Nilsson <hp@axis.com> + + * config/cris/cris.c: Tweak spacing for prototypes. + (LOSE_AND_RETURN): New macro. + (cris_operand_lossage): New function. + (cris_print_index, cris_print_base): Use cris_operand_lossage + rather than fatal_insn. + (cris_print_operand, cris_print_operand_address): Use + LOSE_AND_RETURN rather than fatal_insn and internal_error. + (cris_output_addr_const): Use LOSE_AND_RETURN and + output_operand_lossage rather than fatal_insn and internal_error + for valid but unexpected rtx expressions. + + * config/cris/cris.c (cris_split_movdx): Don't call alter_subreg + for a SUBREG in src or dest, abort instead. + 2001-11-28 Bryce McKinlay <bryce@waitaki.otago.ac.nz> * doc/passes.texi: Remove reference to c-dump.c. Update tree inlining diff --git a/gcc/config/cris/cris.c b/gcc/config/cris/cris.c index c1932e9..c954304 100644 --- a/gcc/config/cris/cris.c +++ b/gcc/config/cris/cris.c @@ -55,15 +55,19 @@ Boston, MA 02111-1307, USA. */ abort (); \ } while (0) +#define LOSE_AND_RETURN(msg, x) \ + do \ + { \ + cris_operand_lossage (msg, x); \ + return; \ + } while (0) + /* Per-function machine data. */ struct machine_function { int needs_return_address_on_stack; }; -/* Fix for reg_overlap_mentioned_p. */ -static int cris_reg_overlap_mentioned_p PARAMS ((rtx, rtx)); - /* This little fix suppresses the 'u' or 's' when '%e' in assembly pattern. */ static char cris_output_insn_is_bound = 0; @@ -74,28 +78,30 @@ static char cris_output_insn_is_bound = 0; just the "sym:GOTOFF" part. */ static int cris_pic_sympart_only = 0; -static void -cris_print_base PARAMS ((rtx, FILE *)); +/* Fix for reg_overlap_mentioned_p. */ +static int cris_reg_overlap_mentioned_p PARAMS ((rtx, rtx)); -static void -cris_print_index PARAMS ((rtx, FILE *)); +static void cris_print_base PARAMS ((rtx, FILE *)); -static void -cris_init_machine_status PARAMS ((struct function *)); +static void cris_print_index PARAMS ((rtx, FILE *)); -static int -cris_initial_frame_pointer_offset PARAMS ((void)); +static void cris_init_machine_status PARAMS ((struct function *)); -static int -saved_regs_mentioned PARAMS ((rtx)); +static int cris_initial_frame_pointer_offset PARAMS ((void)); + +static int saved_regs_mentioned PARAMS ((rtx)); static void cris_target_asm_function_prologue PARAMS ((FILE *, HOST_WIDE_INT)); + static void cris_target_asm_function_epilogue PARAMS ((FILE *, HOST_WIDE_INT)); +static void cris_operand_lossage PARAMS ((const char *, rtx)); + /* The function cris_target_asm_function_epilogue puts the last insn to - output here. Used in delay_slots_for_epilogue and function_epilogue. */ + output here. It always fits; there won't be a symbol operand. Used in + delay_slots_for_epilogue and function_epilogue. */ static char save_last[80]; /* This is the argument from the "-max-stack-stackframe=" option. */ @@ -476,6 +482,20 @@ cris_op_str (x) } } +/* Emit an error message when we're in an asm, and a fatal error for + "normal" insns. Formatted output isn't easily implemented, since we + use output_operand_lossage to output the actual message and handle the + categorization of the error. */ + +static void +cris_operand_lossage (msg, op) + const char *msg; + rtx op; +{ + debug_rtx (op); + output_operand_lossage (msg); +} + /* Print an index part of an address to file. */ static void @@ -527,7 +547,8 @@ cris_print_index (index, file) fprintf (file, "[$%s].d", reg_names[REGNO (inner)]); } else - fatal_insn ("Unexpected index-type in cris_print_index", index); + cris_operand_lossage ("unexpected index-type in cris_print_index", + index); } /* Print a base rtx of an address to file. */ @@ -542,7 +563,8 @@ cris_print_base (base, file) else if (GET_CODE (base) == POST_INC) fprintf (file, "$%s+", reg_names[REGNO (XEXP (base, 0))]); else - fatal_insn ("Unexpected base-type in cris_print_base", base); + cris_operand_lossage ("unexpected base-type in cris_print_base", + base); } /* Usable as a guard in expressions. */ @@ -1238,7 +1260,7 @@ cris_print_operand (file, x, code) and < 0, i.e print 255 or 65535 as -1, 254, 65534 as -2, etc. */ if (GET_CODE (x) != CONST_INT || ! CONST_OK_FOR_LETTER_P (INTVAL (x), 'O')) - fatal_insn ("Internal: Invalid operand with 'b'", x); + LOSE_AND_RETURN ("invalid operand for 'b' modifier", x); fprintf (file, "%d", INTVAL (x)| (INTVAL (x) <= 255 ? ~255 : ~65535)); return; @@ -1249,8 +1271,8 @@ cris_print_operand (file, x, code) case 'v': /* Print the operand without the PIC register. */ - if (! flag_pic || ! cris_gotless_symbol (x)) - fatal_insn ("Internal: Invalid operand with 'v'", x); + if (! flag_pic || ! CONSTANT_P (x) || ! cris_gotless_symbol (x)) + LOSE_AND_RETURN ("invalid operand for 'v' modifier", x); cris_pic_sympart_only++; cris_output_addr_const (file, x); cris_pic_sympart_only--; @@ -1259,15 +1281,15 @@ cris_print_operand (file, x, code) case 'P': /* Print the PIC register. Applied to a GOT-less PIC symbol for sanity. */ - if (! flag_pic || ! cris_gotless_symbol (x)) - fatal_insn ("Internal: Invalid operand with 'P'", x); + if (! flag_pic || ! CONSTANT_P (x) || ! cris_gotless_symbol (x)) + LOSE_AND_RETURN ("invalid operand for 'P' modifier", x); fprintf (file, "$%s", reg_names [PIC_OFFSET_TABLE_REGNUM]); return; case 'p': /* Adjust a power of two to its log2. */ if (GET_CODE (x) != CONST_INT || exact_log2 (INTVAL (x)) < 0 ) - fatal_insn ("Internal: Invalid operand with 'p'", x); + LOSE_AND_RETURN ("invalid operand for 'p' modifier", x); fprintf (file, "%d", exact_log2 (INTVAL (x))); return; @@ -1306,7 +1328,7 @@ cris_print_operand (file, x, code) w for -32768 <= x <= 65535, else abort. */ if (GET_CODE (x) != CONST_INT || INTVAL (x) < -32768 || INTVAL (x) > 65535) - fatal_insn ("Internal: Invalid operand with 'z'", x); + LOSE_AND_RETURN ("invalid operand for 'z' modifier", x); putc (INTVAL (x) >= -128 && INTVAL (x) <= 255 ? 'b' : 'w', file); return; @@ -1334,13 +1356,13 @@ cris_print_operand (file, x, code) return; } else - fatal_insn ("Internal: Invalid operand with 'H'", x); + LOSE_AND_RETURN ("invalid operand for 'H' modifier", x); case REG: /* Print reg + 1. Check that there's not an attempt to print high-parts of registers like stack-pointer or higher. */ if (REGNO (operand) > STACK_POINTER_REGNUM - 2) - internal_error ("Internal: Bad register: %d", REGNO (operand)); + LOSE_AND_RETURN ("bad register", operand); fprintf (file, "$%s", reg_names[REGNO (operand) + 1]); return; @@ -1364,7 +1386,7 @@ cris_print_operand (file, x, code) } default: - fatal_insn ("Internal: Invalid operand for 'H'", x); + LOSE_AND_RETURN ("invalid operand for 'H' modifier", x); } case 'L': @@ -1378,7 +1400,7 @@ cris_print_operand (file, x, code) if (GET_CODE (operand) != SIGN_EXTEND && GET_CODE (operand) != ZERO_EXTEND && GET_CODE (operand) != CONST_INT) - fatal_insn ("Internal: Invalid operand with 'e'", x); + LOSE_AND_RETURN ("invalid operand for 'e' modifier", x); if (cris_output_insn_is_bound) { @@ -1395,7 +1417,7 @@ cris_print_operand (file, x, code) /* Print the size letter of the inner element. We can do it by calling ourselves with the 's' modifier. */ if (GET_CODE (operand) != SIGN_EXTEND && GET_CODE (operand) != ZERO_EXTEND) - fatal_insn ("Internal: Invalid operand with 'm'", x); + LOSE_AND_RETURN ("invalid operand for 'm' modifier", x); cris_print_operand (file, XEXP (operand, 0), 's'); return; @@ -1414,7 +1436,7 @@ cris_print_operand (file, x, code) /* When emitting an add for the high part of a DImode constant, we want to use addq for 0 and adds.w for -1. */ if (GET_CODE (operand) != CONST_INT) - fatal_insn ("Internal: Invalid operand with 'A' output modifier", x); + LOSE_AND_RETURN ("invalid operand for 'A' modifier", x); fprintf (file, INTVAL (operand) < 0 ? "adds.w" : "addq"); return; @@ -1422,7 +1444,7 @@ cris_print_operand (file, x, code) /* When emitting an sub for the high part of a DImode constant, we want to use subq for 0 and subs.w for -1. */ if (GET_CODE (operand) != CONST_INT) - fatal_insn ("Internal: Invalid operand with 'D' output modifier", x); + LOSE_AND_RETURN ("invalid operand for 'D' modifier", x); fprintf (file, INTVAL (operand) < 0 ? "subs.w" : "subq"); return; @@ -1436,8 +1458,7 @@ cris_print_operand (file, x, code) /* Print the size letter for an operand to a MULT, which must be a const_int with a suitable value. */ if (GET_CODE (operand) != CONST_INT || INTVAL (operand) > 4) - fatal_insn ("Internal: Invalid operand with 'T'", x); - + LOSE_AND_RETURN ("invalid operand for 'T' modifier", x); fprintf (file, "%s", mults[INTVAL (operand)]); return; @@ -1446,12 +1467,7 @@ cris_print_operand (file, x, code) break; default: - { -#define BADFORMAT "Internal: Invalid operand for '%c'" - char s[sizeof BADFORMAT]; - sprintf (s, BADFORMAT, code); - fatal_insn (s, x); - } + LOSE_AND_RETURN ("invalid operand modifier letter", x); } /* Print an operand as without a modifier letter. */ @@ -1507,7 +1523,7 @@ cris_print_operand (file, x, code) if (GET_CODE (reg) != REG || (GET_CODE (XEXP (operand, 0)) != CONST_INT && GET_CODE (XEXP (operand, 1)) != CONST_INT)) - fatal_insn ("Can't print operand", x); + LOSE_AND_RETURN ("unexpected multiplicative operand", x); cris_print_base (reg, file); fprintf (file, ".%c", @@ -1527,7 +1543,7 @@ cris_print_operand (file, x, code) return; } - fatal_insn ("Internal: Cannot decode operand", x); + LOSE_AND_RETURN ("unexpected operand", x); } } @@ -1562,7 +1578,7 @@ cris_print_operand_address (file, x) cris_print_index (x1, file); } else - fatal_insn ("Internal: This is not a recognized address", x); + LOSE_AND_RETURN ("unrecognized address", x); } else if (GET_CODE (x) == MEM) { @@ -1572,7 +1588,7 @@ cris_print_operand_address (file, x) putc (']', file); } else - fatal_insn ("Internal: This is not a recognized address", x); + LOSE_AND_RETURN ("unrecognized address", x); putc (']', file); } @@ -2612,13 +2628,11 @@ cris_split_movdx (operands) rtx src = operands[1]; rtx val; - /* We might have (SUBREG (MEM)) here, so just get rid of the - subregs to make this code simpler. It is safe to call - alter_subreg any time after reload. */ - if (GET_CODE (dest) == SUBREG) - dest = alter_subreg (dest); - if (GET_CODE (src) == SUBREG) - src = alter_subreg (src); + /* We used to have to handle (SUBREG (MEM)) here, but that should no + longer happen; after reload there are no SUBREGs any more, and we're + only called after reload. */ + if (GET_CODE (dest) == SUBREG || GET_CODE (src) == SUBREG) + abort (); start_sequence (); if (GET_CODE (dest) == REG) @@ -2831,11 +2845,11 @@ restart: fprintf (file, ":GOT]"); } else - fatal_insn ("Unexpected PIC symbol", x); + LOSE_AND_RETURN ("unexpected PIC symbol", x); /* Sanity check. */ if (! current_function_uses_pic_offset_table) - internal_error ("Emitting PIC operand, but PIC register isn't set up"); + output_operand_lossage ("PIC register isn't set up"); } else assemble_name (file, XSTR (x, 0)); @@ -2931,7 +2945,7 @@ restart: break; default: - fatal_insn ("Unexpected address expression", x); + LOSE_AND_RETURN ("unexpected address expression", x); } } |