From 1a7a6957c00298489fcbbd32d286d1ff4503b68f Mon Sep 17 00:00:00 2001 From: Saleem Abdulrasool Date: Wed, 22 Jun 2016 15:44:25 +0000 Subject: 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 --- llvm/tools/llvm-ar/llvm-ar.cpp | 46 +++++++++++++++++------------------------- 1 file changed, 19 insertions(+), 27 deletions(-) (limited to 'llvm/tools/llvm-ar/llvm-ar.cpp') 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> OptionalObject = + object::ObjectFile::createObjectFile(Buffer); + + if (OptionalObject) + return isa(**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> OptionalObject = - object::ObjectFile::createObjectFile(MemoryBuffer); - - if (OptionalObject) - Kind = isa(**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> OptionalObject = - object::ObjectFile::createObjectFile(*OptionalMB); - - if (OptionalObject) - return isa(*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); } } -- cgit v1.2.3