[cfe-dev] Default stack alignment for x86 changed

Smith, Kevin B kevin.b.smith at intel.com
Thu Jan 15 10:38:18 PST 2015


Although alignof(double) on windows returns 8, the actual minimum stack alignment is still 4.  Here is a source example illustrating
this.

#include <stdlib.h>

int a = __alignof(double);

extern void crud1(int i, double *p);

void crud(void) {
  double dummy;
  crud1(0, &dummy);
}

Assembly code produced from VS 2012, compiling with cl -Fa -c -O2 crud.c
_DATA   SEGMENT
_a      DD      08H
_DATA   ENDS
PUBLIC  _crud
EXTRN   _crud1:PROC
; Function compile flags: /Ogtpy
;       COMDAT _crud
_TEXT   SEGMENT
_dummy$ = -8
_crud   PROC
; File d:\users\kbsmith1\tc_tmp1\crud.c
; Line 7
        sub     esp, 8
; Line 9
        lea     eax, DWORD PTR _dummy$[esp+8]
        push    eax
        push    0
        call    _crud1
; Line 10
        add     esp, 16
        ret     0

You can see that __alignof(double) produced 8 by the initialization value of a.  You can also see that there is no code at the beginning of function crud to
align the stack.  So, if it comes in on a 4 byte boundary, it will remain on a 4 byte boundary, and since it subs 8 from esp, if it comes in on an 8 byte boundary
it will stay on an 8 byte boundary.  Now consider the call to crud1.  This pushes two parameters, and then the call pushes the return address.  So, if the stack
comes in 8 byte aligned, at the entry to crud1, the stack is now only 4 byte aligned.

For this reason, in windows, although __alignof(double) is 8, it doesn't follow that the value of every double * must be such that the pointer value is 8 byte aligned.

Also, for IA32 on linux, 4 byte minimum stack alignment used to be specified by the Sys V ABI, which is pretty much the only one you can find references to on the web.  However, for quite a number of years, gcc's default on linux is to assure 16 byte stack alignment at function entry, so that every function that used SSE/SSE2 instructions (and might possibly need to spill) didn't have to perform dynamic stack alignment.  In gcc this is controlled by -mpreferred-stack-boundary=num option.  https://gcc.gnu.org/onlinedocs/gcc-3.2/gcc/i386-and-x86-64-Options.html, says the default for this option is 4, implying 16 byte stack alignment.

Kevin Smith

-----Original Message-----
From: cfe-dev-bounces at cs.uiuc.edu [mailto:cfe-dev-bounces at cs.uiuc.edu] On Behalf Of palparni
Sent: Thursday, January 15, 2015 9:34 AM
To: cfe-dev at cs.uiuc.edu
Subject: Re: [cfe-dev] Default stack alignment for x86 changed

I understand, so the change was made for Unix-based systems in mind.
Unfortunately the win32 x86 ABI seems to require doubles to be 64-bit
aligned. Could we perhaps keep the 8-byte alignment only for win32 targets?

Thanks,
Alpar



--
View this message in context: http://clang-developers.42468.n3.nabble.com/Default-stack-alignment-for-x86-changed-tp4043481p4043483.html
Sent from the Clang Developers mailing list archive at Nabble.com.
_______________________________________________
cfe-dev mailing list
cfe-dev at cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev




More information about the cfe-dev mailing list