aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHans-Peter Nilsson <hp@axis.com>2011-07-09 22:35:43 +0000
committerHans-Peter Nilsson <hp@gcc.gnu.org>2011-07-09 22:35:43 +0000
commita50023f9a8f3a7dcf40228d268463e5dbe3a8c55 (patch)
tree3ad75c371ac51964e2281f98d24222a563b55ef4
parentf6da75edebdec948d0f93682237fe02cc55024fe (diff)
downloadgcc-a50023f9a8f3a7dcf40228d268463e5dbe3a8c55.zip
gcc-a50023f9a8f3a7dcf40228d268463e5dbe3a8c55.tar.gz
gcc-a50023f9a8f3a7dcf40228d268463e5dbe3a8c55.tar.bz2
re PR bootstrap/49680 (IRIX 6.5 bootstrap broken: SEGV in __register_frame_info_bases)
PR bootstrap/49680 * config/cris/cris.c (cris_asm_output_case_end): Robustify against stray notes and debug insns by using prev_nonnote_nondebug_insn instead of PREV_INSN. From-SVN: r176110
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/config/cris/cris.c22
2 files changed, 21 insertions, 8 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 436e037..fba2db9 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2011-07-10 Hans-Peter Nilsson <hp@axis.com>
+
+ PR bootstrap/49680
+ * config/cris/cris.c (cris_asm_output_case_end): Robustify against
+ stray notes and debug insns by using prev_nonnote_nondebug_insn
+ instead of PREV_INSN.
+
2011-07-09 Richard Henderson <rth@redhat.com>
* defaults.h (DWARF2_ADDR_SIZE, DWARF_OFFSET_SIZE,
diff --git a/gcc/config/cris/cris.c b/gcc/config/cris/cris.c
index 54a0f26..0c31826 100644
--- a/gcc/config/cris/cris.c
+++ b/gcc/config/cris/cris.c
@@ -2275,12 +2275,22 @@ cris_legitimate_pic_operand (rtx x)
void
cris_asm_output_case_end (FILE *stream, int num, rtx table)
{
+ /* Step back, over the label for the table, to the actual casejump and
+ assert that we find only what's expected. */
+ rtx whole_jump_insn = prev_nonnote_nondebug_insn (table);
+ gcc_assert (whole_jump_insn != NULL_RTX && LABEL_P (whole_jump_insn));
+ whole_jump_insn = prev_nonnote_nondebug_insn (whole_jump_insn);
+ gcc_assert (whole_jump_insn != NULL_RTX
+ && (JUMP_P (whole_jump_insn)
+ || (TARGET_V32 && INSN_P (whole_jump_insn)
+ && GET_CODE (PATTERN (whole_jump_insn)) == SEQUENCE)));
+ /* Get the pattern of the casejump, so we can extract the default label. */
+ whole_jump_insn = PATTERN (whole_jump_insn);
+
if (TARGET_V32)
{
- rtx whole_jump_insn = PATTERN (PREV_INSN (PREV_INSN (table)));
-
/* This can be a SEQUENCE, meaning the delay-slot of the jump is
- filled. */
+ filled. We also output the offset word a little differently. */
rtx parallel_jump
= (GET_CODE (whole_jump_insn) == SEQUENCE
? PATTERN (XVECEXP (whole_jump_insn, 0, 0)) : whole_jump_insn);
@@ -2298,11 +2308,7 @@ cris_asm_output_case_end (FILE *stream, int num, rtx table)
"\t.word %LL%d-%LL%d%s\n",
CODE_LABEL_NUMBER (XEXP
(XEXP
- (XEXP
- (XVECEXP
- (PATTERN
- (PREV_INSN
- (PREV_INSN (table))), 0, 0), 1),
+ (XEXP (XVECEXP (whole_jump_insn, 0, 0), 1),
2), 0)),
num,
(TARGET_PDEBUG ? "; default" : ""));