forked from OSchip/llvm-project
Revert "PR20038: DebugInfo: Inlined call sites where the caller has debug info but the call itself has no debug location."
This reverts commit r211723. Breaks the ASan/compiler-rt build... guess I didn't test very far at all :/. llvm-svn: 211724
This commit is contained in:
parent
442584588a
commit
2952956fd8
|
@ -786,7 +786,8 @@ void DwarfDebug::finishVariableDefinitions() {
|
||||||
for (const auto &Var : ConcreteVariables) {
|
for (const auto &Var : ConcreteVariables) {
|
||||||
DIE *VariableDie = Var->getDIE();
|
DIE *VariableDie = Var->getDIE();
|
||||||
// FIXME: There shouldn't be any variables without DIEs.
|
// FIXME: There shouldn't be any variables without DIEs.
|
||||||
assert(VariableDie);
|
if (!VariableDie)
|
||||||
|
continue;
|
||||||
// FIXME: Consider the time-space tradeoff of just storing the unit pointer
|
// FIXME: Consider the time-space tradeoff of just storing the unit pointer
|
||||||
// in the ConcreteVariables list, rather than looking it up again here.
|
// in the ConcreteVariables list, rather than looking it up again here.
|
||||||
// DIE::getUnit isn't simple - it walks parent pointers, etc.
|
// DIE::getUnit isn't simple - it walks parent pointers, etc.
|
||||||
|
|
|
@ -137,8 +137,6 @@ LexicalScope *LexicalScopes::findLexicalScope(DebugLoc DL) {
|
||||||
/// getOrCreateLexicalScope - Find lexical scope for the given DebugLoc. If
|
/// getOrCreateLexicalScope - Find lexical scope for the given DebugLoc. If
|
||||||
/// not available then create new lexical scope.
|
/// not available then create new lexical scope.
|
||||||
LexicalScope *LexicalScopes::getOrCreateLexicalScope(DebugLoc DL) {
|
LexicalScope *LexicalScopes::getOrCreateLexicalScope(DebugLoc DL) {
|
||||||
if (DL.isUnknown())
|
|
||||||
return nullptr;
|
|
||||||
MDNode *Scope = nullptr;
|
MDNode *Scope = nullptr;
|
||||||
MDNode *InlinedAt = nullptr;
|
MDNode *InlinedAt = nullptr;
|
||||||
DL.getScopeAndInlinedAt(Scope, InlinedAt, MF->getFunction()->getContext());
|
DL.getScopeAndInlinedAt(Scope, InlinedAt, MF->getFunction()->getContext());
|
||||||
|
@ -174,12 +172,9 @@ LexicalScope *LexicalScopes::getOrCreateRegularScope(MDNode *Scope) {
|
||||||
std::make_tuple(Parent, DIDescriptor(Scope),
|
std::make_tuple(Parent, DIDescriptor(Scope),
|
||||||
nullptr, false)).first;
|
nullptr, false)).first;
|
||||||
|
|
||||||
if (!Parent) {
|
if (!Parent && DIDescriptor(Scope).isSubprogram() &&
|
||||||
assert(DIDescriptor(Scope).isSubprogram());
|
DISubprogram(Scope).describes(MF->getFunction()))
|
||||||
assert(DISubprogram(Scope).describes(MF->getFunction()));
|
|
||||||
assert(!CurrentFnLexicalScope);
|
|
||||||
CurrentFnLexicalScope = &I->second;
|
CurrentFnLexicalScope = &I->second;
|
||||||
}
|
|
||||||
|
|
||||||
return &I->second;
|
return &I->second;
|
||||||
}
|
}
|
||||||
|
|
|
@ -532,32 +532,6 @@ bool DISubprogram::Verify() const {
|
||||||
if (isLValueReference() && isRValueReference())
|
if (isLValueReference() && isRValueReference())
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (auto *F = getFunction()) {
|
|
||||||
LLVMContext &Ctxt = F->getContext();
|
|
||||||
for (auto &BB : *F) {
|
|
||||||
for (auto &I : BB) {
|
|
||||||
DebugLoc DL = I.getDebugLoc();
|
|
||||||
if (DL.isUnknown())
|
|
||||||
continue;
|
|
||||||
|
|
||||||
MDNode *Scope = nullptr;
|
|
||||||
MDNode *IA = nullptr;
|
|
||||||
// walk the inlined-at scopes
|
|
||||||
while (DL.getScopeAndInlinedAt(Scope, IA, F->getContext()), IA)
|
|
||||||
DL = DebugLoc::getFromDILocation(IA);
|
|
||||||
DL.getScopeAndInlinedAt(Scope, IA, Ctxt);
|
|
||||||
assert(!IA);
|
|
||||||
while (!DIDescriptor(Scope).isSubprogram()) {
|
|
||||||
DILexicalBlockFile D(Scope);
|
|
||||||
Scope = D.isLexicalBlockFile()
|
|
||||||
? D.getScope()
|
|
||||||
: DebugLoc::getFromDILexicalBlock(Scope).getScope(Ctxt);
|
|
||||||
}
|
|
||||||
if (!DISubprogram(Scope).describes(F))
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return DbgNode->getNumOperands() == 20;
|
return DbgNode->getNumOperands() == 20;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -18,38 +18,26 @@
|
||||||
; CHECK-NOT: DW_TAG
|
; CHECK-NOT: DW_TAG
|
||||||
; CHECK: DW_AT_name {{.*}} "~C"
|
; CHECK: DW_AT_name {{.*}} "~C"
|
||||||
|
|
||||||
; CHECK: [[D1_ABS:.*]]: DW_TAG_subprogram
|
|
||||||
; CHECK-NOT: DW_TAG
|
|
||||||
; CHECK: DW_AT_MIPS_linkage_name {{.*}} "_ZN1CD1Ev"
|
|
||||||
; CHECK-NOT: {{DW_TAG|NULL}}
|
|
||||||
; CHECK: [[D1_THIS_ABS:.*]]: DW_TAG_formal_parameter
|
|
||||||
; CHECK-NOT: DW_TAG
|
|
||||||
; CHECK: DW_AT_name {{.*}} "this"
|
|
||||||
|
|
||||||
; CHECK: DW_TAG_subprogram
|
; CHECK: DW_TAG_subprogram
|
||||||
; CHECK-NOT: DW_TAG
|
; CHECK-NOT: DW_TAG
|
||||||
; CHECK: DW_AT_name {{.*}} "fun4"
|
; CHECK: DW_AT_name {{.*}} "fun4"
|
||||||
; CHECK-NOT: {{DW_TAG|NULL}}
|
|
||||||
; CHECK: DW_TAG_lexical_block
|
|
||||||
; CHECK-NOT: {{DW_TAG|NULL}}
|
|
||||||
; CHECK: DW_TAG_inlined_subroutine
|
|
||||||
; CHECK-NOT: DW_TAG
|
|
||||||
; CHECK: DW_AT_abstract_origin {{.*}} {[[D1_ABS]]}
|
|
||||||
; CHECK-NOT: {{DW_TAG|NULL}}
|
|
||||||
; CHECK: DW_TAG_formal_parameter
|
|
||||||
; CHECK-NOT: DW_TAG
|
|
||||||
; CHECK: DW_AT_abstract_origin {{.*}} {[[D1_THIS_ABS]]}
|
|
||||||
|
|
||||||
; FIXME: D2 is actually inlined into D1 but doesn't show up here, possibly due
|
; FIXME: The dtor is inlined into fun4 and should have an inlined_subroutine
|
||||||
; to there being no work in D2 (calling another member function from the dtor
|
; entry. (it may be necessary to put some non-trivial instruction, such as an
|
||||||
; causes D2 to show up, calling a free function doesn't).
|
; assignment to a global, in the dtor just to ensure its emission/inlining)
|
||||||
|
|
||||||
|
; CHECK-NOT: DW_TAG_inlined_subroutine
|
||||||
|
|
||||||
|
; CHECK: DW_TAG_subprogram
|
||||||
; CHECK-NOT: DW_TAG
|
; CHECK-NOT: DW_TAG
|
||||||
; CHECK: NULL
|
; CHECK: DW_AT_MIPS_linkage_name {{.*}} "_ZN1CD1Ev"
|
||||||
; CHECK-NOT: DW_TAG
|
|
||||||
; CHECK: NULL
|
; FIXME: But I think where the real issue is for PR20038 is that the D1 ctor, ;
|
||||||
; CHECK-NOT: DW_TAG
|
; calling and inlining D2, doesn't end up with an inlined_subroutine. Though this
|
||||||
; CHECK: NULL
|
; might be more the result of a lack of any actual work in D2 (again, could use
|
||||||
|
; an assignment to global, etc)
|
||||||
|
|
||||||
|
; CHECK-NOT: DW_TAG_inlined_subroutine
|
||||||
|
|
||||||
%struct.C = type { i8 }
|
%struct.C = type { i8 }
|
||||||
|
|
||||||
|
@ -59,48 +47,48 @@
|
||||||
define void @_Z4fun4v() #0 {
|
define void @_Z4fun4v() #0 {
|
||||||
entry:
|
entry:
|
||||||
%this.addr.i.i = alloca %struct.C*, align 8, !dbg !21
|
%this.addr.i.i = alloca %struct.C*, align 8, !dbg !21
|
||||||
%this.addr.i = alloca %struct.C*, align 8, !dbg !22
|
%this.addr.i = alloca %struct.C*, align 8
|
||||||
%agg.tmp.ensured = alloca %struct.C, align 1
|
%agg.tmp.ensured = alloca %struct.C, align 1
|
||||||
%cleanup.cond = alloca i1
|
%cleanup.cond = alloca i1
|
||||||
%0 = load i8* @b, align 1, !dbg !24
|
%0 = load i8* @b, align 1, !dbg !22
|
||||||
%tobool = trunc i8 %0 to i1, !dbg !24
|
%tobool = trunc i8 %0 to i1, !dbg !22
|
||||||
store i1 false, i1* %cleanup.cond
|
store i1 false, i1* %cleanup.cond
|
||||||
br i1 %tobool, label %land.rhs, label %land.end, !dbg !24
|
br i1 %tobool, label %land.rhs, label %land.end, !dbg !22
|
||||||
|
|
||||||
land.rhs: ; preds = %entry
|
land.rhs: ; preds = %entry
|
||||||
store i1 true, i1* %cleanup.cond, !dbg !25
|
store i1 true, i1* %cleanup.cond, !dbg !23
|
||||||
br label %land.end
|
br label %land.end
|
||||||
|
|
||||||
land.end: ; preds = %land.rhs, %entry
|
land.end: ; preds = %land.rhs, %entry
|
||||||
%1 = phi i1 [ false, %entry ], [ true, %land.rhs ]
|
%1 = phi i1 [ false, %entry ], [ true, %land.rhs ]
|
||||||
%cleanup.is_active = load i1* %cleanup.cond, !dbg !27
|
%cleanup.is_active = load i1* %cleanup.cond
|
||||||
br i1 %cleanup.is_active, label %cleanup.action, label %cleanup.done, !dbg !27
|
br i1 %cleanup.is_active, label %cleanup.action, label %cleanup.done
|
||||||
|
|
||||||
cleanup.action: ; preds = %land.end
|
cleanup.action: ; preds = %land.end
|
||||||
store %struct.C* %agg.tmp.ensured, %struct.C** %this.addr.i, align 8, !dbg !22
|
store %struct.C* %agg.tmp.ensured, %struct.C** %this.addr.i, align 8
|
||||||
call void @llvm.dbg.declare(metadata !{%struct.C** %this.addr.i}, metadata !29), !dbg !31
|
call void @llvm.dbg.declare(metadata !{%struct.C** %this.addr.i}, metadata !25), !dbg !27
|
||||||
%this1.i = load %struct.C** %this.addr.i, !dbg !22
|
%this1.i = load %struct.C** %this.addr.i
|
||||||
store %struct.C* %this1.i, %struct.C** %this.addr.i.i, align 8, !dbg !21
|
store %struct.C* %this1.i, %struct.C** %this.addr.i.i, align 8, !dbg !21
|
||||||
call void @llvm.dbg.declare(metadata !{%struct.C** %this.addr.i.i}, metadata !32), !dbg !33
|
call void @llvm.dbg.declare(metadata !{%struct.C** %this.addr.i.i}, metadata !28), !dbg !29
|
||||||
%this1.i.i = load %struct.C** %this.addr.i.i, !dbg !21
|
%this1.i.i = load %struct.C** %this.addr.i.i, !dbg !21
|
||||||
br label %cleanup.done, !dbg !22
|
br label %cleanup.done
|
||||||
|
|
||||||
cleanup.done: ; preds = %cleanup.action, %land.end
|
cleanup.done: ; preds = %cleanup.action, %land.end
|
||||||
ret void, !dbg !34
|
ret void, !dbg !22
|
||||||
}
|
}
|
||||||
|
|
||||||
; Function Attrs: alwaysinline nounwind
|
; Function Attrs: alwaysinline nounwind
|
||||||
define void @_ZN1CD1Ev(%struct.C* %this) unnamed_addr #1 align 2 {
|
define void @_ZN1CD1Ev(%struct.C* %this) unnamed_addr #1 align 2 {
|
||||||
entry:
|
entry:
|
||||||
%this.addr.i = alloca %struct.C*, align 8, !dbg !37
|
%this.addr.i = alloca %struct.C*, align 8, !dbg !21
|
||||||
%this.addr = alloca %struct.C*, align 8
|
%this.addr = alloca %struct.C*, align 8
|
||||||
store %struct.C* %this, %struct.C** %this.addr, align 8
|
store %struct.C* %this, %struct.C** %this.addr, align 8
|
||||||
call void @llvm.dbg.declare(metadata !{%struct.C** %this.addr}, metadata !29), !dbg !38
|
call void @llvm.dbg.declare(metadata !{%struct.C** %this.addr}, metadata !25), !dbg !27
|
||||||
%this1 = load %struct.C** %this.addr
|
%this1 = load %struct.C** %this.addr
|
||||||
store %struct.C* %this1, %struct.C** %this.addr.i, align 8, !dbg !37
|
store %struct.C* %this1, %struct.C** %this.addr.i, align 8, !dbg !21
|
||||||
call void @llvm.dbg.declare(metadata !{%struct.C** %this.addr.i}, metadata !32), !dbg !39
|
call void @llvm.dbg.declare(metadata !{%struct.C** %this.addr.i}, metadata !28), !dbg !29
|
||||||
%this1.i = load %struct.C** %this.addr.i, !dbg !37
|
%this1.i = load %struct.C** %this.addr.i, !dbg !21
|
||||||
ret void, !dbg !37
|
ret void, !dbg !21
|
||||||
}
|
}
|
||||||
|
|
||||||
; Function Attrs: alwaysinline nounwind
|
; Function Attrs: alwaysinline nounwind
|
||||||
|
@ -108,9 +96,9 @@ define void @_ZN1CD2Ev(%struct.C* %this) unnamed_addr #1 align 2 {
|
||||||
entry:
|
entry:
|
||||||
%this.addr = alloca %struct.C*, align 8
|
%this.addr = alloca %struct.C*, align 8
|
||||||
store %struct.C* %this, %struct.C** %this.addr, align 8
|
store %struct.C* %this, %struct.C** %this.addr, align 8
|
||||||
call void @llvm.dbg.declare(metadata !{%struct.C** %this.addr}, metadata !32), !dbg !40
|
call void @llvm.dbg.declare(metadata !{%struct.C** %this.addr}, metadata !28), !dbg !30
|
||||||
%this1 = load %struct.C** %this.addr
|
%this1 = load %struct.C** %this.addr
|
||||||
ret void, !dbg !41
|
ret void, !dbg !31
|
||||||
}
|
}
|
||||||
|
|
||||||
; Function Attrs: nounwind readnone
|
; Function Attrs: nounwind readnone
|
||||||
|
@ -145,24 +133,14 @@ attributes #2 = { nounwind readnone }
|
||||||
!18 = metadata !{i32 2, metadata !"Dwarf Version", i32 4}
|
!18 = metadata !{i32 2, metadata !"Dwarf Version", i32 4}
|
||||||
!19 = metadata !{i32 2, metadata !"Debug Info Version", i32 1}
|
!19 = metadata !{i32 2, metadata !"Debug Info Version", i32 1}
|
||||||
!20 = metadata !{metadata !"clang version 3.5.0 "}
|
!20 = metadata !{metadata !"clang version 3.5.0 "}
|
||||||
!21 = metadata !{i32 6, i32 0, metadata !17, metadata !22}
|
!21 = metadata !{i32 6, i32 0, metadata !17, null}
|
||||||
!22 = metadata !{i32 5, i32 0, metadata !23, null}
|
!22 = metadata !{i32 5, i32 0, metadata !12, null}
|
||||||
!23 = metadata !{i32 786443, metadata !5, metadata !12, i32 5, i32 0, i32 3, i32 3} ; [ DW_TAG_lexical_block ] [/tmp/dbginfo/PR20038.cpp]
|
!23 = metadata !{i32 5, i32 0, metadata !24, null}
|
||||||
!24 = metadata !{i32 5, i32 0, metadata !12, null}
|
!24 = metadata !{i32 786443, metadata !5, metadata !12, i32 5, i32 0, i32 1, i32 1} ; [ DW_TAG_lexical_block ] [/tmp/dbginfo/PR20038.cpp]
|
||||||
!25 = metadata !{i32 5, i32 0, metadata !26, null}
|
!25 = metadata !{i32 786689, metadata !17, metadata !"this", null, i32 16777216, metadata !26, i32 1088, i32 0} ; [ DW_TAG_arg_variable ] [this] [line 0]
|
||||||
!26 = metadata !{i32 786443, metadata !5, metadata !12, i32 5, i32 0, i32 1, i32 1} ; [ DW_TAG_lexical_block ] [/tmp/dbginfo/PR20038.cpp]
|
!26 = metadata !{i32 786447, null, null, metadata !"", i32 0, i64 64, i64 64, i64 0, i32 0, metadata !"_ZTS1C"} ; [ DW_TAG_pointer_type ] [line 0, size 64, align 64, offset 0] [from _ZTS1C]
|
||||||
!27 = metadata !{i32 5, i32 0, metadata !28, null}
|
!27 = metadata !{i32 0, i32 0, metadata !17, null}
|
||||||
!28 = metadata !{i32 786443, metadata !5, metadata !12, i32 5, i32 0, i32 2, i32 2} ; [ DW_TAG_lexical_block ] [/tmp/dbginfo/PR20038.cpp]
|
!28 = metadata !{i32 786689, metadata !16, metadata !"this", null, i32 16777216, metadata !26, i32 1088, i32 0} ; [ DW_TAG_arg_variable ] [this] [line 0]
|
||||||
!29 = metadata !{i32 786689, metadata !17, metadata !"this", null, i32 16777216, metadata !30, i32 1088, i32 0} ; [ DW_TAG_arg_variable ] [this] [line 0]
|
!29 = metadata !{i32 0, i32 0, metadata !16, metadata !21}
|
||||||
!30 = metadata !{i32 786447, null, null, metadata !"", i32 0, i64 64, i64 64, i64 0, i32 0, metadata !"_ZTS1C"} ; [ DW_TAG_pointer_type ] [line 0, size 64, align 64, offset 0] [from _ZTS1C]
|
!30 = metadata !{i32 0, i32 0, metadata !16, null}
|
||||||
!31 = metadata !{i32 0, i32 0, metadata !17, metadata !22}
|
!31 = metadata !{i32 6, i32 0, metadata !16, null}
|
||||||
!32 = metadata !{i32 786689, metadata !16, metadata !"this", null, i32 16777216, metadata !30, i32 1088, i32 0} ; [ DW_TAG_arg_variable ] [this] [line 0]
|
|
||||||
!33 = metadata !{i32 0, i32 0, metadata !16, metadata !21}
|
|
||||||
!34 = metadata !{i32 5, i32 0, metadata !35, null}
|
|
||||||
!35 = metadata !{i32 786443, metadata !5, metadata !36, i32 5, i32 0, i32 5, i32 5} ; [ DW_TAG_lexical_block ] [/tmp/dbginfo/PR20038.cpp]
|
|
||||||
!36 = metadata !{i32 786443, metadata !5, metadata !12, i32 5, i32 0, i32 4, i32 4} ; [ DW_TAG_lexical_block ] [/tmp/dbginfo/PR20038.cpp]
|
|
||||||
!37 = metadata !{i32 6, i32 0, metadata !17, null}
|
|
||||||
!38 = metadata !{i32 0, i32 0, metadata !17, null}
|
|
||||||
!39 = metadata !{i32 0, i32 0, metadata !16, metadata !37}
|
|
||||||
!40 = metadata !{i32 0, i32 0, metadata !16, null}
|
|
||||||
!41 = metadata !{i32 6, i32 0, metadata !16, null}
|
|
||||||
|
|
Loading…
Reference in New Issue