libpayload: Add support for link time optimization
Link time optimization is a technique for whole-program optimization. Instead of doing code generation during compilation, the compiler saves its intermediate representation to the object files. During the final linking step, it will then merge all the object files together and perform optimizations on the entire program. This can often reduce the final binary size, but also may increase the total compilation time. This patch introduces a Kconfig option for enabling link time optimization in libpayload. Since libpayload does no linking of its own, its LTO archive files will contain only IR and no generated code. Downstream projects will need to use LTO-aware tools when manipulating the archives (eg. gcc-ar and gcc-nm), but otherwise do not need to use LTO themselves -- the compiler will recognize which files are LTO and which are not, so enabling this option should mostly be "drop in". For example, when building coreinfo.elf using tinycurses libpayload: binary size compilation time default 114 KiB 11.49s LTO 95 KiB 10.36s In this case the total compilation time was actually shorter -- despite the final linking step taking longer, this was offset by the shorter compilation times for each individual file (since there is no code gen until the very end). Change-Id: I048f2ff6298ed0d891098942e1e8b29d35487b91 Signed-off-by: Jacob Garber <jgarber1@ualberta.ca> Reviewed-on: https://review.coreboot.org/c/coreboot/+/38291 Reviewed-by: Nico Huber <nico.h@gmx.de> Reviewed-by: Martin Roth <martinroth@google.com> Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
This commit is contained in:
parent
b524d2bb1f
commit
04540f1549
|
@ -79,6 +79,14 @@ config COMPILER_LLVM_CLANG
|
||||||
|
|
||||||
endchoice
|
endchoice
|
||||||
|
|
||||||
|
config LTO
|
||||||
|
bool "Use link time optimization (LTO)"
|
||||||
|
default n
|
||||||
|
depends on COMPILER_GCC
|
||||||
|
help
|
||||||
|
Compile with link time optimization. This can often decrease the
|
||||||
|
final binary size, but may increase compilation time.
|
||||||
|
|
||||||
config REMOTEGDB
|
config REMOTEGDB
|
||||||
bool "Remote GDB stub"
|
bool "Remote GDB stub"
|
||||||
default n
|
default n
|
||||||
|
|
|
@ -64,6 +64,10 @@ CFLAGS += -Wall -Wundef -Wstrict-prototypes -Wmissing-prototypes -Wvla
|
||||||
CFLAGS += -Wwrite-strings -Wredundant-decls -Wno-trigraphs -Wimplicit-fallthrough
|
CFLAGS += -Wwrite-strings -Wredundant-decls -Wno-trigraphs -Wimplicit-fallthrough
|
||||||
CFLAGS += -Wstrict-aliasing -Wshadow -Werror
|
CFLAGS += -Wstrict-aliasing -Wshadow -Werror
|
||||||
|
|
||||||
|
ifeq ($(CONFIG_LP_LTO),y)
|
||||||
|
CFLAGS += -flto
|
||||||
|
endif
|
||||||
|
|
||||||
$(obj)/libpayload-config.h: $(KCONFIG_AUTOHEADER)
|
$(obj)/libpayload-config.h: $(KCONFIG_AUTOHEADER)
|
||||||
cmp $@ $< 2>/dev/null || cp $< $@
|
cmp $@ $< 2>/dev/null || cp $< $@
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue