[clang] [clang] Fix PointerAuth semantics of cpp_trivially_relocatable (PR #143969)
Corentin Jabot via cfe-commits
cfe-commits at lists.llvm.org
Sun Jun 15 23:30:57 PDT 2025
================
@@ -629,25 +629,46 @@ class ASTContext : public RefCountedBase<ASTContext> {
void setRelocationInfoForCXXRecord(const CXXRecordDecl *,
CXXRecordDeclRelocationInfo);
- /// Examines a given type, and returns whether the T itself
+ /// Examines a given type, and returns whether the type itself
/// is address discriminated, or any transitively embedded types
/// contain data that is address discriminated. This includes
/// implicitly authenticated values like vtable pointers, as well as
/// explicitly qualified fields.
- bool containsAddressDiscriminatedPointerAuth(QualType T);
- // A simple helper function to short circuit pointer auth checks.
+ bool containsAddressDiscriminatedPointerAuth(QualType T) {
+ if (!isPointerAuthenticationAvailable())
+ return false;
+ return findPointerAuthContent(T) != PointerAuthContent::None;
+ }
- bool isPointerAuthenticationAvailable() const {
- return LangOpts.PointerAuthCalls || LangOpts.PointerAuthIntrinsics ||
- LangOpts.PointerAuthVTPtrAddressDiscrimination;
+ /// Examines a given type, and returns whether the type itself
+ /// or any data it transitively contains has a pointer authentication
+ /// schema that is not safely relocatable. e.g. any data or fields
+ /// with address discrimination other than any otherwise similar
+ /// vtable pointers.
+ bool containsNonRelocatablePointerAuth(QualType T) {
+ if (!isPointerAuthenticationAvailable())
+ return false;
+ return findPointerAuthContent(T) == PointerAuthContent::AddressDiscriminatedData;
}
private:
llvm::DenseMap<const CXXRecordDecl *, CXXRecordDeclRelocationInfo>
RelocatableClasses;
// FIXME: store in RecordDeclBitfields in future?
- llvm::DenseMap<const RecordDecl *, bool>
+ enum class PointerAuthContent : uint8_t {
+ None,
+ AddressDiscriminatedVTable,
+ AddressDiscriminatedData
+ };
+
+ // A simple helper function to short circuit pointer auth checks.
+ bool isPointerAuthenticationAvailable() const {
+ return LangOpts.PointerAuthCalls || LangOpts.PointerAuthIntrinsics ||
+ LangOpts.PointerAuthVTPtrAddressDiscrimination;
+ }
----------------
cor3ntin wrote:
2 questions; Why do we have 3 options, and why do we care about anything but `PointerAuthVTPtrAddressDiscrimination`here?
https://github.com/llvm/llvm-project/pull/143969
More information about the cfe-commits
mailing list