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