]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
backport: re PR middle-end/17813 (ada bootstrap failure on i486-linux)
authorEric Botcazou <ebotcazou@libertysurf.fr>
Tue, 23 Nov 2004 13:12:35 +0000 (14:12 +0100)
committerEric Botcazou <ebotcazou@gcc.gnu.org>
Tue, 23 Nov 2004 13:12:35 +0000 (13:12 +0000)
Backport from mainline:
2004-10-18  Eric Botcazou  <ebotcazou@libertysurf.fr>
                    Roger Sayle  <roger@eyesopen.com>

PR middle-end/17813
* dojump.c (discard_pending_stack_adjust): New function.
(clear_pending_stack_adjust): Call it.
* expr.h (discard_pending_stack_adjust): Declare it.
* explow.c (emit_stack_save): Emit pending stack adjustments
before saving the stack pointer.
(emit_stack_restore): Discard pending stack adjustments before
restoring the stack pointer.

From-SVN: r91090

gcc/ChangeLog
gcc/dojump.c
gcc/explow.c
gcc/expr.h
gcc/testsuite/ChangeLog

index 3660e26520ac56d65d461050436761e50d40d55e..c33f9c5c9ef820ef43fba4c8814bc9f75ff313dd 100644 (file)
@@ -1,3 +1,18 @@
+2004-11-23  Eric Botcazou  <ebotcazou@libertysurf.fr>
+
+       Backport from mainline:
+       2004-10-18  Eric Botcazou  <ebotcazou@libertysurf.fr>
+                    Roger Sayle  <roger@eyesopen.com>
+
+       PR middle-end/17813
+       * dojump.c (discard_pending_stack_adjust): New function.
+       (clear_pending_stack_adjust): Call it.
+       * expr.h (discard_pending_stack_adjust): Declare it.
+       * explow.c (emit_stack_save): Emit pending stack adjustments
+       before saving the stack pointer.
+       (emit_stack_restore): Discard pending stack adjustments before
+       restoring the stack pointer.
+
 2004-11-23  Ralf Corsepius <ralf.corsepius@rtems.org>
 
        * config/c4x/t-rtems: New.
index 6b9569bb024dea12642a06f8328162c520d44634..f3b8928e07808a277cddb0df4cc4cfa0f50430f4 100644 (file)
@@ -48,6 +48,15 @@ init_pending_stack_adjust (void)
   pending_stack_adjust = 0;
 }
 
+/* Discard any pending stack adjustment.  This avoid relying on the
+   RTL optimizers to remove useless adjustments when we know the
+   stack pointer value is dead.  */
+void discard_pending_stack_adjust (void)
+{
+  stack_pointer_delta -= pending_stack_adjust;
+  pending_stack_adjust = 0;
+}
+
 /* When exiting from function, if safe, clear out any pending stack adjust
    so the adjustment won't get done.
 
@@ -62,10 +71,7 @@ clear_pending_stack_adjust (void)
       && EXIT_IGNORE_STACK
       && ! (DECL_INLINE (current_function_decl) && ! flag_no_inline)
       && ! flag_inline_functions)
-    {
-      stack_pointer_delta -= pending_stack_adjust,
-      pending_stack_adjust = 0;
-    }
+    discard_pending_stack_adjust ();
 }
 
 /* Pop any previously-pushed arguments that have not been popped yet.  */
index c1de4c85d22c46cd72b0e18754140794c50d7cdf..01eda84d6dea54c811dcca5a383f5ab2ca68f768 100644 (file)
@@ -951,6 +951,7 @@ emit_stack_save (enum save_level save_level, rtx *psave, rtx after)
       rtx seq;
 
       start_sequence ();
+      do_pending_stack_adjust ();
       /* We must validize inside the sequence, to ensure that any instructions
         created by the validize call also get moved to the right place.  */
       if (sa != 0)
@@ -962,6 +963,7 @@ emit_stack_save (enum save_level save_level, rtx *psave, rtx after)
     }
   else
     {
+      do_pending_stack_adjust ();
       if (sa != 0)
        sa = validize_mem (sa);
       emit_insn (fcn (sa, stack_pointer_rtx));
@@ -1018,6 +1020,8 @@ emit_stack_restore (enum save_level save_level, rtx sa, rtx after)
                    gen_rtx_MEM (BLKmode, stack_pointer_rtx)));
     }
 
+  discard_pending_stack_adjust ();
+
   if (after)
     {
       rtx seq;
index dd7ac9c6058b85b7fe918ce2e2dcebfbf6547811..ccf3a109f00a32b60fbfc16e7586be9056435936 100644 (file)
@@ -526,6 +526,9 @@ extern rtx expand_expr_real (tree, rtx, enum machine_mode,
    arguments waiting to be popped.  */
 extern void init_pending_stack_adjust (void);
 
+/* Discard any pending stack adjustment.  */
+extern void discard_pending_stack_adjust (void);
+
 /* When exiting from function, if safe, clear out any pending stack adjust
    so the adjustment won't get done.  */
 extern void clear_pending_stack_adjust (void);
index dd6930714380a27f018b6dc5a30935c0174a564a..8fac07defee22345cbbdfdd3a44ca05198c4aab5 100644 (file)
@@ -1,3 +1,7 @@
+2004-11-23  Eric Botcazou  <ebotcazou@libertysurf.fr>
+
+       * gcc.dg/setjmp-2.c: New test.
+
 2004-11-16  Joseph S. Myers  <joseph@codesourcery.com>
 
        PR c/18498