summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lld/ELF/SymbolTable.cpp5
-rw-r--r--lld/test/ELF/lto/Inputs/archive-3.ll5
-rw-r--r--lld/test/ELF/lto/archive-3.ll19
3 files changed, 28 insertions, 1 deletions
diff --git a/lld/ELF/SymbolTable.cpp b/lld/ELF/SymbolTable.cpp
index 54f5f550529..1cc9a30e460 100644
--- a/lld/ELF/SymbolTable.cpp
+++ b/lld/ELF/SymbolTable.cpp
@@ -228,7 +228,8 @@ template <class ELFT> void SymbolTable<ELFT>::resolve(SymbolBody *New) {
}
// Found a definition for something also in an archive.
// Ignore the archive definition.
- New->setUsedInRegularObj();
+ if (L->isUsedInRegularObj())
+ New->setUsedInRegularObj();
Sym->Body = New;
return;
}
@@ -282,6 +283,8 @@ template <class ELFT> void SymbolTable<ELFT>::addLazy(Lazy *L) {
template <class ELFT>
void SymbolTable<ELFT>::addMemberFile(Undefined *Undef, Lazy *L) {
+ if (Undef->isUsedInRegularObj())
+ L->setUsedInRegularObj();
// Weak undefined symbols should not fetch members from archives.
// If we were to keep old symbol we would not know that an archive member was
// available if a strong undefined symbol shows up afterwards in the link.
diff --git a/lld/test/ELF/lto/Inputs/archive-3.ll b/lld/test/ELF/lto/Inputs/archive-3.ll
new file mode 100644
index 00000000000..ad8fb1e33ef
--- /dev/null
+++ b/lld/test/ELF/lto/Inputs/archive-3.ll
@@ -0,0 +1,5 @@
+target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
+target triple = "x86_64-unknown-linux-gnu"
+define void @foo() {
+ ret void
+}
diff --git a/lld/test/ELF/lto/archive-3.ll b/lld/test/ELF/lto/archive-3.ll
new file mode 100644
index 00000000000..350c8929c9d
--- /dev/null
+++ b/lld/test/ELF/lto/archive-3.ll
@@ -0,0 +1,19 @@
+; REQUIRES: x86
+; RUN: llvm-as %S/Inputs/archive-3.ll -o %t1.o
+; RUN: llvm-as %s -o %t2.o
+
+; RUN: ld.lld -m elf_x86_64 %t1.o %t2.o -o %t3 -save-temps
+; RUN: llvm-dis %t3.lto.bc -o - | FileCheck %s
+
+; RUN: rm -f %t.a
+; RUN: llvm-ar rcs %t.a %t1.o
+; RUN: ld.lld -m elf_x86_64 %t.a %t1.o %t2.o -o %t3 -save-temps
+; RUN: llvm-dis %t3.lto.bc -o - | FileCheck %s
+
+; CHECK: define internal void @foo() {
+
+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
+}
OpenPOWER on IntegriCloud