diff mbox

PATCH: PR target/53383: Allow -mpreferred-stack-boundary=3 on x86-64

Message ID CAMe9rOquimWjh0bUKR=yFSBh7T3mkek0UN0+nSePRxFrm1q8Xw@mail.gmail.com
State New
Headers show

Commit Message

H.J. Lu May 25, 2012, 1:53 p.m. UTC
On Sun, May 20, 2012 at 7:47 AM, H.J. Lu <hongjiu.lu@intel.com> wrote:
> Hi,
>
> This patch allows -mpreferred-stack-boundary=3 on x86-64 when SSE is
> disabled.  Since this option changes ABI, I also added a warning for
> -mpreferred-stack-boundary=3.  OK for trunk?
>
> Thanks.
>
>
> H.J.
> ----
>        PR target/53383
>        * doc/invoke.texi: Add a warning for -mpreferred-stack-boundary=3.
>
>        * config/i386/i386.c (ix86_option_override_internal): Allow
>        -mpreferred-stack-boundary=3 for 64-bit if SSE is disenabled.
>
>        * config/i386/i386.h (MIN_STACK_BOUNDARY): Set to 64 for 64-bit
>        if SSE is disenabled.
>
> diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
> index eca542c..338d387 100644
> --- a/gcc/config/i386/i386.c
> +++ b/gcc/config/i386/i386.c
> @@ -3660,7 +3660,7 @@ ix86_option_override_internal (bool main_args_p)
>   ix86_preferred_stack_boundary = PREFERRED_STACK_BOUNDARY_DEFAULT;
>   if (global_options_set.x_ix86_preferred_stack_boundary_arg)
>     {
> -      int min = (TARGET_64BIT ? 4 : 2);
> +      int min = (TARGET_64BIT ? (TARGET_SSE ? 4 : 3) : 2);
>       int max = (TARGET_SEH ? 4 : 12);
>
>       if (ix86_preferred_stack_boundary_arg < min
> diff --git a/gcc/config/i386/i386.h b/gcc/config/i386/i386.h
> index ddb3645..f7f13d2 100644
> --- a/gcc/config/i386/i386.h
> +++ b/gcc/config/i386/i386.h
> @@ -708,7 +708,7 @@ enum target_cpu_default
>  #define MAIN_STACK_BOUNDARY (TARGET_64BIT ? 128 : 32)
>
>  /* Minimum stack boundary.  */
> -#define MIN_STACK_BOUNDARY (TARGET_64BIT ? 128 : 32)
> +#define MIN_STACK_BOUNDARY (TARGET_64BIT ? (TARGET_SSE ? 128 : 64) : 32)
>
>  /* Boundary (in *bits*) on which the stack pointer prefers to be
>    aligned; the compiler cannot rely on having this alignment.  */
> diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi
> index 4c5c79f..daa1f3a 100644
> --- a/gcc/doc/invoke.texi
> +++ b/gcc/doc/invoke.texi
> @@ -13521,6 +13521,12 @@ Attempt to keep the stack boundary aligned to a 2 raised to @var{num}
>  byte boundary.  If @option{-mpreferred-stack-boundary} is not specified,
>  the default is 4 (16 bytes or 128 bits).
>
> +@strong{Warning:} When generating code for the x86-64 architecture with
> +SSE extensions disabled, @option{-mpreferred-stack-boundary=3} can be
> +used to keep the stack boundary aligned to 8 byte boundary.  You must
> +build all modules with @option{-mpreferred-stack-boundary=3}, including
> +any libraries.  This includes the system libraries and startup modules.
> +
>  @item -mincoming-stack-boundary=@var{num}
>  @opindex mincoming-stack-boundary
>  Assume the incoming stack is aligned to a 2 raised to @var{num} byte

I applied the above patch to GCC 4.7 and the following patch to
Linux kernel 3.4.0.  Kernel boots and runs correctly.  Is the patch
OK for trunk?

Thanks.

Comments

H.J. Lu May 30, 2012, 6:13 p.m. UTC | #1
On Fri, May 25, 2012 at 6:53 AM, H.J. Lu <hjl.tools@gmail.com> wrote:
> On Sun, May 20, 2012 at 7:47 AM, H.J. Lu <hongjiu.lu@intel.com> wrote:
>> Hi,
>>
>> This patch allows -mpreferred-stack-boundary=3 on x86-64 when SSE is
>> disabled.  Since this option changes ABI, I also added a warning for
>> -mpreferred-stack-boundary=3.  OK for trunk?
>>
>> Thanks.
>>
>>
>> H.J.
>> ----
>>        PR target/53383
>>        * doc/invoke.texi: Add a warning for -mpreferred-stack-boundary=3.
>>
>>        * config/i386/i386.c (ix86_option_override_internal): Allow
>>        -mpreferred-stack-boundary=3 for 64-bit if SSE is disenabled.
>>
>>        * config/i386/i386.h (MIN_STACK_BOUNDARY): Set to 64 for 64-bit
>>        if SSE is disenabled.
>>
>> diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
>> index eca542c..338d387 100644
>> --- a/gcc/config/i386/i386.c
>> +++ b/gcc/config/i386/i386.c
>> @@ -3660,7 +3660,7 @@ ix86_option_override_internal (bool main_args_p)
>>   ix86_preferred_stack_boundary = PREFERRED_STACK_BOUNDARY_DEFAULT;
>>   if (global_options_set.x_ix86_preferred_stack_boundary_arg)
>>     {
>> -      int min = (TARGET_64BIT ? 4 : 2);
>> +      int min = (TARGET_64BIT ? (TARGET_SSE ? 4 : 3) : 2);
>>       int max = (TARGET_SEH ? 4 : 12);
>>
>>       if (ix86_preferred_stack_boundary_arg < min
>> diff --git a/gcc/config/i386/i386.h b/gcc/config/i386/i386.h
>> index ddb3645..f7f13d2 100644
>> --- a/gcc/config/i386/i386.h
>> +++ b/gcc/config/i386/i386.h
>> @@ -708,7 +708,7 @@ enum target_cpu_default
>>  #define MAIN_STACK_BOUNDARY (TARGET_64BIT ? 128 : 32)
>>
>>  /* Minimum stack boundary.  */
>> -#define MIN_STACK_BOUNDARY (TARGET_64BIT ? 128 : 32)
>> +#define MIN_STACK_BOUNDARY (TARGET_64BIT ? (TARGET_SSE ? 128 : 64) : 32)
>>
>>  /* Boundary (in *bits*) on which the stack pointer prefers to be
>>    aligned; the compiler cannot rely on having this alignment.  */
>> diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi
>> index 4c5c79f..daa1f3a 100644
>> --- a/gcc/doc/invoke.texi
>> +++ b/gcc/doc/invoke.texi
>> @@ -13521,6 +13521,12 @@ Attempt to keep the stack boundary aligned to a 2 raised to @var{num}
>>  byte boundary.  If @option{-mpreferred-stack-boundary} is not specified,
>>  the default is 4 (16 bytes or 128 bits).
>>
>> +@strong{Warning:} When generating code for the x86-64 architecture with
>> +SSE extensions disabled, @option{-mpreferred-stack-boundary=3} can be
>> +used to keep the stack boundary aligned to 8 byte boundary.  You must
>> +build all modules with @option{-mpreferred-stack-boundary=3}, including
>> +any libraries.  This includes the system libraries and startup modules.
>> +
>>  @item -mincoming-stack-boundary=@var{num}
>>  @opindex mincoming-stack-boundary
>>  Assume the incoming stack is aligned to a 2 raised to @var{num} byte
>
> I applied the above patch to GCC 4.7 and the following patch to
> Linux kernel 3.4.0.  Kernel boots and runs correctly.  Is the patch
> OK for trunk?
>
> Thanks.
>
> --
> H.J.
> ---
> diff --git a/arch/x86/Makefile b/arch/x86/Makefile
> index 94e91e4..cd4a4f7 100644
> --- a/arch/x86/Makefile
> +++ b/arch/x86/Makefile
> @@ -49,6 +49,9 @@ else
>         KBUILD_AFLAGS += -m64
>         KBUILD_CFLAGS += -m64
>
> +       # Use -mpreferred-stack-boundary=3 if supported.
> +       KBUILD_CFLAGS += $(call cc-option,-mno-sse -mpreferred-stack-boundary=3)
> +
>         # FIXME - should be integrated in Makefile.cpu (Makefile_32.cpu)
>         cflags-$(CONFIG_MK8) += $(call cc-option,-march=k8)
>         cflags-$(CONFIG_MPSC) += $(call cc-option,-march=nocona)

Ping
H.J. Lu June 22, 2012, 1:46 p.m. UTC | #2
On Wed, May 30, 2012 at 11:13 AM, H.J. Lu <hjl.tools@gmail.com> wrote:
> On Fri, May 25, 2012 at 6:53 AM, H.J. Lu <hjl.tools@gmail.com> wrote:
>> On Sun, May 20, 2012 at 7:47 AM, H.J. Lu <hongjiu.lu@intel.com> wrote:
>>> Hi,
>>>
>>> This patch allows -mpreferred-stack-boundary=3 on x86-64 when SSE is
>>> disabled.  Since this option changes ABI, I also added a warning for
>>> -mpreferred-stack-boundary=3.  OK for trunk?
>>>
>>> Thanks.
>>>
>>>
>>> H.J.
>>> ----
>>>        PR target/53383
>>>        * doc/invoke.texi: Add a warning for -mpreferred-stack-boundary=3.
>>>
>>>        * config/i386/i386.c (ix86_option_override_internal): Allow
>>>        -mpreferred-stack-boundary=3 for 64-bit if SSE is disenabled.
>>>
>>>        * config/i386/i386.h (MIN_STACK_BOUNDARY): Set to 64 for 64-bit
>>>        if SSE is disenabled.
>>>
>>> diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
>>> index eca542c..338d387 100644
>>> --- a/gcc/config/i386/i386.c
>>> +++ b/gcc/config/i386/i386.c
>>> @@ -3660,7 +3660,7 @@ ix86_option_override_internal (bool main_args_p)
>>>   ix86_preferred_stack_boundary = PREFERRED_STACK_BOUNDARY_DEFAULT;
>>>   if (global_options_set.x_ix86_preferred_stack_boundary_arg)
>>>     {
>>> -      int min = (TARGET_64BIT ? 4 : 2);
>>> +      int min = (TARGET_64BIT ? (TARGET_SSE ? 4 : 3) : 2);
>>>       int max = (TARGET_SEH ? 4 : 12);
>>>
>>>       if (ix86_preferred_stack_boundary_arg < min
>>> diff --git a/gcc/config/i386/i386.h b/gcc/config/i386/i386.h
>>> index ddb3645..f7f13d2 100644
>>> --- a/gcc/config/i386/i386.h
>>> +++ b/gcc/config/i386/i386.h
>>> @@ -708,7 +708,7 @@ enum target_cpu_default
>>>  #define MAIN_STACK_BOUNDARY (TARGET_64BIT ? 128 : 32)
>>>
>>>  /* Minimum stack boundary.  */
>>> -#define MIN_STACK_BOUNDARY (TARGET_64BIT ? 128 : 32)
>>> +#define MIN_STACK_BOUNDARY (TARGET_64BIT ? (TARGET_SSE ? 128 : 64) : 32)
>>>
>>>  /* Boundary (in *bits*) on which the stack pointer prefers to be
>>>    aligned; the compiler cannot rely on having this alignment.  */
>>> diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi
>>> index 4c5c79f..daa1f3a 100644
>>> --- a/gcc/doc/invoke.texi
>>> +++ b/gcc/doc/invoke.texi
>>> @@ -13521,6 +13521,12 @@ Attempt to keep the stack boundary aligned to a 2 raised to @var{num}
>>>  byte boundary.  If @option{-mpreferred-stack-boundary} is not specified,
>>>  the default is 4 (16 bytes or 128 bits).
>>>
>>> +@strong{Warning:} When generating code for the x86-64 architecture with
>>> +SSE extensions disabled, @option{-mpreferred-stack-boundary=3} can be
>>> +used to keep the stack boundary aligned to 8 byte boundary.  You must
>>> +build all modules with @option{-mpreferred-stack-boundary=3}, including
>>> +any libraries.  This includes the system libraries and startup modules.
>>> +
>>>  @item -mincoming-stack-boundary=@var{num}
>>>  @opindex mincoming-stack-boundary
>>>  Assume the incoming stack is aligned to a 2 raised to @var{num} byte
>>
>> I applied the above patch to GCC 4.7 and the following patch to
>> Linux kernel 3.4.0.  Kernel boots and runs correctly.  Is the patch
>> OK for trunk?
>>
>> Thanks.
>>
>> --
>> H.J.
>> ---
>> diff --git a/arch/x86/Makefile b/arch/x86/Makefile
>> index 94e91e4..cd4a4f7 100644
>> --- a/arch/x86/Makefile
>> +++ b/arch/x86/Makefile
>> @@ -49,6 +49,9 @@ else
>>         KBUILD_AFLAGS += -m64
>>         KBUILD_CFLAGS += -m64
>>
>> +       # Use -mpreferred-stack-boundary=3 if supported.
>> +       KBUILD_CFLAGS += $(call cc-option,-mno-sse -mpreferred-stack-boundary=3)
>> +
>>         # FIXME - should be integrated in Makefile.cpu (Makefile_32.cpu)
>>         cflags-$(CONFIG_MK8) += $(call cc-option,-march=k8)
>>         cflags-$(CONFIG_MPSC) += $(call cc-option,-march=nocona)
>
> Ping
>

Ping.

I have been running Linux kernel compiled with this option for
weeks.  Since -mpreferred-stack-boundary=3 will only be allowed
with -mno-sse, it will be used only with incompatible ABI.  Any
objections to this patch?

Thanks.
Richard Henderson June 22, 2012, 5:07 p.m. UTC | #3
On 06/22/2012 06:46 AM, H.J. Lu wrote:
> Ping.
> 
> I have been running Linux kernel compiled with this option for
> weeks.  Since -mpreferred-stack-boundary=3 will only be allowed
> with -mno-sse, it will be used only with incompatible ABI.  Any
> objections to this patch?
> 
> Thanks.

The patch is ok.


r~
Jan Hubicka June 22, 2012, 5:11 p.m. UTC | #4
> >>> diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi
> >>> index 4c5c79f..daa1f3a 100644
> >>> --- a/gcc/doc/invoke.texi
> >>> +++ b/gcc/doc/invoke.texi
> >>> @@ -13521,6 +13521,12 @@ Attempt to keep the stack boundary aligned to a 2 raised to @var{num}
> >>>  byte boundary.  If @option{-mpreferred-stack-boundary} is not specified,
> >>>  the default is 4 (16 bytes or 128 bits).
> >>>
> >>> +@strong{Warning:} When generating code for the x86-64 architecture with
> >>> +SSE extensions disabled, @option{-mpreferred-stack-boundary=3} can be
> >>> +used to keep the stack boundary aligned to 8 byte boundary.  You must
> >>> +build all modules with @option{-mpreferred-stack-boundary=3}, including
> >>> +any libraries.  This includes the system libraries and startup modules.

I would suggest to re-word this paragraph.
Perhaps something along lines

x86-64 ABI require 16 byte stack alignment. It is possible to compile code with
-mpreferred-stack-boundary=3 where stack alignment is 8 bytes only.  This is
ABI incompatible and intended to be used in controlled environment where stack
space is important limitation. It may lead to wrong code when functions
compiled with 16 byte stack alignment (such as functions from a standard
library) are called with misaligned stack.  In this case the of SSE registers
may lead to misaligned memory access traps. In addition, va-arg will
incorrectly handle 16 byte aligned objects (including x87 long double and
__int128) leading to wrong results rather than traps.

Fell free to fix my english and extend it.  I just want to make it sure
that the paragraph explains how things break (i.e. by calling something
with default stack alignment from function with 8byte alignment.) and that
it can break for non-SSE code, too, when using va-args on 16 byte aligned
objects.

The patch is fine with this change.  Please also add change to news.html with
similar explanation.

Honza
> >>> +
> >>>  @item -mincoming-stack-boundary=@var{num}
> >>>  @opindex mincoming-stack-boundary
> >>>  Assume the incoming stack is aligned to a 2 raised to @var{num} byte
> >>
> >> I applied the above patch to GCC 4.7 and the following patch to
> >> Linux kernel 3.4.0.  Kernel boots and runs correctly.  Is the patch
> >> OK for trunk?
> >>
> >> Thanks.
> >>
> >> --
> >> H.J.
> >> ---
> >> diff --git a/arch/x86/Makefile b/arch/x86/Makefile
> >> index 94e91e4..cd4a4f7 100644
> >> --- a/arch/x86/Makefile
> >> +++ b/arch/x86/Makefile
> >> @@ -49,6 +49,9 @@ else
> >>         KBUILD_AFLAGS += -m64
> >>         KBUILD_CFLAGS += -m64
> >>
> >> +       # Use -mpreferred-stack-boundary=3 if supported.
> >> +       KBUILD_CFLAGS += $(call cc-option,-mno-sse -mpreferred-stack-boundary=3)
> >> +
> >>         # FIXME - should be integrated in Makefile.cpu (Makefile_32.cpu)
> >>         cflags-$(CONFIG_MK8) += $(call cc-option,-march=k8)
> >>         cflags-$(CONFIG_MPSC) += $(call cc-option,-march=nocona)
> >
> > Ping
> >
> 
> Ping.
> 
> I have been running Linux kernel compiled with this option for
> weeks.  Since -mpreferred-stack-boundary=3 will only be allowed
> with -mno-sse, it will be used only with incompatible ABI.  Any
> objections to this patch?
> 
> Thanks.
> 
> 
> -- 
> H.J.
diff mbox

Patch

diff --git a/arch/x86/Makefile b/arch/x86/Makefile
index 94e91e4..cd4a4f7 100644
--- a/arch/x86/Makefile
+++ b/arch/x86/Makefile
@@ -49,6 +49,9 @@  else
         KBUILD_AFLAGS += -m64
         KBUILD_CFLAGS += -m64

+	# Use -mpreferred-stack-boundary=3 if supported.
+	KBUILD_CFLAGS += $(call cc-option,-mno-sse -mpreferred-stack-boundary=3)
+
         # FIXME - should be integrated in Makefile.cpu (Makefile_32.cpu)
         cflags-$(CONFIG_MK8) += $(call cc-option,-march=k8)
         cflags-$(CONFIG_MPSC) += $(call cc-option,-march=nocona)