Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions clang/include/clang/Basic/Features.def
Original file line number Diff line number Diff line change
Expand Up @@ -147,8 +147,8 @@ 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 && Target.getTriple().isOSDarwin())
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

both of these are clearly identical so I figured making them both darwin only given PTRAUTH serves the purpose for everything

FEATURE(ptrauth_qualifier, LangOpts.PointerAuthIntrinsics && Target.getTriple().isOSDarwin())
FEATURE(ptrauth_calls, LangOpts.PointerAuthCalls)
FEATURE(ptrauth_returns, LangOpts.PointerAuthReturns)
FEATURE(ptrauth_vtable_pointer_address_discrimination, LangOpts.PointerAuthVTPtrAddressDiscrimination)
Expand Down
1 change: 1 addition & 0 deletions clang/lib/Frontend/FrontendActions.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1159,6 +1159,7 @@ void DumpCompilerOptionsAction::ExecuteAction() {
raw_ostream &OS = *OSP;
const Preprocessor &PP = CI.getPreprocessor();
const LangOptions &LangOpts = PP.getLangOpts();
const TargetInfo &Target = CI.getTarget();

// FIXME: Rather than manually format the JSON (which is awkward due to
// needing to remove trailing commas), this should make use of a JSON library.
Expand Down
3 changes: 3 additions & 0 deletions clang/lib/Frontend/InitPreprocessor.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1528,6 +1528,9 @@ static void InitializePredefinedMacros(const TargetInfo &TI,
#undef TARGET_OS
}

if (LangOpts.PointerAuthIntrinsics)
Builder.defineMacro("__PTRAUTH__");
Comment on lines +1538 to +1539
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Did we synchronize with GCC here (or does gcc not support this feature at all yet?)

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't believe gcc has any support as yet? I recall talking to one gcc person in Sofia but it didn't sound like it's high priority.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ok, so there's an existing __ARM_FEATURE_PAUTH but that does not cover the language features.
Naming-wise do we want something along the lines of __ARM_FEATURE_PAUTH_LANG_SUPPORT__ ?

__ARM_FEATURE_PAUTH only indicates the target supports the features -- gcc doesn't provide anything more than that afaict

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

(we have __ARM_FEATURE_PAUTH already)

Copy link
Contributor

@cor3ntin cor3ntin Aug 16, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

there is also __ARM_FEATURE_PAC_DEFAULT, apparently. But this seems fairly target-related.
I'm fine with __PTRAUTH__ (or __PTRAUTH)

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think @AaronBallman had an opinion on the __ suffix - I am absolutely indifferent here and as demonstrated am terrible at names :D

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm happy with __PTRAUTH__; do we want it to expand to a particular value so we can change the value to have the macro mean a different feature set is enabled?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think the complexity of the ptrauth abi surface area means that I don't think any single value can really represent it - there's significant variation for us in userspace vs kernel vs other constrained environments vs what the linux folk are doing.

I think any dev who does need to work at this level will need to be directly detecting each single mode that is active


// Get other target #defines.
TI.getTargetDefines(LangOpts, Builder);
}
Expand Down
4 changes: 2 additions & 2 deletions clang/lib/Headers/ptrauth.h
Original file line number Diff line number Diff line change
Expand Up @@ -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.

Expand Down Expand Up @@ -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 */
1 change: 1 addition & 0 deletions clang/lib/Lex/PPMacroExpansion.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1089,6 +1089,7 @@ static void ComputeDATE_TIME(SourceLocation &DATELoc, SourceLocation &TIMELoc,
/// specified by the identifier as a standard language feature.
static bool HasFeature(const Preprocessor &PP, StringRef Feature) {
const LangOptions &LangOpts = PP.getLangOpts();
const TargetInfo &Target = PP.getTargetInfo();
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This looks unused

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's used in the FEATURE() macro below for the darwin restriction on the feature checks

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please update the comment at the top of Features.def to explain this variable is also available.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I realized that this increases the number of decls required for FEATURE, and I'm just pulling the target off PP anyway, so I'll just inline that in the expression.


// Normalize the feature name, __foo__ becomes foo.
if (Feature.starts_with("__") && Feature.ends_with("__") &&
Expand Down
30 changes: 26 additions & 4 deletions clang/test/Preprocessor/ptrauth_extension.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
2 changes: 1 addition & 1 deletion clang/test/Preprocessor/ptrauth_feature.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
16 changes: 14 additions & 2 deletions clang/test/Sema/ptrauth-qualifier.c
Original file line number Diff line number Diff line change
@@ -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
Expand Down
16 changes: 14 additions & 2 deletions clang/test/SemaObjC/ptrauth-qualifier.m
Original file line number Diff line number Diff line change
@@ -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}}
Expand Down