diff options
| author | Rui Ueyama <ruiu@google.com> | 2013-09-12 21:42:52 +0000 |
|---|---|---|
| committer | Rui Ueyama <ruiu@google.com> | 2013-09-12 21:42:52 +0000 |
| commit | 6f3254962325da383c3a98c43e8b33b0a9fa8722 (patch) | |
| tree | dc5d7863222d4ccd9fe69fac5c03b0c5a5b19c03 /lld/lib/Core/Resolver.cpp | |
| parent | 6ca01b4b6c76d56407444346999290a078c37b02 (diff) | |
| download | bcm5719-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.cpp | 12 |
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()) { |

