diff options
author | Rafael Espindola <rafael.espindola@gmail.com> | 2015-10-06 15:18:50 +0000 |
---|---|---|
committer | Rafael Espindola <rafael.espindola@gmail.com> | 2015-10-06 15:18:50 +0000 |
commit | 85a6e0f870f558a4895f3efe57edbdd2a9d0ece6 (patch) | |
tree | 05edf4366e2e58ed4bc5b683046a67bc37a9fac4 | |
parent | 1b3341724c7772ee44e4722ef557b13258b149a2 (diff) | |
download | bcm5719-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.cpp | 6 | ||||
-rw-r--r-- | lld/test/elf2/archive.s | 5 |
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 |