Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion llvm/include/llvm/IR/DebugInfo.h
Original file line number Diff line number Diff line change
Expand Up @@ -110,7 +110,7 @@ class DebugInfoFinder {
void processInstruction(const Module &M, const Instruction &I);

/// Process a DILocalVariable.
void processVariable(const Module &M, const DILocalVariable *DVI);
void processVariable(DILocalVariable *DVI);
/// Process debug info location.
void processLocation(const Module &M, const DILocation *Loc);
/// Process a DbgRecord (e.g, treat a DbgVariableRecord like a
Expand All @@ -127,6 +127,7 @@ class DebugInfoFinder {
void processCompileUnit(DICompileUnit *CU);
void processScope(DIScope *Scope);
void processType(DIType *DT);
void processImportedEntity(DIImportedEntity *Import);
bool addCompileUnit(DICompileUnit *CU);
bool addGlobalVariable(DIGlobalVariableExpression *DIG);
bool addScope(DIScope *Scope);
Expand Down
35 changes: 22 additions & 13 deletions llvm/lib/IR/DebugInfo.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -242,22 +242,14 @@ void DebugInfoFinder::processCompileUnit(DICompileUnit *CU) {
else
processSubprogram(cast<DISubprogram>(RT));
for (auto *Import : CU->getImportedEntities()) {
auto *Entity = Import->getEntity();
if (auto *T = dyn_cast<DIType>(Entity))
processType(T);
else if (auto *SP = dyn_cast<DISubprogram>(Entity))
processSubprogram(SP);
else if (auto *NS = dyn_cast<DINamespace>(Entity))
processScope(NS->getScope());
else if (auto *M = dyn_cast<DIModule>(Entity))
processScope(M->getScope());
processImportedEntity(Import);
}
}

void DebugInfoFinder::processInstruction(const Module &M,
const Instruction &I) {
if (auto *DVI = dyn_cast<DbgVariableIntrinsic>(&I))
processVariable(M, DVI->getVariable());
processVariable(DVI->getVariable());

if (auto DbgLoc = I.getDebugLoc())
processLocation(M, DbgLoc.get());
Expand All @@ -275,7 +267,7 @@ void DebugInfoFinder::processLocation(const Module &M, const DILocation *Loc) {

void DebugInfoFinder::processDbgRecord(const Module &M, const DbgRecord &DR) {
if (const DbgVariableRecord *DVR = dyn_cast<const DbgVariableRecord>(&DR))
processVariable(M, DVR->getVariable());
processVariable(DVR->getVariable());
processLocation(M, DR.getDebugLoc().get());
}

Expand Down Expand Up @@ -303,6 +295,18 @@ void DebugInfoFinder::processType(DIType *DT) {
}
}

void DebugInfoFinder::processImportedEntity(DIImportedEntity *Import) {
auto *Entity = Import->getEntity();
if (auto *T = dyn_cast<DIType>(Entity))
processType(T);
else if (auto *SP = dyn_cast<DISubprogram>(Entity))
processSubprogram(SP);
else if (auto *NS = dyn_cast<DINamespace>(Entity))
processScope(NS->getScope());
else if (auto *M = dyn_cast<DIModule>(Entity))
processScope(M->getScope());
}

void DebugInfoFinder::processScope(DIScope *Scope) {
if (!Scope)
return;
Expand Down Expand Up @@ -350,10 +354,15 @@ void DebugInfoFinder::processSubprogram(DISubprogram *SP) {
processType(TVal->getType());
}
}

for (auto *N : SP->getRetainedNodes())
if (auto *Var = dyn_cast_or_null<DILocalVariable>(N))
processVariable(Var);
else if (auto *Import = dyn_cast_or_null<DIImportedEntity>(N))
processImportedEntity(Import);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Requesting braces for the for block here.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed.

}

void DebugInfoFinder::processVariable(const Module &M,
const DILocalVariable *DV) {
void DebugInfoFinder::processVariable(DILocalVariable *DV) {
if (!NodesSeen.insert(DV).second)
return;
processScope(DV->getScope());
Expand Down
38 changes: 38 additions & 0 deletions llvm/test/DebugInfo/Generic/debuginfofinder-retained-nodes.ll
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
; RUN: opt -passes='print<module-debuginfo>' -disable-output 2>&1 < %s \
; RUN: | FileCheck %s

; This is to track DebugInfoFinder's ability to find the debug info metadata,
; in particular, properly visit DISubprogram's retainedNodes.

; CHECK: Compile unit: DW_LANG_C_plus_plus from /somewhere/source.cpp
; CHECK: Subprogram: foo from /somewhere/source.cpp:1 ('_Z3foov')
; CHECK: Subprogram: bar from /somewhere/source.cpp:5
; CHECK: Type: T from /somewhere/source.cpp:2 DW_TAG_structure_type

%struct.T = type { i32 }

; Function Attrs: mustprogress noinline nounwind optnone ssp uwtable(sync)
define noundef i32 @_Z3foov() !dbg !7 {
entry:
ret i32 0
}

!llvm.dbg.cu = !{!0}
!llvm.module.flags = !{!2, !3, !4, !5}
!llvm.ident = !{!6}

!0 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus, file: !1, producer: "clang version 21.0.0git", isOptimized: false, runtimeVersion: 0, emissionKind: FullDebug)
!1 = !DIFile(filename: "source.cpp", directory: "/somewhere")
!2 = !{i32 7, !"Dwarf Version", i32 5}
!3 = !{i32 2, !"Debug Info Version", i32 3}
!4 = !{i32 1, !"wchar_size", i32 4}
!5 = !{i32 8, !"PIC Level", i32 2}
!6 = !{!"clang version 21.0.0git"}
!7 = distinct !DISubprogram(name: "foo", linkageName: "_Z3foov", scope: !1, file: !1, line: 1, scopeLine: 1, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !8)
!8 = !{!9}
!9 = !DILocalVariable(name: "v", scope: !7, file: !1, line: 8, type: !10)
!10 = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "T", scope: !7, file: !1, line: 2, size: 32, flags: DIFlagTypePassByValue, elements: !11)
!11 = !{!12, !14}
!12 = !DIDerivedType(tag: DW_TAG_member, name: "x", scope: !10, file: !1, line: 3, baseType: !13, size: 32)
!13 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed)
!14 = !DISubprogram(name: "bar", scope: !10, file: !1, line: 5, scopeLine: 5, flags: DIFlagPrototyped | DIFlagStaticMember, spFlags: DISPFlagLocalToUnit)