diff options
author | Jason Merrill <jason@redhat.com> | 2006-09-12 14:02:36 -0400 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2006-09-12 14:02:36 -0400 |
commit | f01194138c6c3600edaa7356d36d3a3df4363547 (patch) | |
tree | f62b607052505a7afbe0b2deb379b3ffa886f155 /gcc | |
parent | c1a03f03117d454190e4f2e05cc1d68c3169132b (diff) | |
download | gcc-f01194138c6c3600edaa7356d36d3a3df4363547.zip gcc-f01194138c6c3600edaa7356d36d3a3df4363547.tar.gz gcc-f01194138c6c3600edaa7356d36d3a3df4363547.tar.bz2 |
re PR middle-end/28493 (Wrong address of stack object used for destructor call on PPC)
PR middle-end/28493
* builtins.c (expand_builtin_setjmp_receiver): Clobber
hard_frame_pointer_rtx after using it to update the frame pointer.
From-SVN: r116900
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/builtins.c | 7 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/eh/unwind1.C | 25 |
3 files changed, 37 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index f9a3097..1d41322 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2006-09-12 Jason Merrill <jason@redhat.com> + + PR middle-end/28493 + * builtins.c (expand_builtin_setjmp_receiver): Clobber + hard_frame_pointer_rtx after using it to update the frame pointer. + 2006-09-12 Roger Sayle <roger@eyesopen.com> * target-def.h (TARGET_ASM_OPEN_PAREN): Guard with an #ifndef. diff --git a/gcc/builtins.c b/gcc/builtins.c index 5bcba14..4684a54 100644 --- a/gcc/builtins.c +++ b/gcc/builtins.c @@ -679,7 +679,12 @@ expand_builtin_setjmp_receiver (rtx receiver_label ATTRIBUTE_UNUSED) #ifdef HAVE_nonlocal_goto if (! HAVE_nonlocal_goto) #endif - emit_move_insn (virtual_stack_vars_rtx, hard_frame_pointer_rtx); + { + emit_move_insn (virtual_stack_vars_rtx, hard_frame_pointer_rtx); + /* This might change the hard frame pointer in ways that aren't + apparent to early optimization passes, so force a clobber. */ + emit_insn (gen_rtx_CLOBBER (VOIDmode, hard_frame_pointer_rtx)); + } #if ARG_POINTER_REGNUM != HARD_FRAME_POINTER_REGNUM if (fixed_regs[ARG_POINTER_REGNUM]) diff --git a/gcc/testsuite/g++.dg/eh/unwind1.C b/gcc/testsuite/g++.dg/eh/unwind1.C new file mode 100644 index 0000000..da7aa98 --- /dev/null +++ b/gcc/testsuite/g++.dg/eh/unwind1.C @@ -0,0 +1,25 @@ +// PR middle-end/28493 + +extern "C" void abort (); + +struct Command *ptr; + +struct Command { + Command() { ptr = this; } + virtual ~Command() { if (ptr != this) abort(); } +}; + +void tryfunc() +{ + Command cmd; + throw 1; +} + +int main() +{ + try + { + tryfunc(); + } + catch (int) { } +} |