[llvm] [llvm-otool] Add -m flag and archive(member) input syntax (PR #194234)

Ryan Mansfield via llvm-commits llvm-commits at lists.llvm.org
Mon Apr 27 06:01:27 PDT 2026


https://github.com/rjmansfield updated https://github.com/llvm/llvm-project/pull/194234

>From d8a84e1881803ad6530cb44c0967b7418bf5876d Mon Sep 17 00:00:00 2001
From: Ryan Mansfield <ryan_mansfield at apple.com>
Date: Sun, 26 Apr 2026 08:53:59 -0400
Subject: [PATCH 1/5] [llvm-otool] Add -m flag and archive(member) input syntax

Support classic otool's archive(member) input syntax where a filename
like 'foo.a(bar.o)' extracts and processes only the named member from
the archive. The -m flag disables this syntax parsing, treating the
entire string as a literal filename.

Fixes #126272
---
 llvm/docs/CommandGuide/llvm-otool.rst         |  4 ++
 .../MachO/otool-archive-member.test           | 37 +++++++++++
 llvm/tools/llvm-objdump/MachODump.cpp         | 61 +++++++++++++++++++
 llvm/tools/llvm-objdump/MachODump.h           |  1 +
 llvm/tools/llvm-objdump/OtoolOpts.td          |  4 +-
 llvm/tools/llvm-objdump/llvm-objdump.cpp      |  2 +
 6 files changed, 108 insertions(+), 1 deletion(-)
 create mode 100644 llvm/test/tools/llvm-objdump/MachO/otool-archive-member.test

diff --git a/llvm/docs/CommandGuide/llvm-otool.rst b/llvm/docs/CommandGuide/llvm-otool.rst
index ab92673092c9c..17aa9089b3875 100644
--- a/llvm/docs/CommandGuide/llvm-otool.rst
+++ b/llvm/docs/CommandGuide/llvm-otool.rst
@@ -83,6 +83,10 @@ OPTIONS
 
  Print load commands.
 
+.. option:: -m
+
+ Don't use archive(member) syntax.
+
 .. option:: -mcpu=<value>
 
  Select cpu for disassembly.
diff --git a/llvm/test/tools/llvm-objdump/MachO/otool-archive-member.test b/llvm/test/tools/llvm-objdump/MachO/otool-archive-member.test
new file mode 100644
index 0000000000000..534d5fe45c6a4
--- /dev/null
+++ b/llvm/test/tools/llvm-objdump/MachO/otool-archive-member.test
@@ -0,0 +1,37 @@
+# Test llvm-otool archive(member) input syntax and -m flag.
+
+RUN: mkdir -p %t.dir
+RUN: cp %p/Inputs/hello.obj.macho-x86_64 %t.dir/foo.o
+RUN: cp %p/Inputs/ObjC.obj.macho-x86_64 %t.dir/bar.o
+RUN: llvm-ar rcs %t.dir/lib.a %t.dir/foo.o %t.dir/bar.o
+
+# archive(member) syntax extracts only the named member.
+RUN: llvm-otool -l '%t.dir/lib.a(bar.o)' \
+RUN: | FileCheck %s --check-prefix=MEMBER --implicit-check-not="foo.o"
+
+MEMBER: bar.o
+
+# Without archive(member), both members are shown.
+RUN: llvm-otool -l %t.dir/lib.a \
+RUN: | FileCheck %s --check-prefix=BOTH
+
+BOTH: foo.o
+BOTH: bar.o
+
+# -m disables archive(member) parsing, treating the filename literally.
+RUN: not llvm-otool -mh '%t.dir/lib.a(bar.o)' 2>&1 \
+RUN: | FileCheck %s --check-prefix=NOPAREN
+
+NOPAREN: error: {{.*}}: No such file or directory
+
+# Non-existent member gives an error.
+RUN: not llvm-otool -h '%t.dir/lib.a(nonexistent)' 2>&1 \
+RUN: | FileCheck %s --check-prefix=BADMEMBER
+
+BADMEMBER: error: {{.*}}: archive does not contain a member named: nonexistent
+
+# archive(member) on a non-archive file gives an error.
+RUN: not llvm-otool -h '%p/Inputs/hello.obj.macho-x86_64(foo)' 2>&1 \
+RUN: | FileCheck %s --check-prefix=NOTARCHIVE
+
+NOTARCHIVE: error: {{.*}}: not an archive (cannot extract member: foo)
diff --git a/llvm/tools/llvm-objdump/MachODump.cpp b/llvm/tools/llvm-objdump/MachODump.cpp
index 25fbd4d60ecc3..5374c895894da 100644
--- a/llvm/tools/llvm-objdump/MachODump.cpp
+++ b/llvm/tools/llvm-objdump/MachODump.cpp
@@ -81,10 +81,12 @@ bool objdump::Verbose;
 bool objdump::ObjcMetaData;
 std::string objdump::DisSymName;
 bool objdump::IsOtool;
+bool objdump::NoUseMemberSyntax;
 bool objdump::SymbolicOperands;
 std::vector<std::string> objdump::ArchFlags;
 
 static bool ArchAll = false;
+static std::string ArchiveMemberFilter;
 static std::string ThumbTripleName;
 
 static StringRef ordinalName(const object::MachOObjectFile *, int);
@@ -2533,6 +2535,17 @@ static bool ValidateArchFlags() {
   return true;
 }
 
+static bool skipArchiveMember(const object::Archive::Child &C) {
+  if (ArchiveMemberFilter.empty())
+    return false;
+  Expected<StringRef> NameOrErr = C.getName();
+  if (!NameOrErr) {
+    consumeError(NameOrErr.takeError());
+    return true;
+  }
+  return *NameOrErr != ArchiveMemberFilter;
+}
+
 // ParseInputMachO() parses the named Mach-O file in Filename and handles the
 // -arch flags selecting just those slices as specified by them and also parses
 // archive files.  Then for each individual Mach-O file ProcessMachO() is
@@ -2541,6 +2554,19 @@ void objdump::parseInputMachO(StringRef Filename) {
   if (!ValidateArchFlags())
     return;
 
+  // In otool mode, support archive(member) syntax: if the filename ends
+  // with ')' and contains '(', split it into the archive path and member
+  // name. The -m option disables this parsing.
+  ArchiveMemberFilter.clear();
+  if (IsOtool && !NoUseMemberSyntax && !Filename.empty() &&
+      Filename.back() == ')') {
+    auto Pos = Filename.rfind('(');
+    if (Pos != StringRef::npos && Pos > 0) {
+      ArchiveMemberFilter = Filename.substr(Pos + 1).drop_back().str();
+      Filename = Filename.substr(0, Pos);
+    }
+  }
+
   // Attempt to open the binary.
   Expected<OwningBinary<Binary>> BinaryOrErr = createBinary(Filename);
   if (!BinaryOrErr) {
@@ -2559,8 +2585,12 @@ void objdump::parseInputMachO(StringRef Filename) {
 
     Error Err = Error::success();
     unsigned I = -1;
+    bool FoundMember = false;
     for (auto &C : A->children(Err)) {
       ++I;
+      if (skipArchiveMember(C))
+        continue;
+      FoundMember = true;
       Expected<std::unique_ptr<Binary>> ChildOrErr = C.getAsBinary();
       if (!ChildOrErr) {
         if (Error E = isNotObjectErrorInvalidFileType(ChildOrErr.takeError()))
@@ -2575,12 +2605,20 @@ void objdump::parseInputMachO(StringRef Filename) {
     }
     if (Err)
       reportError(std::move(Err), Filename);
+    if (!FoundMember && !ArchiveMemberFilter.empty())
+      reportError(Filename, "archive does not contain a member named: " +
+                                ArchiveMemberFilter);
     return;
   }
   if (MachOUniversalBinary *UB = dyn_cast<MachOUniversalBinary>(&Bin)) {
     parseInputMachO(UB);
     return;
   }
+  if (!ArchiveMemberFilter.empty()) {
+    reportError(Filename, "not an archive (cannot extract member: " +
+                              ArchiveMemberFilter + ")");
+    return;
+  }
   if (ObjectFile *O = dyn_cast<ObjectFile>(&Bin)) {
     if (!checkMachOAndArchFlags(O, Filename))
       return;
@@ -2640,8 +2678,12 @@ void objdump::parseInputMachO(MachOUniversalBinary *UB) {
                                   ArchiveMemberOffsets, ArchitectureName);
             Error Err = Error::success();
             unsigned I = -1;
+            bool FoundMember = false;
             for (auto &C : A->children(Err)) {
               ++I;
+              if (skipArchiveMember(C))
+                continue;
+              FoundMember = true;
               Expected<std::unique_ptr<Binary>> ChildOrErr = C.getAsBinary();
               if (!ChildOrErr) {
                 if (Error E =
@@ -2656,6 +2698,10 @@ void objdump::parseInputMachO(MachOUniversalBinary *UB) {
             }
             if (Err)
               reportError(std::move(Err), Filename);
+            if (!FoundMember && !ArchiveMemberFilter.empty())
+              reportError(Filename,
+                          "archive does not contain a member named: " +
+                              ArchiveMemberFilter);
           } else {
             consumeError(AOrErr.takeError());
             reportError(Filename,
@@ -2702,8 +2748,12 @@ void objdump::parseInputMachO(MachOUniversalBinary *UB) {
                                 ArchiveMemberOffsets);
           Error Err = Error::success();
           unsigned I = -1;
+          bool FoundMember = false;
           for (auto &C : A->children(Err)) {
             ++I;
+            if (skipArchiveMember(C))
+              continue;
+            FoundMember = true;
             Expected<std::unique_ptr<Binary>> ChildOrErr = C.getAsBinary();
             if (!ChildOrErr) {
               if (Error E =
@@ -2717,6 +2767,10 @@ void objdump::parseInputMachO(MachOUniversalBinary *UB) {
           }
           if (Err)
             reportError(std::move(Err), Filename);
+          if (!FoundMember && !ArchiveMemberFilter.empty())
+            reportError(Filename,
+                        "archive does not contain a member named: " +
+                            ArchiveMemberFilter);
         } else {
           consumeError(AOrErr.takeError());
           reportError(Filename, "Mach-O universal file for architecture " +
@@ -2755,8 +2809,12 @@ void objdump::parseInputMachO(MachOUniversalBinary *UB) {
                             ArchitectureName);
       Error Err = Error::success();
       unsigned I = -1;
+      bool FoundMember = false;
       for (auto &C : A->children(Err)) {
         ++I;
+        if (skipArchiveMember(C))
+          continue;
+        FoundMember = true;
         Expected<std::unique_ptr<Binary>> ChildOrErr = C.getAsBinary();
         if (!ChildOrErr) {
           if (Error E = isNotObjectErrorInvalidFileType(ChildOrErr.takeError()))
@@ -2771,6 +2829,9 @@ void objdump::parseInputMachO(MachOUniversalBinary *UB) {
       }
       if (Err)
         reportError(std::move(Err), Filename);
+      if (!FoundMember && !ArchiveMemberFilter.empty())
+        reportError(Filename, "archive does not contain a member named: " +
+                                  ArchiveMemberFilter);
     } else {
       consumeError(AOrErr.takeError());
       reportError(Filename, "Mach-O universal file for architecture " +
diff --git a/llvm/tools/llvm-objdump/MachODump.h b/llvm/tools/llvm-objdump/MachODump.h
index 81fd8775e1d20..e8f51ad0002cb 100644
--- a/llvm/tools/llvm-objdump/MachODump.h
+++ b/llvm/tools/llvm-objdump/MachODump.h
@@ -54,6 +54,7 @@ extern bool InfoPlist;
 extern bool LazyBind;
 extern bool LeadingHeaders;
 extern bool LinkOptHints;
+extern bool NoUseMemberSyntax;
 extern bool ObjcMetaData;
 extern bool Rebase;
 extern bool Rpaths;
diff --git a/llvm/tools/llvm-objdump/OtoolOpts.td b/llvm/tools/llvm-objdump/OtoolOpts.td
index 8cc70d3207245..e14c09aee42f4 100644
--- a/llvm/tools/llvm-objdump/OtoolOpts.td
+++ b/llvm/tools/llvm-objdump/OtoolOpts.td
@@ -43,9 +43,11 @@ def chained_fixups : Flag<["-"], "chained_fixups">,
 def dyld_info : Flag<["-"], "dyld_info">,
   HelpText<"print bind and rebase information">;
 
+def m : Flag<["-"], "m">,
+  HelpText<"don't use archive(member) syntax">;
+
 // Not (yet?) implemented:
 // -c print argument strings of a core file
-// -m don't use archive(member) syntax
 // -dyld_opcodes
 // -addr_slide=arg
 // -function_offsets
diff --git a/llvm/tools/llvm-objdump/llvm-objdump.cpp b/llvm/tools/llvm-objdump/llvm-objdump.cpp
index a8a856e79dff8..c0f0250564228 100644
--- a/llvm/tools/llvm-objdump/llvm-objdump.cpp
+++ b/llvm/tools/llvm-objdump/llvm-objdump.cpp
@@ -3693,6 +3693,8 @@ static void parseOtoolOptions(const llvm::opt::InputArgList &InputArgs) {
   ChainedFixups = InputArgs.hasArg(OTOOL_chained_fixups);
   DyldInfo = InputArgs.hasArg(OTOOL_dyld_info);
 
+  NoUseMemberSyntax = InputArgs.hasArg(OTOOL_m);
+
   InputFilenames = InputArgs.getAllArgValues(OTOOL_INPUT);
   if (InputFilenames.empty())
     reportCmdLineError("no input file");

>From 6d97ba66f892cfbed01f750f797e857cefcd9a2d Mon Sep 17 00:00:00 2001
From: Ryan Mansfield <ryan_mansfield at apple.com>
Date: Sun, 26 Apr 2026 09:47:06 -0400
Subject: [PATCH 2/5] Fix formatting issue.

---
 llvm/tools/llvm-objdump/MachODump.cpp | 5 ++---
 1 file changed, 2 insertions(+), 3 deletions(-)

diff --git a/llvm/tools/llvm-objdump/MachODump.cpp b/llvm/tools/llvm-objdump/MachODump.cpp
index 5374c895894da..a60a16b9ced45 100644
--- a/llvm/tools/llvm-objdump/MachODump.cpp
+++ b/llvm/tools/llvm-objdump/MachODump.cpp
@@ -2768,9 +2768,8 @@ void objdump::parseInputMachO(MachOUniversalBinary *UB) {
           if (Err)
             reportError(std::move(Err), Filename);
           if (!FoundMember && !ArchiveMemberFilter.empty())
-            reportError(Filename,
-                        "archive does not contain a member named: " +
-                            ArchiveMemberFilter);
+            reportError(Filename, "archive does not contain a member named: " +
+                                      ArchiveMemberFilter);
         } else {
           consumeError(AOrErr.takeError());
           reportError(Filename, "Mach-O universal file for architecture " +

>From d479ce5b684478ff0a4bf40ccd4205e027fc54e4 Mon Sep 17 00:00:00 2001
From: Ryan Mansfield <ryan_mansfield at apple.com>
Date: Sun, 26 Apr 2026 10:46:05 -0400
Subject: [PATCH 3/5] Use double quotes in tests.

---
 .../tools/llvm-objdump/MachO/otool-archive-member.test    | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/llvm/test/tools/llvm-objdump/MachO/otool-archive-member.test b/llvm/test/tools/llvm-objdump/MachO/otool-archive-member.test
index 534d5fe45c6a4..836f64667546a 100644
--- a/llvm/test/tools/llvm-objdump/MachO/otool-archive-member.test
+++ b/llvm/test/tools/llvm-objdump/MachO/otool-archive-member.test
@@ -6,7 +6,7 @@ RUN: cp %p/Inputs/ObjC.obj.macho-x86_64 %t.dir/bar.o
 RUN: llvm-ar rcs %t.dir/lib.a %t.dir/foo.o %t.dir/bar.o
 
 # archive(member) syntax extracts only the named member.
-RUN: llvm-otool -l '%t.dir/lib.a(bar.o)' \
+RUN: llvm-otool -l "%t.dir/lib.a(bar.o)" \
 RUN: | FileCheck %s --check-prefix=MEMBER --implicit-check-not="foo.o"
 
 MEMBER: bar.o
@@ -19,19 +19,19 @@ BOTH: foo.o
 BOTH: bar.o
 
 # -m disables archive(member) parsing, treating the filename literally.
-RUN: not llvm-otool -mh '%t.dir/lib.a(bar.o)' 2>&1 \
+RUN: not llvm-otool -mh "%t.dir/lib.a(bar.o)" 2>&1 \
 RUN: | FileCheck %s --check-prefix=NOPAREN
 
 NOPAREN: error: {{.*}}: No such file or directory
 
 # Non-existent member gives an error.
-RUN: not llvm-otool -h '%t.dir/lib.a(nonexistent)' 2>&1 \
+RUN: not llvm-otool -h "%t.dir/lib.a(nonexistent)" 2>&1 \
 RUN: | FileCheck %s --check-prefix=BADMEMBER
 
 BADMEMBER: error: {{.*}}: archive does not contain a member named: nonexistent
 
 # archive(member) on a non-archive file gives an error.
-RUN: not llvm-otool -h '%p/Inputs/hello.obj.macho-x86_64(foo)' 2>&1 \
+RUN: not llvm-otool -h "%p/Inputs/hello.obj.macho-x86_64(foo)" 2>&1 \
 RUN: | FileCheck %s --check-prefix=NOTARCHIVE
 
 NOTARCHIVE: error: {{.*}}: not an archive (cannot extract member: foo)

>From ba8dfca6a0472ecf4958a15048609f289dd216cb Mon Sep 17 00:00:00 2001
From: Ryan Mansfield <ryan_mansfield at apple.com>
Date: Sun, 26 Apr 2026 11:44:03 -0400
Subject: [PATCH 4/5] Skip OS-dependent error message in test.

---
 llvm/test/tools/llvm-objdump/MachO/otool-archive-member.test | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/llvm/test/tools/llvm-objdump/MachO/otool-archive-member.test b/llvm/test/tools/llvm-objdump/MachO/otool-archive-member.test
index 836f64667546a..917ec0915c37c 100644
--- a/llvm/test/tools/llvm-objdump/MachO/otool-archive-member.test
+++ b/llvm/test/tools/llvm-objdump/MachO/otool-archive-member.test
@@ -22,7 +22,7 @@ BOTH: bar.o
 RUN: not llvm-otool -mh "%t.dir/lib.a(bar.o)" 2>&1 \
 RUN: | FileCheck %s --check-prefix=NOPAREN
 
-NOPAREN: error: {{.*}}: No such file or directory
+NOPAREN: '{{.*}}lib.a(bar.o)':
 
 # Non-existent member gives an error.
 RUN: not llvm-otool -h "%t.dir/lib.a(nonexistent)" 2>&1 \

>From a7bcc27ad24875949d6bcc70fd883ca8f02f6bc9 Mon Sep 17 00:00:00 2001
From: Ryan Mansfield <ryan_mansfield at apple.com>
Date: Mon, 27 Apr 2026 08:53:34 -0400
Subject: [PATCH 5/5] Address reviewer feedback.

 - Rename to UseMemberSyntax
 - Report getName errors
 - Use %errc_ENOENT and tighten test checks
 - Add multi input test
---
 .../MachO/otool-archive-member.test           | 21 ++++++++++++++-----
 llvm/tools/llvm-objdump/MachODump.cpp         | 17 ++++++++-------
 llvm/tools/llvm-objdump/MachODump.h           |  2 +-
 llvm/tools/llvm-objdump/llvm-objdump.cpp      |  2 +-
 4 files changed, 27 insertions(+), 15 deletions(-)

diff --git a/llvm/test/tools/llvm-objdump/MachO/otool-archive-member.test b/llvm/test/tools/llvm-objdump/MachO/otool-archive-member.test
index 917ec0915c37c..3aaa2028b98ca 100644
--- a/llvm/test/tools/llvm-objdump/MachO/otool-archive-member.test
+++ b/llvm/test/tools/llvm-objdump/MachO/otool-archive-member.test
@@ -20,18 +20,29 @@ BOTH: bar.o
 
 # -m disables archive(member) parsing, treating the filename literally.
 RUN: not llvm-otool -mh "%t.dir/lib.a(bar.o)" 2>&1 \
-RUN: | FileCheck %s --check-prefix=NOPAREN
+RUN: | FileCheck %s --check-prefix=NOPAREN -DMSG=%errc_ENOENT -DPATH=%t.dir
 
-NOPAREN: '{{.*}}lib.a(bar.o)':
+NOPAREN: error: '[[PATH]]/lib.a(bar.o)': [[MSG]]
 
 # Non-existent member gives an error.
 RUN: not llvm-otool -h "%t.dir/lib.a(nonexistent)" 2>&1 \
-RUN: | FileCheck %s --check-prefix=BADMEMBER
+RUN: | FileCheck %s --check-prefix=BADMEMBER -DPATH=%t.dir
 
-BADMEMBER: error: {{.*}}: archive does not contain a member named: nonexistent
+BADMEMBER: error: '[[PATH]]/lib.a': archive does not contain a member named: nonexistent
 
 # archive(member) on a non-archive file gives an error.
 RUN: not llvm-otool -h "%p/Inputs/hello.obj.macho-x86_64(foo)" 2>&1 \
 RUN: | FileCheck %s --check-prefix=NOTARCHIVE
 
-NOTARCHIVE: error: {{.*}}: not an archive (cannot extract member: foo)
+NOTARCHIVE: error: '{{.*}}hello.obj.macho-x86_64': not an archive (cannot extract member: foo)
+
+# Handle multiple inputs with archive(member) syntax.
+RUN: llvm-otool -h "%t.dir/lib.a(foo.o)" "%t.dir/lib.a(bar.o)" \
+RUN: | FileCheck %s --check-prefix=MULTI
+
+MULTI:      Archive :
+MULTI-NEXT: Mach header
+MULTI:      496
+MULTI-NEXT: Archive :
+MULTI-NEXT: Mach header
+MULTI:      896
diff --git a/llvm/tools/llvm-objdump/MachODump.cpp b/llvm/tools/llvm-objdump/MachODump.cpp
index a60a16b9ced45..2ef551c6c961f 100644
--- a/llvm/tools/llvm-objdump/MachODump.cpp
+++ b/llvm/tools/llvm-objdump/MachODump.cpp
@@ -81,7 +81,7 @@ bool objdump::Verbose;
 bool objdump::ObjcMetaData;
 std::string objdump::DisSymName;
 bool objdump::IsOtool;
-bool objdump::NoUseMemberSyntax;
+bool objdump::UseMemberSyntax;
 bool objdump::SymbolicOperands;
 std::vector<std::string> objdump::ArchFlags;
 
@@ -2535,12 +2535,13 @@ static bool ValidateArchFlags() {
   return true;
 }
 
-static bool skipArchiveMember(const object::Archive::Child &C) {
+static bool skipArchiveMember(const object::Archive::Child &C,
+                              StringRef Filename) {
   if (ArchiveMemberFilter.empty())
     return false;
   Expected<StringRef> NameOrErr = C.getName();
   if (!NameOrErr) {
-    consumeError(NameOrErr.takeError());
+    reportError(NameOrErr.takeError(), Filename);
     return true;
   }
   return *NameOrErr != ArchiveMemberFilter;
@@ -2558,7 +2559,7 @@ void objdump::parseInputMachO(StringRef Filename) {
   // with ')' and contains '(', split it into the archive path and member
   // name. The -m option disables this parsing.
   ArchiveMemberFilter.clear();
-  if (IsOtool && !NoUseMemberSyntax && !Filename.empty() &&
+  if (IsOtool && UseMemberSyntax && !Filename.empty() &&
       Filename.back() == ')') {
     auto Pos = Filename.rfind('(');
     if (Pos != StringRef::npos && Pos > 0) {
@@ -2588,7 +2589,7 @@ void objdump::parseInputMachO(StringRef Filename) {
     bool FoundMember = false;
     for (auto &C : A->children(Err)) {
       ++I;
-      if (skipArchiveMember(C))
+      if (skipArchiveMember(C, Filename))
         continue;
       FoundMember = true;
       Expected<std::unique_ptr<Binary>> ChildOrErr = C.getAsBinary();
@@ -2681,7 +2682,7 @@ void objdump::parseInputMachO(MachOUniversalBinary *UB) {
             bool FoundMember = false;
             for (auto &C : A->children(Err)) {
               ++I;
-              if (skipArchiveMember(C))
+              if (skipArchiveMember(C, Filename))
                 continue;
               FoundMember = true;
               Expected<std::unique_ptr<Binary>> ChildOrErr = C.getAsBinary();
@@ -2751,7 +2752,7 @@ void objdump::parseInputMachO(MachOUniversalBinary *UB) {
           bool FoundMember = false;
           for (auto &C : A->children(Err)) {
             ++I;
-            if (skipArchiveMember(C))
+            if (skipArchiveMember(C, Filename))
               continue;
             FoundMember = true;
             Expected<std::unique_ptr<Binary>> ChildOrErr = C.getAsBinary();
@@ -2811,7 +2812,7 @@ void objdump::parseInputMachO(MachOUniversalBinary *UB) {
       bool FoundMember = false;
       for (auto &C : A->children(Err)) {
         ++I;
-        if (skipArchiveMember(C))
+        if (skipArchiveMember(C, Filename))
           continue;
         FoundMember = true;
         Expected<std::unique_ptr<Binary>> ChildOrErr = C.getAsBinary();
diff --git a/llvm/tools/llvm-objdump/MachODump.h b/llvm/tools/llvm-objdump/MachODump.h
index e8f51ad0002cb..b9a316a4deb16 100644
--- a/llvm/tools/llvm-objdump/MachODump.h
+++ b/llvm/tools/llvm-objdump/MachODump.h
@@ -54,12 +54,12 @@ extern bool InfoPlist;
 extern bool LazyBind;
 extern bool LeadingHeaders;
 extern bool LinkOptHints;
-extern bool NoUseMemberSyntax;
 extern bool ObjcMetaData;
 extern bool Rebase;
 extern bool Rpaths;
 extern bool SymbolicOperands;
 extern bool UniversalHeaders;
+extern bool UseMemberSyntax;
 extern bool Verbose;
 extern bool WeakBind;
 extern std::vector<std::string> ArchFlags;
diff --git a/llvm/tools/llvm-objdump/llvm-objdump.cpp b/llvm/tools/llvm-objdump/llvm-objdump.cpp
index c0f0250564228..3cdaf64b1c99d 100644
--- a/llvm/tools/llvm-objdump/llvm-objdump.cpp
+++ b/llvm/tools/llvm-objdump/llvm-objdump.cpp
@@ -3693,7 +3693,7 @@ static void parseOtoolOptions(const llvm::opt::InputArgList &InputArgs) {
   ChainedFixups = InputArgs.hasArg(OTOOL_chained_fixups);
   DyldInfo = InputArgs.hasArg(OTOOL_dyld_info);
 
-  NoUseMemberSyntax = InputArgs.hasArg(OTOOL_m);
+  UseMemberSyntax = !InputArgs.hasArg(OTOOL_m);
 
   InputFilenames = InputArgs.getAllArgValues(OTOOL_INPUT);
   if (InputFilenames.empty())



More information about the llvm-commits mailing list