[lld] r290334 - Do not return null or Undefined from find{All, }ByVersion.

Rui Ueyama via llvm-commits llvm-commits at lists.llvm.org
Thu Dec 22 01:54:33 PST 2016


Author: ruiu
Date: Thu Dec 22 03:54:32 2016
New Revision: 290334

URL: http://llvm.org/viewvc/llvm-project?rev=290334&view=rev
Log:
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.

Modified:
    lld/trunk/ELF/SymbolTable.cpp

Modified: lld/trunk/ELF/SymbolTable.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/SymbolTable.cpp?rev=290334&r1=290333&r2=290334&view=diff
==============================================================================
--- lld/trunk/ELF/SymbolTable.cpp (original)
+++ lld/trunk/ELF/SymbolTable.cpp Thu Dec 22 03:54:32 2016
@@ -561,6 +561,8 @@ StringMap<std::vector<SymbolBody *>> &Sy
     DemangledSyms.emplace();
     for (Symbol *Sym : SymVector) {
       SymbolBody *B = Sym->body();
+      if (B->isUndefined())
+        continue;
       if (Optional<std::string> S = demangle(B->getName()))
         (*DemangledSyms)[*S].push_back(B);
       else
@@ -574,7 +576,10 @@ template <class ELFT>
 std::vector<SymbolBody *> SymbolTable<ELFT>::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 <class ELFT>
@@ -586,16 +591,13 @@ SymbolTable<ELFT>::findAllByVersion(Symb
   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 <class ELFT> void SymbolTable<E
       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<ELFT>::assignExactVersi
 
   // Get a list of symbols which we need to assign the version to.
   std::vector<SymbolBody *> 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");




More information about the llvm-commits mailing list