This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug target/37010] -mno-accumulate-outgoing-args doesn't work with stack alignment
- From: "Joey dot ye at intel dot com" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: 4 Aug 2008 08:28:07 -0000
- Subject: [Bug target/37010] -mno-accumulate-outgoing-args doesn't work with stack alignment
- References: <bug-37010-682@http.gcc.gnu.org/bugzilla/>
- Reply-to: gcc-bugzilla at gcc dot gnu dot org
------- Comment #6 from Joey dot ye at intel dot com 2008-08-04 08:28 -------
(In reply to comment #3)
> Joey, when we compute frame layout, we don't count the duplicated
> return address pushed onto stack when DRAP is used. Also when we
> push return address, shouldn't we use -UNITS_PER_WORD, instead of
> -(STACK_BOUNDARY / BITS_PER_UNIT))? On MacOS, STACK_BOUNDARY is
> 128 on ia32. Does this patch make sense?
> --- ./i386.c.drap 2008-08-03 09:50:05.000000000 -0700
> +++ ./i386.c 2008-08-03 11:36:40.000000000 -0700
> @@ -7291,6 +7291,10 @@ ix86_compute_frame_layout (struct ix86_f
> if (stack_realign_fp)
> offset = (offset + stack_alignment_needed -1) & -stack_alignment_needed;
> + /* Duplicated return address when DRAP is used. */
> + if (crtl->drap_reg && crtl->stack_realign_needed)
> + offset += UNITS_PER_WORD;
> +
> /* Register save area */
> offset += frame->nregs * UNITS_PER_WORD;
> @@ -7692,8 +7696,7 @@ ix86_expand_prologue (void)
> expand_builtin_return_addr etc. */
> x = crtl->drap_reg;
> x = gen_frame_mem (Pmode,
> - plus_constant (x,
> - -(STACK_BOUNDARY / BITS_PER_UNIT)));
> + plus_constant (x, -UNITS_PER_WORD));
> insn = emit_insn (gen_push (x));
> RTX_FRAME_RELATED_P (insn) = 1;
> }
I suspect this patch is incorrect.
/* Skip return address and saved base pointer. */
offset = frame_pointer_needed ? UNITS_PER_WORD * 2 : UNITS_PER_WORD;
already count the duplicated address in. I'm analyzing what makes this case
fail.
--
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=37010