From f21ad5d749123bb5cc8b388d8fd0055f7515f8e7 Mon Sep 17 00:00:00 2001 From: Travis Geiselbrecht Date: Sat, 22 Mar 2014 21:03:03 -0700 Subject: [PATCH] [make] miscellaneous make system tweaks -Have arch set the default optimization level. Most will use O2, but arm-m sets to Os. -Make the link time garbage collection be optional. Only set for arm-m. --- arch/arm/rules.mk | 9 ++++++--- arch/arm64/rules.mk | 6 +++--- arch/x86/rules.mk | 2 ++ engine.mk | 21 +++++++++++++-------- make/build.mk | 6 ++++++ 5 files changed, 30 insertions(+), 14 deletions(-) diff --git a/arch/arm/rules.mk b/arch/arm/rules.mk index 7adb80e9..a6843c52 100644 --- a/arch/arm/rules.mk +++ b/arch/arm/rules.mk @@ -128,6 +128,8 @@ MODULE_ARM_OVERRIDE_SRCS := \ GLOBAL_DEFINES += \ ARCH_DEFAULT_STACK_SIZE=4096 + +ARCH_OPTFLAGS := -O2 endif ifeq ($(SUBARCH),arm-m) MODULE_SRCS += \ @@ -140,8 +142,12 @@ MODULE_SRCS += \ GLOBAL_INCLUDES += \ $(LOCAL_DIR)/arm-m/CMSIS/Include +# we're building for small binaries GLOBAL_DEFINES += \ ARCH_DEFAULT_STACK_SIZE=1024 + +ARCH_OPTFLAGS := -Os +WITH_LINKER_GC := 1 endif # try to find the toolchain @@ -196,9 +202,6 @@ $(error missing MEMBASE or MEMSIZE variable, please set in target rules.mk) endif LIBGCC := $(shell $(TOOLCHAIN_PREFIX)gcc $(GLOBAL_COMPILEFLAGS) $(THUMBCFLAGS) -print-libgcc-file-name) -$(info LIBGCC = $(LIBGCC)) - -$(info GLOBAL_COMPILEFLAGS = $(GLOBAL_COMPILEFLAGS) $(THUMBCFLAGS)) # potentially generated files that should be cleaned out with clean make rule GENERATED += \ diff --git a/arch/arm64/rules.mk b/arch/arm64/rules.mk index 36d8b258..b413eea8 100644 --- a/arch/arm64/rules.mk +++ b/arch/arm64/rules.mk @@ -28,6 +28,8 @@ MODULE_SRCS += \ GLOBAL_DEFINES += \ ARCH_DEFAULT_STACK_SIZE=8192 +ARCH_OPTFLAGS := -O2 + # try to find the toolchain ifndef TOOLCHAIN_PREFIX TOOLCHAIN_PREFIX := aarch64-elf- @@ -51,9 +53,7 @@ ifeq ($(MEMVARS_SET),0) $(error missing MEMBASE or MEMSIZE variable, please set in target rules.mk) endif -LIBGCC := $(shell $(TOOLCHAIN_PREFIX)gcc $(GLOBAL_COMPILEFLAGS) $(THUMBCFLAGS) -print-libgcc-file-name) -$(info LIBGCC = $(LIBGCC)) -$(info GLOBAL_COMPILEFLAGS = $(GLOBAL_COMPILEFLAGS) $(THUMBCFLAGS)) +LIBGCC := $(shell $(TOOLCHAIN_PREFIX)gcc $(GLOBAL_COMPILEFLAGS) -print-libgcc-file-name) # potentially generated files that should be cleaned out with clean make rule GENERATED += \ diff --git a/arch/x86/rules.mk b/arch/x86/rules.mk index 545bc35b..76ab43c8 100644 --- a/arch/x86/rules.mk +++ b/arch/x86/rules.mk @@ -32,6 +32,8 @@ GLOBAL_CFLAGS += $(call cc-option,$(CC),-fno-stack-protector,) GLOBAL_COMPILEFLAGS += -fasynchronous-unwind-tables GLOBAL_COMPILEFLAGS += -gdwarf-2 +ARCH_OPTFLAGS := -O2 + # potentially generated files that should be cleaned out with clean make rule GENERATED += \ $(BUILDDIR)/kernel.ld diff --git a/engine.mk b/engine.mk index d402c119..25692f30 100644 --- a/engine.mk +++ b/engine.mk @@ -44,7 +44,7 @@ OUTELF := $(BUILDDIR)/lk.elf CONFIGHEADER := $(BUILDDIR)/config.h GLOBAL_INCLUDES := $(BUILDDIR) $(LKROOT)/include $(addsuffix /include,$(LKINC)) -GLOBAL_OPTFLAGS ?= -Os +GLOBAL_OPTFLAGS ?= $(ARCH_OPTFLAGS) GLOBAL_COMPILEFLAGS := -g -fno-builtin -finline -W -Wall -Wno-multichar -Wno-unused-parameter -Wno-unused-function -include $(CONFIGHEADER) GLOBAL_CFLAGS := --std=gnu99 -Werror-implicit-function-declaration -Wstrict-prototypes #GLOBAL_CFLAGS += -Werror @@ -53,8 +53,6 @@ GLOBAL_CPPFLAGS := -fno-exceptions -fno-rtti -fno-threadsafe-statics GLOBAL_ASMFLAGS := -DASSEMBLY GLOBAL_LDFLAGS := -GLOBAL_COMPILEFLAGS += -ffunction-sections -fdata-sections -GLOBAL_LDFLAGS += --gc-sections GLOBAL_LDFLAGS += -L $(LKROOT) # top level rule @@ -100,6 +98,12 @@ EXTRA_OBJS := # if someone defines this, the build id will be pulled into lib/version BUILDID ?= +# if this is set to 1, use ld's garbage collector for unused functions and data +WITH_LINKER_GC ?= 0 + +# comment out or override if you want to see the full output of each command +NOECHO ?= @ + # try to include the project file -include project/$(PROJECT).mk ifndef TARGET @@ -172,6 +176,9 @@ CPPFILT := $(TOOLCHAIN_PREFIX)c++filt SIZE := $(TOOLCHAIN_PREFIX)size NM := $(TOOLCHAIN_PREFIX)nm +# the logic to compile and link stuff is in here +include make/build.mk + # put all of the global build flags in config.h to force a rebuild if any change GLOBAL_DEFINES += GLOBAL_INCLUDES=\"$(subst $(SPACE),_,$(GLOBAL_INCLUDES))\" GLOBAL_DEFINES += GLOBAL_COMPILEFLAGS=\"$(subst $(SPACE),_,$(GLOBAL_COMPILEFLAGS))\" @@ -181,9 +188,6 @@ GLOBAL_DEFINES += GLOBAL_CPPFLAGS=\"$(subst $(SPACE),_,$(GLOBAL_CPPFLAGS))\" GLOBAL_DEFINES += GLOBAL_ASMFLAGS=\"$(subst $(SPACE),_,$(GLOBAL_ASMFLAGS))\" GLOBAL_DEFINES += GLOBAL_LDFLAGS=\"$(subst $(SPACE),_,$(GLOBAL_LDFLAGS))\" -# comment out or override if you want to see the full output of each command -NOECHO ?= @ - ifneq ($(OBJS),) $(warning OBJS=$(OBJS)) $(error OBJS is not empty, please convert to new module format) @@ -201,8 +205,9 @@ $(warning CPPFLAGS=$(CPPFLAGS)) $(error CPPFLAGS is not empty, please use GLOBAL_CPPFLAGS or MODULE_CPPFLAGS) endif -# the logic to compile and link stuff is in here -include make/build.mk +$(info LIBGCC = $(LIBGCC)) +$(info GLOBAL_COMPILEFLAGS = $(GLOBAL_COMPILEFLAGS)) +$(info GLOBAL_OPTFLAGS = $(GLOBAL_OPTFLAGS)) # make all object files depend on any targets in GLOBAL_SRCDEPS $(ALLOBJS): $(GLOBAL_SRCDEPS) diff --git a/make/build.mk b/make/build.mk index d0843034..5d6f4b4a 100644 --- a/make/build.mk +++ b/make/build.mk @@ -1,3 +1,9 @@ +# use linker garbage collection, if requested +ifeq ($(WITH_LINKER_GC),1) +GLOBAL_COMPILEFLAGS += -ffunction-sections -fdata-sections +GLOBAL_LDFLAGS += --gc-sections +endif + $(OUTBIN): $(OUTELF) @echo generating image: $@ $(NOECHO)$(SIZE) $<