diff options
author | Saleem Abdulrasool <compnerd@compnerd.org> | 2016-06-22 15:44:25 +0000 |
---|---|---|
committer | Saleem Abdulrasool <compnerd@compnerd.org> | 2016-06-22 15:44:25 +0000 |
commit | 1a7a6957c00298489fcbbd32d286d1ff4503b68f (patch) | |
tree | cb9f2a4c130d9260e0de4230cc349e1b21c80628 /llvm/tools/llvm-ar/llvm-ar.cpp | |
parent | 1cec4fdddf36f8fcb0bcbc49209411ac0ba81251 (diff) | |
download | bcm5719-llvm-1a7a6957c00298489fcbbd32d286d1ff4503b68f.tar.gz bcm5719-llvm-1a7a6957c00298489fcbbd32d286d1ff4503b68f.zip |
llvm-ar: reduce some duplication, NFC
Improve the previous change by using a local function to reduce the duplication
of the object file scanning. NFC.
llvm-svn: 273429
Diffstat (limited to 'llvm/tools/llvm-ar/llvm-ar.cpp')
-rw-r--r-- | llvm/tools/llvm-ar/llvm-ar.cpp | 46 |
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); } } |