summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVincent Palatin <vpalatin@chromium.org>2013-04-18 14:04:11 -0700
committerchrome-internal-fetch <chrome-internal-fetch@google.com>2014-03-11 05:53:53 +0000
commit2476ae11fce6cd549dcfe6c39aab7c126c23c234 (patch)
tree4468d98175a58d48a253148b170e605a2e100bda
parentd63999a12b3bfc5d6a58b08a3bb01a75882324fd (diff)
downloadchrome-ec-2476ae11fce6cd549dcfe6c39aab7c126c23c234.tar.gz
discard unused functions at link time
Put each functions in a separate section by using -ffunction-sections, then discard the non-referenced ones in the linker with -gc-sections. Force keeping a few special symbols by using the KEEP() linker directive. This modification is not saving a lot of spaces per se, but will enable larger code pruning with future optional features. Signed-off-by: Vincent Palatin <vpalatin@chromium.org> BRANCH=none BUG=none TEST=make buildall, manually check discarded symbols in the .map file and run on Spring and Link. The size delta is the following: Link: total 85.7k -> 84.9k (.text 60.3k -> 59.5k) Spring: total 59.2k -> 57.2k (.text 44.4k -> 42.5k) Change-Id: Ib6eb0d3f2cc4fc172c9fc26acac2e486921690a3 Reviewed-on: https://chromium-review.googlesource.com/189224 Reviewed-by: Randall Spangler <rspangler@chromium.org> Commit-Queue: Vincent Palatin <vpalatin@chromium.org> Tested-by: Vincent Palatin <vpalatin@chromium.org>
-rw-r--r--Makefile.toolchain3
-rw-r--r--core/cortex-m/ec.lds.S42
-rw-r--r--core/cortex-m0/ec.lds.S42
-rw-r--r--core/nds32/ec.lds.S42
4 files changed, 65 insertions, 64 deletions
diff --git a/Makefile.toolchain b/Makefile.toolchain
index 6d44331fc7..dd0ebb2174 100644
--- a/Makefile.toolchain
+++ b/Makefile.toolchain
@@ -40,6 +40,7 @@ CFLAGS_DEFINE=-DOUTDIR=$(out) -DCHIP=$(CHIP) -DBOARD_TASKFILE=ec.tasklist \
CPPFLAGS=$(CFLAGS_DEFINE) $(CFLAGS_INCLUDE) $(CFLAGS_TEST) \
$(EXTRA_CFLAGS) $(CFLAGS_COVERAGE)
CFLAGS=$(CPPFLAGS) $(CFLAGS_CPU) $(CFLAGS_DEBUG) $(CFLAGS_WARN) $(CFLAGS_y)
+CFLAGS+= -ffunction-sections
FTDIVERSION=$(shell $(PKG_CONFIG) --modversion libftdi1 2>/dev/null)
ifneq ($(FTDIVERSION),)
@@ -53,7 +54,7 @@ LIBFTDI_LDLIBS=$(shell $(PKG_CONFIG) --libs lib${LIBFTDI_NAME})
BUILD_CFLAGS= $(LIBFTDI_CFLAGS) $(CPPFLAGS) -O3 $(CFLAGS_DEBUG) $(CFLAGS_WARN)
HOST_CFLAGS=$(CPPFLAGS) -O3 $(CFLAGS_DEBUG) $(CFLAGS_WARN)
-LDFLAGS=-nostdlib -X
+LDFLAGS=-nostdlib -X --gc-sections
BUILD_LDFLAGS=$(LIBFTDI_LDLIBS)
HOST_TEST_LDFLAGS=-T core/host/host_exe.lds -lrt -pthread -rdynamic -lm\
$(if $(TEST_COVERAGE),-fprofile-arcs,)
diff --git a/core/cortex-m/ec.lds.S b/core/cortex-m/ec.lds.S
index c0c87e1343..e345bc93ca 100644
--- a/core/cortex-m/ec.lds.S
+++ b/core/cortex-m/ec.lds.S
@@ -25,7 +25,7 @@ SECTIONS
OUTDIR/core/CORE/init.o (.text.vecttable)
. = ALIGN(4);
__version_struct_offset = .;
- *(.rodata.ver)
+ KEEP(*(.rodata.ver))
#ifdef SHIFT_CODE_FOR_TEST
. = ALIGN(256);
#else
@@ -42,82 +42,82 @@ SECTIONS
.rodata : {
/* Symbols defined here are declared in link_defs.h */
__irqprio = .;
- *(.rodata.irqprio)
+ KEEP(*(.rodata.irqprio))
__irqprio_end = .;
. = ALIGN(4);
__cmds = .;
- *(SORT(.rodata.cmds*))
+ KEEP(*(SORT(.rodata.cmds*)))
__cmds_end = .;
. = ALIGN(4);
__hcmds = .;
- *(.rodata.hcmds)
+ KEEP(*(.rodata.hcmds))
__hcmds_end = .;
. = ALIGN(4);
__hooks_init = .;
- *(.rodata.HOOK_INIT)
+ KEEP(*(.rodata.HOOK_INIT))
__hooks_init_end = .;
__hooks_pre_freq_change = .;
- *(.rodata.HOOK_PRE_FREQ_CHANGE)
+ KEEP(*(.rodata.HOOK_PRE_FREQ_CHANGE))
__hooks_pre_freq_change_end = .;
__hooks_freq_change = .;
- *(.rodata.HOOK_FREQ_CHANGE)
+ KEEP(*(.rodata.HOOK_FREQ_CHANGE))
__hooks_freq_change_end = .;
__hooks_sysjump = .;
- *(.rodata.HOOK_SYSJUMP)
+ KEEP(*(.rodata.HOOK_SYSJUMP))
__hooks_sysjump_end = .;
__hooks_chipset_pre_init = .;
- *(.rodata.HOOK_CHIPSET_PRE_INIT)
+ KEEP(*(.rodata.HOOK_CHIPSET_PRE_INIT))
__hooks_chipset_pre_init_end = .;
__hooks_chipset_startup = .;
- *(.rodata.HOOK_CHIPSET_STARTUP)
+ KEEP(*(.rodata.HOOK_CHIPSET_STARTUP))
__hooks_chipset_startup_end = .;
__hooks_chipset_resume = .;
- *(.rodata.HOOK_CHIPSET_RESUME)
+ KEEP(*(.rodata.HOOK_CHIPSET_RESUME))
__hooks_chipset_resume_end = .;
__hooks_chipset_suspend = .;
- *(.rodata.HOOK_CHIPSET_SUSPEND)
+ KEEP(*(.rodata.HOOK_CHIPSET_SUSPEND))
__hooks_chipset_suspend_end = .;
__hooks_chipset_shutdown = .;
- *(.rodata.HOOK_CHIPSET_SHUTDOWN)
+ KEEP(*(.rodata.HOOK_CHIPSET_SHUTDOWN))
__hooks_chipset_shutdown_end = .;
__hooks_ac_change = .;
- *(.rodata.HOOK_AC_CHANGE)
+ KEEP(*(.rodata.HOOK_AC_CHANGE))
__hooks_ac_change_end = .;
__hooks_lid_change = .;
- *(.rodata.HOOK_LID_CHANGE)
+ KEEP(*(.rodata.HOOK_LID_CHANGE))
__hooks_lid_change_end = .;
__hooks_pwrbtn_change = .;
- *(.rodata.HOOK_POWER_BUTTON_CHANGE)
+ KEEP(*(.rodata.HOOK_POWER_BUTTON_CHANGE))
__hooks_pwrbtn_change_end = .;
__hooks_charge_state_change = .;
- *(.rodata.HOOK_CHARGE_STATE_CHANGE)
+ KEEP(*(.rodata.HOOK_CHARGE_STATE_CHANGE))
__hooks_charge_state_change_end = .;
__hooks_tick = .;
- *(.rodata.HOOK_TICK)
+ KEEP(*(.rodata.HOOK_TICK))
__hooks_tick_end = .;
__hooks_second = .;
- *(.rodata.HOOK_SECOND)
+ KEEP(*(.rodata.HOOK_SECOND))
__hooks_second_end = .;
__deferred_funcs = .;
- *(.rodata.deferred)
+ KEEP(*(.rodata.deferred))
__deferred_funcs_end = .;
. = ALIGN(4);
@@ -125,7 +125,7 @@ SECTIONS
#if defined(SECTION_IS_RO) && defined(CONFIG_FLASH)
. = ALIGN(64);
- *(.google)
+ KEEP(*(.google))
#endif
. = ALIGN(4);
#ifdef COMPILE_FOR_RAM
diff --git a/core/cortex-m0/ec.lds.S b/core/cortex-m0/ec.lds.S
index ac05bbc333..28e52869f8 100644
--- a/core/cortex-m0/ec.lds.S
+++ b/core/cortex-m0/ec.lds.S
@@ -25,7 +25,7 @@ SECTIONS
OUTDIR/core/CORE/init.o (.text.vecttable)
. = ALIGN(4);
__version_struct_offset = .;
- *(.rodata.ver)
+ KEEP(*(.rodata.ver))
#ifdef SHIFT_CODE_FOR_TEST
. = ALIGN(256);
#else
@@ -42,82 +42,82 @@ SECTIONS
.rodata : {
/* Symbols defined here are declared in link_defs.h */
__irqprio = .;
- *(.rodata.irqprio)
+ KEEP(*(.rodata.irqprio))
__irqprio_end = .;
. = ALIGN(4);
__cmds = .;
- *(SORT(.rodata.cmds*))
+ KEEP(*(SORT(.rodata.cmds*)))
__cmds_end = .;
. = ALIGN(4);
__hcmds = .;
- *(.rodata.hcmds)
+ KEEP(*(.rodata.hcmds))
__hcmds_end = .;
. = ALIGN(4);
__hooks_init = .;
- *(.rodata.HOOK_INIT)
+ KEEP(*(.rodata.HOOK_INIT))
__hooks_init_end = .;
__hooks_pre_freq_change = .;
- *(.rodata.HOOK_PRE_FREQ_CHANGE)
+ KEEP(*(.rodata.HOOK_PRE_FREQ_CHANGE))
__hooks_pre_freq_change_end = .;
__hooks_freq_change = .;
- *(.rodata.HOOK_FREQ_CHANGE)
+ KEEP(*(.rodata.HOOK_FREQ_CHANGE))
__hooks_freq_change_end = .;
__hooks_sysjump = .;
- *(.rodata.HOOK_SYSJUMP)
+ KEEP(*(.rodata.HOOK_SYSJUMP))
__hooks_sysjump_end = .;
__hooks_chipset_pre_init = .;
- *(.rodata.HOOK_CHIPSET_PRE_INIT)
+ KEEP(*(.rodata.HOOK_CHIPSET_PRE_INIT))
__hooks_chipset_pre_init_end = .;
__hooks_chipset_startup = .;
- *(.rodata.HOOK_CHIPSET_STARTUP)
+ KEEP(*(.rodata.HOOK_CHIPSET_STARTUP))
__hooks_chipset_startup_end = .;
__hooks_chipset_resume = .;
- *(.rodata.HOOK_CHIPSET_RESUME)
+ KEEP(*(.rodata.HOOK_CHIPSET_RESUME))
__hooks_chipset_resume_end = .;
__hooks_chipset_suspend = .;
- *(.rodata.HOOK_CHIPSET_SUSPEND)
+ KEEP(*(.rodata.HOOK_CHIPSET_SUSPEND))
__hooks_chipset_suspend_end = .;
__hooks_chipset_shutdown = .;
- *(.rodata.HOOK_CHIPSET_SHUTDOWN)
+ KEEP(*(.rodata.HOOK_CHIPSET_SHUTDOWN))
__hooks_chipset_shutdown_end = .;
__hooks_ac_change = .;
- *(.rodata.HOOK_AC_CHANGE)
+ KEEP(*(.rodata.HOOK_AC_CHANGE))
__hooks_ac_change_end = .;
__hooks_lid_change = .;
- *(.rodata.HOOK_LID_CHANGE)
+ KEEP(*(.rodata.HOOK_LID_CHANGE))
__hooks_lid_change_end = .;
__hooks_pwrbtn_change = .;
- *(.rodata.HOOK_POWER_BUTTON_CHANGE)
+ KEEP(*(.rodata.HOOK_POWER_BUTTON_CHANGE))
__hooks_pwrbtn_change_end = .;
__hooks_charge_state_change = .;
- *(.rodata.HOOK_CHARGE_STATE_CHANGE)
+ KEEP(*(.rodata.HOOK_CHARGE_STATE_CHANGE))
__hooks_charge_state_change_end = .;
__hooks_tick = .;
- *(.rodata.HOOK_TICK)
+ KEEP(*(.rodata.HOOK_TICK))
__hooks_tick_end = .;
__hooks_second = .;
- *(.rodata.HOOK_SECOND)
+ KEEP(*(.rodata.HOOK_SECOND))
__hooks_second_end = .;
__deferred_funcs = .;
- *(.rodata.deferred)
+ KEEP(*(.rodata.deferred))
__deferred_funcs_end = .;
. = ALIGN(4);
@@ -125,7 +125,7 @@ SECTIONS
#if defined(SECTION_IS_RO) && defined(CONFIG_FLASH)
. = ALIGN(64);
- *(.google)
+ KEEP(*(.google))
#endif
. = ALIGN(4);
#ifdef COMPILE_FOR_RAM
diff --git a/core/nds32/ec.lds.S b/core/nds32/ec.lds.S
index f1d021c3b0..84e08d34bc 100644
--- a/core/nds32/ec.lds.S
+++ b/core/nds32/ec.lds.S
@@ -25,7 +25,7 @@ SECTIONS
OUTDIR/core/CORE/init.o (.text.vecttable)
. = ALIGN(4);
__version_struct_offset = .;
- *(.rodata.ver)
+ KEEP(*(.rodata.ver))
#ifdef SHIFT_CODE_FOR_TEST
. = ALIGN(256);
#else
@@ -43,7 +43,7 @@ SECTIONS
.rodata : {
/* Symbols defined here are declared in link_defs.h */
__irqprio = .;
- *(.rodata.irqprio)
+ KEEP(*(.rodata.irqprio))
__irqprio_end = .;
. = ALIGN(4);
@@ -52,77 +52,77 @@ SECTIONS
. = ALIGN(4);
__cmds = .;
- *(SORT(.rodata.cmds*))
+ KEEP(*(SORT(.rodata.cmds*)))
__cmds_end = .;
. = ALIGN(4);
__hcmds = .;
- *(.rodata.hcmds)
+ KEEP(*(.rodata.hcmds))
__hcmds_end = .;
. = ALIGN(4);
__hooks_init = .;
- *(.rodata.HOOK_INIT)
+ KEEP(*(.rodata.HOOK_INIT))
__hooks_init_end = .;
__hooks_pre_freq_change = .;
- *(.rodata.HOOK_PRE_FREQ_CHANGE)
+ KEEP(*(.rodata.HOOK_PRE_FREQ_CHANGE))
__hooks_pre_freq_change_end = .;
__hooks_freq_change = .;
- *(.rodata.HOOK_FREQ_CHANGE)
+ KEEP(*(.rodata.HOOK_FREQ_CHANGE))
__hooks_freq_change_end = .;
__hooks_sysjump = .;
- *(.rodata.HOOK_SYSJUMP)
+ KEEP(*(.rodata.HOOK_SYSJUMP))
__hooks_sysjump_end = .;
__hooks_chipset_pre_init = .;
- *(.rodata.HOOK_CHIPSET_PRE_INIT)
+ KEEP(*(.rodata.HOOK_CHIPSET_PRE_INIT))
__hooks_chipset_pre_init_end = .;
__hooks_chipset_startup = .;
- *(.rodata.HOOK_CHIPSET_STARTUP)
+ KEEP(*(.rodata.HOOK_CHIPSET_STARTUP))
__hooks_chipset_startup_end = .;
__hooks_chipset_resume = .;
- *(.rodata.HOOK_CHIPSET_RESUME)
+ KEEP(*(.rodata.HOOK_CHIPSET_RESUME))
__hooks_chipset_resume_end = .;
__hooks_chipset_suspend = .;
- *(.rodata.HOOK_CHIPSET_SUSPEND)
+ KEEP(*(.rodata.HOOK_CHIPSET_SUSPEND))
__hooks_chipset_suspend_end = .;
__hooks_chipset_shutdown = .;
- *(.rodata.HOOK_CHIPSET_SHUTDOWN)
+ KEEP(*(.rodata.HOOK_CHIPSET_SHUTDOWN))
__hooks_chipset_shutdown_end = .;
__hooks_ac_change = .;
- *(.rodata.HOOK_AC_CHANGE)
+ KEEP(*(.rodata.HOOK_AC_CHANGE))
__hooks_ac_change_end = .;
__hooks_lid_change = .;
- *(.rodata.HOOK_LID_CHANGE)
+ KEEP(*(.rodata.HOOK_LID_CHANGE))
__hooks_lid_change_end = .;
__hooks_pwrbtn_change = .;
- *(.rodata.HOOK_POWER_BUTTON_CHANGE)
+ KEEP(*(.rodata.HOOK_POWER_BUTTON_CHANGE))
__hooks_pwrbtn_change_end = .;
__hooks_charge_state_change = .;
- *(.rodata.HOOK_CHARGE_STATE_CHANGE)
+ KEEP(*(.rodata.HOOK_CHARGE_STATE_CHANGE))
__hooks_charge_state_change_end = .;
__hooks_tick = .;
- *(.rodata.HOOK_TICK)
+ KEEP(*(.rodata.HOOK_TICK))
__hooks_tick_end = .;
__hooks_second = .;
- *(.rodata.HOOK_SECOND)
+ KEEP(*(.rodata.HOOK_SECOND))
__hooks_second_end = .;
__deferred_funcs = .;
- *(.rodata.deferred)
+ KEEP(*(.rodata.deferred))
__deferred_funcs_end = .;
. = ALIGN(4);
@@ -130,7 +130,7 @@ SECTIONS
#if defined(SECTION_IS_RO) && defined(CONFIG_FLASH)
. = ALIGN(64);
- *(.google)
+ KEEP(*(.google))
#endif
. = ALIGN(4);
#ifdef COMPILE_FOR_RAM