summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBill Wendling <isanbard@gmail.com>2018-07-12 20:35:58 +0000
committerBill Wendling <isanbard@gmail.com>2018-07-12 20:35:58 +0000
commit7bd9e94e385b41887c4d7205f1e70b36b4a5f5fc (patch)
treeb9743450f6a335fbdb74942a20a7075f61d91fa0
parent2bb551c6bf0275241feb054aef21412b07bc16cf (diff)
downloadbcm5719-llvm-7bd9e94e385b41887c4d7205f1e70b36b4a5f5fc.tar.gz
bcm5719-llvm-7bd9e94e385b41887c4d7205f1e70b36b4a5f5fc.zip
[gold-plugin] Disable section ordering for relocatable links
Not all programs want section ordering when compiled with LTO. In particular, the Linux kernel is very sensitive when it comes to linking, and doesn't boot when each function is placed in its own sections. Reviewed By: pcc Differential Revision: https://reviews.llvm.org/D48756 llvm-svn: 336943
-rw-r--r--llvm/test/tools/gold/X86/relocatable.ll2
-rw-r--r--llvm/tools/gold/gold-plugin.cpp8
2 files changed, 6 insertions, 4 deletions
diff --git a/llvm/test/tools/gold/X86/relocatable.ll b/llvm/test/tools/gold/X86/relocatable.ll
index a7cd8f4ac0b..cc4d020a78c 100644
--- a/llvm/test/tools/gold/X86/relocatable.ll
+++ b/llvm/test/tools/gold/X86/relocatable.ll
@@ -10,7 +10,7 @@
; CHECK-NEXT: Binding: Global
; CHECK-NEXT: Type: Function
; CHECK-NEXT: Other: 0
-; CHECK-NEXT: Section: .text.foo
+; CHECK-NEXT: Section: .text
; CHECK-NEXT: }
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
diff --git a/llvm/tools/gold/gold-plugin.cpp b/llvm/tools/gold/gold-plugin.cpp
index 25ba80d2666..6c55ebcddc4 100644
--- a/llvm/tools/gold/gold-plugin.cpp
+++ b/llvm/tools/gold/gold-plugin.cpp
@@ -115,6 +115,7 @@ static ld_plugin_add_input_file add_input_file = nullptr;
static ld_plugin_set_extra_library_path set_extra_library_path = nullptr;
static ld_plugin_get_view get_view = nullptr;
static bool IsExecutable = false;
+static bool SplitSections = true;
static Optional<Reloc::Model> RelocationModel = None;
static std::string output_name = "";
static std::list<claimed_file> Modules;
@@ -324,6 +325,7 @@ ld_plugin_status onload(ld_plugin_tv *tv) {
switch (tv->tv_u.tv_val) {
case LDPO_REL: // .o
IsExecutable = false;
+ SplitSections = false;
break;
case LDPO_DYN: // .so
IsExecutable = false;
@@ -834,9 +836,9 @@ static std::unique_ptr<LTO> createLTO(IndexWriteCallback OnIndexWrite,
// FIXME: Check the gold version or add a new option to enable them.
Conf.Options.RelaxELFRelocations = false;
- // Enable function/data sections by default.
- Conf.Options.FunctionSections = true;
- Conf.Options.DataSections = true;
+ // Toggle function/data sections.
+ Conf.Options.FunctionSections = SplitSections;
+ Conf.Options.DataSections = SplitSections;
Conf.MAttrs = MAttrs;
Conf.RelocModel = RelocationModel;
OpenPOWER on IntegriCloud