Thread (2 messages) 2 messages, 2 authors, 2017-01-13

Re: x86-64: Maintain 16-byte stack alignment

From: Josh Poimboeuf <hidden>
Date: 2017-01-13 05:07:14
Also in: lkml

On Thu, Jan 12, 2017 at 08:37:18PM -0800, Linus Torvalds wrote:
On Jan 12, 2017 8:28 PM, "Josh Poimboeuf" [off-list ref] 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
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help