Skip to content

Commit 8878834

Browse files
committed
[PAC][Driver] Support ptrauth flags only on AArch64 Linux and ARM64 Darwin
Most ptrauth flags are ABI-affecting, so allow them only for Linux and Darwin OS which explicitly support pointer authentication. Leave `-faarch64-jump-table-hardening` available for all AArch64 targets since it's not ABI-affecting.
1 parent 418ead4 commit 8878834

File tree

6 files changed

+97
-54
lines changed

6 files changed

+97
-54
lines changed

clang/include/clang/Driver/ToolChain.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -240,6 +240,9 @@ class ToolChain {
240240
llvm::opt::ArgStringList &CC1Args,
241241
ArrayRef<StringRef> Paths);
242242

243+
static void addPointerAuthFlags(const llvm::opt::ArgList &DriverArgs,
244+
llvm::opt::ArgStringList &CC1Args);
245+
243246
static std::string concat(StringRef Path, const Twine &A, const Twine &B = "",
244247
const Twine &C = "", const Twine &D = "");
245248
///@}

clang/lib/Driver/ToolChain.cpp

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1264,6 +1264,48 @@ void ToolChain::addExternCSystemIncludeIfExists(const ArgList &DriverArgs,
12641264
}
12651265
}
12661266

1267+
/*static*/ void
1268+
ToolChain::addPointerAuthFlags(const llvm::opt::ArgList &DriverArgs,
1269+
llvm::opt::ArgStringList &CC1Args) {
1270+
DriverArgs.addOptInFlag(CC1Args, options::OPT_fptrauth_intrinsics,
1271+
options::OPT_fno_ptrauth_intrinsics);
1272+
1273+
DriverArgs.addOptInFlag(CC1Args, options::OPT_fptrauth_calls,
1274+
options::OPT_fno_ptrauth_calls);
1275+
1276+
DriverArgs.addOptInFlag(CC1Args, options::OPT_fptrauth_returns,
1277+
options::OPT_fno_ptrauth_returns);
1278+
1279+
DriverArgs.addOptInFlag(CC1Args, options::OPT_fptrauth_auth_traps,
1280+
options::OPT_fno_ptrauth_auth_traps);
1281+
1282+
DriverArgs.addOptInFlag(
1283+
CC1Args, options::OPT_fptrauth_vtable_pointer_address_discrimination,
1284+
options::OPT_fno_ptrauth_vtable_pointer_address_discrimination);
1285+
1286+
DriverArgs.addOptInFlag(
1287+
CC1Args, options::OPT_fptrauth_vtable_pointer_type_discrimination,
1288+
options::OPT_fno_ptrauth_vtable_pointer_type_discrimination);
1289+
1290+
DriverArgs.addOptInFlag(
1291+
CC1Args, options::OPT_fptrauth_type_info_vtable_pointer_discrimination,
1292+
options::OPT_fno_ptrauth_type_info_vtable_pointer_discrimination);
1293+
1294+
DriverArgs.addOptInFlag(
1295+
CC1Args, options::OPT_fptrauth_function_pointer_type_discrimination,
1296+
options::OPT_fno_ptrauth_function_pointer_type_discrimination);
1297+
1298+
DriverArgs.addOptInFlag(CC1Args, options::OPT_fptrauth_indirect_gotos,
1299+
options::OPT_fno_ptrauth_indirect_gotos);
1300+
1301+
DriverArgs.addOptInFlag(CC1Args, options::OPT_fptrauth_init_fini,
1302+
options::OPT_fno_ptrauth_init_fini);
1303+
1304+
DriverArgs.addOptInFlag(
1305+
CC1Args, options::OPT_fptrauth_init_fini_address_discrimination,
1306+
options::OPT_fno_ptrauth_init_fini_address_discrimination);
1307+
}
1308+
12671309
/*static*/ std::string ToolChain::concat(StringRef Path, const Twine &A,
12681310
const Twine &B, const Twine &C,
12691311
const Twine &D) {

clang/lib/Driver/ToolChains/Clang.cpp

Lines changed: 0 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1784,34 +1784,6 @@ void Clang::AddAArch64TargetArgs(const ArgList &Args,
17841784

17851785
AddUnalignedAccessWarning(CmdArgs);
17861786

1787-
Args.addOptInFlag(CmdArgs, options::OPT_fptrauth_intrinsics,
1788-
options::OPT_fno_ptrauth_intrinsics);
1789-
Args.addOptInFlag(CmdArgs, options::OPT_fptrauth_calls,
1790-
options::OPT_fno_ptrauth_calls);
1791-
Args.addOptInFlag(CmdArgs, options::OPT_fptrauth_returns,
1792-
options::OPT_fno_ptrauth_returns);
1793-
Args.addOptInFlag(CmdArgs, options::OPT_fptrauth_auth_traps,
1794-
options::OPT_fno_ptrauth_auth_traps);
1795-
Args.addOptInFlag(
1796-
CmdArgs, options::OPT_fptrauth_vtable_pointer_address_discrimination,
1797-
options::OPT_fno_ptrauth_vtable_pointer_address_discrimination);
1798-
Args.addOptInFlag(
1799-
CmdArgs, options::OPT_fptrauth_vtable_pointer_type_discrimination,
1800-
options::OPT_fno_ptrauth_vtable_pointer_type_discrimination);
1801-
Args.addOptInFlag(
1802-
CmdArgs, options::OPT_fptrauth_type_info_vtable_pointer_discrimination,
1803-
options::OPT_fno_ptrauth_type_info_vtable_pointer_discrimination);
1804-
Args.addOptInFlag(
1805-
CmdArgs, options::OPT_fptrauth_function_pointer_type_discrimination,
1806-
options::OPT_fno_ptrauth_function_pointer_type_discrimination);
1807-
1808-
Args.addOptInFlag(CmdArgs, options::OPT_fptrauth_indirect_gotos,
1809-
options::OPT_fno_ptrauth_indirect_gotos);
1810-
Args.addOptInFlag(CmdArgs, options::OPT_fptrauth_init_fini,
1811-
options::OPT_fno_ptrauth_init_fini);
1812-
Args.addOptInFlag(CmdArgs,
1813-
options::OPT_fptrauth_init_fini_address_discrimination,
1814-
options::OPT_fno_ptrauth_init_fini_address_discrimination);
18151787
Args.addOptInFlag(CmdArgs, options::OPT_faarch64_jump_table_hardening,
18161788
options::OPT_fno_aarch64_jump_table_hardening);
18171789
}

clang/lib/Driver/ToolChains/Darwin.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3137,6 +3137,9 @@ void Darwin::addClangTargetOptions(
31373137
if (!RequiresSubdirectorySearch)
31383138
CC1Args.push_back("-fno-modulemap-allow-subdirectory-search");
31393139
}
3140+
3141+
if (getTriple().isAArch64())
3142+
addPointerAuthFlags(DriverArgs, CC1Args);
31403143
}
31413144

31423145
void Darwin::addClangCC1ASTargetOptions(

clang/lib/Driver/ToolChains/Linux.cpp

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -529,8 +529,12 @@ void Linux::addClangTargetOptions(const llvm::opt::ArgList &DriverArgs,
529529
llvm::opt::ArgStringList &CC1Args,
530530
Action::OffloadKind DeviceOffloadKind) const {
531531
llvm::Triple Triple(ComputeEffectiveClangTriple(DriverArgs));
532-
if (Triple.isAArch64() && Triple.getEnvironment() == llvm::Triple::PAuthTest)
533-
handlePAuthABI(getDriver(), DriverArgs, CC1Args);
532+
if (Triple.isAArch64()) {
533+
addPointerAuthFlags(DriverArgs, CC1Args);
534+
if (Triple.getEnvironment() == llvm::Triple::PAuthTest)
535+
handlePAuthABI(getDriver(), DriverArgs, CC1Args);
536+
}
537+
534538
Generic_ELF::addClangTargetOptions(DriverArgs, CC1Args, DeviceOffloadKind);
535539
}
536540

clang/test/Driver/aarch64-ptrauth.c

Lines changed: 43 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
// NONE: "-cc1"
55
// NONE-NOT: "-fptrauth-
66

7-
// RUN: %clang -### -c --target=aarch64 \
7+
// RUN: %clang -### -c --target=aarch64-linux \
88
// RUN: -fno-ptrauth-intrinsics -fptrauth-intrinsics \
99
// RUN: -fno-ptrauth-calls -fptrauth-calls \
1010
// RUN: -fno-ptrauth-returns -fptrauth-returns \
@@ -17,7 +17,20 @@
1717
// RUN: -fno-ptrauth-init-fini-address-discrimination -fptrauth-init-fini-address-discrimination \
1818
// RUN: -fno-aarch64-jump-table-hardening -faarch64-jump-table-hardening \
1919
// RUN: %s 2>&1 | FileCheck %s --check-prefix=ALL
20-
// ALL: "-cc1"{{.*}} "-fptrauth-intrinsics" "-fptrauth-calls" "-fptrauth-returns" "-fptrauth-auth-traps" "-fptrauth-vtable-pointer-address-discrimination" "-fptrauth-vtable-pointer-type-discrimination" "-fptrauth-type-info-vtable-pointer-discrimination" "-fptrauth-indirect-gotos" "-fptrauth-init-fini" "-fptrauth-init-fini-address-discrimination" "-faarch64-jump-table-hardening"
20+
// RUN: %clang -### -c --target=arm64-darwin \
21+
// RUN: -fno-ptrauth-intrinsics -fptrauth-intrinsics \
22+
// RUN: -fno-ptrauth-calls -fptrauth-calls \
23+
// RUN: -fno-ptrauth-returns -fptrauth-returns \
24+
// RUN: -fno-ptrauth-auth-traps -fptrauth-auth-traps \
25+
// RUN: -fno-ptrauth-vtable-pointer-address-discrimination -fptrauth-vtable-pointer-address-discrimination \
26+
// RUN: -fno-ptrauth-vtable-pointer-type-discrimination -fptrauth-vtable-pointer-type-discrimination \
27+
// RUN: -fno-ptrauth-type-info-vtable-pointer-discrimination -fptrauth-type-info-vtable-pointer-discrimination \
28+
// RUN: -fno-ptrauth-indirect-gotos -fptrauth-indirect-gotos \
29+
// RUN: -fno-ptrauth-init-fini -fptrauth-init-fini \
30+
// RUN: -fno-ptrauth-init-fini-address-discrimination -fptrauth-init-fini-address-discrimination \
31+
// RUN: -fno-aarch64-jump-table-hardening -faarch64-jump-table-hardening \
32+
// RUN: %s 2>&1 | FileCheck %s --check-prefix=ALL
33+
// ALL: "-cc1"{{.*}} "-fptrauth-intrinsics" "-fptrauth-calls" "-fptrauth-returns" "-fptrauth-auth-traps" "-fptrauth-vtable-pointer-address-discrimination" "-fptrauth-vtable-pointer-type-discrimination" "-fptrauth-type-info-vtable-pointer-discrimination" "-fptrauth-indirect-gotos" "-fptrauth-init-fini" "-fptrauth-init-fini-address-discrimination"{{.*}} "-faarch64-jump-table-hardening"
2134

2235
// RUN: %clang -### -c --target=aarch64-linux -mabi=pauthtest %s 2>&1 | FileCheck %s --check-prefix=PAUTHABI1
2336
// RUN: %clang -### -c --target=aarch64-linux-pauthtest %s 2>&1 | FileCheck %s --check-prefix=PAUTHABI1
@@ -40,7 +53,7 @@
4053
// RUN: -fno-aarch64-jump-table-hardening %s 2>&1 | FileCheck %s --check-prefix=PAUTHABI2
4154

4255
//// Non-linux OS: pauthtest ABI has no effect in terms of passing ptrauth cc1 flags.
43-
//// An error about unsupported ABI will be emitted later in pipeline (see ERR2 below)
56+
//// An error about unsupported ABI will be emitted later in pipeline (see ERR3 below)
4457
// RUN: %clang -### -c --target=aarch64 -mabi=pauthtest %s 2>&1 | FileCheck %s --check-prefix=PAUTHABI2
4558

4659
// PAUTHABI2: "-cc1"
@@ -55,7 +68,13 @@
5568
// PAUTHABI3-NOT: "-fptrauth-
5669
// PAUTHABI3-NOT: "-faarch64-jump-table-hardening"
5770

58-
// RUN: not %clang -### -c --target=x86_64 -fptrauth-intrinsics -fptrauth-calls -fptrauth-returns -fptrauth-auth-traps \
71+
//// Non-AArch64.
72+
// RUN: not %clang -### -c --target=x86_64-linux -fptrauth-intrinsics -fptrauth-calls -fptrauth-returns -fptrauth-auth-traps \
73+
// RUN: -fptrauth-vtable-pointer-address-discrimination -fptrauth-vtable-pointer-type-discrimination \
74+
// RUN: -fptrauth-type-info-vtable-pointer-discrimination -fptrauth-indirect-gotos -fptrauth-init-fini \
75+
// RUN: -fptrauth-init-fini-address-discrimination -faarch64-jump-table-hardening %s 2>&1 | FileCheck %s --check-prefixes=ERR1,ERR2
76+
//// Non-linux and non-Darwin OS.
77+
// RUN: not %clang -### -c --target=aarch64 -fptrauth-intrinsics -fptrauth-calls -fptrauth-returns -fptrauth-auth-traps \
5978
// RUN: -fptrauth-vtable-pointer-address-discrimination -fptrauth-vtable-pointer-type-discrimination \
6079
// RUN: -fptrauth-type-info-vtable-pointer-discrimination -fptrauth-indirect-gotos -fptrauth-init-fini \
6180
// RUN: -fptrauth-init-fini-address-discrimination -faarch64-jump-table-hardening %s 2>&1 | FileCheck %s --check-prefix=ERR1
@@ -69,50 +88,50 @@
6988
// ERR1-NEXT: error: unsupported option '-fptrauth-indirect-gotos' for target '{{.*}}'
7089
// ERR1-NEXT: error: unsupported option '-fptrauth-init-fini' for target '{{.*}}'
7190
// ERR1-NEXT: error: unsupported option '-fptrauth-init-fini-address-discrimination' for target '{{.*}}'
72-
// ERR1-NEXT: error: unsupported option '-faarch64-jump-table-hardening' for target '{{.*}}'
91+
// ERR2-NEXT: error: unsupported option '-faarch64-jump-table-hardening' for target '{{.*}}'
7392

7493

75-
// RUN: not %clang -c --target=aarch64 -mabi=pauthtest %s 2>&1 | FileCheck %s --check-prefix=ERR2
94+
// RUN: not %clang -c --target=aarch64 -mabi=pauthtest %s 2>&1 | FileCheck %s --check-prefix=ERR3
7695
//// The ABI is not specified explicitly, and for non-Linux pauthtest environment does not correspond
7796
//// to pauthtest ABI (each OS target defines this behavior separately). Do not emit an error.
7897
// RUN: %clang -c --target=aarch64-pauthtest %s -o /dev/null
79-
// ERR2: error: unknown target ABI 'pauthtest'
98+
// ERR3: error: unknown target ABI 'pauthtest'
8099

81100
//// PAuth ABI is encoded as environment part of the triple, so don't allow to explicitly set other environments.
82-
// RUN: not %clang -### -c --target=aarch64-linux-gnu -mabi=pauthtest %s 2>&1 | FileCheck %s --check-prefix=ERR3
83-
// ERR3: error: unsupported option '-mabi=pauthtest' for target 'aarch64-unknown-linux-gnu'
101+
// RUN: not %clang -### -c --target=aarch64-linux-gnu -mabi=pauthtest %s 2>&1 | FileCheck %s --check-prefix=ERR4
102+
// ERR4: error: unsupported option '-mabi=pauthtest' for target 'aarch64-unknown-linux-gnu'
84103
// RUN: %clang -### -c --target=aarch64-linux-pauthtest -mabi=pauthtest %s
85104

86105
//// The only branch protection option compatible with PAuthABI is BTI.
87106
// RUN: not %clang -### -c --target=aarch64-linux -mabi=pauthtest -mbranch-protection=pac-ret %s 2>&1 | \
88-
// RUN: FileCheck %s --check-prefix=ERR4
107+
// RUN: FileCheck %s --check-prefix=ERR5
89108
// RUN: not %clang -### -c --target=aarch64-linux-pauthtest -mbranch-protection=pac-ret %s 2>&1 | \
90-
// RUN: FileCheck %s --check-prefix=ERR4
91-
// ERR4: error: unsupported option '-mbranch-protection=pac-ret' for target 'aarch64-unknown-linux-pauthtest'
109+
// RUN: FileCheck %s --check-prefix=ERR5
110+
// ERR5: error: unsupported option '-mbranch-protection=pac-ret' for target 'aarch64-unknown-linux-pauthtest'
92111

93112
// RUN: not %clang -### -c --target=aarch64-linux -mabi=pauthtest -mbranch-protection=gcs %s 2>&1 | \
94-
// RUN: FileCheck %s --check-prefix=ERR5
113+
// RUN: FileCheck %s --check-prefix=ERR6
95114
// RUN: not %clang -### -c --target=aarch64-linux-pauthtest -mbranch-protection=gcs %s 2>&1 | \
96-
// RUN: FileCheck %s --check-prefix=ERR5
97-
// ERR5: error: unsupported option '-mbranch-protection=gcs' for target 'aarch64-unknown-linux-pauthtest'
115+
// RUN: FileCheck %s --check-prefix=ERR6
116+
// ERR6: error: unsupported option '-mbranch-protection=gcs' for target 'aarch64-unknown-linux-pauthtest'
98117

99118
// RUN: not %clang -### -c --target=aarch64-linux -mabi=pauthtest -mbranch-protection=standard %s 2>&1 | \
100-
// RUN: FileCheck %s --check-prefix=ERR6
119+
// RUN: FileCheck %s --check-prefix=ERR7
101120
// RUN: not %clang -### -c --target=aarch64-linux-pauthtest -mbranch-protection=standard %s 2>&1 | \
102-
// RUN: FileCheck %s --check-prefix=ERR6
103-
// ERR6: error: unsupported option '-mbranch-protection=standard' for target 'aarch64-unknown-linux-pauthtest'
121+
// RUN: FileCheck %s --check-prefix=ERR7
122+
// ERR7: error: unsupported option '-mbranch-protection=standard' for target 'aarch64-unknown-linux-pauthtest'
104123

105124
// RUN: not %clang -### -c --target=aarch64-linux -mabi=pauthtest -msign-return-address=all %s 2>&1 | \
106-
// RUN: FileCheck %s --check-prefix=ERR7
125+
// RUN: FileCheck %s --check-prefix=ERR8
107126
// RUN: not %clang -### -c --target=aarch64-linux-pauthtest -msign-return-address=all %s 2>&1 | \
108-
// RUN: FileCheck %s --check-prefix=ERR7
109-
// ERR7: error: unsupported option '-msign-return-address=all' for target 'aarch64-unknown-linux-pauthtest'
127+
// RUN: FileCheck %s --check-prefix=ERR8
128+
// ERR8: error: unsupported option '-msign-return-address=all' for target 'aarch64-unknown-linux-pauthtest'
110129

111130
// RUN: not %clang -### -c --target=aarch64-linux -mabi=pauthtest -msign-return-address=non-leaf %s 2>&1 | \
112-
// RUN: FileCheck %s --check-prefix=ERR8
131+
// RUN: FileCheck %s --check-prefix=ERR9
113132
// RUN: not %clang -### -c --target=aarch64-linux-pauthtest -msign-return-address=non-leaf %s 2>&1 | \
114-
// RUN: FileCheck %s --check-prefix=ERR8
115-
// ERR8: error: unsupported option '-msign-return-address=non-leaf' for target 'aarch64-unknown-linux-pauthtest'
133+
// RUN: FileCheck %s --check-prefix=ERR9
134+
// ERR9: error: unsupported option '-msign-return-address=non-leaf' for target 'aarch64-unknown-linux-pauthtest'
116135

117136
// RUN: %clang -### -c --target=aarch64-linux -mabi=pauthtest -msign-return-address=none %s
118137
// RUN: %clang -### -c --target=aarch64-linux-pauthtest -msign-return-address=none %s

0 commit comments

Comments
 (0)