Skip to content

Commit 0cbb084

Browse files
committed
[clang][PAC][darwin] Set correct default ptrauth features for arm64e-darwin
This PR makes sure that when targeting arm64e on darwin platforms the correct flags are set for the userspace platform ABI.
1 parent 0f64ec8 commit 0cbb084

File tree

4 files changed

+164
-1
lines changed

4 files changed

+164
-1
lines changed

clang/include/clang/Basic/Features.def

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

165165
FEATURE(ptrauth_objc_isa, LangOpts.PointerAuthObjcIsa)
166166
FEATURE(ptrauth_objc_interface_sel, LangOpts.PointerAuthObjcInterfaceSel)
167-
FEATURE(ptrauth_objc_signable_class, true)
167+
FEATURE(ptrauth_objc_signable_class, LangOpts.PointerAuthCalls || LangOpts.PointerAuthIntrinsics)
168168
FEATURE(ptrauth_objc_method_list_pointer, LangOpts.PointerAuthCalls)
169169

170170
EXTENSION(swiftcc,

clang/lib/Driver/ToolChains/Darwin.cpp

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3291,6 +3291,39 @@ void Darwin::addClangTargetOptions(
32913291
if (!RequiresSubdirectorySearch)
32923292
CC1Args.push_back("-fno-modulemap-allow-subdirectory-search");
32933293
}
3294+
3295+
if (getTriple().isArm64e()) {
3296+
auto EnsureDefaultPtrauthFlag = [&](OptSpecifier Pos, OptSpecifier Neg) {
3297+
assert(Pos != Neg);
3298+
if (const Arg *Opt = DriverArgs.getLastArg(Pos, Neg);
3299+
Opt && Opt->getOption().matches(Neg))
3300+
return;
3301+
Option PosOpt = getDriverOptTable().getOption(Pos);
3302+
CC1Args.push_back(PosOpt.getPrefixedName().data());
3303+
};
3304+
EnsureDefaultPtrauthFlag(options::OPT_fptrauth_calls,
3305+
options::OPT_fno_ptrauth_calls);
3306+
EnsureDefaultPtrauthFlag(options::OPT_fptrauth_returns,
3307+
options::OPT_fno_ptrauth_returns);
3308+
EnsureDefaultPtrauthFlag(options::OPT_fptrauth_intrinsics,
3309+
options::OPT_fno_ptrauth_intrinsics);
3310+
EnsureDefaultPtrauthFlag(options::OPT_fptrauth_indirect_gotos,
3311+
options::OPT_fno_ptrauth_indirect_gotos);
3312+
EnsureDefaultPtrauthFlag(options::OPT_fptrauth_auth_traps,
3313+
options::OPT_fno_ptrauth_auth_traps);
3314+
EnsureDefaultPtrauthFlag(
3315+
options::OPT_fptrauth_vtable_pointer_address_discrimination,
3316+
options::OPT_fno_ptrauth_vtable_pointer_address_discrimination);
3317+
EnsureDefaultPtrauthFlag(
3318+
options::OPT_fptrauth_vtable_pointer_type_discrimination,
3319+
options::OPT_fno_ptrauth_vtable_pointer_type_discrimination);
3320+
EnsureDefaultPtrauthFlag(options::OPT_fptrauth_objc_isa,
3321+
options::OPT_fno_ptrauth_objc_isa);
3322+
EnsureDefaultPtrauthFlag(options::OPT_fptrauth_objc_class_ro,
3323+
options::OPT_fno_ptrauth_objc_class_ro);
3324+
EnsureDefaultPtrauthFlag(options::OPT_fptrauth_objc_interface_sel,
3325+
options::OPT_fno_ptrauth_objc_interface_sel);
3326+
}
32943327
}
32953328

32963329
void Darwin::addClangCC1ASTargetOptions(
Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
// RUN: %clang -target arm64 -DNO_DEFAULT_PTRAUTH %s -fsyntax-only -Xclang -verify=no_default_ptrauth
2+
// RUN: %clang -target arm64-apple-macosx -DNO_DEFAULT_PTRAUTH %s -fsyntax-only -Xclang -verify=no_default_ptrauth
3+
// RUN: %clang -target arm64-darwin -DNO_DEFAULT_PTRAUTH %s -fsyntax-only -Xclang -verify=no_default_ptrauth
4+
// RUN: %clang -target arm64-apple-darwin -DNO_DEFAULT_PTRAUTH %s -fsyntax-only -Xclang -verify=no_default_ptrauth
5+
// RUN: %clang -target arm64-apple-ios-macabi -DNO_DEFAULT_PTRAUTH %s -fsyntax-only -Xclang -verify=no_default_ptrauth
6+
// RUN: %clang -target arm64-linux-gnu -DNO_DEFAULT_PTRAUTH %s -fsyntax-only -Xclang -verify=no_default_ptrauth
7+
// RUN: %clang -target arm64e-linux-gnu -DNO_DEFAULT_PTRAUTH %s -fsyntax-only -Xclang -verify=no_default_ptrauth
8+
// RUN: %clang -target aarch64-linux-gnu -DNO_DEFAULT_PTRAUTH %s -fsyntax-only -Xclang -verify=no_default_ptrauth
9+
// RUN: %clang -target arm64e-apple-macosx -DDARWIN_DEFAULT_PTRAUTH %s -fsyntax-only -Xclang -verify=darwin_ptrauth_defaults
10+
// RUN: %clang -target arm64e-apple-ios -DDARWIN_DEFAULT_PTRAUTH %s -fsyntax-only -Xclang -verify=darwin_ptrauth_defaults
11+
// RUN: %clang -target arm64e-darwin -DDARWIN_DEFAULT_PTRAUTH %s -fsyntax-only -Xclang -verify=darwin_ptrauth_defaults
12+
// RUN: %clang -target arm64e-apple-darwin -DDARWIN_DEFAULT_PTRAUTH %s -fsyntax-only -Xclang -verify=darwin_ptrauth_defaults
13+
// RUN: %clang -target arm64e-apple-ios-macabi -DDARWIN_DEFAULT_PTRAUTH %s -fsyntax-only -Xclang -verify=darwin_ptrauth_defaults
14+
15+
// A simple test case to test basic override logic
16+
// RUN: %clang -target arm64e-apple-macosx -DDARWIN_DEFAULT_PTRAUTH_OVERRIDE -fno-ptrauth-calls %s -fsyntax-only -Xclang -verify=darwin_ptrauth_override
17+
18+
#define ASSERT_MODE_AND_KIND(feature, enabled, kind) \
19+
_Static_assert(enabled == __has_##kind(feature), \
20+
"Expected to have the " #feature " " #kind " enabled");
21+
22+
#define ASSERT_FEATURE_ENABLED(feature_name) \
23+
ASSERT_MODE_AND_KIND(feature_name, 1, feature)
24+
#define ASSERT_FEATURE_DISABLED(feature_name) \
25+
ASSERT_MODE_AND_KIND(feature_name, 0, feature)
26+
#define ASSERT_EXTENSION_ENABLED(extension_name) \
27+
ASSERT_MODE_AND_KIND(extension_name, 1, extension)
28+
#define ASSERT_EXTENSION_DISABLED(extension_name) \
29+
ASSERT_MODE_AND_KIND(extension_name, 0, extension)
30+
31+
#if defined(DARWIN_DEFAULT_PTRAUTH) || defined(DARWIN_DEFAULT_PTRAUTH_OVERRIDE)
32+
ASSERT_FEATURE_ENABLED(ptrauth_intrinsics)
33+
ASSERT_EXTENSION_ENABLED(ptrauth_qualifier)
34+
35+
#if defined(DARWIN_DEFAULT_PTRAUTH_OVERRIDE)
36+
ASSERT_FEATURE_DISABLED(ptrauth_calls)
37+
// These flags directly reflect the state of ptrauth_calls, but exist
38+
// for backward compatibility reasons
39+
ASSERT_FEATURE_DISABLED(ptrauth_member_function_pointer_type_discrimination)
40+
ASSERT_FEATURE_DISABLED(ptrauth_objc_method_list_pointer)
41+
#else
42+
ASSERT_FEATURE_ENABLED(ptrauth_calls)
43+
ASSERT_FEATURE_ENABLED(ptrauth_member_function_pointer_type_discrimination)
44+
ASSERT_FEATURE_ENABLED(ptrauth_objc_method_list_pointer)
45+
#endif
46+
47+
ASSERT_FEATURE_ENABLED(ptrauth_returns)
48+
ASSERT_FEATURE_ENABLED(ptrauth_vtable_pointer_address_discrimination)
49+
ASSERT_FEATURE_ENABLED(ptrauth_vtable_pointer_type_discrimination)
50+
ASSERT_FEATURE_DISABLED(ptrauth_type_info_vtable_pointer_discrimination)
51+
ASSERT_FEATURE_DISABLED(ptrauth_signed_block_descriptors)
52+
ASSERT_FEATURE_DISABLED(ptrauth_function_pointer_type_discrimination)
53+
ASSERT_FEATURE_ENABLED(ptrauth_indirect_gotos)
54+
ASSERT_FEATURE_DISABLED(ptrauth_init_fini)
55+
ASSERT_FEATURE_DISABLED(ptrauth_init_fini_address_discrimination)
56+
ASSERT_FEATURE_DISABLED(ptrauth_elf_got)
57+
ASSERT_FEATURE_ENABLED(ptrauth_objc_isa)
58+
ASSERT_FEATURE_ENABLED(ptrauth_objc_interface_sel)
59+
ASSERT_FEATURE_ENABLED(ptrauth_objc_signable_class)
60+
#endif
61+
62+
#ifdef NO_DEFAULT_PTRAUTH
63+
ASSERT_FEATURE_DISABLED(ptrauth_intrinsics)
64+
ASSERT_EXTENSION_DISABLED(ptrauth_qualifier)
65+
ASSERT_FEATURE_DISABLED(ptrauth_calls)
66+
ASSERT_FEATURE_DISABLED(ptrauth_returns)
67+
ASSERT_FEATURE_DISABLED(ptrauth_vtable_pointer_address_discrimination)
68+
ASSERT_FEATURE_DISABLED(ptrauth_vtable_pointer_type_discrimination)
69+
ASSERT_FEATURE_DISABLED(ptrauth_type_info_vtable_pointer_discrimination)
70+
ASSERT_FEATURE_DISABLED(ptrauth_member_function_pointer_type_discrimination)
71+
ASSERT_FEATURE_DISABLED(ptrauth_signed_block_descriptors)
72+
ASSERT_FEATURE_DISABLED(ptrauth_function_pointer_type_discrimination)
73+
ASSERT_FEATURE_DISABLED(ptrauth_indirect_gotos)
74+
ASSERT_FEATURE_DISABLED(ptrauth_init_fini)
75+
ASSERT_FEATURE_DISABLED(ptrauth_init_fini_address_discrimination)
76+
ASSERT_FEATURE_DISABLED(ptrauth_elf_got)
77+
ASSERT_FEATURE_DISABLED(ptrauth_objc_isa)
78+
ASSERT_FEATURE_DISABLED(ptrauth_objc_interface_sel)
79+
ASSERT_FEATURE_DISABLED(ptrauth_objc_signable_class)
80+
ASSERT_FEATURE_DISABLED(ptrauth_objc_method_list_pointer)
81+
#endif
82+
83+
// darwin_ptrauth_defaults-no-diagnostics
84+
// no_default_ptrauth-no-diagnostics
85+
// darwin_ptrauth_override-no-diagnostics
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
// RUN: %clang_cc1 -triple arm64 %s -fsyntax-only
2+
// RUN: %clang_cc1 -triple arm64-apple-macosx %s -fsyntax-only
3+
// RUN: %clang_cc1 -triple arm64-darwin %s -fsyntax-only
4+
// RUN: %clang_cc1 -triple arm64-apple-darwin %s -fsyntax-only
5+
// RUN: %clang_cc1 -triple arm64-apple-ios-macabi %s -fsyntax-only
6+
// RUN: %clang_cc1 -triple arm64-linux-gnu %s -fsyntax-only
7+
// RUN: %clang_cc1 -triple arm64e-linux-gnu %s -fsyntax-only
8+
// RUN: %clang_cc1 -triple aarch64-linux-gnu %s -fsyntax-only
9+
// RUN: %clang_cc1 -triple arm64e-apple-macosx %s -fsyntax-only
10+
// RUN: %clang_cc1 -triple arm64e-apple-ios %s -fsyntax-only
11+
// RUN: %clang_cc1 -triple arm64e-darwin %s -fsyntax-only
12+
// RUN: %clang_cc1 -triple arm64e-apple-darwin %s -fsyntax-only
13+
// RUN: %clang_cc1 -triple arm64e-apple-ios-macabi %s -fsyntax-only
14+
15+
// The -cc1 mode should not insert default ptrauth flags
16+
17+
#define ASSERT_MODE_AND_KIND(feature, enabled, kind) \
18+
_Static_assert(enabled == __has_##kind(feature), \
19+
"Expected to have the " #feature " " #kind " enabled");
20+
21+
#define ASSERT_FEATURE_DISABLED(feature_name) \
22+
ASSERT_MODE_AND_KIND(feature_name, 0, feature)
23+
#define ASSERT_EXTENSION_DISABLED(extension_name) \
24+
ASSERT_MODE_AND_KIND(extension_name, 0, extension)
25+
26+
ASSERT_FEATURE_DISABLED(ptrauth_intrinsics)
27+
ASSERT_EXTENSION_DISABLED(ptrauth_qualifier)
28+
ASSERT_FEATURE_DISABLED(ptrauth_calls)
29+
ASSERT_FEATURE_DISABLED(ptrauth_returns)
30+
ASSERT_FEATURE_DISABLED(ptrauth_vtable_pointer_address_discrimination)
31+
ASSERT_FEATURE_DISABLED(ptrauth_vtable_pointer_type_discrimination)
32+
ASSERT_FEATURE_DISABLED(ptrauth_type_info_vtable_pointer_discrimination)
33+
ASSERT_FEATURE_DISABLED(ptrauth_member_function_pointer_type_discrimination)
34+
ASSERT_FEATURE_DISABLED(ptrauth_signed_block_descriptors)
35+
ASSERT_FEATURE_DISABLED(ptrauth_function_pointer_type_discrimination)
36+
ASSERT_FEATURE_DISABLED(ptrauth_indirect_gotos)
37+
ASSERT_FEATURE_DISABLED(ptrauth_init_fini)
38+
ASSERT_FEATURE_DISABLED(ptrauth_init_fini_address_discrimination)
39+
ASSERT_FEATURE_DISABLED(ptrauth_elf_got)
40+
ASSERT_FEATURE_DISABLED(ptrauth_objc_isa)
41+
ASSERT_FEATURE_DISABLED(ptrauth_objc_interface_sel)
42+
ASSERT_FEATURE_DISABLED(ptrauth_objc_signable_class)
43+
ASSERT_FEATURE_DISABLED(ptrauth_objc_method_list_pointer)
44+
45+
// expected-no-diagnostics

0 commit comments

Comments
 (0)