aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Sandiford <rsandifo@nildram.co.uk>2007-11-28 19:46:03 +0000
committerRichard Sandiford <rsandifo@gcc.gnu.org>2007-11-28 19:46:03 +0000
commiteae645b69a75b68ff2e4ccc1ad64bcbca23e3073 (patch)
treef4679ac3745b7ba7f25adf0b8a7f54cdf903cad4
parent36cefd39222098287e7bfbcfca5b2450673432fa (diff)
downloadgcc-eae645b69a75b68ff2e4ccc1ad64bcbca23e3073.zip
gcc-eae645b69a75b68ff2e4ccc1ad64bcbca23e3073.tar.gz
gcc-eae645b69a75b68ff2e4ccc1ad64bcbca23e3073.tar.bz2
re PR target/32406 (MIPS: FAIL in nestfunc-6.c at -O3)
gcc/ PR target/32406 * builtins.c (expand_builtin_nonlocal_goto): Also emit a use of GP register, if valid and fixed. Revert: 2007-06-21 David Daney <ddaney@avtrex.com> PR target/32406 * config/mips/mips.md (define_constants): Rename UNSPEC_EH_RECEIVER to UNSPEC_NONLOCAL_GOTO_RECEIVER globally. (exception_receiver): Renamed to ... (nonlocal_goto_receiver): ... this. From-SVN: r130493
-rw-r--r--gcc/ChangeLog15
-rw-r--r--gcc/builtins.c14
-rw-r--r--gcc/config/mips/mips.md6
3 files changed, 32 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 9262b26..34f3453 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,18 @@
+2007-11-28 Richard Sandiford <rsandifo@nildram.co.uk>
+
+ PR target/32406
+ * builtins.c (expand_builtin_nonlocal_goto): Also emit a use
+ of GP register, if valid and fixed.
+
+ Revert:
+ 2007-06-21 David Daney <ddaney@avtrex.com>
+
+ PR target/32406
+ * config/mips/mips.md (define_constants): Rename UNSPEC_EH_RECEIVER
+ to UNSPEC_NONLOCAL_GOTO_RECEIVER globally.
+ (exception_receiver): Renamed to ...
+ (nonlocal_goto_receiver): ... this.
+
2007-11-27 H.J. Lu <hongjiu.lu@intel.com>
Joey Ye <joey.ye@intel.com>
diff --git a/gcc/builtins.c b/gcc/builtins.c
index 5befd42..630cd25 100644
--- a/gcc/builtins.c
+++ b/gcc/builtins.c
@@ -909,6 +909,20 @@ expand_builtin_nonlocal_goto (tree exp)
not clear if really needed. */
emit_insn (gen_rtx_USE (VOIDmode, hard_frame_pointer_rtx));
emit_insn (gen_rtx_USE (VOIDmode, stack_pointer_rtx));
+
+ /* If the architecture is using a GP register, we must
+ conservatively assume that the target function makes use of it.
+ The prologue of functions with nonlocal gotos must therefore
+ initialize the GP register to the appropriate value, and we
+ must then make sure that this value is live at the point
+ of the jump. (Note that this doesn't necessarily apply
+ to targets with a nonlocal_goto pattern; they are free
+ to implement it in their own way. Note also that this is
+ a no-op if the GP register is a global invariant.) */
+ if ((unsigned) PIC_OFFSET_TABLE_REGNUM != INVALID_REGNUM
+ && fixed_regs[PIC_OFFSET_TABLE_REGNUM])
+ emit_insn (gen_rtx_USE (VOIDmode, pic_offset_table_rtx));
+
emit_indirect_jump (r_label);
}
diff --git a/gcc/config/mips/mips.md b/gcc/config/mips/mips.md
index 18879ec..f1225f61 100644
--- a/gcc/config/mips/mips.md
+++ b/gcc/config/mips/mips.md
@@ -30,7 +30,7 @@
(UNSPEC_GET_FNADDR 3)
(UNSPEC_BLOCKAGE 4)
(UNSPEC_CPRESTORE 5)
- (UNSPEC_NONLOCAL_GOTO_RECEIVER 6)
+ (UNSPEC_EH_RECEIVER 6)
(UNSPEC_EH_RETURN 7)
(UNSPEC_CONSTTABLE_INT 8)
(UNSPEC_CONSTTABLE_FLOAT 9)
@@ -5598,9 +5598,9 @@
DONE;
})
-(define_insn_and_split "nonlocal_goto_receiver"
+(define_insn_and_split "exception_receiver"
[(set (reg:SI 28)
- (unspec_volatile:SI [(const_int 0)] UNSPEC_NONLOCAL_GOTO_RECEIVER))]
+ (unspec_volatile:SI [(const_int 0)] UNSPEC_EH_RECEIVER))]
"TARGET_CALL_CLOBBERED_GP"
"#"
"&& reload_completed"