Skip to content

Commit 4c03b88

Browse files
authored
[llvm-readobj][MachO] Add support for CPU_TYPE_ARM64_32 (llvm#170193)
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.
1 parent 4b2714f commit 4c03b88

File tree

2 files changed

+94
-144
lines changed

2 files changed

+94
-144
lines changed
Lines changed: 73 additions & 134 deletions
Original file line numberDiff line numberDiff line change
@@ -1,160 +1,99 @@
1-
# RUN: yaml2obj %s --docnum=1 -o %t.i386
1+
# RUN: yaml2obj %s --docnum=1 -o %t.i386 -DCPUTYPE=0x00000007 -DSUBTYPE=0x00000003 -DENDIAN=true
22
# RUN: llvm-readobj -h %t.i386 \
3-
# RUN: | FileCheck %s --strict-whitespace --match-full-lines -DFILE=%t.i386 --check-prefix I386
3+
# RUN: | FileCheck %s --strict-whitespace --match-full-lines -DFILE=%t.i386 --check-prefix=MACHO32 \
4+
# RUN: -DFORMAT="Mach-O 32-bit i386" -DARCH=i386 -DCPUTYPE="X86 (0x7)" \
5+
# RUN: -DSUBTYPE="CPU_SUBTYPE_I386_ALL (0x3)"
46

5-
# I386:File: [[FILE]]
6-
# I386-NEXT:Format: Mach-O 32-bit i386
7-
# I386-NEXT:Arch: i386
8-
# I386-NEXT:AddressSize: 32bit
9-
# I386-NEXT:MachHeader {
10-
# I386-NEXT: Magic: Magic (0xFEEDFACE)
11-
# I386-NEXT: CpuType: X86 (0x7)
12-
# I386-NEXT: CpuSubType: CPU_SUBTYPE_I386_ALL (0x3)
13-
# I386-NEXT: FileType: Relocatable (0x1)
14-
# I386-NEXT: NumOfLoadCommands: 0
15-
# I386-NEXT: SizeOfLoadCommands: 0
16-
# I386-NEXT: Flags [ (0x2000)
17-
# I386-NEXT: MH_SUBSECTIONS_VIA_SYMBOLS (0x2000)
18-
# I386-NEXT: ]
19-
# I386-NEXT:}
20-
# I386-NOT:{{.}}
7+
# RUN: yaml2obj %s --docnum=1 -o %t.arm-v7 -DCPUTYPE=0x0000000C -DSUBTYPE=0x9 -DENDIAN=true
8+
# RUN: llvm-readobj -h %t.arm-v7 \
9+
# RUN: | FileCheck %s --strict-whitespace --match-full-lines -DFILE=%t.arm-v7 --check-prefix=MACHO32 \
10+
# RUN: -DFORMAT="Mach-O arm" -DARCH=arm \
11+
# RUN: -DCPUTYPE="Arm (0xC)" -DSUBTYPE="CPU_SUBTYPE_ARM_V7 (0x9)"
2112

22-
--- !mach-o
23-
FileHeader:
24-
magic: 0xFEEDFACE
25-
cputype: 0x00000007
26-
cpusubtype: 0x00000003
27-
filetype: 0x00000001
28-
ncmds: 0
29-
sizeofcmds: 0
30-
flags: 0x00002000
31-
32-
# RUN: yaml2obj %s --docnum=2 -o %t.x86-64
33-
# RUN: llvm-readobj -h %t.x86-64 \
34-
# RUN: | FileCheck %s --strict-whitespace --match-full-lines -DFILE=%t.x86-64 --check-prefix X86-64
13+
# RUN: yaml2obj %s --docnum=1 -o %t.arm64_32 -DCPUTYPE=0x0200000C -DSUBTYPE=0x1 -DENDIAN=true
14+
# RUN: llvm-readobj -h %t.arm64_32 \
15+
# RUN: | FileCheck %s --strict-whitespace --match-full-lines -DFILE=%t.arm64_32 --check-prefix=MACHO32 \
16+
# RUN: -DFORMAT="Mach-O arm64 (ILP32)" -DARCH=aarch64_32 -DCPUTYPE="Arm64 (ILP32) (0x200000C)" \
17+
# RUN: -DSUBTYPE="CPU_SUBTYPE_ARM64_32_V8 (0x1)"
3518

36-
# X86-64:File: [[FILE]]
37-
# X86-64-NEXT:Format: Mach-O 64-bit x86-64
38-
# X86-64-NEXT:Arch: x86_64
39-
# X86-64-NEXT:AddressSize: 64bit
40-
# X86-64-NEXT:MachHeader {
41-
# X86-64-NEXT: Magic: Magic64 (0xFEEDFACF)
42-
# X86-64-NEXT: CpuType: X86-64 (0x1000007)
43-
# X86-64-NEXT: CpuSubType: CPU_SUBTYPE_X86_64_ALL (0x3)
44-
# X86-64-NEXT: FileType: Relocatable (0x1)
45-
# X86-64-NEXT: NumOfLoadCommands: 0
46-
# X86-64-NEXT: SizeOfLoadCommands: 0
47-
# X86-64-NEXT: Flags [ (0x2000)
48-
# X86-64-NEXT: MH_SUBSECTIONS_VIA_SYMBOLS (0x2000)
49-
# X86-64-NEXT: ]
50-
# X86-64-NEXT: Reserved: 0x0
51-
# X86-64-NEXT:}
52-
# X86-64-NOT:{{.}}
19+
# RUN: yaml2obj %s --docnum=1 -o %t.ppc -DCPUTYPE=0x00000012 -DSUBTYPE=0x00000000 -DENDIAN=false
20+
# RUN: llvm-readobj -h %t.ppc \
21+
# RUN: | FileCheck %s --strict-whitespace --match-full-lines -DFILE=%t.ppc --check-prefix=MACHO32 \
22+
# RUN: -DFORMAT="Mach-O 32-bit ppc" -DARCH=powerpc -DCPUTYPE="PowerPC (0x12)" \
23+
# RUN: -DSUBTYPE="CPU_SUBTYPE_POWERPC_ALL (0x0)"
5324

5425
--- !mach-o
26+
IsLittleEndian: [[ENDIAN]]
5527
FileHeader:
56-
magic: 0xFEEDFACF
57-
cputype: 0x01000007
58-
cpusubtype: 0x00000003
28+
magic: 0xFEEDFACE
29+
cputype: [[CPUTYPE]]
30+
cpusubtype: [[SUBTYPE]]
5931
filetype: 0x00000001
6032
ncmds: 0
6133
sizeofcmds: 0
6234
flags: 0x00002000
63-
reserved: 0x00000000
6435

65-
# RUN: yaml2obj %s --docnum=3 -o %t.ppc
66-
# RUN: llvm-readobj -h %t.ppc \
67-
# RUN: | FileCheck %s --strict-whitespace --match-full-lines -DFILE=%t.ppc --check-prefix PPC
36+
# MACHO32:File: [[FILE]]
37+
# MACHO32-NEXT:Format: [[FORMAT]]
38+
# MACHO32-NEXT:Arch: [[ARCH]]
39+
# MACHO32-NEXT:AddressSize: 32bit
40+
# MACHO32-NEXT:MachHeader {
41+
# MACHO32-NEXT: Magic: Magic (0xFEEDFACE)
42+
# MACHO32-NEXT: CpuType: [[CPUTYPE]]
43+
# MACHO32-NEXT: CpuSubType: [[SUBTYPE]]
44+
# MACHO32-NEXT: FileType: Relocatable (0x1)
45+
# MACHO32-NEXT: NumOfLoadCommands: 0
46+
# MACHO32-NEXT: SizeOfLoadCommands: 0
47+
# MACHO32-NEXT: Flags [ (0x2000)
48+
# MACHO32-NEXT: MH_SUBSECTIONS_VIA_SYMBOLS (0x2000)
49+
# MACHO32-NEXT: ]
50+
# MACHO32-NEXT:}
51+
# MACHO32-NOT:{{.}}
6852

69-
# PPC:File: [[FILE]]
70-
# PPC-NEXT:Format: Mach-O 32-bit ppc
71-
# PPC-NEXT:Arch: powerpc
72-
# PPC-NEXT:AddressSize: 32bit
73-
# PPC-NEXT:MachHeader {
74-
# PPC-NEXT: Magic: Magic (0xFEEDFACE)
75-
# PPC-NEXT: CpuType: PowerPC (0x12)
76-
# PPC-NEXT: CpuSubType: CPU_SUBTYPE_POWERPC_ALL (0x0)
77-
# PPC-NEXT: FileType: Relocatable (0x1)
78-
# PPC-NEXT: NumOfLoadCommands: 0
79-
# PPC-NEXT: SizeOfLoadCommands: 0
80-
# PPC-NEXT: Flags [ (0x2000)
81-
# PPC-NEXT: MH_SUBSECTIONS_VIA_SYMBOLS (0x2000)
82-
# PPC-NEXT: ]
83-
# PPC-NEXT:}
84-
# PPC-NOT:{{.}}
53+
# RUN: yaml2obj %s --docnum=2 -o %t.x86-64 -DCPUTYPE=0x01000007 -DSUBTYPE=0x00000003 -DENDIAN=true
54+
# RUN: llvm-readobj -h %t.x86-64 \
55+
# RUN: | FileCheck %s --strict-whitespace --match-full-lines -DFILE=%t.x86-64 --check-prefix=MACHO64 \
56+
# RUN: -DFORMAT="Mach-O 64-bit x86-64" -DARCH=x86_64 -DCPUTYPE="X86-64 (0x1000007)" \
57+
# RUN: -DSUBTYPE="CPU_SUBTYPE_X86_64_ALL (0x3)"
8558

86-
--- !mach-o
87-
IsLittleEndian: false
88-
FileHeader:
89-
magic: 0xFEEDFACE
90-
cputype: 0x00000012
91-
cpusubtype: 0x00000000
92-
filetype: 0x00000001
93-
ncmds: 0
94-
sizeofcmds: 0
95-
flags: 0x00002000
59+
# RUN: yaml2obj %s --docnum=2 -o %t.arm64 -DCPUTYPE=0x0100000C -DSUBTYPE=0x00000000 -DENDIAN=true
60+
# RUN: llvm-readobj -h %t.arm64 \
61+
# RUN: | FileCheck %s --strict-whitespace --match-full-lines -DFILE=%t.arm64 --check-prefix=MACHO64 \
62+
# RUN: -DFORMAT="Mach-O arm64" -DARCH=aarch64 -DCPUTYPE="Arm64 (0x100000C)" \
63+
# RUN: -DSUBTYPE="CPU_SUBTYPE_ARM64_ALL (0x0)"
9664

97-
# RUN: yaml2obj %s --docnum=4 -o %t.ppc64
65+
# RUN: yaml2obj %s --docnum=2 -o %t.ppc64 -DCPUTYPE=0x01000012 -DSUBTYPE=0x00000000 -DENDIAN=false
9866
# RUN: llvm-readobj -h %t.ppc64 \
99-
# RUN: | FileCheck %s --strict-whitespace --match-full-lines -DFILE=%t.ppc64 --check-prefix PPC64
100-
101-
# PPC64:File: [[FILE]]
102-
# PPC64-NEXT:Format: Mach-O 64-bit ppc64
103-
# PPC64-NEXT:Arch: powerpc64
104-
# PPC64-NEXT:AddressSize: 64bit
105-
# PPC64-NEXT:MachHeader {
106-
# PPC64-NEXT: Magic: Magic64 (0xFEEDFACF)
107-
# PPC64-NEXT: CpuType: PowerPC64 (0x1000012)
108-
# PPC64-NEXT: CpuSubtype: 0x0
109-
# PPC64-NEXT: FileType: Relocatable (0x1)
110-
# PPC64-NEXT: NumOfLoadCommands: 0
111-
# PPC64-NEXT: SizeOfLoadCommands: 0
112-
# PPC64-NEXT: Flags [ (0x2000)
113-
# PPC64-NEXT: MH_SUBSECTIONS_VIA_SYMBOLS (0x2000)
114-
# PPC64-NEXT: ]
115-
# PPC64-NEXT: Reserved: 0x0
116-
# PPC64-NEXT:}
117-
# PPC64-NOT:{{.}}
67+
# RUN: | FileCheck %s --strict-whitespace --match-full-lines -DFILE=%t.ppc64 --check-prefix=MACHO64 \
68+
# RUN: -DFORMAT="Mach-O 64-bit ppc64" -DARCH=powerpc64 -DCPUTYPE="PowerPC64 (0x1000012)" \
69+
# RUN: -DSUBTYPE=0x0
11870

11971
--- !mach-o
120-
IsLittleEndian: false
72+
IsLittleEndian: [[ENDIAN]]
12173
FileHeader:
12274
magic: 0xFEEDFACF
123-
cputype: 0x01000012
124-
cpusubtype: 0x00000000
75+
cputype: [[CPUTYPE]]
76+
cpusubtype: [[SUBTYPE]]
12577
filetype: 0x00000001
12678
ncmds: 0
12779
sizeofcmds: 0
12880
flags: 0x00002000
12981
reserved: 0x00000000
13082

131-
# RUN: yaml2obj %s --docnum=5 -o %t.arm
132-
# RUN: llvm-readobj -h %t.arm \
133-
# RUN: | FileCheck %s --strict-whitespace --match-full-lines -DFILE=%t.arm --check-prefix ARM
134-
135-
# ARM:File: [[FILE]]
136-
# ARM-NEXT:Format: Mach-O arm
137-
# ARM-NEXT:Arch: arm
138-
# ARM-NEXT:AddressSize: 32bit
139-
# ARM-NEXT:MachHeader {
140-
# ARM-NEXT: Magic: Magic (0xFEEDFACE)
141-
# ARM-NEXT: CpuType: Arm (0xC)
142-
# ARM-NEXT: CpuSubType: CPU_SUBTYPE_ARM_V7 (0x9)
143-
# ARM-NEXT: FileType: Relocatable (0x1)
144-
# ARM-NEXT: NumOfLoadCommands: 0
145-
# ARM-NEXT: SizeOfLoadCommands: 0
146-
# ARM-NEXT: Flags [ (0x2000)
147-
# ARM-NEXT: MH_SUBSECTIONS_VIA_SYMBOLS (0x2000)
148-
# ARM-NEXT: ]
149-
# ARM-NEXT:}
150-
# ARM-NOT:{{.}}
151-
152-
--- !mach-o
153-
FileHeader:
154-
magic: 0xFEEDFACE
155-
cputype: 0x0000000C
156-
cpusubtype: 0x00000009
157-
filetype: 0x00000001
158-
ncmds: 0
159-
sizeofcmds: 0
160-
flags: 0x00002000
83+
# MACHO64:File: [[FILE]]
84+
# MACHO64-NEXT:Format: [[FORMAT]]
85+
# MACHO64-NEXT:Arch: [[ARCH]]
86+
# MACHO64-NEXT:AddressSize: 64bit
87+
# MACHO64-NEXT:MachHeader {
88+
# MACHO64-NEXT: Magic: Magic64 (0xFEEDFACF)
89+
# MACHO64-NEXT: CpuType: [[CPUTYPE]]
90+
# MACHO64-NEXT: CpuSubType: [[SUBTYPE]]
91+
# MACHO64-NEXT: FileType: Relocatable (0x1)
92+
# MACHO64-NEXT: NumOfLoadCommands: 0
93+
# MACHO64-NEXT: SizeOfLoadCommands: 0
94+
# MACHO64-NEXT: Flags [ (0x2000)
95+
# MACHO64-NEXT: MH_SUBSECTIONS_VIA_SYMBOLS (0x2000)
96+
# MACHO64-NEXT: ]
97+
# MACHO64-NEXT: Reserved: 0x0
98+
# MACHO64-NEXT:}
99+
# MACHO64-NOT:{{.}}

llvm/tools/llvm-readobj/MachODumper.cpp

Lines changed: 21 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -110,17 +110,20 @@ const EnumEntry<uint32_t> MachOHeaderFileTypes[] = {
110110
{ "KextBundle", MachO::MH_KEXT_BUNDLE },
111111
};
112112

113+
// clang-format off
113114
const EnumEntry<uint32_t> MachOHeaderCpuTypes[] = {
114-
{ "Any" , static_cast<uint32_t>(MachO::CPU_TYPE_ANY) },
115-
{ "X86" , MachO::CPU_TYPE_X86 },
116-
{ "X86-64" , MachO::CPU_TYPE_X86_64 },
117-
{ "Mc98000" , MachO::CPU_TYPE_MC98000 },
118-
{ "Arm" , MachO::CPU_TYPE_ARM },
119-
{ "Arm64" , MachO::CPU_TYPE_ARM64 },
120-
{ "Sparc" , MachO::CPU_TYPE_SPARC },
121-
{ "PowerPC" , MachO::CPU_TYPE_POWERPC },
122-
{ "PowerPC64" , MachO::CPU_TYPE_POWERPC64 },
115+
{ "Any" , static_cast<uint32_t>(MachO::CPU_TYPE_ANY) },
116+
{ "X86" , MachO::CPU_TYPE_X86 },
117+
{ "X86-64" , MachO::CPU_TYPE_X86_64 },
118+
{ "Mc98000" , MachO::CPU_TYPE_MC98000 },
119+
{ "Arm" , MachO::CPU_TYPE_ARM },
120+
{ "Arm64" , MachO::CPU_TYPE_ARM64 },
121+
{ "Arm64 (ILP32)", MachO::CPU_TYPE_ARM64_32 },
122+
{ "Sparc" , MachO::CPU_TYPE_SPARC },
123+
{ "PowerPC" , MachO::CPU_TYPE_POWERPC },
124+
{ "PowerPC64" , MachO::CPU_TYPE_POWERPC64 },
123125
};
126+
// clang-format on
124127

125128
const EnumEntry<uint32_t> MachOHeaderCpuSubtypesX86[] = {
126129
LLVM_READOBJ_ENUM_ENT(MachO, CPU_SUBTYPE_I386_ALL),
@@ -166,6 +169,10 @@ const EnumEntry<uint32_t> MachOHeaderCpuSubtypesARM[] = {
166169
LLVM_READOBJ_ENUM_ENT(MachO, CPU_SUBTYPE_ARM_V7EM),
167170
};
168171

172+
const EnumEntry<uint32_t> MachOHeaderCpuSubtypesARM64_32[] = {
173+
LLVM_READOBJ_ENUM_ENT(MachO, CPU_SUBTYPE_ARM64_32_V8),
174+
};
175+
169176
const EnumEntry<uint32_t> MachOHeaderCpuSubtypesARM64[] = {
170177
LLVM_READOBJ_ENUM_ENT(MachO, CPU_SUBTYPE_ARM64_ALL),
171178
LLVM_READOBJ_ENUM_ENT(MachO, CPU_SUBTYPE_ARM64_V8),
@@ -453,9 +460,13 @@ void MachODumper::printFileHeaders(const MachHeader &Header) {
453460
case MachO::CPU_TYPE_ARM64:
454461
W.printEnum("CpuSubType", subtype, ArrayRef(MachOHeaderCpuSubtypesARM64));
455462
break;
463+
case MachO::CPU_TYPE_ARM64_32:
464+
W.printEnum("CpuSubType", subtype,
465+
ArrayRef(MachOHeaderCpuSubtypesARM64_32));
466+
break;
456467
case MachO::CPU_TYPE_POWERPC64:
457468
default:
458-
W.printHex("CpuSubtype", subtype);
469+
W.printHex("CpuSubType", subtype);
459470
}
460471
W.printEnum("FileType", Header.filetype, ArrayRef(MachOHeaderFileTypes));
461472
W.printNumber("NumOfLoadCommands", Header.ncmds);

0 commit comments

Comments
 (0)