powerpc/kbuild: Use flags variables rather than overriding LD/CC/AS

The powerpc toolchain can compile combinations of 32/64 bit and
big/little endian, so it's convenient to consider, e.g.,

  `CC -m64 -mbig-endian`

To be the C compiler for the purpose of invoking it to build target
artifacts. So overriding the CC variable to include these flags works
for this purpose.

Unfortunately that is not compatible with the way the proposed new
Kconfig macro language will work.

After previous patches in this series, these flags can be carefully
passed in using flags instead.

Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
This commit is contained in:
Nicholas Piggin 2018-05-30 22:19:21 +10:00 committed by Michael Ellerman
parent af3901cbbd
commit 1421dc6d48
3 changed files with 34 additions and 12 deletions

View file

@ -75,13 +75,15 @@ endif
endif endif
ifeq ($(CONFIG_CPU_LITTLE_ENDIAN),y) ifeq ($(CONFIG_CPU_LITTLE_ENDIAN),y)
override LD += -EL KBUILD_CFLAGS += -mlittle-endian
LDFLAGS += -EL
LDEMULATION := lppc LDEMULATION := lppc
GNUTARGET := powerpcle GNUTARGET := powerpcle
MULTIPLEWORD := -mno-multiple MULTIPLEWORD := -mno-multiple
KBUILD_CFLAGS_MODULE += $(call cc-option,-mno-save-toc-indirect) KBUILD_CFLAGS_MODULE += $(call cc-option,-mno-save-toc-indirect)
else else
override LD += -EB KBUILD_CFLAGS += $(call cc-option,-mbig-endian)
LDFLAGS += -EB
LDEMULATION := ppc LDEMULATION := ppc
GNUTARGET := powerpc GNUTARGET := powerpc
MULTIPLEWORD := -mmultiple MULTIPLEWORD := -mmultiple
@ -94,19 +96,19 @@ aflags-$(CONFIG_CPU_BIG_ENDIAN) += $(call cc-option,-mabi=elfv1)
aflags-$(CONFIG_CPU_LITTLE_ENDIAN) += -mabi=elfv2 aflags-$(CONFIG_CPU_LITTLE_ENDIAN) += -mabi=elfv2
endif endif
cflags-$(CONFIG_CPU_LITTLE_ENDIAN) += -mlittle-endian
cflags-$(CONFIG_CPU_BIG_ENDIAN) += $(call cc-option,-mbig-endian)
ifneq ($(cc-name),clang) ifneq ($(cc-name),clang)
cflags-$(CONFIG_CPU_LITTLE_ENDIAN) += -mno-strict-align cflags-$(CONFIG_CPU_LITTLE_ENDIAN) += -mno-strict-align
endif endif
cflags-$(CONFIG_CPU_BIG_ENDIAN) += $(call cc-option,-mbig-endian)
cflags-$(CONFIG_CPU_LITTLE_ENDIAN) += -mlittle-endian
aflags-$(CONFIG_CPU_BIG_ENDIAN) += $(call cc-option,-mbig-endian) aflags-$(CONFIG_CPU_BIG_ENDIAN) += $(call cc-option,-mbig-endian)
aflags-$(CONFIG_CPU_LITTLE_ENDIAN) += -mlittle-endian aflags-$(CONFIG_CPU_LITTLE_ENDIAN) += -mlittle-endian
ifeq ($(HAS_BIARCH),y) ifeq ($(HAS_BIARCH),y)
override AS += -a$(BITS) KBUILD_CFLAGS += -m$(BITS)
override LD += -m elf$(BITS)$(LDEMULATION) KBUILD_AFLAGS += -m$(BITS) -Wl,-a$(BITS)
override CC += -m$(BITS) LDFLAGS += -m elf$(BITS)$(LDEMULATION)
KBUILD_ARFLAGS += --target=elf$(BITS)-$(GNUTARGET) KBUILD_ARFLAGS += --target=elf$(BITS)-$(GNUTARGET)
endif endif

View file

@ -7,17 +7,21 @@ set -o pipefail
# To debug, uncomment the following line # To debug, uncomment the following line
# set -x # set -x
# -mprofile-kernel is only supported on 64le, so this should not be invoked
# for other targets. Therefore we can pass in -m64 and -mlittle-endian
# explicitly, to take care of toolchains defaulting to other targets.
# Test whether the compile option -mprofile-kernel exists and generates # Test whether the compile option -mprofile-kernel exists and generates
# profiling code (ie. a call to _mcount()). # profiling code (ie. a call to _mcount()).
echo "int func() { return 0; }" | \ echo "int func() { return 0; }" | \
$* -S -x c -O2 -p -mprofile-kernel - -o - 2> /dev/null | \ $* -m64 -mlittle-endian -S -x c -O2 -p -mprofile-kernel - -o - \
grep -q "_mcount" 2> /dev/null | grep -q "_mcount"
# Test whether the notrace attribute correctly suppresses calls to _mcount(). # Test whether the notrace attribute correctly suppresses calls to _mcount().
echo -e "#include <linux/compiler.h>\nnotrace int func() { return 0; }" | \ echo -e "#include <linux/compiler.h>\nnotrace int func() { return 0; }" | \
$* -S -x c -O2 -p -mprofile-kernel - -o - 2> /dev/null | \ $* -m64 -mlittle-endian -S -x c -O2 -p -mprofile-kernel - -o - \
grep -q "_mcount" && \ 2> /dev/null | grep -q "_mcount" && \
exit 1 exit 1
echo "OK" echo "OK"

View file

@ -266,13 +266,29 @@ if ($arch eq "x86_64") {
$objcopy .= " -O elf32-sh-linux"; $objcopy .= " -O elf32-sh-linux";
} elsif ($arch eq "powerpc") { } elsif ($arch eq "powerpc") {
my $ldemulation;
$local_regex = "^[0-9a-fA-F]+\\s+t\\s+(\\.?\\S+)"; $local_regex = "^[0-9a-fA-F]+\\s+t\\s+(\\.?\\S+)";
# See comment in the sparc64 section for why we use '\w'. # See comment in the sparc64 section for why we use '\w'.
$function_regex = "^([0-9a-fA-F]+)\\s+<(\\.?\\w*?)>:"; $function_regex = "^([0-9a-fA-F]+)\\s+<(\\.?\\w*?)>:";
$mcount_regex = "^\\s*([0-9a-fA-F]+):.*\\s\\.?_mcount\$"; $mcount_regex = "^\\s*([0-9a-fA-F]+):.*\\s\\.?_mcount\$";
if ($endian eq "big") {
$cc .= " -mbig-endian ";
$ld .= " -EB ";
$ldemulation = "ppc"
} else {
$cc .= " -mlittle-endian ";
$ld .= " -EL ";
$ldemulation = "lppc"
}
if ($bits == 64) { if ($bits == 64) {
$type = ".quad"; $type = ".quad";
$cc .= " -m64 ";
$ld .= " -m elf64".$ldemulation." ";
} else {
$cc .= " -m32 ";
$ld .= " -m elf32".$ldemulation." ";
} }
} elsif ($arch eq "arm") { } elsif ($arch eq "arm") {