Skip to content

Commit 2698846

Browse files
committed
Expose dynamic sizes and offsets via DIBuilder
This adds some new DIBuilder methods to expose the new dynamic size and offset functionality.
1 parent 38f62ae commit 2698846

File tree

3 files changed

+129
-0
lines changed

3 files changed

+129
-0
lines changed

llvm/include/llvm/IR/DIBuilder.h

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -365,6 +365,24 @@ namespace llvm {
365365
uint64_t BaseOffset, uint32_t VBPtrOffset,
366366
DINode::DIFlags Flags);
367367

368+
/// Create debugging information entry for a member.
369+
/// \param Scope Member scope.
370+
/// \param Name Member name.
371+
/// \param File File where this member is defined.
372+
/// \param LineNo Line number.
373+
/// \param SizeInBits Member size.
374+
/// \param AlignInBits Member alignment.
375+
/// \param OffsetInBits Member offset.
376+
/// \param Flags Flags to encode member attribute, e.g. private
377+
/// \param Ty Parent type.
378+
/// \param Annotations Member annotations.
379+
DIDerivedType *createMemberType(DIScope *Scope, StringRef Name,
380+
DIFile *File, unsigned LineNo,
381+
Metadata *SizeInBits, uint32_t AlignInBits,
382+
Metadata *OffsetInBits,
383+
DINode::DIFlags Flags, DIType *Ty,
384+
DINodeArray Annotations = nullptr);
385+
368386
/// Create debugging information entry for a member.
369387
/// \param Scope Member scope.
370388
/// \param Name Member name.
@@ -419,6 +437,25 @@ namespace llvm {
419437
DIDerivedType *createVariantMemberType(DIScope *Scope, DINodeArray Elements,
420438
Constant *Discriminant, DIType *Ty);
421439

440+
/// Create debugging information entry for a bit field member.
441+
/// \param Scope Member scope.
442+
/// \param Name Member name.
443+
/// \param File File where this member is defined.
444+
/// \param LineNo Line number.
445+
/// \param SizeInBits Member size.
446+
/// \param OffsetInBits Member offset.
447+
/// \param StorageOffsetInBits Member storage offset.
448+
/// \param Flags Flags to encode member attribute.
449+
/// \param Ty Parent type.
450+
/// \param Annotations Member annotations.
451+
DIDerivedType *createBitFieldMemberType(DIScope *Scope, StringRef Name,
452+
DIFile *File, unsigned LineNo,
453+
Metadata *SizeInBits,
454+
Metadata *OffsetInBits,
455+
uint64_t StorageOffsetInBits,
456+
DINode::DIFlags Flags, DIType *Ty,
457+
DINodeArray Annotations = nullptr);
458+
422459
/// Create debugging information entry for a bit field member.
423460
/// \param Scope Member scope.
424461
/// \param Name Member name.
@@ -510,6 +547,29 @@ namespace llvm {
510547
unsigned RunTimeLang = 0, DIType *VTableHolder = nullptr,
511548
MDNode *TemplateParms = nullptr, StringRef UniqueIdentifier = "");
512549

550+
/// Create debugging information entry for a struct.
551+
/// \param Scope Scope in which this struct is defined.
552+
/// \param Name Struct name.
553+
/// \param File File where this member is defined.
554+
/// \param LineNumber Line number.
555+
/// \param SizeInBits Member size.
556+
/// \param AlignInBits Member alignment.
557+
/// \param Flags Flags to encode member attribute, e.g. private
558+
/// \param Elements Struct elements.
559+
/// \param RunTimeLang Optional parameter, Objective-C runtime version.
560+
/// \param UniqueIdentifier A unique identifier for the struct.
561+
/// \param Specification The type that this type completes. This is used by
562+
/// Swift to represent generic types.
563+
/// \param NumExtraInhabitants The number of extra inhabitants of the type.
564+
/// An extra inhabitant is a bit pattern that does not represent a valid
565+
/// value for instances of a given type. This is used by the Swift language.
566+
DICompositeType *createStructType(
567+
DIScope *Scope, StringRef Name, DIFile *File, unsigned LineNumber,
568+
Metadata *SizeInBits, uint32_t AlignInBits, DINode::DIFlags Flags,
569+
DIType *DerivedFrom, DINodeArray Elements, unsigned RunTimeLang = 0,
570+
DIType *VTableHolder = nullptr, StringRef UniqueIdentifier = "",
571+
DIType *Specification = nullptr, uint32_t NumExtraInhabitants = 0);
572+
513573
/// Create debugging information entry for a struct.
514574
/// \param Scope Scope in which this struct is defined.
515575
/// \param Name Struct name.

llvm/lib/IR/DIBuilder.cpp

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -429,6 +429,16 @@ DIDerivedType *DIBuilder::createMemberType(
429429
std::nullopt, Flags, nullptr, Annotations);
430430
}
431431

432+
DIDerivedType *DIBuilder::createMemberType(
433+
DIScope *Scope, StringRef Name, DIFile *File, unsigned LineNumber,
434+
Metadata *SizeInBits, uint32_t AlignInBits, Metadata *OffsetInBits,
435+
DINode::DIFlags Flags, DIType *Ty, DINodeArray Annotations) {
436+
return DIDerivedType::get(VMContext, dwarf::DW_TAG_member, Name, File,
437+
LineNumber, getNonCompileUnitScope(Scope), Ty,
438+
SizeInBits, AlignInBits, OffsetInBits, std::nullopt,
439+
std::nullopt, Flags, nullptr, Annotations);
440+
}
441+
432442
static ConstantAsMetadata *getConstantOrNull(Constant *C) {
433443
if (C)
434444
return ConstantAsMetadata::get(C);
@@ -459,6 +469,20 @@ DIDerivedType *DIBuilder::createVariantMemberType(DIScope *Scope,
459469
DINode::FlagZero, V);
460470
}
461471

472+
DIDerivedType *DIBuilder::createBitFieldMemberType(
473+
DIScope *Scope, StringRef Name, DIFile *File, unsigned LineNumber,
474+
Metadata *SizeInBits, Metadata *OffsetInBits, uint64_t StorageOffsetInBits,
475+
DINode::DIFlags Flags, DIType *Ty, DINodeArray Annotations) {
476+
Flags |= DINode::FlagBitField;
477+
return DIDerivedType::get(
478+
VMContext, dwarf::DW_TAG_member, Name, File, LineNumber,
479+
getNonCompileUnitScope(Scope), Ty, SizeInBits, /*AlignInBits=*/0,
480+
OffsetInBits, std::nullopt, std::nullopt, Flags,
481+
ConstantAsMetadata::get(ConstantInt::get(IntegerType::get(VMContext, 64),
482+
StorageOffsetInBits)),
483+
Annotations);
484+
}
485+
462486
DIDerivedType *DIBuilder::createBitFieldMemberType(
463487
DIScope *Scope, StringRef Name, DIFile *File, unsigned LineNumber,
464488
uint64_t SizeInBits, uint64_t OffsetInBits, uint64_t StorageOffsetInBits,
@@ -563,6 +587,22 @@ DICompositeType *DIBuilder::createClassType(
563587
return R;
564588
}
565589

590+
DICompositeType *DIBuilder::createStructType(
591+
DIScope *Context, StringRef Name, DIFile *File, unsigned LineNumber,
592+
Metadata *SizeInBits, uint32_t AlignInBits, DINode::DIFlags Flags,
593+
DIType *DerivedFrom, DINodeArray Elements, unsigned RunTimeLang,
594+
DIType *VTableHolder, StringRef UniqueIdentifier, DIType *Specification,
595+
uint32_t NumExtraInhabitants) {
596+
auto *R = DICompositeType::get(
597+
VMContext, dwarf::DW_TAG_structure_type, Name, File, LineNumber,
598+
getNonCompileUnitScope(Context), DerivedFrom, SizeInBits, AlignInBits, 0,
599+
Flags, Elements, RunTimeLang, /*EnumKind=*/std::nullopt, VTableHolder,
600+
nullptr, UniqueIdentifier, nullptr, nullptr, nullptr, nullptr, nullptr,
601+
nullptr, Specification, NumExtraInhabitants);
602+
trackIfUnresolved(R);
603+
return R;
604+
}
605+
566606
DICompositeType *DIBuilder::createStructType(
567607
DIScope *Context, StringRef Name, DIFile *File, unsigned LineNumber,
568608
uint64_t SizeInBits, uint32_t AlignInBits, DINode::DIFlags Flags,

llvm/unittests/IR/DebugInfoTest.cpp

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1336,4 +1336,33 @@ TEST(DIBuilder, CompositeTypes) {
13361336
EXPECT_EQ(Enum->getTag(), dwarf::DW_TAG_enumeration_type);
13371337
}
13381338

1339+
TEST(DIBuilder, DynamicOffsetAndSize) {
1340+
LLVMContext Ctx;
1341+
std::unique_ptr<Module> M(new Module("MyModule", Ctx));
1342+
DIBuilder DIB(*M);
1343+
DIScope *Scope = DISubprogram::getDistinct(
1344+
Ctx, nullptr, "", "", nullptr, 0, nullptr, 0, nullptr, 0, 0,
1345+
DINode::FlagZero, DISubprogram::SPFlagZero, nullptr);
1346+
DIFile *F = DIB.createFile("main.adb", "/");
1347+
1348+
DIVariable *Len = DIB.createAutoVariable(Scope, "length", F, 0, nullptr,
1349+
false, DINode::FlagZero, 0);
1350+
1351+
DICompositeType *Struct = DIB.createStructType(
1352+
Scope, "some_record", F, 18, Len, 8, DINode::FlagZero, nullptr, {});
1353+
EXPECT_EQ(Struct->getTag(), dwarf::DW_TAG_structure_type);
1354+
1355+
SmallVector<uint64_t, 4> ops;
1356+
ops.push_back(llvm::dwarf::DW_OP_push_object_address);
1357+
DIExpression::appendOffset(ops, 3);
1358+
ops.push_back(llvm::dwarf::DW_OP_deref);
1359+
DIExpression *Expr = DIB.createExpression(ops);
1360+
1361+
DIDerivedType *Field = DIB.createMemberType(Scope, "field", F, 23, Len, 0,
1362+
Expr, DINode::FlagZero, Struct);
1363+
1364+
EXPECT_EQ(Field->getRawOffsetInBits(), Expr);
1365+
EXPECT_EQ(Field->getRawSizeInBits(), Len);
1366+
}
1367+
13391368
} // end namespace

0 commit comments

Comments
 (0)