[lld] r231205 - temporary
Rui Ueyama
ruiu at google.com
Tue Mar 3 18:09:21 PST 2015
Author: ruiu
Date: Tue Mar 3 20:09:21 2015
New Revision: 231205
URL: http://llvm.org/viewvc/llvm-project?rev=231205&view=rev
Log:
temporary
Modified:
lld/trunk/lib/ReaderWriter/FileArchive.cpp
Modified: lld/trunk/lib/ReaderWriter/FileArchive.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/FileArchive.cpp?rev=231205&r1=231204&r2=231205&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/FileArchive.cpp (original)
+++ lld/trunk/lib/ReaderWriter/FileArchive.cpp Tue Mar 3 20:09:21 2015
@@ -53,7 +53,7 @@ public:
const char *memberStart = ci->getBuffer().data();
if (_membersInstantiated.count(memberStart))
return nullptr;
- if (dataSymbolOnly && !isDataSymbol(ci, name))
+ if (dataSymbolOnly && !isDataSymbol(*ci, name))
return nullptr;
_membersInstantiated.insert(memberStart);
@@ -70,7 +70,7 @@ public:
}
std::unique_ptr<File> result;
- if (instantiateMember(ci, result))
+ if (instantiateMember(*ci, result))
return nullptr;
// give up the pointer so that this object no longer manages it
@@ -99,7 +99,7 @@ public:
group.spawn([=] {
std::unique_ptr<File> result;
- std::error_code ec = instantiateMember(ci, result);
+ std::error_code ec = instantiateMember(*ci, result);
future->set(ec ? nullptr : result.release());
});
}
@@ -112,7 +112,7 @@ public:
for (auto mf = _archive->child_begin(), me = _archive->child_end();
mf != me; ++mf) {
std::unique_ptr<File> file;
- if (std::error_code ec = instantiateMember(mf, file))
+ if (std::error_code ec = instantiateMember(*mf, file))
return ec;
result.push_back(std::move(file));
}
@@ -153,14 +153,24 @@ protected:
return ec;
if ((ec = buildTableOfContents()))
return ec;
+ buildParallelArray();
return std::error_code();
}
private:
+ void buildParallelArray() {
+ size_t len = 0;
+ for (const Archive::Child &child : _archive->children()) {
+ _children.push_back(child);
+ len++;
+ }
+ _futures.resize(len);
+ }
+
std::error_code
- instantiateMember(Archive::child_iterator member,
+ instantiateMember(const Archive::Child &member,
std::unique_ptr<File> &result) const {
- ErrorOr<llvm::MemoryBufferRef> mbOrErr = member->getMemoryBufferRef();
+ ErrorOr<llvm::MemoryBufferRef> mbOrErr = member.getMemoryBufferRef();
if (std::error_code ec = mbOrErr.getError())
return ec;
llvm::MemoryBufferRef mb = mbOrErr.get();
@@ -191,8 +201,8 @@ private:
// Parses the given memory buffer as an object file, and returns true
// code if the given symbol is a data symbol. If the symbol is not a data
// symbol or does not exist, returns false.
- bool isDataSymbol(Archive::child_iterator member, StringRef symbol) const {
- ErrorOr<llvm::MemoryBufferRef> buf = member->getMemoryBufferRef();
+ bool isDataSymbol(const Archive::Child &member, StringRef symbol) const {
+ ErrorOr<llvm::MemoryBufferRef> buf = member.getMemoryBufferRef();
if (buf.getError())
return false;
std::unique_ptr<MemoryBuffer> mb(MemoryBuffer::getMemBuffer(
@@ -267,6 +277,10 @@ private:
mutable std::vector<std::unique_ptr<MemoryBuffer>> _memberBuffers;
mutable std::map<const char *, std::unique_ptr<Future<const File *>>> _preloaded;
mutable std::mutex _mutex;
+
+ mutable std::vector<Archive::Child> _children;
+ mutable std::vector<std::unique_ptr<Future<const File *>>> _futures;
+
};
class ArchiveReader : public Reader {
More information about the llvm-commits
mailing list