Skip to content

Commit 515574c

Browse files
committed
For pauthtest ABI, allow ptrauth driver flags
1 parent 388b869 commit 515574c

File tree

2 files changed

+159
-42
lines changed

2 files changed

+159
-42
lines changed

clang/lib/Driver/ToolChains/Linux.cpp

Lines changed: 91 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -476,28 +476,108 @@ std::string Linux::ComputeEffectiveClangTriple(const llvm::opt::ArgList &Args,
476476
// options represent the default signing schema.
477477
static void handlePAuthABI(const Driver &D, const ArgList &DriverArgs,
478478
ArgStringList &CC1Args) {
479-
CC1Args.push_back("-fptrauth-intrinsics");
480-
CC1Args.push_back("-fptrauth-calls");
481-
CC1Args.push_back("-fptrauth-returns");
482-
CC1Args.push_back("-fptrauth-auth-traps");
483-
CC1Args.push_back("-fptrauth-vtable-pointer-address-discrimination");
484-
CC1Args.push_back("-fptrauth-vtable-pointer-type-discrimination");
485-
CC1Args.push_back("-fptrauth-type-info-vtable-pointer-discrimination");
486-
CC1Args.push_back("-fptrauth-indirect-gotos");
487-
CC1Args.push_back("-fptrauth-init-fini");
488-
CC1Args.push_back("-fptrauth-init-fini-address-discrimination");
479+
if (!DriverArgs.hasArg(options::OPT_fptrauth_intrinsics,
480+
options::OPT_fno_ptrauth_intrinsics))
481+
CC1Args.push_back("-fptrauth-intrinsics");
482+
483+
if (!DriverArgs.hasArg(options::OPT_fptrauth_calls,
484+
options::OPT_fno_ptrauth_calls))
485+
CC1Args.push_back("-fptrauth-calls");
486+
487+
if (!DriverArgs.hasArg(options::OPT_fptrauth_returns,
488+
options::OPT_fno_ptrauth_returns))
489+
CC1Args.push_back("-fptrauth-returns");
490+
491+
if (!DriverArgs.hasArg(options::OPT_fptrauth_auth_traps,
492+
options::OPT_fno_ptrauth_auth_traps))
493+
CC1Args.push_back("-fptrauth-auth-traps");
494+
495+
if (!DriverArgs.hasArg(
496+
options::OPT_fptrauth_vtable_pointer_address_discrimination,
497+
options::OPT_fno_ptrauth_vtable_pointer_address_discrimination))
498+
CC1Args.push_back("-fptrauth-vtable-pointer-address-discrimination");
499+
500+
if (!DriverArgs.hasArg(
501+
options::OPT_fptrauth_vtable_pointer_type_discrimination,
502+
options::OPT_fno_ptrauth_vtable_pointer_type_discrimination))
503+
CC1Args.push_back("-fptrauth-vtable-pointer-type-discrimination");
504+
505+
if (!DriverArgs.hasArg(
506+
options::OPT_fptrauth_type_info_vtable_pointer_discrimination,
507+
options::OPT_fno_ptrauth_type_info_vtable_pointer_discrimination))
508+
CC1Args.push_back("-fptrauth-type-info-vtable-pointer-discrimination");
509+
510+
if (!DriverArgs.hasArg(options::OPT_fptrauth_indirect_gotos,
511+
options::OPT_fno_ptrauth_indirect_gotos))
512+
CC1Args.push_back("-fptrauth-indirect-gotos");
513+
514+
if (!DriverArgs.hasArg(options::OPT_fptrauth_init_fini,
515+
options::OPT_fno_ptrauth_init_fini))
516+
CC1Args.push_back("-fptrauth-init-fini");
517+
518+
if (!DriverArgs.hasArg(
519+
options::OPT_fptrauth_init_fini_address_discrimination,
520+
options::OPT_fno_ptrauth_init_fini_address_discrimination))
521+
CC1Args.push_back("-fptrauth-init-fini-address-discrimination");
489522

490523
if (!DriverArgs.hasArg(options::OPT_faarch64_jump_table_hardening,
491524
options::OPT_fno_aarch64_jump_table_hardening))
492525
CC1Args.push_back("-faarch64-jump-table-hardening");
493526
}
494527

528+
static void addPointerAuthFlags(const llvm::opt::ArgList &DriverArgs,
529+
llvm::opt::ArgStringList &CC1Args) {
530+
DriverArgs.addOptInFlag(CC1Args, options::OPT_fptrauth_intrinsics,
531+
options::OPT_fno_ptrauth_intrinsics);
532+
533+
DriverArgs.addOptInFlag(CC1Args, options::OPT_fptrauth_calls,
534+
options::OPT_fno_ptrauth_calls);
535+
536+
DriverArgs.addOptInFlag(CC1Args, options::OPT_fptrauth_returns,
537+
options::OPT_fno_ptrauth_returns);
538+
539+
DriverArgs.addOptInFlag(CC1Args, options::OPT_fptrauth_auth_traps,
540+
options::OPT_fno_ptrauth_auth_traps);
541+
542+
DriverArgs.addOptInFlag(
543+
CC1Args, options::OPT_fptrauth_vtable_pointer_address_discrimination,
544+
options::OPT_fno_ptrauth_vtable_pointer_address_discrimination);
545+
546+
DriverArgs.addOptInFlag(
547+
CC1Args, options::OPT_fptrauth_vtable_pointer_type_discrimination,
548+
options::OPT_fno_ptrauth_vtable_pointer_type_discrimination);
549+
550+
DriverArgs.addOptInFlag(
551+
CC1Args, options::OPT_fptrauth_type_info_vtable_pointer_discrimination,
552+
options::OPT_fno_ptrauth_type_info_vtable_pointer_discrimination);
553+
554+
DriverArgs.addOptInFlag(
555+
CC1Args, options::OPT_fptrauth_function_pointer_type_discrimination,
556+
options::OPT_fno_ptrauth_function_pointer_type_discrimination);
557+
558+
DriverArgs.addOptInFlag(CC1Args, options::OPT_fptrauth_indirect_gotos,
559+
options::OPT_fno_ptrauth_indirect_gotos);
560+
561+
DriverArgs.addOptInFlag(CC1Args, options::OPT_fptrauth_init_fini,
562+
options::OPT_fno_ptrauth_init_fini);
563+
564+
DriverArgs.addOptInFlag(
565+
CC1Args, options::OPT_fptrauth_init_fini_address_discrimination,
566+
options::OPT_fno_ptrauth_init_fini_address_discrimination);
567+
568+
DriverArgs.addOptInFlag(CC1Args, options::OPT_fptrauth_elf_got,
569+
options::OPT_fno_ptrauth_elf_got);
570+
}
571+
495572
void Linux::addClangTargetOptions(const llvm::opt::ArgList &DriverArgs,
496573
llvm::opt::ArgStringList &CC1Args,
497574
Action::OffloadKind DeviceOffloadKind) const {
498575
llvm::Triple Triple(ComputeEffectiveClangTriple(DriverArgs));
499-
if (Triple.isAArch64() && Triple.getEnvironment() == llvm::Triple::PAuthTest)
576+
if (Triple.isAArch64() &&
577+
Triple.getEnvironment() == llvm::Triple::PAuthTest) {
578+
addPointerAuthFlags(DriverArgs, CC1Args);
500579
handlePAuthABI(getDriver(), DriverArgs, CC1Args);
580+
}
501581
Generic_ELF::addClangTargetOptions(DriverArgs, CC1Args, DeviceOffloadKind);
502582
}
503583

clang/test/Driver/aarch64-ptrauth.c

Lines changed: 68 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,37 @@
44
// NONE: "-cc1"
55
// NONE-NOT: "-fptrauth-
66

7+
//// -fptauth-* driver flags are only supported for pauthtest ABI
8+
// RUN: %clang -### -c --target=aarch64-linux -mabi=pauthtest \
9+
// RUN: -fno-ptrauth-intrinsics -fptrauth-intrinsics \
10+
// RUN: -fno-ptrauth-calls -fptrauth-calls \
11+
// RUN: -fno-ptrauth-returns -fptrauth-returns \
12+
// RUN: -fno-ptrauth-auth-traps -fptrauth-auth-traps \
13+
// RUN: -fno-ptrauth-vtable-pointer-address-discrimination -fptrauth-vtable-pointer-address-discrimination \
14+
// RUN: -fno-ptrauth-vtable-pointer-type-discrimination -fptrauth-vtable-pointer-type-discrimination \
15+
// RUN: -fno-ptrauth-type-info-vtable-pointer-discrimination -fptrauth-type-info-vtable-pointer-discrimination \
16+
// RUN: -fno-ptrauth-indirect-gotos -fptrauth-indirect-gotos \
17+
// RUN: -fno-ptrauth-init-fini -fptrauth-init-fini \
18+
// RUN: -fno-ptrauth-init-fini-address-discrimination -fptrauth-init-fini-address-discrimination \
19+
// RUN: -fno-ptrauth-elf-got -fptrauth-elf-got \
20+
// RUN: -fno-aarch64-jump-table-hardening -faarch64-jump-table-hardening \
21+
// RUN: %s 2>&1 | FileCheck %s --check-prefix=ALL-LINUX-PAUTHTEST
22+
// RUN: %clang -### -c --target=aarch64-linux-pauthtest \
23+
// RUN: -fno-ptrauth-intrinsics -fptrauth-intrinsics \
24+
// RUN: -fno-ptrauth-calls -fptrauth-calls \
25+
// RUN: -fno-ptrauth-returns -fptrauth-returns \
26+
// RUN: -fno-ptrauth-auth-traps -fptrauth-auth-traps \
27+
// RUN: -fno-ptrauth-vtable-pointer-address-discrimination -fptrauth-vtable-pointer-address-discrimination \
28+
// RUN: -fno-ptrauth-vtable-pointer-type-discrimination -fptrauth-vtable-pointer-type-discrimination \
29+
// RUN: -fno-ptrauth-type-info-vtable-pointer-discrimination -fptrauth-type-info-vtable-pointer-discrimination \
30+
// RUN: -fno-ptrauth-indirect-gotos -fptrauth-indirect-gotos \
31+
// RUN: -fno-ptrauth-init-fini -fptrauth-init-fini \
32+
// RUN: -fno-ptrauth-init-fini-address-discrimination -fptrauth-init-fini-address-discrimination \
33+
// RUN: -fno-ptrauth-elf-got -fptrauth-elf-got \
34+
// RUN: -fno-aarch64-jump-table-hardening -faarch64-jump-table-hardening \
35+
// RUN: %s 2>&1 | FileCheck %s --check-prefix=ALL-LINUX-PAUTHTEST
36+
// ALL-LINUX-PAUTHTEST: "-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" "-fptrauth-elf-got"{{.*}} "-faarch64-jump-table-hardening"
37+
738
// RUN: %clang -### -c --target=aarch64-linux \
839
// RUN: -fno-aarch64-jump-table-hardening -faarch64-jump-table-hardening \
940
// RUN: %s 2>&1 | FileCheck %s --check-prefix=ALL-LINUX
@@ -22,44 +53,47 @@
2253
// RUN: %s 2>&1 | FileCheck %s --check-prefix=ALL-DARWIN
2354
// ALL-DARWIN: "-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"{{.*}} "-faarch64-jump-table-hardening"
2455

25-
// RUN: %clang -### -c --target=aarch64-linux -mabi=pauthtest %s 2>&1 | FileCheck %s --check-prefix=PAUTHABI1
26-
// RUN: %clang -### -c --target=aarch64-linux-pauthtest %s 2>&1 | FileCheck %s --check-prefix=PAUTHABI1
27-
// PAUTHABI1: "-cc1"{{.*}} "-triple" "aarch64-unknown-linux-pauthtest"
28-
// PAUTHABI1-SAME: "-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"
29-
// PAUTHABI1-SAME: "-target-abi" "pauthtest"
30-
// PAUTHABI1-NOT: "-fptrauth-function-pointer-type-discrimination"
31-
32-
// RUN: %clang -### -c --target=aarch64-linux -mabi=pauthtest \
33-
// RUN: -fno-aarch64-jump-table-hardening %s 2>&1 | FileCheck %s --check-prefix=PAUTHABI2
34-
// RUN: %clang -### -c --target=aarch64-linux-pauthtest \
35-
// RUN: -fno-aarch64-jump-table-hardening %s 2>&1 | FileCheck %s --check-prefix=PAUTHABI2
56+
// RUN: %clang -### -c --target=aarch64-linux -mabi=pauthtest %s 2>&1 | FileCheck %s --check-prefix=PAUTHTEST1
57+
// RUN: %clang -### -c --target=aarch64-linux-pauthtest %s 2>&1 | FileCheck %s --check-prefix=PAUTHTEST1
58+
// PAUTHTEST1: "-cc1"{{.*}} "-triple" "aarch64-unknown-linux-pauthtest"
59+
// PAUTHTEST1-SAME: "-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"
60+
// PAUTHTEST1-SAME: "-target-abi" "pauthtest"
61+
// PAUTHTEST1-NOT: "-fptrauth-function-pointer-type-discrimination"
62+
63+
// RUN: %clang -### -c --target=aarch64-linux -mabi=pauthtest -fno-ptrauth-intrinsics \
64+
// RUN: -fno-ptrauth-calls -fno-ptrauth-returns -fno-ptrauth-auth-traps \
65+
// RUN: -fno-ptrauth-vtable-pointer-address-discrimination -fno-ptrauth-vtable-pointer-type-discrimination \
66+
// RUN: -fno-ptrauth-type-info-vtable-pointer-discrimination -fno-ptrauth-indirect-gotos \
67+
// RUN: -fno-ptrauth-init-fini -fno-ptrauth-init-fini-address-discrimination \
68+
// RUN: -fno-aarch64-jump-table-hardening %s 2>&1 | FileCheck %s --check-prefix=PAUTHTEST2
69+
// RUN: %clang -### -c --target=aarch64-linux-pauthtest -fno-ptrauth-intrinsics \
70+
// RUN: -fno-ptrauth-calls -fno-ptrauth-returns -fno-ptrauth-auth-traps \
71+
// RUN: -fno-ptrauth-vtable-pointer-address-discrimination -fno-ptrauth-vtable-pointer-type-discrimination \
72+
// RUN: -fno-ptrauth-type-info-vtable-pointer-discrimination -fno-ptrauth-indirect-gotos \
73+
// RUN: -fno-ptrauth-init-fini -fno-ptrauth-init-fini-address-discrimination \
74+
// RUN: -fno-aarch64-jump-table-hardening %s 2>&1 | FileCheck %s --check-prefix=PAUTHTEST2
3675

3776
//// Non-linux OS: pauthtest ABI has no effect in terms of passing ptrauth cc1 flags.
3877
//// An error about unsupported ABI will be emitted later in pipeline (see ERR3 below)
39-
// RUN: %clang -### -c --target=aarch64 -mabi=pauthtest %s 2>&1 | FileCheck %s --check-prefixes=PAUTHABI2,PAUTHABI3
78+
// RUN: %clang -### -c --target=aarch64 -mabi=pauthtest %s 2>&1 | FileCheck %s --check-prefixes=PAUTHTEST2
4079

41-
// PAUTHABI2: "-cc1"
42-
// PAUTHABI2-SAME: "-target-abi" "pauthtest"
43-
// PAUTHABI3-NOT: "-fptrauth-
44-
// PAUTHABI2-NOT: "-faarch64-jump-table-hardening"
80+
// PAUTHTEST2: "-cc1"
81+
// PAUTHTEST2-SAME: "-target-abi" "pauthtest"
82+
// PAUTHTEST2-NOT: "-fptrauth-
83+
// PAUTHTEST2-NOT: "-faarch64-jump-table-hardening"
4584

4685
//// Non-linux OS: pauthtest environment does not correspond to pauthtest ABI; aapcs is the default.
47-
// RUN: %clang -### -c --target=aarch64-pauthtest %s 2>&1 | FileCheck %s --check-prefix=PAUTHABI4
48-
// PAUTHABI4: "-cc1"
49-
// PAUTHABI4-SAME: "-target-abi" "aapcs"
50-
// PAUTHABI4-NOT: "-fptrauth-
51-
// PAUTHABI4-NOT: "-faarch64-jump-table-hardening"
52-
53-
//// Non-AArch64.
54-
// RUN: not %clang -### -c --target=x86_64-linux -fptrauth-intrinsics -fptrauth-calls -fptrauth-returns -fptrauth-auth-traps \
86+
// RUN: %clang -### -c --target=aarch64-pauthtest %s 2>&1 | FileCheck %s --check-prefix=PAUTHTEST3
87+
// PAUTHTEST3: "-cc1"
88+
// PAUTHTEST3-SAME: "-target-abi" "aapcs"
89+
// PAUTHTEST3-NOT: "-fptrauth-
90+
// PAUTHTEST3-NOT: "-faarch64-jump-table-hardening"
91+
92+
//// Non-pauthtest ABI.
93+
// RUN: not %clang -### -c --target=aarch64-linux -fptrauth-intrinsics -fptrauth-calls -fptrauth-returns -fptrauth-auth-traps \
5594
// RUN: -fptrauth-vtable-pointer-address-discrimination -fptrauth-vtable-pointer-type-discrimination \
5695
// RUN: -fptrauth-type-info-vtable-pointer-discrimination -fptrauth-indirect-gotos -fptrauth-init-fini \
57-
// RUN: -fptrauth-init-fini-address-discrimination -faarch64-jump-table-hardening %s 2>&1 | FileCheck %s --check-prefixes=ERR1,ERR2
58-
//// Non-linux and non-Darwin OS.
59-
// RUN: not %clang -### -c --target=aarch64 -fptrauth-intrinsics -fptrauth-calls -fptrauth-returns -fptrauth-auth-traps \
60-
// RUN: -fptrauth-vtable-pointer-address-discrimination -fptrauth-vtable-pointer-type-discrimination \
61-
// RUN: -fptrauth-type-info-vtable-pointer-discrimination -fptrauth-indirect-gotos -fptrauth-init-fini \
62-
// RUN: -fptrauth-init-fini-address-discrimination -faarch64-jump-table-hardening %s 2>&1 | FileCheck %s --check-prefix=ERR1
96+
// RUN: -fptrauth-init-fini-address-discrimination -fptrauth-elf-got %s 2>&1 | FileCheck %s --check-prefix=ERR1
6397
// ERR1: error: unsupported option '-fptrauth-intrinsics' for target '{{.*}}'
6498
// ERR1-NEXT: error: unsupported option '-fptrauth-calls' for target '{{.*}}'
6599
// ERR1-NEXT: error: unsupported option '-fptrauth-returns' for target '{{.*}}'
@@ -70,8 +104,11 @@
70104
// ERR1-NEXT: error: unsupported option '-fptrauth-indirect-gotos' for target '{{.*}}'
71105
// ERR1-NEXT: error: unsupported option '-fptrauth-init-fini' for target '{{.*}}'
72106
// ERR1-NEXT: error: unsupported option '-fptrauth-init-fini-address-discrimination' for target '{{.*}}'
73-
// ERR2-NEXT: error: unsupported option '-faarch64-jump-table-hardening' for target '{{.*}}'
107+
// ERR1-NEXT: error: unsupported option '-fptrauth-elf-got' for target '{{.*}}'
74108

109+
//// Non-AArch64.
110+
// RUN: not %clang -### -c --target=x86_64-linux -faarch64-jump-table-hardening %s 2>&1 | FileCheck %s --check-prefixes=ERR2
111+
// ERR2: error: unsupported option '-faarch64-jump-table-hardening' for target '{{.*}}'
75112

76113
// RUN: not %clang -c --target=aarch64 -mabi=pauthtest %s 2>&1 | FileCheck %s --check-prefix=ERR3
77114
//// The ABI is not specified explicitly, and for non-Linux pauthtest environment does not correspond

0 commit comments

Comments
 (0)