[llvm-commits] [lld] r172028 - /lld/trunk/lib/ReaderWriter/ReaderArchive.cpp

Michael J. Spencer bigcheesegs at gmail.com
Wed Jan 9 17:27:45 PST 2013


Author: mspencer
Date: Wed Jan  9 19:27:45 2013
New Revision: 172028

URL: http://llvm.org/viewvc/llvm-project?rev=172028&view=rev
Log:
[Archive] Use a hash map to lookup symbols in archives. Increases performance of linking lua by ~6x.

Modified:
    lld/trunk/lib/ReaderWriter/ReaderArchive.cpp

Modified: lld/trunk/lib/ReaderWriter/ReaderArchive.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ReaderArchive.cpp?rev=172028&r1=172027&r2=172028&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/ReaderArchive.cpp (original)
+++ lld/trunk/lib/ReaderWriter/ReaderArchive.cpp Wed Jan  9 19:27:45 2013
@@ -9,6 +9,21 @@
 
 #include "lld/ReaderWriter/ReaderArchive.h"
 
+#include "llvm/ADT/Hashing.h"
+
+#include <unordered_map>
+
+namespace std {
+  template<>
+  struct hash<llvm::StringRef> {
+  public:
+    size_t operator()(const llvm::StringRef &s) const {
+      using llvm::hash_value;
+      return hash_value(s);
+    }
+  };
+}
+
 namespace lld {
 /// \brief The FileArchive class represents an Archive Library file
 class FileArchive : public ArchiveLibraryFile {
@@ -19,12 +34,12 @@
   /// \brief Check if any member of the archive contains an Atom with the
   /// specified name and return the File object for that member, or nullptr.
   virtual const File *find(StringRef name, bool dataSymbolOnly) const {
-    error_code ec;  
-    llvm::object::Archive::child_iterator ci;
-
-    ci = _archive.get()->findSym(name);
-    if (ci == _archive->end_children()) 
+    auto member = _symbolMemberMap.find(name);
+    if (member == _symbolMemberMap.end())
       return nullptr;
+
+    error_code ec;
+    llvm::object::Archive::child_iterator ci = member->second;
     
     if (dataSymbolOnly && (ec = isDataSymbol(ci->getBuffer(), name)))
       return nullptr;
@@ -117,7 +132,21 @@
     if (ec)
       return;
     _archive.swap(archive_obj);
+
+    // Cache symbols.
+    for (auto i = _archive->begin_symbols(), e = _archive->end_symbols();
+              i != e; ++i) {
+      StringRef name;
+      llvm::object::Archive::child_iterator member;
+      if ((ec = i->getName(name)))
+        return;
+      if ((ec = i->getMember(member)))
+        return;
+      _symbolMemberMap[name] = member;
+    }
   }
+
+  std::unordered_map<StringRef, llvm::object::Archive::child_iterator> _symbolMemberMap;
 }; // class FileArchive
 
 // Returns a vector of Files that are contained in the archive file 





More information about the llvm-commits mailing list