Skip to content

Commit 3b4b1b1

Browse files
kovdan01atrosinenko
andcommitted
[PAC][Driver] Implement -mbranch-protection=pauthabi option
Enable the following ptrauth flags when `pauthabi` is passed as branch protection: - `intrinsics`; - `calls`; - `returns`; - `auth-traps`; - `vtable-pointer-address-discrimination`; - `vtable-pointer-type-discrimination`; - `init-fini`. Co-authored-by: Anatoly Trosinenko <[email protected]>
1 parent 038bc1c commit 3b4b1b1

File tree

4 files changed

+72
-9
lines changed

4 files changed

+72
-9
lines changed

clang/lib/Driver/ToolChains/Clang.cpp

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1484,6 +1484,39 @@ void AddUnalignedAccessWarning(ArgStringList &CmdArgs) {
14841484
}
14851485
}
14861486

1487+
static void handlePAuthABIOption(const ArgList &DriverArgs,
1488+
ArgStringList &CC1Args, const Driver &D) {
1489+
if (!DriverArgs.hasArg(options::OPT_fptrauth_intrinsics,
1490+
options::OPT_fno_ptrauth_intrinsics))
1491+
CC1Args.push_back("-fptrauth-intrinsics");
1492+
1493+
if (!DriverArgs.hasArg(options::OPT_fptrauth_calls,
1494+
options::OPT_fno_ptrauth_calls))
1495+
CC1Args.push_back("-fptrauth-calls");
1496+
1497+
if (!DriverArgs.hasArg(options::OPT_fptrauth_returns,
1498+
options::OPT_fno_ptrauth_returns))
1499+
CC1Args.push_back("-fptrauth-returns");
1500+
1501+
if (!DriverArgs.hasArg(options::OPT_fptrauth_auth_traps,
1502+
options::OPT_fno_ptrauth_auth_traps))
1503+
CC1Args.push_back("-fptrauth-auth-traps");
1504+
1505+
if (!DriverArgs.hasArg(
1506+
options::OPT_fptrauth_vtable_pointer_address_discrimination,
1507+
options::OPT_fno_ptrauth_vtable_pointer_address_discrimination))
1508+
CC1Args.push_back("-fptrauth-vtable-pointer-address-discrimination");
1509+
1510+
if (!DriverArgs.hasArg(
1511+
options::OPT_fptrauth_vtable_pointer_type_discrimination,
1512+
options::OPT_fno_ptrauth_vtable_pointer_type_discrimination))
1513+
CC1Args.push_back("-fptrauth-vtable-pointer-type-discrimination");
1514+
1515+
if (!DriverArgs.hasArg(options::OPT_fptrauth_init_fini,
1516+
options::OPT_fno_ptrauth_init_fini))
1517+
CC1Args.push_back("-fptrauth-init-fini");
1518+
}
1519+
14871520
static void CollectARMPACBTIOptions(const ToolChain &TC, const ArgList &Args,
14881521
ArgStringList &CmdArgs, bool isAArch64) {
14891522
const Arg *A = isAArch64
@@ -1537,11 +1570,16 @@ static void CollectARMPACBTIOptions(const ToolChain &TC, const ArgList &Args,
15371570
if (!isAArch64 && PBP.Key == "b_key")
15381571
D.Diag(diag::warn_unsupported_branch_protection)
15391572
<< "b-key" << A->getAsString(Args);
1573+
if (!isAArch64 && PBP.HasPauthABI)
1574+
D.Diag(diag::warn_unsupported_branch_protection)
1575+
<< "pauthabi" << A->getAsString(Args);
15401576
Scope = PBP.Scope;
15411577
Key = PBP.Key;
15421578
BranchProtectionPAuthLR = PBP.BranchProtectionPAuthLR;
15431579
IndirectBranches = PBP.BranchTargetEnforcement;
15441580
GuardedControlStack = PBP.GuardedControlStack;
1581+
if (isAArch64 && PBP.HasPauthABI)
1582+
handlePAuthABIOption(Args, CmdArgs, D);
15451583
}
15461584

15471585
CmdArgs.push_back(

clang/test/Driver/aarch64-ptrauth.c

Lines changed: 28 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,33 @@
1313
// RUN: %s 2>&1 | FileCheck %s --check-prefix=ALL
1414
// ALL: "-cc1"{{.*}} "-fptrauth-intrinsics" "-fptrauth-calls" "-fptrauth-returns" "-fptrauth-auth-traps" "-fptrauth-vtable-pointer-address-discrimination" "-fptrauth-vtable-pointer-type-discrimination" "-fptrauth-init-fini"
1515

16+
// RUN: %clang -### -c --target=aarch64 -mbranch-protection=pauthabi %s 2>&1 | \
17+
// RUN: FileCheck %s --check-prefix=PAUTHABI1
18+
// PAUTHABI1: "-cc1"{{.*}} "-fptrauth-intrinsics" "-fptrauth-calls" "-fptrauth-returns" "-fptrauth-auth-traps" "-fptrauth-vtable-pointer-address-discrimination" "-fptrauth-vtable-pointer-type-discrimination" "-fptrauth-init-fini"
19+
20+
// RUN: %clang -### -c --target=aarch64 -mbranch-protection=pauthabi -fno-ptrauth-intrinsics \
21+
// RUN: -fno-ptrauth-calls -fno-ptrauth-returns -fno-ptrauth-auth-traps \
22+
// RUN: -fno-ptrauth-vtable-pointer-address-discrimination -fno-ptrauth-vtable-pointer-type-discrimination \
23+
// RUN: -fno-ptrauth-init-fini %s 2>&1 | FileCheck %s --check-prefix=PAUTHABI2
24+
// PAUTHABI2-NOT: "-fptrauth-intrinsics"
25+
// PAUTHABI2-NOT: "-fptrauth-calls"
26+
// PAUTHABI2-NOT: "-fptrauth-returns"
27+
// PAUTHABI2-NOT: "-fptrauth-auth-traps"
28+
// PAUTHABI2-NOT: "-fptrauth-vtable-pointer-address-discrimination"
29+
// PAUTHABI2-NOT: "-fptrauth-vtable-pointer-type-discrimination"
30+
// PAUTHABI2-NOT: "-fptrauth-init-fini"
31+
1632
// RUN: not %clang -### -c --target=x86_64 -fptrauth-intrinsics -fptrauth-calls -fptrauth-returns -fptrauth-auth-traps \
1733
// 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 '{{.*}}'
34+
// RUN: -fptrauth-init-fini %s 2>&1 | FileCheck %s --check-prefix=ERR1
35+
// ERR1: error: unsupported option '-fptrauth-intrinsics' for target '{{.*}}'
36+
// ERR1-NEXT: error: unsupported option '-fptrauth-calls' for target '{{.*}}'
37+
// ERR1-NEXT: error: unsupported option '-fptrauth-returns' for target '{{.*}}'
38+
// ERR1-NEXT: error: unsupported option '-fptrauth-auth-traps' for target '{{.*}}'
39+
// ERR1-NEXT: error: unsupported option '-fptrauth-vtable-pointer-address-discrimination' for target '{{.*}}'
40+
// ERR1-NEXT: error: unsupported option '-fptrauth-vtable-pointer-type-discrimination' for target '{{.*}}'
41+
// ERR1-NEXT: error: unsupported option '-fptrauth-init-fini' for target '{{.*}}'
42+
43+
// RUN: not %clang -### -c --target=x86_64 -mbranch-protection=pauthabi %s 2>&1 | \
44+
// RUN: FileCheck %s --check-prefix=ERR2
45+
// ERR2: error: unsupported option '-mbranch-protection=' for target 'x86_64'

llvm/include/llvm/TargetParser/ARMTargetParserCommon.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ struct ParsedBranchProtection {
4343
bool BranchTargetEnforcement;
4444
bool BranchProtectionPAuthLR;
4545
bool GuardedControlStack;
46+
bool HasPauthABI;
4647
};
4748

4849
bool parseBranchProtection(StringRef Spec, ParsedBranchProtection &PBP,

llvm/lib/TargetParser/ARMTargetParserCommon.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,7 @@ ARM::EndianKind ARM::parseArchEndian(StringRef Arch) {
140140
// an erroneous part of the spec.
141141
bool ARM::parseBranchProtection(StringRef Spec, ParsedBranchProtection &PBP,
142142
StringRef &Err, bool EnablePAuthLR) {
143-
PBP = {"none", "a_key", false, false, false};
143+
PBP = {"none", "a_key", false, false, false, false};
144144
if (Spec == "none")
145145
return true; // defaults are ok
146146

@@ -160,6 +160,10 @@ bool ARM::parseBranchProtection(StringRef Spec, ParsedBranchProtection &PBP,
160160
PBP.BranchTargetEnforcement = true;
161161
continue;
162162
}
163+
if (Opt == "pauthabi") {
164+
PBP.HasPauthABI = true;
165+
continue;
166+
}
163167
if (Opt == "pac-ret") {
164168
PBP.Scope = "non-leaf";
165169
for (; I + 1 != E; ++I) {

0 commit comments

Comments
 (0)