]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR middle-end/28493 (Wrong address of stack object used for destructor call on...
authorJason Merrill <jason@redhat.com>
Tue, 12 Sep 2006 18:02:36 +0000 (14:02 -0400)
committerJason Merrill <jason@gcc.gnu.org>
Tue, 12 Sep 2006 18:02:36 +0000 (14:02 -0400)
        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

gcc/ChangeLog
gcc/builtins.c
gcc/testsuite/g++.dg/eh/unwind1.C [new file with mode: 0644]

index f9a3097cc92996c5580b45d44ac2cba037e454c4..1d41322072036111dc1c38deb290ad3871745161 100644 (file)
@@ -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.
index 5bcba14d7c277365ef6a6ff804c5fb219c5cb841..4684a5482adbacb2ecb5a2baccf183b1c03616b1 100644 (file)
@@ -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 (file)
index 0000000..da7aa98
--- /dev/null
@@ -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) { }
+}