On Thu, Jan 12, 2017 at 08:37:18PM -0800, Linus Torvalds wrote:
> On Jan 12, 2017 8:28 PM, "Josh Poimboeuf" <jpoim...@redhat.com> wrote:
> 
> 
> The stack frame was always 16-byte aligned regardless of whether the
> buf array size was even or odd.
> 
> 
> Including with -fomit-frame-pointer?
> 
> With frame pointers, stack frames really are naturally 16 bytes, and then
> keeping the frame 16-byte aligned is just a matter of making any extra
> frame allocations or push/pop sequences that you do also be a multiple of
> 16 bytes.
> 
> But *without* frame pointers, the"native" frame size is just 8 bytes, and a
> function that doesn't need any other local storage and then calls another
> function (think various trivial wrapper functions that just add an argument
> and then munge the return value) would thus naturally cause the frame to
> become misaligned.
> 
> So then the compiler actually needs to start adding useless instructions
> just to keep the stack 16-byte aligned.

Disabling frame pointers didn't seem to help, but I finally got it to
misalign with a different test case.  I think it had been aligning the
array, so instead I made it push a register.


void otherfunc(void);

static inline void bar(int f)
{
        register void *__sp asm(_ASM_SP);
        asm volatile("call otherfunc" : "+r" (__sp) : "b"(f));
}

void foo(void)
{
        bar(5);
}


00000000000020f0 <foo>:
    20f0:       55                      push   %rbp
    20f1:       48 89 e5                mov    %rsp,%rbp
    20f4:       53                      push   %rbx
    20f5:       bb 05 00 00 00          mov    $0x5,%ebx
    20fa:       e8 00 00 00 00          callq  20ff <foo+0xf>
                        20fb: R_X86_64_PC32     otherfunc-0x4
    20ff:       5b                      pop    %rbx
    2100:       5d                      pop    %rbp
    2101:       c3                      retq   
    2102:       0f 1f 40 00             nopl   0x0(%rax)
    2106:       66 2e 0f 1f 84 00 00    nopw   %cs:0x0(%rax,%rax,1)
    210d:       00 00 00 

-- 
Josh

Reply via email to