[LLVMdev] stack alignment (again)

Chris Lattner sabre at nondot.org
Sun Mar 30 10:21:43 PDT 2008


On Mar 28, 2008, at 5:17 PM, Chuck Rose III wrote:
> I was curious about the state of stack alignment on x86.  I noticed  
> there are a few bugs outstanding on the issue.  I recently added  
> some code which had the effect of throwing an extra function  
> parameter on our stack at runtime, a 4 byte pointer.
>
> Esp is now not 16-byte aligned, so instructions like unpcklps xmm1,  
> dword ptr [eps] cause grief.  My AllocaInstr instructions are told  
> to be 16 byte aligned, so the addition of a 4-byte parameter  
> shouldn’t have changed alignment on the objects.

Hi Chuck,

I think the basic problem is that the stack pointer on windows/linux  
is not guaranteed to be 16 byte aligned.  This means that any use of  
an instruction which requires 16-byte alignment (e.g. sse stuff) and  
accesses a frameindex can cause a problem.  The issue is that the  
frameindex will be marked as needing 16+ byte alignment, but the code  
generator just won't respect this.

The fix for this is somewhat simple: in Prolog/Epilog Insertion, the  
PEI pass should notice when frame indices have alignment greater than  
the guaranteed stack alignment.  When this happens, it should emit  
code into the prolog to dynamically align the stack (e.g. by emitting  
'and esp, -16').

This doesn't occur on the mac, because the stack is always guaranteed  
to be 16-byte aligned.

-Chris
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20080330/892d4fed/attachment.html>


More information about the llvm-dev mailing list