@@ -844,96 +844,114 @@ class DIBasicType : public DIType {
844844 friend class MDNode ;
845845
846846 unsigned Encoding;
847+ // / Describes the number of bits used by the value of the object. Non-zero
848+ // / when the value of an object does not fully occupy the storage size
849+ // / specified by SizeInBits.
850+ uint32_t DataSizeInBits;
847851
848852protected:
849853 DIBasicType (LLVMContext &C, StorageType Storage, unsigned Tag,
850854 uint32_t AlignInBits, unsigned Encoding,
851- uint32_t NumExtraInhabitants, DIFlags Flags ,
852- ArrayRef<Metadata *> Ops)
855+ uint32_t NumExtraInhabitants, uint32_t DataSizeInBits ,
856+ DIFlags Flags, ArrayRef<Metadata *> Ops)
853857 : DIType(C, DIBasicTypeKind, Storage, Tag, 0 , AlignInBits,
854858 NumExtraInhabitants, Flags, Ops),
855- Encoding (Encoding) {}
859+ Encoding (Encoding), DataSizeInBits(DataSizeInBits) {}
856860 DIBasicType (LLVMContext &C, unsigned ID, StorageType Storage, unsigned Tag,
857861 uint32_t AlignInBits, unsigned Encoding,
858- uint32_t NumExtraInhabitants, DIFlags Flags ,
859- ArrayRef<Metadata *> Ops)
862+ uint32_t NumExtraInhabitants, uint32_t DataSizeInBits ,
863+ DIFlags Flags, ArrayRef<Metadata *> Ops)
860864 : DIType(C, ID, Storage, Tag, 0 , AlignInBits, NumExtraInhabitants, Flags,
861865 Ops),
862- Encoding(Encoding) {}
866+ Encoding(Encoding), DataSizeInBits(DataSizeInBits) {}
863867 ~DIBasicType () = default ;
864868
865869 static DIBasicType *getImpl (LLVMContext &Context, unsigned Tag,
866870 StringRef Name, uint64_t SizeInBits,
867871 uint32_t AlignInBits, unsigned Encoding,
868- uint32_t NumExtraInhabitants, DIFlags Flags,
872+ uint32_t NumExtraInhabitants,
873+ uint32_t DataSizeInBits, DIFlags Flags,
869874 StorageType Storage, bool ShouldCreate = true ) {
870875 return getImpl (Context, Tag, getCanonicalMDString (Context, Name),
871876 SizeInBits, AlignInBits, Encoding, NumExtraInhabitants,
872- Flags, Storage, ShouldCreate);
877+ DataSizeInBits, Flags, Storage, ShouldCreate);
873878 }
874879 static DIBasicType *getImpl (LLVMContext &Context, unsigned Tag,
875880 MDString *Name, uint64_t SizeInBits,
876881 uint32_t AlignInBits, unsigned Encoding,
877- uint32_t NumExtraInhabitants, DIFlags Flags,
882+ uint32_t NumExtraInhabitants,
883+ uint32_t DataSizeInBits, DIFlags Flags,
878884 StorageType Storage, bool ShouldCreate = true ) {
879885 auto *SizeInBitsNode = ConstantAsMetadata::get (
880886 ConstantInt::get (Type::getInt64Ty (Context), SizeInBits));
881887 return getImpl (Context, Tag, Name, SizeInBitsNode, AlignInBits, Encoding,
882- NumExtraInhabitants, Flags, Storage, ShouldCreate);
888+ NumExtraInhabitants, DataSizeInBits, Flags, Storage,
889+ ShouldCreate);
883890 }
884- LLVM_ABI static DIBasicType *getImpl (LLVMContext &Context, unsigned Tag,
885- MDString *Name, Metadata *SizeInBits,
886- uint32_t AlignInBits, unsigned Encoding,
887- uint32_t NumExtraInhabitants,
888- DIFlags Flags, StorageType Storage,
889- bool ShouldCreate = true );
891+ LLVM_ABI static DIBasicType *
892+ getImpl (LLVMContext &Context, unsigned Tag, MDString *Name,
893+ Metadata *SizeInBits, uint32_t AlignInBits, unsigned Encoding,
894+ uint32_t NumExtraInhabitants, uint32_t DataSizeInBits, DIFlags Flags,
895+ StorageType Storage, bool ShouldCreate = true );
890896
891897 TempDIBasicType cloneImpl () const {
892898 return getTemporary (getContext (), getTag (), getRawName (),
893899 getRawSizeInBits (), getAlignInBits (), getEncoding (),
894- getNumExtraInhabitants (), getFlags ());
900+ getNumExtraInhabitants (), getDataSizeInBits (),
901+ getFlags ());
895902 }
896903
897904public:
898905 DEFINE_MDNODE_GET (DIBasicType, (unsigned Tag, StringRef Name),
899- (Tag, Name, 0 , 0 , 0 , 0 , FlagZero))
906+ (Tag, Name, 0 , 0 , 0 , 0 , 0 , FlagZero))
900907 DEFINE_MDNODE_GET(DIBasicType,
901908 (unsigned Tag, StringRef Name, uint64_t SizeInBits),
902- (Tag, Name, SizeInBits, 0 , 0 , 0 , FlagZero))
909+ (Tag, Name, SizeInBits, 0 , 0 , 0 , 0 , FlagZero))
903910 DEFINE_MDNODE_GET(DIBasicType,
904911 (unsigned Tag, MDString *Name, uint64_t SizeInBits),
905- (Tag, Name, SizeInBits, 0 , 0 , 0 , FlagZero))
912+ (Tag, Name, SizeInBits, 0 , 0 , 0 , 0 , FlagZero))
906913 DEFINE_MDNODE_GET(DIBasicType,
907914 (unsigned Tag, StringRef Name, uint64_t SizeInBits,
908915 uint32_t AlignInBits, unsigned Encoding, DIFlags Flags),
909- (Tag, Name, SizeInBits, AlignInBits, Encoding, 0 , Flags))
916+ (Tag, Name, SizeInBits, AlignInBits, Encoding, 0 , 0 , Flags))
910917 DEFINE_MDNODE_GET(DIBasicType,
911918 (unsigned Tag, MDString *Name, uint64_t SizeInBits,
912919 uint32_t AlignInBits, unsigned Encoding, DIFlags Flags),
913- (Tag, Name, SizeInBits, AlignInBits, Encoding, 0 , Flags))
920+ (Tag, Name, SizeInBits, AlignInBits, Encoding, 0 , 0 , Flags))
914921 DEFINE_MDNODE_GET(DIBasicType,
915922 (unsigned Tag, StringRef Name, uint64_t SizeInBits,
916923 uint32_t AlignInBits, unsigned Encoding,
917924 uint32_t NumExtraInhabitants, DIFlags Flags),
918925 (Tag, Name, SizeInBits, AlignInBits, Encoding,
919- NumExtraInhabitants, Flags))
926+ NumExtraInhabitants, 0 , Flags))
927+ DEFINE_MDNODE_GET(DIBasicType,
928+ (unsigned Tag, StringRef Name, uint64_t SizeInBits,
929+ uint32_t AlignInBits, unsigned Encoding,
930+ uint32_t NumExtraInhabitants, uint32_t DataSizeInBits,
931+ DIFlags Flags),
932+ (Tag, Name, SizeInBits, AlignInBits, Encoding,
933+ NumExtraInhabitants, DataSizeInBits, Flags))
920934 DEFINE_MDNODE_GET(DIBasicType,
921935 (unsigned Tag, MDString *Name, uint64_t SizeInBits,
922936 uint32_t AlignInBits, unsigned Encoding,
923- uint32_t NumExtraInhabitants, DIFlags Flags),
937+ uint32_t NumExtraInhabitants, uint32_t DataSizeInBits,
938+ DIFlags Flags),
924939 (Tag, Name, SizeInBits, AlignInBits, Encoding,
925- NumExtraInhabitants, Flags))
940+ NumExtraInhabitants, DataSizeInBits, Flags))
926941 DEFINE_MDNODE_GET(DIBasicType,
927942 (unsigned Tag, MDString *Name, Metadata *SizeInBits,
928943 uint32_t AlignInBits, unsigned Encoding,
929- uint32_t NumExtraInhabitants, DIFlags Flags),
944+ uint32_t NumExtraInhabitants, uint32_t DataSizeInBits,
945+ DIFlags Flags),
930946 (Tag, Name, SizeInBits, AlignInBits, Encoding,
931- NumExtraInhabitants, Flags))
947+ NumExtraInhabitants, DataSizeInBits, Flags))
932948
933949 TempDIBasicType clone() const { return cloneImpl (); }
934950
935951 unsigned getEncoding () const { return Encoding; }
936952
953+ uint32_t getDataSizeInBits () const { return DataSizeInBits; }
954+
937955 enum class Signedness { Signed, Unsigned };
938956
939957 // / Return the signedness of this type, or std::nullopt if this type is
@@ -963,7 +981,7 @@ class DIFixedPointType : public DIBasicType {
963981 uint32_t AlignInBits, unsigned Encoding, DIFlags Flags,
964982 unsigned Kind, int Factor, ArrayRef<Metadata *> Ops)
965983 : DIBasicType(C, DIFixedPointTypeKind, Storage, Tag, AlignInBits,
966- Encoding, 0 , Flags, Ops),
984+ Encoding, 0 , 0 , Flags, Ops),
967985 Kind (Kind), Factor(Factor) {
968986 assert (Kind == FixedPointBinary || Kind == FixedPointDecimal);
969987 }
@@ -972,7 +990,7 @@ class DIFixedPointType : public DIBasicType {
972990 unsigned Kind, APInt Numerator, APInt Denominator,
973991 ArrayRef<Metadata *> Ops)
974992 : DIBasicType(C, DIFixedPointTypeKind, Storage, Tag, AlignInBits,
975- Encoding, 0 , Flags, Ops),
993+ Encoding, 0 , 0 , Flags, Ops),
976994 Kind(Kind), Factor(0 ), Numerator(Numerator), Denominator(Denominator) {
977995 assert (Kind == FixedPointRational);
978996 }
@@ -981,7 +999,7 @@ class DIFixedPointType : public DIBasicType {
981999 unsigned Kind, int Factor, APInt Numerator,
9821000 APInt Denominator, ArrayRef<Metadata *> Ops)
9831001 : DIBasicType(C, DIFixedPointTypeKind, Storage, Tag, AlignInBits,
984- Encoding, 0 , Flags, Ops),
1002+ Encoding, 0 , 0 , Flags, Ops),
9851003 Kind(Kind), Factor(Factor), Numerator(Numerator),
9861004 Denominator(Denominator) {}
9871005 ~DIFixedPointType () = default ;
0 commit comments