From eae645b69a75b68ff2e4ccc1ad64bcbca23e3073 Mon Sep 17 00:00:00 2001 From: Richard Sandiford Date: Wed, 28 Nov 2007 19:46:03 +0000 Subject: [PATCH] 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 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 --- gcc/ChangeLog | 15 +++++++++++++++ gcc/builtins.c | 14 ++++++++++++++ gcc/config/mips/mips.md | 6 +++--- 3 files changed, 32 insertions(+), 3 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 9262b26e729..34f345377c5 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,18 @@ +2007-11-28 Richard Sandiford + + 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 + + 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 Joey Ye diff --git a/gcc/builtins.c b/gcc/builtins.c index 5befd422bb0..630cd2506ec 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 18879ec2e55..f1225f61386 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" -- 2.11.4.GIT