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))