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:03 UTC

[incubator-nuttx] 02/02: arch/clang: add support for Clang LTO

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)