@@ -745,7 +745,7 @@ class DIType : public DIScope {
745
745
746
746
unsigned getLine () const { return Line; }
747
747
uint64_t getSizeInBits () const { return SizeInBits; }
748
- uint32_t getAlignInBits () const { return SubclassData32; }
748
+ uint32_t getAlignInBits () const ;
749
749
uint32_t getAlignInBytes () const { return getAlignInBits () / CHAR_BIT; }
750
750
uint64_t getOffsetInBits () const { return OffsetInBits; }
751
751
DIFlags getFlags () const { return Flags; }
@@ -972,6 +972,40 @@ class DIStringType : public DIType {
972
972
// /
973
973
// / TODO: Split out members (inheritance, fields, methods, etc.).
974
974
class DIDerivedType : public DIType {
975
+ public:
976
+ // / Pointer authentication (__ptrauth) metadata.
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; }
990
+ PtrAuthData (unsigned Key, bool IsDiscr, unsigned Discriminator,
991
+ bool IsaPointer, bool AuthenticatesNullValues) {
992
+ assert (Key < 16 );
993
+ 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;
999
+ }
1000
+ bool operator ==(struct PtrAuthData Other) const {
1001
+ return Payload.RawData == Other.Payload .RawData ;
1002
+ }
1003
+ bool operator !=(struct PtrAuthData Other) const {
1004
+ return !(*this == Other);
1005
+ }
1006
+ };
1007
+
1008
+ private:
975
1009
friend class LLVMContextImpl ;
976
1010
friend class MDNode ;
977
1011
@@ -982,59 +1016,70 @@ class DIDerivedType : public DIType {
982
1016
DIDerivedType (LLVMContext &C, StorageType Storage, unsigned Tag,
983
1017
unsigned Line, uint64_t SizeInBits, uint32_t AlignInBits,
984
1018
uint64_t OffsetInBits,
985
- std::optional<unsigned > DWARFAddressSpace, DIFlags Flags,
1019
+ std::optional<unsigned > DWARFAddressSpace,
1020
+ std::optional<PtrAuthData> PtrAuthData, DIFlags Flags,
986
1021
ArrayRef<Metadata *> Ops)
987
1022
: DIType(C, DIDerivedTypeKind, Storage, Tag, Line, SizeInBits,
988
1023
AlignInBits, OffsetInBits, Flags, Ops),
989
- DWARFAddressSpace (DWARFAddressSpace) {}
1024
+ DWARFAddressSpace (DWARFAddressSpace) {
1025
+ if (PtrAuthData)
1026
+ SubclassData32 = PtrAuthData->Payload .RawData ;
1027
+ }
990
1028
~DIDerivedType () = default ;
991
1029
static DIDerivedType *
992
1030
getImpl (LLVMContext &Context, unsigned Tag, StringRef Name, DIFile *File,
993
1031
unsigned Line, DIScope *Scope, DIType *BaseType, uint64_t SizeInBits,
994
1032
uint32_t AlignInBits, uint64_t OffsetInBits,
995
- std::optional<unsigned > DWARFAddressSpace, DIFlags Flags,
1033
+ std::optional<unsigned > DWARFAddressSpace,
1034
+ std::optional<PtrAuthData> PtrAuthData, DIFlags Flags,
996
1035
Metadata *ExtraData, DINodeArray Annotations, StorageType Storage,
997
1036
bool ShouldCreate = true ) {
998
1037
return getImpl (Context, Tag, getCanonicalMDString (Context, Name), File,
999
1038
Line, Scope, BaseType, SizeInBits, AlignInBits, OffsetInBits,
1000
- DWARFAddressSpace, Flags, ExtraData, Annotations. get () ,
1001
- Storage, ShouldCreate);
1039
+ DWARFAddressSpace, PtrAuthData, Flags, ExtraData ,
1040
+ Annotations. get (), Storage, ShouldCreate);
1002
1041
}
1003
1042
static DIDerivedType *
1004
1043
getImpl (LLVMContext &Context, unsigned Tag, MDString *Name, Metadata *File,
1005
1044
unsigned Line, Metadata *Scope, Metadata *BaseType,
1006
1045
uint64_t SizeInBits, uint32_t AlignInBits, uint64_t OffsetInBits,
1007
- std::optional<unsigned > DWARFAddressSpace, DIFlags Flags,
1046
+ std::optional<unsigned > DWARFAddressSpace,
1047
+ std::optional<PtrAuthData> PtrAuthData, DIFlags Flags,
1008
1048
Metadata *ExtraData, Metadata *Annotations, StorageType Storage,
1009
1049
bool ShouldCreate = true );
1010
1050
1011
1051
TempDIDerivedType cloneImpl () const {
1012
- return getTemporary (
1013
- getContext (), getTag (), getName (), getFile (), getLine (), getScope (),
1014
- getBaseType (), getSizeInBits (), getAlignInBits (), getOffsetInBits (),
1015
- getDWARFAddressSpace (), getFlags (), getExtraData (), getAnnotations ());
1052
+ return getTemporary (getContext (), getTag (), getName (), getFile (), getLine (),
1053
+ getScope (), getBaseType (), getSizeInBits (),
1054
+ getAlignInBits (), getOffsetInBits (),
1055
+ getDWARFAddressSpace (), getPtrAuthData (), getFlags (),
1056
+ getExtraData (), getAnnotations ());
1016
1057
}
1017
1058
1018
1059
public:
1019
- DEFINE_MDNODE_GET (
1020
- DIDerivedType,
1021
- (unsigned Tag, MDString *Name, Metadata *File, unsigned Line,
1022
- Metadata *Scope, Metadata *BaseType, uint64_t SizeInBits,
1023
- uint32_t AlignInBits, uint64_t OffsetInBits,
1024
- std::optional<unsigned > DWARFAddressSpace, DIFlags Flags,
1025
- Metadata *ExtraData = nullptr , Metadata *Annotations = nullptr ),
1026
- (Tag, Name, File, Line, Scope, BaseType, SizeInBits, AlignInBits,
1027
- OffsetInBits, DWARFAddressSpace, Flags, ExtraData, Annotations))
1060
+ DEFINE_MDNODE_GET (DIDerivedType,
1061
+ (unsigned Tag, MDString *Name, Metadata *File,
1062
+ unsigned Line, Metadata *Scope, Metadata *BaseType,
1063
+ uint64_t SizeInBits, uint32_t AlignInBits,
1064
+ uint64_t OffsetInBits,
1065
+ std::optional<unsigned > DWARFAddressSpace,
1066
+ std::optional<PtrAuthData> PtrAuthData, DIFlags Flags,
1067
+ Metadata *ExtraData = nullptr ,
1068
+ Metadata *Annotations = nullptr ),
1069
+ (Tag, Name, File, Line, Scope, BaseType, SizeInBits,
1070
+ AlignInBits, OffsetInBits, DWARFAddressSpace, PtrAuthData,
1071
+ Flags, ExtraData, Annotations))
1028
1072
DEFINE_MDNODE_GET(DIDerivedType,
1029
1073
(unsigned Tag, StringRef Name, DIFile *File, unsigned Line,
1030
1074
DIScope *Scope, DIType *BaseType, uint64_t SizeInBits,
1031
1075
uint32_t AlignInBits, uint64_t OffsetInBits,
1032
- std::optional<unsigned > DWARFAddressSpace, DIFlags Flags,
1076
+ std::optional<unsigned > DWARFAddressSpace,
1077
+ std::optional<PtrAuthData> PtrAuthData, DIFlags Flags,
1033
1078
Metadata *ExtraData = nullptr ,
1034
1079
DINodeArray Annotations = nullptr ),
1035
1080
(Tag, Name, File, Line, Scope, BaseType, SizeInBits,
1036
- AlignInBits, OffsetInBits, DWARFAddressSpace, Flags ,
1037
- ExtraData, Annotations))
1081
+ AlignInBits, OffsetInBits, DWARFAddressSpace, PtrAuthData ,
1082
+ Flags, ExtraData, Annotations))
1038
1083
1039
1084
TempDIDerivedType clone() const { return cloneImpl (); }
1040
1085
@@ -1048,6 +1093,39 @@ class DIDerivedType : public DIType {
1048
1093
return DWARFAddressSpace;
1049
1094
}
1050
1095
1096
+ std::optional<PtrAuthData> getPtrAuthData () const ;
1097
+
1098
+ // / \returns The PointerAuth key.
1099
+ std::optional<unsigned > getPtrAuthKey () const {
1100
+ if (auto PtrAuthData = getPtrAuthData ())
1101
+ return (unsigned )PtrAuthData->Payload .Data .Key ;
1102
+ return std::nullopt;
1103
+ }
1104
+ // / \returns The PointerAuth address discrimination bit.
1105
+ std::optional<bool > isPtrAuthAddressDiscriminated () const {
1106
+ if (auto PtrAuthData = getPtrAuthData ())
1107
+ return (bool )PtrAuthData->Payload .Data .IsAddressDiscriminated ;
1108
+ return std::nullopt;
1109
+ }
1110
+ // / \returns The PointerAuth extra discriminator.
1111
+ std::optional<unsigned > getPtrAuthExtraDiscriminator () const {
1112
+ if (auto PtrAuthData = getPtrAuthData ())
1113
+ return (unsigned )PtrAuthData->Payload .Data .ExtraDiscriminator ;
1114
+ return std::nullopt;
1115
+ }
1116
+ // / \returns The PointerAuth IsaPointer bit.
1117
+ std::optional<bool > isPtrAuthIsaPointer () const {
1118
+ if (auto PtrAuthData = getPtrAuthData ())
1119
+ return (bool )PtrAuthData->Payload .Data .IsaPointer ;
1120
+ return std::nullopt;
1121
+ }
1122
+ // / \returns The PointerAuth authenticates null values bit.
1123
+ std::optional<bool > getPtrAuthAuthenticatesNullValues () const {
1124
+ if (auto PtrAuthData = getPtrAuthData ())
1125
+ return (bool )PtrAuthData->Payload .Data .AuthenticatesNullValues ;
1126
+ return std::nullopt;
1127
+ }
1128
+
1051
1129
// / Get extra data associated with this derived type.
1052
1130
// /
1053
1131
// / Class type for pointer-to-members, objective-c property node for ivars,
0 commit comments