diff options
author | Arthur Heymans <arthur@aheymans.xyz> | 2024-08-21 10:12:16 +0200 |
---|---|---|
committer | Felix Held <felix-coreboot@felixheld.de> | 2024-08-24 12:50:38 +0000 |
commit | b56f407614b58ab139bef3612195fbdf07670436 (patch) | |
tree | 1501556f0d6e0443d85e57c096a707035d3f3ae6 | |
parent | 23073b2753cce923e2dda3a13f045dbd969174de (diff) |
Add initial experimental LTO support
This will not succeed in compiling on all target and compiler
combinations but at least gets the ball rolling. The change is not
invasive.
Some notes:
- GCC has issues with LTO on ARM
- Clang uses LLD automatically on some arch
- Clang with LTO fails on x86 as it forwards the linking to GCC for some
reason
- SMM building succeeds but the binary is empty
Change-Id: Ieb9204777fd349542744a8946e2207731c37969c
Signed-off-by: Arthur Heymans <arthur@aheymans.xyz>
Reviewed-on: https://review.coreboot.org/c/coreboot/+/84003
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Lean Sheng Tan <sheng.tan@9elements.com>
Reviewed-by: Nico Huber <nico.h@gmx.de>
-rw-r--r-- | Makefile.mk | 18 | ||||
-rw-r--r-- | src/Kconfig | 7 |
2 files changed, 22 insertions, 3 deletions
diff --git a/Makefile.mk b/Makefile.mk index 9efef49ba6..e7a9ab1bb8 100644 --- a/Makefile.mk +++ b/Makefile.mk @@ -373,7 +373,7 @@ endef cbfs-files-processor-struct= \ $(eval $(2): $(1) $(obj)/build.h $(obj)/fmap_config.h $(KCONFIG_AUTOHEADER); \ printf " CC+STRIP $(1)\n"; \ - $(CC_ramstage) -MMD $(CPPFLAGS_ramstage) $(CFLAGS_ramstage) --param asan-globals=0 $$(ramstage-c-ccopts) -include $(KCONFIG_AUTOHEADER) -MT $(2) -o $(2).tmp -c $(1) && \ + $(CC_ramstage) -MMD $(CPPFLAGS_ramstage) $(CFLAGS_ramstage) -fno-lto --param asan-globals=0 $$(ramstage-c-ccopts) -include $(KCONFIG_AUTOHEADER) -MT $(2) -o $(2).tmp -c $(1) && \ $(OBJCOPY_ramstage) -O binary --only-section='.*data*' --only-section='.*bss*' \ --set-section-flags .*bss*=alloc,contents,load $(2).tmp $(2); \ rm -f $(2).tmp) \ @@ -547,6 +547,14 @@ CFLAGS_common += -Wno-array-compare endif endif +ifeq ($(CONFIG_LTO),y) +CFLAGS_common += -flto +# Clang can not deal with GCC lto objects +ifeq ($(CONFIG_COMPILER_GCC),y) +ADAFLAGS_common += -flto +endif +endif + ADAFLAGS_common += -gnatp ADAFLAGS_common += -Wuninitialized ADAFLAGS_common += -Wall @@ -1316,11 +1324,15 @@ endif # CONFIG_CBFS_VERIFICATION define link_stage # $1 stage name - +ifeq ($(CONFIG_LTO),y) +$$(objcbfs)/$(1).debug: $$$$($(1)-libs) $$$$($(1)-objs) + @printf " LINK $$(subst $$(obj)/,,$$(@))\n" + $$(CC_$(1)) $$(CPPFLAGS_$(1)) $$(CFLAGS_$(1)) $$(LDFLAGS_$(1):%=-Wl,%) -o $$@ -L$$(obj) $$(COMPILER_RT_FLAGS_$(1):%=-Wl,%) -Wl,--whole-archive -Wl,--start-group $$(filter-out %.ld,$$($(1)-objs)) $$($(1)-libs) -Wl,--no-whole-archive $$(COMPILER_RT_$(1)) -Wl,--end-group -T $(call src-to-obj,$(1),$(CONFIG_MEMLAYOUT_LD_FILE)) +else $$(objcbfs)/$(1).debug: $$$$($(1)-libs) $$$$($(1)-objs) @printf " LINK $$(subst $$(obj)/,,$$(@))\n" $$(LD_$(1)) $$(LDFLAGS_$(1)) -o $$@ -L$$(obj) $$(COMPILER_RT_FLAGS_$(1)) --whole-archive --start-group $$(filter-out %.ld,$$($(1)-objs)) $$($(1)-libs) --no-whole-archive $$(COMPILER_RT_$(1)) --end-group -T $(call src-to-obj,$(1),$(CONFIG_MEMLAYOUT_LD_FILE)) - +endif endef ifeq ($(CONFIG_SEPARATE_ROMSTAGE),y) diff --git a/src/Kconfig b/src/Kconfig index b6dc67f00a..55fad952bb 100644 --- a/src/Kconfig +++ b/src/Kconfig @@ -116,6 +116,13 @@ config CCACHE For details see https://ccache.samba.org. +config LTO + bool "Use link time optimization (LTO) (experimental)" + default n + help + Compile with link time optimization. This can often decrease the + final binary size, but may increase compilation time. + config IWYU bool "Test platform with include-what-you-use" help |