[clang] [PAC][clang] Define `PointerAuthQualifier` and `PointerAuthenticationMode` (PR #84384)

2024-04-16 Thread Daniil Kovalev via cfe-commits


@@ -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)

2024-04-16 Thread Daniil Kovalev via cfe-commits


@@ -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)

2024-04-16 Thread Daniil Kovalev via cfe-commits


@@ -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)

2024-04-16 Thread Daniil Kovalev via cfe-commits


@@ -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)

2024-04-16 Thread Daniil Kovalev via cfe-commits


@@ -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)

2024-04-16 Thread Daniil Kovalev via cfe-commits


@@ -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)

2024-04-16 Thread Daniil Kovalev via cfe-commits

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)

2024-04-16 Thread Aaron Ballman via cfe-commits


@@ -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)

2024-04-16 Thread Aaron Ballman via cfe-commits


@@ -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)

2024-04-16 Thread Aaron Ballman via cfe-commits


@@ -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)

2024-04-16 Thread Aaron Ballman via cfe-commits

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)

2024-04-16 Thread Aaron Ballman via cfe-commits


@@ -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)

2024-04-16 Thread Aaron Ballman via cfe-commits


@@ -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)

2024-04-16 Thread Aaron Ballman via cfe-commits

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)

2024-04-12 Thread John McCall via cfe-commits

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)

2024-04-12 Thread Michael Buch via cfe-commits

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)

2024-04-12 Thread Michael Buch via cfe-commits

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)

2024-04-12 Thread Michael Buch via cfe-commits


@@ -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)

2024-04-08 Thread John McCall via cfe-commits

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)

2024-04-08 Thread Daniil Kovalev via cfe-commits

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)

2024-04-08 Thread Daniil Kovalev via cfe-commits

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)

2024-04-08 Thread Daniil Kovalev via cfe-commits


@@ -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)

2024-04-08 Thread Daniil Kovalev via cfe-commits


@@ -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)

2024-04-08 Thread Daniil Kovalev via cfe-commits


@@ -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)

2024-04-08 Thread Daniil Kovalev via cfe-commits


@@ -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)

2024-04-08 Thread Daniil Kovalev via cfe-commits


@@ -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)

2024-04-08 Thread Daniil Kovalev via cfe-commits

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)

2024-03-20 Thread Daniil Kovalev via cfe-commits

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)

2024-03-07 Thread via cfe-commits

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)

2024-03-07 Thread Daniil Kovalev via cfe-commits

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)

2024-03-07 Thread Daniil Kovalev via cfe-commits

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)

2024-03-07 Thread Daniil Kovalev via cfe-commits

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)

2024-03-07 Thread via cfe-commits

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)

2024-03-07 Thread Daniil Kovalev via cfe-commits

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)

2024-03-07 Thread Daniil Kovalev via cfe-commits

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,
+