Skip to content

Commit 993c564

Browse files
ojhuntllvmbot
authored andcommitted
[clang][PAC][darwin] Set correct default ptrauth features for arm64e-darwin (llvm#153722)
This PR makes sure that when targeting arm64e on darwin platforms the correct flags are set for the userspace platform ABI. (cherry picked from commit 19c4e86)
1 parent 41cf773 commit 993c564

File tree

4 files changed

+57
-22
lines changed

4 files changed

+57
-22
lines changed

clang/include/clang/Basic/Features.def

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -163,7 +163,7 @@ FEATURE(ptrauth_elf_got, LangOpts.PointerAuthELFGOT)
163163

164164
FEATURE(ptrauth_objc_isa, LangOpts.PointerAuthObjcIsa)
165165
FEATURE(ptrauth_objc_interface_sel, LangOpts.PointerAuthObjcInterfaceSel)
166-
FEATURE(ptrauth_objc_signable_class, true)
166+
FEATURE(ptrauth_objc_signable_class, LangOpts.PointerAuthIntrinsics)
167167
FEATURE(ptrauth_objc_method_list_pointer, LangOpts.PointerAuthCalls)
168168

169169
EXTENSION(swiftcc,

clang/lib/Driver/ToolChains/Darwin.cpp

Lines changed: 28 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3187,28 +3187,46 @@ void MachO::addClangTargetOptions(const llvm::opt::ArgList &DriverArgs,
31873187

31883188
ToolChain::addClangTargetOptions(DriverArgs, CC1Args, DeviceOffloadKind);
31893189

3190-
// On arm64e, enable pointer authentication (for the return address and
3191-
// indirect calls), as well as usage of the intrinsics.
3192-
if (getArchName() == "arm64e") {
3190+
// On arm64e, we enable all the features required for the Darwin userspace
3191+
// ABI
3192+
if (getTriple().isArm64e()) {
3193+
// Core platform ABI
3194+
if (!DriverArgs.hasArg(options::OPT_fptrauth_calls,
3195+
options::OPT_fno_ptrauth_calls))
3196+
CC1Args.push_back("-fptrauth-calls");
31933197
if (!DriverArgs.hasArg(options::OPT_fptrauth_returns,
31943198
options::OPT_fno_ptrauth_returns))
31953199
CC1Args.push_back("-fptrauth-returns");
3196-
31973200
if (!DriverArgs.hasArg(options::OPT_fptrauth_intrinsics,
31983201
options::OPT_fno_ptrauth_intrinsics))
31993202
CC1Args.push_back("-fptrauth-intrinsics");
3200-
3201-
if (!DriverArgs.hasArg(options::OPT_fptrauth_calls,
3202-
options::OPT_fno_ptrauth_calls))
3203-
CC1Args.push_back("-fptrauth-calls");
3204-
32053203
if (!DriverArgs.hasArg(options::OPT_fptrauth_indirect_gotos,
32063204
options::OPT_fno_ptrauth_indirect_gotos))
32073205
CC1Args.push_back("-fptrauth-indirect-gotos");
3208-
32093206
if (!DriverArgs.hasArg(options::OPT_fptrauth_auth_traps,
32103207
options::OPT_fno_ptrauth_auth_traps))
32113208
CC1Args.push_back("-fptrauth-auth-traps");
3209+
3210+
// C++ v-table ABI
3211+
if (!DriverArgs.hasArg(
3212+
options::OPT_fptrauth_vtable_pointer_address_discrimination,
3213+
options::OPT_fno_ptrauth_vtable_pointer_address_discrimination))
3214+
CC1Args.push_back("-fptrauth-vtable-pointer-address-discrimination");
3215+
if (!DriverArgs.hasArg(
3216+
options::OPT_fptrauth_vtable_pointer_type_discrimination,
3217+
options::OPT_fno_ptrauth_vtable_pointer_type_discrimination))
3218+
CC1Args.push_back("-fptrauth-vtable-pointer-type-discrimination");
3219+
3220+
// Objective-C ABI
3221+
if (!DriverArgs.hasArg(options::OPT_fptrauth_objc_isa,
3222+
options::OPT_fno_ptrauth_objc_isa))
3223+
CC1Args.push_back("-fptrauth-objc-isa");
3224+
if (!DriverArgs.hasArg(options::OPT_fptrauth_objc_class_ro,
3225+
options::OPT_fno_ptrauth_objc_class_ro))
3226+
CC1Args.push_back("-fptrauth-objc-class-ro");
3227+
if (!DriverArgs.hasArg(options::OPT_fptrauth_objc_interface_sel,
3228+
options::OPT_fno_ptrauth_objc_interface_sel))
3229+
CC1Args.push_back("-fptrauth-objc-interface-sel");
32123230
}
32133231
}
32143232

clang/test/Driver/arch-arm64e.c

Lines changed: 20 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,20 @@
22

33
// RUN: %clang -target arm64-apple-darwin -c %s -### 2>&1 | FileCheck %s --check-prefix NONE
44
// NONE: "-cc1"
5-
// NONE-NOT: "-fptrauth-intrinsics"
5+
66
// NONE-NOT: "-fptrauth-calls"
77
// NONE-NOT: "-fptrauth-returns"
8+
// NONE-NOT: "-fptrauth-intrinsics"
89
// NONE-NOT: "-fptrauth-indirect-gotos"
910
// NONE-NOT: "-fptrauth-auth-traps"
11+
// NONE-NOT: "-fptrauth-vtable-pointer-address-discrimination"
12+
// NONE-NOT: "-fptrauth-vtable-pointer-type-discrimination"
13+
// NONE-NOT: "-fptrauth-objc-isa"
14+
// NONE-NOT: "-fptrauth-objc-class-ro"
15+
// NONE-NOT: "-fptrauth-objc-interface-sel"
16+
17+
// Final catch all if any new flags are added
18+
// NONE-NOT: "-fptrauth"
1019

1120
// RUN: %clang -target arm64-apple-darwin -fptrauth-calls -c %s -### 2>&1 | FileCheck %s --check-prefix CALL
1221
// CALL: "-cc1"{{.*}} {{.*}} "-fptrauth-calls"
@@ -23,39 +32,39 @@
2332
// RUN: %clang -target arm64-apple-darwin -fptrauth-auth-traps -c %s -### 2>&1 | FileCheck %s --check-prefix TRAPS
2433
// TRAPS: "-cc1"{{.*}} {{.*}} "-fptrauth-auth-traps"
2534

26-
2735
// Check the arm64e defaults.
2836

2937
// RUN: %clang -target arm64e-apple-ios -c %s -### 2>&1 | FileCheck %s --check-prefix DEFAULT
38+
// RUN: %clang -target arm64e-apple-macos -c %s -### 2>&1 | FileCheck %s --check-prefix DEFAULTMAC
39+
// RUN: %if system-darwin && target={{.*}}-{{darwin|macos}}{{.*}} %{ %clang -target arm64e-apple-macos -c %s -### 2>&1 | FileCheck %s --check-prefix DEFAULTARCH %}
3040
// RUN: %clang -mkernel -target arm64e-apple-ios -c %s -### 2>&1 | FileCheck %s --check-prefix DEFAULT
3141
// RUN: %clang -fapple-kext -target arm64e-apple-ios -c %s -### 2>&1 | FileCheck %s --check-prefix DEFAULT
32-
// DEFAULT: "-fptrauth-returns" "-fptrauth-intrinsics" "-fptrauth-calls" "-fptrauth-indirect-gotos" "-fptrauth-auth-traps" {{.*}}"-target-cpu" "apple-a12"{{.*}}
42+
// DEFAULT: "-fptrauth-calls" "-fptrauth-returns" "-fptrauth-intrinsics" "-fptrauth-indirect-gotos" "-fptrauth-auth-traps" "-fptrauth-vtable-pointer-address-discrimination" "-fptrauth-vtable-pointer-type-discrimination" "-fptrauth-objc-isa" "-fptrauth-objc-class-ro" "-fptrauth-objc-interface-sel" {{.*}}"-target-cpu" "apple-a12"{{.*}}
43+
// DEFAULTMAC: "-fptrauth-calls" "-fptrauth-returns" "-fptrauth-intrinsics" "-fptrauth-indirect-gotos" "-fptrauth-auth-traps" "-fptrauth-vtable-pointer-address-discrimination" "-fptrauth-vtable-pointer-type-discrimination" "-fptrauth-objc-isa" "-fptrauth-objc-class-ro" "-fptrauth-objc-interface-sel" {{.*}}"-target-cpu" "apple-m1"{{.*}}
44+
// DEFAULTARCH: "-fptrauth-calls" "-fptrauth-returns" "-fptrauth-intrinsics" "-fptrauth-indirect-gotos" "-fptrauth-auth-traps" "-fptrauth-vtable-pointer-address-discrimination" "-fptrauth-vtable-pointer-type-discrimination" "-fptrauth-objc-isa" "-fptrauth-objc-class-ro" "-fptrauth-objc-interface-sel"
3345

3446
// RUN: %clang -target arm64e-apple-none-macho -c %s -### 2>&1 | FileCheck %s --check-prefix DEFAULT-MACHO
35-
// DEFAULT-MACHO: "-fptrauth-returns" "-fptrauth-intrinsics" "-fptrauth-calls" "-fptrauth-indirect-gotos" "-fptrauth-auth-traps" {{.*}}"-target-cpu" "apple-a12"{{.*}}
47+
// DEFAULT-MACHO: "-fptrauth-calls" "-fptrauth-returns" "-fptrauth-intrinsics" "-fptrauth-indirect-gotos" "-fptrauth-auth-traps" "-fptrauth-vtable-pointer-address-discrimination" "-fptrauth-vtable-pointer-type-discrimination" "-fptrauth-objc-isa" "-fptrauth-objc-class-ro" "-fptrauth-objc-interface-sel" {{.*}}"-target-cpu" "apple-a12"{{.*}}
3648

3749

3850
// RUN: %clang -target arm64e-apple-ios -fno-ptrauth-calls -c %s -### 2>&1 | FileCheck %s --check-prefix DEFAULT-NOCALL
39-
// RUN: %clang -mkernel -target arm64e-apple-ios -fno-ptrauth-calls -c %s -### 2>&1 | FileCheck %s --check-prefix DEFAULT-NOCALL
40-
// RUN: %clang -fapple-kext -target arm64e-apple-ios -fno-ptrauth-calls -c %s -### 2>&1 | FileCheck %s --check-prefix DEFAULT-NOCALL
4151
// DEFAULT-NOCALL-NOT: "-fptrauth-calls"
42-
// DEFAULT-NOCALL: "-fptrauth-returns" "-fptrauth-intrinsics" "-fptrauth-indirect-gotos" "-fptrauth-auth-traps" {{.*}}"-target-cpu" "apple-a12"
52+
// DEFAULT-NOCALL: "-fptrauth-returns" "-fptrauth-intrinsics" "-fptrauth-indirect-gotos" "-fptrauth-auth-traps" "-fptrauth-vtable-pointer-address-discrimination" "-fptrauth-vtable-pointer-type-discrimination" "-fptrauth-objc-isa" "-fptrauth-objc-class-ro" "-fptrauth-objc-interface-sel" {{.*}}"-target-cpu" "apple-a12"
4353

4454

4555
// RUN: %clang -target arm64e-apple-ios -fno-ptrauth-returns -c %s -### 2>&1 | FileCheck %s --check-prefix NORET
4656

4757
// NORET-NOT: "-fptrauth-returns"
48-
// NORET: "-fptrauth-intrinsics" "-fptrauth-calls" "-fptrauth-indirect-gotos" "-fptrauth-auth-traps" {{.*}}"-target-cpu" "apple-a12"
58+
// NORET: "-fptrauth-calls" "-fptrauth-intrinsics" "-fptrauth-indirect-gotos" "-fptrauth-auth-traps" "-fptrauth-vtable-pointer-address-discrimination" "-fptrauth-vtable-pointer-type-discrimination" "-fptrauth-objc-isa" "-fptrauth-objc-class-ro" "-fptrauth-objc-interface-sel" {{.*}}"-target-cpu" "apple-a12"
4959

5060
// RUN: %clang -target arm64e-apple-ios -fno-ptrauth-intrinsics -c %s -### 2>&1 | FileCheck %s --check-prefix NOINTRIN
5161

52-
// NOINTRIN: "-fptrauth-returns"
5362
// NOINTRIN-NOT: "-fptrauth-intrinsics"
54-
// NOINTRIN: "-fptrauth-calls" "-fptrauth-indirect-gotos" "-fptrauth-auth-traps" {{.*}}"-target-cpu" "apple-a12"{{.*}}
63+
// NOINTRIN: "-fptrauth-calls" "-fptrauth-returns" "-fptrauth-indirect-gotos" "-fptrauth-auth-traps" "-fptrauth-vtable-pointer-address-discrimination" "-fptrauth-vtable-pointer-type-discrimination" "-fptrauth-objc-isa" "-fptrauth-objc-class-ro" "-fptrauth-objc-interface-sel" {{.*}}"-target-cpu" "apple-a12"
5564

5665

5766
// RUN: %clang -target arm64e-apple-ios -fno-ptrauth-auth-traps -c %s -### 2>&1 | FileCheck %s --check-prefix NOTRAP
58-
// NOTRAP: "-fptrauth-returns" "-fptrauth-intrinsics" "-fptrauth-calls" "-fptrauth-indirect-gotos" {{.*}}"-target-cpu" "apple-a12"
67+
// NOTRAP: "-fptrauth-calls" "-fptrauth-returns" "-fptrauth-intrinsics" "-fptrauth-indirect-gotos" "-fptrauth-vtable-pointer-address-discrimination" "-fptrauth-vtable-pointer-type-discrimination" "-fptrauth-objc-isa" "-fptrauth-objc-class-ro" "-fptrauth-objc-interface-sel" {{.*}}"-target-cpu" "apple-a12"
5968

6069

6170
// Check the CPU defaults and overrides.

clang/test/Preprocessor/ptrauth_feature.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,3 +130,11 @@ void has_ptrauth_elf_got() {}
130130
// NOELFGOT: no_ptrauth_elf_got
131131
void no_ptrauth_elf_got() {}
132132
#endif
133+
134+
#if __has_feature(ptrauth_objc_signable_class)
135+
// INTRIN: has_ptrauth_objc_signable_class
136+
void has_ptrauth_objc_signable_class(){}
137+
#else
138+
// NOINTRIN: no_ptrauth_objc_signable_class
139+
void no_ptrauth_objc_signable_class(){}
140+
#endif

0 commit comments

Comments
 (0)