summaryrefslogtreecommitdiffstats
path: root/lld/lib/ReaderWriter/FileArchive.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lld/lib/ReaderWriter/FileArchive.cpp')
-rw-r--r--lld/lib/ReaderWriter/FileArchive.cpp44
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:
OpenPOWER on IntegriCloud