From 47a8a83dc36c82cbb3b6054e14ea11551a661c04 Mon Sep 17 00:00:00 2001 From: Rui Ueyama Date: Fri, 5 Sep 2014 22:06:07 +0000 Subject: [PATCH] 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 --- lld/lib/ReaderWriter/FileArchive.cpp | 44 ++++++++++++---------------- 1 file changed, 19 insertions(+), 25 deletions(-) diff --git a/lld/lib/ReaderWriter/FileArchive.cpp b/lld/lib/ReaderWriter/FileArchive.cpp index ac4b0f4c356d..09c25e5f22a4 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 buffOrErr = ci->getMemoryBufferRef(); - if (buffOrErr.getError()) - return nullptr; - - llvm::MemoryBufferRef mb = buffOrErr.get(); - std::unique_ptr 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> 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 mb, - StringRef symbol) const { + // symbol or does not exist, returns false. + bool isDataSymbol(Archive::child_iterator member, StringRef symbol) const { + ErrorOr buf = member->getMemoryBufferRef(); + if (buf.getError()) + return false; + std::unique_ptr 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 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: