You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nuttx.apache.org by xi...@apache.org on 2022/04/20 17:22:02 UTC
[incubator-nuttx] 01/02: arch/armv6-m: add support of LLVM Clang
This is an automated email from the ASF dual-hosted git repository.
xiaoxiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-nuttx.git
commit 67fbfda974f77b4c516bbf6df766e04e1ba129c4
Author: chao.an <an...@xiaomi.com>
AuthorDate: Wed Apr 20 21:44:30 2022 +0800
arch/armv6-m: add support of LLVM Clang
Signed-off-by: chao.an <an...@xiaomi.com>
---
arch/arm/src/armv6-m/Kconfig | 4 ++
arch/arm/src/armv6-m/Toolchain.defs | 79 ++++++++++++++++++++++++++++++-------
2 files changed, 68 insertions(+), 15 deletions(-)
diff --git a/arch/arm/src/armv6-m/Kconfig b/arch/arm/src/armv6-m/Kconfig
index 9d5c0f815a..247bf919bc 100644
--- a/arch/arm/src/armv6-m/Kconfig
+++ b/arch/arm/src/armv6-m/Kconfig
@@ -20,4 +20,8 @@ config ARMV6M_TOOLCHAIN_GNU_EABI
This option should work for any modern GNU toolchain (GCC 4.5 or newer)
configured for arm-none-eabi.
+config ARMV6M_TOOLCHAIN_CLANG
+ bool "Generic Clang toolchain"
+ select ARCH_TOOLCHAIN_GNU
+
endchoice
diff --git a/arch/arm/src/armv6-m/Toolchain.defs b/arch/arm/src/armv6-m/Toolchain.defs
index d52026b213..af41283522 100644
--- a/arch/arm/src/armv6-m/Toolchain.defs
+++ b/arch/arm/src/armv6-m/Toolchain.defs
@@ -35,6 +35,10 @@ ifeq ($(filter y, $(CONFIG_ARMV6M_TOOLCHAIN_GNU_EABI)),y)
CONFIG_ARMV6M_TOOLCHAIN ?= GNU_EABI
endif
+ifeq ($(filter y, $(CONFIG_ARMV6M_TOOLCHAIN_CLANG)),y)
+ CONFIG_ARMV6M_TOOLCHAIN ?= CLANG
+endif
+
#
# Supported toolchains
#
@@ -53,6 +57,8 @@ endif
ifeq ($(CONFIG_DEBUG_CUSTOMOPT),y)
MAXOPTIMIZATION := $(CONFIG_DEBUG_OPTLEVEL)
+else ifeq ($(CONFIG_ARMV6M_TOOLCHAIN),CLANG)
+ MAXOPTIMIZATION ?= -Oz
else
MAXOPTIMIZATION ?= -Os
endif
@@ -63,20 +69,68 @@ else
MAXOPTIMIZATION += -fomit-frame-pointer
endif
+# Parametrization for ARCHCPUFLAGS
+
+TOOLCHAIN_MTUNE := -mcpu=cortex-m0 -mthumb
+TOOLCHAIN_MFLOAT := -mfloat-abi=soft
+
+# Clang Configuration files
+
+ifeq ($(CONFIG_ARMV6M_TOOLCHAIN),CLANG)
+ TOOLCHAIN_MARCH := --config armv6m_soft_nofp_nosys
+endif
+
# NuttX buildroot under Linux or Cygwin
ifeq ($(CONFIG_ARMV6M_TOOLCHAIN),BUILDROOT)
CROSSDEV ?= arm-nuttx-eabi-
- ARCHCPUFLAGS = -mcpu=cortex-m0 -mthumb -mfloat-abi=soft
+ ARCHCPUFLAGS = $(TOOLCHAIN_MARCH) $(TOOLCHAIN_MTUNE) $(TOOLCHAIN_MFLOAT)
endif
# Generic GNU EABI toolchain
ifeq ($(CONFIG_ARMV6M_TOOLCHAIN),GNU_EABI)
CROSSDEV ?= arm-none-eabi-
- ARCHCPUFLAGS = -mcpu=cortex-m0 -mthumb -mfloat-abi=soft
+ ARCHCPUFLAGS = $(TOOLCHAIN_MARCH) $(TOOLCHAIN_MTUNE) $(TOOLCHAIN_MFLOAT)
endif
+# Clang toolchain
+
+ifeq ($(CONFIG_ARMV6M_TOOLCHAIN),CLANG)
+ ARCHCPUFLAGS = $(TOOLCHAIN_MARCH) $(TOOLCHAIN_MTUNE) $(TOOLCHAIN_MFLOAT)
+
+ CC = clang
+ CXX = clang++
+ CPP = clang -E -P -x c
+ LD = ld.lld -m armelf
+ STRIP = llvm-strip --strip-unneeded
+ AR = llvm-ar rcs
+ NM = llvm-nm
+ OBJCOPY = llvm-objcopy
+ OBJDUMP = llvm-objdump
+
+ # Since the no_builtin attribute is not fully supported on Clang
+ # disable the built-in functions, refer:
+ # https://github.com/apache/incubator-nuttx/pull/5971
+
+ MAXOPTIMIZATION += -fno-builtin
+
+# Default toolchain
+
+else
+ CC = $(CROSSDEV)gcc
+ CXX = $(CROSSDEV)g++
+ CPP = $(CROSSDEV)gcc -E -P -x c
+ LD = $(CROSSDEV)ld
+ STRIP = $(CROSSDEV)strip --strip-unneeded
+ AR = $(CROSSDEV)ar rcs
+ NM = $(CROSSDEV)nm
+ OBJCOPY = $(CROSSDEV)objcopy
+ OBJDUMP = $(CROSSDEV)objdump
+endif
+
+# Architecture flags
+
ifeq ($(CONFIG_MM_KASAN),y)
ARCHCPUFLAGS += -fsanitize=kernel-address
endif
@@ -92,21 +146,16 @@ ifneq ($(CONFIG_CXX_RTTI),y)
ARCHCXXFLAGS += -fno-rtti
endif
-# Default toolchain
-
-CC = $(CROSSDEV)gcc
-CXX = $(CROSSDEV)g++
-CPP = $(CROSSDEV)gcc -E -P -x c
-LD = $(CROSSDEV)ld
-STRIP = $(CROSSDEV)strip --strip-unneeded
-AR = $(CROSSDEV)ar rcs
-NM = $(CROSSDEV)nm
-OBJCOPY = $(CROSSDEV)objcopy
-OBJDUMP = $(CROSSDEV)objdump
-
# Add the builtin library
-EXTRA_LIBS += $(wildcard $(shell $(CC) $(ARCHCPUFLAGS) --print-libgcc-file-name))
+COMPILER_RT_LIB = $(shell $(CC) $(ARCHCPUFLAGS) --print-libgcc-file-name)
+ifeq ($(wildcard $(COMPILER_RT_LIB)),)
+ # if "--print-libgcc-file-name" unable to find the correct libgcc PATH
+ # then go ahead and try "--print-file-name"
+ COMPILER_RT_LIB := $(wildcard $(shell $(CC) $(ARCHCPUFLAGS) --print-file-name $(notdir $(COMPILER_RT_LIB))))
+endif
+
+EXTRA_LIBS += $(COMPILER_RT_LIB)
ifneq ($(CONFIG_LIBM),y)
EXTRA_LIBS += $(wildcard $(shell $(CC) $(ARCHCPUFLAGS) --print-file-name=libm.a))