diff options
author | Rui Ueyama <ruiu@google.com> | 2014-09-11 20:42:01 +0000 |
---|---|---|
committer | Rui Ueyama <ruiu@google.com> | 2014-09-11 20:42:01 +0000 |
commit | 5d8f698ec194dbdb2c8c92abce02c9e82ae21b5c (patch) | |
tree | 3cdcbf087c420173428b0ce9fc3a40e56216f73e | |
parent | 281f23adc1b76136efd11a410532d0600f6936e8 (diff) | |
download | bcm5719-llvm-5d8f698ec194dbdb2c8c92abce02c9e82ae21b5c.tar.gz bcm5719-llvm-5d8f698ec194dbdb2c8c92abce02c9e82ae21b5c.zip |
Always check that instantiateMember returns only one file.
Also make it private as it doesn't have to be protected function.
llvm-svn: 217626
-rw-r--r-- | lld/lib/ReaderWriter/FileArchive.cpp | 21 |
1 files changed, 12 insertions, 9 deletions
diff --git a/lld/lib/ReaderWriter/FileArchive.cpp b/lld/lib/ReaderWriter/FileArchive.cpp index 09c25e5f22a..ca2aaf34099 100644 --- a/lld/lib/ReaderWriter/FileArchive.cpp +++ b/lld/lib/ReaderWriter/FileArchive.cpp @@ -58,13 +58,13 @@ public: if (dataSymbolOnly && !isDataSymbol(ci, name)) return nullptr; - std::vector<std::unique_ptr<File>> result; + _membersInstantiated.insert(memberStart); + std::unique_ptr<File> result; if (instantiateMember(ci, result)) return nullptr; - assert(result.size() == 1); // give up the pointer so that this object no longer manages it - return result[0].release(); + return result.release(); } /// \brief Load all members of the archive? @@ -75,8 +75,10 @@ public: parseAllMembers(std::vector<std::unique_ptr<File>> &result) const override { for (auto mf = _archive->child_begin(), me = _archive->child_end(); mf != me; ++mf) { - if (std::error_code ec = instantiateMember(mf, result)) + std::unique_ptr<File> file; + if (std::error_code ec = instantiateMember(mf, file)) return ec; + result.push_back(std::move(file)); } return std::error_code(); } @@ -125,10 +127,10 @@ public: return ret; } -protected: +private: std::error_code instantiateMember(Archive::child_iterator member, - std::vector<std::unique_ptr<File>> &result) const { + std::unique_ptr<File> &result) const { ErrorOr<llvm::MemoryBufferRef> mbOrErr = member->getMemoryBufferRef(); if (std::error_code ec = mbOrErr.getError()) return ec; @@ -139,9 +141,10 @@ protected: std::unique_ptr<MemoryBuffer> buf(MemoryBuffer::getMemBuffer( mb.getBuffer(), mb.getBufferIdentifier(), false)); - _registry.parseFile(buf, result); - const char *memberStart = member->getBuffer().data(); - _membersInstantiated.insert(memberStart); + std::vector<std::unique_ptr<File>> files; + _registry.parseFile(buf, files); + assert(files.size() == 1); + result = std::move(files[0]); return std::error_code(); } |