@@ -199,6 +199,7 @@ class DINode : public MDNode {
199199 case DISubrangeKind:
200200 case DIEnumeratorKind:
201201 case DIBasicTypeKind:
202+ case DIFixedPointTypeKind:
202203 case DIStringTypeKind:
203204 case DISubrangeTypeKind:
204205 case DIDerivedTypeKind:
@@ -547,6 +548,7 @@ class DIScope : public DINode {
547548 default :
548549 return false ;
549550 case DIBasicTypeKind:
551+ case DIFixedPointTypeKind:
550552 case DIStringTypeKind:
551553 case DISubrangeTypeKind:
552554 case DIDerivedTypeKind:
@@ -806,6 +808,7 @@ class DIType : public DIScope {
806808 default :
807809 return false ;
808810 case DIBasicTypeKind:
811+ case DIFixedPointTypeKind:
809812 case DIStringTypeKind:
810813 case DISubrangeTypeKind:
811814 case DIDerivedTypeKind:
@@ -826,13 +829,21 @@ class DIBasicType : public DIType {
826829
827830 unsigned Encoding;
828831
832+ protected:
829833 DIBasicType (LLVMContext &C, StorageType Storage, unsigned Tag,
830834 uint64_t SizeInBits, uint32_t AlignInBits, unsigned Encoding,
831835 uint32_t NumExtraInhabitants, DIFlags Flags,
832836 ArrayRef<Metadata *> Ops)
833837 : DIType(C, DIBasicTypeKind, Storage, Tag, 0 , SizeInBits, AlignInBits, 0 ,
834838 NumExtraInhabitants, Flags, Ops),
835839 Encoding (Encoding) {}
840+ DIBasicType (LLVMContext &C, unsigned ID, StorageType Storage, unsigned Tag,
841+ uint64_t SizeInBits, uint32_t AlignInBits, unsigned Encoding,
842+ uint32_t NumExtraInhabitants, DIFlags Flags,
843+ ArrayRef<Metadata *> Ops)
844+ : DIType(C, ID, Storage, Tag, 0 , SizeInBits, AlignInBits, 0 ,
845+ NumExtraInhabitants, Flags, Ops),
846+ Encoding(Encoding) {}
836847 ~DIBasicType () = default ;
837848
838849 static DIBasicType *getImpl (LLVMContext &Context, unsigned Tag,
@@ -897,7 +908,132 @@ class DIBasicType : public DIType {
897908 std::optional<Signedness> getSignedness () const ;
898909
899910 static bool classof (const Metadata *MD) {
900- return MD->getMetadataID () == DIBasicTypeKind;
911+ return MD->getMetadataID () == DIBasicTypeKind ||
912+ MD->getMetadataID () == DIFixedPointTypeKind;
913+ }
914+ };
915+
916+ // / Fixed-point type.
917+ class DIFixedPointType : public DIBasicType {
918+ friend class LLVMContextImpl ;
919+ friend class MDNode ;
920+
921+ // Actually FixedPointKind.
922+ unsigned Kind;
923+ // Used for binary and decimal.
924+ int Factor;
925+ // Used for rational.
926+ APInt Numerator;
927+ APInt Denominator;
928+
929+ DIFixedPointType (LLVMContext &C, StorageType Storage, unsigned Tag,
930+ uint64_t SizeInBits, uint32_t AlignInBits, unsigned Encoding,
931+ DIFlags Flags, unsigned Kind, int Factor,
932+ ArrayRef<Metadata *> Ops)
933+ : DIBasicType(C, DIFixedPointTypeKind, Storage, Tag, SizeInBits,
934+ AlignInBits, Encoding, 0 , Flags, Ops),
935+ Kind (Kind), Factor(Factor) {
936+ assert (Kind == FixedPointBinary || Kind == FixedPointDecimal);
937+ }
938+ DIFixedPointType (LLVMContext &C, StorageType Storage, unsigned Tag,
939+ uint64_t SizeInBits, uint32_t AlignInBits, unsigned Encoding,
940+ DIFlags Flags, unsigned Kind, APInt Numerator,
941+ APInt Denominator, ArrayRef<Metadata *> Ops)
942+ : DIBasicType(C, DIFixedPointTypeKind, Storage, Tag, SizeInBits,
943+ AlignInBits, Encoding, 0 , Flags, Ops),
944+ Kind(Kind), Factor(0 ), Numerator(Numerator), Denominator(Denominator) {
945+ assert (Kind == FixedPointRational);
946+ }
947+ DIFixedPointType (LLVMContext &C, StorageType Storage, unsigned Tag,
948+ uint64_t SizeInBits, uint32_t AlignInBits, unsigned Encoding,
949+ DIFlags Flags, unsigned Kind, int Factor, APInt Numerator,
950+ APInt Denominator, ArrayRef<Metadata *> Ops)
951+ : DIBasicType(C, DIFixedPointTypeKind, Storage, Tag, SizeInBits,
952+ AlignInBits, Encoding, 0 , Flags, Ops),
953+ Kind(Kind), Factor(Factor), Numerator(Numerator),
954+ Denominator(Denominator) {}
955+ ~DIFixedPointType () = default ;
956+
957+ static DIFixedPointType *
958+ getImpl (LLVMContext &Context, unsigned Tag, StringRef Name,
959+ uint64_t SizeInBits, uint32_t AlignInBits, unsigned Encoding,
960+ DIFlags Flags, unsigned Kind, int Factor, APInt Numerator,
961+ APInt Denominator, StorageType Storage, bool ShouldCreate = true ) {
962+ return getImpl (Context, Tag, getCanonicalMDString (Context, Name),
963+ SizeInBits, AlignInBits, Encoding, Flags, Kind, Factor,
964+ Numerator, Denominator, Storage, ShouldCreate);
965+ }
966+ static DIFixedPointType *
967+ getImpl (LLVMContext &Context, unsigned Tag, MDString *Name,
968+ uint64_t SizeInBits, uint32_t AlignInBits, unsigned Encoding,
969+ DIFlags Flags, unsigned Kind, int Factor, APInt Numerator,
970+ APInt Denominator, StorageType Storage, bool ShouldCreate = true );
971+
972+ TempDIFixedPointType cloneImpl () const {
973+ return getTemporary (getContext (), getTag (), getName (), getSizeInBits (),
974+ getAlignInBits (), getEncoding (), getFlags (), Kind,
975+ Factor, Numerator, Denominator);
976+ }
977+
978+ public:
979+ enum FixedPointKind : unsigned {
980+ // / Scale factor 2^Factor.
981+ FixedPointBinary,
982+ // / Scale factor 10^Factor.
983+ FixedPointDecimal,
984+ // / Arbitrary rational scale factor.
985+ FixedPointRational,
986+ LastFixedPointKind = FixedPointRational,
987+ };
988+
989+ static std::optional<FixedPointKind> getFixedPointKind (StringRef Str);
990+ static const char *fixedPointKindString (FixedPointKind);
991+
992+ DEFINE_MDNODE_GET (DIFixedPointType,
993+ (unsigned Tag, MDString *Name, uint64_t SizeInBits,
994+ uint32_t AlignInBits, unsigned Encoding, DIFlags Flags,
995+ unsigned Kind, int Factor, APInt Numerator,
996+ APInt Denominator),
997+ (Tag, Name, SizeInBits, AlignInBits, Encoding, Flags, Kind,
998+ Factor, Numerator, Denominator))
999+ DEFINE_MDNODE_GET (DIFixedPointType,
1000+ (unsigned Tag, StringRef Name, uint64_t SizeInBits,
1001+ uint32_t AlignInBits, unsigned Encoding, DIFlags Flags,
1002+ unsigned Kind, int Factor, APInt Numerator,
1003+ APInt Denominator),
1004+ (Tag, Name, SizeInBits, AlignInBits, Encoding, Flags, Kind,
1005+ Factor, Numerator, Denominator))
1006+
1007+ TempDIFixedPointType clone () const { return cloneImpl (); }
1008+
1009+ bool isBinary () const { return Kind == FixedPointBinary; }
1010+ bool isDecimal () const { return Kind == FixedPointDecimal; }
1011+ bool isRational () const { return Kind == FixedPointRational; }
1012+
1013+ bool isSigned () const ;
1014+
1015+ FixedPointKind getKind () const { return static_cast <FixedPointKind>(Kind); }
1016+
1017+ int getFactorRaw () const { return Factor; }
1018+ int getFactor () const {
1019+ assert (Kind == FixedPointBinary || Kind == FixedPointDecimal);
1020+ return Factor;
1021+ }
1022+
1023+ const APInt &getNumeratorRaw () const { return Numerator; }
1024+ const APInt &getNumerator () const {
1025+ assert (Kind == FixedPointRational);
1026+ return Numerator;
1027+ }
1028+
1029+ const APInt &getDenominatorRaw () const { return Denominator; }
1030+ const APInt &getDenominator () const {
1031+ assert (Kind == FixedPointRational);
1032+ return Denominator;
1033+ }
1034+
1035+ static bool classof (const Metadata *MD) {
1036+ return MD->getMetadataID () == DIFixedPointTypeKind;
9011037 }
9021038};
9031039
0 commit comments