summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Hughes <tomhughes@chromium.org>2019-02-13 16:14:26 -0800
committerCommit Bot <commit-bot@chromium.org>2021-10-25 18:03:13 +0000
commit03874334eac1b2bf77e33ea60a6587e6801faf6a (patch)
tree112b634a7489b6358c8ed9e92f44b367784c046d
parent3610a23adb72eac769e1f819604fce8fb8822b5b (diff)
downloadchrome-ec-03874334eac1b2bf77e33ea60a6587e6801faf6a.tar.gz
Add support for building dartmonkey firmware with clang
By default all builds will use gcc. To build with clang, set the environment variable CC=clang. At this point only dartmonkey has been tested with clang. BRANCH=none BUG=b:172020503 TEST=Using icetower, Segger J-Trace, and servo micro: make BOARD=dartmonkey -j ./flash_jlink.py -b dartmonkey -i ./build/dartmonkey/ec.bin --remote 127.0.0.1:2551 => console on icetower works TEST=CC=clang make BOARD=dartmonkey -j ./flash_jlink.py -b dartmonkey -i ./build/dartmonkey/ec.bin --remote 127.0.0.1:2551 => console on icetower works TEST=make buildall -j TEST=CC=clang make BOARD=dartmonkey tests -j TEST=make BOARD=dartmonkey tests -j TEST=./util/compare_build.sh -b all -j 120 => MATCH Change-Id: Ib7c067d0ebe0561becfd70373216adb445501f94 Signed-off-by: Tom Hughes <tomhughes@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/1474577 Reviewed-by: Eric Yilun Lin <yllin@google.com>
-rw-r--r--Makefile.rules5
-rw-r--r--Makefile.toolchain19
-rw-r--r--core/cortex-m/build.mk14
-rw-r--r--core/cortex-m0/build.mk5
4 files changed, 36 insertions, 7 deletions
diff --git a/Makefile.rules b/Makefile.rules
index 42afb26e6f..91182a3a58 100644
--- a/Makefile.rules
+++ b/Makefile.rules
@@ -87,7 +87,10 @@ cmd_bin_to_hex = $(OBJCOPY) -I binary -O ihex \
--change-addresses $(_program_memory_base) $^ $@
cmd_smap = $(NM) $< | sort > $@
cmd_elf = $(CC) $(objs) $(libsharedobjs_elf-y) $(LDFLAGS) \
- -o $@ -Wl,-T,$< -Wl,-Map,$(patsubst %.elf,%.map,$@) -flto-partition=one
+ -o $@ -Wl,-T,$< -Wl,-Map,$(patsubst %.elf,%.map,$@)
+ifeq ($(cc-name),gcc)
+cmd_elf+= -flto-partition=one
+endif
cmd_fuzz_exe = $(CXX) $^ $(HOST_TEST_LDFLAGS) $(LDFLAGS_EXTRA) -o $@
cmd_run_fuzz = build/host/$*/$*.exe -seed=1 -runs=1 $(silent) \
$(silent_err) || (echo "Test $* failed!" && false)
diff --git a/Makefile.toolchain b/Makefile.toolchain
index ecfaeb6dd6..a79f248ea2 100644
--- a/Makefile.toolchain
+++ b/Makefile.toolchain
@@ -26,10 +26,18 @@ endif
# Extract cc-name
cc-name:=$(shell $(CC) -v 2>&1 | grep -q "clang version" && echo clang || echo gcc)
+# Assume we want to use same compiler for both C and C++
+ifeq ($(cc-name),gcc)
+cxx-name:=g++
+else
+cxx-name:=clang++
+CROSS_COMPILE_arm:=arm-none-eabi-
+endif
+
# Try not to assume too much about optional tools and prefixes
CCACHE:=$(shell which ccache 2>/dev/null)
ifeq ($(origin HOST_CROSS_COMPILE),undefined)
-HOST_CROSS_COMPILE:=$(if $(shell which x86_64-pc-linux-gnu-gcc 2>/dev/null),x86_64-pc-linux-gnu-,)
+HOST_CROSS_COMPILE:=$(if $(shell which x86_64-pc-linux-gnu-$(cc-name) 2>/dev/null),x86_64-pc-linux-gnu-,)
endif
AR=$(CROSS_COMPILE)ar
@@ -42,8 +50,8 @@ OBJCOPY=$(CROSS_COMPILE)objcopy
OBJDUMP=$(CROSS_COMPILE)objdump
ADDR2LINE=$(CROSS_COMPILE)addr2line
PKG_CONFIG?=pkg-config
-BUILDCC?=$(CCACHE) gcc
-HOSTCC?=$(CCACHE) $(HOST_CROSS_COMPILE)gcc
+BUILDCC?=$(CCACHE) $(cc-name)
+HOSTCC?=$(CCACHE) $(HOST_CROSS_COMPILE)$(cc-name)
HOSTCXX?=$(CCACHE) $(HOST_CROSS_COMPILE)clang++
HOST_PKG_CONFIG?=$(HOST_CROSS_COMPILE)pkg-config
PROTOC?=protoc
@@ -61,6 +69,11 @@ ifeq ($(cc-name),gcc)
COMMON_WARN+=-Werror=maybe-uninitialized
endif
+ifeq ($(cc-name),clang)
+# TODO(b/172020503): Re-enabling this warning requires a large CL.
+C_WARN+= -Wno-ignored-attributes
+endif
+
UBSAN_FLAGS=-fsanitize=array-bounds,vla-bound \
-fno-sanitize=vptr \
-fno-sanitize-recover=all
diff --git a/core/cortex-m/build.mk b/core/cortex-m/build.mk
index ad7ab6eacc..be41a12b9e 100644
--- a/core/cortex-m/build.mk
+++ b/core/cortex-m/build.mk
@@ -15,7 +15,13 @@ $(call set-option,CROSS_COMPILE,\
CFLAGS_FPU-$(CONFIG_FPU)=-mfpu=fpv4-sp-d16 -mfloat-abi=hard
# CPU specific compilation flags
-CFLAGS_CPU+=-mthumb -Os -mno-sched-prolog
+CFLAGS_CPU+=-mthumb -Os
+ifeq ($(cc-name),clang)
+# Link compiler-rt when using clang, so clang finds the builtins it provides.
+LDFLAGS_EXTRA+=-lclang_rt.builtins-arm
+else
+CFLAGS_CPU+=-mno-sched-prolog
+endif
CFLAGS_CPU+=-mno-unaligned-access
CFLAGS_CPU+=$(CFLAGS_FPU-y)
@@ -24,7 +30,11 @@ CFLAGS_CPU+=-flto
LDFLAGS_EXTRA+=-flto
endif
-core-y=cpu.o debug.o init.o ldivmod.o llsr.o uldivmod.o vecttable.o
+core-y=cpu.o debug.o init.o vecttable.o
+# When using clang, we get these as builtins from compiler-rt.
+ifneq ($(cc-name),clang)
+core-y+=ldivmod.o llsr.o uldivmod.o
+endif
core-$(CONFIG_AES)+=aes.o
core-$(CONFIG_AES_GCM)+=ghash.o
core-$(CONFIG_ARMV7M_CACHE)+=cache.o
diff --git a/core/cortex-m0/build.mk b/core/cortex-m0/build.mk
index b0136f347e..44093b93ff 100644
--- a/core/cortex-m0/build.mk
+++ b/core/cortex-m0/build.mk
@@ -12,7 +12,10 @@ $(call set-option,CROSS_COMPILE,\
/opt/coreboot-sdk/bin/arm-eabi-)
# CPU specific compilation flags
-CFLAGS_CPU+=-mthumb -Os -mno-sched-prolog
+CFLAGS_CPU+=-mthumb -Os
+ifneq ($(cc-name),clang)
+CFLAGS_CPU+=-mno-sched-prolog
+endif
CFLAGS_CPU+=-mno-unaligned-access
ifneq ($(CONFIG_LTO),)