This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
Re: A proposal to align GCC stack
- From: "H.J. Lu" <hjl at lucon dot org>
- To: Ross Ridge <rridge at csclub dot uwaterloo dot ca>
- Cc: gcc at gcc dot gnu dot org
- Date: Tue, 18 Dec 2007 18:07:22 -0800
- Subject: Re: A proposal to align GCC stack
- References: <20071218233125.5586173D25@caffeine.csclub.uwaterloo.ca>
On Tue, Dec 18, 2007 at 06:31:25PM -0500, Ross Ridge wrote:
> Ye, Joey writes:
> >i. STACK_BOUNDARY in bits, which is enforced by hardware, 32 for i386
> >and 64 for x86_64. It is the minimum stack boundary. It is fixed.
>
> Ross Ridge wrote:
> >Strictly speaking by the above definition it would be 8 for i386.
> >The hardware doesn't force the stack to be 32-bit aligned, it just
> >performs poorly if it isn't.
>
> Robert Dewar writes:
> >First, although for some types, the accesses may work, the optimizer
> >is allowed to assume that data is properly aligned, and could possibly
> >generate incorrect code ...
>
> That's not enforced by hardware.
>
> >Second, I am pretty sure there are SSE types that require
> >alignment at the hardware levell, even on the i386
>
> This isn't a restriction on stack aligment. It's a restriction on what
> kinds of machine types can be accessed on the stack.
>
> As I mentioned later in my message STACK_BOUNDARY shouldn't be defined in
> terms of hardware, but in terms of the ABI. While the i386 allows the
> stack pointer to bet set to any value, by convention the stack pointer
> is always kept 4-byte aligned at all times. GCC should never generate
> code that that would violate this requirement, even in leaf-functions
> or transitorily during the prologue/epilogue.
>From gcc internal manual:
-- Macro: STACK_BOUNDARY
Define this macro to the minimum alignment enforced by hardware
for the stack pointer on this machine. The definition is a C
expression for the desired alignment (measured in bits). This
value is used as a default if `PREFERRED_STACK_BOUNDARY' is not
defined. On most machines, this should be the same as
`PARM_BOUNDARY'.
Since x86 always push/pop stack by decrementing/incrementing address
size, it makes senses to define STACK_BOUNDARY as address size. It
has nothing to do with application binary interface (ABI).
>
> This is different than the proposed ABI_STACK_BOUNDARY macro which defines
The proposed ABI_STACK_BOUNDARY defines the value specified by the various
psABIs which gcc conforms.
> the possibily stricter aligment the ABI requires at function entry. Since
> most i386 ABIs don't require a stricter alignment, that has ment that
> SSE types couldn't be located on the stack. Currently you can get around
> this problem by changing the ABI using -fperferred-stack-boundary or by
No, gcc works around by setting
ix86_preferred_stack_boundary = 128;
by default.
> forcing an SSE compatible alignment using -mstackrealign or __attribute__
> ((force_align_arg_pointer)). Joey Ye's proposal is another solution
> to this problem where GCC would automatically force an SSE compatible
> aligment when SSE types are used on the stack.
>
Our proposal isn't just "another" solution. It is a solution for generic
stack alignment problems.
H.J.