Skip to content

Commit 5fa5a84

Browse files
kovdan01yuxuanchen1997
authored andcommitted
[PAC][Driver] Support pauthtest ABI for AArch64 Linux triples (#97237)
Summary: When `pauthtest` is either passed as environment part of AArch64 Linux triple or passed via `-mabi=`, enable the following ptrauth flags: - `intrinsics`; - `calls`; - `returns`; - `auth-traps`; - `vtable-pointer-address-discrimination`; - `vtable-pointer-type-discrimination`; - `init-fini`. Some related stuff is still subject to change, and the ABI itself might be changed, so end users are not expected to use this and the ABI name has 'test' suffix. If `-mabi=pauthtest` option is used, it's normalized to effective triple. When the environment part of the effective triple is `pauthtest`, try to use `aarch64-linux-pauthtest` as multilib directory. The following is not supported: - combination of `pauthtest` ABI with any branch protection scheme except BTI; - explicit set of environment part of the triple to a value different from `pauthtest` in combination with `-mabi=pauthtest`; - usage on non-Linux OS. --------- Co-authored-by: Anatoly Trosinenko <[email protected]> Test Plan: Reviewers: Subscribers: Tasks: Tags: Differential Revision: https://phabricator.intern.facebook.com/D60251253
1 parent 5259917 commit 5fa5a84

File tree

15 files changed

+191
-17
lines changed

15 files changed

+191
-17
lines changed

clang/lib/Basic/Targets/AArch64.cpp

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -204,7 +204,8 @@ AArch64TargetInfo::AArch64TargetInfo(const llvm::Triple &Triple,
204204
StringRef AArch64TargetInfo::getABI() const { return ABI; }
205205

206206
bool AArch64TargetInfo::setABI(const std::string &Name) {
207-
if (Name != "aapcs" && Name != "aapcs-soft" && Name != "darwinpcs")
207+
if (Name != "aapcs" && Name != "aapcs-soft" && Name != "darwinpcs" &&
208+
Name != "pauthtest")
208209
return false;
209210

210211
ABI = Name;
@@ -218,6 +219,12 @@ bool AArch64TargetInfo::validateTarget(DiagnosticsEngine &Diags) const {
218219
Diags.Report(diag::err_target_unsupported_abi_with_fpu) << ABI;
219220
return false;
220221
}
222+
if (getTriple().getEnvironment() == llvm::Triple::PAuthTest &&
223+
getTriple().getOS() != llvm::Triple::Linux) {
224+
Diags.Report(diag::err_target_unsupported_abi_for_triple)
225+
<< getTriple().getEnvironmentName() << getTriple().getTriple();
226+
return false;
227+
}
221228
return true;
222229
}
223230

clang/lib/CodeGen/CodeGenModule.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,8 @@ createTargetCodeGenInfo(CodeGenModule &CGM) {
149149
return createWindowsAArch64TargetCodeGenInfo(CGM, AArch64ABIKind::Win64);
150150
else if (Target.getABI() == "aapcs-soft")
151151
Kind = AArch64ABIKind::AAPCSSoft;
152+
else if (Target.getABI() == "pauthtest")
153+
Kind = AArch64ABIKind::PAuthTest;
152154

153155
return createAArch64TargetCodeGenInfo(CGM, Kind);
154156
}

clang/lib/CodeGen/TargetInfo.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -437,6 +437,7 @@ enum class AArch64ABIKind {
437437
DarwinPCS,
438438
Win64,
439439
AAPCSSoft,
440+
PAuthTest,
440441
};
441442

442443
std::unique_ptr<TargetCodeGenInfo>

clang/lib/Driver/ToolChain.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1031,11 +1031,12 @@ std::string ToolChain::ComputeLLVMTriple(const ArgList &Args,
10311031
}
10321032
case llvm::Triple::aarch64: {
10331033
llvm::Triple Triple = getTriple();
1034+
tools::aarch64::setPAuthABIInTriple(getDriver(), Args, Triple);
10341035
if (!Triple.isOSBinFormatMachO())
1035-
return getTripleString();
1036+
return Triple.getTriple();
10361037

10371038
if (Triple.isArm64e())
1038-
return getTripleString();
1039+
return Triple.getTriple();
10391040

10401041
// FIXME: older versions of ld64 expect the "arm64" component in the actual
10411042
// triple string and query it to determine whether an LTO file can be

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

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -449,3 +449,24 @@ void aarch64::getAArch64TargetFeatures(const Driver &D,
449449
if (Args.getLastArg(options::OPT_mno_bti_at_return_twice))
450450
Features.push_back("+no-bti-at-return-twice");
451451
}
452+
453+
void aarch64::setPAuthABIInTriple(const Driver &D, const ArgList &Args,
454+
llvm::Triple &Triple) {
455+
Arg *ABIArg = Args.getLastArg(options::OPT_mabi_EQ);
456+
bool HasPAuthABI =
457+
ABIArg ? (StringRef(ABIArg->getValue()) == "pauthtest") : false;
458+
459+
switch (Triple.getEnvironment()) {
460+
case llvm::Triple::UnknownEnvironment:
461+
if (HasPAuthABI)
462+
Triple.setEnvironment(llvm::Triple::PAuthTest);
463+
break;
464+
case llvm::Triple::PAuthTest:
465+
break;
466+
default:
467+
if (HasPAuthABI)
468+
D.Diag(diag::err_drv_unsupported_opt_for_target)
469+
<< ABIArg->getAsString(Args) << Triple.getTriple();
470+
break;
471+
}
472+
}

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,9 @@ void getAArch64TargetFeatures(const Driver &D, const llvm::Triple &Triple,
2828
std::string getAArch64TargetCPU(const llvm::opt::ArgList &Args,
2929
const llvm::Triple &Triple, llvm::opt::Arg *&A);
3030

31+
void setPAuthABIInTriple(const Driver &D, const llvm::opt::ArgList &Args,
32+
llvm::Triple &triple);
33+
3134
} // end namespace aarch64
3235
} // end namespace target
3336
} // end namespace driver

clang/lib/Driver/ToolChains/Clang.cpp

Lines changed: 57 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1486,6 +1486,41 @@ void AddUnalignedAccessWarning(ArgStringList &CmdArgs) {
14861486
}
14871487
}
14881488

1489+
// Each combination of options here forms a signing schema, and in most cases
1490+
// each signing schema is its own incompatible ABI. The default values of the
1491+
// options represent the default signing schema.
1492+
static void handlePAuthABI(const ArgList &DriverArgs, ArgStringList &CC1Args) {
1493+
if (!DriverArgs.hasArg(options::OPT_fptrauth_intrinsics,
1494+
options::OPT_fno_ptrauth_intrinsics))
1495+
CC1Args.push_back("-fptrauth-intrinsics");
1496+
1497+
if (!DriverArgs.hasArg(options::OPT_fptrauth_calls,
1498+
options::OPT_fno_ptrauth_calls))
1499+
CC1Args.push_back("-fptrauth-calls");
1500+
1501+
if (!DriverArgs.hasArg(options::OPT_fptrauth_returns,
1502+
options::OPT_fno_ptrauth_returns))
1503+
CC1Args.push_back("-fptrauth-returns");
1504+
1505+
if (!DriverArgs.hasArg(options::OPT_fptrauth_auth_traps,
1506+
options::OPT_fno_ptrauth_auth_traps))
1507+
CC1Args.push_back("-fptrauth-auth-traps");
1508+
1509+
if (!DriverArgs.hasArg(
1510+
options::OPT_fptrauth_vtable_pointer_address_discrimination,
1511+
options::OPT_fno_ptrauth_vtable_pointer_address_discrimination))
1512+
CC1Args.push_back("-fptrauth-vtable-pointer-address-discrimination");
1513+
1514+
if (!DriverArgs.hasArg(
1515+
options::OPT_fptrauth_vtable_pointer_type_discrimination,
1516+
options::OPT_fno_ptrauth_vtable_pointer_type_discrimination))
1517+
CC1Args.push_back("-fptrauth-vtable-pointer-type-discrimination");
1518+
1519+
if (!DriverArgs.hasArg(options::OPT_fptrauth_init_fini,
1520+
options::OPT_fno_ptrauth_init_fini))
1521+
CC1Args.push_back("-fptrauth-init-fini");
1522+
}
1523+
14891524
static void CollectARMPACBTIOptions(const ToolChain &TC, const ArgList &Args,
14901525
ArgStringList &CmdArgs, bool isAArch64) {
14911526
const Arg *A = isAArch64
@@ -1548,16 +1583,30 @@ static void CollectARMPACBTIOptions(const ToolChain &TC, const ArgList &Args,
15481583

15491584
CmdArgs.push_back(
15501585
Args.MakeArgString(Twine("-msign-return-address=") + Scope));
1551-
if (Scope != "none")
1586+
if (Scope != "none") {
1587+
if (Triple.getEnvironment() == llvm::Triple::PAuthTest)
1588+
D.Diag(diag::err_drv_unsupported_opt_for_target)
1589+
<< A->getAsString(Args) << Triple.getTriple();
15521590
CmdArgs.push_back(
15531591
Args.MakeArgString(Twine("-msign-return-address-key=") + Key));
1554-
if (BranchProtectionPAuthLR)
1592+
}
1593+
if (BranchProtectionPAuthLR) {
1594+
if (Triple.getEnvironment() == llvm::Triple::PAuthTest)
1595+
D.Diag(diag::err_drv_unsupported_opt_for_target)
1596+
<< A->getAsString(Args) << Triple.getTriple();
15551597
CmdArgs.push_back(
15561598
Args.MakeArgString(Twine("-mbranch-protection-pauth-lr")));
1599+
}
15571600
if (IndirectBranches)
15581601
CmdArgs.push_back("-mbranch-target-enforce");
1559-
if (GuardedControlStack)
1602+
// GCS is currently untested with PAuthABI, but enabling this could be allowed
1603+
// in future after testing with a suitable system.
1604+
if (GuardedControlStack) {
1605+
if (Triple.getEnvironment() == llvm::Triple::PAuthTest)
1606+
D.Diag(diag::err_drv_unsupported_opt_for_target)
1607+
<< A->getAsString(Args) << Triple.getTriple();
15601608
CmdArgs.push_back("-mguarded-control-stack");
1609+
}
15611610
}
15621611

15631612
void Clang::AddARMTargetArgs(const llvm::Triple &Triple, const ArgList &Args,
@@ -1701,6 +1750,8 @@ void RenderAArch64ABI(const llvm::Triple &Triple, const ArgList &Args,
17011750
ABIName = A->getValue();
17021751
else if (Triple.isOSDarwin())
17031752
ABIName = "darwinpcs";
1753+
else if (Triple.getEnvironment() == llvm::Triple::PAuthTest)
1754+
ABIName = "pauthtest";
17041755
else
17051756
ABIName = "aapcs";
17061757

@@ -1737,6 +1788,9 @@ void Clang::AddAArch64TargetArgs(const ArgList &Args,
17371788
// Enable/disable return address signing and indirect branch targets.
17381789
CollectARMPACBTIOptions(getToolChain(), Args, CmdArgs, true /*isAArch64*/);
17391790

1791+
if (Triple.getEnvironment() == llvm::Triple::PAuthTest)
1792+
handlePAuthABI(Args, CmdArgs);
1793+
17401794
// Handle -msve_vector_bits=<bits>
17411795
if (Arg *A = Args.getLastArg(options::OPT_msve_vector_bits_EQ)) {
17421796
StringRef Val = A->getValue();

clang/lib/Driver/ToolChains/Linux.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,9 @@ std::string Linux::getMultiarchTriple(const Driver &D,
8686
case llvm::Triple::aarch64:
8787
if (IsAndroid)
8888
return "aarch64-linux-android";
89+
if (hasEffectiveTriple() &&
90+
getEffectiveTriple().getEnvironment() == llvm::Triple::PAuthTest)
91+
return "aarch64-linux-pauthtest";
8992
return "aarch64-linux-gnu";
9093
case llvm::Triple::aarch64_be:
9194
return "aarch64_be-linux-gnu";

clang/test/Driver/Inputs/multilib_aarch64_linux_tree/usr/include/aarch64-linux-gnu/.keep

Whitespace-only changes.

clang/test/Driver/Inputs/multilib_aarch64_linux_tree/usr/include/aarch64-linux-pauthtest/.keep

Whitespace-only changes.
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
// RUN: %clang --target=aarch64-linux-pauthtest --sysroot=%S/Inputs/multilib_aarch64_linux_tree -### -c %s 2>&1 | FileCheck %s
2+
// RUN: %clang --target=aarch64-linux -mabi=pauthtest --sysroot=%S/Inputs/multilib_aarch64_linux_tree -### -c %s 2>&1 | FileCheck %s
3+
4+
// CHECK: "-internal-externc-isystem" "{{.*}}/usr/include/aarch64-linux-pauthtest"

clang/test/Driver/aarch64-ptrauth.c

Lines changed: 76 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
1+
// REQUIRES: aarch64-registered-target
2+
13
// RUN: %clang -### -c --target=aarch64 %s 2>&1 | FileCheck %s --check-prefix NONE
2-
// NONE: "-cc1"
4+
// NONE: "-cc1"
35
// NONE-NOT: "-fptrauth-
46

57
// RUN: %clang -### -c --target=aarch64 \
@@ -13,13 +15,78 @@
1315
// RUN: %s 2>&1 | FileCheck %s --check-prefix=ALL
1416
// ALL: "-cc1"{{.*}} "-fptrauth-intrinsics" "-fptrauth-calls" "-fptrauth-returns" "-fptrauth-auth-traps" "-fptrauth-vtable-pointer-address-discrimination" "-fptrauth-vtable-pointer-type-discrimination" "-fptrauth-init-fini"
1517

18+
// RUN: %clang -### -c --target=aarch64-linux -mabi=pauthtest %s 2>&1 | FileCheck %s --check-prefix=PAUTHABI1
19+
// RUN: %clang -### -c --target=aarch64-linux-pauthtest %s 2>&1 | FileCheck %s --check-prefix=PAUTHABI1
20+
// PAUTHABI1: "-cc1"{{.*}} "-triple" "aarch64-unknown-linux-pauthtest"
21+
// PAUTHABI1-SAME: "-target-abi" "pauthtest"
22+
// PAUTHABI1-SAME: "-fptrauth-intrinsics" "-fptrauth-calls" "-fptrauth-returns" "-fptrauth-auth-traps" "-fptrauth-vtable-pointer-address-discrimination" "-fptrauth-vtable-pointer-type-discrimination" "-fptrauth-init-fini"
23+
24+
// RUN: %clang -### -c --target=aarch64 -mabi=pauthtest -fno-ptrauth-intrinsics \
25+
// RUN: -fno-ptrauth-calls -fno-ptrauth-returns -fno-ptrauth-auth-traps \
26+
// RUN: -fno-ptrauth-vtable-pointer-address-discrimination -fno-ptrauth-vtable-pointer-type-discrimination \
27+
// RUN: -fno-ptrauth-init-fini %s 2>&1 | FileCheck %s --check-prefix=PAUTHABI2
28+
// RUN: %clang -### -c --target=aarch64-pauthtest -fno-ptrauth-intrinsics \
29+
// RUN: -fno-ptrauth-calls -fno-ptrauth-returns -fno-ptrauth-auth-traps \
30+
// RUN: -fno-ptrauth-vtable-pointer-address-discrimination -fno-ptrauth-vtable-pointer-type-discrimination \
31+
// RUN: -fno-ptrauth-init-fini %s 2>&1 | FileCheck %s --check-prefix=PAUTHABI2
32+
// PAUTHABI2: "-cc1"
33+
// PAUTHABI2-NOT: "-fptrauth-
34+
1635
// RUN: not %clang -### -c --target=x86_64 -fptrauth-intrinsics -fptrauth-calls -fptrauth-returns -fptrauth-auth-traps \
1736
// RUN: -fptrauth-vtable-pointer-address-discrimination -fptrauth-vtable-pointer-type-discrimination \
18-
// RUN: -fptrauth-init-fini %s 2>&1 | FileCheck %s --check-prefix=ERR
19-
// ERR: error: unsupported option '-fptrauth-intrinsics' for target '{{.*}}'
20-
// ERR-NEXT: error: unsupported option '-fptrauth-calls' for target '{{.*}}'
21-
// ERR-NEXT: error: unsupported option '-fptrauth-returns' for target '{{.*}}'
22-
// ERR-NEXT: error: unsupported option '-fptrauth-auth-traps' for target '{{.*}}'
23-
// ERR-NEXT: error: unsupported option '-fptrauth-vtable-pointer-address-discrimination' for target '{{.*}}'
24-
// ERR-NEXT: error: unsupported option '-fptrauth-vtable-pointer-type-discrimination' for target '{{.*}}'
25-
// ERR-NEXT: error: unsupported option '-fptrauth-init-fini' for target '{{.*}}'
37+
// RUN: -fptrauth-init-fini %s 2>&1 | FileCheck %s --check-prefix=ERR1
38+
// ERR1: error: unsupported option '-fptrauth-intrinsics' for target '{{.*}}'
39+
// ERR1-NEXT: error: unsupported option '-fptrauth-calls' for target '{{.*}}'
40+
// ERR1-NEXT: error: unsupported option '-fptrauth-returns' for target '{{.*}}'
41+
// ERR1-NEXT: error: unsupported option '-fptrauth-auth-traps' for target '{{.*}}'
42+
// ERR1-NEXT: error: unsupported option '-fptrauth-vtable-pointer-address-discrimination' for target '{{.*}}'
43+
// ERR1-NEXT: error: unsupported option '-fptrauth-vtable-pointer-type-discrimination' for target '{{.*}}'
44+
// ERR1-NEXT: error: unsupported option '-fptrauth-init-fini' for target '{{.*}}'
45+
46+
//// Only support PAuth ABI for Linux as for now.
47+
// RUN: not %clang -c --target=aarch64-unknown -mabi=pauthtest %s 2>&1 | FileCheck %s --check-prefix=ERR2
48+
// RUN: not %clang -c --target=aarch64-unknown-pauthtest %s 2>&1 | FileCheck %s --check-prefix=ERR2
49+
// ERR2: error: ABI 'pauthtest' is not supported for 'aarch64-unknown-unknown-pauthtest'
50+
51+
//// PAuth ABI is encoded as environment part of the triple, so don't allow to explicitly set other environments.
52+
// RUN: not %clang -c --target=aarch64-linux-gnu -mabi=pauthtest %s 2>&1 | FileCheck %s --check-prefix=ERR3
53+
// ERR3: error: unsupported option '-mabi=pauthtest' for target 'aarch64-unknown-linux-gnu'
54+
// RUN: %clang -c --target=aarch64-linux-pauthtest -mabi=pauthtest %s
55+
56+
//// The only branch protection option compatible with PAuthABI is BTI.
57+
// RUN: not %clang -### -c --target=aarch64-linux -mabi=pauthtest -mbranch-protection=pac-ret %s 2>&1 | \
58+
// RUN: FileCheck %s --check-prefix=ERR4
59+
// RUN: not %clang -### -c --target=aarch64-linux-pauthtest -mbranch-protection=pac-ret %s 2>&1 | \
60+
// RUN: FileCheck %s --check-prefix=ERR4
61+
// ERR4: error: unsupported option '-mbranch-protection=pac-ret' for target 'aarch64-unknown-linux-pauthtest'
62+
63+
// RUN: not %clang -### -c --target=aarch64-linux -mabi=pauthtest -mbranch-protection=gcs %s 2>&1 | \
64+
// RUN: FileCheck %s --check-prefix=ERR5
65+
// RUN: not %clang -### -c --target=aarch64-linux-pauthtest -mbranch-protection=gcs %s 2>&1 | \
66+
// RUN: FileCheck %s --check-prefix=ERR5
67+
// ERR5: error: unsupported option '-mbranch-protection=gcs' for target 'aarch64-unknown-linux-pauthtest'
68+
69+
// RUN: not %clang -### -c --target=aarch64-linux -mabi=pauthtest -mbranch-protection=standard %s 2>&1 | \
70+
// RUN: FileCheck %s --check-prefix=ERR6
71+
// RUN: not %clang -### -c --target=aarch64-linux-pauthtest -mbranch-protection=standard %s 2>&1 | \
72+
// RUN: FileCheck %s --check-prefix=ERR6
73+
// ERR6: error: unsupported option '-mbranch-protection=standard' for target 'aarch64-unknown-linux-pauthtest'
74+
75+
// RUN: not %clang -### -c --target=aarch64-linux -mabi=pauthtest -msign-return-address=all %s 2>&1 | \
76+
// RUN: FileCheck %s --check-prefix=ERR7
77+
// RUN: not %clang -### -c --target=aarch64-linux-pauthtest -msign-return-address=all %s 2>&1 | \
78+
// RUN: FileCheck %s --check-prefix=ERR7
79+
// ERR7: error: unsupported option '-msign-return-address=all' for target 'aarch64-unknown-linux-pauthtest'
80+
81+
// RUN: not %clang -### -c --target=aarch64-linux -mabi=pauthtest -msign-return-address=non-leaf %s 2>&1 | \
82+
// RUN: FileCheck %s --check-prefix=ERR8
83+
// RUN: not %clang -### -c --target=aarch64-linux-pauthtest -msign-return-address=non-leaf %s 2>&1 | \
84+
// RUN: FileCheck %s --check-prefix=ERR8
85+
// ERR8: error: unsupported option '-msign-return-address=non-leaf' for target 'aarch64-unknown-linux-pauthtest'
86+
87+
// RUN: %clang -### -c --target=aarch64-linux -mabi=pauthtest -msign-return-address=none %s
88+
// RUN: %clang -### -c --target=aarch64-linux-pauthtest -msign-return-address=none %s
89+
// RUN: %clang -### -c --target=aarch64-linux -mabi=pauthtest -mbranch-protection=bti %s
90+
// RUN: %clang -### -c --target=aarch64-linux-pauthtest -mbranch-protection=bti %s
91+
// RUN: %clang -### -c --target=aarch64-linux -mabi=pauthtest -mbranch-protection=none %s
92+
// RUN: %clang -### -c --target=aarch64-linux-pauthtest -mbranch-protection=none %s

llvm/include/llvm/TargetParser/Triple.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -268,7 +268,7 @@ class Triple {
268268
Cygnus,
269269
CoreCLR,
270270
Simulator, // Simulator variants of other systems, e.g., Apple's iOS
271-
MacABI, // Mac Catalyst variant of Apple's iOS deployment target.
271+
MacABI, // Mac Catalyst variant of Apple's iOS deployment target.
272272

273273
// Shader Stages
274274
// The order of these values matters, and must be kept in sync with the
@@ -292,7 +292,9 @@ class Triple {
292292
OpenCL,
293293
OpenHOS,
294294

295-
LastEnvironmentType = OpenHOS
295+
PAuthTest,
296+
297+
LastEnvironmentType = PAuthTest
296298
};
297299
enum ObjectFormatType {
298300
UnknownObjectFormat,

llvm/lib/TargetParser/Triple.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -352,6 +352,8 @@ StringRef Triple::getEnvironmentTypeName(EnvironmentType Kind) {
352352
case OpenCL:
353353
return "opencl";
354354
case OpenHOS: return "ohos";
355+
case PAuthTest:
356+
return "pauthtest";
355357
}
356358

357359
llvm_unreachable("Invalid EnvironmentType!");
@@ -728,6 +730,7 @@ static Triple::EnvironmentType parseEnvironment(StringRef EnvironmentName) {
728730
.StartsWith("amplification", Triple::Amplification)
729731
.StartsWith("opencl", Triple::OpenCL)
730732
.StartsWith("ohos", Triple::OpenHOS)
733+
.StartsWith("pauthtest", Triple::PAuthTest)
731734
.Default(Triple::UnknownEnvironment);
732735
}
733736

llvm/unittests/TargetParser/TripleTest.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1169,6 +1169,12 @@ TEST(TripleTest, ParsedIDs) {
11691169
EXPECT_EQ(Triple::Serenity, T.getOS());
11701170
EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment());
11711171

1172+
T = Triple("aarch64-unknown-linux-pauthtest");
1173+
EXPECT_EQ(Triple::aarch64, T.getArch());
1174+
EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
1175+
EXPECT_EQ(Triple::Linux, T.getOS());
1176+
EXPECT_EQ(Triple::PAuthTest, T.getEnvironment());
1177+
11721178
T = Triple("huh");
11731179
EXPECT_EQ(Triple::UnknownArch, T.getArch());
11741180
}

0 commit comments

Comments
 (0)