@@ -975,34 +975,29 @@ class DIDerivedType : public DIType {
975
975
public:
976
976
// / Pointer authentication (__ptrauth) metadata.
977
977
struct PtrAuthData {
978
- union {
979
- struct {
980
- unsigned Key : 4 ;
981
- unsigned IsAddressDiscriminated : 1 ;
982
- unsigned ExtraDiscriminator : 16 ;
983
- unsigned IsaPointer : 1 ;
984
- unsigned AuthenticatesNullValues : 1 ;
985
- } Data;
986
- unsigned RawData;
987
- } Payload;
988
-
989
- PtrAuthData (unsigned FromRawData) { Payload.RawData = FromRawData; }
978
+ unsigned RawData;
979
+
980
+ PtrAuthData (unsigned FromRawData) : RawData(FromRawData) {}
990
981
PtrAuthData (unsigned Key, bool IsDiscr, unsigned Discriminator,
991
982
bool IsaPointer, bool AuthenticatesNullValues) {
992
983
assert (Key < 16 );
993
984
assert (Discriminator <= 0xffff );
994
- Payload.Data .Key = Key;
995
- Payload.Data .IsAddressDiscriminated = IsDiscr;
996
- Payload.Data .ExtraDiscriminator = Discriminator;
997
- Payload.Data .IsaPointer = IsaPointer;
998
- Payload.Data .AuthenticatesNullValues = AuthenticatesNullValues;
985
+ RawData = (Key << 0 ) | (IsDiscr ? (1 << 4 ) : 0 ) | (Discriminator << 5 ) |
986
+ (IsaPointer ? (1 << 21 ) : 0 ) |
987
+ (AuthenticatesNullValues ? (1 << 22 ) : 0 );
999
988
}
1000
989
bool operator ==(struct PtrAuthData Other) const {
1001
- return Payload. RawData == Other. Payload .RawData ;
990
+ return RawData == Other.RawData ;
1002
991
}
1003
992
bool operator !=(struct PtrAuthData Other) const {
1004
993
return !(*this == Other);
1005
994
}
995
+
996
+ unsigned Key () { return (RawData >> 0 ) & 0b1111 ; }
997
+ bool IsAddressDiscriminated () { return (RawData >> 4 ) & 1 ; }
998
+ unsigned ExtraDiscriminator () { return (RawData >> 5 ) & 0xffff ; }
999
+ bool IsaPointer () { return (RawData >> 21 ) & 1 ; }
1000
+ bool AuthenticatesNullValues () { return (RawData >> 22 ) & 1 ; }
1006
1001
};
1007
1002
1008
1003
private:
@@ -1023,7 +1018,7 @@ class DIDerivedType : public DIType {
1023
1018
AlignInBits, OffsetInBits, Flags, Ops),
1024
1019
DWARFAddressSpace (DWARFAddressSpace) {
1025
1020
if (PtrAuthData)
1026
- SubclassData32 = PtrAuthData->Payload . RawData ;
1021
+ SubclassData32 = PtrAuthData->RawData ;
1027
1022
}
1028
1023
~DIDerivedType () = default ;
1029
1024
static DIDerivedType *
@@ -1098,31 +1093,31 @@ class DIDerivedType : public DIType {
1098
1093
// / \returns The PointerAuth key.
1099
1094
std::optional<unsigned > getPtrAuthKey () const {
1100
1095
if (auto PtrAuthData = getPtrAuthData ())
1101
- return ( unsigned ) PtrAuthData->Payload . Data . Key ;
1096
+ return PtrAuthData->Key () ;
1102
1097
return std::nullopt;
1103
1098
}
1104
1099
// / \returns The PointerAuth address discrimination bit.
1105
1100
std::optional<bool > isPtrAuthAddressDiscriminated () const {
1106
1101
if (auto PtrAuthData = getPtrAuthData ())
1107
- return ( bool ) PtrAuthData->Payload . Data . IsAddressDiscriminated ;
1102
+ return PtrAuthData->IsAddressDiscriminated () ;
1108
1103
return std::nullopt;
1109
1104
}
1110
1105
// / \returns The PointerAuth extra discriminator.
1111
1106
std::optional<unsigned > getPtrAuthExtraDiscriminator () const {
1112
1107
if (auto PtrAuthData = getPtrAuthData ())
1113
- return ( unsigned ) PtrAuthData->Payload . Data . ExtraDiscriminator ;
1108
+ return PtrAuthData->ExtraDiscriminator () ;
1114
1109
return std::nullopt;
1115
1110
}
1116
1111
// / \returns The PointerAuth IsaPointer bit.
1117
1112
std::optional<bool > isPtrAuthIsaPointer () const {
1118
1113
if (auto PtrAuthData = getPtrAuthData ())
1119
- return ( bool ) PtrAuthData->Payload . Data . IsaPointer ;
1114
+ return PtrAuthData->IsaPointer () ;
1120
1115
return std::nullopt;
1121
1116
}
1122
1117
// / \returns The PointerAuth authenticates null values bit.
1123
1118
std::optional<bool > getPtrAuthAuthenticatesNullValues () const {
1124
1119
if (auto PtrAuthData = getPtrAuthData ())
1125
- return ( bool ) PtrAuthData->Payload . Data . AuthenticatesNullValues ;
1120
+ return PtrAuthData->AuthenticatesNullValues () ;
1126
1121
return std::nullopt;
1127
1122
}
1128
1123
0 commit comments