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:
parent
af3901cbbd
commit
1421dc6d48
3 changed files with 34 additions and 12 deletions
|
@ -75,13 +75,15 @@ endif
|
|||
endif
|
||||
|
||||
ifeq ($(CONFIG_CPU_LITTLE_ENDIAN),y)
|
||||
override LD += -EL
|
||||
KBUILD_CFLAGS += -mlittle-endian
|
||||
LDFLAGS += -EL
|
||||
LDEMULATION := lppc
|
||||
GNUTARGET := powerpcle
|
||||
MULTIPLEWORD := -mno-multiple
|
||||
KBUILD_CFLAGS_MODULE += $(call cc-option,-mno-save-toc-indirect)
|
||||
else
|
||||
override LD += -EB
|
||||
KBUILD_CFLAGS += $(call cc-option,-mbig-endian)
|
||||
LDFLAGS += -EB
|
||||
LDEMULATION := ppc
|
||||
GNUTARGET := powerpc
|
||||
MULTIPLEWORD := -mmultiple
|
||||
|
@ -94,19 +96,19 @@ aflags-$(CONFIG_CPU_BIG_ENDIAN) += $(call cc-option,-mabi=elfv1)
|
|||
aflags-$(CONFIG_CPU_LITTLE_ENDIAN) += -mabi=elfv2
|
||||
endif
|
||||
|
||||
cflags-$(CONFIG_CPU_LITTLE_ENDIAN) += -mlittle-endian
|
||||
cflags-$(CONFIG_CPU_BIG_ENDIAN) += $(call cc-option,-mbig-endian)
|
||||
ifneq ($(cc-name),clang)
|
||||
cflags-$(CONFIG_CPU_LITTLE_ENDIAN) += -mno-strict-align
|
||||
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_LITTLE_ENDIAN) += -mlittle-endian
|
||||
|
||||
ifeq ($(HAS_BIARCH),y)
|
||||
override AS += -a$(BITS)
|
||||
override LD += -m elf$(BITS)$(LDEMULATION)
|
||||
override CC += -m$(BITS)
|
||||
KBUILD_CFLAGS += -m$(BITS)
|
||||
KBUILD_AFLAGS += -m$(BITS) -Wl,-a$(BITS)
|
||||
LDFLAGS += -m elf$(BITS)$(LDEMULATION)
|
||||
KBUILD_ARFLAGS += --target=elf$(BITS)-$(GNUTARGET)
|
||||
endif
|
||||
|
||||
|
|
|
@ -7,17 +7,21 @@ set -o pipefail
|
|||
# To debug, uncomment the following line
|
||||
# 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
|
||||
# profiling code (ie. a call to _mcount()).
|
||||
echo "int func() { return 0; }" | \
|
||||
$* -S -x c -O2 -p -mprofile-kernel - -o - 2> /dev/null | \
|
||||
grep -q "_mcount"
|
||||
$* -m64 -mlittle-endian -S -x c -O2 -p -mprofile-kernel - -o - \
|
||||
2> /dev/null | grep -q "_mcount"
|
||||
|
||||
# Test whether the notrace attribute correctly suppresses calls to _mcount().
|
||||
|
||||
echo -e "#include <linux/compiler.h>\nnotrace int func() { return 0; }" | \
|
||||
$* -S -x c -O2 -p -mprofile-kernel - -o - 2> /dev/null | \
|
||||
grep -q "_mcount" && \
|
||||
$* -m64 -mlittle-endian -S -x c -O2 -p -mprofile-kernel - -o - \
|
||||
2> /dev/null | grep -q "_mcount" && \
|
||||
exit 1
|
||||
|
||||
echo "OK"
|
||||
|
|
|
@ -266,13 +266,29 @@ if ($arch eq "x86_64") {
|
|||
$objcopy .= " -O elf32-sh-linux";
|
||||
|
||||
} elsif ($arch eq "powerpc") {
|
||||
my $ldemulation;
|
||||
|
||||
$local_regex = "^[0-9a-fA-F]+\\s+t\\s+(\\.?\\S+)";
|
||||
# See comment in the sparc64 section for why we use '\w'.
|
||||
$function_regex = "^([0-9a-fA-F]+)\\s+<(\\.?\\w*?)>:";
|
||||
$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) {
|
||||
$type = ".quad";
|
||||
$type = ".quad";
|
||||
$cc .= " -m64 ";
|
||||
$ld .= " -m elf64".$ldemulation." ";
|
||||
} else {
|
||||
$cc .= " -m32 ";
|
||||
$ld .= " -m elf32".$ldemulation." ";
|
||||
}
|
||||
|
||||
} elsif ($arch eq "arm") {
|
||||
|
|
Loading…
Reference in a new issue