]> gcc.gnu.org Git - gcc.git/commitdiff
Fix an unwinding bug for functions with dynamic stack frames.
authorWalter Lee <walt@tilera.com>
Wed, 7 Mar 2012 17:58:52 +0000 (17:58 +0000)
committerWalter Lee <walt@gcc.gnu.org>
Wed, 7 Mar 2012 17:58:52 +0000 (17:58 +0000)
* config/tilegx/tilegx.c (tilegx_expand_prologue): Don't generate
REG_CFA_* notes for the stack pointer.
(tilegx_expand_epilogue): Restore stack pointer by adjusting it by
EH_RETURN_STACKADJ_RTX.
* config/tilepro/tilepro.c (tilepro_expand_prologue): Don't
generate REG_CFA_* notes for the stack pointer.
(tilepro_expand_epilogue): Restore stack pointer by adjusting it
by EH_RETURN_STACKADJ_RTX.

From-SVN: r185070

gcc/ChangeLog
gcc/config/tilegx/tilegx.c
gcc/config/tilepro/tilepro.c

index 4dee2ea6666f0f73131514238ea961f05acaeb28..055832b510311cd2bd9370b0a145f5aa01c174e9 100644 (file)
@@ -1,3 +1,14 @@
+2012-03-07  Walter Lee  <walt@tilera.com>
+
+       * config/tilegx/tilegx.c (tilegx_expand_prologue): Don't generate
+       REG_CFA_* notes for the stack pointer.
+       (tilegx_expand_epilogue): Restore stack pointer by adjusting it by
+       EH_RETURN_STACKADJ_RTX.
+       * config/tilepro/tilepro.c (tilepro_expand_prologue): Don't
+       generate REG_CFA_* notes for the stack pointer.
+       (tilepro_expand_epilogue): Restore stack pointer by adjusting it
+       by EH_RETURN_STACKADJ_RTX.
+
 2012-03-07  Georg-Johann Lay  <avr@gjlay.de>
 
        * doc/invoke.texi (AVR Built-in Macros): Correct condition for
index fa739e36752881cfd0986a1a4f85253a8bb62c42..217682eaa66140bffbbdc0dde150a570f979777e 100644 (file)
@@ -3881,9 +3881,8 @@ tilegx_expand_prologue (void)
     {
       /* Copy the old stack pointer aside so we can save it later.  */
       sp_copy_regno = next_scratch_regno--;
-      insn = FRP (emit_move_insn (gen_rtx_REG (Pmode, sp_copy_regno),
-                                 stack_pointer_rtx));
-      add_reg_note (insn, REG_CFA_REGISTER, NULL_RTX);
+      emit_move_insn (gen_rtx_REG (Pmode, sp_copy_regno),
+                     stack_pointer_rtx);
     }
 
   if (tilegx_current_function_is_leaf ())
@@ -3925,8 +3924,8 @@ tilegx_expand_prologue (void)
        }
 
       /* Save our frame pointer for backtrace chaining.  */
-      FRP (frame_emit_store (sp_copy_regno, STACK_POINTER_REGNUM,
-                            chain_addr, cfa, cfa_offset));
+      emit_insn (gen_movdi (gen_frame_mem (DImode, chain_addr),
+                           gen_rtx_REG (DImode, sp_copy_regno)));
     }
 
   /* Compute where to start storing registers we need to save.  */
@@ -4067,16 +4066,7 @@ tilegx_expand_epilogue (bool sibcall_p)
 
   emit_insn (gen_blockage ());
 
-  if (crtl->calls_eh_return)
-    {
-      rtx r = compute_frame_addr (-total_size + UNITS_PER_WORD,
-                                 &next_scratch_regno);
-      insn = emit_move_insn (gen_lowpart (DImode, stack_pointer_rtx),
-                            gen_frame_mem (DImode, r));
-      RTX_FRAME_RELATED_P (insn) = 1;
-      REG_NOTES (insn) = cfa_restores;
-    }
-  else if (frame_pointer_needed)
+  if (frame_pointer_needed)
     {
       /* Restore the old stack pointer by copying from the frame
          pointer.  */
@@ -4100,6 +4090,16 @@ tilegx_expand_epilogue (bool sibcall_p)
                             cfa_restores);
     }
 
+  if (crtl->calls_eh_return)
+    {
+      if (TARGET_32BIT)
+       emit_insn (gen_sp_adjust_32bit (stack_pointer_rtx, stack_pointer_rtx,
+                                       EH_RETURN_STACKADJ_RTX));
+      else
+       emit_insn (gen_sp_adjust (stack_pointer_rtx, stack_pointer_rtx,
+                                 EH_RETURN_STACKADJ_RTX));
+    }
+
   /* Restore the old frame pointer.  */
   if (frame_pointer_needed)
     {
index 71b5807c5de7e0c290c7058d9f13e55c5314a396..011ac083addc115e0f15555e90dfb99b9c72da58 100644 (file)
@@ -3556,9 +3556,8 @@ tilepro_expand_prologue (void)
     {
       /* Copy the old stack pointer aside so we can save it later.  */
       sp_copy_regno = next_scratch_regno--;
-      insn = FRP (emit_move_insn (gen_rtx_REG (Pmode, sp_copy_regno),
-                                 stack_pointer_rtx));
-      add_reg_note (insn, REG_CFA_REGISTER, NULL_RTX);
+      emit_move_insn (gen_rtx_REG (Pmode, sp_copy_regno),
+                     stack_pointer_rtx);
     }
 
   if (tilepro_current_function_is_leaf ())
@@ -3600,8 +3599,8 @@ tilepro_expand_prologue (void)
        }
 
       /* Save our frame pointer for backtrace chaining.  */
-      FRP (frame_emit_store (sp_copy_regno, STACK_POINTER_REGNUM,
-                            chain_addr, cfa, cfa_offset));
+      emit_insn (gen_movsi (gen_frame_mem (SImode, chain_addr),
+                           gen_rtx_REG (SImode, sp_copy_regno)));
     }
 
   /* Compute where to start storing registers we need to save.  */
@@ -3742,16 +3741,7 @@ tilepro_expand_epilogue (bool sibcall_p)
 
   emit_insn (gen_blockage ());
 
-  if (crtl->calls_eh_return)
-    {
-      rtx r = compute_frame_addr (-total_size + UNITS_PER_WORD,
-                                 &next_scratch_regno);
-      insn = emit_move_insn (gen_rtx_REG (Pmode, STACK_POINTER_REGNUM),
-                            gen_frame_mem (Pmode, r));
-      RTX_FRAME_RELATED_P (insn) = 1;
-      REG_NOTES (insn) = cfa_restores;
-    }
-  else if (frame_pointer_needed)
+  if (frame_pointer_needed)
     {
       /* Restore the old stack pointer by copying from the frame
          pointer.  */
@@ -3767,6 +3757,10 @@ tilepro_expand_epilogue (bool sibcall_p)
                             cfa_restores);
     }
 
+  if (crtl->calls_eh_return)
+    emit_insn (gen_sp_adjust (stack_pointer_rtx, stack_pointer_rtx,
+                             EH_RETURN_STACKADJ_RTX));
+
   /* Restore the old frame pointer.  */
   if (frame_pointer_needed)
     {
This page took 0.087308 seconds and 5 git commands to generate.