[llvm] [llvm-otool] Fix -arch flag for universal binary slice selection (PR #184810)

Ryan Mansfield via llvm-commits llvm-commits at lists.llvm.org
Thu Mar 5 07:39:58 PST 2026


https://github.com/rjmansfield created https://github.com/llvm/llvm-project/pull/184810

In otool mode, -arch was only used for disassembler target selection but not for picking the right slice from a universal binary.

>From c1c16ef97afbc78ea485ce2c8d937ae042adcf34 Mon Sep 17 00:00:00 2001
From: Ryan Mansfield <ryan_mansfield at apple.com>
Date: Thu, 5 Mar 2026 10:38:25 -0500
Subject: [PATCH] [llvm-otool] Fix -arch flag for universal binary slice
 selection

In otool mode, -arch was only used for disassembler target selection
but not for picking the right slice from a universal binary.
---
 .../test/tools/llvm-objdump/MachO/otool-arch-flag.test | 10 ++++++++++
 llvm/tools/llvm-objdump/MachODump.cpp                  |  2 +-
 llvm/tools/llvm-objdump/MachODump.h                    |  1 +
 llvm/tools/llvm-objdump/llvm-objdump.cpp               |  2 ++
 4 files changed, 14 insertions(+), 1 deletion(-)
 create mode 100644 llvm/test/tools/llvm-objdump/MachO/otool-arch-flag.test

diff --git a/llvm/test/tools/llvm-objdump/MachO/otool-arch-flag.test b/llvm/test/tools/llvm-objdump/MachO/otool-arch-flag.test
new file mode 100644
index 0000000000000..1b145ac1002d4
--- /dev/null
+++ b/llvm/test/tools/llvm-objdump/MachO/otool-arch-flag.test
@@ -0,0 +1,10 @@
+# Test that llvm-otool -arch selects the correct slice from a universal binary.
+
+RUN: llvm-otool -h -arch x86_64 %p/Inputs/macho-universal.x86_64.i386 \
+RUN: | FileCheck %s --check-prefix=X86_64
+
+RUN: llvm-otool -h -arch i386 %p/Inputs/macho-universal.x86_64.i386 \
+RUN: | FileCheck %s --check-prefix=I386
+
+X86_64: 0xfeedfacf
+I386:   0xfeedface
diff --git a/llvm/tools/llvm-objdump/MachODump.cpp b/llvm/tools/llvm-objdump/MachODump.cpp
index e882af2dd1b90..1a574997cf4d0 100644
--- a/llvm/tools/llvm-objdump/MachODump.cpp
+++ b/llvm/tools/llvm-objdump/MachODump.cpp
@@ -82,7 +82,7 @@ bool objdump::ObjcMetaData;
 std::string objdump::DisSymName;
 bool objdump::IsOtool;
 bool objdump::SymbolicOperands;
-static std::vector<std::string> ArchFlags;
+std::vector<std::string> objdump::ArchFlags;
 
 static bool ArchAll = false;
 static std::string ThumbTripleName;
diff --git a/llvm/tools/llvm-objdump/MachODump.h b/llvm/tools/llvm-objdump/MachODump.h
index b54652b801c90..81fd8775e1d20 100644
--- a/llvm/tools/llvm-objdump/MachODump.h
+++ b/llvm/tools/llvm-objdump/MachODump.h
@@ -61,6 +61,7 @@ extern bool SymbolicOperands;
 extern bool UniversalHeaders;
 extern bool Verbose;
 extern bool WeakBind;
+extern std::vector<std::string> ArchFlags;
 
 Error getMachORelocationValueString(const object::MachOObjectFile *Obj,
                                     const object::RelocationRef &RelRef,
diff --git a/llvm/tools/llvm-objdump/llvm-objdump.cpp b/llvm/tools/llvm-objdump/llvm-objdump.cpp
index a01b44a06b859..4929c1b840770 100644
--- a/llvm/tools/llvm-objdump/llvm-objdump.cpp
+++ b/llvm/tools/llvm-objdump/llvm-objdump.cpp
@@ -3658,6 +3658,8 @@ static void parseOtoolOptions(const llvm::opt::InputArgList &InputArgs) {
   PrintImmHex = true;
 
   ArchName = InputArgs.getLastArgValue(OTOOL_arch).str();
+  if (!ArchName.empty())
+    ArchFlags.push_back(ArchName);
   LinkOptHints = InputArgs.hasArg(OTOOL_C);
   if (InputArgs.hasArg(OTOOL_d))
     FilterSections.push_back("__DATA,__data");



More information about the llvm-commits mailing list