[lld] r290323 - Define a getter function for a lazily-created object.

Rui Ueyama via llvm-commits llvm-commits at lists.llvm.org
Wed Dec 21 21:31:52 PST 2016


Author: ruiu
Date: Wed Dec 21 23:31:52 2016
New Revision: 290323

URL: http://llvm.org/viewvc/llvm-project?rev=290323&view=rev
Log:
Define a getter function for a lazily-created object.

Previously, you had to call initDemangledSyms() before accessing DemangledSyms.
Now getDemangledSyms() initializes it and then returns it. So it is now less easy
to use it in a wrong way.

Modified:
    lld/trunk/ELF/SymbolTable.cpp
    lld/trunk/ELF/SymbolTable.h

Modified: lld/trunk/ELF/SymbolTable.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/SymbolTable.cpp?rev=290323&r1=290322&r2=290323&view=diff
==============================================================================
--- lld/trunk/ELF/SymbolTable.cpp (original)
+++ lld/trunk/ELF/SymbolTable.cpp Wed Dec 21 23:31:52 2016
@@ -556,26 +556,24 @@ template <class ELFT> void SymbolTable<E
 // So, if "extern C++" feature is used, we need to demangle all known
 // symbols.
 template <class ELFT>
-void SymbolTable<ELFT>::initDemangledSyms() {
-  if (DemangledSyms)
-    return;
-  DemangledSyms.emplace();
-
-  for (Symbol *Sym : SymVector) {
-    SymbolBody *B = Sym->body();
-    if (Optional<std::string> S = demangle(B->getName()))
-      (*DemangledSyms)[*S].push_back(B);
-    else
-      (*DemangledSyms)[B->getName()].push_back(B);
+StringMap<std::vector<SymbolBody *>> &SymbolTable<ELFT>::getDemangledSyms() {
+  if (!DemangledSyms) {
+    DemangledSyms.emplace();
+    for (Symbol *Sym : SymVector) {
+      SymbolBody *B = Sym->body();
+      if (Optional<std::string> S = demangle(B->getName()))
+        (*DemangledSyms)[*S].push_back(B);
+      else
+        (*DemangledSyms)[B->getName()].push_back(B);
+    }
   }
+  return *DemangledSyms;
 }
 
 template <class ELFT>
 std::vector<SymbolBody *> SymbolTable<ELFT>::findByVersion(SymbolVersion Ver) {
-  if (Ver.IsExternCpp) {
-    initDemangledSyms();
-    return DemangledSyms->lookup(Ver.Name);
-  }
+  if (Ver.IsExternCpp)
+    return getDemangledSyms().lookup(Ver.Name);
   return {find(Ver.Name)};
 }
 
@@ -586,8 +584,7 @@ SymbolTable<ELFT>::findAllByVersion(Symb
   StringMatcher M(Ver.Name);
 
   if (Ver.IsExternCpp) {
-    initDemangledSyms();
-    for (auto &P : *DemangledSyms)
+    for (auto &P : getDemangledSyms())
       if (M.match(P.first()))
         for (SymbolBody *Body : P.second)
           if (!Body->isUndefined())

Modified: lld/trunk/ELF/SymbolTable.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/SymbolTable.h?rev=290323&r1=290322&r2=290323&view=diff
==============================================================================
--- lld/trunk/ELF/SymbolTable.h (original)
+++ lld/trunk/ELF/SymbolTable.h Wed Dec 21 23:31:52 2016
@@ -97,7 +97,7 @@ private:
   std::vector<SymbolBody *> findByVersion(SymbolVersion Ver);
   std::vector<SymbolBody *> findAllByVersion(SymbolVersion Ver);
 
-  void initDemangledSyms();
+  llvm::StringMap<std::vector<SymbolBody *>> &getDemangledSyms();
   void handleAnonymousVersion();
   void assignExactVersion(SymbolVersion Ver, uint16_t VersionId,
                           StringRef VersionName);




More information about the llvm-commits mailing list