[LLVMdev] Stack alignment in JIT compiled code

Corrado Zoccolo czoccolo at gmail.com
Fri May 1 06:37:01 PDT 2009


On Linux x86_64, it is different. The x86-64 ABI says
(http://www.x86-64.org/viewvc/trunk/x86-64-ABI/low-level-sys-info.tex?revision=84&content-type=text%2Fplain):

>>
The end of the input argument area shall be aligned on a 16 byte boundary.
In other words, the value (%rsp - 8) is always a multiple of 16 when control is
transferred to the function entry point. The stack pointer, %rsp,
always points to
the end of the latest allocated stack frame.
<<

The libc itself assumes it in that way, and does no stack realignment.
You can look for example at snprintf disassembly, that dumps SSE
registers on the stack:
0x00002b4b13522b60 <snprintf+0>:        sub    $0xd8,%rsp
0x00002b4b13522b67 <snprintf+7>:        mov    %rcx,0x38(%rsp)
0x00002b4b13522b6c <snprintf+12>:       movzbl %al,%ecx
0x00002b4b13522b6f <snprintf+15>:       mov    %r8,0x40(%rsp)
0x00002b4b13522b74 <snprintf+20>:       lea    0x0(,%rcx,4),%rax
0x00002b4b13522b7c <snprintf+28>:       lea    50(%rip),%rcx        #
0x2b4b13522bb5 <snprintf+85>
0x00002b4b13522b83 <snprintf+35>:       mov    %r9,0x48(%rsp)
0x00002b4b13522b88 <snprintf+40>:       sub    %rax,%rcx
0x00002b4b13522b8b <snprintf+43>:       lea    0xcf(%rsp),%rax
0x00002b4b13522b93 <snprintf+51>:       jmpq   *%rcx
0x00002b4b13522b95 <snprintf+53>:       movaps %xmm7,0xfffffffffffffff1(%rax)
0x00002b4b13522b99 <snprintf+57>:       movaps %xmm6,0xffffffffffffffe1(%rax)
0x00002b4b13522b9d <snprintf+61>:       movaps %xmm5,0xffffffffffffffd1(%rax)
0x00002b4b13522ba1 <snprintf+65>:       movaps %xmm4,0xffffffffffffffc1(%rax)
0x00002b4b13522ba5 <snprintf+69>:       movaps %xmm3,0xffffffffffffffb1(%rax)
0x00002b4b13522ba9 <snprintf+73>:       movaps %xmm2,0xffffffffffffffa1(%rax)
0x00002b4b13522bad <snprintf+77>:       movaps %xmm1,0xffffffffffffff91(%rax)
0x00002b4b13522bb1 <snprintf+81>:       movaps %xmm0,0xffffffffffffff81(%rax)
0x00002b4b13522bb5 <snprintf+85>:       lea    0xe0(%rsp),%rax
0x00002b4b13522bbd <snprintf+93>:       mov    %rsp,%rcx
0x00002b4b13522bc0 <snprintf+96>:       movl   $0x18,(%rsp)
0x00002b4b13522bc7 <snprintf+103>:      movl   $0x30,0x4(%rsp)
0x00002b4b13522bcf <snprintf+111>:      mov    %rax,0x8(%rsp)
0x00002b4b13522bd4 <snprintf+116>:      lea    0x20(%rsp),%rax
0x00002b4b13522bd9 <snprintf+121>:      mov    %rax,0x10(%rsp)
0x00002b4b13522bde <snprintf+126>:      callq  0x2b4b1353eb60 <vsnprintf>
0x00002b4b13522be3 <snprintf+131>:      add    $0xd8,%rsp
0x00002b4b13522bea <snprintf+138>:      retq

Corrado

On Fri, May 1, 2009 at 12:48 AM, Anton Korobeynikov
<anton at korobeynikov.info> wrote:
> Hello, Simon
>
>> So far, i found no way to denote calls to the host function as aligned
>> or maintain stack alignment throughout the stack frame of the jit
>> compiled function. Further, the gcc front end (llvm-g++ (GCC) 4.2.1)
>> seems to ignore directives such as -mpreferred-stack-boundary.
> Mike is right. It depends on your subtarget:
>
> 1. If you're running stuff on Darwin, which has 16-byte aligned stack,
> then this is JIT bug
> 2. If you're running stuff on Linux/Windows which has 4 bytes aligned
> stack, then it is a bug in your host code. It should not assume any
> particular "extra" stack alignment as defined in platform ABI. And if
> it does require such extra alignment it should do stack realignment by
> itself (for example, LLVM itself does so if function is doing some
> vector math which requires SSE2 code).
>
> --
> With best regards, Anton Korobeynikov
> Faculty of Mathematics and Mechanics, Saint Petersburg State University
> _______________________________________________
> LLVM Developers mailing list
> LLVMdev at cs.uiuc.edu         http://llvm.cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
>



-- 
__________________________________________________________________________

dott. Corrado Zoccolo                          mailto:czoccolo at gmail.com
PhD - Department of Computer Science - University of Pisa, Italy
--------------------------------------------------------------------------




More information about the llvm-dev mailing list