[clang] [clang][PAC][darwin] Set correct default ptrauth features for arm64e-darwin (PR #153722)
Oliver Hunt via cfe-commits
cfe-commits at lists.llvm.org
Thu Aug 14 18:03:58 PDT 2025
https://github.com/ojhunt created https://github.com/llvm/llvm-project/pull/153722
This PR makes sure that when targeting arm64e on darwin platforms the correct flags are set for the userspace platform ABI.
>From eaeb3b514f56bb7f638712cb938c72de4b17dc14 Mon Sep 17 00:00:00 2001
From: Oliver Hunt <oliver at apple.com>
Date: Thu, 14 Aug 2025 17:43:03 -0700
Subject: [PATCH] [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.
---
clang/include/clang/Basic/Features.def | 2 +-
clang/lib/Driver/ToolChains/Darwin.cpp | 36 ++++++++++
clang/test/Driver/ptrauth-platform-defaults.c | 71 +++++++++++++++++++
clang/test/Sema/ptrauth-platform-defaults.c | 45 ++++++++++++
4 files changed, 153 insertions(+), 1 deletion(-)
create mode 100644 clang/test/Driver/ptrauth-platform-defaults.c
create mode 100644 clang/test/Sema/ptrauth-platform-defaults.c
diff --git a/clang/include/clang/Basic/Features.def b/clang/include/clang/Basic/Features.def
index b9efc6a6a2e9d..e59c33a695a4d 100644
--- a/clang/include/clang/Basic/Features.def
+++ b/clang/include/clang/Basic/Features.def
@@ -164,7 +164,7 @@ FEATURE(ptrauth_elf_got, LangOpts.PointerAuthELFGOT)
FEATURE(ptrauth_objc_isa, LangOpts.PointerAuthObjcIsa)
FEATURE(ptrauth_objc_interface_sel, LangOpts.PointerAuthObjcInterfaceSel)
-FEATURE(ptrauth_objc_signable_class, true)
+FEATURE(ptrauth_objc_signable_class, LangOpts.PointerAuthCalls || LangOpts.PointerAuthIntrinsics)
FEATURE(ptrauth_objc_method_list_pointer, LangOpts.PointerAuthCalls)
EXTENSION(swiftcc,
diff --git a/clang/lib/Driver/ToolChains/Darwin.cpp b/clang/lib/Driver/ToolChains/Darwin.cpp
index e5075cbcaf660..4a512f83eac36 100644
--- a/clang/lib/Driver/ToolChains/Darwin.cpp
+++ b/clang/lib/Driver/ToolChains/Darwin.cpp
@@ -3291,6 +3291,42 @@ void Darwin::addClangTargetOptions(
if (!RequiresSubdirectorySearch)
CC1Args.push_back("-fno-modulemap-allow-subdirectory-search");
}
+
+ if (getTriple().isArm64e()) {
+ auto EnsureDefaultPtrauthFlag = [&](OptSpecifier Pos, OptSpecifier Neg) {
+ assert(Pos != Neg);
+ if (const Arg *Opt = DriverArgs.getLastArg(Pos, Neg);
+ Opt && Opt->getOption().matches(Neg)) {
+ Option NegOpt = getDriverOptTable().getOption(Neg);
+ CC1Args.push_back(NegOpt.getPrefixedName().data());
+ return;
+ }
+ Option PosOpt = getDriverOptTable().getOption(Pos);
+ CC1Args.push_back(PosOpt.getPrefixedName().data());
+ };
+ EnsureDefaultPtrauthFlag(options::OPT_fptrauth_calls,
+ options::OPT_fno_ptrauth_calls);
+ EnsureDefaultPtrauthFlag(options::OPT_fptrauth_returns,
+ options::OPT_fno_ptrauth_returns);
+ EnsureDefaultPtrauthFlag(options::OPT_fptrauth_intrinsics,
+ options::OPT_fno_ptrauth_intrinsics);
+ EnsureDefaultPtrauthFlag(options::OPT_fptrauth_indirect_gotos,
+ options::OPT_fno_ptrauth_indirect_gotos);
+ EnsureDefaultPtrauthFlag(options::OPT_fptrauth_auth_traps,
+ options::OPT_fno_ptrauth_auth_traps);
+ EnsureDefaultPtrauthFlag(
+ options::OPT_fptrauth_vtable_pointer_address_discrimination,
+ options::OPT_fno_ptrauth_vtable_pointer_address_discrimination);
+ EnsureDefaultPtrauthFlag(
+ options::OPT_fptrauth_vtable_pointer_type_discrimination,
+ options::OPT_fno_ptrauth_vtable_pointer_type_discrimination);
+ EnsureDefaultPtrauthFlag(options::OPT_fptrauth_objc_isa,
+ options::OPT_fno_ptrauth_objc_isa);
+ EnsureDefaultPtrauthFlag(options::OPT_fptrauth_objc_class_ro,
+ options::OPT_fno_ptrauth_objc_class_ro);
+ EnsureDefaultPtrauthFlag(options::OPT_fptrauth_objc_interface_sel,
+ options::OPT_fno_ptrauth_objc_interface_sel);
+ }
}
void Darwin::addClangCC1ASTargetOptions(
diff --git a/clang/test/Driver/ptrauth-platform-defaults.c b/clang/test/Driver/ptrauth-platform-defaults.c
new file mode 100644
index 0000000000000..6b0e81b77a7c3
--- /dev/null
+++ b/clang/test/Driver/ptrauth-platform-defaults.c
@@ -0,0 +1,71 @@
+// RUN: %clang -target arm64 -DNO_DEFAULT_PTRAUTH %s -fsyntax-only -Xclang -verify=no_default_ptrauth
+// RUN: %clang -target arm64-apple-macosx -DNO_DEFAULT_PTRAUTH %s -fsyntax-only -Xclang -verify=no_default_ptrauth
+// RUN: %clang -target arm64-darwin -DNO_DEFAULT_PTRAUTH %s -fsyntax-only -Xclang -verify=no_default_ptrauth
+// RUN: %clang -target arm64-apple-darwin -DNO_DEFAULT_PTRAUTH %s -fsyntax-only -Xclang -verify=no_default_ptrauth
+// RUN: %clang -target arm64-apple-ios-macabi -DNO_DEFAULT_PTRAUTH %s -fsyntax-only -Xclang -verify=no_default_ptrauth
+// RUN: %clang -target arm64-linux-gnu -DNO_DEFAULT_PTRAUTH %s -fsyntax-only -Xclang -verify=no_default_ptrauth
+// RUN: %clang -target arm64e-linux-gnu -DNO_DEFAULT_PTRAUTH %s -fsyntax-only -Xclang -verify=no_default_ptrauth
+// RUN: %clang -target aarch64-linux-gnu -DNO_DEFAULT_PTRAUTH %s -fsyntax-only -Xclang -verify=no_default_ptrauth
+// RUN: %clang -target arm64e-apple-macosx -DDARWIN_DEFAULT_PTRAUTH %s -fsyntax-only -Xclang -verify=darwin_ptrauth_defaults
+// RUN: %clang -target arm64e-apple-ios -DDARWIN_DEFAULT_PTRAUTH %s -fsyntax-only -Xclang -verify=darwin_ptrauth_defaults
+// RUN: %clang -target arm64e-darwin -DDARWIN_DEFAULT_PTRAUTH %s -fsyntax-only -Xclang -verify=darwin_ptrauth_defaults
+// RUN: %clang -target arm64e-apple-darwin -DDARWIN_DEFAULT_PTRAUTH %s -fsyntax-only -Xclang -verify=darwin_ptrauth_defaults
+// RUN: %clang -target arm64e-apple-ios-macabi -DDARWIN_DEFAULT_PTRAUTH %s -fsyntax-only -Xclang -verify=darwin_ptrauth_defaults
+
+#define ASSERT_MODE_AND_KIND(feature, enabled, kind) \
+ _Static_assert(enabled == __has_##kind(feature), \
+ "Expected to have the " #feature " " #kind " enabled");
+
+#define ASSERT_FEATURE_ENABLED(feature_name) \
+ ASSERT_MODE_AND_KIND(feature_name, 1, feature)
+#define ASSERT_FEATURE_DISABLED(feature_name) \
+ ASSERT_MODE_AND_KIND(feature_name, 0, feature)
+#define ASSERT_EXTENSION_ENABLED(extension_name) \
+ ASSERT_MODE_AND_KIND(extension_name, 1, extension)
+#define ASSERT_EXTENSION_DISABLED(extension_name) \
+ ASSERT_MODE_AND_KIND(extension_name, 0, extension)
+
+#ifdef DARWIN_DEFAULT_PTRAUTH
+ASSERT_FEATURE_ENABLED(ptrauth_intrinsics)
+ASSERT_EXTENSION_ENABLED(ptrauth_qualifier)
+ASSERT_FEATURE_ENABLED(ptrauth_calls)
+ASSERT_FEATURE_ENABLED(ptrauth_returns)
+ASSERT_FEATURE_ENABLED(ptrauth_vtable_pointer_address_discrimination)
+ASSERT_FEATURE_ENABLED(ptrauth_vtable_pointer_type_discrimination)
+ASSERT_FEATURE_DISABLED(ptrauth_type_info_vtable_pointer_discrimination)
+ASSERT_FEATURE_ENABLED(ptrauth_member_function_pointer_type_discrimination)
+ASSERT_FEATURE_DISABLED(ptrauth_signed_block_descriptors)
+ASSERT_FEATURE_DISABLED(ptrauth_function_pointer_type_discrimination)
+ASSERT_FEATURE_ENABLED(ptrauth_indirect_gotos)
+ASSERT_FEATURE_DISABLED(ptrauth_init_fini)
+ASSERT_FEATURE_DISABLED(ptrauth_init_fini_address_discrimination)
+ASSERT_FEATURE_DISABLED(ptrauth_elf_got)
+ASSERT_FEATURE_ENABLED(ptrauth_objc_isa)
+ASSERT_FEATURE_ENABLED(ptrauth_objc_interface_sel)
+ASSERT_FEATURE_ENABLED(ptrauth_objc_signable_class)
+ASSERT_FEATURE_ENABLED(ptrauth_objc_method_list_pointer)
+#endif
+
+#ifdef NO_DEFAULT_PTRAUTH
+ASSERT_FEATURE_DISABLED(ptrauth_intrinsics)
+ASSERT_EXTENSION_DISABLED(ptrauth_qualifier)
+ASSERT_FEATURE_DISABLED(ptrauth_calls)
+ASSERT_FEATURE_DISABLED(ptrauth_returns)
+ASSERT_FEATURE_DISABLED(ptrauth_vtable_pointer_address_discrimination)
+ASSERT_FEATURE_DISABLED(ptrauth_vtable_pointer_type_discrimination)
+ASSERT_FEATURE_DISABLED(ptrauth_type_info_vtable_pointer_discrimination)
+ASSERT_FEATURE_DISABLED(ptrauth_member_function_pointer_type_discrimination)
+ASSERT_FEATURE_DISABLED(ptrauth_signed_block_descriptors)
+ASSERT_FEATURE_DISABLED(ptrauth_function_pointer_type_discrimination)
+ASSERT_FEATURE_DISABLED(ptrauth_indirect_gotos)
+ASSERT_FEATURE_DISABLED(ptrauth_init_fini)
+ASSERT_FEATURE_DISABLED(ptrauth_init_fini_address_discrimination)
+ASSERT_FEATURE_DISABLED(ptrauth_elf_got)
+ASSERT_FEATURE_DISABLED(ptrauth_objc_isa)
+ASSERT_FEATURE_DISABLED(ptrauth_objc_interface_sel)
+ASSERT_FEATURE_DISABLED(ptrauth_objc_signable_class)
+ASSERT_FEATURE_DISABLED(ptrauth_objc_method_list_pointer)
+#endif
+
+// darwin_ptrauth_defaults-no-diagnostics
+// no_default_ptrauth-no-diagnostics
diff --git a/clang/test/Sema/ptrauth-platform-defaults.c b/clang/test/Sema/ptrauth-platform-defaults.c
new file mode 100644
index 0000000000000..0dcddbfa22f76
--- /dev/null
+++ b/clang/test/Sema/ptrauth-platform-defaults.c
@@ -0,0 +1,45 @@
+// RUN: %clang_cc1 -triple arm64 %s -fsyntax-only
+// RUN: %clang_cc1 -triple arm64-apple-macosx %s -fsyntax-only
+// RUN: %clang_cc1 -triple arm64-darwin %s -fsyntax-only
+// RUN: %clang_cc1 -triple arm64-apple-darwin %s -fsyntax-only
+// RUN: %clang_cc1 -triple arm64-apple-ios-macabi %s -fsyntax-only
+// RUN: %clang_cc1 -triple arm64-linux-gnu %s -fsyntax-only
+// RUN: %clang_cc1 -triple arm64e-linux-gnu %s -fsyntax-only
+// RUN: %clang_cc1 -triple aarch64-linux-gnu %s -fsyntax-only
+// RUN: %clang_cc1 -triple arm64e-apple-macosx %s -fsyntax-only
+// RUN: %clang_cc1 -triple arm64e-apple-ios %s -fsyntax-only
+// RUN: %clang_cc1 -triple arm64e-darwin %s -fsyntax-only
+// RUN: %clang_cc1 -triple arm64e-apple-darwin %s -fsyntax-only
+// RUN: %clang_cc1 -triple arm64e-apple-ios-macabi %s -fsyntax-only
+
+// The -cc1 mode should not insert default ptrauth flags
+
+#define ASSERT_MODE_AND_KIND(feature, enabled, kind) \
+ _Static_assert(enabled == __has_##kind(feature), \
+ "Expected to have the " #feature " " #kind " enabled");
+
+#define ASSERT_FEATURE_DISABLED(feature_name) \
+ ASSERT_MODE_AND_KIND(feature_name, 0, feature)
+#define ASSERT_EXTENSION_DISABLED(extension_name) \
+ ASSERT_MODE_AND_KIND(extension_name, 0, extension)
+
+ASSERT_FEATURE_DISABLED(ptrauth_intrinsics)
+ASSERT_EXTENSION_DISABLED(ptrauth_qualifier)
+ASSERT_FEATURE_DISABLED(ptrauth_calls)
+ASSERT_FEATURE_DISABLED(ptrauth_returns)
+ASSERT_FEATURE_DISABLED(ptrauth_vtable_pointer_address_discrimination)
+ASSERT_FEATURE_DISABLED(ptrauth_vtable_pointer_type_discrimination)
+ASSERT_FEATURE_DISABLED(ptrauth_type_info_vtable_pointer_discrimination)
+ASSERT_FEATURE_DISABLED(ptrauth_member_function_pointer_type_discrimination)
+ASSERT_FEATURE_DISABLED(ptrauth_signed_block_descriptors)
+ASSERT_FEATURE_DISABLED(ptrauth_function_pointer_type_discrimination)
+ASSERT_FEATURE_DISABLED(ptrauth_indirect_gotos)
+ASSERT_FEATURE_DISABLED(ptrauth_init_fini)
+ASSERT_FEATURE_DISABLED(ptrauth_init_fini_address_discrimination)
+ASSERT_FEATURE_DISABLED(ptrauth_elf_got)
+ASSERT_FEATURE_DISABLED(ptrauth_objc_isa)
+ASSERT_FEATURE_DISABLED(ptrauth_objc_interface_sel)
+ASSERT_FEATURE_DISABLED(ptrauth_objc_signable_class)
+ASSERT_FEATURE_DISABLED(ptrauth_objc_method_list_pointer)
+
+// expected-no-diagnostics
More information about the cfe-commits
mailing list