diff options
author | Rui Ueyama <ruiu@google.com> | 2014-09-05 22:06:07 +0000 |
---|---|---|
committer | Rui Ueyama <ruiu@google.com> | 2014-09-05 22:06:07 +0000 |
commit | 47a8a83dc36c82cbb3b6054e14ea11551a661c04 (patch) | |
tree | 2aa3ae4b743fa013524a1580a2cfbbca44599fdf /lld/lib/ReaderWriter/FileArchive.cpp | |
parent | 62063b46fcbe811726432dd897e9b7f46f84eb44 (diff) | |
download | bcm5719-llvm-47a8a83dc36c82cbb3b6054e14ea11551a661c04.tar.gz bcm5719-llvm-47a8a83dc36c82cbb3b6054e14ea11551a661c04.zip |
FileArchive cleanup
Moved code used only by isDataSymbol from find to isDataSymbol member
function. Also changed the return type of isDataSymbol because
previously "if (isDataSymbol(...))" meant "if it is *not* a data symbol"
which is opposite from what you'd expect.
llvm-svn: 217285
Diffstat (limited to 'lld/lib/ReaderWriter/FileArchive.cpp')
-rw-r--r-- | lld/lib/ReaderWriter/FileArchive.cpp | 44 |
1 files changed, 19 insertions, 25 deletions
diff --git a/lld/lib/ReaderWriter/FileArchive.cpp b/lld/lib/ReaderWriter/FileArchive.cpp index ac4b0f4c356..09c25e5f22a 100644 --- a/lld/lib/ReaderWriter/FileArchive.cpp +++ b/lld/lib/ReaderWriter/FileArchive.cpp @@ -55,19 +55,8 @@ public: const char *memberStart = ci->getBuffer().data(); if (_membersInstantiated.count(memberStart)) return nullptr; - - if (dataSymbolOnly) { - ErrorOr<llvm::MemoryBufferRef> buffOrErr = ci->getMemoryBufferRef(); - if (buffOrErr.getError()) - return nullptr; - - llvm::MemoryBufferRef mb = buffOrErr.get(); - std::unique_ptr<MemoryBuffer> buff(MemoryBuffer::getMemBuffer( - mb.getBuffer(), mb.getBufferIdentifier(), false)); - - if (isDataSymbol(std::move(buff), name)) - return nullptr; - } + if (dataSymbolOnly && !isDataSymbol(ci, name)) + return nullptr; std::vector<std::unique_ptr<File>> result; if (instantiateMember(ci, result)) @@ -156,14 +145,19 @@ protected: return std::error_code(); } - // Parses the given memory buffer as an object file, and returns success error + // 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 a failure. - std::error_code isDataSymbol(std::unique_ptr<MemoryBuffer> mb, - StringRef symbol) const { + // symbol or does not exist, returns false. + bool isDataSymbol(Archive::child_iterator member, StringRef symbol) const { + ErrorOr<llvm::MemoryBufferRef> buf = member->getMemoryBufferRef(); + if (buf.getError()) + return false; + std::unique_ptr<MemoryBuffer> mb(MemoryBuffer::getMemBuffer( + buf.get().getBuffer(), buf.get().getBufferIdentifier(), false)); + auto objOrErr(ObjectFile::createObjectFile(mb->getMemBufferRef())); - if (auto ec = objOrErr.getError()) - return ec; + if (objOrErr.getError()) + return false; std::unique_ptr<ObjectFile> obj = std::move(objOrErr.get()); SymbolRef::Type symtype; uint32_t symflags; @@ -173,8 +167,8 @@ protected: for (symbol_iterator i = ibegin; i != iend; ++i) { // Get symbol name - if (std::error_code ec = i->getName(symbolname)) - return ec; + if (i->getName(symbolname)) + return false; if (symbolname != symbol) continue; @@ -185,13 +179,13 @@ protected: continue; // Get Symbol Type - if (std::error_code ec = i->getType(symtype)) - return ec; + if (i->getType(symtype)) + return false; if (symtype == SymbolRef::ST_Data) - return std::error_code(); + return true; } - return object_error::parse_failed; + return false; } private: |