From 3d4c69c04de5d7fc30c5d1df430a51a5bd3c6a3d Mon Sep 17 00:00:00 2001 From: Rui Ueyama Date: Thu, 2 Jul 2015 02:38:59 +0000 Subject: COFF: Resolve AlternateNames using weak aliases. Previously, we use SymbolTable::rename to resolve AlternateName symbols. This patch is to merge that mechanism with weak aliases, so that we remove that function. llvm-svn: 241230 --- lld/COFF/Driver.cpp | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) (limited to 'lld/COFF/Driver.cpp') diff --git a/lld/COFF/Driver.cpp b/lld/COFF/Driver.cpp index 85c63edee42..6db8f01f30d 100644 --- a/lld/COFF/Driver.cpp +++ b/lld/COFF/Driver.cpp @@ -555,8 +555,6 @@ bool LinkerDriver::link(llvm::ArrayRef ArgsArr) { // A new file may contain a directive section to add new command line options. // That's why we have to repeat until converge.) for (;;) { - size_t Ver = Symtab.getVersion(); - // Windows specific -- if entry point is not found, // search for its mangled names. if (Config->Entry) @@ -570,22 +568,23 @@ bool LinkerDriver::link(llvm::ArrayRef ArgsArr) { // Add weak aliases. Weak aliases is a mechanism to give remaining // undefined symbols final chance to be resolved successfully. - // This is symbol renaming. - for (auto &P : Config->AlternateNames) { - StringRef From = P.first; - StringRef To = P.second; - if (auto EC = Symtab.rename(From, To)) { - llvm::errs() << EC.message() << "\n"; - return false; - } + for (auto Pair : Config->AlternateNames) { + StringRef From = Pair.first; + StringRef To = Pair.second; + Symbol* Sym = Symtab.findSymbol(From); + if (!Sym) + continue; + if (auto *U = dyn_cast(Sym->Body)) + if (!U->WeakAlias) + U->WeakAlias = Symtab.addUndefined(To); } + if (Symtab.queueEmpty()) + break; if (auto EC = Symtab.run()) { llvm::errs() << EC.message() << "\n"; return false; } - if (Ver == Symtab.getVersion()) - break; } // Make sure we have resolved all symbols. -- cgit v1.2.3