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 <oli...@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 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits