This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [PATCH] Fix PR middle-end/17813
- From: Eric Botcazou <ebotcazou at libertysurf dot fr>
- To: gcc-patches at gcc dot gnu dot org
- Date: Tue, 19 Oct 2004 00:01:46 +0200
- Subject: Re: [PATCH] Fix PR middle-end/17813
- References: <200410162252.58887.ebotcazou@libertysurf.fr>
> This is the Ada compiler bootstrap failure on i586 and below, which again
> pertains to stack adjustments. cstand.adb:Create_Standard is miscompiled
> because a stack adjustment is emitted right after a
> __builtin_stack_restore.
Here's the final patch I commited to mainline. Bootstrapped/regtested (all
languages except treelang with upcoming patch for PR middle-end/18045) on
i486-mandrake-linux-gnu, approved offline by Roger.
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.
--
Eric Botcazou
Index: dojump.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/dojump.c,v
retrieving revision 1.29
diff -u -p -r1.29 dojump.c
--- dojump.c 8 Sep 2004 07:47:45 -0000 1.29
+++ dojump.c 18 Oct 2004 18:48:23 -0000
@@ -50,6 +50,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.
@@ -64,10 +73,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: explow.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/explow.c,v
retrieving revision 1.139
diff -u -p -r1.139 explow.c
--- explow.c 8 Sep 2004 08:05:13 -0000 1.139
+++ explow.c 18 Oct 2004 18:48:33 -0000
@@ -965,6 +965,7 @@ emit_stack_save (enum save_level save_le
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)
@@ -976,6 +977,7 @@ emit_stack_save (enum save_level save_le
}
else
{
+ do_pending_stack_adjust ();
if (sa != 0)
sa = validize_mem (sa);
emit_insn (fcn (sa, stack_pointer_rtx));
@@ -1032,6 +1034,8 @@ emit_stack_restore (enum save_level save
gen_rtx_MEM (BLKmode, stack_pointer_rtx)));
}
+ discard_pending_stack_adjust ();
+
if (after)
{
rtx seq;
Index: expr.h
===================================================================
RCS file: /cvs/gcc/gcc/gcc/expr.h,v
retrieving revision 1.171
diff -u -p -r1.171 expr.h
--- expr.h 8 Sep 2004 18:44:56 -0000 1.171
+++ expr.h 18 Oct 2004 18:48:36 -0000
@@ -499,6 +499,9 @@ extern void expand_var (tree);
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);