Skip to content

Commit f43c0a1

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 d1949cd commit f43c0a1

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
@@ -367,6 +367,22 @@ namespace llvm {
367367
uint32_t VBPtrOffset,
368368
DINode::DIFlags Flags);
369369

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

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

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

llvm/lib/IR/DIBuilder.cpp

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

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

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

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

1304+
TEST(DIBuilder, DynamicOffsetAndSize) {
1305+
LLVMContext Ctx;
1306+
auto M = std::make_unique<Module>("MyModule", Ctx);
1307+
DIBuilder DIB(*M);
1308+
DIScope *Scope = DISubprogram::getDistinct(
1309+
Ctx, nullptr, "", "", nullptr, 0, nullptr, 0, nullptr, 0, 0,
1310+
DINode::FlagZero, DISubprogram::SPFlagZero, nullptr);
1311+
DIFile *F = DIB.createFile("main.adb", "/");
1312+
1313+
DIVariable *Len = DIB.createAutoVariable(Scope, "length", F, 0, nullptr,
1314+
false, DINode::FlagZero, 0);
1315+
1316+
DICompositeType *Struct = DIB.createStructType(
1317+
Scope, "some_record", F, 18, Len, 8, DINode::FlagZero, nullptr, {});
1318+
EXPECT_EQ(Struct->getTag(), dwarf::DW_TAG_structure_type);
1319+
1320+
SmallVector<uint64_t, 4> ops;
1321+
ops.push_back(llvm::dwarf::DW_OP_push_object_address);
1322+
DIExpression::appendOffset(ops, 3);
1323+
ops.push_back(llvm::dwarf::DW_OP_deref);
1324+
DIExpression *Expr = DIB.createExpression(ops);
1325+
1326+
DIDerivedType *Field = DIB.createMemberType(Scope, "field", F, 23, Len, 0,
1327+
Expr, DINode::FlagZero, Struct);
1328+
1329+
EXPECT_EQ(Field->getRawOffsetInBits(), Expr);
1330+
EXPECT_EQ(Field->getRawSizeInBits(), Len);
1331+
}
1332+
13041333
} // end namespace

0 commit comments

Comments
 (0)