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:01 UTC
[incubator-nuttx] branch master updated (48b81bda09 -> 0315283c21)
This is an automated email from the ASF dual-hosted git repository.
xiaoxiang pushed a change to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-nuttx.git
from 48b81bda09 arch/risc-v: Change riscv_savefpu/riscv_loadfpu to macro
new 67fbfda974 arch/armv6-m: add support of LLVM Clang
new 0315283c21 arch/clang: add support for Clang LTO
The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails. The revisions
listed as "add" were already present in the repository and have only
been added to this reference.
Summary of changes:
arch/Kconfig | 43 ++++++++++++++++++
arch/arm/src/armv6-m/Kconfig | 4 ++
arch/arm/src/armv6-m/Toolchain.defs | 87 ++++++++++++++++++++++++++++++-------
arch/arm/src/armv7-m/Kconfig | 2 +-
arch/arm/src/armv7-m/Toolchain.defs | 8 ++++
arch/arm/src/armv8-m/Kconfig | 2 +-
arch/arm/src/armv8-m/Toolchain.defs | 8 ++++
7 files changed, 137 insertions(+), 17 deletions(-)
[incubator-nuttx] 01/02: arch/armv6-m: add support of LLVM Clang
Posted by xi...@apache.org.
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))
[incubator-nuttx] 02/02: arch/clang: add support for Clang LTO
Posted by xi...@apache.org.
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 0315283c2194bb92b8334d1daddc37419c24d6f2
Author: chao.an <an...@xiaomi.com>
AuthorDate: Tue Apr 19 18:26:33 2022 +0800
arch/clang: add support for Clang LTO
add support of Clang's Link Time Optimization (LTO) on NuttX build system
Reference:
https://gcc.gnu.org/onlinedocs/gccint/LTO-Overview.html
https://llvm.org/docs/LinkTimeOptimization.html
Signed-off-by: chao.an <an...@xiaomi.com>
---
arch/Kconfig | 43 +++++++++++++++++++++++++++++++++++++
arch/arm/src/armv6-m/Kconfig | 2 +-
arch/arm/src/armv6-m/Toolchain.defs | 8 +++++++
arch/arm/src/armv7-m/Kconfig | 2 +-
arch/arm/src/armv7-m/Toolchain.defs | 8 +++++++
arch/arm/src/armv8-m/Kconfig | 2 +-
arch/arm/src/armv8-m/Toolchain.defs | 8 +++++++
7 files changed, 70 insertions(+), 3 deletions(-)
diff --git a/arch/Kconfig b/arch/Kconfig
index e0eb9f4d7f..365ffbd314 100644
--- a/arch/Kconfig
+++ b/arch/Kconfig
@@ -222,6 +222,49 @@ config ARCH_TOOLCHAIN_GNU
bool
default n
+config ARCH_TOOLCHAIN_CLANG
+ bool
+ select ARCH_TOOLCHAIN_GNU
+ default n
+
+choice
+ prompt "Link Time Optimization (LTO)"
+ default LTO_NONE
+ ---help---
+ This option enables Link Time Optimization (LTO), which allows the
+ compiler to optimize binaries globally.
+
+ If unsure, select LTO_NONE. Note that LTO is very resource-intensive
+ so it's disabled by default.
+
+config LTO_NONE
+ bool "None"
+ ---help---
+ Build the kernel normally, without Link Time Optimization (LTO).
+
+config LTO_FULL
+ bool "GNU Full LTO (EXPERIMENTAL)"
+ depends on ARCH_TOOLCHAIN_GNU || ARCH_TOOLCHAIN_CLANG
+ ---help---
+ Link time optimization is implemented as a GCC front end for a bytecode
+ bytecode representation of GIMPLE that is emitted in special sections
+ of .o files. Currently, LTO support is enabled in most ELF-based systems,
+ as well as darwin, cygwin and mingw systems.
+
+config LTO_THIN
+ bool "Clang ThinLTO (EXPERIMENTAL)"
+ depends on ARCH_TOOLCHAIN_CLANG
+ ---help---
+ This option enables Clang's ThinLTO, which allows for parallel
+ optimization and faster incremental compiles compared to the
+ CONFIG_LTO_FULL option. More information can be found
+ from Clang's documentation:
+
+ https://clang.llvm.org/docs/ThinLTO.html
+
+ If unsure, say Y.
+endchoice
+
config ARCH_GNU_NO_WEAKFUNCTIONS
bool
depends on ARCH_TOOLCHAIN_GNU
diff --git a/arch/arm/src/armv6-m/Kconfig b/arch/arm/src/armv6-m/Kconfig
index 247bf919bc..5268d48c73 100644
--- a/arch/arm/src/armv6-m/Kconfig
+++ b/arch/arm/src/armv6-m/Kconfig
@@ -22,6 +22,6 @@ config ARMV6M_TOOLCHAIN_GNU_EABI
config ARMV6M_TOOLCHAIN_CLANG
bool "Generic Clang toolchain"
- select ARCH_TOOLCHAIN_GNU
+ select ARCH_TOOLCHAIN_CLANG
endchoice
diff --git a/arch/arm/src/armv6-m/Toolchain.defs b/arch/arm/src/armv6-m/Toolchain.defs
index af41283522..f66849c96e 100644
--- a/arch/arm/src/armv6-m/Toolchain.defs
+++ b/arch/arm/src/armv6-m/Toolchain.defs
@@ -80,6 +80,14 @@ ifeq ($(CONFIG_ARMV6M_TOOLCHAIN),CLANG)
TOOLCHAIN_MARCH := --config armv6m_soft_nofp_nosys
endif
+# Link Time Optimization
+
+ifeq ($(CONFIG_LTO_THIN),y)
+ MAXOPTIMIZATION += -flto=thin
+else ifeq ($(CONFIG_LTO_FULL),y)
+ MAXOPTIMIZATION += -flto
+endif
+
# NuttX buildroot under Linux or Cygwin
ifeq ($(CONFIG_ARMV6M_TOOLCHAIN),BUILDROOT)
diff --git a/arch/arm/src/armv7-m/Kconfig b/arch/arm/src/armv7-m/Kconfig
index 03f2aafc2f..fb401a64ff 100644
--- a/arch/arm/src/armv7-m/Kconfig
+++ b/arch/arm/src/armv7-m/Kconfig
@@ -110,7 +110,7 @@ config ARMV7M_TOOLCHAIN_GNU_EABI
config ARMV7M_TOOLCHAIN_CLANG
bool "Generic Clang toolchain"
- select ARCH_TOOLCHAIN_GNU
+ select ARCH_TOOLCHAIN_CLANG
endchoice
diff --git a/arch/arm/src/armv7-m/Toolchain.defs b/arch/arm/src/armv7-m/Toolchain.defs
index 03f1bf1911..1b8e9ac84b 100644
--- a/arch/arm/src/armv7-m/Toolchain.defs
+++ b/arch/arm/src/armv7-m/Toolchain.defs
@@ -130,6 +130,14 @@ ifeq ($(CONFIG_ARMV7M_TOOLCHAIN),CLANG)
endif
+# Link Time Optimization
+
+ifeq ($(CONFIG_LTO_THIN),y)
+ MAXOPTIMIZATION += -flto=thin
+else ifeq ($(CONFIG_LTO_FULL),y)
+ MAXOPTIMIZATION += -flto
+endif
+
# NuttX buildroot under Linux or Cygwin
ifeq ($(CONFIG_ARMV7M_TOOLCHAIN),BUILDROOT)
diff --git a/arch/arm/src/armv8-m/Kconfig b/arch/arm/src/armv8-m/Kconfig
index 3e499b6a04..82ba9d60d4 100644
--- a/arch/arm/src/armv8-m/Kconfig
+++ b/arch/arm/src/armv8-m/Kconfig
@@ -85,7 +85,7 @@ config ARMV8M_TOOLCHAIN_GNU_EABI
config ARMV8M_TOOLCHAIN_CLANG
bool "Generic Clang toolchain"
- select ARCH_TOOLCHAIN_GNU
+ select ARCH_TOOLCHAIN_CLANG
endchoice
diff --git a/arch/arm/src/armv8-m/Toolchain.defs b/arch/arm/src/armv8-m/Toolchain.defs
index b7feb56c67..7624e149ff 100644
--- a/arch/arm/src/armv8-m/Toolchain.defs
+++ b/arch/arm/src/armv8-m/Toolchain.defs
@@ -139,6 +139,14 @@ ifeq ($(CONFIG_ARMV8M_TOOLCHAIN),CLANG)
endif
+# Link Time Optimization
+
+ifeq ($(CONFIG_LTO_THIN),y)
+ MAXOPTIMIZATION += -flto=thin
+else ifeq ($(CONFIG_LTO_FULL),y)
+ MAXOPTIMIZATION += -flto
+endif
+
# NuttX buildroot under Linux or Cygwin
ifeq ($(CONFIG_ARMV8M_TOOLCHAIN),BUILDROOT)