]> granicus.if.org Git - llvm/commitdiff
llvm-ar: reduce some duplication, NFC
authorSaleem Abdulrasool <compnerd@compnerd.org>
Wed, 22 Jun 2016 15:44:25 +0000 (15:44 +0000)
committerSaleem Abdulrasool <compnerd@compnerd.org>
Wed, 22 Jun 2016 15:44:25 +0000 (15:44 +0000)
Improve the previous change by using a local function to reduce the duplication
of the object file scanning.  NFC.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@273429 91177308-0d34-0410-b5e6-96231b3b80d8

tools/llvm-ar/llvm-ar.cpp

index 0078bda4db42033e5f9c3e1a43559d094cf8bb3a..51c4fed743b4973e49a2875081edf81be8db3b56 100644 (file)
@@ -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);
   }
 }