summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRafael Espindola <rafael.espindola@gmail.com>2015-10-06 15:18:50 +0000
committerRafael Espindola <rafael.espindola@gmail.com>2015-10-06 15:18:50 +0000
commit85a6e0f870f558a4895f3efe57edbdd2a9d0ece6 (patch)
tree05edf4366e2e58ed4bc5b683046a67bc37a9fac4
parent1b3341724c7772ee44e4722ef557b13258b149a2 (diff)
downloadbcm5719-llvm-85a6e0f870f558a4895f3efe57edbdd2a9d0ece6.tar.gz
bcm5719-llvm-85a6e0f870f558a4895f3efe57edbdd2a9d0ece6.zip
Never fetch members for weak undefined symbols.
We were still fetching them when the archive was seen first. We should experiment with just letting lazy symbols get to compare, it might be cleaner for ELF. llvm-svn: 249417
-rw-r--r--lld/ELF/SymbolTable.cpp6
-rw-r--r--lld/test/elf2/archive.s5
2 files changed, 10 insertions, 1 deletions
diff --git a/lld/ELF/SymbolTable.cpp b/lld/ELF/SymbolTable.cpp
index 25ba584d45b..088bf5bca71 100644
--- a/lld/ELF/SymbolTable.cpp
+++ b/lld/ELF/SymbolTable.cpp
@@ -222,6 +222,12 @@ template <class ELFT> void SymbolTable::resolve(SymbolBody *New) {
if (Lazy *L = dyn_cast<Lazy>(Existing)) {
if (New->isUndefined()) {
+ if (New->isWeak()) {
+ // See the explanation in SymbolTable::addLazy
+ L->setUsedInRegularObj();
+ L->setWeak();
+ return;
+ }
addMemberFile(L);
return;
}
diff --git a/lld/test/elf2/archive.s b/lld/test/elf2/archive.s
index da78f7aa37c..1ea0908628c 100644
--- a/lld/test/elf2/archive.s
+++ b/lld/test/elf2/archive.s
@@ -30,4 +30,7 @@
# RUN: lld -flavor gnu2 %tar %t -o %tout
# RUN: llvm-nm %tout | FileCheck --check-prefix=AR-FIRST %s
-# AR-FIRST: T _start
+# AR-FIRST: T _start
+# AR-FIRST-NEXT: w bar
+# AR-FIRST-NEXT: T end
+# AR-FIRST-NEXT: w foo
OpenPOWER on IntegriCloud