summaryrefslogtreecommitdiffstats
path: root/llvm/tools/llvm-ar/llvm-ar.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/tools/llvm-ar/llvm-ar.cpp')
-rw-r--r--llvm/tools/llvm-ar/llvm-ar.cpp46
1 files changed, 19 insertions, 27 deletions
diff --git a/llvm/tools/llvm-ar/llvm-ar.cpp b/llvm/tools/llvm-ar/llvm-ar.cpp
index 0078bda4db4..51c4fed743b 100644
--- a/llvm/tools/llvm-ar/llvm-ar.cpp
+++ b/llvm/tools/llvm-ar/llvm-ar.cpp
@@ -583,27 +583,29 @@ static object::Archive::Kind getDefaultForHost() {
static object::Archive::Kind
getKindFromMember(const NewArchiveIterator &Member) {
+ auto getKindFromMemberInner =
+ [](MemoryBufferRef Buffer) -> object::Archive::Kind {
+ Expected<std::unique_ptr<object::ObjectFile>> OptionalObject =
+ object::ObjectFile::createObjectFile(Buffer);
+
+ if (OptionalObject)
+ return isa<object::MachOObjectFile>(**OptionalObject)
+ ? object::Archive::K_BSD
+ : object::Archive::K_GNU;
+
+ // squelch the error in case we had a non-object file
+ consumeError(OptionalObject.takeError());
+ return getDefaultForHost();
+ };
+
if (Member.isNewMember()) {
object::Archive::Kind Kind = getDefaultForHost();
sys::fs::file_status Status;
if (auto OptionalFD = Member.getFD(Status)) {
- auto OptionalMB = MemoryBuffer::getOpenFile(*OptionalFD, Member.getName(),
- Status.getSize(), false);
- if (OptionalMB) {
- MemoryBufferRef MemoryBuffer = (*OptionalMB)->getMemBufferRef();
-
- Expected<std::unique_ptr<object::ObjectFile>> OptionalObject =
- object::ObjectFile::createObjectFile(MemoryBuffer);
-
- if (OptionalObject)
- Kind = isa<object::MachOObjectFile>(**OptionalObject)
- ? object::Archive::K_BSD
- : object::Archive::K_GNU;
-
- // squelch the error in case we had a non-object file
- consumeError(OptionalObject.takeError());
- }
+ if (auto MB = MemoryBuffer::getOpenFile(*OptionalFD, Member.getName(),
+ Status.getSize(), false))
+ Kind = getKindFromMemberInner((*MB)->getMemBufferRef());
if (close(*OptionalFD) != 0)
failIfError(std::error_code(errno, std::generic_category()),
@@ -619,17 +621,7 @@ getKindFromMember(const NewArchiveIterator &Member) {
auto OptionalMB = OldMember.getMemoryBufferRef();
failIfError(OptionalMB.getError());
- Expected<std::unique_ptr<object::ObjectFile>> OptionalObject =
- object::ObjectFile::createObjectFile(*OptionalMB);
-
- if (OptionalObject)
- return isa<object::MachOObjectFile>(*OptionalObject->get())
- ? object::Archive::K_BSD
- : object::Archive::K_GNU;
-
- // squelch the error in case we had a non-object file
- consumeError(OptionalObject.takeError());
- return getDefaultForHost();
+ return getKindFromMemberInner(*OptionalMB);
}
}
OpenPOWER on IntegriCloud