diff options
author | Richard Sandiford <rsandifo@nildram.co.uk> | 2007-11-28 19:46:03 +0000 |
---|---|---|
committer | Richard Sandiford <rsandifo@gcc.gnu.org> | 2007-11-28 19:46:03 +0000 |
commit | eae645b69a75b68ff2e4ccc1ad64bcbca23e3073 (patch) | |
tree | f4679ac3745b7ba7f25adf0b8a7f54cdf903cad4 /gcc/builtins.c | |
parent | 36cefd39222098287e7bfbcfca5b2450673432fa (diff) | |
download | gcc-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
Diffstat (limited to 'gcc/builtins.c')
-rw-r--r-- | gcc/builtins.c | 14 |
1 files changed, 14 insertions, 0 deletions
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); } |