summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavide Italiano <davide@freebsd.org>2016-04-02 02:10:40 +0000
committerDavide Italiano <davide@freebsd.org>2016-04-02 02:10:40 +0000
commit4fda708624e1453c89e0520008de4780fc4fb885 (patch)
tree67b0759fba3c96f4bd0cf856d2492b7954b84412
parent242bbdb7bf73e99a7e79b8d37320e7f14906102f (diff)
downloadbcm5719-llvm-4fda708624e1453c89e0520008de4780fc4fb885.tar.gz
bcm5719-llvm-4fda708624e1453c89e0520008de4780fc4fb885.zip
[LTO] Fix symbols which were internalized incorrectly.
If a symbol is defined in an archive, when we replace its body the isUsedInRegularObj wasn't set correctly. Internalize makes its decision based on that bit so we ended up internalizing symbols that we shouldn't (because they're referenced). This should fix. Thanks to Peter and Rafael for discussion and help diagnosing the issue! Found during LTO of unittests. llvm-svn: 265208
-rw-r--r--lld/ELF/SymbolTable.cpp1
-rw-r--r--lld/test/ELF/lto/Inputs/archive-2.ll6
-rw-r--r--lld/test/ELF/lto/archive-2.ll28
3 files changed, 35 insertions, 0 deletions
diff --git a/lld/ELF/SymbolTable.cpp b/lld/ELF/SymbolTable.cpp
index 992a3765ac7..8bea3782781 100644
--- a/lld/ELF/SymbolTable.cpp
+++ b/lld/ELF/SymbolTable.cpp
@@ -223,6 +223,7 @@ template <class ELFT> void SymbolTable<ELFT>::resolve(SymbolBody *New) {
}
// Found a definition for something also in an archive.
// Ignore the archive definition.
+ New->setUsedInRegularObj();
Sym->Body = New;
return;
}
diff --git a/lld/test/ELF/lto/Inputs/archive-2.ll b/lld/test/ELF/lto/Inputs/archive-2.ll
new file mode 100644
index 00000000000..8236cfe5cd8
--- /dev/null
+++ b/lld/test/ELF/lto/Inputs/archive-2.ll
@@ -0,0 +1,6 @@
+target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
+target triple = "x86_64-unknown-linux-gnu"
+
+define void @_start() {
+ ret void
+}
diff --git a/lld/test/ELF/lto/archive-2.ll b/lld/test/ELF/lto/archive-2.ll
new file mode 100644
index 00000000000..6712d60c11e
--- /dev/null
+++ b/lld/test/ELF/lto/archive-2.ll
@@ -0,0 +1,28 @@
+; REQUIRES: x86
+; RUN: llvm-as %S/Inputs/archive-2.ll -o %t1.o
+; RUN: rm -f %t.a
+; RUN: llvm-ar rcs %t.a %t1.o
+; RUN: llvm-as %s -o %t2.o
+; RUN: ld.lld -m elf_x86_64 %t2.o %t.a -o %t3
+; RUN: llvm-readobj -t %t3 | FileCheck %s
+; RUN: ld.lld -m elf_x86_64 %t2.o --whole-archive %t.a -o %t3 -shared
+; RUN: llvm-readobj -t %t3 | FileCheck %s
+
+; CHECK: Name: _start (
+; CHECK-NEXT: Value:
+; CHECK-NEXT: Size:
+; CHECK-NEXT: Binding: Global
+; CHECK-NEXT: Type: Function
+; CHECK-NEXT: Other: 0
+; CHECK-NEXT: Section: .text
+
+target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
+target triple = "x86_64-unknown-linux-gnu"
+
+define void @g() {
+ call void @_start()
+ ret void
+}
+
+declare void @_start()
+
OpenPOWER on IntegriCloud