@@ -891,96 +891,114 @@ class DIBasicType : public DIType {
891891 friend class MDNode ;
892892
893893 unsigned Encoding;
894+ // / Describes the number of bits used by the value of the object. Non-zero
895+ // / when the value of an object does not fully occupy the storage size
896+ // / specified by SizeInBits.
897+ uint32_t DataSizeInBits;
894898
895899protected:
896900 DIBasicType (LLVMContext &C, StorageType Storage, unsigned Tag,
897901 uint32_t AlignInBits, unsigned Encoding,
898- uint32_t NumExtraInhabitants, DIFlags Flags ,
899- ArrayRef<Metadata *> Ops)
902+ uint32_t NumExtraInhabitants, uint32_t DataSizeInBits ,
903+ DIFlags Flags, ArrayRef<Metadata *> Ops)
900904 : DIType(C, DIBasicTypeKind, Storage, Tag, 0 , AlignInBits,
901905 NumExtraInhabitants, Flags, Ops),
902- Encoding (Encoding) {}
906+ Encoding (Encoding), DataSizeInBits(DataSizeInBits) {}
903907 DIBasicType (LLVMContext &C, unsigned ID, StorageType Storage, unsigned Tag,
904908 uint32_t AlignInBits, unsigned Encoding,
905- uint32_t NumExtraInhabitants, DIFlags Flags ,
906- ArrayRef<Metadata *> Ops)
909+ uint32_t NumExtraInhabitants, uint32_t DataSizeInBits ,
910+ DIFlags Flags, ArrayRef<Metadata *> Ops)
907911 : DIType(C, ID, Storage, Tag, 0 , AlignInBits, NumExtraInhabitants, Flags,
908912 Ops),
909- Encoding(Encoding) {}
913+ Encoding(Encoding), DataSizeInBits(DataSizeInBits) {}
910914 ~DIBasicType () = default ;
911915
912916 static DIBasicType *getImpl (LLVMContext &Context, unsigned Tag,
913917 StringRef Name, uint64_t SizeInBits,
914918 uint32_t AlignInBits, unsigned Encoding,
915- uint32_t NumExtraInhabitants, DIFlags Flags,
919+ uint32_t NumExtraInhabitants,
920+ uint32_t DataSizeInBits, DIFlags Flags,
916921 StorageType Storage, bool ShouldCreate = true ) {
917922 return getImpl (Context, Tag, getCanonicalMDString (Context, Name),
918923 SizeInBits, AlignInBits, Encoding, NumExtraInhabitants,
919- Flags, Storage, ShouldCreate);
924+ DataSizeInBits, Flags, Storage, ShouldCreate);
920925 }
921926 static DIBasicType *getImpl (LLVMContext &Context, unsigned Tag,
922927 MDString *Name, uint64_t SizeInBits,
923928 uint32_t AlignInBits, unsigned Encoding,
924- uint32_t NumExtraInhabitants, DIFlags Flags,
929+ uint32_t NumExtraInhabitants,
930+ uint32_t DataSizeInBits, DIFlags Flags,
925931 StorageType Storage, bool ShouldCreate = true ) {
926932 auto *SizeInBitsNode = ConstantAsMetadata::get (
927933 ConstantInt::get (Type::getInt64Ty (Context), SizeInBits));
928934 return getImpl (Context, Tag, Name, SizeInBitsNode, AlignInBits, Encoding,
929- NumExtraInhabitants, Flags, Storage, ShouldCreate);
935+ NumExtraInhabitants, DataSizeInBits, Flags, Storage,
936+ ShouldCreate);
930937 }
931- LLVM_ABI static DIBasicType *getImpl (LLVMContext &Context, unsigned Tag,
932- MDString *Name, Metadata *SizeInBits,
933- uint32_t AlignInBits, unsigned Encoding,
934- uint32_t NumExtraInhabitants,
935- DIFlags Flags, StorageType Storage,
936- bool ShouldCreate = true );
938+ LLVM_ABI static DIBasicType *
939+ getImpl (LLVMContext &Context, unsigned Tag, MDString *Name,
940+ Metadata *SizeInBits, uint32_t AlignInBits, unsigned Encoding,
941+ uint32_t NumExtraInhabitants, uint32_t DataSizeInBits, DIFlags Flags,
942+ StorageType Storage, bool ShouldCreate = true );
937943
938944 TempDIBasicType cloneImpl () const {
939945 return getTemporary (getContext (), getTag (), getRawName (),
940946 getRawSizeInBits (), getAlignInBits (), getEncoding (),
941- getNumExtraInhabitants (), getFlags ());
947+ getNumExtraInhabitants (), getDataSizeInBits (),
948+ getFlags ());
942949 }
943950
944951public:
945952 DEFINE_MDNODE_GET (DIBasicType, (unsigned Tag, StringRef Name),
946- (Tag, Name, 0 , 0 , 0 , 0 , FlagZero))
953+ (Tag, Name, 0 , 0 , 0 , 0 , 0 , FlagZero))
947954 DEFINE_MDNODE_GET(DIBasicType,
948955 (unsigned Tag, StringRef Name, uint64_t SizeInBits),
949- (Tag, Name, SizeInBits, 0 , 0 , 0 , FlagZero))
956+ (Tag, Name, SizeInBits, 0 , 0 , 0 , 0 , FlagZero))
950957 DEFINE_MDNODE_GET(DIBasicType,
951958 (unsigned Tag, MDString *Name, uint64_t SizeInBits),
952- (Tag, Name, SizeInBits, 0 , 0 , 0 , FlagZero))
959+ (Tag, Name, SizeInBits, 0 , 0 , 0 , 0 , FlagZero))
953960 DEFINE_MDNODE_GET(DIBasicType,
954961 (unsigned Tag, StringRef Name, uint64_t SizeInBits,
955962 uint32_t AlignInBits, unsigned Encoding, DIFlags Flags),
956- (Tag, Name, SizeInBits, AlignInBits, Encoding, 0 , Flags))
963+ (Tag, Name, SizeInBits, AlignInBits, Encoding, 0 , 0 , Flags))
957964 DEFINE_MDNODE_GET(DIBasicType,
958965 (unsigned Tag, MDString *Name, uint64_t SizeInBits,
959966 uint32_t AlignInBits, unsigned Encoding, DIFlags Flags),
960- (Tag, Name, SizeInBits, AlignInBits, Encoding, 0 , Flags))
967+ (Tag, Name, SizeInBits, AlignInBits, Encoding, 0 , 0 , Flags))
961968 DEFINE_MDNODE_GET(DIBasicType,
962969 (unsigned Tag, StringRef Name, uint64_t SizeInBits,
963970 uint32_t AlignInBits, unsigned Encoding,
964971 uint32_t NumExtraInhabitants, DIFlags Flags),
965972 (Tag, Name, SizeInBits, AlignInBits, Encoding,
966- NumExtraInhabitants, Flags))
973+ NumExtraInhabitants, 0 , Flags))
974+ DEFINE_MDNODE_GET(DIBasicType,
975+ (unsigned Tag, StringRef Name, uint64_t SizeInBits,
976+ uint32_t AlignInBits, unsigned Encoding,
977+ uint32_t NumExtraInhabitants, uint32_t DataSizeInBits,
978+ DIFlags Flags),
979+ (Tag, Name, SizeInBits, AlignInBits, Encoding,
980+ NumExtraInhabitants, DataSizeInBits, Flags))
967981 DEFINE_MDNODE_GET(DIBasicType,
968982 (unsigned Tag, MDString *Name, uint64_t SizeInBits,
969983 uint32_t AlignInBits, unsigned Encoding,
970- uint32_t NumExtraInhabitants, DIFlags Flags),
984+ uint32_t NumExtraInhabitants, uint32_t DataSizeInBits,
985+ DIFlags Flags),
971986 (Tag, Name, SizeInBits, AlignInBits, Encoding,
972- NumExtraInhabitants, Flags))
987+ NumExtraInhabitants, DataSizeInBits, Flags))
973988 DEFINE_MDNODE_GET(DIBasicType,
974989 (unsigned Tag, MDString *Name, Metadata *SizeInBits,
975990 uint32_t AlignInBits, unsigned Encoding,
976- uint32_t NumExtraInhabitants, DIFlags Flags),
991+ uint32_t NumExtraInhabitants, uint32_t DataSizeInBits,
992+ DIFlags Flags),
977993 (Tag, Name, SizeInBits, AlignInBits, Encoding,
978- NumExtraInhabitants, Flags))
994+ NumExtraInhabitants, DataSizeInBits, Flags))
979995
980996 TempDIBasicType clone() const { return cloneImpl (); }
981997
982998 unsigned getEncoding () const { return Encoding; }
983999
1000+ uint32_t getDataSizeInBits () const { return DataSizeInBits; }
1001+
9841002 enum class Signedness { Signed, Unsigned };
9851003
9861004 // / Return the signedness of this type, or std::nullopt if this type is
@@ -1010,7 +1028,7 @@ class DIFixedPointType : public DIBasicType {
10101028 uint32_t AlignInBits, unsigned Encoding, DIFlags Flags,
10111029 unsigned Kind, int Factor, ArrayRef<Metadata *> Ops)
10121030 : DIBasicType(C, DIFixedPointTypeKind, Storage, Tag, AlignInBits,
1013- Encoding, 0 , Flags, Ops),
1031+ Encoding, 0 , 0 , Flags, Ops),
10141032 Kind (Kind), Factor(Factor) {
10151033 assert (Kind == FixedPointBinary || Kind == FixedPointDecimal);
10161034 }
@@ -1019,7 +1037,7 @@ class DIFixedPointType : public DIBasicType {
10191037 unsigned Kind, APInt Numerator, APInt Denominator,
10201038 ArrayRef<Metadata *> Ops)
10211039 : DIBasicType(C, DIFixedPointTypeKind, Storage, Tag, AlignInBits,
1022- Encoding, 0 , Flags, Ops),
1040+ Encoding, 0 , 0 , Flags, Ops),
10231041 Kind(Kind), Factor(0 ), Numerator(Numerator), Denominator(Denominator) {
10241042 assert (Kind == FixedPointRational);
10251043 }
@@ -1028,7 +1046,7 @@ class DIFixedPointType : public DIBasicType {
10281046 unsigned Kind, int Factor, APInt Numerator,
10291047 APInt Denominator, ArrayRef<Metadata *> Ops)
10301048 : DIBasicType(C, DIFixedPointTypeKind, Storage, Tag, AlignInBits,
1031- Encoding, 0 , Flags, Ops),
1049+ Encoding, 0 , 0 , Flags, Ops),
10321050 Kind(Kind), Factor(Factor), Numerator(Numerator),
10331051 Denominator(Denominator) {}
10341052 ~DIFixedPointType () = default ;
0 commit comments