LLVM 24.0.0git
MachO.cpp
Go to the documentation of this file.
1//===-- llvm/BinaryFormat/MachO.cpp - The MachO file format -----*- C++/-*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
12
13using namespace llvm;
14
16 assert(T.isX86());
17 if (T.isArch32Bit())
19
20 assert(T.isArch64Bit());
21 if (T.getArchName() == "x86_64h")
24}
25
27 assert(T.isARM() || T.isThumb());
28 StringRef Arch = T.getArchName();
30 switch (AK) {
31 default:
33 case ARM::ArchKind::ARMV4T:
35 case ARM::ArchKind::ARMV5T:
36 case ARM::ArchKind::ARMV5TE:
37 case ARM::ArchKind::ARMV5TEJ:
39 case ARM::ArchKind::ARMV6:
40 case ARM::ArchKind::ARMV6K:
42 case ARM::ArchKind::ARMV7A:
44 case ARM::ArchKind::ARMV7S:
46 case ARM::ArchKind::ARMV7K:
48 case ARM::ArchKind::ARMV6M:
50 case ARM::ArchKind::ARMV7M:
52 case ARM::ArchKind::ARMV7EM:
54 case ARM::ArchKind::ARMV8MBaseline:
56 case ARM::ArchKind::ARMV8MMainline:
58 case ARM::ArchKind::ARMV8_1MMainline:
60 }
61}
62
64 assert(T.isAArch64());
65 if (T.isArch32Bit())
67 if (T.isArm64e())
69 if (T.isArm64e_x1())
71
73}
74
78
79static Error unsupported(const char *Str, const Triple &T) {
80 return createStringError(std::errc::invalid_argument,
81 "Unsupported triple for mach-o cpu %s: %s", Str,
82 T.str().c_str());
83}
84
88
90 if (!T.isOSBinFormatMachO())
91 return unsupported("type", T);
92 if (T.isX86() && T.isArch32Bit())
94 if (T.isX86() && T.isArch64Bit())
96 if (T.isARM() || T.isThumb())
98 if (T.isAArch64())
99 return T.isArch32Bit() ? MachO::CPU_TYPE_ARM64_32 : MachO::CPU_TYPE_ARM64;
100 if (T.getArch() == Triple::ppc)
102 if (T.getArch() == Triple::ppc64)
104 if (T.getArch() == Triple::riscv32)
106 return unsupported("type", T);
107}
108
110 if (!T.isOSBinFormatMachO())
111 return unsupported("subtype", T);
112 if (T.isX86())
113 return getX86SubType(T);
114 if (T.isARM() || T.isThumb())
115 return getARMSubType(T);
116 if (T.isAArch64() || T.getArch() == Triple::aarch64_32)
117 return getARM64SubType(T);
118 if (T.getArch() == Triple::ppc || T.getArch() == Triple::ppc64)
119 return getPowerPCSubType(T);
120 if (T.getArch() == Triple::riscv32)
121 return getRISCVSubType(T);
122 return unsupported("subtype", T);
123}
124
126 unsigned PtrAuthABIVersion,
127 bool PtrAuthKernelABIVersion) {
129 if (!Result)
130 return Result.takeError();
131 if (*Result != MachO::CPU_SUBTYPE_ARM64E)
132 return createStringError(
133 std::errc::invalid_argument,
134 "ptrauth ABI version is only supported on arm64e.");
135 if (PtrAuthABIVersion > 0xF)
136 return createStringError(
137 std::errc::invalid_argument,
138 "The ptrauth ABI version needs to fit within 4 bits.");
139 return CPU_SUBTYPE_ARM64E_WITH_PTRAUTH_VERSION(PtrAuthABIVersion,
140 PtrAuthKernelABIVersion);
141}
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
static Error unsupported(const char *Str, const Triple &T)
Definition MachO.cpp:79
static MachO::CPUSubTypeX86 getX86SubType(const Triple &T)
Definition MachO.cpp:15
static MachO::CPUSubTypeARM64 getARM64SubType(const Triple &T)
Definition MachO.cpp:63
static MachO::CPUSubTypePowerPC getPowerPCSubType(const Triple &T)
Definition MachO.cpp:75
static MachO::CPUSubTypeARM getARMSubType(const Triple &T)
Definition MachO.cpp:26
static MachO::CPUSubTypeRISCV getRISCVSubType(const Triple &T)
Definition MachO.cpp:85
#define T
Lightweight error class with error context and mandatory checking.
Definition Error.h:159
Tagged union holding either a T or a Error.
Definition Error.h:485
Represent a constant reference to a string, i.e.
Definition StringRef.h:56
Triple - Helper class for working with autoconf configuration names.
Definition Triple.h:48
LLVM_ABI ArchKind parseArch(StringRef Arch)
LLVM_ABI Expected< uint32_t > getCPUSubType(const Triple &T)
Definition MachO.cpp:109
CPUSubTypePowerPC
Definition MachO.h:1757
@ CPU_SUBTYPE_POWERPC_ALL
Definition MachO.h:1758
@ CPU_SUBTYPE_RISCV_ALL
Definition MachO.h:1777
@ CPU_SUBTYPE_ARM_V7
Definition MachO.h:1702
@ CPU_SUBTYPE_ARM_V8M_BASE
Definition MachO.h:1710
@ CPU_SUBTYPE_ARM_V7M
Definition MachO.h:1707
@ CPU_SUBTYPE_ARM_V6
Definition MachO.h:1698
@ CPU_SUBTYPE_ARM_V8M_MAIN
Definition MachO.h:1709
@ CPU_SUBTYPE_ARM_V7K
Definition MachO.h:1705
@ CPU_SUBTYPE_ARM_V6M
Definition MachO.h:1706
@ CPU_SUBTYPE_ARM_V5
Definition MachO.h:1699
@ CPU_SUBTYPE_ARM_V7EM
Definition MachO.h:1708
@ CPU_SUBTYPE_ARM_V8_1M_MAIN
Definition MachO.h:1711
@ CPU_SUBTYPE_ARM_V7S
Definition MachO.h:1704
@ CPU_SUBTYPE_ARM_V4T
Definition MachO.h:1697
@ CPU_SUBTYPE_ARM64E
Definition MachO.h:1717
@ CPU_SUBTYPE_ARM64_ALL
Definition MachO.h:1715
@ CPU_SUBTYPE_ARM64E_X1
Definition MachO.h:1718
@ CPU_SUBTYPE_ARM64_32_V8
Definition MachO.h:1753
uint32_t CPU_SUBTYPE_ARM64E_WITH_PTRAUTH_VERSION(unsigned PtrAuthABIVersion, bool PtrAuthKernelABIVersion)
Definition MachO.h:1734
LLVM_ABI Expected< uint32_t > getCPUType(const Triple &T)
Definition MachO.cpp:89
@ CPU_SUBTYPE_I386_ALL
Definition MachO.h:1659
@ CPU_SUBTYPE_X86_64_H
Definition MachO.h:1684
@ CPU_SUBTYPE_X86_64_ALL
Definition MachO.h:1682
@ CPU_TYPE_ARM64_32
Definition MachO.h:1640
@ CPU_TYPE_ARM64
Definition MachO.h:1639
@ CPU_TYPE_POWERPC
Definition MachO.h:1642
@ CPU_TYPE_X86_64
Definition MachO.h:1635
@ CPU_TYPE_POWERPC64
Definition MachO.h:1643
@ CPU_TYPE_X86
Definition MachO.h:1633
@ CPU_TYPE_RISCV
Definition MachO.h:1645
@ CPU_TYPE_ARM
Definition MachO.h:1638
This is an optimization pass for GlobalISel generic memory operations.
Error createStringError(std::error_code EC, char const *Fmt, const Ts &... Vals)
Create formatted StringError object.
Definition Error.h:1321