@@ -4818,6 +4818,34 @@ struct MDSignedOrMDField : MDEitherFieldImpl<MDSignedField, MDField> {
48184818 }
48194819};
48204820
4821+ struct MDUnsignedOrMDField : MDEitherFieldImpl<MDUnsignedField, MDField> {
4822+ MDUnsignedOrMDField (uint64_t Default = 0 , bool AllowNull = true )
4823+ : ImplTy(MDUnsignedField(Default), MDField(AllowNull)) {}
4824+
4825+ MDUnsignedOrMDField (uint64_t Default, uint64_t Max, bool AllowNull = true )
4826+ : ImplTy(MDUnsignedField(Default, Max), MDField(AllowNull)) {}
4827+
4828+ bool isMDUnsignedField () const { return WhatIs == IsTypeA; }
4829+ bool isMDField () const { return WhatIs == IsTypeB; }
4830+ uint64_t getMDUnsignedValue () const {
4831+ assert (isMDUnsignedField () && " Wrong field type" );
4832+ return A.Val ;
4833+ }
4834+ Metadata *getMDFieldValue () const {
4835+ assert (isMDField () && " Wrong field type" );
4836+ return B.Val ;
4837+ }
4838+
4839+ Metadata *getValueAsMetadata (LLVMContext &Context) const {
4840+ if (isMDUnsignedField ())
4841+ return ConstantAsMetadata::get (
4842+ ConstantInt::get (Type::getInt64Ty (Context), getMDUnsignedValue ()));
4843+ if (isMDField ())
4844+ return getMDFieldValue ();
4845+ return nullptr ;
4846+ }
4847+ };
4848+
48214849} // end anonymous namespace
48224850
48234851namespace llvm {
@@ -5201,6 +5229,29 @@ bool LLParser::parseMDField(LocTy Loc, StringRef Name,
52015229 return true ;
52025230}
52035231
5232+ template <>
5233+ bool LLParser::parseMDField (LocTy Loc, StringRef Name,
5234+ MDUnsignedOrMDField &Result) {
5235+ // Try to parse an unsigned int.
5236+ if (Lex.getKind () == lltok::APSInt) {
5237+ MDUnsignedField Res = Result.A ;
5238+ if (!parseMDField (Loc, Name, Res)) {
5239+ Result.assign (Res);
5240+ return false ;
5241+ }
5242+ return true ;
5243+ }
5244+
5245+ // Otherwise, try to parse as an MDField.
5246+ MDField Res = Result.B ;
5247+ if (!parseMDField (Loc, Name, Res)) {
5248+ Result.assign (Res);
5249+ return false ;
5250+ }
5251+
5252+ return true ;
5253+ }
5254+
52045255template <>
52055256bool LLParser::parseMDField (LocTy Loc, StringRef Name, MDStringField &Result) {
52065257 LocTy ValueLoc = Lex.getLoc ();
@@ -5382,7 +5433,7 @@ bool LLParser::parseDISubrangeType(MDNode *&Result, bool IsDistinct) {
53825433 OPTIONAL (line, LineField, ); \
53835434 OPTIONAL (scope, MDField, ); \
53845435 OPTIONAL (baseType, MDField, ); \
5385- OPTIONAL (size, MDUnsignedField , (0 , UINT64_MAX)); \
5436+ OPTIONAL (size, MDUnsignedOrMDField , (0 , UINT64_MAX)); \
53865437 OPTIONAL (align, MDUnsignedField, (0 , UINT32_MAX)); \
53875438 OPTIONAL (flags, DIFlagField, ); \
53885439 OPTIONAL (lowerBound, MDSignedOrMDField, ); \
@@ -5406,10 +5457,10 @@ bool LLParser::parseDISubrangeType(MDNode *&Result, bool IsDistinct) {
54065457 Metadata *Stride = convToMetadata (stride);
54075458 Metadata *Bias = convToMetadata (bias);
54085459
5409- Result = GET_OR_DISTINCT (DISubrangeType,
5410- (Context, name.Val , file.Val , line.Val , scope.Val ,
5411- size.Val , align.Val , flags. Val , baseType .Val ,
5412- LowerBound, UpperBound, Stride, Bias));
5460+ Result = GET_OR_DISTINCT (
5461+ DISubrangeType, (Context, name.Val , file.Val , line.Val , scope.Val ,
5462+ size.getValueAsMetadata (Context) , align.Val , flags.Val ,
5463+ baseType. Val , LowerBound, UpperBound, Stride, Bias));
54135464
54145465 return false ;
54155466}
@@ -5517,15 +5568,16 @@ bool LLParser::parseDIBasicType(MDNode *&Result, bool IsDistinct) {
55175568#define VISIT_MD_FIELDS (OPTIONAL, REQUIRED ) \
55185569 OPTIONAL (tag, DwarfTagField, (dwarf::DW_TAG_base_type)); \
55195570 OPTIONAL (name, MDStringField, ); \
5520- OPTIONAL (size, MDUnsignedField , (0 , UINT64_MAX)); \
5571+ OPTIONAL (size, MDUnsignedOrMDField , (0 , UINT64_MAX)); \
55215572 OPTIONAL (align, MDUnsignedField, (0 , UINT32_MAX)); \
55225573 OPTIONAL (encoding, DwarfAttEncodingField, ); \
55235574 OPTIONAL (num_extra_inhabitants, MDUnsignedField, (0 , UINT32_MAX)); \
55245575 OPTIONAL (flags, DIFlagField, );
55255576 PARSE_MD_FIELDS ();
55265577#undef VISIT_MD_FIELDS
55275578
5528- Result = GET_OR_DISTINCT (DIBasicType, (Context, tag.Val , name.Val , size.Val ,
5579+ Result = GET_OR_DISTINCT (DIBasicType, (Context, tag.Val , name.Val ,
5580+ size.getValueAsMetadata (Context),
55295581 align.Val , encoding.Val ,
55305582 num_extra_inhabitants.Val , flags.Val ));
55315583 return false ;
@@ -5540,7 +5592,7 @@ bool LLParser::parseDIFixedPointType(MDNode *&Result, bool IsDistinct) {
55405592#define VISIT_MD_FIELDS (OPTIONAL, REQUIRED ) \
55415593 OPTIONAL (tag, DwarfTagField, (dwarf::DW_TAG_base_type)); \
55425594 OPTIONAL (name, MDStringField, ); \
5543- OPTIONAL (size, MDUnsignedField , (0 , UINT64_MAX)); \
5595+ OPTIONAL (size, MDUnsignedOrMDField , (0 , UINT64_MAX)); \
55445596 OPTIONAL (align, MDUnsignedField, (0 , UINT32_MAX)); \
55455597 OPTIONAL (encoding, DwarfAttEncodingField, ); \
55465598 OPTIONAL (flags, DIFlagField, ); \
@@ -5552,7 +5604,8 @@ bool LLParser::parseDIFixedPointType(MDNode *&Result, bool IsDistinct) {
55525604#undef VISIT_MD_FIELDS
55535605
55545606 Result = GET_OR_DISTINCT (DIFixedPointType,
5555- (Context, tag.Val , name.Val , size.Val , align.Val ,
5607+ (Context, tag.Val , name.Val ,
5608+ size.getValueAsMetadata (Context), align.Val ,
55565609 encoding.Val , flags.Val , kind.Val , factor.Val ,
55575610 numerator.Val , denominator.Val ));
55585611 return false ;
@@ -5567,7 +5620,7 @@ bool LLParser::parseDIStringType(MDNode *&Result, bool IsDistinct) {
55675620 OPTIONAL (stringLength, MDField, ); \
55685621 OPTIONAL (stringLengthExpression, MDField, ); \
55695622 OPTIONAL (stringLocationExpression, MDField, ); \
5570- OPTIONAL (size, MDUnsignedField , (0 , UINT64_MAX)); \
5623+ OPTIONAL (size, MDUnsignedOrMDField , (0 , UINT64_MAX)); \
55715624 OPTIONAL (align, MDUnsignedField, (0 , UINT32_MAX)); \
55725625 OPTIONAL (encoding, DwarfAttEncodingField, );
55735626 PARSE_MD_FIELDS ();
@@ -5576,7 +5629,8 @@ bool LLParser::parseDIStringType(MDNode *&Result, bool IsDistinct) {
55765629 Result = GET_OR_DISTINCT (
55775630 DIStringType,
55785631 (Context, tag.Val , name.Val , stringLength.Val , stringLengthExpression.Val ,
5579- stringLocationExpression.Val , size.Val , align.Val , encoding.Val ));
5632+ stringLocationExpression.Val , size.getValueAsMetadata (Context),
5633+ align.Val , encoding.Val ));
55805634 return false ;
55815635}
55825636
@@ -5597,9 +5651,9 @@ bool LLParser::parseDIDerivedType(MDNode *&Result, bool IsDistinct) {
55975651 OPTIONAL (line, LineField, ); \
55985652 OPTIONAL (scope, MDField, ); \
55995653 REQUIRED (baseType, MDField, ); \
5600- OPTIONAL (size, MDUnsignedField , (0 , UINT64_MAX)); \
5654+ OPTIONAL (size, MDUnsignedOrMDField , (0 , UINT64_MAX)); \
56015655 OPTIONAL (align, MDUnsignedField, (0 , UINT32_MAX)); \
5602- OPTIONAL (offset, MDUnsignedField , (0 , UINT64_MAX)); \
5656+ OPTIONAL (offset, MDUnsignedOrMDField , (0 , UINT64_MAX)); \
56035657 OPTIONAL (flags, DIFlagField, ); \
56045658 OPTIONAL (extraData, MDField, ); \
56055659 OPTIONAL (dwarfAddressSpace, MDUnsignedField, (UINT32_MAX, UINT32_MAX)); \
@@ -5622,11 +5676,11 @@ bool LLParser::parseDIDerivedType(MDNode *&Result, bool IsDistinct) {
56225676 (unsigned )ptrAuthExtraDiscriminator.Val , ptrAuthIsaPointer.Val ,
56235677 ptrAuthAuthenticatesNullValues.Val );
56245678
5625- Result = GET_OR_DISTINCT (DIDerivedType,
5626- (Context, tag.Val , name.Val , file.Val , line.Val ,
5627- scope. Val , baseType.Val , size.Val , align.Val ,
5628- offset.Val , DWARFAddressSpace, PtrAuthData ,
5629- flags.Val , extraData.Val , annotations.Val ));
5679+ Result = GET_OR_DISTINCT (
5680+ DIDerivedType, (Context, tag.Val , name.Val , file.Val , line. Val , scope .Val ,
5681+ baseType.Val , size.getValueAsMetadata (Context) , align.Val ,
5682+ offset.getValueAsMetadata (Context) , DWARFAddressSpace,
5683+ PtrAuthData, flags.Val , extraData.Val , annotations.Val ));
56305684 return false ;
56315685}
56325686
@@ -5638,9 +5692,9 @@ bool LLParser::parseDICompositeType(MDNode *&Result, bool IsDistinct) {
56385692 OPTIONAL (line, LineField, ); \
56395693 OPTIONAL (scope, MDField, ); \
56405694 OPTIONAL (baseType, MDField, ); \
5641- OPTIONAL (size, MDUnsignedField , (0 , UINT64_MAX)); \
5695+ OPTIONAL (size, MDUnsignedOrMDField , (0 , UINT64_MAX)); \
56425696 OPTIONAL (align, MDUnsignedField, (0 , UINT32_MAX)); \
5643- OPTIONAL (offset, MDUnsignedField , (0 , UINT64_MAX)); \
5697+ OPTIONAL (offset, MDUnsignedOrMDField , (0 , UINT64_MAX)); \
56445698 OPTIONAL (flags, DIFlagField, ); \
56455699 OPTIONAL (elements, MDField, ); \
56465700 OPTIONAL (runtimeLang, DwarfLangField, ); \
@@ -5675,12 +5729,12 @@ bool LLParser::parseDICompositeType(MDNode *&Result, bool IsDistinct) {
56755729 if (identifier.Val )
56765730 if (auto *CT = DICompositeType::buildODRType (
56775731 Context, *identifier.Val , tag.Val , name.Val , file.Val , line.Val ,
5678- scope.Val , baseType.Val , size.Val , align. Val , offset. Val ,
5679- specification .Val , num_extra_inhabitants. Val , flags .Val ,
5680- elements .Val , runtimeLang .Val , EnumKind, vtableHolder .Val ,
5681- templateParams .Val , discriminator .Val , dataLocation .Val ,
5682- associated.Val , allocated.Val , Rank, annotations. Val ,
5683- bitStride.Val )) {
5732+ scope.Val , baseType.Val , size.getValueAsMetadata (Context) ,
5733+ align .Val , offset. getValueAsMetadata (Context), specification .Val ,
5734+ num_extra_inhabitants .Val , flags .Val , elements. Val , runtimeLang .Val ,
5735+ EnumKind, vtableHolder .Val , templateParams .Val , discriminator .Val ,
5736+ dataLocation. Val , associated.Val , allocated.Val , Rank,
5737+ annotations. Val , bitStride.Val )) {
56845738 Result = CT;
56855739 return false ;
56865740 }
@@ -5690,7 +5744,8 @@ bool LLParser::parseDICompositeType(MDNode *&Result, bool IsDistinct) {
56905744 Result = GET_OR_DISTINCT (
56915745 DICompositeType,
56925746 (Context, tag.Val , name.Val , file.Val , line.Val , scope.Val , baseType.Val ,
5693- size.Val , align.Val , offset.Val , flags.Val , elements.Val ,
5747+ size.getValueAsMetadata (Context), align.Val ,
5748+ offset.getValueAsMetadata (Context), flags.Val , elements.Val ,
56945749 runtimeLang.Val , EnumKind, vtableHolder.Val , templateParams.Val ,
56955750 identifier.Val , discriminator.Val , dataLocation.Val , associated.Val ,
56965751 allocated.Val , Rank, annotations.Val , specification.Val ,
0 commit comments