Skip to content

Commit c80072c

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 9ed0248 commit c80072c

File tree

3 files changed

+125
-0
lines changed

3 files changed

+125
-0
lines changed

llvm/include/llvm/IR/DIBuilder.h

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -371,6 +371,22 @@ namespace llvm {
371371
uint32_t VBPtrOffset,
372372
DINode::DIFlags Flags);
373373

374+
/// Create debugging information entry for a member.
375+
/// \param Scope Member scope.
376+
/// \param Name Member name.
377+
/// \param File File where this member is defined.
378+
/// \param LineNo Line number.
379+
/// \param SizeInBits Member size.
380+
/// \param AlignInBits Member alignment.
381+
/// \param OffsetInBits Member offset.
382+
/// \param Flags Flags to encode member attribute, e.g. private
383+
/// \param Ty Parent type.
384+
/// \param Annotations Member annotations.
385+
LLVM_ABI DIDerivedType *createMemberType(
386+
DIScope *Scope, StringRef Name, DIFile *File, unsigned LineNo,
387+
Metadata *SizeInBits, uint32_t AlignInBits, Metadata *OffsetInBits,
388+
DINode::DIFlags Flags, DIType *Ty, DINodeArray Annotations = nullptr);
389+
374390
/// Create debugging information entry for a member.
375391
/// \param Scope Member scope.
376392
/// \param Name Member name.
@@ -423,6 +439,23 @@ namespace llvm {
423439
Constant *Discriminant,
424440
DIType *Ty);
425441

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

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+
LLVM_ABI 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+
517573
/// Create debugging information entry for a struct.
518574
/// \param Scope Scope in which this struct is defined.
519575
/// \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);
@@ -462,6 +472,20 @@ DIDerivedType *DIBuilder::createVariantMemberType(DIScope *Scope,
462472
DINode::FlagZero, V);
463473
}
464474

475+
DIDerivedType *DIBuilder::createBitFieldMemberType(
476+
DIScope *Scope, StringRef Name, DIFile *File, unsigned LineNumber,
477+
Metadata *SizeInBits, Metadata *OffsetInBits, uint64_t StorageOffsetInBits,
478+
DINode::DIFlags Flags, DIType *Ty, DINodeArray Annotations) {
479+
Flags |= DINode::FlagBitField;
480+
return DIDerivedType::get(
481+
VMContext, dwarf::DW_TAG_member, Name, File, LineNumber,
482+
getNonCompileUnitScope(Scope), Ty, SizeInBits, /*AlignInBits=*/0,
483+
OffsetInBits, std::nullopt, std::nullopt, Flags,
484+
ConstantAsMetadata::get(ConstantInt::get(IntegerType::get(VMContext, 64),
485+
StorageOffsetInBits)),
486+
Annotations);
487+
}
488+
465489
DIDerivedType *DIBuilder::createBitFieldMemberType(
466490
DIScope *Scope, StringRef Name, DIFile *File, unsigned LineNumber,
467491
uint64_t SizeInBits, uint64_t OffsetInBits, uint64_t StorageOffsetInBits,
@@ -566,6 +590,22 @@ DICompositeType *DIBuilder::createClassType(
566590
return R;
567591
}
568592

593+
DICompositeType *DIBuilder::createStructType(
594+
DIScope *Context, StringRef Name, DIFile *File, unsigned LineNumber,
595+
Metadata *SizeInBits, uint32_t AlignInBits, DINode::DIFlags Flags,
596+
DIType *DerivedFrom, DINodeArray Elements, unsigned RunTimeLang,
597+
DIType *VTableHolder, StringRef UniqueIdentifier, DIType *Specification,
598+
uint32_t NumExtraInhabitants) {
599+
auto *R = DICompositeType::get(
600+
VMContext, dwarf::DW_TAG_structure_type, Name, File, LineNumber,
601+
getNonCompileUnitScope(Context), DerivedFrom, SizeInBits, AlignInBits, 0,
602+
Flags, Elements, RunTimeLang, /*EnumKind=*/std::nullopt, VTableHolder,
603+
nullptr, UniqueIdentifier, nullptr, nullptr, nullptr, nullptr, nullptr,
604+
nullptr, Specification, NumExtraInhabitants);
605+
trackIfUnresolved(R);
606+
return R;
607+
}
608+
569609
DICompositeType *DIBuilder::createStructType(
570610
DIScope *Context, StringRef Name, DIFile *File, unsigned LineNumber,
571611
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
@@ -1337,4 +1337,33 @@ TEST(DIBuilder, CompositeTypes) {
13371337
EXPECT_EQ(Enum->getTag(), dwarf::DW_TAG_enumeration_type);
13381338
}
13391339

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

0 commit comments

Comments
 (0)