lkml.org 
[lkml]   [2017]   [Aug]   [14]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v2 2/2] x86/build: Fix stack alignment for CLang
    Date
    Commit:

    d77698df39a5 ("x86/build: Specify stack alignment for clang")

    intended to use the same stack alignment for clang as with gcc.

    The two compilers use different options to configure the stack alignment
    (gcc: -mpreferred-stack-boundary=n, clang: -mstack-alignment=n).

    The above commit assumes that the clang option uses the same parameter
    type as gcc, i.e. that the alignment is specified as 2^n. However clang
    interprets the value of this option literally to use an alignment of n,
    in consequence the stack remains misaligned.

    Change the values used with -mstack-alignment to be the actual alignment
    instead of a power of two.

    Signed-off-by: Matthias Kaehlcke <mka@chromium.org>
    ---
    Changes in v2:
    - use the reworked [__]cc-option instead of cc-option-3, the macro now
    also evaluates the alternative option

    arch/x86/Makefile | 16 +++++-----------
    1 file changed, 5 insertions(+), 11 deletions(-)

    diff --git a/arch/x86/Makefile b/arch/x86/Makefile
    index 1e902f926be3..c7b25ba2d2fa 100644
    --- a/arch/x86/Makefile
    +++ b/arch/x86/Makefile
    @@ -11,14 +11,6 @@ else
    KBUILD_DEFCONFIG := $(ARCH)_defconfig
    endif

    -# For gcc stack alignment is specified with -mpreferred-stack-boundary,
    -# clang has the option -mstack-alignment for that purpose.
    -ifneq ($(call cc-option, -mpreferred-stack-boundary=4),)
    - cc_stack_align_opt := -mpreferred-stack-boundary
    -else ifneq ($(call cc-option, -mstack-alignment=4),)
    - cc_stack_align_opt := -mstack-alignment
    -endif
    -
    # How to compile the 16-bit code. Note we always compile for -march=i386;
    # that way we can complain to the user if the CPU is insufficient.
    #
    @@ -36,7 +28,9 @@ REALMODE_CFLAGS := $(M16_CFLAGS) -g -Os -D__KERNEL__ \

    REALMODE_CFLAGS += $(call __cc-option, $(CC), $(REALMODE_CFLAGS), -ffreestanding)
    REALMODE_CFLAGS += $(call __cc-option, $(CC), $(REALMODE_CFLAGS), -fno-stack-protector)
    -REALMODE_CFLAGS += $(call __cc-option, $(CC), $(REALMODE_CFLAGS), $(cc_stack_align_opt)=2)
    +REALMODE_CFLAGS += $(call __cc-option, $(CC), $(REALMODE_CFLAGS),\
    + -mpreferred-stack-boundary=2,-mstack-alignment=4)
    +
    export REALMODE_CFLAGS

    # BITS is used as extension for files which are available in a 32 bit
    @@ -76,7 +70,7 @@ ifeq ($(CONFIG_X86_32),y)
    # Align the stack to the register width instead of using the default
    # alignment of 16 bytes. This reduces stack usage and the number of
    # alignment instructions.
    - KBUILD_CFLAGS += $(call cc-option,$(cc_stack_align_opt)=2)
    + KBUILD_CFLAGS += $(call cc-option,-mpreferred-stack-boundary=2,-mstack-alignment=4)

    # Disable unit-at-a-time mode on pre-gcc-4.0 compilers, it makes gcc use
    # a lot more stack due to the lack of sharing of stacklots:
    @@ -115,7 +109,7 @@ else
    # default alignment which keep the stack *mis*aligned.
    # Furthermore an alignment to the register width reduces stack usage
    # and the number of alignment instructions.
    - KBUILD_CFLAGS += $(call cc-option,$(cc_stack_align_opt)=3)
    + KBUILD_CFLAGS += $(call cc-option,-mpreferred-stack-boundary=3,-mstack-alignment=8)

    # Use -mskip-rax-setup if supported.
    KBUILD_CFLAGS += $(call cc-option,-mskip-rax-setup)
    --
    2.14.0.434.g98096fd7a8-goog
    \
     
     \ /
      Last update: 2017-08-15 03:32    [W:4.544 / U:0.008 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site