Skip to content

Conversation

@rjmansfield
Copy link
Contributor

This adds support for ARM64_32 (ILP32) cpu type and subtype in llvm-readobj --file-headers. The support was previously added for llvm-objdump but was accidentally omitted from llvm-readobj.

This adds support for ARM64_32 (ILP32) cpu type and subtype
in llvm-readobj --file-headers. The support was previously added for
llvm-objdump but was accidentally omitted from llvm-readobj.
@llvmbot
Copy link
Member

llvmbot commented Dec 1, 2025

@llvm/pr-subscribers-llvm-binary-utilities

Author: Ryan Mansfield (rjmansfield)

Changes

This adds support for ARM64_32 (ILP32) cpu type and subtype in llvm-readobj --file-headers. The support was previously added for llvm-objdump but was accidentally omitted from llvm-readobj.


Full diff: https://github.com/llvm/llvm-project/pull/170193.diff

2 Files Affected:

  • (modified) llvm/test/tools/llvm-readobj/MachO/file-headers.test (+31)
  • (modified) llvm/tools/llvm-readobj/MachODumper.cpp (+18-9)
diff --git a/llvm/test/tools/llvm-readobj/MachO/file-headers.test b/llvm/test/tools/llvm-readobj/MachO/file-headers.test
index 9425094bbf502..5058219b8b018 100644
--- a/llvm/test/tools/llvm-readobj/MachO/file-headers.test
+++ b/llvm/test/tools/llvm-readobj/MachO/file-headers.test
@@ -158,3 +158,34 @@ FileHeader:
   ncmds:      0
   sizeofcmds: 0
   flags:      0x00002000
+
+# RUN: yaml2obj %s --docnum=6 -o %t.arm64_32
+# RUN: llvm-readobj -h %t.arm64_32 \
+# RUN:  | FileCheck %s --strict-whitespace --match-full-lines -DFILE=%t.arm64_32 --check-prefix ARM64_32
+
+#      ARM64_32:File: [[FILE]]
+# ARM64_32-NEXT:Format: Mach-O arm64 (ILP32)
+# ARM64_32-NEXT:Arch: aarch64_32
+# ARM64_32-NEXT:AddressSize: 32bit
+# ARM64_32-NEXT:MachHeader {
+# ARM64_32-NEXT:  Magic: Magic (0xFEEDFACE)
+# ARM64_32-NEXT:  CpuType: Arm64 (ILP32) (0x200000C)
+# ARM64_32-NEXT:  CpuSubType: CPU_SUBTYPE_ARM64_32_V8 (0x1)
+# ARM64_32-NEXT:  FileType: Relocatable (0x1)
+# ARM64_32-NEXT:  NumOfLoadCommands: 0
+# ARM64_32-NEXT:  SizeOfLoadCommands: 0
+# ARM64_32-NEXT:  Flags [ (0x2000)
+# ARM64_32-NEXT:    MH_SUBSECTIONS_VIA_SYMBOLS (0x2000)
+# ARM64_32-NEXT:  ]
+# ARM64_32-NEXT:}
+# ARM64_32-NOT:{{.}}
+
+--- !mach-o
+FileHeader:
+  magic:      0xFEEDFACE
+  cputype:    0x0200000C
+  cpusubtype: 0x00000001
+  filetype:   0x00000001
+  ncmds:      0
+  sizeofcmds: 0
+  flags:      0x00002000
diff --git a/llvm/tools/llvm-readobj/MachODumper.cpp b/llvm/tools/llvm-readobj/MachODumper.cpp
index 0a23ad772e4c5..a2e22b4b3bb83 100644
--- a/llvm/tools/llvm-readobj/MachODumper.cpp
+++ b/llvm/tools/llvm-readobj/MachODumper.cpp
@@ -111,15 +111,16 @@ const EnumEntry<uint32_t> MachOHeaderFileTypes[] = {
 };
 
 const EnumEntry<uint32_t> MachOHeaderCpuTypes[] = {
-  { "Any"       , static_cast<uint32_t>(MachO::CPU_TYPE_ANY) },
-  { "X86"       , MachO::CPU_TYPE_X86       },
-  { "X86-64"    , MachO::CPU_TYPE_X86_64    },
-  { "Mc98000"   , MachO::CPU_TYPE_MC98000   },
-  { "Arm"       , MachO::CPU_TYPE_ARM       },
-  { "Arm64"     , MachO::CPU_TYPE_ARM64     },
-  { "Sparc"     , MachO::CPU_TYPE_SPARC     },
-  { "PowerPC"   , MachO::CPU_TYPE_POWERPC   },
-  { "PowerPC64" , MachO::CPU_TYPE_POWERPC64 },
+    {"Any", static_cast<uint32_t>(MachO::CPU_TYPE_ANY)},
+    {"X86", MachO::CPU_TYPE_X86},
+    {"X86-64", MachO::CPU_TYPE_X86_64},
+    {"Mc98000", MachO::CPU_TYPE_MC98000},
+    {"Arm", MachO::CPU_TYPE_ARM},
+    {"Arm64", MachO::CPU_TYPE_ARM64},
+    {"Arm64 (ILP32)", MachO::CPU_TYPE_ARM64_32},
+    {"Sparc", MachO::CPU_TYPE_SPARC},
+    {"PowerPC", MachO::CPU_TYPE_POWERPC},
+    {"PowerPC64", MachO::CPU_TYPE_POWERPC64},
 };
 
 const EnumEntry<uint32_t> MachOHeaderCpuSubtypesX86[] = {
@@ -166,6 +167,10 @@ const EnumEntry<uint32_t> MachOHeaderCpuSubtypesARM[] = {
   LLVM_READOBJ_ENUM_ENT(MachO, CPU_SUBTYPE_ARM_V7EM),
 };
 
+const EnumEntry<uint32_t> MachOHeaderCpuSubtypesARM64_32[] = {
+    LLVM_READOBJ_ENUM_ENT(MachO, CPU_SUBTYPE_ARM64_32_V8),
+};
+
 const EnumEntry<uint32_t> MachOHeaderCpuSubtypesARM64[] = {
     LLVM_READOBJ_ENUM_ENT(MachO, CPU_SUBTYPE_ARM64_ALL),
     LLVM_READOBJ_ENUM_ENT(MachO, CPU_SUBTYPE_ARM64_V8),
@@ -453,6 +458,10 @@ void MachODumper::printFileHeaders(const MachHeader &Header) {
   case MachO::CPU_TYPE_ARM64:
     W.printEnum("CpuSubType", subtype, ArrayRef(MachOHeaderCpuSubtypesARM64));
     break;
+  case MachO::CPU_TYPE_ARM64_32:
+    W.printEnum("CpuSubType", subtype,
+                ArrayRef(MachOHeaderCpuSubtypesARM64_32));
+    break;
   case MachO::CPU_TYPE_POWERPC64:
   default:
     W.printHex("CpuSubtype", subtype);

Copy link
Collaborator

@jh7370 jh7370 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks basically fine. Just some test and formatting thoughts.

 - Disable clang-format for MachOHeaderCpuTypes.
 - Refactor file-headers.test check patterns.
Copy link
Collaborator

@jh7370 jh7370 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM, thanks!

@rjmansfield
Copy link
Contributor Author

Thanks for the review. If you can merge on my behalf, I would appreciate it.

@jh7370 jh7370 merged commit 4c03b88 into llvm:main Dec 4, 2025
10 checks passed
@jh7370
Copy link
Collaborator

jh7370 commented Dec 4, 2025

Thanks for the review. If you can merge on my behalf, I would appreciate it.

Done.

@rjmansfield rjmansfield deleted the readobj-arm64_32 branch December 5, 2025 13:43
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants