Skip to content

Commit d293c86

Browse files
committed
For pauthtest ABI, allow ptrauth driver flags
1 parent f435790 commit d293c86

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
@@ -494,28 +494,108 @@ std::string Linux::ComputeEffectiveClangTriple(const llvm::opt::ArgList &Args,
494494
// options represent the default signing schema.
495495
static void handlePAuthABI(const Driver &D, const ArgList &DriverArgs,
496496
ArgStringList &CC1Args) {
497-
CC1Args.push_back("-fptrauth-intrinsics");
498-
CC1Args.push_back("-fptrauth-calls");
499-
CC1Args.push_back("-fptrauth-returns");
500-
CC1Args.push_back("-fptrauth-auth-traps");
501-
CC1Args.push_back("-fptrauth-vtable-pointer-address-discrimination");
502-
CC1Args.push_back("-fptrauth-vtable-pointer-type-discrimination");
503-
CC1Args.push_back("-fptrauth-type-info-vtable-pointer-discrimination");
504-
CC1Args.push_back("-fptrauth-indirect-gotos");
505-
CC1Args.push_back("-fptrauth-init-fini");
506-
CC1Args.push_back("-fptrauth-init-fini-address-discrimination");
497+
if (!DriverArgs.hasArg(options::OPT_fptrauth_intrinsics,
498+
options::OPT_fno_ptrauth_intrinsics))
499+
CC1Args.push_back("-fptrauth-intrinsics");
500+
501+
if (!DriverArgs.hasArg(options::OPT_fptrauth_calls,
502+
options::OPT_fno_ptrauth_calls))
503+
CC1Args.push_back("-fptrauth-calls");
504+
505+
if (!DriverArgs.hasArg(options::OPT_fptrauth_returns,
506+
options::OPT_fno_ptrauth_returns))
507+
CC1Args.push_back("-fptrauth-returns");
508+
509+
if (!DriverArgs.hasArg(options::OPT_fptrauth_auth_traps,
510+
options::OPT_fno_ptrauth_auth_traps))
511+
CC1Args.push_back("-fptrauth-auth-traps");
512+
513+
if (!DriverArgs.hasArg(
514+
options::OPT_fptrauth_vtable_pointer_address_discrimination,
515+
options::OPT_fno_ptrauth_vtable_pointer_address_discrimination))
516+
CC1Args.push_back("-fptrauth-vtable-pointer-address-discrimination");
517+
518+
if (!DriverArgs.hasArg(
519+
options::OPT_fptrauth_vtable_pointer_type_discrimination,
520+
options::OPT_fno_ptrauth_vtable_pointer_type_discrimination))
521+
CC1Args.push_back("-fptrauth-vtable-pointer-type-discrimination");
522+
523+
if (!DriverArgs.hasArg(
524+
options::OPT_fptrauth_type_info_vtable_pointer_discrimination,
525+
options::OPT_fno_ptrauth_type_info_vtable_pointer_discrimination))
526+
CC1Args.push_back("-fptrauth-type-info-vtable-pointer-discrimination");
527+
528+
if (!DriverArgs.hasArg(options::OPT_fptrauth_indirect_gotos,
529+
options::OPT_fno_ptrauth_indirect_gotos))
530+
CC1Args.push_back("-fptrauth-indirect-gotos");
531+
532+
if (!DriverArgs.hasArg(options::OPT_fptrauth_init_fini,
533+
options::OPT_fno_ptrauth_init_fini))
534+
CC1Args.push_back("-fptrauth-init-fini");
535+
536+
if (!DriverArgs.hasArg(
537+
options::OPT_fptrauth_init_fini_address_discrimination,
538+
options::OPT_fno_ptrauth_init_fini_address_discrimination))
539+
CC1Args.push_back("-fptrauth-init-fini-address-discrimination");
507540

508541
if (!DriverArgs.hasArg(options::OPT_faarch64_jump_table_hardening,
509542
options::OPT_fno_aarch64_jump_table_hardening))
510543
CC1Args.push_back("-faarch64-jump-table-hardening");
511544
}
512545

546+
static void addPointerAuthFlags(const llvm::opt::ArgList &DriverArgs,
547+
llvm::opt::ArgStringList &CC1Args) {
548+
DriverArgs.addOptInFlag(CC1Args, options::OPT_fptrauth_intrinsics,
549+
options::OPT_fno_ptrauth_intrinsics);
550+
551+
DriverArgs.addOptInFlag(CC1Args, options::OPT_fptrauth_calls,
552+
options::OPT_fno_ptrauth_calls);
553+
554+
DriverArgs.addOptInFlag(CC1Args, options::OPT_fptrauth_returns,
555+
options::OPT_fno_ptrauth_returns);
556+
557+
DriverArgs.addOptInFlag(CC1Args, options::OPT_fptrauth_auth_traps,
558+
options::OPT_fno_ptrauth_auth_traps);
559+
560+
DriverArgs.addOptInFlag(
561+
CC1Args, options::OPT_fptrauth_vtable_pointer_address_discrimination,
562+
options::OPT_fno_ptrauth_vtable_pointer_address_discrimination);
563+
564+
DriverArgs.addOptInFlag(
565+
CC1Args, options::OPT_fptrauth_vtable_pointer_type_discrimination,
566+
options::OPT_fno_ptrauth_vtable_pointer_type_discrimination);
567+
568+
DriverArgs.addOptInFlag(
569+
CC1Args, options::OPT_fptrauth_type_info_vtable_pointer_discrimination,
570+
options::OPT_fno_ptrauth_type_info_vtable_pointer_discrimination);
571+
572+
DriverArgs.addOptInFlag(
573+
CC1Args, options::OPT_fptrauth_function_pointer_type_discrimination,
574+
options::OPT_fno_ptrauth_function_pointer_type_discrimination);
575+
576+
DriverArgs.addOptInFlag(CC1Args, options::OPT_fptrauth_indirect_gotos,
577+
options::OPT_fno_ptrauth_indirect_gotos);
578+
579+
DriverArgs.addOptInFlag(CC1Args, options::OPT_fptrauth_init_fini,
580+
options::OPT_fno_ptrauth_init_fini);
581+
582+
DriverArgs.addOptInFlag(
583+
CC1Args, options::OPT_fptrauth_init_fini_address_discrimination,
584+
options::OPT_fno_ptrauth_init_fini_address_discrimination);
585+
586+
DriverArgs.addOptInFlag(CC1Args, options::OPT_fptrauth_elf_got,
587+
options::OPT_fno_ptrauth_elf_got);
588+
}
589+
513590
void Linux::addClangTargetOptions(const llvm::opt::ArgList &DriverArgs,
514591
llvm::opt::ArgStringList &CC1Args,
515592
Action::OffloadKind DeviceOffloadKind) const {
516593
llvm::Triple Triple(ComputeEffectiveClangTriple(DriverArgs));
517-
if (Triple.isAArch64() && Triple.getEnvironment() == llvm::Triple::PAuthTest)
594+
if (Triple.isAArch64() &&
595+
Triple.getEnvironment() == llvm::Triple::PAuthTest) {
596+
addPointerAuthFlags(DriverArgs, CC1Args);
518597
handlePAuthABI(getDriver(), DriverArgs, CC1Args);
598+
}
519599
Generic_ELF::addClangTargetOptions(DriverArgs, CC1Args, DeviceOffloadKind);
520600
}
521601

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)