[clang][PAC] ptrauth_qualifier and ptrauth_intrinsic should only be available on Darwin (#153912)
For backwards compatibility reasons the `ptrauth_qualifier` and `ptrauth_intrinsic` features need to be testable with `__has_feature()` on Apple platforms, but for other platforms this backwards compatibility issue does not exist. This PR resolves these issues by making the `ptrauth_qualifier` and `ptrauth_intrinsic` tests conditional upon a darwin target. This also allows us to revert the ptrauth_qualifier check from an extension to a feature test again, as is required on these platforms. At the same time we introduce a new predefined macro `__PTRAUTH__` that answers the same question as `__has_feature(ptrauth_qualifier)` and `__has_feature(ptrauth_intrinsic)` as those tests are synonymous and only exist separately for compatibility reasons. The requirement to test for the `__PTRAUTH__` macro also resolves the hazard presented by mixing the `ptrauth_qualifier` flag (that impacts ABI and security policies) with `-pedantics-errors`, which makes `__has_extension` return false for all extensions. --------- Co-authored-by: Aaron Ballman <aaron@aaronballman.com> (cherry picked from commit 624b724ca6df5d2d3ea16b9ed232851e5d061be4)
This commit is contained in:
parent
2cf40a6ca8
commit
45300aad3c
@ -359,6 +359,12 @@ Non-comprehensive list of changes in this release
|
||||
ARC-managed pointers and other pointer types. The prior behavior was overly
|
||||
strict and inconsistent with the ARC specification.
|
||||
|
||||
- Use of ``__has_feature`` to detect the ``ptrauth_qualifier`` and ``ptrauth_intrinsics``
|
||||
features has been deprecated, and is restricted to the arm64e target only. The
|
||||
correct method to check for these features is to test for the ``__PTRAUTH__``
|
||||
macro.
|
||||
|
||||
|
||||
New Compiler Flags
|
||||
------------------
|
||||
|
||||
|
@ -147,8 +147,10 @@ FEATURE(type_sanitizer, LangOpts.Sanitize.has(SanitizerKind::Type))
|
||||
FEATURE(thread_sanitizer, LangOpts.Sanitize.has(SanitizerKind::Thread))
|
||||
FEATURE(dataflow_sanitizer, LangOpts.Sanitize.has(SanitizerKind::DataFlow))
|
||||
FEATURE(scudo, LangOpts.Sanitize.hasOneOf(SanitizerKind::Scudo))
|
||||
FEATURE(ptrauth_intrinsics, LangOpts.PointerAuthIntrinsics)
|
||||
EXTENSION(ptrauth_qualifier, LangOpts.PointerAuthIntrinsics)
|
||||
FEATURE(ptrauth_intrinsics, LangOpts.PointerAuthIntrinsics &&
|
||||
PP.getTargetInfo().getTriple().isOSDarwin())
|
||||
FEATURE(ptrauth_qualifier, LangOpts.PointerAuthIntrinsics &&
|
||||
PP.getTargetInfo().getTriple().isOSDarwin())
|
||||
FEATURE(ptrauth_calls, LangOpts.PointerAuthCalls)
|
||||
FEATURE(ptrauth_returns, LangOpts.PointerAuthReturns)
|
||||
FEATURE(ptrauth_vtable_pointer_address_discrimination, LangOpts.PointerAuthVTPtrAddressDiscrimination)
|
||||
|
@ -1535,6 +1535,9 @@ static void InitializePredefinedMacros(const TargetInfo &TI,
|
||||
#undef TARGET_OS
|
||||
}
|
||||
|
||||
if (LangOpts.PointerAuthIntrinsics)
|
||||
Builder.defineMacro("__PTRAUTH__");
|
||||
|
||||
// Get other target #defines.
|
||||
TI.getTargetDefines(LangOpts, Builder);
|
||||
}
|
||||
|
@ -95,7 +95,7 @@ typedef __UINTPTR_TYPE__ ptrauth_generic_signature_t;
|
||||
__ptrauth qualifier; the compiler will perform this check
|
||||
automatically. */
|
||||
|
||||
#if __has_feature(ptrauth_intrinsics)
|
||||
#if __has_feature(ptrauth_intrinsics) || defined(__PTRAUTH__)
|
||||
|
||||
/* Strip the signature from a value without authenticating it.
|
||||
|
||||
@ -388,6 +388,6 @@ typedef __UINTPTR_TYPE__ ptrauth_generic_signature_t;
|
||||
#define __ptrauth_objc_isa_uintptr
|
||||
#define __ptrauth_objc_super_pointer
|
||||
|
||||
#endif /* __has_feature(ptrauth_intrinsics) */
|
||||
#endif /* __has_feature(ptrauth_intrinsics) || defined(__PTRAUTH__) */
|
||||
|
||||
#endif /* __PTRAUTH_H */
|
||||
|
@ -4,10 +4,32 @@
|
||||
// RUN: %clang_cc1 -E %s -triple=aarch64 -fptrauth-calls | \
|
||||
// RUN: FileCheck %s --check-prefixes=NOINTRIN
|
||||
|
||||
#if __has_extension(ptrauth_qualifier)
|
||||
// INTRIN: has_ptrauth_qualifier
|
||||
void has_ptrauth_qualifier() {}
|
||||
#else
|
||||
// RUN: %clang_cc1 -E %s -DIS_DARWIN -triple=arm64e-apple-darwin -fptrauth-intrinsics | \
|
||||
// RUN: FileCheck %s --check-prefixes=INTRIN,INTRIN_MAC
|
||||
|
||||
// RUN: %clang_cc1 -E %s -DIS_DARWIN -triple=arm64e-apple-darwin -fptrauth-calls | \
|
||||
// RUN: FileCheck %s --check-prefixes=NOINTRIN
|
||||
|
||||
#if defined(IS_DARWIN) && __has_extension(ptrauth_qualifier)
|
||||
// INTRIN_MAC: has_ptrauth_qualifier1
|
||||
void has_ptrauth_qualifier1() {}
|
||||
#ifndef __PTRAUTH__
|
||||
#error ptrauth_qualifier extension present without predefined test macro
|
||||
#endif
|
||||
#endif
|
||||
#if defined(IS_DARWIN) && __has_feature(ptrauth_qualifier)
|
||||
// INTRIN_MAC: has_ptrauth_qualifier2
|
||||
void has_ptrauth_qualifier2() {}
|
||||
#ifndef __PTRAUTH__
|
||||
#error ptrauth_qualifier extension present without predefined test macro
|
||||
#endif
|
||||
#endif
|
||||
#if defined(__PTRAUTH__)
|
||||
// INTRIN: has_ptrauth_qualifier3
|
||||
void has_ptrauth_qualifier3() {}
|
||||
#endif
|
||||
|
||||
#if !defined(__PTRAUTH__) && !__has_feature(ptrauth_qualifier) && !__has_extension(ptrauth_qualifier)
|
||||
// NOINTRIN: no_ptrauth_qualifier
|
||||
void no_ptrauth_qualifier() {}
|
||||
#endif
|
||||
|
@ -34,7 +34,7 @@
|
||||
// RUN: %clang_cc1 -E %s -triple=aarch64 -fptrauth-elf-got | \
|
||||
// RUN: FileCheck %s --check-prefixes=NOINTRIN,NOCALLS,NORETS,NOVPTR_ADDR_DISCR,NOVPTR_TYPE_DISCR,NOTYPE_INFO_DISCR,NOFUNC,NOINITFINI,NOINITFINI_ADDR_DISCR,NOGOTOS,ELFGOT
|
||||
|
||||
#if __has_feature(ptrauth_intrinsics)
|
||||
#if defined(__PTRAUTH__)
|
||||
// INTRIN: has_ptrauth_intrinsics
|
||||
void has_ptrauth_intrinsics() {}
|
||||
#else
|
||||
|
@ -1,13 +1,25 @@
|
||||
// RUN: %clang_cc1 -triple arm64-apple-ios -std=c23 -fsyntax-only -verify -fptrauth-intrinsics %s
|
||||
// RUN: %clang_cc1 -triple arm64-apple-ios -DIS_DARWIN -std=c23 -fsyntax-only -verify -fptrauth-intrinsics %s
|
||||
// RUN: %clang_cc1 -triple aarch64-linux-gnu -std=c23 -fsyntax-only -verify -fptrauth-intrinsics %s
|
||||
|
||||
#if !__has_extension(ptrauth_qualifier)
|
||||
#if defined(IS_DARWIN) && !__has_extension(ptrauth_qualifier)
|
||||
// This error means that the __ptrauth qualifier availability test says that it
|
||||
// is not available. This error is not expected in the output, if it is seen
|
||||
// there is a feature detection regression.
|
||||
#error __ptrauth qualifier not enabled
|
||||
#endif
|
||||
|
||||
#if defined(IS_DARWIN) && !__has_feature(ptrauth_qualifier)
|
||||
// This error means that the __has_feature test for ptrauth_qualifier has
|
||||
// failed, despite it being expected on darwin.
|
||||
#error __ptrauth qualifier not enabled
|
||||
#elif !defined(IS_DARWIN) && (__has_feature(ptrauth_qualifier) || __has_extension(ptrauth_qualifier))
|
||||
#error ptrauth_qualifier labeled a feature on a non-darwin platform
|
||||
#endif
|
||||
|
||||
#if !defined (__PTRAUTH__)
|
||||
#error __PTRAUTH__ test macro not defined when ptrauth is enabled
|
||||
#endif
|
||||
|
||||
#if __aarch64__
|
||||
#define VALID_CODE_KEY 0
|
||||
#define VALID_DATA_KEY 2
|
||||
|
@ -1,13 +1,25 @@
|
||||
// RUN: %clang_cc1 -triple arm64-apple-ios -fsyntax-only -verify -fptrauth-intrinsics %s
|
||||
// RUN: %clang_cc1 -triple arm64-apple-ios -DIS_DARWIN -fsyntax-only -verify -fptrauth-intrinsics %s
|
||||
// RUN: %clang_cc1 -triple aarch64-linux-gnu -fsyntax-only -verify -fptrauth-intrinsics %s
|
||||
|
||||
#if !__has_extension(ptrauth_qualifier)
|
||||
#if defined(IS_DARWIN) && !__has_extension(ptrauth_qualifier)
|
||||
// This error means that the __ptrauth qualifier availability test says that it
|
||||
// is not available. This error is not expected in the output, if it is seen
|
||||
// there is a feature detection regression.
|
||||
#error __ptrauth qualifier not enabled
|
||||
#endif
|
||||
|
||||
#if defined(IS_DARWIN) && !__has_feature(ptrauth_qualifier)
|
||||
// This error means that the __has_feature test for ptrauth_qualifier has
|
||||
// failed, despite it being expected on darwin.
|
||||
#error __ptrauth qualifier not enabled
|
||||
#elif !defined(IS_DARWIN) && (__has_feature(ptrauth_qualifier) || __has_extension(ptrauth_qualifier))
|
||||
#error ptrauth_qualifier labeled a feature on a non-darwin platform
|
||||
#endif
|
||||
|
||||
#if !defined (__PTRAUTH__)
|
||||
#error __PTRAUTH__ test macro not defined when ptrauth is enabled
|
||||
#endif
|
||||
|
||||
@interface Foo
|
||||
// expected-warning@-1 {{class 'Foo' defined without specifying a base class}}
|
||||
// expected-note@-2 {{add a super class to fix this problem}}
|
||||
|
Loading…
x
Reference in New Issue
Block a user