diff options
author | Simon Brenner <olsner@gmail.com> | 2015-11-12 11:10:54 +0100 |
---|---|---|
committer | Ben Gamari <ben@smart-cactus.org> | 2015-11-12 11:10:54 +0100 |
commit | 4a32bf925b8aba7885d9c745769fe84a10979a53 (patch) | |
tree | 73869f4df99cdb434e7fdd10f67cc9ea96022f4c /rules | |
parent | 9bea234dbe3b36957acc42f74f0d54ddc05ad139 (diff) | |
download | haskell-4a32bf925b8aba7885d9c745769fe84a10979a53.tar.gz |
Implement function-sections for Haskell code, #8405
This adds a flag -split-sections that does similar things to
-split-objs, but using sections in single object files instead of
relying on the Satanic Splitter and other abominations. This is very
similar to the GCC flags -ffunction-sections and -fdata-sections.
The --gc-sections linker flag, which allows unused sections to actually
be removed, is added to all link commands (if the linker supports it) so
that space savings from having base compiled with sections can be
realized.
Supported both in LLVM and the native code-gen, in theory for all
architectures, but really tested on x86 only.
In the GHC build, a new SplitSections variable enables -split-sections
for relevant parts of the build.
Test Plan: validate with both settings of SplitSections
Reviewers: dterei, Phyx, austin, simonmar, thomie, bgamari
Reviewed By: simonmar, thomie, bgamari
Subscribers: hsyl20, erikd, kgardas, thomie
Differential Revision: https://phabricator.haskell.org/D1242
GHC Trac Issues: #8405
Diffstat (limited to 'rules')
-rw-r--r-- | rules/build-package-way.mk | 6 | ||||
-rw-r--r-- | rules/build-package.mk | 9 | ||||
-rw-r--r-- | rules/distdir-way-opts.mk | 1 |
3 files changed, 14 insertions, 2 deletions
diff --git a/rules/build-package-way.mk b/rules/build-package-way.mk index a10e53833e..d048f74b95 100644 --- a/rules/build-package-way.mk +++ b/rules/build-package-way.mk @@ -136,6 +136,8 @@ BINDIST_LIBS += $$($1_$2_$3_LIB) BINDIST_LIBS += $$($1_$2_$3_LIB0) endif +$1_$2_LD_SCRIPT = driver/utils/merge_sections.ld + # Build the GHCi library ifeq "$$(DYNAMIC_GHC_PROGRAMS)" "YES" $1_$2_GHCI_LIB = $$($1_$2_dyn_LIB) @@ -148,8 +150,8 @@ ifneq "$4" "0" BINDIST_LIBS += $$($1_$2_GHCI_LIB) endif endif -$$($1_$2_GHCI_LIB) : $$($1_$2_$3_HS_OBJS) $$($1_$2_$3_CMM_OBJS) $$($1_$2_$3_C_OBJS) $$($1_$2_$3_S_OBJS) $$($1_$2_EXTRA_OBJS) - $$(call cmd,LD) $$(CONF_LD_LINKER_OPTS_STAGE$4) -r -o $$@ $$(EXTRA_LD_OPTS) $$($1_$2_$3_HS_OBJS) $$($1_$2_$3_CMM_OBJS) $$($1_$2_$3_C_OBJS) $$($1_$2_$3_S_OBJS) $$($1_$2_EXTRA_OBJS) +$$($1_$2_GHCI_LIB) : $$($1_$2_$3_HS_OBJS) $$($1_$2_$3_CMM_OBJS) $$($1_$2_$3_C_OBJS) $$($1_$2_$3_S_OBJS) $$($1_$2_EXTRA_OBJS) $$($1_$2_LD_SCRIPT) + $$(call cmd,LD) $$(CONF_LD_LINKER_OPTS_STAGE$4) -r $(if $(filter YES,$(LdIsGNULd)),-T $$($1_$2_LD_SCRIPT)) -o $$@ $$(EXTRA_LD_OPTS) $$($1_$2_$3_HS_OBJS) $$($1_$2_$3_CMM_OBJS) $$($1_$2_$3_C_OBJS) $$($1_$2_$3_S_OBJS) $$($1_$2_EXTRA_OBJS) ifeq "$$($1_$2_BUILD_GHCI_LIB)" "YES" # Don't bother making ghci libs for bootstrapping packages diff --git a/rules/build-package.mk b/rules/build-package.mk index 688e1d2ca5..9599c57eb3 100644 --- a/rules/build-package.mk +++ b/rules/build-package.mk @@ -110,6 +110,15 @@ else $1_$2_SplitObjs = NO endif endif +# Disable split sections when building with stage0, it won't be supported yet +# and it's probably not very relevant anyway (smaller stage1 ghc?). +ifeq "$$($1_$2_SplitSections)" "" +ifeq "$3" "1" +$1_$2_SplitSections = $(SplitSections) +else +$1_$2_SplitSections = NO +endif +endif $(call hs-sources,$1,$2) $(call c-sources,$1,$2) diff --git a/rules/distdir-way-opts.mk b/rules/distdir-way-opts.mk index 920ff07f20..47f6f90237 100644 --- a/rules/distdir-way-opts.mk +++ b/rules/distdir-way-opts.mk @@ -136,6 +136,7 @@ $1_$2_$3_ALL_HC_OPTS = \ -hisuf $$($3_hisuf) -osuf $$($3_osuf) -hcsuf $$($3_hcsuf) \ $$($1_$2_$3_MOST_DIR_HC_OPTS) \ $$(if $$(findstring YES,$$($1_$2_SplitObjs)),$$(if $$(findstring dyn,$3),,-split-objs),) \ + $$(if $$(findstring YES,$$($1_$2_SplitSections)),$$(if $$(findstring dyn,$3),,-split-sections),) \ $$(if $$(findstring YES,$$($1_$2_DYNAMIC_TOO)),$$(if $$(findstring v,$3),-dynamic-too)) ifeq "$3" "dyn" |