From 166a147ee472c9f2374df67511f782f9723726f6 Mon Sep 17 00:00:00 2001 From: Travis Geiselbrecht Date: Sun, 12 Jul 2020 13:17:49 -0700 Subject: [PATCH] WIP [LTO] try to build and link with LTO Doesn't work, it strips all of the magic sections. --- engine.mk | 5 +++++ make/build.mk | 6 ++++++ make/module.mk | 18 ++++++++++++------ 3 files changed, 23 insertions(+), 6 deletions(-) diff --git a/engine.mk b/engine.mk index 8b3051ee..4b80f5cf 100644 --- a/engine.mk +++ b/engine.mk @@ -64,6 +64,11 @@ GLOBAL_CPPFLAGS := --std=c++11 -fno-exceptions -fno-rtti -fno-threadsafe-statics GLOBAL_ASMFLAGS := -DASSEMBLY GLOBAL_LDFLAGS := +WITH_LTO ?= true +ifeq (true,$(call TOBOOL,$(WITH_LTO))) +GLOBAL_COMPILEFLAGS += -flto -fno-fat-lto-objects +endif + # if WERROR is set, add to the compile args ifeq (true,$(call TOBOOL,$(WERROR))) GLOBAL_COMPILEFLAGS += -Werror diff --git a/make/build.mk b/make/build.mk index 49d26b3a..b017cb9b 100644 --- a/make/build.mk +++ b/make/build.mk @@ -21,10 +21,16 @@ $(OUTELF).hex: $(OUTELF) $(OUTELF): $(ALLMODULE_OBJS) $(EXTRA_OBJS) $(LINKER_SCRIPT) $(EXTRA_LINKER_SCRIPTS) $(info linking $@) +ifeq (true,$(call TOBOOL,$(WITH_LTO))) + $(NOECHO)$(CC) -nostdlib -flto $(GLOBAL_LDFLAGS) $(ARCH_LDFLAGS) -T $(LINKER_SCRIPT) \ + $(addprefix -T,$(EXTRA_LINKER_SCRIPTS)) -march=rv64imac -mabi=lp64 -mcmodel=medany \ + $(ALLMODULE_OBJS) $(EXTRA_OBJS) $(LIBGCC) -o $@ +else $(NOECHO)$(SIZE) -t --common $(sort $(ALLMODULE_OBJS)) $(EXTRA_OBJS) $(NOECHO)$(LD) $(GLOBAL_LDFLAGS) $(ARCH_LDFLAGS) -dT $(LINKER_SCRIPT) \ $(addprefix -T,$(EXTRA_LINKER_SCRIPTS)) \ $(ALLMODULE_OBJS) $(EXTRA_OBJS) $(LIBGCC) -Map=$(OUTELF).map -o $@ +endif $(OUTELF).sym: $(OUTELF) $(info generating symbols: $@) diff --git a/make/module.mk b/make/module.mk index dcd97936..386fc51c 100644 --- a/make/module.mk +++ b/make/module.mk @@ -83,6 +83,13 @@ include make/compile.mk # MODULE_OBJS is passed back from compile.mk #$(info MODULE_OBJS = $(MODULE_OBJS)) +# track all of the source files compiled +ALLSRCS += $(MODULE_SRCS) + +# track all the objects built +ALLOBJS += $(MODULE_OBJS) + +ifeq (false,$(call TOBOOL,$(WITH_LTO))) # build a ld -r style combined object MODULE_OBJECT := $(call TOBUILDDIR,$(MODULE_SRCDIR).mod.o) $(MODULE_OBJECT): $(MODULE_OBJS) $(MODULE_EXTRA_OBJS) @@ -90,17 +97,16 @@ $(MODULE_OBJECT): $(MODULE_OBJS) $(MODULE_EXTRA_OBJS) $(info linking $@) $(NOECHO)$(LD) $(GLOBAL_MODULE_LDFLAGS) -r $^ -o $@ -# track all of the source files compiled -ALLSRCS += $(MODULE_SRCS) - -# track all the objects built -ALLOBJS += $(MODULE_OBJS) - # track the module object for make clean GENERATED += $(MODULE_OBJECT) # make the rest of the build depend on our output ALLMODULE_OBJS := $(ALLMODULE_OBJS) $(MODULE_OBJECT) +else +# for LTO builds just add all of the .o files from this module to the global +# link line. ld -r seems to foul up LTO +ALLMODULE_OBJS := $(ALLMODULE_OBJS) $(MODULE_OBJS) $(MODULE_EXTRA_OBJS) +endif # empty out any vars set here MODULE :=