Skip to content

Commit f77c948

Browse files
committed
[Triple][MachO] Define "arm64e", an AArch64 subarch for Pointer Auth.
This also teaches MachO writers/readers about the MachO cpu subtype, beyond the minimal subtype reader support present at the moment. This also defines a preprocessor macro to allow users to distinguish __arm64__ from __arm64e__. arm64e defaults to an "apple-a12" CPU, which supports v8.3a, allowing pointer-authentication codegen. It also currently defaults to ios14 and macos11. Differential Revision: https://reviews.llvm.org/D87095
1 parent 45ec3a3 commit f77c948

File tree

25 files changed

+192
-15
lines changed

25 files changed

+192
-15
lines changed

clang/lib/Basic/Targets/AArch64.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -874,6 +874,9 @@ void DarwinAArch64TargetInfo::getOSDefines(const LangOptions &Opts,
874874
Builder.defineMacro("__arm64", "1");
875875
Builder.defineMacro("__arm64__", "1");
876876

877+
if (Triple.isArm64e())
878+
Builder.defineMacro("__arm64e__", "1");
879+
877880
getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
878881
}
879882

clang/lib/Driver/ToolChain.cpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -232,8 +232,11 @@ StringRef ToolChain::getDefaultUniversalArchName() const {
232232
// the same as the ones that appear in the triple. Roughly speaking, this is
233233
// an inverse of the darwin::getArchTypeForDarwinArchName() function.
234234
switch (Triple.getArch()) {
235-
case llvm::Triple::aarch64:
235+
case llvm::Triple::aarch64: {
236+
if (getTriple().isArm64e())
237+
return "arm64e";
236238
return "arm64";
239+
}
237240
case llvm::Triple::aarch64_32:
238241
return "arm64_32";
239242
case llvm::Triple::ppc:
@@ -706,6 +709,9 @@ std::string ToolChain::ComputeLLVMTriple(const ArgList &Args,
706709
if (!Triple.isOSBinFormatMachO())
707710
return getTripleString();
708711

712+
if (Triple.isArm64e())
713+
return getTripleString();
714+
709715
// FIXME: older versions of ld64 expect the "arm64" component in the actual
710716
// triple string and query it to determine whether an LTO file can be
711717
// handled. Remove this when we don't care any more.

clang/lib/Driver/ToolChains/Arch/AArch64.cpp

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,12 @@ std::string aarch64::getAArch64TargetCPU(const ArgList &Args,
4040
// Handle CPU name is 'native'.
4141
if (CPU == "native")
4242
return std::string(llvm::sys::getHostCPUName());
43-
else if (CPU.size())
43+
44+
// arm64e requires v8.3a and only runs on apple-a12 and later CPUs.
45+
if (Triple.isArm64e())
46+
return "apple-a12";
47+
48+
if (CPU.size())
4449
return CPU;
4550

4651
if (Triple.isTargetMachineMac() &&

clang/lib/Driver/ToolChains/Darwin.cpp

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
//===----------------------------------------------------------------------===//
88

99
#include "Darwin.h"
10+
#include "Arch/AArch64.h"
1011
#include "Arch/ARM.h"
1112
#include "CommonArgs.h"
1213
#include "clang/Basic/AlignedAllocation.h"
@@ -58,7 +59,7 @@ llvm::Triple::ArchType darwin::getArchTypeForMachOArchName(StringRef Str) {
5859
.Cases("arm", "armv4t", "armv5", "armv6", "armv6m", llvm::Triple::arm)
5960
.Cases("armv7", "armv7em", "armv7k", "armv7m", llvm::Triple::arm)
6061
.Cases("armv7s", "xscale", llvm::Triple::arm)
61-
.Case("arm64", llvm::Triple::aarch64)
62+
.Cases("arm64", "arm64e", llvm::Triple::aarch64)
6263
.Case("arm64_32", llvm::Triple::aarch64_32)
6364
.Case("r600", llvm::Triple::r600)
6465
.Case("amdgcn", llvm::Triple::amdgcn)
@@ -74,7 +75,7 @@ void darwin::setTripleTypeForMachOArchName(llvm::Triple &T, StringRef Str) {
7475
llvm::ARM::ArchKind ArchKind = llvm::ARM::parseArch(Str);
7576
T.setArch(Arch);
7677

77-
if (Str == "x86_64h")
78+
if (Str == "x86_64h" || Str == "arm64e")
7879
T.setArchName(Str);
7980
else if (ArchKind == llvm::ARM::ArchKind::ARMV6M ||
8081
ArchKind == llvm::ARM::ArchKind::ARMV7M ||
@@ -899,8 +900,11 @@ StringRef MachO::getMachOArchName(const ArgList &Args) const {
899900
case llvm::Triple::aarch64_32:
900901
return "arm64_32";
901902

902-
case llvm::Triple::aarch64:
903+
case llvm::Triple::aarch64: {
904+
if (getTriple().isArm64e())
905+
return "arm64e";
903906
return "arm64";
907+
}
904908

905909
case llvm::Triple::thumb:
906910
case llvm::Triple::arm:
@@ -1011,6 +1015,9 @@ void DarwinClang::AddLinkARCArgs(const ArgList &Args,
10111015
return;
10121016
if (isTargetAppleSiliconMac())
10131017
return;
1018+
// ARC runtime is supported everywhere on arm64e.
1019+
if (getTriple().isArm64e())
1020+
return;
10141021

10151022
ObjCRuntime runtime = getDefaultObjCRuntime(/*nonfragile*/ true);
10161023

@@ -1711,7 +1718,7 @@ inferDeploymentTargetFromArch(DerivedArgList &Args, const Darwin &Toolchain,
17111718
llvm::Triple::OSType OSTy = llvm::Triple::UnknownOS;
17121719

17131720
StringRef MachOArchName = Toolchain.getMachOArchName(Args);
1714-
if (MachOArchName == "arm64") {
1721+
if (MachOArchName == "arm64" || MachOArchName == "arm64e") {
17151722
#if __arm64__
17161723
// A clang running on an Apple Silicon mac defaults
17171724
// to building for mac when building for arm64 rather than

clang/test/Driver/aarch64-cpus.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,9 @@
2626
// ARM64-DARWIN: "-cc1"{{.*}} "-triple" "arm64{{.*}}" "-target-cpu" "apple-a7"
2727
// ARM64-DARWIN-SAME: "-target-feature" "+aes"
2828

29+
// RUN: %clang -target arm64-apple-darwin -arch arm64e -### -c %s 2>&1 | FileCheck -check-prefix=ARM64E-DARWIN %s
30+
// ARM64E-DARWIN: "-cc1"{{.*}} "-triple" "arm64e{{.*}}" "-target-cpu" "apple-a12"
31+
2932
// RUN: %clang -target arm64-apple-darwin -arch arm64_32 -### -c %s 2>&1 | FileCheck -check-prefix=ARM64_32-DARWIN %s
3033
// ARM64_32-DARWIN: "-cc1"{{.*}} "-triple" "aarch64_32{{.*}}" "-target-cpu" "apple-s4"
3134

clang/test/Driver/arclite-link.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,5 +16,8 @@
1616

1717
// CHECK-UNUSED-NOT: warning: argument unused during compilation: '-fobjc-link-runtime'
1818

19+
// RUN: %clang -### -target arm64e-apple-ios8 -fobjc-link-runtime %t.o 2>&1 | FileCheck -check-prefix=CHECK-ARCLITE-ARM64E %s
20+
// CHECK-ARCLITE-ARM64E-NOT: libarclite
21+
1922
// RUN: %clang -### -target arm64-apple-macos10.8 -fobjc-link-runtime %t.o 2>&1 | FileCheck -check-prefix=CHECK-ARCLITE-ARM-MAC %s
2023
// CHECK-ARCLITE-ARM-MAC-NOT: libarclite

clang/test/Driver/target-triple-deployment.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99
// RUN: %clang -target armv7-apple-ios5.0 -mlinker-version=400 -### %t.o 2>> %t.log
1010
// RUN: %clang -target armv7-apple-ios7.0 -mlinker-version=400 -### %t.o 2>> %t.log
1111
// RUN: %clang -target arm64-apple-ios -mlinker-version=400 -### %t.o 2>> %t.log
12+
// RUN: %clang -target arm64e-apple-ios13.0 -mlinker-version=400 -### %t.o 2>> %t.log
13+
// RUN: %clang -target arm64e-apple-ios14.1 -mlinker-version=400 -### %t.o 2>> %t.log
1214
//
1315
// RUN: FileCheck %s < %t.log
1416

@@ -39,3 +41,9 @@
3941
// CHECK: {{ld(.exe)?"}}
4042
// CHECK: -iphoneos_version_min
4143
// CHECK: 7.0.0
44+
// CHECK: {{ld(.exe)?"}}
45+
// CHECK: -iphoneos_version_min
46+
// CHECK: 14.0.0
47+
// CHECK: {{ld(.exe)?"}}
48+
// CHECK: -iphoneos_version_min
49+
// CHECK: 14.1.0

clang/test/Preprocessor/arm64e.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
// RUN: %clang_cc1 -E -dM -ffreestanding -triple=arm64e-apple-ios < /dev/null | FileCheck %s
2+
3+
// CHECK: #define __ARM64_ARCH_8__ 1
4+
// CHECK: #define __arm64__ 1
5+
// CHECK: #define __arm64e__ 1

llvm/include/llvm/ADT/Triple.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,8 @@ class Triple {
129129
ARMSubArch_v5te,
130130
ARMSubArch_v4t,
131131

132+
AArch64SubArch_arm64e,
133+
132134
KalimbaSubArch_v3,
133135
KalimbaSubArch_v4,
134136
KalimbaSubArch_v5,
@@ -777,6 +779,12 @@ class Triple {
777779
return getArch() == Triple::csky;
778780
}
779781

782+
/// Tests whether the target is the Apple "arm64e" AArch64 subarch.
783+
bool isArm64e() const {
784+
return getArch() == Triple::aarch64 &&
785+
getSubArch() == Triple::AArch64SubArch_arm64e;
786+
}
787+
780788
/// Tests whether the target supports comdat
781789
bool supportsCOMDAT() const {
782790
return !(isOSBinFormatMachO() || isOSBinFormatXCOFF());

llvm/lib/BinaryFormat/MachO.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ static MachO::CPUSubTypeARM64 getARM64SubType(const Triple &T) {
5858
assert(T.isAArch64());
5959
if (T.isArch32Bit())
6060
return (MachO::CPUSubTypeARM64)MachO::CPU_SUBTYPE_ARM64_32_V8;
61-
if (T.getArchName() == "arm64e")
61+
if (T.isArm64e())
6262
return MachO::CPU_SUBTYPE_ARM64E;
6363

6464
return MachO::CPU_SUBTYPE_ARM64_ALL;

llvm/lib/LTO/LTOCodeGenerator.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -377,6 +377,8 @@ bool LTOCodeGenerator::determineTarget() {
377377
MCpu = "core2";
378378
else if (Triple.getArch() == llvm::Triple::x86)
379379
MCpu = "yonah";
380+
else if (Triple.isArm64e())
381+
MCpu = "apple-a12";
380382
else if (Triple.getArch() == llvm::Triple::aarch64 ||
381383
Triple.getArch() == llvm::Triple::aarch64_32)
382384
MCpu = "cyclone";

llvm/lib/LTO/LTOModule.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -222,6 +222,8 @@ LTOModule::makeLTOModule(MemoryBufferRef Buffer, const TargetOptions &options,
222222
CPU = "core2";
223223
else if (Triple.getArch() == llvm::Triple::x86)
224224
CPU = "yonah";
225+
else if (Triple.isArm64e())
226+
CPU = "apple-a12";
225227
else if (Triple.getArch() == llvm::Triple::aarch64 ||
226228
Triple.getArch() == llvm::Triple::aarch64_32)
227229
CPU = "cyclone";

llvm/lib/Object/MachOObjectFile.cpp

Lines changed: 26 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2694,6 +2694,12 @@ Triple MachOObjectFile::getArchTriple(uint32_t CPUType, uint32_t CPUSubType,
26942694
if (ArchFlag)
26952695
*ArchFlag = "arm64";
26962696
return Triple("arm64-apple-darwin");
2697+
case MachO::CPU_SUBTYPE_ARM64E:
2698+
if (McpuDefault)
2699+
*McpuDefault = "apple-a12";
2700+
if (ArchFlag)
2701+
*ArchFlag = "arm64e";
2702+
return Triple("arm64e-apple-darwin");
26972703
default:
26982704
return Triple();
26992705
}
@@ -2741,13 +2747,28 @@ bool MachOObjectFile::isValidArch(StringRef ArchFlag) {
27412747
}
27422748

27432749
ArrayRef<StringRef> MachOObjectFile::getValidArchs() {
2744-
static const std::array<StringRef, 17> validArchs = {{
2745-
"i386", "x86_64", "x86_64h", "armv4t", "arm", "armv5e",
2746-
"armv6", "armv6m", "armv7", "armv7em", "armv7k", "armv7m",
2747-
"armv7s", "arm64", "arm64_32", "ppc", "ppc64",
2750+
static const std::array<StringRef, 18> ValidArchs = {{
2751+
"i386",
2752+
"x86_64",
2753+
"x86_64h",
2754+
"armv4t",
2755+
"arm",
2756+
"armv5e",
2757+
"armv6",
2758+
"armv6m",
2759+
"armv7",
2760+
"armv7em",
2761+
"armv7k",
2762+
"armv7m",
2763+
"armv7s",
2764+
"arm64",
2765+
"arm64e",
2766+
"arm64_32",
2767+
"ppc",
2768+
"ppc64",
27482769
}};
27492770

2750-
return validArchs;
2771+
return ValidArchs;
27512772
}
27522773

27532774
Triple::ArchType MachOObjectFile::getArch() const {

llvm/lib/Support/ARMTargetParser.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -280,6 +280,8 @@ StringRef ARM::getCanonicalArchName(StringRef Arch) {
280280
// Begins with "arm" / "thumb", move past it.
281281
if (A.startswith("arm64_32"))
282282
offset = 8;
283+
else if (A.startswith("arm64e"))
284+
offset = 6;
283285
else if (A.startswith("arm64"))
284286
offset = 5;
285287
else if (A.startswith("aarch64_32"))

llvm/lib/Support/Triple.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -407,6 +407,7 @@ static Triple::ArchType parseArch(StringRef ArchName) {
407407
.Case("arc", Triple::arc)
408408
.Case("arm64", Triple::aarch64)
409409
.Case("arm64_32", Triple::aarch64_32)
410+
.Case("arm64e", Triple::aarch64)
410411
.Case("arm", Triple::arm)
411412
.Case("armeb", Triple::armeb)
412413
.Case("thumb", Triple::thumb)
@@ -572,6 +573,9 @@ static Triple::SubArchType parseSubArch(StringRef SubArchName) {
572573
if (SubArchName == "powerpcspe")
573574
return Triple::PPCSubArch_spe;
574575

576+
if (SubArchName == "arm64e")
577+
return Triple::AArch64SubArch_arm64e;
578+
575579
StringRef ARMSubArch = ARM::getCanonicalArchName(SubArchName);
576580

577581
// For now, this is the small part. Early return.
@@ -1648,6 +1652,9 @@ VersionTuple Triple::getMinimumSupportedOSVersion() const {
16481652
// ARM64 simulators are supported for iOS 14+.
16491653
if (isMacCatalystEnvironment() || isSimulatorEnvironment())
16501654
return VersionTuple(14, 0, 0);
1655+
// ARM64e slice is supported starting from iOS 14.
1656+
if (isArm64e())
1657+
return VersionTuple(14, 0, 0);
16511658
break;
16521659
case Triple::TvOS:
16531660
// ARM64 simulators are supported for tvOS 14+.

llvm/lib/Target/AArch64/AArch64TargetMachine.cpp

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -229,6 +229,12 @@ static std::string computeDataLayout(const Triple &TT,
229229
return "E-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128";
230230
}
231231

232+
static StringRef computeDefaultCPU(const Triple &TT, StringRef CPU) {
233+
if (CPU.empty() && TT.isArm64e())
234+
return "apple-a12";
235+
return CPU;
236+
}
237+
232238
static Reloc::Model getEffectiveRelocModel(const Triple &TT,
233239
Optional<Reloc::Model> RM) {
234240
// AArch64 Darwin and Windows are always PIC.
@@ -276,7 +282,8 @@ AArch64TargetMachine::AArch64TargetMachine(const Target &T, const Triple &TT,
276282
bool LittleEndian)
277283
: LLVMTargetMachine(T,
278284
computeDataLayout(TT, Options.MCOptions, LittleEndian),
279-
TT, CPU, FS, Options, getEffectiveRelocModel(TT, RM),
285+
TT, computeDefaultCPU(TT, CPU), FS, Options,
286+
getEffectiveRelocModel(TT, RM),
280287
getEffectiveAArch64CodeModel(TT, CM, JIT), OL),
281288
TLOF(createTLOF(getTargetTriple())), isLittle(LittleEndian) {
282289
initAsmInfo();

llvm/lib/Target/AArch64/MCTargetDesc/AArch64MCTargetDesc.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,9 +50,13 @@ static MCInstrInfo *createAArch64MCInstrInfo() {
5050

5151
static MCSubtargetInfo *
5252
createAArch64MCSubtargetInfo(const Triple &TT, StringRef CPU, StringRef FS) {
53-
if (CPU.empty())
53+
if (CPU.empty()) {
5454
CPU = "generic";
5555

56+
if (TT.isArm64e())
57+
CPU = "apple-a12";
58+
}
59+
5660
return createAArch64MCSubtargetInfoImpl(TT, CPU, /*TuneCPU*/ CPU, FS);
5761
}
5862

llvm/test/MC/AArch64/arm64e-subtype.s

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
; RUN: llvm-mc -triple=arm64e-apple-ios -filetype=obj %s -o - | llvm-objdump --macho -d -p - | FileCheck %s
2+
3+
; CHECK: _foo:
4+
; CHECK: 0: c0 03 5f d6 ret
5+
6+
; CHECK: Mach header
7+
; CHECK: magic cputype cpusubtype caps filetype ncmds sizeofcmds flags
8+
; CHECK: MH_MAGIC_64 ARM64 E 0x00 OBJECT 3 256 0x00000000
9+
10+
.globl _foo
11+
_foo:
12+
ret

llvm/test/MC/AArch64/arm64e.s

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
// RUN: not llvm-mc -triple arm64-- -show-encoding < %s 2> %t
2+
// RUN: FileCheck --check-prefix=CHECK-GENERIC < %t %s
3+
4+
// RUN: llvm-mc -triple arm64e-- -show-encoding < %s |\
5+
// RUN: FileCheck %s --check-prefix=CHECK-ARM64E
6+
7+
// CHECK-GENERIC: error: instruction requires: pa
8+
// CHECK-ARM64E: pacia x0, x1 // encoding: [0x20,0x00,0xc1,0xda]
9+
pacia x0, x1

llvm/test/MC/MachO/AArch64/arm-darwin-version-min-load-command.s

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,39 @@
11
// RUN: llvm-mc -triple arm64-apple-macos10.10.2 %s -filetype=obj -o - | llvm-objdump --macho --private-headers - | FileCheck %s --check-prefix=CHECK-BUILD-MACOS-ARM64
2+
// RUN: llvm-mc -triple arm64e-apple-macos10.10 %s -filetype=obj -o - | llvm-objdump --macho --private-headers - | FileCheck %s --check-prefix=CHECK-BUILD-MACOS-ARM64
23
// RUN: llvm-mc -triple arm64-apple-macos11 %s -filetype=obj -o - | llvm-objdump --macho --private-headers - | FileCheck %s --check-prefix=CHECK-BUILD-MACOS-ARM64
34
// RUN: llvm-mc -triple arm64-apple-macos11.1 %s -filetype=obj -o - | llvm-objdump --macho --private-headers - | FileCheck %s --check-prefix=CHECK-BUILD-MACOS-ARM64_1
45
// RUN: llvm-mc -triple arm64-apple-ios13.0-macabi %s -filetype=obj -o - | llvm-objdump --macho --private-headers - | FileCheck %s --check-prefix=CHECK-MACCATALYST-ARM64
6+
// RUN: llvm-mc -triple arm64e-apple-ios13.0-macabi %s -filetype=obj -o - | llvm-objdump --macho --private-headers - | FileCheck %s --check-prefix=CHECK-MACCATALYST-ARM64
57
// RUN: llvm-mc -triple arm64-apple-ios14.1-macabi %s -filetype=obj -o - | llvm-objdump --macho --private-headers - | FileCheck %s --check-prefix=CHECK-MACCATALYST-ARM64_1
68

9+
// RUN: llvm-mc -triple arm64e-apple-ios10.3 %s -filetype=obj -o - | llvm-objdump --macho --private-headers - | FileCheck %s --check-prefix=CHECK-BUILD-IOS-ARM64E
10+
// RUN: llvm-mc -triple arm64e-apple-ios13 %s -filetype=obj -o - | llvm-objdump --macho --private-headers - | FileCheck %s --check-prefix=CHECK-BUILD-IOS-ARM64E
11+
// RUN: llvm-mc -triple arm64e-apple-ios14.1 %s -filetype=obj -o - | llvm-objdump --macho --private-headers - | FileCheck %s --check-prefix=CHECK-BUILD-IOS-ARM64E3
12+
713
// RUN: llvm-mc -triple arm64-apple-ios10-simulator %s -filetype=obj -o - | llvm-objdump --macho --private-headers - | FileCheck %s --check-prefix=CHECK-BUILD-IOSSIM2
14+
// RUN: llvm-mc -triple arm64e-apple-ios10-simulator %s -filetype=obj -o - | llvm-objdump --macho --private-headers - | FileCheck %s --check-prefix=CHECK-BUILD-IOSSIM2
815
// RUN: llvm-mc -triple arm64-apple-ios13-simulator %s -filetype=obj -o - | llvm-objdump --macho --private-headers - | FileCheck %s --check-prefix=CHECK-BUILD-IOSSIM2
916
// RUN: llvm-mc -triple arm64-apple-ios14-simulator %s -filetype=obj -o - | llvm-objdump --macho --private-headers - | FileCheck %s --check-prefix=CHECK-BUILD-IOSSIM2
1017
// RUN: llvm-mc -triple arm64-apple-ios14.1-simulator %s -filetype=obj -o - | llvm-objdump --macho --private-headers - | FileCheck %s --check-prefix=CHECK-BUILD-IOSSIM3
1118
// RUN: llvm-mc -triple arm64-apple-tvos10-simulator %s -filetype=obj -o - | llvm-objdump --macho --private-headers - | FileCheck %s --check-prefix=CHECK-BUILD-TVOSSIM2
1219
// RUN: llvm-mc -triple arm64-apple-watchos3-simulator %s -filetype=obj -o - | llvm-objdump --macho --private-headers - | FileCheck %s --check-prefix=CHECK-BUILD-WATCHOSSIM2
1320

21+
// CHECK-BUILD-IOS-ARM64E: cmd LC_BUILD_VERSION
22+
// CHECK-BUILD-IOS-ARM64E-NEXT: cmdsize 24
23+
// CHECK-BUILD-IOS-ARM64E-NEXT: platform ios
24+
// CHECK-BUILD-IOS-ARM64E-NEXT: sdk n/a
25+
// CHECK-BUILD-IOS-ARM64E-NEXT: minos 14.0
26+
// CHECK-BUILD-IOS-ARM64E-NEXT: ntools 0
27+
// CHECK-BUILD-IOS-ARM64E-NOT: LC_VERSION_MIN
28+
29+
// CHECK-BUILD-IOS-ARM64E3: cmd LC_BUILD_VERSION
30+
// CHECK-BUILD-IOS-ARM64E3-NEXT: cmdsize 24
31+
// CHECK-BUILD-IOS-ARM64E3-NEXT: platform ios
32+
// CHECK-BUILD-IOS-ARM64E3-NEXT: sdk n/a
33+
// CHECK-BUILD-IOS-ARM64E3-NEXT: minos 14.1
34+
// CHECK-BUILD-IOS-ARM64E3-NEXT: ntools 0
35+
// CHECK-BUILD-IOS-ARM64E3-NOT: LC_VERSION_MIN
36+
1437
// CHECK-BUILD-IOSSIM2: cmd LC_BUILD_VERSION
1538
// CHECK-BUILD-IOSSIM2-NEXT: cmdsize 24
1639
// CHECK-BUILD-IOSSIM2-NEXT: platform iossim

0 commit comments

Comments
 (0)