Author: Tianyi Chen Date: 2026-09-09T10:10:29Z New Revision: cc38b29781cbc0a2b525a18833adf61c51375af2
URL: https://github.com/llvm/llvm-project/commit/cc38b29781cbc0a2b525a18833adf61c51375af2 DIFF: https://github.com/llvm/llvm-project/commit/cc38b29781cbc0a2b525a18833adf61c51375af2.diff LOG: [llvm-readobj] Display Mach-O CPU capability bits (#221617) The Mach-O file header output masks the capability bits out of `cpusubtype` without printing them separately, so this information is missing from the output. Add a `CpuCapabilities` field to print the high byte in hexadecimal, matching the numeric representation used by `llvm-objdump`. Fixes #80198. Assisted-by: OpenAI Codex (implementation, tests, and initial description). Added: llvm/test/tools/llvm-readobj/MachO/cpu-capabilities.yaml Modified: clang/test/Misc/cc1as-darwin-target-variant-sdk-version.s clang/test/Misc/cc1as-darwin-target-variant-triple.s llvm/test/MC/MachO/diff-with-two-sections.s llvm/test/MC/MachO/weakdef.s llvm/test/MC/MachO/zero-space.s llvm/test/tools/llvm-readobj/MachO/file-headers-arm64.test llvm/test/tools/llvm-readobj/MachO/file-headers.test llvm/tools/llvm-readobj/MachODumper.cpp Removed: ################################################################################ diff --git a/clang/test/Misc/cc1as-darwin-target-variant-sdk-version.s b/clang/test/Misc/cc1as-darwin-target-variant-sdk-version.s index 6d22d6d395c98..45229aa0d5584 100644 --- a/clang/test/Misc/cc1as-darwin-target-variant-sdk-version.s +++ b/clang/test/Misc/cc1as-darwin-target-variant-sdk-version.s @@ -12,6 +12,7 @@ // CHECK-NEXT: Magic: Magic64 (0xFEEDFACF) // CHECK-NEXT: CpuType: X86-64 (0x1000007) // CHECK-NEXT: CpuSubType: CPU_SUBTYPE_X86_64_ALL (0x3) +// CHECK-NEXT: CpuCapabilities: 0x0 // CHECK-NEXT: FileType: Relocatable (0x1) // CHECK-NEXT: NumOfLoadCommands: 3 // CHECK-NEXT: SizeOfLoadCommands: 192 diff --git a/clang/test/Misc/cc1as-darwin-target-variant-triple.s b/clang/test/Misc/cc1as-darwin-target-variant-triple.s index b30e5e52c1ef2..d4485f82df3bf 100644 --- a/clang/test/Misc/cc1as-darwin-target-variant-triple.s +++ b/clang/test/Misc/cc1as-darwin-target-variant-triple.s @@ -12,6 +12,7 @@ // CHECK-NEXT: Magic: Magic64 (0xFEEDFACF) // CHECK-NEXT: CpuType: X86-64 (0x1000007) // CHECK-NEXT: CpuSubType: CPU_SUBTYPE_X86_64_ALL (0x3) +// CHECK-NEXT: CpuCapabilities: 0x0 // CHECK-NEXT: FileType: Relocatable (0x1) // CHECK-NEXT: NumOfLoadCommands: 3 // CHECK-NEXT: SizeOfLoadCommands: 192 diff --git a/llvm/test/MC/MachO/ diff -with-two-sections.s b/llvm/test/MC/MachO/ diff -with-two-sections.s index 87a8ad960e4c8..76005c64e71f9 100644 --- a/llvm/test/MC/MachO/ diff -with-two-sections.s +++ b/llvm/test/MC/MachO/ diff -with-two-sections.s @@ -15,6 +15,7 @@ Ltmp4 = Leh_func_begin0-Ltmp3 // CHECK-NEXT: Magic: Magic (0xFEEDFACE) // CHECK-NEXT: CpuType: X86 (0x7) // CHECK-NEXT: CpuSubType: CPU_SUBTYPE_I386_ALL (0x3) +// CHECK-NEXT: CpuCapabilities: 0x0 // CHECK-NEXT: FileType: Relocatable (0x1) // CHECK-NEXT: NumOfLoadCommands: 2 // CHECK-NEXT: SizeOfLoadCommands: 208 diff --git a/llvm/test/MC/MachO/weakdef.s b/llvm/test/MC/MachO/weakdef.s index 200be41cd4c73..1f9fce3911f8f 100644 --- a/llvm/test/MC/MachO/weakdef.s +++ b/llvm/test/MC/MachO/weakdef.s @@ -22,6 +22,7 @@ __ZTI3optIbE: // CHECK-NEXT: Magic: Magic (0xFEEDFACE) // CHECK-NEXT: CpuType: X86 (0x7) // CHECK-NEXT: CpuSubType: CPU_SUBTYPE_I386_ALL (0x3) +// CHECK-NEXT: CpuCapabilities: 0x0 // CHECK-NEXT: FileType: Relocatable (0x1) // CHECK-NEXT: NumOfLoadCommands: 4 // CHECK-NEXT: SizeOfLoadCommands: 380 diff --git a/llvm/test/MC/MachO/zero-space.s b/llvm/test/MC/MachO/zero-space.s index 753bd7851bf0f..7acca8e2c53bf 100644 --- a/llvm/test/MC/MachO/zero-space.s +++ b/llvm/test/MC/MachO/zero-space.s @@ -14,6 +14,7 @@ // CHECK-NEXT: Magic: Magic64 (0xFEEDFACF) // CHECK-NEXT: CpuType: X86-64 (0x1000007) // CHECK-NEXT: CpuSubType: CPU_SUBTYPE_X86_64_ALL (0x3) +// CHECK-NEXT: CpuCapabilities: 0x0 // CHECK-NEXT: FileType: Relocatable (0x1) // CHECK-NEXT: NumOfLoadCommands: 2 // CHECK-NEXT: SizeOfLoadCommands: 248 diff --git a/llvm/test/tools/llvm-readobj/MachO/cpu-capabilities.yaml b/llvm/test/tools/llvm-readobj/MachO/cpu-capabilities.yaml new file mode 100644 index 0000000000000..0b799d776ea94 --- /dev/null +++ b/llvm/test/tools/llvm-readobj/MachO/cpu-capabilities.yaml @@ -0,0 +1,61 @@ +## CPU capabilities occupy the high byte of cpusubtype. Display the whole byte +## without changing the CPU subtype or interpreting architecture-specific bits. + +## ARM64e pointer authentication capability bits, including ABI version bits. +# RUN: yaml2obj %s -DSUBTYPE=0x80000002 -o %t +# RUN: llvm-readobj -h %t | FileCheck %s --check-prefix=ARM64E -DCAPS=0x80 +# RUN: yaml2obj %s -DSUBTYPE=0x81000002 -o %t +# RUN: llvm-readobj -h %t | FileCheck %s --check-prefix=ARM64E -DCAPS=0x81 +# RUN: yaml2obj %s -DSUBTYPE=0xC1000002 -o %t +# RUN: llvm-readobj -h %t | FileCheck %s --check-prefix=ARM64E -DCAPS=0xC1 + +## Preserve all capability bits, even when their meaning is unknown. +# RUN: yaml2obj %s -DSUBTYPE=0xFF000002 -o %t +# RUN: llvm-readobj -h %t | FileCheck %s --check-prefix=ARM64E -DCAPS=0xFF +# RUN: yaml2obj %s -DSUBTYPE=0x00000002 -o %t +# RUN: llvm-readobj -h %t | FileCheck %s --check-prefix=ARM64E -DCAPS=0x0 + +# ARM64E: CpuSubType: CPU_SUBTYPE_ARM64E (0x2) +# ARM64E-NEXT: CpuCapabilities: [[CAPS]]{{$}} +# ARM64E-NEXT: FileType: Relocatable (0x1) + +## Also check 32-bit little-endian and 32/64-bit big-endian headers. +# RUN: yaml2obj %s --docnum=2 -DCPUTYPE=0x7 -DSUBTYPE=0x80000003 -o %t +# RUN: llvm-readobj -h %t | FileCheck %s --check-prefix=X86 + +# X86: CpuSubType: CPU_SUBTYPE_I386_ALL (0x3) +# X86-NEXT: CpuCapabilities: 0x80{{$}} +# X86-NEXT: FileType: Relocatable (0x1) + +# RUN: yaml2obj %s --docnum=2 -DENDIAN=false -DCPUTYPE=0x12 -DSUBTYPE=0xA5000000 -o %t +# RUN: llvm-readobj -h %t | FileCheck %s --check-prefixes=PPC,PPC32 +# RUN: yaml2obj %s -DENDIAN=false -DCPUTYPE=0x1000012 -DSUBTYPE=0xA5000000 -o %t +# RUN: llvm-readobj -h %t | FileCheck %s --check-prefixes=PPC,PPC64 + +# PPC32: CpuSubType: CPU_SUBTYPE_POWERPC_ALL (0x0) +# PPC64: CpuSubType: 0x0 +# PPC-NEXT: CpuCapabilities: 0xA5{{$}} +# PPC-NEXT: FileType: Relocatable (0x1) + +--- !mach-o +IsLittleEndian: [[ENDIAN=true]] +FileHeader: + magic: 0xFEEDFACF + cputype: [[CPUTYPE=0x100000C]] + cpusubtype: [[SUBTYPE]] + filetype: 0x1 + ncmds: 0 + sizeofcmds: 0 + flags: 0 + reserved: 0 + +--- !mach-o +IsLittleEndian: [[ENDIAN=true]] +FileHeader: + magic: 0xFEEDFACE + cputype: [[CPUTYPE]] + cpusubtype: [[SUBTYPE]] + filetype: 0x1 + ncmds: 0 + sizeofcmds: 0 + flags: 0 diff --git a/llvm/test/tools/llvm-readobj/MachO/file-headers-arm64.test b/llvm/test/tools/llvm-readobj/MachO/file-headers-arm64.test index 910ee019f3293..5d97647b6654f 100644 --- a/llvm/test/tools/llvm-readobj/MachO/file-headers-arm64.test +++ b/llvm/test/tools/llvm-readobj/MachO/file-headers-arm64.test @@ -21,6 +21,7 @@ # ARM64-NEXT: Magic: Magic64 (0xFEEDFACF) # ARM64-NEXT: CpuType: Arm64 (0x100000C) # ARM64-NEXT: CpuSubType: [[SUBTYPE]] +# ARM64-NEXT: CpuCapabilities: 0x0 # ARM64-NEXT: FileType: Relocatable (0x1) # ARM64-NEXT: NumOfLoadCommands: 0 # ARM64-NEXT: SizeOfLoadCommands: 0 diff --git a/llvm/test/tools/llvm-readobj/MachO/file-headers.test b/llvm/test/tools/llvm-readobj/MachO/file-headers.test index d3294f5727e11..0bf6cb6bc84ec 100644 --- a/llvm/test/tools/llvm-readobj/MachO/file-headers.test +++ b/llvm/test/tools/llvm-readobj/MachO/file-headers.test @@ -41,6 +41,7 @@ FileHeader: # MACHO32-NEXT: Magic: Magic (0xFEEDFACE) # MACHO32-NEXT: CpuType: [[CPUTYPE]] # MACHO32-NEXT: CpuSubType: [[SUBTYPE]] +# MACHO32-NEXT: CpuCapabilities: 0x0 # MACHO32-NEXT: FileType: Relocatable (0x1) # MACHO32-NEXT: NumOfLoadCommands: 0 # MACHO32-NEXT: SizeOfLoadCommands: 0 @@ -88,6 +89,7 @@ FileHeader: # MACHO64-NEXT: Magic: Magic64 (0xFEEDFACF) # MACHO64-NEXT: CpuType: [[CPUTYPE]] # MACHO64-NEXT: CpuSubType: [[SUBTYPE]] +# MACHO64-NEXT: CpuCapabilities: 0x0 # MACHO64-NEXT: FileType: Relocatable (0x1) # MACHO64-NEXT: NumOfLoadCommands: 0 # MACHO64-NEXT: SizeOfLoadCommands: 0 diff --git a/llvm/tools/llvm-readobj/MachODumper.cpp b/llvm/tools/llvm-readobj/MachODumper.cpp index a288fbc85058f..8fc92850606af 100644 --- a/llvm/tools/llvm-readobj/MachODumper.cpp +++ b/llvm/tools/llvm-readobj/MachODumper.cpp @@ -491,6 +491,8 @@ void MachODumper::printFileHeaders(const MachHeader &Header) { default: W.printHex("CpuSubType", subtype); } + W.printHex("CpuCapabilities", + (Header.cpusubtype & MachO::CPU_SUBTYPE_MASK) >> 24); W.printEnum("FileType", Header.filetype, EnumStrings(MachOHeaderFileTypes)); W.printNumber("NumOfLoadCommands", Header.ncmds); W.printNumber("SizeOfLoadCommands", Header.sizeofcmds); _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
