diff options
author | Rafael Espindola <rafael.espindola@gmail.com> | 2016-04-05 01:38:43 +0000 |
---|---|---|
committer | Rafael Espindola <rafael.espindola@gmail.com> | 2016-04-05 01:38:43 +0000 |
commit | 5cea969dca1964c6b9d600f6668a27f09150d753 (patch) | |
tree | 761030214390b620f8f5aacc3504d45f6dacd249 | |
parent | c393c028a9214dca33dff88816db38846c8c2c74 (diff) | |
download | bcm5719-llvm-5cea969dca1964c6b9d600f6668a27f09150d753.tar.gz bcm5719-llvm-5cea969dca1964c6b9d600f6668a27f09150d753.zip |
Fix another case of propagating IsUsedRegularObj.
I have an idea on how to clean this up, but lets get the tests passing
first.
llvm-svn: 265374
-rw-r--r-- | lld/ELF/SymbolTable.cpp | 5 | ||||
-rw-r--r-- | lld/test/ELF/lto/Inputs/archive-3.ll | 5 | ||||
-rw-r--r-- | lld/test/ELF/lto/archive-3.ll | 19 |
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 +} |