[lld] r274099 - Make SymbolTable::findAll to return only defined symbols.

Rui Ueyama via llvm-commits llvm-commits at lists.llvm.org
Tue Jun 28 21:47:39 PDT 2016


Author: ruiu
Date: Tue Jun 28 23:47:39 2016
New Revision: 274099

URL: http://llvm.org/viewvc/llvm-project?rev=274099&view=rev
Log:
Make SymbolTable::findAll to return only defined symbols.

We allowed the function to return a vector that contains nullptrs
which is weird. This change makes the function to return only
defined symbols.

Differential Revision: http://reviews.llvm.org/D21828

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=274099&r1=274098&r2=274099&view=diff
==============================================================================
--- lld/trunk/ELF/SymbolTable.cpp (original)
+++ lld/trunk/ELF/SymbolTable.cpp Tue Jun 28 23:47:39 2016
@@ -457,19 +457,26 @@ template <class ELFT> SymbolBody *Symbol
   return SymVector[It->second]->body();
 }
 
+// Returns a list of defined symbols that match with a given glob pattern.
 template <class ELFT>
 std::vector<SymbolBody *> SymbolTable<ELFT>::findAll(StringRef Pattern) {
   // Fast-path. Fallback to find() if Pattern doesn't contain any wildcard
   // characters.
-  bool HasWildcards = (Pattern.find_first_of("?*") != StringRef::npos);
-  if (!HasWildcards)
-    return {find(Pattern)};
-
-  std::vector<SymbolBody *> Result;
-  for (auto &It : Symtab)
-    if (matchStr(Pattern, It.first.Val))
-      Result.push_back(SymVector[It.second]->body());
-  return Result;
+  if (Pattern.find_first_of("?*") == StringRef::npos) {
+    if (SymbolBody *B = find(Pattern))
+      if (!B->isUndefined())
+        return {B};
+    return {};
+  }
+
+  std::vector<SymbolBody *> Res;
+  for (auto &It : Symtab) {
+    StringRef Name = It.first.Val;
+    SymbolBody *B = SymVector[It.second]->body();
+    if (!B->isUndefined() && matchStr(Pattern, Name))
+      Res.push_back(B);
+  }
+  return Res;
 }
 
 template <class ELFT>
@@ -572,14 +579,15 @@ template <class ELFT> void SymbolTable<E
   size_t I = 2;
   for (Version &V : Config->SymbolVersions) {
     for (StringRef Name : V.Globals) {
-      for (SymbolBody *B : findAll(Name)) {
-        if (!B || B->isUndefined()) {
-          if (Config->NoUndefinedVersion)
-            error("version script assignment of " + V.Name + " to symbol " +
-                  Name + " failed: symbol not defined");
-          continue;
-        }
+      std::vector<SymbolBody *> Syms = findAll(Name);
+      if (Syms.empty()) {
+        if (Config->NoUndefinedVersion)
+          error("version script assignment of " + V.Name + " to symbol " +
+                Name + " failed: symbol not defined");
+        continue;
+      }
 
+      for (SymbolBody *B : Syms) {
         if (B->symbol()->VersionId != VER_NDX_GLOBAL &&
             B->symbol()->VersionId != VER_NDX_LOCAL)
           warning("duplicate symbol " + Name + " in version script");




More information about the llvm-commits mailing list