[clang] [PAC][clang] Define `PointerAuthQualifier` and `PointerAuthenticationMode` (PR #84384)
@@ -251,15 +423,16 @@ class Qualifiers { } // Deserialize qualifiers from an opaque representation. - static Qualifiers fromOpaqueValue(unsigned opaque) { + static Qualifiers fromOpaqueValue(uint64_t Opaque) { Qualifiers Qs; -Qs.Mask = opaque; +Qs.Mask = uint32_t(Opaque); kovdan01 wrote: Thanks, I've used numeric limits stuff since it allows `constexpr` (while `maskTrailingOnes` is more flexible for arbitrary bit count but does not have `constexpr` variant as far as I can see). See df81082d6f0210b02e72a3237ab7c03715d23488 https://github.com/llvm/llvm-project/pull/84384 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [PAC][clang] Define `PointerAuthQualifier` and `PointerAuthenticationMode` (PR #84384)
@@ -2196,6 +2196,16 @@ class ASTContext : public RefCountedBase { return getQualifiedType(type.getUnqualifiedType(), Qs); } + /// \brief Return a type with the given __ptrauth qualifier. + QualType getPointerAuthType(QualType Ty, PointerAuthQualifier PointerAuth) { +assert(!Ty.getPointerAuth()); +assert(PointerAuth); + +Qualifiers qs; +qs.setPointerAuth(PointerAuth); +return getQualifiedType(Ty, qs); kovdan01 wrote: Thanks, fixed naming here and in `static PointerAuthQualifier fromOpaqueValue(uint32_t Opaque)`, see cfb3afe19c698aaf41fb7b492503081989896434 https://github.com/llvm/llvm-project/pull/84384 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [PAC][clang] Define `PointerAuthQualifier` and `PointerAuthenticationMode` (PR #84384)
@@ -139,6 +141,168 @@ using CanQualType = CanQual; #define TYPE(Class, Base) class Class##Type; #include "clang/AST/TypeNodes.inc" +/// Pointer-authentication qualifiers. +class PointerAuthQualifier { + enum : uint32_t { +EnabledShift = 0, +EnabledBits = 1, +EnabledMask = 1 << EnabledShift, +AddressDiscriminatedShift = EnabledShift + EnabledBits, +AddressDiscriminatedBits = 1, +AddressDiscriminatedMask = 1 << AddressDiscriminatedShift, +AuthenticationModeShift = +AddressDiscriminatedShift + AddressDiscriminatedBits, +AuthenticationModeBits = 2, +AuthenticationModeMask = ((1 << AuthenticationModeBits) - 1) + << AuthenticationModeShift, +IsaPointerShift = AuthenticationModeShift + AuthenticationModeBits, +IsaPointerBits = 1, +IsaPointerMask = ((1 << IsaPointerBits) - 1) << IsaPointerShift, +AuthenticatesNullValuesShift = IsaPointerShift + IsaPointerBits, +AuthenticatesNullValuesBits = 1, +AuthenticatesNullValuesMask = ((1 << AuthenticatesNullValuesBits) - 1) + << AuthenticatesNullValuesShift, +KeyShift = AuthenticatesNullValuesShift + AuthenticatesNullValuesBits, +KeyBits = 10, +KeyMask = ((1 << KeyBits) - 1) << KeyShift, +DiscriminatorShift = KeyShift + KeyBits, +DiscriminatorBits = 16, +DiscriminatorMask = ((1u << DiscriminatorBits) - 1) << DiscriminatorShift, + }; + + // bits: |0 |1 |2..3 |4 | + // |Enabled|Address|AuthenticationMode|ISA pointer| + // bits: |5|6..15| 16...31 | + // |AuthenticatesNull|Key |Discriminator| + uint32_t Data; kovdan01 wrote: Fixed, thanks, see cfb3afe19c698aaf41fb7b492503081989896434 https://github.com/llvm/llvm-project/pull/84384 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [PAC][clang] Define `PointerAuthQualifier` and `PointerAuthenticationMode` (PR #84384)
@@ -139,6 +141,168 @@ using CanQualType = CanQual; #define TYPE(Class, Base) class Class##Type; #include "clang/AST/TypeNodes.inc" +/// Pointer-authentication qualifiers. +class PointerAuthQualifier { + enum : uint32_t { +EnabledShift = 0, +EnabledBits = 1, +EnabledMask = 1 << EnabledShift, +AddressDiscriminatedShift = EnabledShift + EnabledBits, +AddressDiscriminatedBits = 1, +AddressDiscriminatedMask = 1 << AddressDiscriminatedShift, +AuthenticationModeShift = +AddressDiscriminatedShift + AddressDiscriminatedBits, +AuthenticationModeBits = 2, +AuthenticationModeMask = ((1 << AuthenticationModeBits) - 1) + << AuthenticationModeShift, +IsaPointerShift = AuthenticationModeShift + AuthenticationModeBits, +IsaPointerBits = 1, +IsaPointerMask = ((1 << IsaPointerBits) - 1) << IsaPointerShift, +AuthenticatesNullValuesShift = IsaPointerShift + IsaPointerBits, +AuthenticatesNullValuesBits = 1, +AuthenticatesNullValuesMask = ((1 << AuthenticatesNullValuesBits) - 1) + << AuthenticatesNullValuesShift, +KeyShift = AuthenticatesNullValuesShift + AuthenticatesNullValuesBits, +KeyBits = 10, +KeyMask = ((1 << KeyBits) - 1) << KeyShift, +DiscriminatorShift = KeyShift + KeyBits, +DiscriminatorBits = 16, +DiscriminatorMask = ((1u << DiscriminatorBits) - 1) << DiscriminatorShift, + }; + + // bits: |0 |1 |2..3 |4 | + // |Enabled|Address|AuthenticationMode|ISA pointer| + // bits: |5|6..15| 16...31 | + // |AuthenticatesNull|Key |Discriminator| + uint32_t Data; + + // The following static assertions check that each of the 32 bits is present + // exactly in one of the constants. + static_assert((EnabledBits + AddressDiscriminatedBits + + AuthenticationModeBits + IsaPointerBits + + AuthenticatesNullValuesBits + KeyBits + DiscriminatorBits) == +32, +"PointerAuthQualifier should be exactly 32 bits"); + static_assert((EnabledMask + AddressDiscriminatedMask + + AuthenticationModeMask + IsaPointerMask + + AuthenticatesNullValuesMask + KeyMask + DiscriminatorMask) == +0x, +"All masks should cover the entire bits"); + static_assert((EnabledMask ^ AddressDiscriminatedMask ^ + AuthenticationModeMask ^ IsaPointerMask ^ + AuthenticatesNullValuesMask ^ KeyMask ^ DiscriminatorMask) == +0x, +"All masks should cover the entire bits"); + + PointerAuthQualifier(unsigned Key, bool IsAddressDiscriminated, + unsigned ExtraDiscriminator, + PointerAuthenticationMode AuthenticationMode, + bool IsIsaPointer, bool AuthenticatesNullValues) + : Data(EnabledMask | + (IsAddressDiscriminated + ? llvm::to_underlying(AddressDiscriminatedMask) + : 0) | + (Key << KeyShift) | + (llvm::to_underlying(AuthenticationMode) + << AuthenticationModeShift) | + (ExtraDiscriminator << DiscriminatorShift) | + (IsIsaPointer << IsaPointerShift) | + (AuthenticatesNullValues << AuthenticatesNullValuesShift)) { +assert(Key <= KeyNoneInternal); +assert(ExtraDiscriminator <= MaxDiscriminator); + } + +public: + enum { +KeyNoneInternal = (1u << KeyBits) - 1, + +/// The maximum supported pointer-authentication key. +MaxKey = KeyNoneInternal - 1, + +/// The maximum supported pointer-authentication discriminator. +MaxDiscriminator = (1u << DiscriminatorBits) - 1 + }; + +public: + PointerAuthQualifier() : Data(0) {} kovdan01 wrote: Changed to `PointerAuthQualifier() = default;` - we have a user-defined non-default constructor, so, without explicit notice, the default one is deleted (see https://en.cppreference.com/w/cpp/language/default_constructor). See cfb3afe19c698aaf41fb7b492503081989896434 https://github.com/llvm/llvm-project/pull/84384 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [PAC][clang] Define `PointerAuthQualifier` and `PointerAuthenticationMode` (PR #84384)
@@ -194,19 +358,27 @@ class Qualifiers { FastMask = (1 << FastWidth) - 1 }; + Qualifiers() : Mask(0), PtrAuth() {} + kovdan01 wrote: Fixed, thanks, see cfb3afe19c698aaf41fb7b492503081989896434 https://github.com/llvm/llvm-project/pull/84384 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [PAC][clang] Define `PointerAuthQualifier` and `PointerAuthenticationMode` (PR #84384)
@@ -607,13 +799,17 @@ class Qualifiers { void Profile(llvm::FoldingSetNodeID ) const { ID.AddInteger(Mask); +PtrAuth.Profile(ID); } private: // bits: |0 1 2|3|4 .. 5|6 .. 8|9 ... 31| // |C R V|U|GCAttr|Lifetime|AddressSpace| uint32_t Mask = 0; + PointerAuthQualifier PtrAuth; kovdan01 wrote: That was used for at least several months in downstream and I'm not aware of compile time issues it caused. But, as you've mentioned, the changes can lead to undesirable impact in surprising places, so it's better to test it anyway. I'll do that and let you know about results. Do I get it right that I need to contact nikic to be able to test branches from my fork (https://llvm-compile-time-tracker.com/about.php)? When requesting smth on the compare page (https://llvm-compile-time-tracker.com/compare.php), only commits and branches from this repository seem to be allowed (while I want to use the branch from my fork). https://github.com/llvm/llvm-project/pull/84384 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [PAC][clang] Define `PointerAuthQualifier` and `PointerAuthenticationMode` (PR #84384)
https://github.com/kovdan01 updated https://github.com/llvm/llvm-project/pull/84384 >From ef23d427b48687b62da9e1062886ddfcc1649b6a Mon Sep 17 00:00:00 2001 From: John McCall Date: Mon, 16 Dec 2019 20:31:25 -0500 Subject: [PATCH 1/7] Abstract serialization fixes for the Apple Clang changes. --- clang/include/clang/AST/AbstractBasicReader.h | 4 ++-- clang/include/clang/AST/AbstractBasicWriter.h | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/clang/include/clang/AST/AbstractBasicReader.h b/clang/include/clang/AST/AbstractBasicReader.h index 1f2797cc701458..ab036f1d445acc 100644 --- a/clang/include/clang/AST/AbstractBasicReader.h +++ b/clang/include/clang/AST/AbstractBasicReader.h @@ -213,9 +213,9 @@ class DataStreamBasicReader : public BasicReaderBase { } Qualifiers readQualifiers() { -static_assert(sizeof(Qualifiers().getAsOpaqueValue()) <= sizeof(uint32_t), +static_assert(sizeof(Qualifiers().getAsOpaqueValue()) <= sizeof(uint64_t), "update this if the value size changes"); -uint32_t value = asImpl().readUInt32(); +uint64_t value = asImpl().readUInt64(); return Qualifiers::fromOpaqueValue(value); } diff --git a/clang/include/clang/AST/AbstractBasicWriter.h b/clang/include/clang/AST/AbstractBasicWriter.h index 07afa388de2c17..8e42fcaad1d388 100644 --- a/clang/include/clang/AST/AbstractBasicWriter.h +++ b/clang/include/clang/AST/AbstractBasicWriter.h @@ -196,9 +196,9 @@ class DataStreamBasicWriter : public BasicWriterBase { } void writeQualifiers(Qualifiers value) { -static_assert(sizeof(value.getAsOpaqueValue()) <= sizeof(uint32_t), +static_assert(sizeof(value.getAsOpaqueValue()) <= sizeof(uint64_t), "update this if the value size changes"); -asImpl().writeUInt32(value.getAsOpaqueValue()); +asImpl().writeUInt64(value.getAsOpaqueValue()); } void writeExceptionSpecInfo( >From 9e296a1a69158419960c265f12f52523db0c8e2a Mon Sep 17 00:00:00 2001 From: Daniil Kovalev Date: Thu, 7 Mar 2024 15:34:24 +0300 Subject: [PATCH 2/7] [clang] Define `PointerAuthenticationMode` enum --- clang/include/clang/Basic/LangOptions.h | 7 +++ 1 file changed, 7 insertions(+) diff --git a/clang/include/clang/Basic/LangOptions.h b/clang/include/clang/Basic/LangOptions.h index 862952d336ef31..6fe7472d8ad0ca 100644 --- a/clang/include/clang/Basic/LangOptions.h +++ b/clang/include/clang/Basic/LangOptions.h @@ -57,6 +57,13 @@ enum class ShaderStage { Invalid, }; +enum class PointerAuthenticationMode : unsigned { + None, + Strip, + SignAndStrip, + SignAndAuth +}; + /// Bitfields of LangOptions, split out from LangOptions in order to ensure that /// this large collection of bitfields is a trivial class type. class LangOptionsBase { >From 71d7760aa9cc459d7bc0365fa079f64cb5704c96 Mon Sep 17 00:00:00 2001 From: Daniil Kovalev Date: Thu, 7 Mar 2024 15:31:03 +0300 Subject: [PATCH 3/7] [clang] Define `PointerAuthQualifier` class Includes changes from the following commits from the branch https://github.com/ahmedbougacha/llvm-project/tree/eng/arm64e-upstream-llvmorg - Initial support https://github.com/ahmedbougacha/llvm-project/commit/cc7ba7eb1814e9b254c7d94aa0b78cb0e21acfc5 - ObjC isa signing https://github.com/ahmedbougacha/llvm-project/commit/c9ce0d408f1d9aeffc7b86256334220aec6de5a3 Also applies a fix from https://github.com/access-softek/llvm-project/pull/75 Co-authored-by: Ahmed Bougacha --- clang/include/clang/AST/Type.h| 215 +- .../include/clang/Basic/PointerAuthOptions.h | 23 ++ 2 files changed, 227 insertions(+), 11 deletions(-) create mode 100644 clang/include/clang/Basic/PointerAuthOptions.h diff --git a/clang/include/clang/AST/Type.h b/clang/include/clang/AST/Type.h index 1942b0e67f65a3..1741a3017f7280 100644 --- a/clang/include/clang/AST/Type.h +++ b/clang/include/clang/AST/Type.h @@ -25,8 +25,10 @@ #include "clang/Basic/Diagnostic.h" #include "clang/Basic/ExceptionSpecificationType.h" #include "clang/Basic/LLVM.h" +#include "clang/Basic/LangOptions.h" #include "clang/Basic/Linkage.h" #include "clang/Basic/PartialDiagnostic.h" +#include "clang/Basic/PointerAuthOptions.h" #include "clang/Basic/SourceLocation.h" #include "clang/Basic/Specifiers.h" #include "clang/Basic/Visibility.h" @@ -138,6 +140,165 @@ using CanQualType = CanQual; #define TYPE(Class, Base) class Class##Type; #include "clang/AST/TypeNodes.inc" +/// Pointer-authentication qualifiers. +class PointerAuthQualifier { + enum : uint32_t { +EnabledShift = 0, +EnabledBits = 1, +EnabledMask = 1 << EnabledShift, +AddressDiscriminatedShift = EnabledShift + EnabledBits, +AddressDiscriminatedBits = 1, +AddressDiscriminatedMask = 1 << AddressDiscriminatedShift, +AuthenticationModeShift = +AddressDiscriminatedShift + AddressDiscriminatedBits, +AuthenticationModeBits = 2, +AuthenticationModeMask = ((1 <<
[clang] [PAC][clang] Define `PointerAuthQualifier` and `PointerAuthenticationMode` (PR #84384)
@@ -139,6 +141,168 @@ using CanQualType = CanQual; #define TYPE(Class, Base) class Class##Type; #include "clang/AST/TypeNodes.inc" +/// Pointer-authentication qualifiers. +class PointerAuthQualifier { + enum : uint32_t { +EnabledShift = 0, +EnabledBits = 1, +EnabledMask = 1 << EnabledShift, +AddressDiscriminatedShift = EnabledShift + EnabledBits, +AddressDiscriminatedBits = 1, +AddressDiscriminatedMask = 1 << AddressDiscriminatedShift, +AuthenticationModeShift = +AddressDiscriminatedShift + AddressDiscriminatedBits, +AuthenticationModeBits = 2, +AuthenticationModeMask = ((1 << AuthenticationModeBits) - 1) + << AuthenticationModeShift, +IsaPointerShift = AuthenticationModeShift + AuthenticationModeBits, +IsaPointerBits = 1, +IsaPointerMask = ((1 << IsaPointerBits) - 1) << IsaPointerShift, +AuthenticatesNullValuesShift = IsaPointerShift + IsaPointerBits, +AuthenticatesNullValuesBits = 1, +AuthenticatesNullValuesMask = ((1 << AuthenticatesNullValuesBits) - 1) + << AuthenticatesNullValuesShift, +KeyShift = AuthenticatesNullValuesShift + AuthenticatesNullValuesBits, +KeyBits = 10, +KeyMask = ((1 << KeyBits) - 1) << KeyShift, +DiscriminatorShift = KeyShift + KeyBits, +DiscriminatorBits = 16, +DiscriminatorMask = ((1u << DiscriminatorBits) - 1) << DiscriminatorShift, + }; + + // bits: |0 |1 |2..3 |4 | + // |Enabled|Address|AuthenticationMode|ISA pointer| + // bits: |5|6..15| 16...31 | + // |AuthenticatesNull|Key |Discriminator| + uint32_t Data; AaronBallman wrote: ```suggestion uint32_t Data = 0; ``` https://github.com/llvm/llvm-project/pull/84384 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [PAC][clang] Define `PointerAuthQualifier` and `PointerAuthenticationMode` (PR #84384)
@@ -2196,6 +2196,16 @@ class ASTContext : public RefCountedBase { return getQualifiedType(type.getUnqualifiedType(), Qs); } + /// \brief Return a type with the given __ptrauth qualifier. + QualType getPointerAuthType(QualType Ty, PointerAuthQualifier PointerAuth) { +assert(!Ty.getPointerAuth()); +assert(PointerAuth); + +Qualifiers qs; +qs.setPointerAuth(PointerAuth); +return getQualifiedType(Ty, qs); AaronBallman wrote: ```suggestion Qualifiers QS; QS.setPointerAuth(PointerAuth); return getQualifiedType(Ty, QS); ``` Naming style nits. https://github.com/llvm/llvm-project/pull/84384 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [PAC][clang] Define `PointerAuthQualifier` and `PointerAuthenticationMode` (PR #84384)
@@ -607,13 +799,17 @@ class Qualifiers { void Profile(llvm::FoldingSetNodeID ) const { ID.AddInteger(Mask); +PtrAuth.Profile(ID); } private: // bits: |0 1 2|3|4 .. 5|6 .. 8|9 ... 31| // |C R V|U|GCAttr|Lifetime|AddressSpace| uint32_t Mask = 0; + PointerAuthQualifier PtrAuth; AaronBallman wrote: This doubles the size of `Qualifiers` which is passed by value all over the place. I don't expect significant performance issues from this (though we do still support 32-bit builds of Clang), but do you have ideas on how this impacts compile time performance and memory pressure? (Changes in the type system can have outsized impact in surprising places.) It may be worth putting a branch up on https://llvm-compile-time-tracker.com/ to see how this impacts things. https://github.com/llvm/llvm-project/pull/84384 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [PAC][clang] Define `PointerAuthQualifier` and `PointerAuthenticationMode` (PR #84384)
https://github.com/AaronBallman edited https://github.com/llvm/llvm-project/pull/84384 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [PAC][clang] Define `PointerAuthQualifier` and `PointerAuthenticationMode` (PR #84384)
@@ -139,6 +141,168 @@ using CanQualType = CanQual; #define TYPE(Class, Base) class Class##Type; #include "clang/AST/TypeNodes.inc" +/// Pointer-authentication qualifiers. +class PointerAuthQualifier { + enum : uint32_t { +EnabledShift = 0, +EnabledBits = 1, +EnabledMask = 1 << EnabledShift, +AddressDiscriminatedShift = EnabledShift + EnabledBits, +AddressDiscriminatedBits = 1, +AddressDiscriminatedMask = 1 << AddressDiscriminatedShift, +AuthenticationModeShift = +AddressDiscriminatedShift + AddressDiscriminatedBits, +AuthenticationModeBits = 2, +AuthenticationModeMask = ((1 << AuthenticationModeBits) - 1) + << AuthenticationModeShift, +IsaPointerShift = AuthenticationModeShift + AuthenticationModeBits, +IsaPointerBits = 1, +IsaPointerMask = ((1 << IsaPointerBits) - 1) << IsaPointerShift, +AuthenticatesNullValuesShift = IsaPointerShift + IsaPointerBits, +AuthenticatesNullValuesBits = 1, +AuthenticatesNullValuesMask = ((1 << AuthenticatesNullValuesBits) - 1) + << AuthenticatesNullValuesShift, +KeyShift = AuthenticatesNullValuesShift + AuthenticatesNullValuesBits, +KeyBits = 10, +KeyMask = ((1 << KeyBits) - 1) << KeyShift, +DiscriminatorShift = KeyShift + KeyBits, +DiscriminatorBits = 16, +DiscriminatorMask = ((1u << DiscriminatorBits) - 1) << DiscriminatorShift, + }; + + // bits: |0 |1 |2..3 |4 | + // |Enabled|Address|AuthenticationMode|ISA pointer| + // bits: |5|6..15| 16...31 | + // |AuthenticatesNull|Key |Discriminator| + uint32_t Data; + + // The following static assertions check that each of the 32 bits is present + // exactly in one of the constants. + static_assert((EnabledBits + AddressDiscriminatedBits + + AuthenticationModeBits + IsaPointerBits + + AuthenticatesNullValuesBits + KeyBits + DiscriminatorBits) == +32, +"PointerAuthQualifier should be exactly 32 bits"); + static_assert((EnabledMask + AddressDiscriminatedMask + + AuthenticationModeMask + IsaPointerMask + + AuthenticatesNullValuesMask + KeyMask + DiscriminatorMask) == +0x, +"All masks should cover the entire bits"); + static_assert((EnabledMask ^ AddressDiscriminatedMask ^ + AuthenticationModeMask ^ IsaPointerMask ^ + AuthenticatesNullValuesMask ^ KeyMask ^ DiscriminatorMask) == +0x, +"All masks should cover the entire bits"); + + PointerAuthQualifier(unsigned Key, bool IsAddressDiscriminated, + unsigned ExtraDiscriminator, + PointerAuthenticationMode AuthenticationMode, + bool IsIsaPointer, bool AuthenticatesNullValues) + : Data(EnabledMask | + (IsAddressDiscriminated + ? llvm::to_underlying(AddressDiscriminatedMask) + : 0) | + (Key << KeyShift) | + (llvm::to_underlying(AuthenticationMode) + << AuthenticationModeShift) | + (ExtraDiscriminator << DiscriminatorShift) | + (IsIsaPointer << IsaPointerShift) | + (AuthenticatesNullValues << AuthenticatesNullValuesShift)) { +assert(Key <= KeyNoneInternal); +assert(ExtraDiscriminator <= MaxDiscriminator); + } + +public: + enum { +KeyNoneInternal = (1u << KeyBits) - 1, + +/// The maximum supported pointer-authentication key. +MaxKey = KeyNoneInternal - 1, + +/// The maximum supported pointer-authentication discriminator. +MaxDiscriminator = (1u << DiscriminatorBits) - 1 + }; + +public: + PointerAuthQualifier() : Data(0) {} AaronBallman wrote: ```suggestion ``` https://github.com/llvm/llvm-project/pull/84384 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [PAC][clang] Define `PointerAuthQualifier` and `PointerAuthenticationMode` (PR #84384)
@@ -194,19 +358,27 @@ class Qualifiers { FastMask = (1 << FastWidth) - 1 }; + Qualifiers() : Mask(0), PtrAuth() {} + AaronBallman wrote: ```suggestion ``` Not needed; the default ctor will be automatically called and `Mask` has an inline initializer. https://github.com/llvm/llvm-project/pull/84384 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [PAC][clang] Define `PointerAuthQualifier` and `PointerAuthenticationMode` (PR #84384)
https://github.com/AaronBallman commented: The changes have no testing associated with them -- what's the plan for that? https://github.com/llvm/llvm-project/pull/84384 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [PAC][clang] Define `PointerAuthQualifier` and `PointerAuthenticationMode` (PR #84384)
rjmccall wrote: It's my patch, so me signing off isn't very meaningful. https://github.com/llvm/llvm-project/pull/84384 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [PAC][clang] Define `PointerAuthQualifier` and `PointerAuthenticationMode` (PR #84384)
Michael137 wrote: LGTM, but would like @rjmccall or @AaronBallman (or another code-owner) to give final approval https://github.com/llvm/llvm-project/pull/84384 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [PAC][clang] Define `PointerAuthQualifier` and `PointerAuthenticationMode` (PR #84384)
https://github.com/Michael137 edited https://github.com/llvm/llvm-project/pull/84384 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [PAC][clang] Define `PointerAuthQualifier` and `PointerAuthenticationMode` (PR #84384)
@@ -251,15 +423,16 @@ class Qualifiers { } // Deserialize qualifiers from an opaque representation. - static Qualifiers fromOpaqueValue(unsigned opaque) { + static Qualifiers fromOpaqueValue(uint64_t Opaque) { Qualifiers Qs; -Qs.Mask = opaque; +Qs.Mask = uint32_t(Opaque); Michael137 wrote: Either of those look better imo, or could even use `maskTrailingOnes` from `Support/MathExtras.h` https://github.com/llvm/llvm-project/pull/84384 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [PAC][clang] Define `PointerAuthQualifier` and `PointerAuthenticationMode` (PR #84384)
rjmccall wrote: It'll be tested in a follow-up commit which actually adds parsing and Sema support for these as qualifiers. That should be sufficient rather than adding a whole unit-test apparatus. Daniil is just trying to avoid landing this in a single massive commit. https://github.com/llvm/llvm-project/pull/84384 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [PAC][clang] Define `PointerAuthQualifier` and `PointerAuthenticationMode` (PR #84384)
kovdan01 wrote: Although functions in this file use different code styles for function arguments (both `camelCase` and `PascalCase`), I've changed the code style for function arguments of newly added functions to `PascalCase` as described in https://llvm.org/docs/CodingStandards.html#name-types-functions-variables-and-enumerators-properly - see 3517033bd3a8b676abd649562bcfc7eb4d278d09. I could also submit a subsequent PR fixing the code style of function parameters in clang/include/clang/AST/Type.h and clang/include/clang/AST/ASTContext.h which are not in `PascalCase`. Please let me know if there are any objections on this. https://github.com/llvm/llvm-project/pull/84384 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [PAC][clang] Define `PointerAuthQualifier` and `PointerAuthenticationMode` (PR #84384)
kovdan01 wrote: > Are there unittests where we could exercise these types? @Michael137 Could you clarify a bit, what is the correct place for such a unit test? As for `ASTContext` methods similar to newly proposed `getPointerAuthType` (like `getQualifiedType` and `getCVRQualifiedType`), I've not found unit tests with them. As for `Qualifiers` class also touched in this PR, I've not found tests for it at all. Newly proposed `PointerAuthQualifier` qualifier, obviously, also has no unit tests now, but if we want to implement them, they should be placed somewhere near unit tests for `Qualifiers` which are absent as well. https://github.com/llvm/llvm-project/pull/84384 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [PAC][clang] Define `PointerAuthQualifier` and `PointerAuthenticationMode` (PR #84384)
@@ -251,15 +423,16 @@ class Qualifiers { } // Deserialize qualifiers from an opaque representation. - static Qualifiers fromOpaqueValue(unsigned opaque) { + static Qualifiers fromOpaqueValue(uint64_t Opaque) { Qualifiers Qs; -Qs.Mask = opaque; +Qs.Mask = uint32_t(Opaque); kovdan01 wrote: Is this OK or should we prefer smth like `Opaque & 0x` or even `Opaque & std::numeric_limits::max()` (or smth else)? https://github.com/llvm/llvm-project/pull/84384 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [PAC][clang] Define `PointerAuthQualifier` and `PointerAuthenticationMode` (PR #84384)
@@ -138,6 +140,165 @@ using CanQualType = CanQual; #define TYPE(Class, Base) class Class##Type; #include "clang/AST/TypeNodes.inc" +/// Pointer-authentication qualifiers. +class PointerAuthQualifier { + enum : uint32_t { +EnabledShift = 0, +EnabledBits = 1, +EnabledMask = 1 << EnabledShift, +AddressDiscriminatedShift = EnabledShift + EnabledBits, +AddressDiscriminatedBits = 1, +AddressDiscriminatedMask = 1 << AddressDiscriminatedShift, +AuthenticationModeShift = +AddressDiscriminatedShift + AddressDiscriminatedBits, +AuthenticationModeBits = 2, +AuthenticationModeMask = ((1 << AuthenticationModeBits) - 1) + << AuthenticationModeShift, +IsaPointerShift = AuthenticationModeShift + AuthenticationModeBits, +IsaPointerBits = 1, +IsaPointerMask = ((1 << IsaPointerBits) - 1) << IsaPointerShift, +AuthenticatesNullValuesShift = IsaPointerShift + IsaPointerBits, +AuthenticatesNullValuesBits = 1, +AuthenticatesNullValuesMask = ((1 << AuthenticatesNullValuesBits) - 1) + << AuthenticatesNullValuesShift, +KeyShift = AuthenticatesNullValuesShift + AuthenticatesNullValuesBits, +KeyBits = 10, +KeyMask = ((1 << KeyBits) - 1) << KeyShift, +DiscriminatorShift = KeyShift + KeyBits, +DiscriminatorBits = 16, +DiscriminatorMask = ((1u << DiscriminatorBits) - 1) << DiscriminatorShift, + }; + + // bits: |0 |1 |2..3 |4 | + // |Enabled|Address|AuthenticationMode|ISA pointer| + // bits: |5|6..15| 16...31 | + // |AuthenticatesNull|Key |Discriminator| + uint32_t Data; + + static_assert((EnabledBits + AddressDiscriminatedBits + + AuthenticationModeBits + IsaPointerBits + + AuthenticatesNullValuesBits + KeyBits + DiscriminatorBits) == +32, +"PointerAuthQualifier should be exactly 32 bits"); + static_assert((EnabledMask + AddressDiscriminatedMask + + AuthenticationModeMask + IsaPointerMask + + AuthenticatesNullValuesMask + KeyMask + DiscriminatorMask) == +0x, +"All masks should cover the entire bits"); + static_assert((EnabledMask ^ AddressDiscriminatedMask ^ + AuthenticationModeMask ^ IsaPointerMask ^ + AuthenticatesNullValuesMask ^ KeyMask ^ DiscriminatorMask) == +0x, +"All masks should cover the entire bits"); + + PointerAuthQualifier(unsigned key, bool isAddressDiscriminated, + unsigned extraDiscriminator, + PointerAuthenticationMode authenticationMode, + bool isIsaPointer, bool authenticatesNullValues) + : Data(EnabledMask | + (isAddressDiscriminated + ? static_cast(AddressDiscriminatedMask) kovdan01 wrote: Fixed, thanks, see 3517033bd3a8b676abd649562bcfc7eb4d278d09 https://github.com/llvm/llvm-project/pull/84384 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [PAC][clang] Define `PointerAuthQualifier` and `PointerAuthenticationMode` (PR #84384)
@@ -138,6 +140,165 @@ using CanQualType = CanQual; #define TYPE(Class, Base) class Class##Type; #include "clang/AST/TypeNodes.inc" +/// Pointer-authentication qualifiers. +class PointerAuthQualifier { + enum : uint32_t { +EnabledShift = 0, +EnabledBits = 1, +EnabledMask = 1 << EnabledShift, +AddressDiscriminatedShift = EnabledShift + EnabledBits, +AddressDiscriminatedBits = 1, +AddressDiscriminatedMask = 1 << AddressDiscriminatedShift, +AuthenticationModeShift = +AddressDiscriminatedShift + AddressDiscriminatedBits, +AuthenticationModeBits = 2, +AuthenticationModeMask = ((1 << AuthenticationModeBits) - 1) + << AuthenticationModeShift, +IsaPointerShift = AuthenticationModeShift + AuthenticationModeBits, +IsaPointerBits = 1, +IsaPointerMask = ((1 << IsaPointerBits) - 1) << IsaPointerShift, +AuthenticatesNullValuesShift = IsaPointerShift + IsaPointerBits, +AuthenticatesNullValuesBits = 1, +AuthenticatesNullValuesMask = ((1 << AuthenticatesNullValuesBits) - 1) + << AuthenticatesNullValuesShift, +KeyShift = AuthenticatesNullValuesShift + AuthenticatesNullValuesBits, +KeyBits = 10, +KeyMask = ((1 << KeyBits) - 1) << KeyShift, +DiscriminatorShift = KeyShift + KeyBits, +DiscriminatorBits = 16, +DiscriminatorMask = ((1u << DiscriminatorBits) - 1) << DiscriminatorShift, + }; + + // bits: |0 |1 |2..3 |4 | + // |Enabled|Address|AuthenticationMode|ISA pointer| + // bits: |5|6..15| 16...31 | + // |AuthenticatesNull|Key |Discriminator| + uint32_t Data; + + static_assert((EnabledBits + AddressDiscriminatedBits + + AuthenticationModeBits + IsaPointerBits + + AuthenticatesNullValuesBits + KeyBits + DiscriminatorBits) == +32, +"PointerAuthQualifier should be exactly 32 bits"); + static_assert((EnabledMask + AddressDiscriminatedMask + + AuthenticationModeMask + IsaPointerMask + + AuthenticatesNullValuesMask + KeyMask + DiscriminatorMask) == +0x, +"All masks should cover the entire bits"); + static_assert((EnabledMask ^ AddressDiscriminatedMask ^ + AuthenticationModeMask ^ IsaPointerMask ^ + AuthenticatesNullValuesMask ^ KeyMask ^ DiscriminatorMask) == +0x, +"All masks should cover the entire bits"); + + PointerAuthQualifier(unsigned key, bool isAddressDiscriminated, + unsigned extraDiscriminator, + PointerAuthenticationMode authenticationMode, + bool isIsaPointer, bool authenticatesNullValues) + : Data(EnabledMask | + (isAddressDiscriminated + ? static_cast(AddressDiscriminatedMask) + : 0) | + (key << KeyShift) | + (unsigned(authenticationMode) << AuthenticationModeShift) | kovdan01 wrote: Fixed, thanks, see 3517033bd3a8b676abd649562bcfc7eb4d278d09 https://github.com/llvm/llvm-project/pull/84384 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [PAC][clang] Define `PointerAuthQualifier` and `PointerAuthenticationMode` (PR #84384)
@@ -138,6 +140,165 @@ using CanQualType = CanQual; #define TYPE(Class, Base) class Class##Type; #include "clang/AST/TypeNodes.inc" +/// Pointer-authentication qualifiers. +class PointerAuthQualifier { + enum : uint32_t { +EnabledShift = 0, +EnabledBits = 1, +EnabledMask = 1 << EnabledShift, +AddressDiscriminatedShift = EnabledShift + EnabledBits, +AddressDiscriminatedBits = 1, +AddressDiscriminatedMask = 1 << AddressDiscriminatedShift, +AuthenticationModeShift = +AddressDiscriminatedShift + AddressDiscriminatedBits, +AuthenticationModeBits = 2, +AuthenticationModeMask = ((1 << AuthenticationModeBits) - 1) + << AuthenticationModeShift, +IsaPointerShift = AuthenticationModeShift + AuthenticationModeBits, +IsaPointerBits = 1, +IsaPointerMask = ((1 << IsaPointerBits) - 1) << IsaPointerShift, +AuthenticatesNullValuesShift = IsaPointerShift + IsaPointerBits, +AuthenticatesNullValuesBits = 1, +AuthenticatesNullValuesMask = ((1 << AuthenticatesNullValuesBits) - 1) + << AuthenticatesNullValuesShift, +KeyShift = AuthenticatesNullValuesShift + AuthenticatesNullValuesBits, +KeyBits = 10, +KeyMask = ((1 << KeyBits) - 1) << KeyShift, +DiscriminatorShift = KeyShift + KeyBits, +DiscriminatorBits = 16, +DiscriminatorMask = ((1u << DiscriminatorBits) - 1) << DiscriminatorShift, + }; + + // bits: |0 |1 |2..3 |4 | + // |Enabled|Address|AuthenticationMode|ISA pointer| + // bits: |5|6..15| 16...31 | + // |AuthenticatesNull|Key |Discriminator| + uint32_t Data; + + static_assert((EnabledBits + AddressDiscriminatedBits + + AuthenticationModeBits + IsaPointerBits + + AuthenticatesNullValuesBits + KeyBits + DiscriminatorBits) == +32, +"PointerAuthQualifier should be exactly 32 bits"); + static_assert((EnabledMask + AddressDiscriminatedMask + + AuthenticationModeMask + IsaPointerMask + + AuthenticatesNullValuesMask + KeyMask + DiscriminatorMask) == +0x, +"All masks should cover the entire bits"); + static_assert((EnabledMask ^ AddressDiscriminatedMask ^ + AuthenticationModeMask ^ IsaPointerMask ^ + AuthenticatesNullValuesMask ^ KeyMask ^ DiscriminatorMask) == +0x, +"All masks should cover the entire bits"); + + PointerAuthQualifier(unsigned key, bool isAddressDiscriminated, + unsigned extraDiscriminator, + PointerAuthenticationMode authenticationMode, + bool isIsaPointer, bool authenticatesNullValues) + : Data(EnabledMask | + (isAddressDiscriminated + ? static_cast(AddressDiscriminatedMask) + : 0) | + (key << KeyShift) | + (unsigned(authenticationMode) << AuthenticationModeShift) | + (extraDiscriminator << DiscriminatorShift) | + (isIsaPointer << IsaPointerShift) | + (authenticatesNullValues << AuthenticatesNullValuesShift)) { +assert(key <= KeyNoneInternal); +assert(extraDiscriminator <= MaxDiscriminator); + } + +public: + enum { +KeyNoneInternal = (1u << KeyBits) - 1, + +/// The maximum supported pointer-authentication key. +MaxKey = KeyNoneInternal - 1, + +/// The maximum supported pointer-authentication discriminator. +MaxDiscriminator = (1u << DiscriminatorBits) - 1 + }; + +public: + PointerAuthQualifier() : Data(0) {} + + static PointerAuthQualifier + Create(int key, bool isAddressDiscriminated, unsigned extraDiscriminator, kovdan01 wrote: It should be one type everywhere, thanks for bringing attention to this. Changed to `unsigned` to keep things consistent with other parameters. https://github.com/llvm/llvm-project/pull/84384 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [PAC][clang] Define `PointerAuthQualifier` and `PointerAuthenticationMode` (PR #84384)
@@ -138,6 +140,165 @@ using CanQualType = CanQual; #define TYPE(Class, Base) class Class##Type; #include "clang/AST/TypeNodes.inc" +/// Pointer-authentication qualifiers. +class PointerAuthQualifier { + enum : uint32_t { +EnabledShift = 0, +EnabledBits = 1, +EnabledMask = 1 << EnabledShift, +AddressDiscriminatedShift = EnabledShift + EnabledBits, +AddressDiscriminatedBits = 1, +AddressDiscriminatedMask = 1 << AddressDiscriminatedShift, +AuthenticationModeShift = +AddressDiscriminatedShift + AddressDiscriminatedBits, +AuthenticationModeBits = 2, +AuthenticationModeMask = ((1 << AuthenticationModeBits) - 1) + << AuthenticationModeShift, +IsaPointerShift = AuthenticationModeShift + AuthenticationModeBits, +IsaPointerBits = 1, +IsaPointerMask = ((1 << IsaPointerBits) - 1) << IsaPointerShift, +AuthenticatesNullValuesShift = IsaPointerShift + IsaPointerBits, +AuthenticatesNullValuesBits = 1, +AuthenticatesNullValuesMask = ((1 << AuthenticatesNullValuesBits) - 1) + << AuthenticatesNullValuesShift, +KeyShift = AuthenticatesNullValuesShift + AuthenticatesNullValuesBits, +KeyBits = 10, +KeyMask = ((1 << KeyBits) - 1) << KeyShift, +DiscriminatorShift = KeyShift + KeyBits, +DiscriminatorBits = 16, +DiscriminatorMask = ((1u << DiscriminatorBits) - 1) << DiscriminatorShift, + }; + + // bits: |0 |1 |2..3 |4 | + // |Enabled|Address|AuthenticationMode|ISA pointer| + // bits: |5|6..15| 16...31 | + // |AuthenticatesNull|Key |Discriminator| + uint32_t Data; + + static_assert((EnabledBits + AddressDiscriminatedBits + + AuthenticationModeBits + IsaPointerBits + + AuthenticatesNullValuesBits + KeyBits + DiscriminatorBits) == +32, +"PointerAuthQualifier should be exactly 32 bits"); + static_assert((EnabledMask + AddressDiscriminatedMask + + AuthenticationModeMask + IsaPointerMask + + AuthenticatesNullValuesMask + KeyMask + DiscriminatorMask) == +0x, +"All masks should cover the entire bits"); + static_assert((EnabledMask ^ AddressDiscriminatedMask ^ kovdan01 wrote: I think that both static assertions should be left (probably with messages changed to distinguish them - suggestions are welcome). What we want to check is that every single bit out of all 32 bits is present in one and only one of the constants (added a comment in code mentioning that). If we only check the sum of the constants, we might miss a situation when some bits are present in more than one constant while others are not present at all, like `0b111 = 0b100 + 0b10 + 0b1 = 0b11 + 0b11 + 0b1`. Counting xor would reveal the issue. If we only check the xor of the constants, we might miss a situation when all the bits are present, but some of them are present not once, but odd number of times, like `0b111 = 0b111 ^ 0b111 ^ 0b111`. Counting sum would reveal the issue (keeping in mind that arithmetic on `uint32_t` works on 2^32 modulo). Since constants definition is not trivial, it's probably better to leave both assertions here to avoid potential. Please let me know if I miss smth. https://github.com/llvm/llvm-project/pull/84384 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [PAC][clang] Define `PointerAuthQualifier` and `PointerAuthenticationMode` (PR #84384)
https://github.com/kovdan01 updated https://github.com/llvm/llvm-project/pull/84384 >From ef23d427b48687b62da9e1062886ddfcc1649b6a Mon Sep 17 00:00:00 2001 From: John McCall Date: Mon, 16 Dec 2019 20:31:25 -0500 Subject: [PATCH 1/5] Abstract serialization fixes for the Apple Clang changes. --- clang/include/clang/AST/AbstractBasicReader.h | 4 ++-- clang/include/clang/AST/AbstractBasicWriter.h | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/clang/include/clang/AST/AbstractBasicReader.h b/clang/include/clang/AST/AbstractBasicReader.h index 1f2797cc701458..ab036f1d445acc 100644 --- a/clang/include/clang/AST/AbstractBasicReader.h +++ b/clang/include/clang/AST/AbstractBasicReader.h @@ -213,9 +213,9 @@ class DataStreamBasicReader : public BasicReaderBase { } Qualifiers readQualifiers() { -static_assert(sizeof(Qualifiers().getAsOpaqueValue()) <= sizeof(uint32_t), +static_assert(sizeof(Qualifiers().getAsOpaqueValue()) <= sizeof(uint64_t), "update this if the value size changes"); -uint32_t value = asImpl().readUInt32(); +uint64_t value = asImpl().readUInt64(); return Qualifiers::fromOpaqueValue(value); } diff --git a/clang/include/clang/AST/AbstractBasicWriter.h b/clang/include/clang/AST/AbstractBasicWriter.h index 07afa388de2c17..8e42fcaad1d388 100644 --- a/clang/include/clang/AST/AbstractBasicWriter.h +++ b/clang/include/clang/AST/AbstractBasicWriter.h @@ -196,9 +196,9 @@ class DataStreamBasicWriter : public BasicWriterBase { } void writeQualifiers(Qualifiers value) { -static_assert(sizeof(value.getAsOpaqueValue()) <= sizeof(uint32_t), +static_assert(sizeof(value.getAsOpaqueValue()) <= sizeof(uint64_t), "update this if the value size changes"); -asImpl().writeUInt32(value.getAsOpaqueValue()); +asImpl().writeUInt64(value.getAsOpaqueValue()); } void writeExceptionSpecInfo( >From 9e296a1a69158419960c265f12f52523db0c8e2a Mon Sep 17 00:00:00 2001 From: Daniil Kovalev Date: Thu, 7 Mar 2024 15:34:24 +0300 Subject: [PATCH 2/5] [clang] Define `PointerAuthenticationMode` enum --- clang/include/clang/Basic/LangOptions.h | 7 +++ 1 file changed, 7 insertions(+) diff --git a/clang/include/clang/Basic/LangOptions.h b/clang/include/clang/Basic/LangOptions.h index 862952d336ef31..6fe7472d8ad0ca 100644 --- a/clang/include/clang/Basic/LangOptions.h +++ b/clang/include/clang/Basic/LangOptions.h @@ -57,6 +57,13 @@ enum class ShaderStage { Invalid, }; +enum class PointerAuthenticationMode : unsigned { + None, + Strip, + SignAndStrip, + SignAndAuth +}; + /// Bitfields of LangOptions, split out from LangOptions in order to ensure that /// this large collection of bitfields is a trivial class type. class LangOptionsBase { >From 71d7760aa9cc459d7bc0365fa079f64cb5704c96 Mon Sep 17 00:00:00 2001 From: Daniil Kovalev Date: Thu, 7 Mar 2024 15:31:03 +0300 Subject: [PATCH 3/5] [clang] Define `PointerAuthQualifier` class Includes changes from the following commits from the branch https://github.com/ahmedbougacha/llvm-project/tree/eng/arm64e-upstream-llvmorg - Initial support https://github.com/ahmedbougacha/llvm-project/commit/cc7ba7eb1814e9b254c7d94aa0b78cb0e21acfc5 - ObjC isa signing https://github.com/ahmedbougacha/llvm-project/commit/c9ce0d408f1d9aeffc7b86256334220aec6de5a3 Also applies a fix from https://github.com/access-softek/llvm-project/pull/75 Co-authored-by: Ahmed Bougacha --- clang/include/clang/AST/Type.h| 215 +- .../include/clang/Basic/PointerAuthOptions.h | 23 ++ 2 files changed, 227 insertions(+), 11 deletions(-) create mode 100644 clang/include/clang/Basic/PointerAuthOptions.h diff --git a/clang/include/clang/AST/Type.h b/clang/include/clang/AST/Type.h index 1942b0e67f65a3..1741a3017f7280 100644 --- a/clang/include/clang/AST/Type.h +++ b/clang/include/clang/AST/Type.h @@ -25,8 +25,10 @@ #include "clang/Basic/Diagnostic.h" #include "clang/Basic/ExceptionSpecificationType.h" #include "clang/Basic/LLVM.h" +#include "clang/Basic/LangOptions.h" #include "clang/Basic/Linkage.h" #include "clang/Basic/PartialDiagnostic.h" +#include "clang/Basic/PointerAuthOptions.h" #include "clang/Basic/SourceLocation.h" #include "clang/Basic/Specifiers.h" #include "clang/Basic/Visibility.h" @@ -138,6 +140,165 @@ using CanQualType = CanQual; #define TYPE(Class, Base) class Class##Type; #include "clang/AST/TypeNodes.inc" +/// Pointer-authentication qualifiers. +class PointerAuthQualifier { + enum : uint32_t { +EnabledShift = 0, +EnabledBits = 1, +EnabledMask = 1 << EnabledShift, +AddressDiscriminatedShift = EnabledShift + EnabledBits, +AddressDiscriminatedBits = 1, +AddressDiscriminatedMask = 1 << AddressDiscriminatedShift, +AuthenticationModeShift = +AddressDiscriminatedShift + AddressDiscriminatedBits, +AuthenticationModeBits = 2, +AuthenticationModeMask = ((1 <<
[clang] [PAC][clang] Define `PointerAuthQualifier` and `PointerAuthenticationMode` (PR #84384)
kovdan01 wrote: A kind reminder regarding the PR - would be glad to see feedback from everyone interested. https://github.com/llvm/llvm-project/pull/84384 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [PAC][clang] Define `PointerAuthQualifier` and `PointerAuthenticationMode` (PR #84384)
llvmbot wrote: @llvm/pr-subscribers-clang-modules Author: Daniil Kovalev (kovdan01) Changes This brings declarations of `PointerAuthQualifier` class and `PointerAuthenticationMode` enum and related functions required for PAuth support in lldb (see #84387) from downstream Apple's code. Co-authored-by: Ahmed Bougacha ahmed@bougacha.org Co-authored-by: John McCall rjmccall@apple.com --- Full diff: https://github.com/llvm/llvm-project/pull/84384.diff 6 Files Affected: - (modified) clang/include/clang/AST/ASTContext.h (+10) - (modified) clang/include/clang/AST/AbstractBasicReader.h (+2-2) - (modified) clang/include/clang/AST/AbstractBasicWriter.h (+2-2) - (modified) clang/include/clang/AST/Type.h (+208-11) - (modified) clang/include/clang/Basic/LangOptions.h (+7) - (added) clang/include/clang/Basic/PointerAuthOptions.h (+23) ``diff diff --git a/clang/include/clang/AST/ASTContext.h b/clang/include/clang/AST/ASTContext.h index ff6b64c7f72d57..4fd214592d1f27 100644 --- a/clang/include/clang/AST/ASTContext.h +++ b/clang/include/clang/AST/ASTContext.h @@ -2182,6 +2182,16 @@ class ASTContext : public RefCountedBase { return getQualifiedType(type.getUnqualifiedType(), Qs); } + /// \brief Return a type with the given __ptrauth qualifier. + QualType getPointerAuthType(QualType type, PointerAuthQualifier pointerAuth) { +assert(!type.getPointerAuth()); +assert(pointerAuth); + +Qualifiers qs; +qs.setPointerAuth(pointerAuth); +return getQualifiedType(type, qs); + } + unsigned char getFixedPointScale(QualType Ty) const; unsigned char getFixedPointIBits(QualType Ty) const; llvm::FixedPointSemantics getFixedPointSemantics(QualType Ty) const; diff --git a/clang/include/clang/AST/AbstractBasicReader.h b/clang/include/clang/AST/AbstractBasicReader.h index 1f2797cc701458..ab036f1d445acc 100644 --- a/clang/include/clang/AST/AbstractBasicReader.h +++ b/clang/include/clang/AST/AbstractBasicReader.h @@ -213,9 +213,9 @@ class DataStreamBasicReader : public BasicReaderBase { } Qualifiers readQualifiers() { -static_assert(sizeof(Qualifiers().getAsOpaqueValue()) <= sizeof(uint32_t), +static_assert(sizeof(Qualifiers().getAsOpaqueValue()) <= sizeof(uint64_t), "update this if the value size changes"); -uint32_t value = asImpl().readUInt32(); +uint64_t value = asImpl().readUInt64(); return Qualifiers::fromOpaqueValue(value); } diff --git a/clang/include/clang/AST/AbstractBasicWriter.h b/clang/include/clang/AST/AbstractBasicWriter.h index 07afa388de2c17..8e42fcaad1d388 100644 --- a/clang/include/clang/AST/AbstractBasicWriter.h +++ b/clang/include/clang/AST/AbstractBasicWriter.h @@ -196,9 +196,9 @@ class DataStreamBasicWriter : public BasicWriterBase { } void writeQualifiers(Qualifiers value) { -static_assert(sizeof(value.getAsOpaqueValue()) <= sizeof(uint32_t), +static_assert(sizeof(value.getAsOpaqueValue()) <= sizeof(uint64_t), "update this if the value size changes"); -asImpl().writeUInt32(value.getAsOpaqueValue()); +asImpl().writeUInt64(value.getAsOpaqueValue()); } void writeExceptionSpecInfo( diff --git a/clang/include/clang/AST/Type.h b/clang/include/clang/AST/Type.h index 1942b0e67f65a3..48a51dd851ac36 100644 --- a/clang/include/clang/AST/Type.h +++ b/clang/include/clang/AST/Type.h @@ -25,8 +25,10 @@ #include "clang/Basic/Diagnostic.h" #include "clang/Basic/ExceptionSpecificationType.h" #include "clang/Basic/LLVM.h" +#include "clang/Basic/LangOptions.h" #include "clang/Basic/Linkage.h" #include "clang/Basic/PartialDiagnostic.h" +#include "clang/Basic/PointerAuthOptions.h" #include "clang/Basic/SourceLocation.h" #include "clang/Basic/Specifiers.h" #include "clang/Basic/Visibility.h" @@ -138,6 +140,165 @@ using CanQualType = CanQual; #define TYPE(Class, Base) class Class##Type; #include "clang/AST/TypeNodes.inc" +/// Pointer-authentication qualifiers. +class PointerAuthQualifier { + enum : uint32_t { +EnabledShift = 0, +EnabledBits = 1, +EnabledMask = 1 << EnabledShift, +AddressDiscriminatedShift = EnabledShift + EnabledBits, +AddressDiscriminatedBits = 1, +AddressDiscriminatedMask = 1 << AddressDiscriminatedShift, +AuthenticationModeShift = +AddressDiscriminatedShift + AddressDiscriminatedBits, +AuthenticationModeBits = 2, +AuthenticationModeMask = ((1 << AuthenticationModeBits) - 1) + << AuthenticationModeShift, +IsaPointerShift = AuthenticationModeShift + AuthenticationModeBits, +IsaPointerBits = 1, +IsaPointerMask = ((1 << IsaPointerBits) - 1) << IsaPointerShift, +AuthenticatesNullValuesShift = IsaPointerShift + IsaPointerBits, +AuthenticatesNullValuesBits = 1, +AuthenticatesNullValuesMask = ((1 << AuthenticatesNullValuesBits) - 1) + << AuthenticatesNullValuesShift, +KeyShift = AuthenticatesNullValuesShift +
[clang] [PAC][clang] Define `PointerAuthQualifier` and `PointerAuthenticationMode` (PR #84384)
https://github.com/kovdan01 ready_for_review https://github.com/llvm/llvm-project/pull/84384 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [PAC][clang] Define `PointerAuthQualifier` and `PointerAuthenticationMode` (PR #84384)
https://github.com/kovdan01 updated https://github.com/llvm/llvm-project/pull/84384 >From ef23d427b48687b62da9e1062886ddfcc1649b6a Mon Sep 17 00:00:00 2001 From: John McCall Date: Mon, 16 Dec 2019 20:31:25 -0500 Subject: [PATCH 1/4] Abstract serialization fixes for the Apple Clang changes. --- clang/include/clang/AST/AbstractBasicReader.h | 4 ++-- clang/include/clang/AST/AbstractBasicWriter.h | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/clang/include/clang/AST/AbstractBasicReader.h b/clang/include/clang/AST/AbstractBasicReader.h index 1f2797cc701458..ab036f1d445acc 100644 --- a/clang/include/clang/AST/AbstractBasicReader.h +++ b/clang/include/clang/AST/AbstractBasicReader.h @@ -213,9 +213,9 @@ class DataStreamBasicReader : public BasicReaderBase { } Qualifiers readQualifiers() { -static_assert(sizeof(Qualifiers().getAsOpaqueValue()) <= sizeof(uint32_t), +static_assert(sizeof(Qualifiers().getAsOpaqueValue()) <= sizeof(uint64_t), "update this if the value size changes"); -uint32_t value = asImpl().readUInt32(); +uint64_t value = asImpl().readUInt64(); return Qualifiers::fromOpaqueValue(value); } diff --git a/clang/include/clang/AST/AbstractBasicWriter.h b/clang/include/clang/AST/AbstractBasicWriter.h index 07afa388de2c17..8e42fcaad1d388 100644 --- a/clang/include/clang/AST/AbstractBasicWriter.h +++ b/clang/include/clang/AST/AbstractBasicWriter.h @@ -196,9 +196,9 @@ class DataStreamBasicWriter : public BasicWriterBase { } void writeQualifiers(Qualifiers value) { -static_assert(sizeof(value.getAsOpaqueValue()) <= sizeof(uint32_t), +static_assert(sizeof(value.getAsOpaqueValue()) <= sizeof(uint64_t), "update this if the value size changes"); -asImpl().writeUInt32(value.getAsOpaqueValue()); +asImpl().writeUInt64(value.getAsOpaqueValue()); } void writeExceptionSpecInfo( >From 9e296a1a69158419960c265f12f52523db0c8e2a Mon Sep 17 00:00:00 2001 From: Daniil Kovalev Date: Thu, 7 Mar 2024 15:34:24 +0300 Subject: [PATCH 2/4] [clang] Define `PointerAuthenticationMode` enum --- clang/include/clang/Basic/LangOptions.h | 7 +++ 1 file changed, 7 insertions(+) diff --git a/clang/include/clang/Basic/LangOptions.h b/clang/include/clang/Basic/LangOptions.h index 862952d336ef31..6fe7472d8ad0ca 100644 --- a/clang/include/clang/Basic/LangOptions.h +++ b/clang/include/clang/Basic/LangOptions.h @@ -57,6 +57,13 @@ enum class ShaderStage { Invalid, }; +enum class PointerAuthenticationMode : unsigned { + None, + Strip, + SignAndStrip, + SignAndAuth +}; + /// Bitfields of LangOptions, split out from LangOptions in order to ensure that /// this large collection of bitfields is a trivial class type. class LangOptionsBase { >From 71d7760aa9cc459d7bc0365fa079f64cb5704c96 Mon Sep 17 00:00:00 2001 From: Daniil Kovalev Date: Thu, 7 Mar 2024 15:31:03 +0300 Subject: [PATCH 3/4] [clang] Define `PointerAuthQualifier` class Includes changes from the following commits from the branch https://github.com/ahmedbougacha/llvm-project/tree/eng/arm64e-upstream-llvmorg - Initial support https://github.com/ahmedbougacha/llvm-project/commit/cc7ba7eb1814e9b254c7d94aa0b78cb0e21acfc5 - ObjC isa signing https://github.com/ahmedbougacha/llvm-project/commit/c9ce0d408f1d9aeffc7b86256334220aec6de5a3 Also applies a fix from https://github.com/access-softek/llvm-project/pull/75 Co-authored-by: Ahmed Bougacha --- clang/include/clang/AST/Type.h| 215 +- .../include/clang/Basic/PointerAuthOptions.h | 23 ++ 2 files changed, 227 insertions(+), 11 deletions(-) create mode 100644 clang/include/clang/Basic/PointerAuthOptions.h diff --git a/clang/include/clang/AST/Type.h b/clang/include/clang/AST/Type.h index 1942b0e67f65a3..1741a3017f7280 100644 --- a/clang/include/clang/AST/Type.h +++ b/clang/include/clang/AST/Type.h @@ -25,8 +25,10 @@ #include "clang/Basic/Diagnostic.h" #include "clang/Basic/ExceptionSpecificationType.h" #include "clang/Basic/LLVM.h" +#include "clang/Basic/LangOptions.h" #include "clang/Basic/Linkage.h" #include "clang/Basic/PartialDiagnostic.h" +#include "clang/Basic/PointerAuthOptions.h" #include "clang/Basic/SourceLocation.h" #include "clang/Basic/Specifiers.h" #include "clang/Basic/Visibility.h" @@ -138,6 +140,165 @@ using CanQualType = CanQual; #define TYPE(Class, Base) class Class##Type; #include "clang/AST/TypeNodes.inc" +/// Pointer-authentication qualifiers. +class PointerAuthQualifier { + enum : uint32_t { +EnabledShift = 0, +EnabledBits = 1, +EnabledMask = 1 << EnabledShift, +AddressDiscriminatedShift = EnabledShift + EnabledBits, +AddressDiscriminatedBits = 1, +AddressDiscriminatedMask = 1 << AddressDiscriminatedShift, +AuthenticationModeShift = +AddressDiscriminatedShift + AddressDiscriminatedBits, +AuthenticationModeBits = 2, +AuthenticationModeMask = ((1 <<
[clang] [PAC][clang] Define `PointerAuthQualifier` and `PointerAuthenticationMode` (PR #84384)
https://github.com/kovdan01 edited https://github.com/llvm/llvm-project/pull/84384 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [PAC][clang] Define `PointerAuthQualifier` and `PointerAuthenticationMode` (PR #84384)
github-actions[bot] wrote: :warning: C/C++ code formatter, clang-format found issues in your code. :warning: You can test this locally with the following command: ``bash git-clang-format --diff 9cf9cb271bf86bda4996be9a31fa413381f2f5e3 0b75c0a774e1e8afb56de95485acf447f11ccd6d -- clang/include/clang/Basic/PointerAuthOptions.h clang/include/clang/AST/ASTContext.h clang/include/clang/AST/AbstractBasicReader.h clang/include/clang/AST/AbstractBasicWriter.h clang/include/clang/AST/Type.h clang/include/clang/Basic/LangOptions.h `` View the diff from clang-format here. ``diff diff --git a/clang/include/clang/AST/Type.h b/clang/include/clang/AST/Type.h index ad5eb1e3c6..4a855c11a6 100644 --- a/clang/include/clang/AST/Type.h +++ b/clang/include/clang/AST/Type.h @@ -169,8 +169,10 @@ class PointerAuthQualifier { DiscriminatorMask = ((1u << DiscriminatorBits) - 1) << DiscriminatorShift, }; - // bits: |0 |1 |2..3 |4 |5 |6..15| 16...31 | - // |Enabled|Address|AuthenticationMode|ISA pointer|AuthenticatesNull|Key |Discriminator| + // bits: |0 |1 |2..3 |4 |5 + // |6..15| 16...31 | + // |Enabled|Address|AuthenticationMode|ISA + // pointer|AuthenticatesNull|Key |Discriminator| uint32_t Data; static_assert((EnabledBits + AddressDiscriminatedBits + @@ -227,9 +229,9 @@ public: if (key == PointerAuthKeyNone) key = KeyNoneInternal; assert((key >= 0 && key <= KeyNoneInternal) && "out-of-range key value"); -return PointerAuthQualifier(key, isAddressDiscriminated, -extraDiscriminator, authenticationMode, -isIsaPointer, authenticatesNullValues); +return PointerAuthQualifier(key, isAddressDiscriminated, extraDiscriminator, +authenticationMode, isIsaPointer, +authenticatesNullValues); } bool isPresent() const { @@ -243,9 +245,7 @@ public: return (Data & KeyMask) >> KeyShift; } - bool hasKeyNone() const { -return isPresent() && getKey() == KeyNoneInternal; - } + bool hasKeyNone() const { return isPresent() && getKey() == KeyNoneInternal; } bool isAddressDiscriminated() const { assert(isPresent()); @@ -269,8 +269,7 @@ public: bool authenticatesNullValues() const { assert(isPresent()); -return (Data & AuthenticatesNullValuesMask) >> - AuthenticatesNullValuesShift; +return (Data & AuthenticatesNullValuesMask) >> AuthenticatesNullValuesShift; } PointerAuthQualifier withoutKeyNone() const { `` https://github.com/llvm/llvm-project/pull/84384 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [PAC][clang] Define `PointerAuthQualifier` and `PointerAuthenticationMode` (PR #84384)
kovdan01 wrote: I've left 4 commits to distinguish code coming from different sources during review. Here is the origin of the code for each of the commits: - ef23d427b48687b62da9e1062886ddfcc1649b6a: https://github.com/apple/llvm-project/commit/a94321f13043a39b02fa7106b8270767651354cd - 9e296a1a69158419960c265f12f52523db0c8e2a: https://github.com/ahmedbougacha/llvm-project/commit/017eede69b9b06ff432e6f817e046723cf3207f0 - 80c27eef1352d0daa3f2eaea43499e54f093c6c1: - https://github.com/ahmedbougacha/llvm-project/commit/cc7ba7eb1814e9b254c7d94aa0b78cb0e21acfc5 - https://github.com/ahmedbougacha/llvm-project/commit/c9ce0d408f1d9aeffc7b86256334220aec6de5a3 - https://github.com/access-softek/llvm-project/pull/75 - 0b75c0a774e1e8afb56de95485acf447f11ccd6d: https://github.com/ahmedbougacha/llvm-project/commit/cc7ba7eb1814e9b254c7d94aa0b78cb0e21acfc5 Commits from @ahmedbougacha's repo are taken from the eng/arm64e-upstream-llvmorg branch. https://github.com/llvm/llvm-project/pull/84384 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [PAC][clang] Define `PointerAuthQualifier` and `PointerAuthenticationMode` (PR #84384)
https://github.com/kovdan01 created https://github.com/llvm/llvm-project/pull/84384 This brings declarations of `PointerAuthQualifier` class and `PointerAuthenticationMode` enum and related functions required for PAuth support in lldb (see #TODO) from downstream Apple's code. Co-authored-by: Ahmed Bougacha Co-authored-by: John McCall >From ef23d427b48687b62da9e1062886ddfcc1649b6a Mon Sep 17 00:00:00 2001 From: John McCall Date: Mon, 16 Dec 2019 20:31:25 -0500 Subject: [PATCH 1/4] Abstract serialization fixes for the Apple Clang changes. --- clang/include/clang/AST/AbstractBasicReader.h | 4 ++-- clang/include/clang/AST/AbstractBasicWriter.h | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/clang/include/clang/AST/AbstractBasicReader.h b/clang/include/clang/AST/AbstractBasicReader.h index 1f2797cc701458..ab036f1d445acc 100644 --- a/clang/include/clang/AST/AbstractBasicReader.h +++ b/clang/include/clang/AST/AbstractBasicReader.h @@ -213,9 +213,9 @@ class DataStreamBasicReader : public BasicReaderBase { } Qualifiers readQualifiers() { -static_assert(sizeof(Qualifiers().getAsOpaqueValue()) <= sizeof(uint32_t), +static_assert(sizeof(Qualifiers().getAsOpaqueValue()) <= sizeof(uint64_t), "update this if the value size changes"); -uint32_t value = asImpl().readUInt32(); +uint64_t value = asImpl().readUInt64(); return Qualifiers::fromOpaqueValue(value); } diff --git a/clang/include/clang/AST/AbstractBasicWriter.h b/clang/include/clang/AST/AbstractBasicWriter.h index 07afa388de2c17..8e42fcaad1d388 100644 --- a/clang/include/clang/AST/AbstractBasicWriter.h +++ b/clang/include/clang/AST/AbstractBasicWriter.h @@ -196,9 +196,9 @@ class DataStreamBasicWriter : public BasicWriterBase { } void writeQualifiers(Qualifiers value) { -static_assert(sizeof(value.getAsOpaqueValue()) <= sizeof(uint32_t), +static_assert(sizeof(value.getAsOpaqueValue()) <= sizeof(uint64_t), "update this if the value size changes"); -asImpl().writeUInt32(value.getAsOpaqueValue()); +asImpl().writeUInt64(value.getAsOpaqueValue()); } void writeExceptionSpecInfo( >From 9e296a1a69158419960c265f12f52523db0c8e2a Mon Sep 17 00:00:00 2001 From: Daniil Kovalev Date: Thu, 7 Mar 2024 15:34:24 +0300 Subject: [PATCH 2/4] [clang] Define `PointerAuthenticationMode` enum --- clang/include/clang/Basic/LangOptions.h | 7 +++ 1 file changed, 7 insertions(+) diff --git a/clang/include/clang/Basic/LangOptions.h b/clang/include/clang/Basic/LangOptions.h index 862952d336ef31..6fe7472d8ad0ca 100644 --- a/clang/include/clang/Basic/LangOptions.h +++ b/clang/include/clang/Basic/LangOptions.h @@ -57,6 +57,13 @@ enum class ShaderStage { Invalid, }; +enum class PointerAuthenticationMode : unsigned { + None, + Strip, + SignAndStrip, + SignAndAuth +}; + /// Bitfields of LangOptions, split out from LangOptions in order to ensure that /// this large collection of bitfields is a trivial class type. class LangOptionsBase { >From 80c27eef1352d0daa3f2eaea43499e54f093c6c1 Mon Sep 17 00:00:00 2001 From: Daniil Kovalev Date: Thu, 7 Mar 2024 15:31:03 +0300 Subject: [PATCH 3/4] [clang] Define `PointerAuthQualifier` class Includes changes from the following commits from the branch https://github.com/ahmedbougacha/llvm-project/tree/eng/arm64e-upstream-llvmorg - Initial support https://github.com/ahmedbougacha/llvm-project/commit/cc7ba7eb1814e9b254c7d94aa0b78cb0e21acfc5 - ObjC isa signing https://github.com/ahmedbougacha/llvm-project/commit/c9ce0d408f1d9aeffc7b86256334220aec6de5a3 Also applies a fix from https://github.com/access-softek/llvm-project/pull/75 Co-authored-by: Ahmed Bougacha --- clang/include/clang/AST/Type.h| 216 +- .../include/clang/Basic/PointerAuthOptions.h | 23 ++ 2 files changed, 228 insertions(+), 11 deletions(-) create mode 100644 clang/include/clang/Basic/PointerAuthOptions.h diff --git a/clang/include/clang/AST/Type.h b/clang/include/clang/AST/Type.h index 1942b0e67f65a3..ca73f1c53e8e94 100644 --- a/clang/include/clang/AST/Type.h +++ b/clang/include/clang/AST/Type.h @@ -25,8 +25,10 @@ #include "clang/Basic/Diagnostic.h" #include "clang/Basic/ExceptionSpecificationType.h" #include "clang/Basic/LLVM.h" +#include "clang/Basic/LangOptions.h" #include "clang/Basic/Linkage.h" #include "clang/Basic/PartialDiagnostic.h" +#include "clang/Basic/PointerAuthOptions.h" #include "clang/Basic/SourceLocation.h" #include "clang/Basic/Specifiers.h" #include "clang/Basic/Visibility.h" @@ -138,6 +140,166 @@ using CanQualType = CanQual; #define TYPE(Class, Base) class Class##Type; #include "clang/AST/TypeNodes.inc" +/// Pointer-authentication qualifiers. +class PointerAuthQualifier { + enum : uint32_t { +EnabledShift = 0, +EnabledBits = 1, +EnabledMask = 1 << EnabledShift, +AddressDiscriminatedShift = EnabledShift + EnabledBits, +