[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