[DebugInfo] Add Verifier check for incorrectly-scoped retainedNodes (#166855)
These checks ensure that retained nodes of a DISubprogram belong to the subprogram. Tests with incorrect IR are fixed. We should not have variables of one subprogram present in retained nodes of other subprograms. Also, interface for accessing DISubprogram's retained nodes is slightly refactored. `DISubprogram::visitRetainedNodes` and `DISubprogram::forEachRetainedNode` are added to avoid repeating checks like ``` if (const auto *LV = dyn_cast<DILocalVariable>(N)) ... else if (const auto *L = dyn_cast<DILabel>(N)) ... else if (const auto *IE = dyn_cast<DIImportedEntity>(N)) ... ```
This commit is contained in:
parent
bfd4155f23
commit
e2a2c03eef
@ -108,7 +108,7 @@ public:
|
||||
LLVM_ABI void processInstruction(const Module &M, const Instruction &I);
|
||||
|
||||
/// Process a DILocalVariable.
|
||||
LLVM_ABI void processVariable(DILocalVariable *DVI);
|
||||
LLVM_ABI void processVariable(const DILocalVariable *DVI);
|
||||
/// Process debug info location.
|
||||
LLVM_ABI void processLocation(const Module &M, const DILocation *Loc);
|
||||
/// Process a DbgRecord.
|
||||
@ -124,7 +124,7 @@ private:
|
||||
void processCompileUnit(DICompileUnit *CU);
|
||||
void processScope(DIScope *Scope);
|
||||
void processType(DIType *DT);
|
||||
void processImportedEntity(DIImportedEntity *Import);
|
||||
void processImportedEntity(const DIImportedEntity *Import);
|
||||
bool addCompileUnit(DICompileUnit *CU);
|
||||
bool addGlobalVariable(DIGlobalVariableExpression *DIG);
|
||||
bool addScope(DIScope *Scope);
|
||||
|
||||
@ -2554,6 +2554,39 @@ public:
|
||||
replaceOperandWith(7, N.get());
|
||||
}
|
||||
|
||||
/// For the given retained node of DISubprogram, applies one of the
|
||||
/// given functions depending on the type of the node.
|
||||
template <typename T, typename FuncLVT, typename FuncLabelT,
|
||||
typename FuncImportedEntityT, typename FuncUnknownT>
|
||||
static T
|
||||
visitRetainedNode(const Metadata *N, FuncLVT &&FuncLV, FuncLabelT &&FuncLabel,
|
||||
FuncImportedEntityT &&FuncIE, FuncUnknownT &&FuncUnknown) {
|
||||
if (const auto *LV = dyn_cast<DILocalVariable>(N))
|
||||
return FuncLV(LV);
|
||||
if (const auto *L = dyn_cast<DILabel>(N))
|
||||
return FuncLabel(L);
|
||||
if (const auto *IE = dyn_cast<DIImportedEntity>(N))
|
||||
return FuncIE(IE);
|
||||
return FuncUnknown(N);
|
||||
}
|
||||
|
||||
/// Returns the scope of subprogram's retainedNodes.
|
||||
static const DILocalScope *getRetainedNodeScope(const MDNode *N);
|
||||
// For use in Verifier.
|
||||
static const DIScope *getRawRetainedNodeScope(const MDNode *N);
|
||||
|
||||
/// For each retained node, applies one of the given functions depending
|
||||
/// on the type of a node.
|
||||
template <typename FuncLVT, typename FuncLabelT, typename FuncImportedEntityT>
|
||||
void forEachRetainedNode(FuncLVT &&FuncLV, FuncLabelT &&FuncLabel,
|
||||
FuncImportedEntityT &&FuncIE) const {
|
||||
for (MDNode *N : getRetainedNodes())
|
||||
visitRetainedNode<void>(N, FuncLV, FuncLabel, FuncIE,
|
||||
[](const Metadata *N) {
|
||||
llvm_unreachable("Unexpected retained node!");
|
||||
});
|
||||
}
|
||||
|
||||
/// Check if this subprogram describes the given function.
|
||||
///
|
||||
/// FIXME: Should this be looking through bitcasts?
|
||||
|
||||
@ -1544,18 +1544,8 @@ void DwarfDebug::ensureAbstractEntityIsCreatedIfScoped(DwarfCompileUnit &CU,
|
||||
}
|
||||
|
||||
static const DILocalScope *getRetainedNodeScope(const MDNode *N) {
|
||||
const DIScope *S;
|
||||
if (const auto *LV = dyn_cast<DILocalVariable>(N))
|
||||
S = LV->getScope();
|
||||
else if (const auto *L = dyn_cast<DILabel>(N))
|
||||
S = L->getScope();
|
||||
else if (const auto *IE = dyn_cast<DIImportedEntity>(N))
|
||||
S = IE->getScope();
|
||||
else
|
||||
llvm_unreachable("Unexpected retained node!");
|
||||
|
||||
// Ensure the scope is not a DILexicalBlockFile.
|
||||
return cast<DILocalScope>(S)->getNonLexicalBlockFileScope();
|
||||
return DISubprogram::getRetainedNodeScope(N)->getNonLexicalBlockFileScope();
|
||||
}
|
||||
|
||||
// Collect variable information from side table maintained by MF.
|
||||
|
||||
@ -247,7 +247,7 @@ void DebugInfoFinder::processType(DIType *DT) {
|
||||
}
|
||||
}
|
||||
|
||||
void DebugInfoFinder::processImportedEntity(DIImportedEntity *Import) {
|
||||
void DebugInfoFinder::processImportedEntity(const DIImportedEntity *Import) {
|
||||
auto *Entity = Import->getEntity();
|
||||
if (auto *T = dyn_cast<DIType>(Entity))
|
||||
processType(T);
|
||||
@ -307,15 +307,13 @@ void DebugInfoFinder::processSubprogram(DISubprogram *SP) {
|
||||
}
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
SP->forEachRetainedNode(
|
||||
[this](const DILocalVariable *LV) { processVariable(LV); },
|
||||
[](const DILabel *L) {},
|
||||
[this](const DIImportedEntity *IE) { processImportedEntity(IE); });
|
||||
}
|
||||
|
||||
void DebugInfoFinder::processVariable(DILocalVariable *DV) {
|
||||
void DebugInfoFinder::processVariable(const DILocalVariable *DV) {
|
||||
if (!NodesSeen.insert(DV).second)
|
||||
return;
|
||||
processScope(DV->getScope());
|
||||
|
||||
@ -1441,6 +1441,19 @@ bool DISubprogram::describes(const Function *F) const {
|
||||
assert(F && "Invalid function");
|
||||
return F->getSubprogram() == this;
|
||||
}
|
||||
|
||||
const DIScope *DISubprogram::getRawRetainedNodeScope(const MDNode *N) {
|
||||
return visitRetainedNode<DIScope *>(
|
||||
N, [](const DILocalVariable *LV) { return LV->getScope(); },
|
||||
[](const DILabel *L) { return L->getScope(); },
|
||||
[](const DIImportedEntity *IE) { return IE->getScope(); },
|
||||
[](const Metadata *N) { return nullptr; });
|
||||
}
|
||||
|
||||
const DILocalScope *DISubprogram::getRetainedNodeScope(const MDNode *N) {
|
||||
return cast<DILocalScope>(getRawRetainedNodeScope(N));
|
||||
}
|
||||
|
||||
DILexicalBlockBase::DILexicalBlockBase(LLVMContext &C, unsigned ID,
|
||||
StorageType Storage,
|
||||
ArrayRef<Metadata *> Ops)
|
||||
|
||||
@ -1559,11 +1559,27 @@ void Verifier::visitDISubprogram(const DISubprogram &N) {
|
||||
auto *Node = dyn_cast<MDTuple>(RawNode);
|
||||
CheckDI(Node, "invalid retained nodes list", &N, RawNode);
|
||||
for (Metadata *Op : Node->operands()) {
|
||||
CheckDI(Op && (isa<DILocalVariable>(Op) || isa<DILabel>(Op) ||
|
||||
isa<DIImportedEntity>(Op)),
|
||||
CheckDI(Op, "nullptr in retained nodes", &N, Node);
|
||||
|
||||
auto True = [](const Metadata *) { return true; };
|
||||
auto False = [](const Metadata *) { return false; };
|
||||
bool IsTypeCorrect =
|
||||
DISubprogram::visitRetainedNode<bool>(Op, True, True, True, False);
|
||||
CheckDI(IsTypeCorrect,
|
||||
"invalid retained nodes, expected DILocalVariable, DILabel or "
|
||||
"DIImportedEntity",
|
||||
&N, Node, Op);
|
||||
|
||||
auto *RetainedNode = cast<DINode>(Op);
|
||||
auto *RetainedNodeScope = dyn_cast_or_null<DILocalScope>(
|
||||
DISubprogram::getRawRetainedNodeScope(RetainedNode));
|
||||
CheckDI(RetainedNodeScope,
|
||||
"invalid retained nodes, retained node is not local", &N, Node,
|
||||
RetainedNode);
|
||||
CheckDI(
|
||||
RetainedNodeScope->getSubprogram() == &N,
|
||||
"invalid retained nodes, retained node does not belong to subprogram",
|
||||
&N, Node, RetainedNode, RetainedNodeScope);
|
||||
}
|
||||
}
|
||||
CheckDI(!hasConflictingReferenceFlags(N.getFlags()),
|
||||
|
||||
@ -55,7 +55,7 @@
|
||||
!9 = !DILocalVariable(name: "4", scope: !5, file: !1, line: 4, type: !10)
|
||||
!10 = !DIBasicType(name: "ty64", size: 64, encoding: DW_ATE_unsigned)
|
||||
!11 = !DILocation(line: 4, column: 1, scope: !5)
|
||||
!12 = distinct !DISubprogram(name: "test_2", linkageName: "test_2", scope: null, file: !1, line: 1, type: !6, scopeLine: 1, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !0, retainedNodes: !8)
|
||||
!12 = distinct !DISubprogram(name: "test_2", linkageName: "test_2", scope: null, file: !1, line: 1, type: !6, scopeLine: 1, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !0, retainedNodes: !7)
|
||||
|
||||
...
|
||||
---
|
||||
|
||||
@ -85,10 +85,11 @@
|
||||
!15 = !DISubrange(count: 3)
|
||||
!16 = !DILocation(line: 8, scope: !8)
|
||||
!17 = !DILocation(line: 9, scope: !8)
|
||||
!18 = distinct !DISubprogram(name: "test2", scope: !2, file: !2, line: 7, type: !9, scopeLine: 7, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !1, retainedNodes: !11)
|
||||
!18 = distinct !DISubprogram(name: "test2", scope: !2, file: !2, line: 7, type: !9, scopeLine: 7, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !1, retainedNodes: !22)
|
||||
!19 = !DILocalVariable(name: "local", scope: !18, file: !2, line: 8, type: !13)
|
||||
!20 = !DILocation(line: 15, scope: !18)
|
||||
!21 = !DILocation(line: 16, scope: !18)
|
||||
!22 = !{!19}
|
||||
|
||||
...
|
||||
---
|
||||
|
||||
@ -73,13 +73,14 @@
|
||||
!0 = !{i32 2, !"Debug Info Version", i32 3}
|
||||
!1 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus, file: !2, producer: "beards", isOptimized: true, runtimeVersion: 4, emissionKind: FullDebug)
|
||||
!2 = !DIFile(filename: "bees.cpp", directory: "")
|
||||
!3 = distinct !DISubprogram(name: "nope", scope: !1, file: !2, line: 1, spFlags: DISPFlagDefinition, unit: !1, retainedNodes: !8)
|
||||
!33 = distinct !DISubprogram(name: "alsonope", scope: !1, file: !2, line: 1, spFlags: DISPFlagDefinition, unit: !1, retainedNodes: !8)
|
||||
!3 = distinct !DISubprogram(name: "nope", scope: !1, file: !2, line: 1, spFlags: DISPFlagDefinition, unit: !1, retainedNodes: !9)
|
||||
!33 = distinct !DISubprogram(name: "alsonope", scope: !1, file: !2, line: 1, spFlags: DISPFlagDefinition, unit: !1, retainedNodes: !9)
|
||||
!4 = !DILocalVariable(name: "bees", scope: !3, type: !5)
|
||||
!5 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !6, size: 64)
|
||||
!6 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed)
|
||||
!7 = !DILocation(line: 0, scope: !3)
|
||||
!8 = !{!4}
|
||||
!9 = !{}
|
||||
|
||||
|
||||
; CHECK: ![[METAVAR:[0-9]+]] = !DILocalVariable(name: "bees",
|
||||
|
||||
@ -139,15 +139,15 @@
|
||||
!23 = !DISubprogram(name: "bar", scope: !1, file: !1, line: 1, type: !24, flags: DIFlagPrototyped, spFlags: DISPFlagOptimized, retainedNodes: !2)
|
||||
!24 = !DISubroutineType(types: !25)
|
||||
!25 = !{null, !11}
|
||||
!26 = distinct !DISubprogram(name: "foo2", scope: !1, file: !1, line: 4, type: !9, scopeLine: 4, flags: DIFlagPrototyped | DIFlagAllCallsDescribed, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !0, retainedNodes: !12)
|
||||
!26 = distinct !DISubprogram(name: "foo2", scope: !1, file: !1, line: 4, type: !9, scopeLine: 4, flags: DIFlagPrototyped | DIFlagAllCallsDescribed, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !0, retainedNodes: !2)
|
||||
!27 = !DILocation(line: 0, scope: !26)
|
||||
!28 = distinct !DISubprogram(name: "foo3", scope: !1, file: !1, line: 4, type: !9, scopeLine: 4, flags: DIFlagPrototyped | DIFlagAllCallsDescribed, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !0, retainedNodes: !12)
|
||||
!28 = distinct !DISubprogram(name: "foo3", scope: !1, file: !1, line: 4, type: !9, scopeLine: 4, flags: DIFlagPrototyped | DIFlagAllCallsDescribed, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !0, retainedNodes: !2)
|
||||
!29 = !DILocation(line: 0, scope: !28)
|
||||
!30 = distinct !DISubprogram(name: "foo4", scope: !1, file: !1, line: 4, type: !9, scopeLine: 4, flags: DIFlagPrototyped | DIFlagAllCallsDescribed, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !0, retainedNodes: !12)
|
||||
!30 = distinct !DISubprogram(name: "foo4", scope: !1, file: !1, line: 4, type: !9, scopeLine: 4, flags: DIFlagPrototyped | DIFlagAllCallsDescribed, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !0, retainedNodes: !2)
|
||||
!31 = !DILocation(line: 0, scope: !30)
|
||||
!32 = distinct !DISubprogram(name: "foo5", scope: !1, file: !1, line: 4, type: !9, scopeLine: 4, flags: DIFlagPrototyped | DIFlagAllCallsDescribed, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !0, retainedNodes: !12)
|
||||
!32 = distinct !DISubprogram(name: "foo5", scope: !1, file: !1, line: 4, type: !9, scopeLine: 4, flags: DIFlagPrototyped | DIFlagAllCallsDescribed, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !0, retainedNodes: !2)
|
||||
!33 = !DILocation(line: 0, scope: !32)
|
||||
!34 = distinct !DISubprogram(name: "foo6", scope: !1, file: !1, line: 4, type: !9, scopeLine: 4, flags: DIFlagPrototyped | DIFlagAllCallsDescribed, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !0, retainedNodes: !12)
|
||||
!34 = distinct !DISubprogram(name: "foo6", scope: !1, file: !1, line: 4, type: !9, scopeLine: 4, flags: DIFlagPrototyped | DIFlagAllCallsDescribed, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !0, retainedNodes: !2)
|
||||
!35 = !DILocation(line: 0, scope: !34)
|
||||
|
||||
...
|
||||
|
||||
@ -281,15 +281,19 @@ lala:
|
||||
!11 = !{!13}
|
||||
!13 = !DILocalVariable(name: "baz", scope: !7, file: !1, line: 6, type: !10)
|
||||
!14 = !DILocation(line: 1, scope: !7)
|
||||
!20 = distinct !DISubprogram(name: "bar", scope: !1, file: !1, line: 5, type: !8, scopeLine: 5, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !0, retainedNodes: !11)
|
||||
!20 = distinct !DISubprogram(name: "bar", scope: !1, file: !1, line: 5, type: !8, scopeLine: 5, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !0, retainedNodes: !23)
|
||||
!21 = !DILocalVariable(name: "xyzzy", scope: !20, file: !1, line: 6, type: !10)
|
||||
!22 = !DILocation(line: 1, scope: !20)
|
||||
!30 = distinct !DISubprogram(name: "bar", scope: !1, file: !1, line: 5, type: !8, scopeLine: 5, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !0, retainedNodes: !11)
|
||||
!23 = !{!21}
|
||||
!30 = distinct !DISubprogram(name: "bar", scope: !1, file: !1, line: 5, type: !8, scopeLine: 5, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !0, retainedNodes: !33)
|
||||
!31 = !DILocalVariable(name: "xyzzy", scope: !30, file: !1, line: 6, type: !10)
|
||||
!32 = !DILocation(line: 1, scope: !30)
|
||||
!40 = distinct !DISubprogram(name: "qux", scope: !1, file: !1, line: 5, type: !8, scopeLine: 5, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !0, retainedNodes: !11)
|
||||
!33 = !{!31}
|
||||
!40 = distinct !DISubprogram(name: "qux", scope: !1, file: !1, line: 5, type: !8, scopeLine: 5, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !0, retainedNodes: !46)
|
||||
!41 = !DILocalVariable(name: "socks", scope: !40, file: !1, line: 6, type: !10)
|
||||
!42 = !DILocation(line: 1, scope: !40)
|
||||
!43 = distinct !DISubprogram(name: "inlined", scope: !1, file: !1, line: 5, type: !8, scopeLine: 5, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !0, retainedNodes: !11)
|
||||
!43 = distinct !DISubprogram(name: "inlined", scope: !1, file: !1, line: 5, type: !8, scopeLine: 5, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !0, retainedNodes: !47)
|
||||
!44 = !DILocation(line: 0, scope: !43, inlinedAt: !42)
|
||||
!45 = !DILocalVariable(name: "knees", scope: !43, file: !1, line: 6, type: !10)
|
||||
!46 = !{!41}
|
||||
!47 = !{!45}
|
||||
|
||||
@ -82,15 +82,18 @@
|
||||
!14 = !DISubroutineType(types: !15)
|
||||
!15 = !{!16}
|
||||
!16 = !DIBasicType(name: "int", size: 32, align: 32, encoding: DW_ATE_signed)
|
||||
!40 = distinct !DISubprogram(name: "bar", scope: !2, file: !2, line: 1, spFlags: DISPFlagDefinition, unit: !1, retainedNodes: !13, type: !14, isDefinition: true)
|
||||
!40 = distinct !DISubprogram(name: "bar", scope: !2, file: !2, line: 1, spFlags: DISPFlagDefinition, unit: !1, retainedNodes: !43, type: !14, isDefinition: true)
|
||||
!41 = !DILocalVariable(name: "towel", scope: !40, file: !2, line: 1, type: !16)
|
||||
!42 = !DILocation(line: 40, scope: !40)
|
||||
!80 = distinct !DISubprogram(name: "baz", scope: !2, file: !2, line: 1, spFlags: DISPFlagDefinition, unit: !1, retainedNodes: !13, type: !14, isDefinition: true)
|
||||
!43 = !{!41}
|
||||
!80 = distinct !DISubprogram(name: "baz", scope: !2, file: !2, line: 1, spFlags: DISPFlagDefinition, unit: !1, retainedNodes: !83, type: !14, isDefinition: true)
|
||||
!81 = !DILocalVariable(name: "socks", scope: !80, file: !2, line: 1, type: !16)
|
||||
!82 = !DILocation(line: 40, scope: !80)
|
||||
!120 = distinct !DISubprogram(name: "qux", scope: !2, file: !2, line: 1, spFlags: DISPFlagDefinition, unit: !1, retainedNodes: !13, type: !14, isDefinition: true)
|
||||
!83 = !{!81}
|
||||
!120 = distinct !DISubprogram(name: "qux", scope: !2, file: !2, line: 1, spFlags: DISPFlagDefinition, unit: !1, retainedNodes: !123, type: !14, isDefinition: true)
|
||||
!121 = !DILocalVariable(name: "shoes", scope: !120, file: !2, line: 1, type: !16)
|
||||
!122 = !DILocation(line: 40, scope: !120)
|
||||
!123 = !{!121}
|
||||
|
||||
...
|
||||
---
|
||||
|
||||
@ -108,6 +108,6 @@ exit:
|
||||
!106 = !DILocation(line: 1, scope: !104)
|
||||
!113 = !{!103}
|
||||
!203 = !DILocalVariable(name: "teacake", scope: !204, file: !2, line: 1, type: !16)
|
||||
!204 = distinct !DISubprogram(name: "toad", scope: !2, file: !2, line: 1, spFlags: DISPFlagDefinition, unit: !1, retainedNodes: !113, type: !14, isDefinition: true)
|
||||
!204 = distinct !DISubprogram(name: "toad", scope: !2, file: !2, line: 1, spFlags: DISPFlagDefinition, unit: !1, retainedNodes: !213, type: !14, isDefinition: true)
|
||||
!206 = !DILocation(line: 1, scope: !204)
|
||||
!213 = !{!203}
|
||||
|
||||
@ -91,7 +91,7 @@
|
||||
!10 = !{!11}
|
||||
!11 = !DILocalVariable(name: "x", arg: 1, scope: !6, file: !1, line: 3, type: !9)
|
||||
!12 = !DILocation(line: 3, column: 12, scope: !6)
|
||||
!13 = distinct !DISubprogram(name: "f2", scope: !1, file: !1, line: 20, type: !7, scopeLine: 20, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !0, retainedNodes: !10)
|
||||
!13 = distinct !DISubprogram(name: "f2", scope: !1, file: !1, line: 20, type: !7, scopeLine: 20, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !0, retainedNodes: !{!14})
|
||||
!14 = !DILocalVariable(name: "x", arg: 1, scope: !13, file: !1, line: 21, type: !9)
|
||||
!15 = !DILocation(line: 23, column: 12, scope: !13)
|
||||
|
||||
|
||||
@ -80,8 +80,8 @@ attributes #1 = { nounwind readnone }
|
||||
!26 = !DILocation(line: 9, column: 3, scope: !4)
|
||||
!27 = distinct !DISubprogram(name: "func3", scope: !1, file: !1, line: 8, type: !5, isLocal: false, isDefinition: true, scopeLine: 8, flags: DIFlagPrototyped, isOptimized: true, unit: !0, retainedNodes: !28)
|
||||
!28 = !{!29}
|
||||
!29 = !DILocalVariable(name: "n", arg: 1, scope: !30, file: !1, line: 8, type: !7)
|
||||
!29 = !DILocalVariable(name: "n", arg: 1, scope: !27, file: !1, line: 8, type: !33)
|
||||
!30 = distinct !DISubprogram(name: "func4", scope: !1, file: !1, line: 8, type: !5, isLocal: false, isDefinition: true, scopeLine: 8, flags: DIFlagPrototyped, isOptimized: true, unit: !0, retainedNodes: !31)
|
||||
!31 = !{!32}
|
||||
!32 = !DILocalVariable(name: "n", arg: 1, scope: !30, file: !1, line: 8, type: !7)
|
||||
|
||||
!33 = !DIDerivedType(tag: DW_TAG_typedef, name: "size_t", scope: !30, file: !1, line: 13, baseType: !7)
|
||||
|
||||
@ -96,11 +96,11 @@ entry:
|
||||
!13 = !DILocalVariable(name: "v", arg: 1, scope: !8, file: !1, line: 3, type: !11)
|
||||
!14 = !DILocation(line: 5, column: 10, scope: !8)
|
||||
!15 = distinct !DILexicalBlock(scope: !16, file: !1, line: 9, column: 7)
|
||||
!16 = distinct !DISubprogram(name: "callee", scope: !1, file: !1, line: 8, type: !9, isLocal: false, isDefinition: true, scopeLine: 8, flags: DIFlagPrototyped, isOptimized: true, unit: !0, retainedNodes: !12)
|
||||
!16 = distinct !DISubprogram(name: "callee", scope: !1, file: !1, line: 8, type: !9, isLocal: false, isDefinition: true, scopeLine: 8, flags: DIFlagPrototyped, isOptimized: true, unit: !0, retainedNodes: !2)
|
||||
!17 = !DILocation(line: 10, column: 7, scope: !15)
|
||||
!18 = distinct !DISubprogram(name: "callee2", scope: !1, file: !1, line: 8, type: !9, isLocal: false, isDefinition: true, scopeLine: 8, flags: DIFlagPrototyped, isOptimized: true, unit: !0, retainedNodes: !12)
|
||||
!18 = distinct !DISubprogram(name: "callee2", scope: !1, file: !1, line: 8, type: !9, isLocal: false, isDefinition: true, scopeLine: 8, flags: DIFlagPrototyped, isOptimized: true, unit: !0, retainedNodes: !2)
|
||||
!19 = distinct !DILexicalBlock(scope: !18, file: !1, line: 100, column: 1)
|
||||
!20 = !DILocation(line: 110, column: 17, scope: !19)
|
||||
!21 = distinct !DISubprogram(name: "caller2", scope: !1, file: !1, line: 8, type: !9, isLocal: false, isDefinition: true, scopeLine: 8, flags: DIFlagPrototyped, isOptimized: true, unit: !0, retainedNodes: !12)
|
||||
!21 = distinct !DISubprogram(name: "caller2", scope: !1, file: !1, line: 8, type: !9, isLocal: false, isDefinition: true, scopeLine: 8, flags: DIFlagPrototyped, isOptimized: true, unit: !0, retainedNodes: !2)
|
||||
!22 = !DILocation(line: 110, column: 17, scope: !21)
|
||||
!23 = !DILocation(line: 15, column: 7, scope: !15)
|
||||
|
||||
@ -66,7 +66,7 @@ define void @inline_me() !dbg !13 {
|
||||
!10 = !DIBasicType(name: "ty32", size: 32, encoding: DW_ATE_unsigned)
|
||||
!11 = !DILocation(line: 1, column: 1, scope: !6)
|
||||
!12 = !DILabel(scope: !6, name: "bye", file: !1, line: 28)
|
||||
!13 = distinct !DISubprogram(name: "inline_me", linkageName: "inline_me", scope: null, file: !1, line: 1, type: !7, isLocal: false, isDefinition: true, scopeLine: 1, isOptimized: true, unit: !0, retainedNodes: !8)
|
||||
!13 = distinct !DISubprogram(name: "inline_me", linkageName: "inline_me", scope: null, file: !1, line: 1, type: !7, isLocal: false, isDefinition: true, scopeLine: 1, isOptimized: true, unit: !0, retainedNodes: !2)
|
||||
!14 = !DILabel(scope: !13, name: "label_in_@inline_me", file: !1, line: 29)
|
||||
!15 = !DILocation(line: 2, column: 2, scope: !13, inlinedAt: !11)
|
||||
!16 = !DILabel(scope: !17, name: "scoped_label_in_foo", file: !1, line: 30)
|
||||
|
||||
@ -106,7 +106,7 @@ define void @inline_me() !dbg !12{
|
||||
!9 = !DILocalVariable(name: "1", scope: !6, file: !1, line: 1, type: !10)
|
||||
!10 = !DIBasicType(name: "ty32", size: 32, encoding: DW_ATE_unsigned)
|
||||
!11 = !DILocation(line: 1, column: 1, scope: !6)
|
||||
!12 = distinct !DISubprogram(name: "inline_me", linkageName: "inline_me", scope: null, file: !1, line: 1, type: !7, isLocal: false, isDefinition: true, scopeLine: 1, isOptimized: true, unit: !0, retainedNodes: !8)
|
||||
!12 = distinct !DISubprogram(name: "inline_me", linkageName: "inline_me", scope: null, file: !1, line: 1, type: !7, isLocal: false, isDefinition: true, scopeLine: 1, isOptimized: true, unit: !0, retainedNodes: !2)
|
||||
!13 = !DILocation(line: 2, column: 2, scope: !12, inlinedAt: !14)
|
||||
!14 = !DILocation(line: 3, column: 3, scope: !15)
|
||||
!15 = distinct !DILexicalBlock(scope: !16, file: !1, line: 4, column: 4)
|
||||
|
||||
@ -125,15 +125,15 @@ attributes #1 = { nounwind readnone }
|
||||
!19 = !DILocation(line: 6, column: 17, scope: !14)
|
||||
!20 = !DIExpression(DW_OP_plus_uconst, 0)
|
||||
!21 = !DILocation(line: 11, column: 1, scope: !14)
|
||||
!22 = distinct !DISubprogram(name: "scan", scope: !1, file: !1, line: 4, type: !15, isLocal: false, isDefinition: true, scopeLine: 5, flags: DIFlagPrototyped, isOptimized: true, unit: !0, retainedNodes: !17)
|
||||
!22 = distinct !DISubprogram(name: "scan", scope: !1, file: !1, line: 4, type: !15, isLocal: false, isDefinition: true, scopeLine: 5, flags: DIFlagPrototyped, isOptimized: true, unit: !0, retainedNodes: !2)
|
||||
!23 = !DILocation(line: 6, column: 17, scope: !22)
|
||||
!24 = !DILocalVariable(name: "entry", scope: !22, file: !1, line: 6, type: !4)
|
||||
!25 = distinct !DISubprogram(name: "scan", scope: !1, file: !1, line: 4, type: !15, isLocal: false, isDefinition: true, scopeLine: 5, flags: DIFlagPrototyped, isOptimized: true, unit: !0, retainedNodes: !17)
|
||||
!25 = distinct !DISubprogram(name: "scan", scope: !1, file: !1, line: 4, type: !15, isLocal: false, isDefinition: true, scopeLine: 5, flags: DIFlagPrototyped, isOptimized: true, unit: !0, retainedNodes: !2)
|
||||
!26 = !DILocation(line: 6, column: 17, scope: !25)
|
||||
!27 = !DILocalVariable(name: "entry", scope: !25, file: !1, line: 6, type: !4)
|
||||
!28 = distinct !DISubprogram(name: "scan", scope: !1, file: !1, line: 4, type: !15, isLocal: false, isDefinition: true, scopeLine: 5, flags: DIFlagPrototyped, isOptimized: true, unit: !0, retainedNodes: !17)
|
||||
!28 = distinct !DISubprogram(name: "scan", scope: !1, file: !1, line: 4, type: !15, isLocal: false, isDefinition: true, scopeLine: 5, flags: DIFlagPrototyped, isOptimized: true, unit: !0, retainedNodes: !2)
|
||||
!29 = !DILocation(line: 6, column: 17, scope: !28)
|
||||
!30 = !DILocalVariable(name: "entry", scope: !28, file: !1, line: 6, type: !4)
|
||||
!31 = distinct !DISubprogram(name: "scan", scope: !1, file: !1, line: 4, type: !15, isLocal: false, isDefinition: true, scopeLine: 5, flags: DIFlagPrototyped, isOptimized: true, unit: !0, retainedNodes: !17)
|
||||
!31 = distinct !DISubprogram(name: "scan", scope: !1, file: !1, line: 4, type: !15, isLocal: false, isDefinition: true, scopeLine: 5, flags: DIFlagPrototyped, isOptimized: true, unit: !0, retainedNodes: !2)
|
||||
!32 = !DILocation(line: 6, column: 17, scope: !31)
|
||||
!33 = !DILocalVariable(name: "entry", scope: !31, file: !1, line: 6, type: !4)
|
||||
|
||||
@ -131,7 +131,8 @@ declare void @llvm.dbg.value(metadata, metadata, metadata)
|
||||
!10 = !DILexicalBlockFile(scope: !6, file: !1, discriminator: 0)
|
||||
!11 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed)
|
||||
!12 = !DILocation(line: 0, scope: !10)
|
||||
!13 = distinct !DISubprogram(name: "multi_exit", scope: !1, file: !1, line: 10, type: !7, scopeLine: 10, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !0, retainedNodes: !8)
|
||||
!13 = distinct !DISubprogram(name: "multi_exit", scope: !1, file: !1, line: 10, type: !7, scopeLine: 10, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !0, retainedNodes: !17)
|
||||
!14 = !DILocation(line: 0, scope: !15)
|
||||
!15 = !DILexicalBlockFile(scope: !13, file: !1, discriminator: 0)
|
||||
!16 = !DILocalVariable(name: "sum2", scope: !15, file: !1, line: 11, type: !11)
|
||||
!17 = !{!16}
|
||||
|
||||
@ -253,10 +253,10 @@ declare void @llvm.dbg.value(metadata, metadata, metadata)
|
||||
!32 = distinct !DILexicalBlock(scope: !31, file: !5, line: 137, column: 2)
|
||||
!33 = !DILocation(line: 210, column: 44, scope: !32)
|
||||
!34 = !DILocation(line: 320, column: 44, scope: !32)
|
||||
!35 = distinct !DISubprogram(name: "test_misc", line: 3, isLocal: false, isDefinition: true, virtualIndex: 6, flags: DIFlagPrototyped, isOptimized: true, unit: !0, scopeLine: 3, file: !5, scope: !6, type: !7, retainedNodes: !12)
|
||||
!35 = distinct !DISubprogram(name: "test_misc", line: 3, isLocal: false, isDefinition: true, virtualIndex: 6, flags: DIFlagPrototyped, isOptimized: true, unit: !0, scopeLine: 3, file: !5, scope: !6, type: !7, retainedNodes: !2)
|
||||
!36 = distinct !DILexicalBlock(scope: !35, file: !5, line: 137, column: 2)
|
||||
!37 = !DILocation(line: 430, column: 44, scope: !36)
|
||||
!38 = !DILocation(line: 540, column: 44, scope: !36)
|
||||
!39 = distinct !DISubprogram(name: "test_scalar_Steps", line: 3, isLocal: false, isDefinition: true, virtualIndex: 6, flags: DIFlagPrototyped, isOptimized: true, unit: !0, scopeLine: 3, file: !5, scope: !6, type: !7, retainedNodes: !12)
|
||||
!39 = distinct !DISubprogram(name: "test_scalar_Steps", line: 3, isLocal: false, isDefinition: true, virtualIndex: 6, flags: DIFlagPrototyped, isOptimized: true, unit: !0, scopeLine: 3, file: !5, scope: !6, type: !7, retainedNodes: !2)
|
||||
!40 = distinct !DILexicalBlock(scope: !39, file: !5, line: 137, column: 2)
|
||||
!41 = !DILocation(line: 650, column: 44, scope: !40)
|
||||
|
||||
@ -118,18 +118,18 @@ declare <2 x float> @llvm.matrix.transpose(<2 x float>, i32, i32)
|
||||
!4 = !{i32 2, !"Debug Info Version", i32 3}
|
||||
!5 = distinct !DISubprogram(name: "load_fn", scope: !1, file: !1, line: 1, type: !6, isLocal: false, isDefinition: true, scopeLine: 1, flags: DIFlagPrototyped, isOptimized: true, unit: !0, retainedNodes: !12)
|
||||
!17 = !DIFile(filename: "toplevel.c", directory: "/test")
|
||||
!16 = distinct !DISubprogram(name: "toplevel", scope: !1, file: !17, line: 1, type: !6, isLocal: false, isDefinition: true, scopeLine: 1, flags: DIFlagPrototyped, isOptimized: true, unit: !0, retainedNodes: !12)
|
||||
!16 = distinct !DISubprogram(name: "toplevel", scope: !1, file: !17, line: 1, type: !6, isLocal: false, isDefinition: true, scopeLine: 1, flags: DIFlagPrototyped, isOptimized: true, unit: !0, retainedNodes: !2)
|
||||
!18 = !DIFile(filename: "assign.h", directory: "/test")
|
||||
!19 = distinct !DISubprogram(name: "assign", scope: !1, file: !18, line: 1, type: !6, isLocal: false, isDefinition: true, scopeLine: 1, flags: DIFlagPrototyped, isOptimized: true, unit: !0, retainedNodes: !12)
|
||||
!19 = distinct !DISubprogram(name: "assign", scope: !1, file: !18, line: 1, type: !6, isLocal: false, isDefinition: true, scopeLine: 1, flags: DIFlagPrototyped, isOptimized: true, unit: !0, retainedNodes: !2)
|
||||
|
||||
!20 = !DIFile(filename: "add.h", directory: "/test")
|
||||
!21 = distinct !DISubprogram(name: "add_fn", scope: !1, file: !20, line: 1, type: !6, isLocal: false, isDefinition: true, scopeLine: 1, flags: DIFlagPrototyped, isOptimized: true, unit: !0, retainedNodes: !12)
|
||||
!21 = distinct !DISubprogram(name: "add_fn", scope: !1, file: !20, line: 1, type: !6, isLocal: false, isDefinition: true, scopeLine: 1, flags: DIFlagPrototyped, isOptimized: true, unit: !0, retainedNodes: !2)
|
||||
|
||||
!22 = !DIFile(filename: "store.h", directory: "/test")
|
||||
!23 = distinct !DISubprogram(name: "store_fn", scope: !1, file: !22, line: 1, type: !6, isLocal: false, isDefinition: true, scopeLine: 1, flags: DIFlagPrototyped, isOptimized: true, unit: !0, retainedNodes: !12)
|
||||
!23 = distinct !DISubprogram(name: "store_fn", scope: !1, file: !22, line: 1, type: !6, isLocal: false, isDefinition: true, scopeLine: 1, flags: DIFlagPrototyped, isOptimized: true, unit: !0, retainedNodes: !2)
|
||||
|
||||
!24 = !DIFile(filename: "transpose.h", directory: "/test")
|
||||
!25 = distinct !DISubprogram(name: "transpose", scope: !1, file: !24, line: 1, type: !6, isLocal: false, isDefinition: true, scopeLine: 1, flags: DIFlagPrototyped, isOptimized: true, unit: !0, retainedNodes: !12)
|
||||
!25 = distinct !DISubprogram(name: "transpose", scope: !1, file: !24, line: 1, type: !6, isLocal: false, isDefinition: true, scopeLine: 1, flags: DIFlagPrototyped, isOptimized: true, unit: !0, retainedNodes: !2)
|
||||
|
||||
|
||||
!6 = !DISubroutineType(types: !7)
|
||||
|
||||
@ -163,26 +163,26 @@ declare void @llvm.matrix.column.major.store(<9 x double>, ptr, i64, i1, i32, i3
|
||||
!19 = !DILocation(line: 10, column: 20, scope: !5)
|
||||
!20 = !DILocation(line: 10, column: 10, scope: !5)
|
||||
|
||||
!21 = distinct !DISubprogram(name: "fn2", scope: !1, file: !1, line: 1, type: !6, isLocal: false, isDefinition: true, scopeLine: 1, flags: DIFlagPrototyped, isOptimized: true, unit: !0, retainedNodes: !12)
|
||||
!21 = distinct !DISubprogram(name: "fn2", scope: !1, file: !1, line: 1, type: !6, isLocal: false, isDefinition: true, scopeLine: 1, flags: DIFlagPrototyped, isOptimized: true, unit: !0, retainedNodes: !2)
|
||||
!22 = !DILocation(line: 30, column: 20, scope: !21)
|
||||
|
||||
!23 = distinct !DISubprogram(name: "fn3", scope: !1, file: !1, line: 1, type: !6, isLocal: false, isDefinition: true, scopeLine: 1, flags: DIFlagPrototyped, isOptimized: true, unit: !0, retainedNodes: !12)
|
||||
!23 = distinct !DISubprogram(name: "fn3", scope: !1, file: !1, line: 1, type: !6, isLocal: false, isDefinition: true, scopeLine: 1, flags: DIFlagPrototyped, isOptimized: true, unit: !0, retainedNodes: !2)
|
||||
!24 = !DILocation(line: 40, column: 20, scope: !23)
|
||||
|
||||
!25 = distinct !DISubprogram(name: "fn4", scope: !1, file: !1, line: 1, type: !6, isLocal: false, isDefinition: true, scopeLine: 1, flags: DIFlagPrototyped, isOptimized: true, unit: !0, retainedNodes: !12)
|
||||
!25 = distinct !DISubprogram(name: "fn4", scope: !1, file: !1, line: 1, type: !6, isLocal: false, isDefinition: true, scopeLine: 1, flags: DIFlagPrototyped, isOptimized: true, unit: !0, retainedNodes: !2)
|
||||
!26 = !DILocation(line: 50, column: 20, scope: !25)
|
||||
|
||||
!27 = distinct !DISubprogram(name: "fn5", scope: !1, file: !1, line: 1, type: !6, isLocal: false, isDefinition: true, scopeLine: 1, flags: DIFlagPrototyped, isOptimized: true, unit: !0, retainedNodes: !12)
|
||||
!27 = distinct !DISubprogram(name: "fn5", scope: !1, file: !1, line: 1, type: !6, isLocal: false, isDefinition: true, scopeLine: 1, flags: DIFlagPrototyped, isOptimized: true, unit: !0, retainedNodes: !2)
|
||||
!28 = !DILocation(line: 60, column: 20, scope: !27)
|
||||
|
||||
!29 = distinct !DISubprogram(name: "fn6", scope: !1, file: !1, line: 1, type: !6, isLocal: false, isDefinition: true, scopeLine: 1, flags: DIFlagPrototyped, isOptimized: true, unit: !0, retainedNodes: !12)
|
||||
!29 = distinct !DISubprogram(name: "fn6", scope: !1, file: !1, line: 1, type: !6, isLocal: false, isDefinition: true, scopeLine: 1, flags: DIFlagPrototyped, isOptimized: true, unit: !0, retainedNodes: !2)
|
||||
!30 = !DILocation(line: 70, column: 20, scope: !29)
|
||||
|
||||
!31 = distinct !DISubprogram(name: "fn7", scope: !1, file: !1, line: 1, type: !6, isLocal: false, isDefinition: true, scopeLine: 1, flags: DIFlagPrototyped, isOptimized: true, unit: !0, retainedNodes: !12)
|
||||
!31 = distinct !DISubprogram(name: "fn7", scope: !1, file: !1, line: 1, type: !6, isLocal: false, isDefinition: true, scopeLine: 1, flags: DIFlagPrototyped, isOptimized: true, unit: !0, retainedNodes: !2)
|
||||
!32 = !DILocation(line: 80, column: 20, scope: !31)
|
||||
|
||||
!33 = distinct !DISubprogram(name: "fn8", scope: !1, file: !1, line: 1, type: !6, isLocal: false, isDefinition: true, scopeLine: 1, flags: DIFlagPrototyped, isOptimized: true, unit: !0, retainedNodes: !12)
|
||||
!33 = distinct !DISubprogram(name: "fn8", scope: !1, file: !1, line: 1, type: !6, isLocal: false, isDefinition: true, scopeLine: 1, flags: DIFlagPrototyped, isOptimized: true, unit: !0, retainedNodes: !2)
|
||||
!34 = !DILocation(line: 90, column: 20, scope: !33)
|
||||
|
||||
!35 = distinct !DISubprogram(name: "fn9", scope: !1, file: !1, line: 1, type: !6, isLocal: false, isDefinition: true, scopeLine: 1, flags: DIFlagPrototyped, isOptimized: true, unit: !0, retainedNodes: !12)
|
||||
!35 = distinct !DISubprogram(name: "fn9", scope: !1, file: !1, line: 1, type: !6, isLocal: false, isDefinition: true, scopeLine: 1, flags: DIFlagPrototyped, isOptimized: true, unit: !0, retainedNodes: !2)
|
||||
!36 = !DILocation(line: 100, column: 20, scope: !35)
|
||||
|
||||
@ -72,5 +72,5 @@ entry:
|
||||
!14 = !{!15}
|
||||
!15 = !DILocalVariable(name: "a", arg: 1, scope: !7, file: !1, line: 1, type: !10)
|
||||
!16 = !DILocation(line: 400, column: 3, scope: !7)
|
||||
!17 = distinct !DISubprogram(name: "test2", scope: !1, file: !1, line: 21, type: !8, scopeLine: 20, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !0, retainedNodes: !14)
|
||||
!17 = distinct !DISubprogram(name: "test2", scope: !1, file: !1, line: 21, type: !8, scopeLine: 20, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !0, retainedNodes: !2)
|
||||
!18 = !DILocation(line: 200, column: 3, scope: !17)
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user