From 4c134ea3b8c7cc5b85dc2d9e8584f7694a7e6387 Mon Sep 17 00:00:00 2001 From: Rui Ueyama Date: Thu, 22 Dec 2016 09:54:32 +0000 Subject: [PATCH] Do not return null or Undefined from find{All,}ByVersion. Vectors returned form that function contained nullptrs or Undefined symbols. This patch filter them out. This makes use of the function a bit easier. llvm-svn: 290334 --- lld/ELF/SymbolTable.cpp | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/lld/ELF/SymbolTable.cpp b/lld/ELF/SymbolTable.cpp index 46cbc9514003..79097e176e68 100644 --- a/lld/ELF/SymbolTable.cpp +++ b/lld/ELF/SymbolTable.cpp @@ -561,6 +561,8 @@ StringMap> &SymbolTable::getDemangledSyms() { DemangledSyms.emplace(); for (Symbol *Sym : SymVector) { SymbolBody *B = Sym->body(); + if (B->isUndefined()) + continue; if (Optional S = demangle(B->getName())) (*DemangledSyms)[*S].push_back(B); else @@ -574,7 +576,10 @@ template std::vector SymbolTable::findByVersion(SymbolVersion Ver) { if (Ver.IsExternCpp) return getDemangledSyms().lookup(Ver.Name); - return {find(Ver.Name)}; + if (SymbolBody *B = find(Ver.Name)) + if (!B->isUndefined()) + return {B}; + return {}; } template @@ -586,16 +591,13 @@ SymbolTable::findAllByVersion(SymbolVersion Ver) { if (Ver.IsExternCpp) { for (auto &P : getDemangledSyms()) if (M.match(P.first())) - for (SymbolBody *Body : P.second) - if (!Body->isUndefined()) - Res.push_back(Body); + Res.insert(Res.end(), P.second.begin(), P.second.end()); return Res; } for (Symbol *Sym : SymVector) { SymbolBody *B = Sym->body(); - StringRef Name = B->getName(); - if (!B->isUndefined() && M.match(Name)) + if (!B->isUndefined() && M.match(B->getName())) Res.push_back(B); } return Res; @@ -614,8 +616,7 @@ template void SymbolTable::handleAnonymousVersion() { continue; } for (SymbolBody *B : findByVersion(Ver)) - if (B) - B->symbol()->VersionId = VER_NDX_GLOBAL; + B->symbol()->VersionId = VER_NDX_GLOBAL; } } @@ -629,16 +630,15 @@ void SymbolTable::assignExactVersion(SymbolVersion Ver, uint16_t VersionId // Get a list of symbols which we need to assign the version to. std::vector Syms = findByVersion(Ver); + if (Syms.empty()) { + if (Config->NoUndefinedVersion) + error("version script assignment of '" + VersionName + "' to symbol '" + + Ver.Name + "' failed: symbol not defined"); + return; + } // Assign the version. for (SymbolBody *B : Syms) { - if (!B || B->isUndefined()) { - if (Config->NoUndefinedVersion) - error("version script assignment of '" + VersionName + "' to symbol '" + - Ver.Name + "' failed: symbol not defined"); - continue; - } - Symbol *Sym = B->symbol(); if (Sym->InVersionScript) warn("duplicate symbol '" + Ver.Name + "' in version script");