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)