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)

Reply via email to