xref: /llvm-project/llvm/unittests/BinaryFormat/MachOTest.cpp (revision 7b0a5683fa09be4e60bc93526aad7b63bbca687c)
100d8c1abSChris Bieneman //===- unittest/BinaryFormat/MachOTest.cpp - MachO support tests ----------===//
200d8c1abSChris Bieneman //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
600d8c1abSChris Bieneman //
700d8c1abSChris Bieneman //===----------------------------------------------------------------------===//
800d8c1abSChris Bieneman 
900d8c1abSChris Bieneman #include "llvm/BinaryFormat/MachO.h"
10*7b0a5683SFrancis Visoiu Mistrih #include "llvm/ADT/Triple.h"
1100d8c1abSChris Bieneman #include "gtest/gtest.h"
1200d8c1abSChris Bieneman 
1300d8c1abSChris Bieneman using namespace llvm;
1400d8c1abSChris Bieneman using namespace llvm::MachO;
1500d8c1abSChris Bieneman 
1600d8c1abSChris Bieneman TEST(MachOTest, UnalignedLC) {
1700d8c1abSChris Bieneman   unsigned char Valid32BitMachO[] = {
1800d8c1abSChris Bieneman       0xCE, 0xFA, 0xED, 0xFE, 0x07, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
1900d8c1abSChris Bieneman       0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00,
2000d8c1abSChris Bieneman       0x85, 0x80, 0x21, 0x01, 0x01, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
2100d8c1abSChris Bieneman       0x5F, 0x5F, 0x50, 0x41, 0x47, 0x45, 0x5A, 0x45, 0x52, 0x4F, 0x00, 0x00,
2200d8c1abSChris Bieneman       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00,
2300d8c1abSChris Bieneman       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2400d8c1abSChris Bieneman       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2500d8c1abSChris Bieneman       0x01, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x5F, 0x5F, 0x4C, 0x49,
2600d8c1abSChris Bieneman       0x4E, 0x4B, 0x45, 0x44, 0x49, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2700d8c1abSChris Bieneman       0x00, 0x40, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00,
2800d8c1abSChris Bieneman       0x8C, 0x0B, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
2900d8c1abSChris Bieneman       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
3000d8c1abSChris Bieneman 
3100d8c1abSChris Bieneman   mach_header *Header =
3200d8c1abSChris Bieneman       reinterpret_cast<mach_header *>(Valid32BitMachO);
3300d8c1abSChris Bieneman   if (!sys::IsLittleEndianHost)
3400d8c1abSChris Bieneman     swapStruct(*Header);
3500d8c1abSChris Bieneman   ASSERT_EQ(Header->magic, MH_MAGIC);
3600d8c1abSChris Bieneman   unsigned char *Current = Valid32BitMachO + sizeof(mach_header);
3700d8c1abSChris Bieneman   unsigned char *BufferEnd =
3800d8c1abSChris Bieneman       Valid32BitMachO + sizeof(mach_header) + Header->sizeofcmds;
3900d8c1abSChris Bieneman   while (Current < BufferEnd) {
4000d8c1abSChris Bieneman     macho_load_command *LC =
4100d8c1abSChris Bieneman         reinterpret_cast<macho_load_command *>(Current);
4200d8c1abSChris Bieneman     if (!sys::IsLittleEndianHost)
4300d8c1abSChris Bieneman       swapStruct(LC->load_command_data);
4400d8c1abSChris Bieneman     ASSERT_EQ(LC->load_command_data.cmd, LC_SEGMENT);
4500d8c1abSChris Bieneman     Current += LC->load_command_data.cmdsize;
4600d8c1abSChris Bieneman   }
4700d8c1abSChris Bieneman }
48*7b0a5683SFrancis Visoiu Mistrih 
49*7b0a5683SFrancis Visoiu Mistrih TEST(MachOTest, CPUType) {
50*7b0a5683SFrancis Visoiu Mistrih #define CHECK_CPUTYPE(StrTriple, ExpectedCPUType)                              \
51*7b0a5683SFrancis Visoiu Mistrih   ASSERT_EQ((MachO::CPUType)cantFail(MachO::getCPUType(Triple(StrTriple))),    \
52*7b0a5683SFrancis Visoiu Mistrih             (ExpectedCPUType))
53*7b0a5683SFrancis Visoiu Mistrih   CHECK_CPUTYPE("x86_64-apple-darwin", MachO::CPU_TYPE_X86_64);
54*7b0a5683SFrancis Visoiu Mistrih   CHECK_CPUTYPE("x86_64h-apple-darwin", MachO::CPU_TYPE_X86_64);
55*7b0a5683SFrancis Visoiu Mistrih   CHECK_CPUTYPE("i386-apple-darwin", MachO::CPU_TYPE_X86);
56*7b0a5683SFrancis Visoiu Mistrih   CHECK_CPUTYPE("armv7-apple-darwin", MachO::CPU_TYPE_ARM);
57*7b0a5683SFrancis Visoiu Mistrih   CHECK_CPUTYPE("thumbv7-apple-darwin", MachO::CPU_TYPE_ARM);
58*7b0a5683SFrancis Visoiu Mistrih   CHECK_CPUTYPE("arm64-apple-darwin", MachO::CPU_TYPE_ARM64);
59*7b0a5683SFrancis Visoiu Mistrih   CHECK_CPUTYPE("arm64e-apple-darwin", MachO::CPU_TYPE_ARM64);
60*7b0a5683SFrancis Visoiu Mistrih   CHECK_CPUTYPE("arm64_32-apple-darwin", MachO::CPU_TYPE_ARM64_32);
61*7b0a5683SFrancis Visoiu Mistrih   CHECK_CPUTYPE("powerpc-apple-darwin", MachO::CPU_TYPE_POWERPC);
62*7b0a5683SFrancis Visoiu Mistrih   CHECK_CPUTYPE("powerpc64-apple-darwin", MachO::CPU_TYPE_POWERPC64);
63*7b0a5683SFrancis Visoiu Mistrih 
64*7b0a5683SFrancis Visoiu Mistrih   {
65*7b0a5683SFrancis Visoiu Mistrih     // Not a mach-o.
66*7b0a5683SFrancis Visoiu Mistrih     Expected<uint32_t> Type = MachO::getCPUType(Triple("x86_64-linux-unknown"));
67*7b0a5683SFrancis Visoiu Mistrih     ASSERT_EQ(toString(Type.takeError()),
68*7b0a5683SFrancis Visoiu Mistrih               "Unsupported triple for mach-o cpu type: x86_64-linux-unknown");
69*7b0a5683SFrancis Visoiu Mistrih   }
70*7b0a5683SFrancis Visoiu Mistrih   {
71*7b0a5683SFrancis Visoiu Mistrih     // Not a valid mach-o architecture.
72*7b0a5683SFrancis Visoiu Mistrih     Expected<uint32_t> Type = MachO::getCPUType(Triple("mips-apple-darwin"));
73*7b0a5683SFrancis Visoiu Mistrih     ASSERT_EQ(toString(Type.takeError()),
74*7b0a5683SFrancis Visoiu Mistrih               "Unsupported triple for mach-o cpu type: mips-apple-darwin");
75*7b0a5683SFrancis Visoiu Mistrih   }
76*7b0a5683SFrancis Visoiu Mistrih #undef CHECK_CPUTYPE
77*7b0a5683SFrancis Visoiu Mistrih }
78*7b0a5683SFrancis Visoiu Mistrih 
79*7b0a5683SFrancis Visoiu Mistrih TEST(MachOTest, CPUSubType) {
80*7b0a5683SFrancis Visoiu Mistrih #define CHECK_CPUSUBTYPE(StrTriple, ExpectedCPUSubType)                        \
81*7b0a5683SFrancis Visoiu Mistrih   ASSERT_EQ(cantFail(MachO::getCPUSubType(Triple(StrTriple))),                 \
82*7b0a5683SFrancis Visoiu Mistrih             ((uint32_t)ExpectedCPUSubType))
83*7b0a5683SFrancis Visoiu Mistrih   CHECK_CPUSUBTYPE("x86_64-apple-darwin", MachO::CPU_SUBTYPE_X86_64_ALL);
84*7b0a5683SFrancis Visoiu Mistrih   CHECK_CPUSUBTYPE("x86_64h-apple-darwin", MachO::CPU_SUBTYPE_X86_64_H);
85*7b0a5683SFrancis Visoiu Mistrih   CHECK_CPUSUBTYPE("i386-apple-darwin", MachO::CPU_SUBTYPE_I386_ALL);
86*7b0a5683SFrancis Visoiu Mistrih   CHECK_CPUSUBTYPE("arm-apple-darwin", MachO::CPU_SUBTYPE_ARM_V7); // Default
87*7b0a5683SFrancis Visoiu Mistrih   CHECK_CPUSUBTYPE("armv4t-apple-darwin", MachO::CPU_SUBTYPE_ARM_V4T);
88*7b0a5683SFrancis Visoiu Mistrih   CHECK_CPUSUBTYPE("armv5t-apple-darwin", MachO::CPU_SUBTYPE_ARM_V5);
89*7b0a5683SFrancis Visoiu Mistrih   CHECK_CPUSUBTYPE("armv5te-apple-darwin", MachO::CPU_SUBTYPE_ARM_V5);
90*7b0a5683SFrancis Visoiu Mistrih   CHECK_CPUSUBTYPE("armv5tej-apple-darwin", MachO::CPU_SUBTYPE_ARM_V5);
91*7b0a5683SFrancis Visoiu Mistrih   CHECK_CPUSUBTYPE("armv6-apple-darwin", MachO::CPU_SUBTYPE_ARM_V6);
92*7b0a5683SFrancis Visoiu Mistrih   CHECK_CPUSUBTYPE("armv6k-apple-darwin", MachO::CPU_SUBTYPE_ARM_V6);
93*7b0a5683SFrancis Visoiu Mistrih   CHECK_CPUSUBTYPE("armv7a-apple-darwin", MachO::CPU_SUBTYPE_ARM_V7);
94*7b0a5683SFrancis Visoiu Mistrih   CHECK_CPUSUBTYPE("armv7s-apple-darwin", MachO::CPU_SUBTYPE_ARM_V7S);
95*7b0a5683SFrancis Visoiu Mistrih   CHECK_CPUSUBTYPE("armv7k-apple-darwin", MachO::CPU_SUBTYPE_ARM_V7K);
96*7b0a5683SFrancis Visoiu Mistrih   CHECK_CPUSUBTYPE("armv6m-apple-darwin", MachO::CPU_SUBTYPE_ARM_V6M);
97*7b0a5683SFrancis Visoiu Mistrih   CHECK_CPUSUBTYPE("armv7m-apple-darwin", MachO::CPU_SUBTYPE_ARM_V7M);
98*7b0a5683SFrancis Visoiu Mistrih   CHECK_CPUSUBTYPE("armv7em-apple-darwin", MachO::CPU_SUBTYPE_ARM_V7EM);
99*7b0a5683SFrancis Visoiu Mistrih   CHECK_CPUSUBTYPE("thumbv7-apple-darwin", MachO::CPU_SUBTYPE_ARM_V7);
100*7b0a5683SFrancis Visoiu Mistrih   CHECK_CPUSUBTYPE("thumbv6-apple-darwin", MachO::CPU_SUBTYPE_ARM_V6);
101*7b0a5683SFrancis Visoiu Mistrih   CHECK_CPUSUBTYPE("arm64-apple-darwin", MachO::CPU_SUBTYPE_ARM64_ALL);
102*7b0a5683SFrancis Visoiu Mistrih   CHECK_CPUSUBTYPE("arm64e-apple-darwin", MachO::CPU_SUBTYPE_ARM64E);
103*7b0a5683SFrancis Visoiu Mistrih   CHECK_CPUSUBTYPE("arm64_32-apple-darwin", MachO::CPU_SUBTYPE_ARM64_32_V8);
104*7b0a5683SFrancis Visoiu Mistrih   CHECK_CPUSUBTYPE("powerpc-apple-darwin", MachO::CPU_SUBTYPE_POWERPC_ALL);
105*7b0a5683SFrancis Visoiu Mistrih   CHECK_CPUSUBTYPE("powerpc64-apple-darwin", MachO::CPU_SUBTYPE_POWERPC_ALL);
106*7b0a5683SFrancis Visoiu Mistrih 
107*7b0a5683SFrancis Visoiu Mistrih   {
108*7b0a5683SFrancis Visoiu Mistrih     // Not a mach-o.
109*7b0a5683SFrancis Visoiu Mistrih     Expected<uint32_t> Type =
110*7b0a5683SFrancis Visoiu Mistrih         MachO::getCPUSubType(Triple("x86_64-linux-unknown"));
111*7b0a5683SFrancis Visoiu Mistrih     ASSERT_EQ(
112*7b0a5683SFrancis Visoiu Mistrih         toString(Type.takeError()),
113*7b0a5683SFrancis Visoiu Mistrih         "Unsupported triple for mach-o cpu subtype: x86_64-linux-unknown");
114*7b0a5683SFrancis Visoiu Mistrih   }
115*7b0a5683SFrancis Visoiu Mistrih   {
116*7b0a5683SFrancis Visoiu Mistrih     // Not a valid mach-o architecture.
117*7b0a5683SFrancis Visoiu Mistrih     Expected<uint32_t> Type = MachO::getCPUSubType(Triple("mips-apple-darwin"));
118*7b0a5683SFrancis Visoiu Mistrih     ASSERT_EQ(toString(Type.takeError()),
119*7b0a5683SFrancis Visoiu Mistrih               "Unsupported triple for mach-o cpu subtype: mips-apple-darwin");
120*7b0a5683SFrancis Visoiu Mistrih   }
121*7b0a5683SFrancis Visoiu Mistrih #undef CHECK_CPUSUBTYPE
122*7b0a5683SFrancis Visoiu Mistrih }
123