[coreboot-gerrit] Patch set updated for coreboot: 64b6ea6 build system: collect compiler configuration in xcompile

Edward O'Callaghan (eocallaghan@alterapraxis.com) gerrit at coreboot.org
Fri Jan 2 15:08:27 CET 2015


Edward O'Callaghan (eocallaghan at alterapraxis.com) just uploaded a new patch set to gerrit, which you can find at http://review.coreboot.org/7612

-gerrit

commit 64b6ea6fe2b52875f10095fa217a0a5b4b00ff3c
Author: Patrick Georgi <pgeorgi at google.com>
Date:   Sat Nov 29 14:16:07 2014 +0100

    build system: collect compiler configuration in xcompile
    
    Move clang specifics and compiler runtime handling to
    xcompile and out of the main build paths.
    
    Change-Id: I0f12f755420f315127e6d9adc00b1246c6e7131b
    Signed-off-by: Patrick Georgi <pgeorgi at google.com>
    Signed-off-by: Edward O'Callaghan <eocallaghan at alterapraxis.com>
---
 Makefile                  | 25 +---------------
 src/arch/x86/Makefile.inc |  2 --
 toolchain.inc             | 15 +++-------
 util/xcompile/xcompile    | 72 +++++++++++++++++++++++++++++++++++------------
 4 files changed, 59 insertions(+), 55 deletions(-)

diff --git a/Makefile b/Makefile
index 6ef9838..19d65f4 100644
--- a/Makefile
+++ b/Makefile
@@ -37,8 +37,6 @@ $(if $(wildcard .xcompile),,$(eval $(shell util/xcompile/xcompile $(XGCCPATH) >
 .xcompile: util/xcompile/xcompile
 	A=`mktemp $@.XXXXXX`; $< $(XGCCPATH) > $$A && mv $$A $@ 2> /dev/null
 
-include .xcompile
-
 export top := $(CURDIR)
 export src := src
 export srck := $(top)/util/kconfig
@@ -112,33 +110,12 @@ real-all: config
 else
 
 include $(HAVE_DOTCONFIG)
-
-ifeq ($(CONFIG_COMPILER_LLVM_CLANG),y)
-# FIXME: armv7/aarch64 won't build right now
-# NOTE: clang puts compiler-rt under lib/linux/libclang_rt.builtins-i386.a
-# this means the triple is i386-linux-elf instead of i386-none-elf
-CFLAGS_x86_32 = -no-integrated-as -Qunused-arguments -target i386-linux-elf -m32
-# Tone down some clang warnings
-CFLAGS_x86_32 += -Wno-unused-variable -Wno-unused-function -Wno-tautological-compare -Wno-shift-overflow
-CC_x86_32:=clang
-HOSTCC := clang
+include .xcompile
 
 ifneq ($(CONFIG_MMX),y)
 CFLAGS_x86_32 += -mno-mmx
 endif
 
-# FIXME: we end up with conflicting flags with this, not clear on this part.
-#ifneq ($(CONFIG_SSE),y)
-#CFLAGS_x86_32 += -mno-sse
-#endif
-
-CFLAGS_arm = -no-integrated-as -Qunused-arguments -target arm-eabi -ccc-gcc-name $(CC_arm)
-CC_arm:=clang
-
-CFLAGS_aarch64 = -no-integrated-as -Qunused-arguments -target aarch64-eabi -ccc-gcc-name $(CC_aarch64)
-CC_aarch64:=clang
-endif
-
 include toolchain.inc
 
 strip_quotes = $(subst ",,$(subst \",,$(1)))
diff --git a/src/arch/x86/Makefile.inc b/src/arch/x86/Makefile.inc
index a92c55c..8e67d56 100644
--- a/src/arch/x86/Makefile.inc
+++ b/src/arch/x86/Makefile.inc
@@ -29,8 +29,6 @@ subdirs-y += smp
 
 ifeq ($(CONFIG_COMPILER_GCC),y)
 DISASSEMBLY=-Wa,-acdlns
-else
-DISASSEMBLY=-Wa,--divide
 endif
 
 OPTION_TABLE_H:=
diff --git a/toolchain.inc b/toolchain.inc
index e6f530a..432e633 100644
--- a/toolchain.inc
+++ b/toolchain.inc
@@ -59,9 +59,9 @@ ARCHDIR-arm     := arm
 ARCHDIR-arm64   := arm64
 ARCHDIR-riscv   := riscv
 
-CFLAGS_arm      := -mno-unaligned-access -ffunction-sections -fdata-sections
+CFLAGS_arm      += -mno-unaligned-access -ffunction-sections -fdata-sections
 
-CFLAGS_arm64 := -ffunction-sections -fdata-sections
+CFLAGS_arm64    += -ffunction-sections -fdata-sections
 
 toolchain_to_dir = \
 	$(foreach arch,$(ARCH_SUPPORTED),\
@@ -93,15 +93,8 @@ STRIP_$(1) := $(STRIP_$(2))
 READELF_$(1) := $(READELF_$(2))
 CFLAGS_$(1) = $$(CFLAGS_common) $$(CFLAGS_$(2))
 CPPFLAGS_$(1) = $$(CPPFLAGS_common) $$(CPPFLAGS_$(2))
-COMPILER_RT_FLAGS_$(1) :=
-ifeq ($(CONFIG_COMPILER_LLVM_CLANG),y)
-COMPILER_RT_$(1) = $(shell $(CC_$(2)) $(CFLAGS_$(2)) -print-librt-file-name 2>/dev/null)
-else
-COMPILER_RT_$(1) = $(wildcard $(shell $(CC_$(2)) $(CFLAGS_$(2)) -print-libgcc-file-name))
-ifeq ($(2),x86_32)
-COMPILER_RT_FLAGS_$(1) := --wrap __divdi3 --wrap __udivdi3 --wrap __moddi3 --wrap __umoddi3
-endif
-endif
+COMPILER_RT_$(1) := $$(COMPILER_RT_$(2))
+COMPILER_RT_FLAGS_$(1) := $$(COMPILER_RT_FLAGS_$(2))
 endef
 
 # define_class: Allows defining any program as dynamic class and compiler tool
diff --git a/util/xcompile/xcompile b/util/xcompile/xcompile
index 45dae8c..081f3f8 100755
--- a/util/xcompile/xcompile
+++ b/util/xcompile/xcompile
@@ -59,6 +59,7 @@ elif program_exists cc; then
 else
 	die "no host compiler found"
 fi
+CLANG=clang
 
 cat <<EOF
 # platform agnostic and host tools
@@ -98,11 +99,11 @@ testas() {
 
 	if [ -z "$use_dash_twidth" ]; then
 		ASFLAGS=""
-		CFLAGS=""
+		CFLAGS_GCC=""
 		LDFLAGS=""
 	else
 		ASFLAGS="--$twidth"
-		CFLAGS="-m$twidth"
+		CFLAGS_GCC="-m$twidth"
 		LDFLAGS="-b $full_arch"
 
 	fi
@@ -111,7 +112,7 @@ testas() {
 	[ -n "$use_dash_twidth" ] && case "$full_arch" in
 		"elf32-i386" )
 			LDFLAGS="$LDFLAGS -melf_i386"
-			CFLAGS="$CFLAGS -Wl,-b,elf32-i386 -Wl,-melf_i386"
+			CFLAGS_GCC="$CFLAGS_GCC -Wl,-b,elf32-i386 -Wl,-melf_i386"
 			;;
 	esac
 
@@ -122,38 +123,56 @@ detect_special_flags() {
 	local architecture="$1"
 	# GCC 4.6 is much more picky about unused variables.
 	# Turn off it's warnings for now:
-	testcc "$CC"   "$CFLAGS -Wno-unused-but-set-variable " &&
-		CFLAGS="$CFLAGS -Wno-unused-but-set-variable "
+	testcc "$CC"       "$CFLAGS_GCC -Wno-unused-but-set-variable " &&
+		CFLAGS_GCC="$CFLAGS_GCC -Wno-unused-but-set-variable "
 
 	# Use bfd linker instead of gold if available:
-	testcc "$CC"   "$CFLAGS -fuse-ld=bfd" &&
-		CFLAGS="$CFLAGS -fuse-ld=bfd" && LINKER_SUFFIX='.bfd'
+	testcc "$CC"       "$CFLAGS_GCC -fuse-ld=bfd" &&
+		CFLAGS_GCC="$CFLAGS_GCC -fuse-ld=bfd" && LINKER_SUFFIX='.bfd'
 
-	testcc "$CC"   "$CFLAGS -fno-stack-protector"&&
-		CFLAGS="$CFLAGS -fno-stack-protector"
-	testcc "$CC"   "$CFLAGS -Wl,--build-id=none" &&
-		CFLAGS="$CFLAGS -Wl,--build-id=none"
+	testcc "$CC"       "$CFLAGS_GCC -fno-stack-protector"&&
+		CFLAGS_GCC="$CFLAGS_GCC -fno-stack-protector"
+	testcc "$CC"       "$CFLAGS_GCC -Wl,--build-id=none" &&
+		CFLAGS_GCC="$CFLAGS_GCC -Wl,--build-id=none"
 
 	case "$architecture" in
 	x86)
-		testcc "$CC"   "$CFLAGS -Wa,--divide" &&
-			CFLAGS="$CFLAGS -Wa,--divide"
+		testcc "$CC"       "$CFLAGS_GCC -Wa,--divide" &&
+			CFLAGS_GCC="$CFLAGS_GCC -Wa,--divide"
+		testcc "$CLANG"      "$CFLAGS_CLANG -no-integrated-as" &&
+			CFLAGS_CLANG="$CFLAGS_CLANG -no-integrated-as"
+		testcc "$CLANG"      "$CFLAGS_CLANG -Wa,--divide" &&
+			CFLAGS_CLANG="$CFLAGS_CLANG -Wa,--divide"
 		# Always build for i686 -- no sse/mmx instructions since SMM
 		# modules are compiled using these flags. Note that this
 		# doesn't prevent a project using xcompile to explicitly
 		# specify -mmsse, etc flags.
-		CFLAGS="$CFLAGS  -march=i686"
+		CFLAGS_GCC="$CFLAGS_GCC  -march=i686"
 		;;
 	esac
 }
 
+detect_compiler_runtime() {
+	CC_RT_CLANG="`${CLANG} ${CFLAGS_CLANG} -print-librt-file-name`"
+	CC_RT_GCC="`${GCCPREFIX}gcc ${CFLAGS_GCC} -print-libgcc-file-name`"
+}
+
 report_arch_toolchain() {
 	cat <<EOF
 # elf${TWIDTH}-${TBFDARCH} toolchain (${GCCPREFIX}gcc)
 ARCH_SUPPORTED+=${TARCH}
 SUBARCH_SUPPORTED+=${TSUPP-${TARCH}}
+ifeq (\$(CONFIG_COMPILER_GCC),y)
 CC_${TARCH}:=${GCCPREFIX}gcc
-CFLAGS_${TARCH}:=${CFLAGS}
+CFLAGS_${TARCH}:=${CFLAGS_GCC}
+COMPILER_RT_${TARCH}:=${CC_RT_GCC}
+COMPILER_RT_FLAGS_${TARCH}:=${CC_RT_EXTRA_GCC}
+else
+CC_${TARCH}:=${CLANG}
+CFLAGS_${TARCH}:=${CFLAGS_CLANG}
+COMPILER_RT_${TARCH}:=${CC_RT_CLANG}
+COMPILER_RT_FLAGS_${TARCH}:=${CC_RT_EXTRA_CLANG}
+endif
 CPP_${TARCH}:=${GCCPREFIX}cpp
 AS_${TARCH}:=${GCCPREFIX}as ${ASFLAGS}
 LD_${TARCH}:=${GCCPREFIX}ld${LINKER_SUFFIX} ${LDFLAGS}
@@ -173,10 +192,12 @@ SUPPORTED_ARCHITECTURE="x86 arm aarch64 riscv"
 arch_config_arm() {
 	TARCH="arm"
 	TBFDARCH="littlearm"
-	TCLIST="armv7a armv7-a"
+	# N.B. clang expects armv7-a to come first else clang can not find prefixed binutils.
+	TCLIST="armv7-a armv7a"
 	TWIDTH="32"
 	TSUPP="arm armv4 armv7"
 	TABI="eabi"
+	CC_RT_EXTRA_GCC=
 }
 
 arch_config_aarch64() {
@@ -185,6 +206,7 @@ arch_config_aarch64() {
 	TCLIST="aarch64"
 	TWIDTH="64"
 	TABI="elf"
+	CC_RT_EXTRA_GCC=
 }
 
 arch_config_riscv() {
@@ -193,6 +215,7 @@ arch_config_riscv() {
 	TCLIST="riscv"
 	TWIDTH="64"
 	TABI="elf"
+	CC_RT_EXTRA_GCC=
 }
 
 arch_config_x86() {
@@ -201,6 +224,7 @@ arch_config_x86() {
 	TCLIST="i386 x86_64"
 	TWIDTH="32"
 	TABI="elf"
+	CC_RT_EXTRA_GCC="--wrap __divdi3 --wrap __udivdi3 --wrap __moddi3 --wrap __umoddi3"
 }
 
 test_architecture() {
@@ -234,13 +258,25 @@ test_architecture() {
 		testas "$gccprefixes" "$TWIDTH" "$TBFDARCH" "TRUE" && break
 	done
 
-	if [ "$GCCPREFIX" = "invalid" ]; then
-		echo "Warning: no suitable GCC for $architecture." >&2
+	for clang_arch in $TCLIST invalid; do
+		# NOTE: clang puts compiler-rt under lib/linux/libclang_rt.builtins-i386.a
+		# this means the triple is i386-linux-elf instead of i386-none-elf
+		# See: http://llvm.org/bugs/show_bug.cgi?id=21538
+		testcc "clang" "-target ${clang_arch}-linux-$TABI -c" && break
+	done
+
+	if [ "$GCCPREFIX" = "invalid" -a "$clang_arch" = "invalid" ]; then
+		echo "Warning: no suitable compiler for $architecture." >&2
 		continue
 	fi
 	CC="${GCCPREFIX}"gcc
+	CFLAGS_GCC=
+	CFLAGS_CLANG="-target ${clang_arch}-linux-${TABI} -Qunused-arguments -ccc-gcc-name ${CC} -m${TWIDTH}"
+	# tone down some warnings
+	CFLAGS_CLANG="${CFLAGS_CLANG} -Wno-unused-variable -Wno-unused-function -Wno-tautological-compare -Wno-shift-overflow"
 
 	detect_special_flags "$architecture"
+	detect_compiler_runtime "$architecture"
 	report_arch_toolchain
 }
 



More information about the coreboot-gerrit mailing list