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 <[email protected]> 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 <[email protected]> --- 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)
