Skip to content

Commit 28576a0

Browse files
committed
Use metadata for size and offset in DIType
This changes DIType to use metadata for the size and offset information. This patch doesn't have any functional changes yet; the test is in the next patch.
1 parent 5990f2e commit 28576a0

File tree

10 files changed

+623
-263
lines changed

10 files changed

+623
-263
lines changed

clang/lib/CodeGen/CGDebugInfo.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -834,8 +834,8 @@ llvm::DIType *CGDebugInfo::CreateType(const BuiltinType *BT) {
834834
auto *ISATy = DBuilder.createPointerType(ClassTy, Size);
835835

836836
ObjTy = DBuilder.createStructType(TheCU, "objc_object", TheCU->getFile(), 0,
837-
0, 0, llvm::DINode::FlagZero, nullptr,
838-
llvm::DINodeArray());
837+
(uint64_t)0, 0, llvm::DINode::FlagZero,
838+
nullptr, llvm::DINodeArray());
839839

840840
DBuilder.replaceArrays(
841841
ObjTy, DBuilder.getOrCreateArray(&*DBuilder.createMemberType(

llvm/include/llvm/IR/DebugInfoMetadata.h

Lines changed: 303 additions & 92 deletions
Large diffs are not rendered by default.

llvm/lib/AsmParser/LLParser.cpp

Lines changed: 83 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -4822,6 +4822,35 @@ struct MDSignedOrMDField : MDEitherFieldImpl<MDSignedField, MDField> {
48224822
}
48234823
};
48244824

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+
48254854
} // end anonymous namespace
48264855

48274856
namespace llvm {
@@ -5205,6 +5234,29 @@ bool LLParser::parseMDField(LocTy Loc, StringRef Name,
52055234
return true;
52065235
}
52075236

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+
52085260
template <>
52095261
bool LLParser::parseMDField(LocTy Loc, StringRef Name, MDStringField &Result) {
52105262
LocTy ValueLoc = Lex.getLoc();
@@ -5386,7 +5438,7 @@ bool LLParser::parseDISubrangeType(MDNode *&Result, bool IsDistinct) {
53865438
OPTIONAL(line, LineField, ); \
53875439
OPTIONAL(scope, MDField, ); \
53885440
OPTIONAL(baseType, MDField, ); \
5389-
OPTIONAL(size, MDUnsignedField, (0, UINT64_MAX)); \
5441+
OPTIONAL(size, MDUnsignedOrMDField, (0, UINT64_MAX)); \
53905442
OPTIONAL(align, MDUnsignedField, (0, UINT32_MAX)); \
53915443
OPTIONAL(flags, DIFlagField, ); \
53925444
OPTIONAL(lowerBound, MDSignedOrMDField, ); \
@@ -5410,10 +5462,10 @@ bool LLParser::parseDISubrangeType(MDNode *&Result, bool IsDistinct) {
54105462
Metadata *Stride = convToMetadata(stride);
54115463
Metadata *Bias = convToMetadata(bias);
54125464

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));
54175469

54185470
return false;
54195471
}
@@ -5521,15 +5573,16 @@ bool LLParser::parseDIBasicType(MDNode *&Result, bool IsDistinct) {
55215573
#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
55225574
OPTIONAL(tag, DwarfTagField, (dwarf::DW_TAG_base_type)); \
55235575
OPTIONAL(name, MDStringField, ); \
5524-
OPTIONAL(size, MDUnsignedField, (0, UINT64_MAX)); \
5576+
OPTIONAL(size, MDUnsignedOrMDField, (0, UINT64_MAX)); \
55255577
OPTIONAL(align, MDUnsignedField, (0, UINT32_MAX)); \
55265578
OPTIONAL(encoding, DwarfAttEncodingField, ); \
55275579
OPTIONAL(num_extra_inhabitants, MDUnsignedField, (0, UINT32_MAX)); \
55285580
OPTIONAL(flags, DIFlagField, );
55295581
PARSE_MD_FIELDS();
55305582
#undef VISIT_MD_FIELDS
55315583

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),
55335586
align.Val, encoding.Val,
55345587
num_extra_inhabitants.Val, flags.Val));
55355588
return false;
@@ -5544,7 +5597,7 @@ bool LLParser::parseDIFixedPointType(MDNode *&Result, bool IsDistinct) {
55445597
#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
55455598
OPTIONAL(tag, DwarfTagField, (dwarf::DW_TAG_base_type)); \
55465599
OPTIONAL(name, MDStringField, ); \
5547-
OPTIONAL(size, MDUnsignedField, (0, UINT64_MAX)); \
5600+
OPTIONAL(size, MDUnsignedOrMDField, (0, UINT64_MAX)); \
55485601
OPTIONAL(align, MDUnsignedField, (0, UINT32_MAX)); \
55495602
OPTIONAL(encoding, DwarfAttEncodingField, ); \
55505603
OPTIONAL(flags, DIFlagField, ); \
@@ -5556,7 +5609,8 @@ bool LLParser::parseDIFixedPointType(MDNode *&Result, bool IsDistinct) {
55565609
#undef VISIT_MD_FIELDS
55575610

55585611
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,
55605614
encoding.Val, flags.Val, kind.Val, factor.Val,
55615615
numerator.Val, denominator.Val));
55625616
return false;
@@ -5571,7 +5625,7 @@ bool LLParser::parseDIStringType(MDNode *&Result, bool IsDistinct) {
55715625
OPTIONAL(stringLength, MDField, ); \
55725626
OPTIONAL(stringLengthExpression, MDField, ); \
55735627
OPTIONAL(stringLocationExpression, MDField, ); \
5574-
OPTIONAL(size, MDUnsignedField, (0, UINT64_MAX)); \
5628+
OPTIONAL(size, MDUnsignedOrMDField, (0, UINT64_MAX)); \
55755629
OPTIONAL(align, MDUnsignedField, (0, UINT32_MAX)); \
55765630
OPTIONAL(encoding, DwarfAttEncodingField, );
55775631
PARSE_MD_FIELDS();
@@ -5580,7 +5634,8 @@ bool LLParser::parseDIStringType(MDNode *&Result, bool IsDistinct) {
55805634
Result = GET_OR_DISTINCT(
55815635
DIStringType,
55825636
(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));
55845639
return false;
55855640
}
55865641

@@ -5601,9 +5656,9 @@ bool LLParser::parseDIDerivedType(MDNode *&Result, bool IsDistinct) {
56015656
OPTIONAL(line, LineField, ); \
56025657
OPTIONAL(scope, MDField, ); \
56035658
REQUIRED(baseType, MDField, ); \
5604-
OPTIONAL(size, MDUnsignedField, (0, UINT64_MAX)); \
5659+
OPTIONAL(size, MDUnsignedOrMDField, (0, UINT64_MAX)); \
56055660
OPTIONAL(align, MDUnsignedField, (0, UINT32_MAX)); \
5606-
OPTIONAL(offset, MDUnsignedField, (0, UINT64_MAX)); \
5661+
OPTIONAL(offset, MDUnsignedOrMDField, (0, UINT64_MAX)); \
56075662
OPTIONAL(flags, DIFlagField, ); \
56085663
OPTIONAL(extraData, MDField, ); \
56095664
OPTIONAL(dwarfAddressSpace, MDUnsignedField, (UINT32_MAX, UINT32_MAX)); \
@@ -5626,11 +5681,11 @@ bool LLParser::parseDIDerivedType(MDNode *&Result, bool IsDistinct) {
56265681
(unsigned)ptrAuthExtraDiscriminator.Val, ptrAuthIsaPointer.Val,
56275682
ptrAuthAuthenticatesNullValues.Val);
56285683

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));
56345689
return false;
56355690
}
56365691

@@ -5642,9 +5697,9 @@ bool LLParser::parseDICompositeType(MDNode *&Result, bool IsDistinct) {
56425697
OPTIONAL(line, LineField, ); \
56435698
OPTIONAL(scope, MDField, ); \
56445699
OPTIONAL(baseType, MDField, ); \
5645-
OPTIONAL(size, MDUnsignedField, (0, UINT64_MAX)); \
5700+
OPTIONAL(size, MDUnsignedOrMDField, (0, UINT64_MAX)); \
56465701
OPTIONAL(align, MDUnsignedField, (0, UINT32_MAX)); \
5647-
OPTIONAL(offset, MDUnsignedField, (0, UINT64_MAX)); \
5702+
OPTIONAL(offset, MDUnsignedOrMDField, (0, UINT64_MAX)); \
56485703
OPTIONAL(flags, DIFlagField, ); \
56495704
OPTIONAL(elements, MDField, ); \
56505705
OPTIONAL(runtimeLang, DwarfLangField, ); \
@@ -5679,12 +5734,12 @@ bool LLParser::parseDICompositeType(MDNode *&Result, bool IsDistinct) {
56795734
if (identifier.Val)
56805735
if (auto *CT = DICompositeType::buildODRType(
56815736
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)) {
56885743
Result = CT;
56895744
return false;
56905745
}
@@ -5694,7 +5749,8 @@ bool LLParser::parseDICompositeType(MDNode *&Result, bool IsDistinct) {
56945749
Result = GET_OR_DISTINCT(
56955750
DICompositeType,
56965751
(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,
56985754
runtimeLang.Val, EnumKind, vtableHolder.Val, templateParams.Val,
56995755
identifier.Val, discriminator.Val, dataLocation.Val, associated.Val,
57005756
allocated.Val, Rank, annotations.Val, specification.Val,

0 commit comments

Comments
 (0)