summaryrefslogtreecommitdiffstats
path: root/lld/lib/Core/Resolver.cpp
diff options
context:
space:
mode:
authorRui Ueyama <ruiu@google.com>2013-09-12 21:42:52 +0000
committerRui Ueyama <ruiu@google.com>2013-09-12 21:42:52 +0000
commit6f3254962325da383c3a98c43e8b33b0a9fa8722 (patch)
treedc5d7863222d4ccd9fe69fac5c03b0c5a5b19c03 /lld/lib/Core/Resolver.cpp
parent6ca01b4b6c76d56407444346999290a078c37b02 (diff)
downloadbcm5719-llvm-6f3254962325da383c3a98c43e8b33b0a9fa8722.tar.gz
bcm5719-llvm-6f3254962325da383c3a98c43e8b33b0a9fa8722.zip
[PECOFF] Handle weak external symbols.
Used the fallback mechanism to implement COFF weak external symbols. llvm-svn: 190633
Diffstat (limited to 'lld/lib/Core/Resolver.cpp')
-rw-r--r--lld/lib/Core/Resolver.cpp12
1 files changed, 9 insertions, 3 deletions
diff --git a/lld/lib/Core/Resolver.cpp b/lld/lib/Core/Resolver.cpp
index 716f0d48d53..2a763c555f9 100644
--- a/lld/lib/Core/Resolver.cpp
+++ b/lld/lib/Core/Resolver.cpp
@@ -211,9 +211,11 @@ void Resolver::resolveUndefines() {
// If the undefined symbol has an alternative name, try to resolve the
// symbol with the name to give it a second chance. This feature is used
// for COFF "weak external" symbol.
- if (const UndefinedAtom *fallbackUndefAtom = undefAtom->fallback()) {
- _symbolTable.addReplacement(undefAtom, fallbackUndefAtom);
- _symbolTable.add(*fallbackUndefAtom);
+ if (!_symbolTable.isDefined(undefName)) {
+ if (const UndefinedAtom *fallbackUndefAtom = undefAtom->fallback()) {
+ _symbolTable.addReplacement(undefAtom, fallbackUndefAtom);
+ _symbolTable.add(*fallbackUndefAtom);
+ }
}
}
// search libraries for overrides of common symbols
@@ -351,6 +353,10 @@ bool Resolver::checkUndefines(bool final) {
if (isa<SharedLibraryFile>(f) && _context.allowShlibUndefines())
continue;
+ // If the undefine is coalesced away, skip over it.
+ if (_symbolTable.replacement(undefAtom) != undefAtom)
+ continue;
+
// Seems like this symbol is undefined. Warn that.
foundUndefines = true;
if (_context.printRemainingUndefines()) {
OpenPOWER on IntegriCloud