Path: blob/main/contrib/llvm-project/llvm/lib/BinaryFormat/MachO.cpp
35232 views
//===-- llvm/BinaryFormat/MachO.cpp - The MachO file format -----*- C++/-*-===//1//2// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.3// See https://llvm.org/LICENSE.txt for license information.4// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception5//6//===----------------------------------------------------------------------===//78#include "llvm/BinaryFormat/MachO.h"9#include "llvm/TargetParser/ARMTargetParser.h"10#include "llvm/TargetParser/Triple.h"1112using namespace llvm;1314static MachO::CPUSubTypeX86 getX86SubType(const Triple &T) {15assert(T.isX86());16if (T.isArch32Bit())17return MachO::CPU_SUBTYPE_I386_ALL;1819assert(T.isArch64Bit());20if (T.getArchName() == "x86_64h")21return MachO::CPU_SUBTYPE_X86_64_H;22return MachO::CPU_SUBTYPE_X86_64_ALL;23}2425static MachO::CPUSubTypeARM getARMSubType(const Triple &T) {26assert(T.isARM() || T.isThumb());27StringRef Arch = T.getArchName();28ARM::ArchKind AK = ARM::parseArch(Arch);29switch (AK) {30default:31return MachO::CPU_SUBTYPE_ARM_V7;32case ARM::ArchKind::ARMV4T:33return MachO::CPU_SUBTYPE_ARM_V4T;34case ARM::ArchKind::ARMV5T:35case ARM::ArchKind::ARMV5TE:36case ARM::ArchKind::ARMV5TEJ:37return MachO::CPU_SUBTYPE_ARM_V5;38case ARM::ArchKind::ARMV6:39case ARM::ArchKind::ARMV6K:40return MachO::CPU_SUBTYPE_ARM_V6;41case ARM::ArchKind::ARMV7A:42return MachO::CPU_SUBTYPE_ARM_V7;43case ARM::ArchKind::ARMV7S:44return MachO::CPU_SUBTYPE_ARM_V7S;45case ARM::ArchKind::ARMV7K:46return MachO::CPU_SUBTYPE_ARM_V7K;47case ARM::ArchKind::ARMV6M:48return MachO::CPU_SUBTYPE_ARM_V6M;49case ARM::ArchKind::ARMV7M:50return MachO::CPU_SUBTYPE_ARM_V7M;51case ARM::ArchKind::ARMV7EM:52return MachO::CPU_SUBTYPE_ARM_V7EM;53}54}5556static MachO::CPUSubTypeARM64 getARM64SubType(const Triple &T) {57assert(T.isAArch64());58if (T.isArch32Bit())59return (MachO::CPUSubTypeARM64)MachO::CPU_SUBTYPE_ARM64_32_V8;60if (T.isArm64e())61return MachO::CPU_SUBTYPE_ARM64E;6263return MachO::CPU_SUBTYPE_ARM64_ALL;64}6566static MachO::CPUSubTypePowerPC getPowerPCSubType(const Triple &T) {67return MachO::CPU_SUBTYPE_POWERPC_ALL;68}6970static Error unsupported(const char *Str, const Triple &T) {71return createStringError(std::errc::invalid_argument,72"Unsupported triple for mach-o cpu %s: %s", Str,73T.str().c_str());74}7576Expected<uint32_t> MachO::getCPUType(const Triple &T) {77if (!T.isOSBinFormatMachO())78return unsupported("type", T);79if (T.isX86() && T.isArch32Bit())80return MachO::CPU_TYPE_X86;81if (T.isX86() && T.isArch64Bit())82return MachO::CPU_TYPE_X86_64;83if (T.isARM() || T.isThumb())84return MachO::CPU_TYPE_ARM;85if (T.isAArch64())86return T.isArch32Bit() ? MachO::CPU_TYPE_ARM64_32 : MachO::CPU_TYPE_ARM64;87if (T.getArch() == Triple::ppc)88return MachO::CPU_TYPE_POWERPC;89if (T.getArch() == Triple::ppc64)90return MachO::CPU_TYPE_POWERPC64;91return unsupported("type", T);92}9394Expected<uint32_t> MachO::getCPUSubType(const Triple &T) {95if (!T.isOSBinFormatMachO())96return unsupported("subtype", T);97if (T.isX86())98return getX86SubType(T);99if (T.isARM() || T.isThumb())100return getARMSubType(T);101if (T.isAArch64() || T.getArch() == Triple::aarch64_32)102return getARM64SubType(T);103if (T.getArch() == Triple::ppc || T.getArch() == Triple::ppc64)104return getPowerPCSubType(T);105return unsupported("subtype", T);106}107108109