@@ -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,35 @@ 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
+ // RawData layout:
979
+ // - Bits 0..3: Key
980
+ // - Bit 4: IsAddressDiscriminated
981
+ // - Bits 5..20: ExtraDiscriminator
982
+ // - Bit 21: IsaPointer
983
+ // - Bit 22: AuthenticatesNullValues
984
+ unsigned RawData;
985
+
986
+ PtrAuthData (unsigned FromRawData) : RawData(FromRawData) {}
987
+ PtrAuthData (unsigned Key, bool IsDiscr, unsigned Discriminator,
988
+ bool IsaPointer, bool AuthenticatesNullValues) {
989
+ assert (Key < 16 );
990
+ assert (Discriminator <= 0xffff );
991
+ RawData = (Key << 0 ) | (IsDiscr ? (1 << 4 ) : 0 ) | (Discriminator << 5 ) |
992
+ (IsaPointer ? (1 << 21 ) : 0 ) |
993
+ (AuthenticatesNullValues ? (1 << 22 ) : 0 );
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 ; }
1001
+ };
1002
+
1003
+ private:
975
1004
friend class LLVMContextImpl ;
976
1005
friend class MDNode ;
977
1006
@@ -982,59 +1011,70 @@ class DIDerivedType : public DIType {
982
1011
DIDerivedType (LLVMContext &C, StorageType Storage, unsigned Tag,
983
1012
unsigned Line, uint64_t SizeInBits, uint32_t AlignInBits,
984
1013
uint64_t OffsetInBits,
985
- std::optional<unsigned > DWARFAddressSpace, DIFlags Flags,
1014
+ std::optional<unsigned > DWARFAddressSpace,
1015
+ std::optional<PtrAuthData> PtrAuthData, DIFlags Flags,
986
1016
ArrayRef<Metadata *> Ops)
987
1017
: DIType(C, DIDerivedTypeKind, Storage, Tag, Line, SizeInBits,
988
1018
AlignInBits, OffsetInBits, Flags, Ops),
989
- DWARFAddressSpace (DWARFAddressSpace) {}
1019
+ DWARFAddressSpace (DWARFAddressSpace) {
1020
+ if (PtrAuthData)
1021
+ SubclassData32 = PtrAuthData->RawData ;
1022
+ }
990
1023
~DIDerivedType () = default ;
991
1024
static DIDerivedType *
992
1025
getImpl (LLVMContext &Context, unsigned Tag, StringRef Name, DIFile *File,
993
1026
unsigned Line, DIScope *Scope, DIType *BaseType, uint64_t SizeInBits,
994
1027
uint32_t AlignInBits, uint64_t OffsetInBits,
995
- std::optional<unsigned > DWARFAddressSpace, DIFlags Flags,
1028
+ std::optional<unsigned > DWARFAddressSpace,
1029
+ std::optional<PtrAuthData> PtrAuthData, DIFlags Flags,
996
1030
Metadata *ExtraData, DINodeArray Annotations, StorageType Storage,
997
1031
bool ShouldCreate = true ) {
998
1032
return getImpl (Context, Tag, getCanonicalMDString (Context, Name), File,
999
1033
Line, Scope, BaseType, SizeInBits, AlignInBits, OffsetInBits,
1000
- DWARFAddressSpace, Flags, ExtraData, Annotations. get () ,
1001
- Storage, ShouldCreate);
1034
+ DWARFAddressSpace, PtrAuthData, Flags, ExtraData ,
1035
+ Annotations. get (), Storage, ShouldCreate);
1002
1036
}
1003
1037
static DIDerivedType *
1004
1038
getImpl (LLVMContext &Context, unsigned Tag, MDString *Name, Metadata *File,
1005
1039
unsigned Line, Metadata *Scope, Metadata *BaseType,
1006
1040
uint64_t SizeInBits, uint32_t AlignInBits, uint64_t OffsetInBits,
1007
- std::optional<unsigned > DWARFAddressSpace, DIFlags Flags,
1041
+ std::optional<unsigned > DWARFAddressSpace,
1042
+ std::optional<PtrAuthData> PtrAuthData, DIFlags Flags,
1008
1043
Metadata *ExtraData, Metadata *Annotations, StorageType Storage,
1009
1044
bool ShouldCreate = true );
1010
1045
1011
1046
TempDIDerivedType cloneImpl () const {
1012
- return getTemporary (
1013
- getContext (), getTag (), getName (), getFile (), getLine (), getScope (),
1014
- getBaseType (), getSizeInBits (), getAlignInBits (), getOffsetInBits (),
1015
- getDWARFAddressSpace (), getFlags (), getExtraData (), getAnnotations ());
1047
+ return getTemporary (getContext (), getTag (), getName (), getFile (), getLine (),
1048
+ getScope (), getBaseType (), getSizeInBits (),
1049
+ getAlignInBits (), getOffsetInBits (),
1050
+ getDWARFAddressSpace (), getPtrAuthData (), getFlags (),
1051
+ getExtraData (), getAnnotations ());
1016
1052
}
1017
1053
1018
1054
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))
1055
+ DEFINE_MDNODE_GET (DIDerivedType,
1056
+ (unsigned Tag, MDString *Name, Metadata *File,
1057
+ unsigned Line, Metadata *Scope, Metadata *BaseType,
1058
+ uint64_t SizeInBits, uint32_t AlignInBits,
1059
+ uint64_t OffsetInBits,
1060
+ std::optional<unsigned > DWARFAddressSpace,
1061
+ std::optional<PtrAuthData> PtrAuthData, DIFlags Flags,
1062
+ Metadata *ExtraData = nullptr ,
1063
+ Metadata *Annotations = nullptr ),
1064
+ (Tag, Name, File, Line, Scope, BaseType, SizeInBits,
1065
+ AlignInBits, OffsetInBits, DWARFAddressSpace, PtrAuthData,
1066
+ Flags, ExtraData, Annotations))
1028
1067
DEFINE_MDNODE_GET(DIDerivedType,
1029
1068
(unsigned Tag, StringRef Name, DIFile *File, unsigned Line,
1030
1069
DIScope *Scope, DIType *BaseType, uint64_t SizeInBits,
1031
1070
uint32_t AlignInBits, uint64_t OffsetInBits,
1032
- std::optional<unsigned > DWARFAddressSpace, DIFlags Flags,
1071
+ std::optional<unsigned > DWARFAddressSpace,
1072
+ std::optional<PtrAuthData> PtrAuthData, DIFlags Flags,
1033
1073
Metadata *ExtraData = nullptr ,
1034
1074
DINodeArray Annotations = nullptr ),
1035
1075
(Tag, Name, File, Line, Scope, BaseType, SizeInBits,
1036
- AlignInBits, OffsetInBits, DWARFAddressSpace, Flags ,
1037
- ExtraData, Annotations))
1076
+ AlignInBits, OffsetInBits, DWARFAddressSpace, PtrAuthData ,
1077
+ Flags, ExtraData, Annotations))
1038
1078
1039
1079
TempDIDerivedType clone() const { return cloneImpl (); }
1040
1080
@@ -1048,6 +1088,8 @@ class DIDerivedType : public DIType {
1048
1088
return DWARFAddressSpace;
1049
1089
}
1050
1090
1091
+ std::optional<PtrAuthData> getPtrAuthData () const ;
1092
+
1051
1093
// / Get extra data associated with this derived type.
1052
1094
// /
1053
1095
// / Class type for pointer-to-members, objective-c property node for ivars,
@@ -1087,6 +1129,16 @@ class DIDerivedType : public DIType {
1087
1129
}
1088
1130
};
1089
1131
1132
+ inline bool operator ==(DIDerivedType::PtrAuthData Lhs,
1133
+ DIDerivedType::PtrAuthData Rhs) {
1134
+ return Lhs.RawData == Rhs.RawData ;
1135
+ }
1136
+
1137
+ inline bool operator !=(DIDerivedType::PtrAuthData Lhs,
1138
+ DIDerivedType::PtrAuthData Rhs) {
1139
+ return !(Lhs == Rhs);
1140
+ }
1141
+
1090
1142
// / Composite types.
1091
1143
// /
1092
1144
// / TODO: Detach from DerivedTypeBase (split out MDEnumType?).
0 commit comments