Skip to content

Commit 5408250

Browse files
committed
[DebugInfo] Emit spare bits mask in debug info
The spare bits mask is a mask of the unused bits that a type may have. Swift uses these on enums to pack extra data when wrapping these enums in other types. Emit this field in LLVM-IR and DWARF.
1 parent 6119d0e commit 5408250

File tree

15 files changed

+232
-96
lines changed

15 files changed

+232
-96
lines changed

llvm/include/llvm/BinaryFormat/Dwarf.def

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -630,6 +630,7 @@ HANDLE_DW_AT(0x3fee, APPLE_objc_direct, 0, APPLE)
630630
HANDLE_DW_AT(0x3fef, APPLE_sdk, 0, APPLE)
631631
HANDLE_DW_AT(0x3ff0, APPLE_origin, 0, APPLE)
632632
HANDLE_DW_AT(0x3ff1, APPLE_num_extra_inhabitants, 0, APPLE)
633+
HANDLE_DW_AT(0x3ff2, APPLE_spare_bits_mask, 0, APPLE)
633634

634635
// Attribute form encodings.
635636
HANDLE_DW_FORM(0x01, addr, 2, DWARF)

llvm/include/llvm/IR/DIBuilder.h

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -500,13 +500,17 @@ namespace llvm {
500500
/// \param Discriminator Discriminant member
501501
/// \param Elements Variant elements.
502502
/// \param UniqueIdentifier A unique identifier for the union.
503-
DICompositeType *createVariantPart(DIScope *Scope, StringRef Name,
504-
DIFile *File, unsigned LineNumber,
505-
uint64_t SizeInBits, uint32_t AlignInBits,
506-
DINode::DIFlags Flags,
507-
DIDerivedType *Discriminator,
508-
DINodeArray Elements,
509-
StringRef UniqueIdentifier = "");
503+
/// \param OffsetInBits The offset of the variant payload in the variant
504+
/// type.
505+
/// \param SpareBitMask A mask of spare bits of the payload, spare bits are
506+
/// bits that aren't used in any of the variant's cases.
507+
DICompositeType *
508+
createVariantPart(DIScope *Scope, StringRef Name, DIFile *File,
509+
unsigned LineNumber, uint64_t SizeInBits,
510+
uint32_t AlignInBits, DINode::DIFlags Flags,
511+
DIDerivedType *Discriminator, DINodeArray Elements,
512+
StringRef UniqueIdentifier = "",
513+
uint64_t OffsetInBits = 0, APInt SpareBitsMask = APInt());
510514

511515
/// Create debugging information for template
512516
/// type parameter.

llvm/include/llvm/IR/DebugInfoMetadata.h

Lines changed: 25 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1155,15 +1155,16 @@ class DICompositeType : public DIType {
11551155
friend class MDNode;
11561156

11571157
unsigned RuntimeLang;
1158+
llvm::APInt SpareBitsMask;
11581159

11591160
DICompositeType(LLVMContext &C, StorageType Storage, unsigned Tag,
11601161
unsigned Line, unsigned RuntimeLang, uint64_t SizeInBits,
11611162
uint32_t AlignInBits, uint64_t OffsetInBits,
1162-
uint32_t NumExtraInhabitants, DIFlags Flags,
1163+
uint32_t NumExtraInhabitants, APInt SpareBitsMask, DIFlags Flags,
11631164
ArrayRef<Metadata *> Ops)
11641165
: DIType(C, DICompositeTypeKind, Storage, Tag, Line, SizeInBits,
11651166
AlignInBits, OffsetInBits, NumExtraInhabitants, Flags, Ops),
1166-
RuntimeLang(RuntimeLang) {}
1167+
RuntimeLang(RuntimeLang), SpareBitsMask(SpareBitsMask) {}
11671168
~DICompositeType() = default;
11681169

11691170
/// Change fields in place.
@@ -1181,7 +1182,7 @@ class DICompositeType : public DIType {
11811182
getImpl(LLVMContext &Context, unsigned Tag, StringRef Name, Metadata *File,
11821183
unsigned Line, DIScope *Scope, DIType *BaseType, uint64_t SizeInBits,
11831184
uint32_t AlignInBits, uint64_t OffsetInBits,
1184-
uint32_t NumExtraInhabitants, DIFlags Flags, DINodeArray Elements,
1185+
uint32_t NumExtraInhabitants, APInt SpareBitsMask, DIFlags Flags, DINodeArray Elements,
11851186
unsigned RuntimeLang, DIType *VTableHolder,
11861187
DITemplateParameterArray TemplateParams, StringRef Identifier,
11871188
DIDerivedType *Discriminator, Metadata *DataLocation,
@@ -1194,7 +1195,7 @@ class DICompositeType : public DIType {
11941195
TemplateParams.get(),
11951196
getCanonicalMDString(Context, Identifier), Discriminator,
11961197
DataLocation, Associated, Allocated, Rank, Annotations.get(),
1197-
NumExtraInhabitants, Storage, ShouldCreate);
1198+
NumExtraInhabitants, SpareBitsMask, Storage, ShouldCreate);
11981199
}
11991200
static DICompositeType *
12001201
getImpl(LLVMContext &Context, unsigned Tag, MDString *Name, Metadata *File,
@@ -1204,7 +1205,7 @@ class DICompositeType : public DIType {
12041205
Metadata *VTableHolder, Metadata *TemplateParams,
12051206
MDString *Identifier, Metadata *Discriminator, Metadata *DataLocation,
12061207
Metadata *Associated, Metadata *Allocated, Metadata *Rank,
1207-
Metadata *Annotations, uint32_t NumExtraInhabitants,
1208+
Metadata *Annotations, uint32_t NumExtraInhabitants, APInt SpareBitsMask,
12081209
StorageType Storage, bool ShouldCreate = true);
12091210

12101211
TempDICompositeType cloneImpl() const {
@@ -1214,7 +1215,7 @@ class DICompositeType : public DIType {
12141215
getFlags(), getElements(), getRuntimeLang(), getVTableHolder(),
12151216
getTemplateParams(), getIdentifier(), getDiscriminator(),
12161217
getRawDataLocation(), getRawAssociated(), getRawAllocated(),
1217-
getRawRank(), getAnnotations(), getNumExtraInhabitants());
1218+
getRawRank(), getAnnotations(), getNumExtraInhabitants(), getSpareBitsMask());
12181219
}
12191220

12201221
public:
@@ -1228,9 +1229,9 @@ class DICompositeType : public DIType {
12281229
StringRef Identifier = "", DIDerivedType *Discriminator = nullptr,
12291230
Metadata *DataLocation = nullptr, Metadata *Associated = nullptr,
12301231
Metadata *Allocated = nullptr, Metadata *Rank = nullptr,
1231-
DINodeArray Annotations = nullptr, uint32_t NumExtraInhabitants = 0),
1232+
DINodeArray Annotations = nullptr, uint32_t NumExtraInhabitants = 0, APInt SpareBitsMask = APInt()),
12321233
(Tag, Name, File, Line, Scope, BaseType, SizeInBits, AlignInBits,
1233-
OffsetInBits, NumExtraInhabitants, Flags, Elements, RuntimeLang,
1234+
OffsetInBits, NumExtraInhabitants, SpareBitsMask, Flags, Elements, RuntimeLang,
12341235
VTableHolder, TemplateParams, Identifier, Discriminator, DataLocation,
12351236
Associated, Allocated, Rank, Annotations))
12361237
DEFINE_MDNODE_GET(
@@ -1243,11 +1244,11 @@ class DICompositeType : public DIType {
12431244
Metadata *Discriminator = nullptr, Metadata *DataLocation = nullptr,
12441245
Metadata *Associated = nullptr, Metadata *Allocated = nullptr,
12451246
Metadata *Rank = nullptr, Metadata *Annotations = nullptr,
1246-
uint32_t NumExtraInhabitants = 0),
1247+
uint32_t NumExtraInhabitants = 0, APInt SpareBitsMask = APInt()),
12471248
(Tag, Name, File, Line, Scope, BaseType, SizeInBits, AlignInBits,
12481249
OffsetInBits, Flags, Elements, RuntimeLang, VTableHolder, TemplateParams,
12491250
Identifier, Discriminator, DataLocation, Associated, Allocated, Rank,
1250-
Annotations, NumExtraInhabitants))
1251+
Annotations, NumExtraInhabitants, SpareBitsMask))
12511252

12521253
TempDICompositeType clone() const { return cloneImpl(); }
12531254

@@ -1262,8 +1263,9 @@ class DICompositeType : public DIType {
12621263
getODRType(LLVMContext &Context, MDString &Identifier, unsigned Tag,
12631264
MDString *Name, Metadata *File, unsigned Line, Metadata *Scope,
12641265
Metadata *BaseType, uint64_t SizeInBits, uint32_t AlignInBits,
1265-
uint64_t OffsetInBits, uint32_t NumExtraInhabitants, DIFlags Flags,
1266-
Metadata *Elements, unsigned RuntimeLang, Metadata *VTableHolder,
1266+
uint64_t OffsetInBits, uint32_t NumExtraInhabitants,
1267+
APInt SpareBitsMask, DIFlags Flags, Metadata *Elements,
1268+
unsigned RuntimeLang, Metadata *VTableHolder,
12671269
Metadata *TemplateParams, Metadata *Discriminator,
12681270
Metadata *DataLocation, Metadata *Associated, Metadata *Allocated,
12691271
Metadata *Rank, Metadata *Annotations);
@@ -1279,14 +1281,16 @@ class DICompositeType : public DIType {
12791281
///
12801282
/// If not \a LLVMContext::isODRUniquingDebugTypes(), this function returns
12811283
/// nullptr.
1282-
static DICompositeType *buildODRType(
1283-
LLVMContext &Context, MDString &Identifier, unsigned Tag, MDString *Name,
1284-
Metadata *File, unsigned Line, Metadata *Scope, Metadata *BaseType,
1285-
uint64_t SizeInBits, uint32_t AlignInBits, uint64_t OffsetInBits,
1286-
uint32_t NumExtraInhabitants, DIFlags Flags, Metadata *Elements,
1287-
unsigned RuntimeLang, Metadata *VTableHolder, Metadata *TemplateParams,
1288-
Metadata *Discriminator, Metadata *DataLocation, Metadata *Associated,
1289-
Metadata *Allocated, Metadata *Rank, Metadata *Annotations);
1284+
static DICompositeType *
1285+
buildODRType(LLVMContext &Context, MDString &Identifier, unsigned Tag,
1286+
MDString *Name, Metadata *File, unsigned Line, Metadata *Scope,
1287+
Metadata *BaseType, uint64_t SizeInBits, uint32_t AlignInBits,
1288+
uint64_t OffsetInBits, uint32_t NumExtraInhabitants,
1289+
APInt SpareBitsMask, DIFlags Flags, Metadata *Elements,
1290+
unsigned RuntimeLang, Metadata *VTableHolder,
1291+
Metadata *TemplateParams, Metadata *Discriminator,
1292+
Metadata *DataLocation, Metadata *Associated,
1293+
Metadata *Allocated, Metadata *Rank, Metadata *Annotations);
12901294

12911295
DIType *getBaseType() const { return cast_or_null<DIType>(getRawBaseType()); }
12921296
DINodeArray getElements() const {
@@ -1300,6 +1304,7 @@ class DICompositeType : public DIType {
13001304
}
13011305
StringRef getIdentifier() const { return getStringOperand(7); }
13021306
unsigned getRuntimeLang() const { return RuntimeLang; }
1307+
const APInt &getSpareBitsMask() const { return SpareBitsMask; }
13031308

13041309
Metadata *getRawBaseType() const { return getOperand(3); }
13051310
Metadata *getRawElements() const { return getOperand(4); }

llvm/lib/AsmParser/LLParser.cpp

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4301,6 +4301,10 @@ struct MDAPSIntField : public MDFieldImpl<APSInt> {
43014301
MDAPSIntField() : ImplTy(APSInt()) {}
43024302
};
43034303

4304+
struct MDAPIntField : public MDFieldImpl<APInt> {
4305+
MDAPIntField() : ImplTy(APInt()) {}
4306+
};
4307+
43044308
struct MDSignedField : public MDFieldImpl<int64_t> {
43054309
int64_t Min = INT64_MIN;
43064310
int64_t Max = INT64_MAX;
@@ -5074,7 +5078,8 @@ bool LLParser::parseDICompositeType(MDNode *&Result, bool IsDistinct) {
50745078
OPTIONAL(allocated, MDField, ); \
50755079
OPTIONAL(rank, MDSignedOrMDField, ); \
50765080
OPTIONAL(annotations, MDField, ); \
5077-
OPTIONAL(num_extra_inhabitants, MDUnsignedField, (0, UINT32_MAX));
5081+
OPTIONAL(num_extra_inhabitants, MDUnsignedField, (0, UINT32_MAX)); \
5082+
OPTIONAL(spare_bits_mask, MDAPSIntField, );
50785083
PARSE_MD_FIELDS();
50795084
#undef VISIT_MD_FIELDS
50805085

@@ -5090,10 +5095,10 @@ bool LLParser::parseDICompositeType(MDNode *&Result, bool IsDistinct) {
50905095
if (auto *CT = DICompositeType::buildODRType(
50915096
Context, *identifier.Val, tag.Val, name.Val, file.Val, line.Val,
50925097
scope.Val, baseType.Val, size.Val, align.Val, offset.Val,
5093-
num_extra_inhabitants.Val, flags.Val, elements.Val, runtimeLang.Val,
5094-
vtableHolder.Val, templateParams.Val, discriminator.Val,
5095-
dataLocation.Val, associated.Val, allocated.Val, Rank,
5096-
annotations.Val)) {
5098+
num_extra_inhabitants.Val, spare_bits_mask.Val, flags.Val, elements.Val,
5099+
runtimeLang.Val, vtableHolder.Val, templateParams.Val,
5100+
discriminator.Val, dataLocation.Val, associated.Val, allocated.Val,
5101+
Rank, annotations.Val)) {
50975102
Result = CT;
50985103
return false;
50995104
}
@@ -5106,7 +5111,7 @@ bool LLParser::parseDICompositeType(MDNode *&Result, bool IsDistinct) {
51065111
size.Val, align.Val, offset.Val, flags.Val, elements.Val,
51075112
runtimeLang.Val, vtableHolder.Val, templateParams.Val, identifier.Val,
51085113
discriminator.Val, dataLocation.Val, associated.Val, allocated.Val, Rank,
5109-
annotations.Val, num_extra_inhabitants.Val));
5114+
annotations.Val, num_extra_inhabitants.Val, spare_bits_mask.Val));
51105115
return false;
51115116
}
51125117

llvm/lib/Bitcode/Reader/MetadataLoader.cpp

Lines changed: 26 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1570,9 +1570,13 @@ Error MetadataLoader::MetadataLoaderImpl::parseOneMetadata(
15701570
break;
15711571
}
15721572
case bitc::METADATA_COMPOSITE_TYPE: {
1573-
if (Record.size() < 16 || Record.size() > 23)
1573+
// The last field is a variable sized APInt, so the metadata loader can't
1574+
// reliably check the end for this record.
1575+
if (Record.size() < 16)
15741576
return error("Invalid record");
15751577

1578+
IsDistinct = Record[0] & 1;
1579+
bool IsBigInt = (Record[0] >> 3) & 1;
15761580
// If we have a UUID and this is not a forward declaration, lookup the
15771581
// mapping.
15781582
IsDistinct = Record[0] & 0x1;
@@ -1645,12 +1649,28 @@ Error MetadataLoader::MetadataLoaderImpl::parseOneMetadata(
16451649
}
16461650
}
16471651
DICompositeType *CT = nullptr;
1652+
APInt SpareBitsMask;
1653+
// SpareBitsMask is an optional field so the metadata loader has to check if
1654+
// it was emitted before accessing it.
1655+
if (Record.size() > 23) {
1656+
if (IsBigInt) {
1657+
const uint64_t BitWidth = Record[23];
1658+
const size_t NumWords = Record.size() - 3;
1659+
SpareBitsMask =
1660+
readWideAPInt(ArrayRef(&Record[24], NumWords), BitWidth);
1661+
} else {
1662+
const uint64_t IntValue = Record[23];
1663+
SpareBitsMask = APInt(64, IntValue);
1664+
}
1665+
}
1666+
16481667
if (Identifier)
16491668
CT = DICompositeType::buildODRType(
16501669
Context, *Identifier, Tag, Name, File, Line, Scope, BaseType,
1651-
SizeInBits, AlignInBits, OffsetInBits, NumExtraInhabitants, Flags,
1652-
Elements, RuntimeLang, VTableHolder, TemplateParams, Discriminator,
1653-
DataLocation, Associated, Allocated, Rank, Annotations);
1670+
SizeInBits, AlignInBits, OffsetInBits, NumExtraInhabitants,
1671+
SpareBitsMask, Flags, Elements, RuntimeLang, VTableHolder,
1672+
TemplateParams, Discriminator, DataLocation, Associated, Allocated,
1673+
Rank, Annotations);
16541674

16551675
// Create a node if we didn't get a lazy ODR type.
16561676
if (!CT)
@@ -1659,7 +1679,8 @@ Error MetadataLoader::MetadataLoaderImpl::parseOneMetadata(
16591679
SizeInBits, AlignInBits, OffsetInBits, Flags,
16601680
Elements, RuntimeLang, VTableHolder, TemplateParams,
16611681
Identifier, Discriminator, DataLocation, Associated,
1662-
Allocated, Rank, Annotations, NumExtraInhabitants));
1682+
Allocated, Rank, Annotations, NumExtraInhabitants,
1683+
SpareBitsMask));
16631684
if (!IsNotUsedInTypeRef && Identifier)
16641685
MetadataList.addTypeRef(*Identifier, *cast<DICompositeType>(CT));
16651686

llvm/lib/Bitcode/Writer/BitcodeWriter.cpp

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1754,8 +1754,15 @@ void ModuleBitcodeWriter::writeDIDerivedType(const DIDerivedType *N,
17541754
void ModuleBitcodeWriter::writeDICompositeType(
17551755
const DICompositeType *N, SmallVectorImpl<uint64_t> &Record,
17561756
unsigned Abbrev) {
1757+
1758+
APInt SpareBitsMask = N->getSpareBitsMask();
1759+
unsigned IsWideAPInt = 0;;
1760+
if (!SpareBitsMask.isZero() && SpareBitsMask.getBitWidth() > 64)
1761+
IsWideAPInt = 1 << 3;
1762+
17571763
const unsigned IsNotUsedInOldTypeRef = 0x2;
1758-
Record.push_back(IsNotUsedInOldTypeRef | (unsigned)N->isDistinct());
1764+
Record.push_back(IsWideAPInt | IsNotUsedInOldTypeRef |
1765+
(unsigned)N->isDistinct());
17591766
Record.push_back(N->getTag());
17601767
Record.push_back(VE.getMetadataOrNullID(N->getRawName()));
17611768
Record.push_back(VE.getMetadataOrNullID(N->getFile()));
@@ -1779,6 +1786,17 @@ void ModuleBitcodeWriter::writeDICompositeType(
17791786
Record.push_back(VE.getMetadataOrNullID(N->getAnnotations().get()));
17801787
Record.push_back(N->getNumExtraInhabitants());
17811788

1789+
1790+
if (!SpareBitsMask.isZero()) {
1791+
if (IsWideAPInt) {
1792+
Record.push_back(SpareBitsMask.getBitWidth());
1793+
emitWideAPInt(Record, SpareBitsMask);
1794+
} else {
1795+
uint64_t V = SpareBitsMask.getZExtValue();
1796+
Record.push_back(V);
1797+
}
1798+
}
1799+
17821800
Stream.EmitRecord(bitc::METADATA_COMPOSITE_TYPE, Record, Abbrev);
17831801
Record.clear();
17841802
}

llvm/lib/CodeGen/AsmPrinter/DwarfUnit.cpp

Lines changed: 20 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -456,30 +456,31 @@ void DwarfUnit::addConstantFPValue(DIE &Die, const ConstantFP *CFP) {
456456
}
457457

458458
void DwarfUnit::addConstantValue(DIE &Die, const ConstantInt *CI,
459-
const DIType *Ty) {
460-
addConstantValue(Die, CI->getValue(), Ty);
459+
const DIType *Ty, dwarf::Attribute Attribute) {
460+
addConstantValue(Die, CI->getValue(), Ty, Attribute);
461461
}
462462

463-
void DwarfUnit::addConstantValue(DIE &Die, uint64_t Val, const DIType *Ty) {
464-
addConstantValue(Die, DD->isUnsignedDIType(Ty), Val);
463+
void DwarfUnit::addConstantValue(DIE &Die, uint64_t Val, const DIType *Ty, dwarf::Attribute Attribute) {
464+
addConstantValue(Die, DD->isUnsignedDIType(Ty), Val, Attribute);
465465
}
466466

467-
void DwarfUnit::addConstantValue(DIE &Die, bool Unsigned, uint64_t Val) {
467+
void DwarfUnit::addConstantValue(DIE &Die, bool Unsigned, uint64_t Val, dwarf::Attribute Attribute) {
468468
// FIXME: This is a bit conservative/simple - it emits negative values always
469469
// sign extended to 64 bits rather than minimizing the number of bytes.
470-
addUInt(Die, dwarf::DW_AT_const_value,
470+
addUInt(Die, Attribute,
471471
Unsigned ? dwarf::DW_FORM_udata : dwarf::DW_FORM_sdata, Val);
472472
}
473473

474-
void DwarfUnit::addConstantValue(DIE &Die, const APInt &Val, const DIType *Ty) {
475-
addConstantValue(Die, Val, DD->isUnsignedDIType(Ty));
474+
void DwarfUnit::addConstantValue(DIE &Die, const APInt &Val, const DIType *Ty, dwarf::Attribute Attribute) {
475+
addConstantValue(Die, Val, DD->isUnsignedDIType(Ty), Attribute);
476476
}
477477

478-
void DwarfUnit::addConstantValue(DIE &Die, const APInt &Val, bool Unsigned) {
478+
void DwarfUnit::addConstantValue(DIE &Die, const APInt &Val, bool Unsigned, dwarf::Attribute Attribute) {
479479
unsigned CIBitWidth = Val.getBitWidth();
480480
if (CIBitWidth <= 64) {
481481
addConstantValue(Die, Unsigned,
482-
Unsigned ? Val.getZExtValue() : Val.getSExtValue());
482+
Unsigned ? Val.getZExtValue() : Val.getSExtValue(),
483+
Attribute);
483484
return;
484485
}
485486

@@ -501,7 +502,7 @@ void DwarfUnit::addConstantValue(DIE &Die, const APInt &Val, bool Unsigned) {
501502
addUInt(*Block, dwarf::DW_FORM_data1, c);
502503
}
503504

504-
addBlock(Die, dwarf::DW_AT_const_value, Block);
505+
addBlock(Die, Attribute, Block);
505506
}
506507

507508
void DwarfUnit::addLinkageName(DIE &Die, StringRef LinkageName) {
@@ -1065,6 +1066,14 @@ void DwarfUnit::constructTypeDIE(DIE &Buffer, const DICompositeType *CTy) {
10651066
if (uint32_t NumExtraInhabitants = CTy->getNumExtraInhabitants())
10661067
addUInt(Buffer, dwarf::DW_AT_APPLE_num_extra_inhabitants,
10671068
std::nullopt, NumExtraInhabitants);
1069+
1070+
} else if (Tag == dwarf::DW_TAG_variant_part) {
1071+
auto SpareBitsMask = CTy->getSpareBitsMask();
1072+
if (!SpareBitsMask.isZero())
1073+
addConstantValue(Buffer, SpareBitsMask, false,
1074+
dwarf::DW_AT_APPLE_spare_bits_mask);
1075+
if (auto OffsetInBits = CTy->getOffsetInBits())
1076+
addUInt(Buffer, dwarf::DW_AT_bit_offset, std::nullopt, OffsetInBits);
10681077
}
10691078
}
10701079

llvm/lib/CodeGen/AsmPrinter/DwarfUnit.h

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -218,11 +218,16 @@ class DwarfUnit : public DIEUnit {
218218
void addSourceLine(DIE &Die, const DIObjCProperty *Ty);
219219

220220
/// Add constant value entry in variable DIE.
221-
void addConstantValue(DIE &Die, const ConstantInt *CI, const DIType *Ty);
222-
void addConstantValue(DIE &Die, const APInt &Val, const DIType *Ty);
223-
void addConstantValue(DIE &Die, const APInt &Val, bool Unsigned);
224-
void addConstantValue(DIE &Die, uint64_t Val, const DIType *Ty);
225-
void addConstantValue(DIE &Die, bool Unsigned, uint64_t Val);
221+
void addConstantValue(DIE &Die, const ConstantInt *CI, const DIType *Ty,
222+
dwarf::Attribute = dwarf::DW_AT_const_value);
223+
void addConstantValue(DIE &Die, const APInt &Val, const DIType *Ty,
224+
dwarf::Attribute = dwarf::DW_AT_const_value);
225+
void addConstantValue(DIE &Die, const APInt &Val, bool Unsigned,
226+
dwarf::Attribute = dwarf::DW_AT_const_value);
227+
void addConstantValue(DIE &Die, uint64_t Val, const DIType *Ty,
228+
dwarf::Attribute = dwarf::DW_AT_const_value);
229+
void addConstantValue(DIE &Die, bool Unsigned, uint64_t Val,
230+
dwarf::Attribute = dwarf::DW_AT_const_value);
226231

227232
/// Add constant value entry in variable DIE.
228233
void addConstantFPValue(DIE &Die, const ConstantFP *CFP);

llvm/lib/IR/AsmWriter.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2065,6 +2065,8 @@ static void writeDICompositeType(raw_ostream &Out, const DICompositeType *N,
20652065
Printer.printInt("align", N->getAlignInBits());
20662066
Printer.printInt("offset", N->getOffsetInBits());
20672067
Printer.printInt("num_extra_inhabitants", N->getNumExtraInhabitants());
2068+
if (!N->getSpareBitsMask().isZero())
2069+
Printer.printAPInt("spare_bits_mask", N->getSpareBitsMask(), true, false);
20682070
Printer.printDIFlags("flags", N->getFlags());
20692071
Printer.printMetadata("elements", N->getRawElements());
20702072
Printer.printDwarfEnum("runtimeLang", N->getRuntimeLang(),

0 commit comments

Comments
 (0)