@@ -4822,6 +4822,35 @@ struct MDSignedOrMDField : MDEitherFieldImpl<MDSignedField, MDField> {
4822
4822
}
4823
4823
};
4824
4824
4825
+ struct MDUnsignedOrMDField : MDEitherFieldImpl<MDUnsignedField, MDField> {
4826
+ MDUnsignedOrMDField (uint64_t Default = 0 , bool AllowNull = true )
4827
+ : ImplTy(MDUnsignedField(Default), MDField(AllowNull)) {}
4828
+
4829
+ MDUnsignedOrMDField (uint64_t Default, uint64_t Max, bool AllowNull = true )
4830
+ : ImplTy(MDUnsignedField(Default, Max), MDField(AllowNull)) {}
4831
+
4832
+ bool isMDUnsignedField () const { return WhatIs == IsTypeA; }
4833
+ bool isMDField () const { return WhatIs == IsTypeB; }
4834
+ uint64_t getMDUnsignedValue () const {
4835
+ assert (isMDUnsignedField () && " Wrong field type" );
4836
+ return A.Val ;
4837
+ }
4838
+ Metadata *getMDFieldValue () const {
4839
+ assert (isMDField () && " Wrong field type" );
4840
+ return B.Val ;
4841
+ }
4842
+
4843
+ Metadata *getValueAsMetadata (LLVMContext &Context) const {
4844
+ if (isMDUnsignedField ()) {
4845
+ return ConstantAsMetadata::get (
4846
+ ConstantInt::get (Type::getInt64Ty (Context), getMDUnsignedValue ()));
4847
+ } else if (isMDField ()) {
4848
+ return getMDFieldValue ();
4849
+ }
4850
+ return nullptr ;
4851
+ }
4852
+ };
4853
+
4825
4854
} // end anonymous namespace
4826
4855
4827
4856
namespace llvm {
@@ -5205,6 +5234,29 @@ bool LLParser::parseMDField(LocTy Loc, StringRef Name,
5205
5234
return true ;
5206
5235
}
5207
5236
5237
+ template <>
5238
+ bool LLParser::parseMDField (LocTy Loc, StringRef Name,
5239
+ MDUnsignedOrMDField &Result) {
5240
+ // Try to parse an unsigned int.
5241
+ if (Lex.getKind () == lltok::APSInt) {
5242
+ MDUnsignedField Res = Result.A ;
5243
+ if (!parseMDField (Loc, Name, Res)) {
5244
+ Result.assign (Res);
5245
+ return false ;
5246
+ }
5247
+ return true ;
5248
+ }
5249
+
5250
+ // Otherwise, try to parse as an MDField.
5251
+ MDField Res = Result.B ;
5252
+ if (!parseMDField (Loc, Name, Res)) {
5253
+ Result.assign (Res);
5254
+ return false ;
5255
+ }
5256
+
5257
+ return true ;
5258
+ }
5259
+
5208
5260
template <>
5209
5261
bool LLParser::parseMDField (LocTy Loc, StringRef Name, MDStringField &Result) {
5210
5262
LocTy ValueLoc = Lex.getLoc ();
@@ -5386,7 +5438,7 @@ bool LLParser::parseDISubrangeType(MDNode *&Result, bool IsDistinct) {
5386
5438
OPTIONAL (line, LineField, ); \
5387
5439
OPTIONAL (scope, MDField, ); \
5388
5440
OPTIONAL (baseType, MDField, ); \
5389
- OPTIONAL (size, MDUnsignedField , (0 , UINT64_MAX)); \
5441
+ OPTIONAL (size, MDUnsignedOrMDField , (0 , UINT64_MAX)); \
5390
5442
OPTIONAL (align, MDUnsignedField, (0 , UINT32_MAX)); \
5391
5443
OPTIONAL (flags, DIFlagField, ); \
5392
5444
OPTIONAL (lowerBound, MDSignedOrMDField, ); \
@@ -5410,10 +5462,10 @@ bool LLParser::parseDISubrangeType(MDNode *&Result, bool IsDistinct) {
5410
5462
Metadata *Stride = convToMetadata (stride);
5411
5463
Metadata *Bias = convToMetadata (bias);
5412
5464
5413
- Result = GET_OR_DISTINCT (DISubrangeType,
5414
- (Context, name.Val , file.Val , line.Val , scope.Val ,
5415
- size.Val , align.Val , flags. Val , baseType .Val ,
5416
- LowerBound, UpperBound, Stride, Bias));
5465
+ Result = GET_OR_DISTINCT (
5466
+ DISubrangeType, (Context, name.Val , file.Val , line.Val , scope.Val ,
5467
+ size.getValueAsMetadata (Context) , align.Val , flags.Val ,
5468
+ baseType. Val , LowerBound, UpperBound, Stride, Bias));
5417
5469
5418
5470
return false ;
5419
5471
}
@@ -5521,15 +5573,16 @@ bool LLParser::parseDIBasicType(MDNode *&Result, bool IsDistinct) {
5521
5573
#define VISIT_MD_FIELDS (OPTIONAL, REQUIRED ) \
5522
5574
OPTIONAL (tag, DwarfTagField, (dwarf::DW_TAG_base_type)); \
5523
5575
OPTIONAL (name, MDStringField, ); \
5524
- OPTIONAL (size, MDUnsignedField , (0 , UINT64_MAX)); \
5576
+ OPTIONAL (size, MDUnsignedOrMDField , (0 , UINT64_MAX)); \
5525
5577
OPTIONAL (align, MDUnsignedField, (0 , UINT32_MAX)); \
5526
5578
OPTIONAL (encoding, DwarfAttEncodingField, ); \
5527
5579
OPTIONAL (num_extra_inhabitants, MDUnsignedField, (0 , UINT32_MAX)); \
5528
5580
OPTIONAL (flags, DIFlagField, );
5529
5581
PARSE_MD_FIELDS ();
5530
5582
#undef VISIT_MD_FIELDS
5531
5583
5532
- Result = GET_OR_DISTINCT (DIBasicType, (Context, tag.Val , name.Val , size.Val ,
5584
+ Result = GET_OR_DISTINCT (DIBasicType, (Context, tag.Val , name.Val ,
5585
+ size.getValueAsMetadata (Context),
5533
5586
align.Val , encoding.Val ,
5534
5587
num_extra_inhabitants.Val , flags.Val ));
5535
5588
return false ;
@@ -5544,7 +5597,7 @@ bool LLParser::parseDIFixedPointType(MDNode *&Result, bool IsDistinct) {
5544
5597
#define VISIT_MD_FIELDS (OPTIONAL, REQUIRED ) \
5545
5598
OPTIONAL (tag, DwarfTagField, (dwarf::DW_TAG_base_type)); \
5546
5599
OPTIONAL (name, MDStringField, ); \
5547
- OPTIONAL (size, MDUnsignedField , (0 , UINT64_MAX)); \
5600
+ OPTIONAL (size, MDUnsignedOrMDField , (0 , UINT64_MAX)); \
5548
5601
OPTIONAL (align, MDUnsignedField, (0 , UINT32_MAX)); \
5549
5602
OPTIONAL (encoding, DwarfAttEncodingField, ); \
5550
5603
OPTIONAL (flags, DIFlagField, ); \
@@ -5556,7 +5609,8 @@ bool LLParser::parseDIFixedPointType(MDNode *&Result, bool IsDistinct) {
5556
5609
#undef VISIT_MD_FIELDS
5557
5610
5558
5611
Result = GET_OR_DISTINCT (DIFixedPointType,
5559
- (Context, tag.Val , name.Val , size.Val , align.Val ,
5612
+ (Context, tag.Val , name.Val ,
5613
+ size.getValueAsMetadata (Context), align.Val ,
5560
5614
encoding.Val , flags.Val , kind.Val , factor.Val ,
5561
5615
numerator.Val , denominator.Val ));
5562
5616
return false ;
@@ -5571,7 +5625,7 @@ bool LLParser::parseDIStringType(MDNode *&Result, bool IsDistinct) {
5571
5625
OPTIONAL (stringLength, MDField, ); \
5572
5626
OPTIONAL (stringLengthExpression, MDField, ); \
5573
5627
OPTIONAL (stringLocationExpression, MDField, ); \
5574
- OPTIONAL (size, MDUnsignedField , (0 , UINT64_MAX)); \
5628
+ OPTIONAL (size, MDUnsignedOrMDField , (0 , UINT64_MAX)); \
5575
5629
OPTIONAL (align, MDUnsignedField, (0 , UINT32_MAX)); \
5576
5630
OPTIONAL (encoding, DwarfAttEncodingField, );
5577
5631
PARSE_MD_FIELDS ();
@@ -5580,7 +5634,8 @@ bool LLParser::parseDIStringType(MDNode *&Result, bool IsDistinct) {
5580
5634
Result = GET_OR_DISTINCT (
5581
5635
DIStringType,
5582
5636
(Context, tag.Val , name.Val , stringLength.Val , stringLengthExpression.Val ,
5583
- stringLocationExpression.Val , size.Val , align.Val , encoding.Val ));
5637
+ stringLocationExpression.Val , size.getValueAsMetadata (Context),
5638
+ align.Val , encoding.Val ));
5584
5639
return false ;
5585
5640
}
5586
5641
@@ -5601,9 +5656,9 @@ bool LLParser::parseDIDerivedType(MDNode *&Result, bool IsDistinct) {
5601
5656
OPTIONAL (line, LineField, ); \
5602
5657
OPTIONAL (scope, MDField, ); \
5603
5658
REQUIRED (baseType, MDField, ); \
5604
- OPTIONAL (size, MDUnsignedField , (0 , UINT64_MAX)); \
5659
+ OPTIONAL (size, MDUnsignedOrMDField , (0 , UINT64_MAX)); \
5605
5660
OPTIONAL (align, MDUnsignedField, (0 , UINT32_MAX)); \
5606
- OPTIONAL (offset, MDUnsignedField , (0 , UINT64_MAX)); \
5661
+ OPTIONAL (offset, MDUnsignedOrMDField , (0 , UINT64_MAX)); \
5607
5662
OPTIONAL (flags, DIFlagField, ); \
5608
5663
OPTIONAL (extraData, MDField, ); \
5609
5664
OPTIONAL (dwarfAddressSpace, MDUnsignedField, (UINT32_MAX, UINT32_MAX)); \
@@ -5626,11 +5681,11 @@ bool LLParser::parseDIDerivedType(MDNode *&Result, bool IsDistinct) {
5626
5681
(unsigned )ptrAuthExtraDiscriminator.Val , ptrAuthIsaPointer.Val ,
5627
5682
ptrAuthAuthenticatesNullValues.Val );
5628
5683
5629
- Result = GET_OR_DISTINCT (DIDerivedType,
5630
- (Context, tag.Val , name.Val , file.Val , line.Val ,
5631
- scope. Val , baseType.Val , size.Val , align.Val ,
5632
- offset.Val , DWARFAddressSpace, PtrAuthData ,
5633
- flags.Val , extraData.Val , annotations.Val ));
5684
+ Result = GET_OR_DISTINCT (
5685
+ DIDerivedType, (Context, tag.Val , name.Val , file.Val , line. Val , scope .Val ,
5686
+ baseType.Val , size.getValueAsMetadata (Context) , align.Val ,
5687
+ offset.getValueAsMetadata (Context) , DWARFAddressSpace,
5688
+ PtrAuthData, flags.Val , extraData.Val , annotations.Val ));
5634
5689
return false ;
5635
5690
}
5636
5691
@@ -5642,9 +5697,9 @@ bool LLParser::parseDICompositeType(MDNode *&Result, bool IsDistinct) {
5642
5697
OPTIONAL (line, LineField, ); \
5643
5698
OPTIONAL (scope, MDField, ); \
5644
5699
OPTIONAL (baseType, MDField, ); \
5645
- OPTIONAL (size, MDUnsignedField , (0 , UINT64_MAX)); \
5700
+ OPTIONAL (size, MDUnsignedOrMDField , (0 , UINT64_MAX)); \
5646
5701
OPTIONAL (align, MDUnsignedField, (0 , UINT32_MAX)); \
5647
- OPTIONAL (offset, MDUnsignedField , (0 , UINT64_MAX)); \
5702
+ OPTIONAL (offset, MDUnsignedOrMDField , (0 , UINT64_MAX)); \
5648
5703
OPTIONAL (flags, DIFlagField, ); \
5649
5704
OPTIONAL (elements, MDField, ); \
5650
5705
OPTIONAL (runtimeLang, DwarfLangField, ); \
@@ -5679,12 +5734,12 @@ bool LLParser::parseDICompositeType(MDNode *&Result, bool IsDistinct) {
5679
5734
if (identifier.Val )
5680
5735
if (auto *CT = DICompositeType::buildODRType (
5681
5736
Context, *identifier.Val , tag.Val , name.Val , file.Val , line.Val ,
5682
- scope.Val , baseType.Val , size.Val , align. Val , offset. Val ,
5683
- specification .Val , num_extra_inhabitants. Val , flags .Val ,
5684
- elements .Val , runtimeLang .Val , EnumKind, vtableHolder .Val ,
5685
- templateParams .Val , discriminator .Val , dataLocation .Val ,
5686
- associated.Val , allocated.Val , Rank, annotations. Val ,
5687
- bitStride.Val )) {
5737
+ scope.Val , baseType.Val , size.getValueAsMetadata (Context) ,
5738
+ align .Val , offset. getValueAsMetadata (Context), specification .Val ,
5739
+ num_extra_inhabitants .Val , flags .Val , elements. Val , runtimeLang .Val ,
5740
+ EnumKind, vtableHolder .Val , templateParams .Val , discriminator .Val ,
5741
+ dataLocation. Val , associated.Val , allocated.Val , Rank,
5742
+ annotations. Val , bitStride.Val )) {
5688
5743
Result = CT;
5689
5744
return false ;
5690
5745
}
@@ -5694,7 +5749,8 @@ bool LLParser::parseDICompositeType(MDNode *&Result, bool IsDistinct) {
5694
5749
Result = GET_OR_DISTINCT (
5695
5750
DICompositeType,
5696
5751
(Context, tag.Val , name.Val , file.Val , line.Val , scope.Val , baseType.Val ,
5697
- size.Val , align.Val , offset.Val , flags.Val , elements.Val ,
5752
+ size.getValueAsMetadata (Context), align.Val ,
5753
+ offset.getValueAsMetadata (Context), flags.Val , elements.Val ,
5698
5754
runtimeLang.Val , EnumKind, vtableHolder.Val , templateParams.Val ,
5699
5755
identifier.Val , discriminator.Val , dataLocation.Val , associated.Val ,
5700
5756
allocated.Val , Rank, annotations.Val , specification.Val ,
0 commit comments