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/27 15:42:58 UTC
[incubator-nuttx] branch master updated: arch/arm: add support for GCC 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
The following commit(s) were added to refs/heads/master by this push:
new 042640abbf arch/arm: add support for GCC LTO
042640abbf is described below
commit 042640abbf66fd58e091ce5818f0fc72ddd8dd65
Author: chao.an <an...@xiaomi.com>
AuthorDate: Thu Apr 21 22:48:02 2022 +0800
arch/arm: add support for GCC LTO
1. Enable GCC link-time optimizer
2. Enable use of a linker plugin during link-time optimization
Signed-off-by: chao.an <an...@xiaomi.com>
---
arch/arm/src/Makefile | 11 +++++++++--
arch/arm/src/arm/Toolchain.defs | 28 +++++++++++++++++++++-------
arch/arm/src/armv6-m/Toolchain.defs | 19 ++++++++++++++++---
arch/arm/src/armv7-a/Toolchain.defs | 28 +++++++++++++++++++++-------
arch/arm/src/armv7-m/Toolchain.defs | 19 ++++++++++++++++---
arch/arm/src/armv7-r/Toolchain.defs | 28 +++++++++++++++++++++-------
arch/arm/src/armv8-m/Toolchain.defs | 13 +++++++++++++
7 files changed, 117 insertions(+), 29 deletions(-)
diff --git a/arch/arm/src/Makefile b/arch/arm/src/Makefile
index 61c70659a4..5b159d388d 100644
--- a/arch/arm/src/Makefile
+++ b/arch/arm/src/Makefile
@@ -89,8 +89,15 @@ LDFLAGS += $(addprefix -T,$(call CONVERT_PATH,$(ARCHSCRIPT))) $(EXTRALINKCMDS)
# Override in Make.defs if linker is not 'ld'
-LDSTARTGROUP ?= --start-group
-LDENDGROUP ?= --end-group
+ifeq ($(LD),$(CC))
+ LDSTARTGROUP ?= -Wl,--start-group
+ LDENDGROUP ?= -Wl,--end-group
+ LDFLAGS := $(addprefix -Xlinker ,$(LDFLAGS))
+ LDFLAGS += $(CFLAGS)
+else
+ LDSTARTGROUP ?= --start-group
+ LDENDGROUP ?= --end-group
+endif
BOARDMAKE = $(if $(wildcard board$(DELIM)Makefile),y,)
diff --git a/arch/arm/src/arm/Toolchain.defs b/arch/arm/src/arm/Toolchain.defs
index 2c851b924f..b9d3025b5f 100644
--- a/arch/arm/src/arm/Toolchain.defs
+++ b/arch/arm/src/arm/Toolchain.defs
@@ -118,15 +118,29 @@ 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
+CC = $(CROSSDEV)gcc
+CXX = $(CROSSDEV)g++
+CPP = $(CROSSDEV)gcc -E -P -x c
+STRIP = $(CROSSDEV)strip --strip-unneeded
OBJCOPY = $(CROSSDEV)objcopy
OBJDUMP = $(CROSSDEV)objdump
+LD = $(CROSSDEV)ld
+AR = $(CROSSDEV)ar rcs
+NM = $(CROSSDEV)nm
+
+# Link Time Optimization
+
+ifeq ($(CONFIG_LTO_FULL),y)
+ MAXOPTIMIZATION += -flto
+ ifeq ($(CONFIG_ARM_TOOLCHAIN),GNU_EABI)
+ LD := $(CROSSDEV)gcc
+ AR := $(CROSSDEV)gcc-ar rcs
+ NM := $(CROSSDEV)gcc-nm
+ MAXOPTIMIZATION += -fuse-linker-plugin
+ MAXOPTIMIZATION += -fno-builtin
+ MAXOPTIMIZATION += -nodefaultlibs
+ endif
+endif
# Add the builtin library
diff --git a/arch/arm/src/armv6-m/Toolchain.defs b/arch/arm/src/armv6-m/Toolchain.defs
index 4b8d2c7cab..63ef66ca76 100644
--- a/arch/arm/src/armv6-m/Toolchain.defs
+++ b/arch/arm/src/armv6-m/Toolchain.defs
@@ -86,6 +86,9 @@ ifeq ($(CONFIG_LTO_THIN),y)
MAXOPTIMIZATION += -flto=thin
else ifeq ($(CONFIG_LTO_FULL),y)
MAXOPTIMIZATION += -flto
+ ifeq ($(CONFIG_ARMV6M_TOOLCHAIN),GNU_EABI)
+ MAXOPTIMIZATION += -fuse-linker-plugin
+ endif
endif
# NuttX buildroot under Linux or Cygwin
@@ -129,12 +132,22 @@ 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
+ LD = $(CROSSDEV)ld
+ AR = $(CROSSDEV)ar rcs
+ NM = $(CROSSDEV)nm
+
+ ifeq ($(CONFIG_LTO_FULL),y)
+ ifeq ($(CONFIG_ARMV6M_TOOLCHAIN),GNU_EABI)
+ LD := $(CROSSDEV)gcc
+ AR := $(CROSSDEV)gcc-ar rcs
+ NM := $(CROSSDEV)gcc-nm
+ MAXOPTIMIZATION += -fno-builtin
+ MAXOPTIMIZATION += -nodefaultlibs
+ endif
+ endif
endif
# Architecture flags
diff --git a/arch/arm/src/armv7-a/Toolchain.defs b/arch/arm/src/armv7-a/Toolchain.defs
index 454d71e1a2..b50ca4d873 100644
--- a/arch/arm/src/armv7-a/Toolchain.defs
+++ b/arch/arm/src/armv7-a/Toolchain.defs
@@ -165,15 +165,29 @@ 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
+CC = $(CROSSDEV)gcc
+CXX = $(CROSSDEV)g++
+CPP = $(CROSSDEV)gcc -E -P -x c
+STRIP = $(CROSSDEV)strip --strip-unneeded
OBJCOPY = $(CROSSDEV)objcopy
OBJDUMP = $(CROSSDEV)objdump
+LD = $(CROSSDEV)ld
+AR = $(CROSSDEV)ar rcs
+NM = $(CROSSDEV)nm
+
+# Link Time Optimization
+
+ifeq ($(CONFIG_LTO_FULL),y)
+ MAXOPTIMIZATION += -flto
+ ifeq ($(CONFIG_ARMV7A_TOOLCHAIN),GNU_EABI)
+ LD := $(CROSSDEV)gcc
+ AR := $(CROSSDEV)gcc-ar rcs
+ NM := $(CROSSDEV)gcc-nm
+ MAXOPTIMIZATION += -fuse-linker-plugin
+ MAXOPTIMIZATION += -fno-builtin
+ MAXOPTIMIZATION += -nodefaultlibs
+ endif
+endif
# Add the builtin library
diff --git a/arch/arm/src/armv7-m/Toolchain.defs b/arch/arm/src/armv7-m/Toolchain.defs
index 396238e8bc..84c264f505 100644
--- a/arch/arm/src/armv7-m/Toolchain.defs
+++ b/arch/arm/src/armv7-m/Toolchain.defs
@@ -136,6 +136,9 @@ ifeq ($(CONFIG_LTO_THIN),y)
MAXOPTIMIZATION += -flto=thin
else ifeq ($(CONFIG_LTO_FULL),y)
MAXOPTIMIZATION += -flto
+ ifeq ($(CONFIG_ARMV7M_TOOLCHAIN),GNU_EABI)
+ MAXOPTIMIZATION += -fuse-linker-plugin
+ endif
endif
# NuttX buildroot under Linux or Cygwin
@@ -188,12 +191,22 @@ 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
+ LD = $(CROSSDEV)ld
+ AR = $(CROSSDEV)ar rcs
+ NM = $(CROSSDEV)nm
+
+ ifeq ($(CONFIG_LTO_FULL),y)
+ ifeq ($(CONFIG_ARMV7M_TOOLCHAIN),GNU_EABI)
+ LD := $(CROSSDEV)gcc
+ AR := $(CROSSDEV)gcc-ar rcs
+ NM := $(CROSSDEV)gcc-nm
+ MAXOPTIMIZATION += -fno-builtin
+ MAXOPTIMIZATION += -nodefaultlibs
+ endif
+ endif
endif
# Architecture flags
diff --git a/arch/arm/src/armv7-r/Toolchain.defs b/arch/arm/src/armv7-r/Toolchain.defs
index 0a3c5038f7..c012e2e06f 100644
--- a/arch/arm/src/armv7-r/Toolchain.defs
+++ b/arch/arm/src/armv7-r/Toolchain.defs
@@ -141,15 +141,29 @@ 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
+CC = $(CROSSDEV)gcc
+CXX = $(CROSSDEV)g++
+CPP = $(CROSSDEV)gcc -E -P -x c
+STRIP = $(CROSSDEV)strip --strip-unneeded
OBJCOPY = $(CROSSDEV)objcopy
OBJDUMP = $(CROSSDEV)objdump
+LD = $(CROSSDEV)ld
+AR = $(CROSSDEV)ar rcs
+NM = $(CROSSDEV)nm
+
+# Link Time Optimization
+
+ifeq ($(CONFIG_LTO_FULL),y)
+ MAXOPTIMIZATION += -flto
+ ifeq ($(CONFIG_ARMV7R_TOOLCHAIN),GNU_EABI)
+ LD := $(CROSSDEV)gcc
+ AR := $(CROSSDEV)gcc-ar rcs
+ NM := $(CROSSDEV)gcc-nm
+ MAXOPTIMIZATION += -fuse-linker-plugin
+ MAXOPTIMIZATION += -fno-builtin
+ MAXOPTIMIZATION += -nodefaultlibs
+ endif
+endif
# Add the builtin library
diff --git a/arch/arm/src/armv8-m/Toolchain.defs b/arch/arm/src/armv8-m/Toolchain.defs
index 414358b033..43f707fcbe 100644
--- a/arch/arm/src/armv8-m/Toolchain.defs
+++ b/arch/arm/src/armv8-m/Toolchain.defs
@@ -145,6 +145,9 @@ ifeq ($(CONFIG_LTO_THIN),y)
MAXOPTIMIZATION += -flto=thin
else ifeq ($(CONFIG_LTO_FULL),y)
MAXOPTIMIZATION += -flto
+ ifeq ($(CONFIG_ARMV8M_TOOLCHAIN),GNU_EABI)
+ MAXOPTIMIZATION += -fuse-linker-plugin
+ endif
endif
# NuttX buildroot under Linux or Cygwin
@@ -203,6 +206,16 @@ else
NM = $(CROSSDEV)nm
OBJCOPY = $(CROSSDEV)objcopy
OBJDUMP = $(CROSSDEV)objdump
+
+ ifeq ($(CONFIG_LTO_FULL),y)
+ ifeq ($(CONFIG_ARMV8M_TOOLCHAIN),GNU_EABI)
+ LD := $(CROSSDEV)gcc
+ AR := $(CROSSDEV)gcc-ar rcs
+ NM := $(CROSSDEV)gcc-nm
+ MAXOPTIMIZATION += -fno-builtin
+ MAXOPTIMIZATION += -nodefaultlibs
+ endif
+ endif
endif
# Architecture flags