From a50023f9a8f3a7dcf40228d268463e5dbe3a8c55 Mon Sep 17 00:00:00 2001 From: Hans-Peter Nilsson Date: Sat, 9 Jul 2011 22:35:43 +0000 Subject: [PATCH] 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 --- gcc/ChangeLog | 7 +++++++ gcc/config/cris/cris.c | 22 ++++++++++++++-------- 2 files changed, 21 insertions(+), 8 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 436e037cb36..fba2db93a9e 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2011-07-10 Hans-Peter Nilsson + + 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 * defaults.h (DWARF2_ADDR_SIZE, DWARF_OFFSET_SIZE, diff --git a/gcc/config/cris/cris.c b/gcc/config/cris/cris.c index 54a0f266cac..0c318268440 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" : "")); -- 2.30.2