@@ -819,6 +819,12 @@ class DIDerivedType : public DIType {
819
819
return C->getValue ();
820
820
return nullptr ;
821
821
}
822
+ Constant *getDiscriminantValue () const {
823
+ assert (getTag () == dwarf::DW_TAG_member && !isStaticMember ());
824
+ if (auto *C = cast_or_null<ConstantAsMetadata>(getExtraData ()))
825
+ return C->getValue ();
826
+ return nullptr ;
827
+ }
822
828
// / @}
823
829
824
830
static bool classof (const Metadata *MD) {
@@ -861,27 +867,29 @@ class DICompositeType : public DIType {
861
867
uint64_t SizeInBits, uint32_t AlignInBits, uint64_t OffsetInBits,
862
868
DIFlags Flags, DINodeArray Elements, unsigned RuntimeLang,
863
869
DITypeRef VTableHolder, DITemplateParameterArray TemplateParams,
864
- StringRef Identifier, StorageType Storage, bool ShouldCreate = true ) {
870
+ StringRef Identifier, DIDerivedType *Discriminator,
871
+ StorageType Storage, bool ShouldCreate = true ) {
865
872
return getImpl (
866
873
Context, Tag, getCanonicalMDString (Context, Name), File, Line, Scope,
867
874
BaseType, SizeInBits, AlignInBits, OffsetInBits, Flags, Elements.get (),
868
875
RuntimeLang, VTableHolder, TemplateParams.get (),
869
- getCanonicalMDString (Context, Identifier), Storage, ShouldCreate);
876
+ getCanonicalMDString (Context, Identifier), Discriminator, Storage, ShouldCreate);
870
877
}
871
878
static DICompositeType *
872
879
getImpl (LLVMContext &Context, unsigned Tag, MDString *Name, Metadata *File,
873
880
unsigned Line, Metadata *Scope, Metadata *BaseType,
874
881
uint64_t SizeInBits, uint32_t AlignInBits, uint64_t OffsetInBits,
875
882
DIFlags Flags, Metadata *Elements, unsigned RuntimeLang,
876
883
Metadata *VTableHolder, Metadata *TemplateParams,
877
- MDString *Identifier, StorageType Storage, bool ShouldCreate = true );
884
+ MDString *Identifier, Metadata *Discriminator,
885
+ StorageType Storage, bool ShouldCreate = true );
878
886
879
887
TempDICompositeType cloneImpl () const {
880
888
return getTemporary (getContext (), getTag (), getName (), getFile (), getLine (),
881
889
getScope (), getBaseType (), getSizeInBits (),
882
890
getAlignInBits (), getOffsetInBits (), getFlags (),
883
891
getElements (), getRuntimeLang (), getVTableHolder (),
884
- getTemplateParams (), getIdentifier ());
892
+ getTemplateParams (), getIdentifier (), getDiscriminator () );
885
893
}
886
894
887
895
public:
@@ -892,21 +900,22 @@ class DICompositeType : public DIType {
892
900
DIFlags Flags, DINodeArray Elements, unsigned RuntimeLang,
893
901
DITypeRef VTableHolder,
894
902
DITemplateParameterArray TemplateParams = nullptr ,
895
- StringRef Identifier = " " ),
903
+ StringRef Identifier = " " , DIDerivedType *Discriminator = nullptr ),
896
904
(Tag, Name, File, Line, Scope, BaseType, SizeInBits,
897
905
AlignInBits, OffsetInBits, Flags, Elements, RuntimeLang,
898
- VTableHolder, TemplateParams, Identifier))
906
+ VTableHolder, TemplateParams, Identifier, Discriminator ))
899
907
DEFINE_MDNODE_GET(DICompositeType,
900
908
(unsigned Tag, MDString *Name, Metadata *File,
901
909
unsigned Line, Metadata *Scope, Metadata *BaseType,
902
910
uint64_t SizeInBits, uint32_t AlignInBits,
903
911
uint64_t OffsetInBits, DIFlags Flags, Metadata *Elements,
904
912
unsigned RuntimeLang, Metadata *VTableHolder,
905
913
Metadata *TemplateParams = nullptr ,
906
- MDString *Identifier = nullptr ),
914
+ MDString *Identifier = nullptr ,
915
+ Metadata *Discriminator = nullptr ),
907
916
(Tag, Name, File, Line, Scope, BaseType, SizeInBits,
908
917
AlignInBits, OffsetInBits, Flags, Elements, RuntimeLang,
909
- VTableHolder, TemplateParams, Identifier))
918
+ VTableHolder, TemplateParams, Identifier, Discriminator ))
910
919
911
920
TempDICompositeType clone() const { return cloneImpl (); }
912
921
@@ -923,7 +932,7 @@ class DICompositeType : public DIType {
923
932
Metadata *BaseType, uint64_t SizeInBits, uint32_t AlignInBits,
924
933
uint64_t OffsetInBits, DIFlags Flags, Metadata *Elements,
925
934
unsigned RuntimeLang, Metadata *VTableHolder,
926
- Metadata *TemplateParams);
935
+ Metadata *TemplateParams, Metadata *Discriminator );
927
936
static DICompositeType *getODRTypeIfExists (LLVMContext &Context,
928
937
MDString &Identifier);
929
938
@@ -942,7 +951,7 @@ class DICompositeType : public DIType {
942
951
Metadata *BaseType, uint64_t SizeInBits, uint32_t AlignInBits,
943
952
uint64_t OffsetInBits, DIFlags Flags, Metadata *Elements,
944
953
unsigned RuntimeLang, Metadata *VTableHolder,
945
- Metadata *TemplateParams);
954
+ Metadata *TemplateParams, Metadata *Discriminator );
946
955
947
956
DITypeRef getBaseType () const { return DITypeRef (getRawBaseType ()); }
948
957
DINodeArray getElements () const {
@@ -960,6 +969,8 @@ class DICompositeType : public DIType {
960
969
Metadata *getRawVTableHolder () const { return getOperand (5 ); }
961
970
Metadata *getRawTemplateParams () const { return getOperand (6 ); }
962
971
MDString *getRawIdentifier () const { return getOperandAs<MDString>(7 ); }
972
+ Metadata *getRawDiscriminator () const { return getOperand (8 ); }
973
+ DIDerivedType *getDiscriminator () const { return getOperandAs<DIDerivedType>(8 ); }
963
974
964
975
// / Replace operands.
965
976
// /
0 commit comments