forked from OSchip/llvm-project
Revert "DwarfDebug: Pick next location in case of missing location at block begin"
It originally triggered a stepping problem in the debugger, which could be fixed by adjusting CodeGen/LexicalScopes.cpp however it seems we prefer the previous behavior anyway. See the discussion for details: http://lists.llvm.org/pipermail/llvm-commits/Week-of-Mon-20181008/593833.html This reverts commit r343880. This reverts commit r343874. llvm-svn: 344318
This commit is contained in:
parent
a894043910
commit
c7efb6f990
|
@ -1371,49 +1371,6 @@ void DwarfDebug::collectEntityInfo(DwarfCompileUnit &TheCU,
|
|||
}
|
||||
}
|
||||
|
||||
static const DebugLoc &
|
||||
findNextDebugLoc(MachineBasicBlock::const_iterator MBBI,
|
||||
MachineBasicBlock::const_iterator MBBE) {
|
||||
static DebugLoc NoLocation;
|
||||
for ( ; MBBI != MBBE; ++MBBI) {
|
||||
if (MBBI->isDebugInstr())
|
||||
continue;
|
||||
const DebugLoc &DL = MBBI->getDebugLoc();
|
||||
if (DL)
|
||||
return DL;
|
||||
}
|
||||
return NoLocation;
|
||||
}
|
||||
|
||||
void DwarfDebug::emitDebugLoc(const DebugLoc &DL) {
|
||||
unsigned LastAsmLine =
|
||||
Asm->OutStreamer->getContext().getCurrentDwarfLoc().getLine();
|
||||
|
||||
// We have an explicit location, different from the previous location.
|
||||
// Don't repeat a line-0 record, but otherwise emit the new location.
|
||||
// (The new location might be an explicit line 0, which we do emit.)
|
||||
unsigned Line = DL.getLine();
|
||||
if (PrevInstLoc && Line == 0 && LastAsmLine == 0)
|
||||
return;
|
||||
unsigned Flags = 0;
|
||||
if (DL == PrologEndLoc) {
|
||||
Flags |= DWARF2_FLAG_PROLOGUE_END | DWARF2_FLAG_IS_STMT;
|
||||
PrologEndLoc = DebugLoc();
|
||||
}
|
||||
// If the line changed, we call that a new statement; unless we went to
|
||||
// line 0 and came back, in which case it is not a new statement.
|
||||
unsigned OldLine = PrevInstLoc ? PrevInstLoc.getLine() : LastAsmLine;
|
||||
if (Line && Line != OldLine)
|
||||
Flags |= DWARF2_FLAG_IS_STMT;
|
||||
|
||||
const MDNode *Scope = DL.getScope();
|
||||
recordSourceLine(Line, DL.getCol(), Scope, Flags);
|
||||
|
||||
// If we're not at line 0, remember this location.
|
||||
if (Line)
|
||||
PrevInstLoc = DL;
|
||||
}
|
||||
|
||||
// Process beginning of an instruction.
|
||||
void DwarfDebug::beginInstruction(const MachineInstr *MI) {
|
||||
DebugHandlerBase::beginInstruction(MI);
|
||||
|
@ -1458,41 +1415,54 @@ void DwarfDebug::beginInstruction(const MachineInstr *MI) {
|
|||
// If we have already emitted a line-0 record, don't repeat it.
|
||||
if (LastAsmLine == 0)
|
||||
return;
|
||||
// By default we emit nothing to avoid line table bloat. However at the
|
||||
// beginning of a basic block or after a label it is undesirable to let
|
||||
// the previous location unchanged. In these cases do a forward search for
|
||||
// the next valid debug location.
|
||||
if (UnknownLocations == Default) {
|
||||
const MachineBasicBlock &MBB = *MI->getParent();
|
||||
if (!PrevLabel && PrevInstBB == &MBB)
|
||||
return;
|
||||
|
||||
const DebugLoc &NextDL = findNextDebugLoc(MI->getIterator(), MBB.end());
|
||||
if (NextDL) {
|
||||
emitDebugLoc(NextDL);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// We should emit a line-0 record.
|
||||
// If user said Don't Do That, don't do that.
|
||||
if (UnknownLocations == Disable)
|
||||
return;
|
||||
// Emit a line-0 record now.
|
||||
// Preserve the file and column numbers, if we can, to save space in
|
||||
// the encoded line table.
|
||||
// Do not update PrevInstLoc, it remembers the last non-0 line.
|
||||
const MDNode *Scope = nullptr;
|
||||
unsigned Column = 0;
|
||||
if (PrevInstLoc) {
|
||||
Scope = PrevInstLoc.getScope();
|
||||
Column = PrevInstLoc.getCol();
|
||||
// See if we have a reason to emit a line-0 record now.
|
||||
// Reasons to emit a line-0 record include:
|
||||
// - User asked for it (UnknownLocations).
|
||||
// - Instruction has a label, so it's referenced from somewhere else,
|
||||
// possibly debug information; we want it to have a source location.
|
||||
// - Instruction is at the top of a block; we don't want to inherit the
|
||||
// location from the physically previous (maybe unrelated) block.
|
||||
if (UnknownLocations == Enable || PrevLabel ||
|
||||
(PrevInstBB && PrevInstBB != MI->getParent())) {
|
||||
// Preserve the file and column numbers, if we can, to save space in
|
||||
// the encoded line table.
|
||||
// Do not update PrevInstLoc, it remembers the last non-0 line.
|
||||
const MDNode *Scope = nullptr;
|
||||
unsigned Column = 0;
|
||||
if (PrevInstLoc) {
|
||||
Scope = PrevInstLoc.getScope();
|
||||
Column = PrevInstLoc.getCol();
|
||||
}
|
||||
recordSourceLine(/*Line=*/0, Column, Scope, /*Flags=*/0);
|
||||
}
|
||||
recordSourceLine(/*Line=*/0, Column, Scope, /*Flags=*/0);
|
||||
return;
|
||||
}
|
||||
|
||||
emitDebugLoc(DL);
|
||||
// We have an explicit location, different from the previous location.
|
||||
// Don't repeat a line-0 record, but otherwise emit the new location.
|
||||
// (The new location might be an explicit line 0, which we do emit.)
|
||||
if (PrevInstLoc && DL.getLine() == 0 && LastAsmLine == 0)
|
||||
return;
|
||||
unsigned Flags = 0;
|
||||
if (DL == PrologEndLoc) {
|
||||
Flags |= DWARF2_FLAG_PROLOGUE_END | DWARF2_FLAG_IS_STMT;
|
||||
PrologEndLoc = DebugLoc();
|
||||
}
|
||||
// If the line changed, we call that a new statement; unless we went to
|
||||
// line 0 and came back, in which case it is not a new statement.
|
||||
unsigned OldLine = PrevInstLoc ? PrevInstLoc.getLine() : LastAsmLine;
|
||||
if (DL.getLine() && DL.getLine() != OldLine)
|
||||
Flags |= DWARF2_FLAG_IS_STMT;
|
||||
|
||||
const MDNode *Scope = DL.getScope();
|
||||
recordSourceLine(DL.getLine(), DL.getCol(), Scope, Flags);
|
||||
|
||||
// If we're not at line 0, remember this location.
|
||||
if (DL.getLine())
|
||||
PrevInstLoc = DL;
|
||||
}
|
||||
|
||||
static DebugLoc findPrologueEndLoc(const MachineFunction *MF) {
|
||||
|
|
|
@ -723,9 +723,6 @@ public:
|
|||
bool tuneForLLDB() const { return DebuggerTuning == DebuggerKind::LLDB; }
|
||||
bool tuneForSCE() const { return DebuggerTuning == DebuggerKind::SCE; }
|
||||
/// @}
|
||||
|
||||
private:
|
||||
void emitDebugLoc(const DebugLoc &DL);
|
||||
};
|
||||
|
||||
} // end namespace llvm
|
||||
|
|
|
@ -3,4 +3,4 @@
|
|||
|
||||
; check line table length is correctly calculated for both big and little endian
|
||||
CHECK-LABEL: .debug_line contents:
|
||||
CHECK: total_length: 0x0000003c
|
||||
CHECK: total_length: 0x0000003f
|
||||
|
|
|
@ -31,10 +31,11 @@ if.then: ; preds = %entry
|
|||
|
||||
if.end: ; preds = %entry
|
||||
; Materialize the constant.
|
||||
; CHECK: .loc 1 7 5
|
||||
; CHECK: .loc 1 0
|
||||
; CHECK-NEXT: mvn r0, #0
|
||||
|
||||
; The backend performs the store to %retval first, for some reason.
|
||||
; CHECK-NEXT: .loc 1 7 5
|
||||
; CHECK-NEXT: str r0, [sp, #4]
|
||||
store i32 -1, i32* %x, align 4, !dbg !19
|
||||
|
||||
|
|
|
@ -16,7 +16,7 @@
|
|||
; CHECK: 0x0000000000000004 2 0 1 0 0 is_stmt prologue_end
|
||||
; CHECK: 0x0000000000000024 3 0 1 0 0 is_stmt
|
||||
; CHECK: 0x0000000000000034 4 0 1 0 0 is_stmt
|
||||
; CHECK: 0x0000000000000044 5 0 1 0 0 is_stmt
|
||||
; CHECK: 0x0000000000000048 5 0 1 0 0 is_stmt
|
||||
; CHECK: 0x0000000000000058 5 0 1 0 0 is_stmt end_sequence
|
||||
|
||||
|
||||
|
|
|
@ -36,7 +36,6 @@
|
|||
; CHECK: setp.ge.s32 %p{{.+}}, %r{{.+}}, %r{{.+}};
|
||||
; CHECK: .loc [[DEBUG_INFO_CU]] 7 7
|
||||
; CHECK: @%p{{.+}} bra [[BB:.+]];
|
||||
; CHECK: .loc [[DEBUG_INFO_CU]] 8 13
|
||||
; CHECK: ld.param.f32 %f{{.+}}, [{{.+}}];
|
||||
; CHECK: ld.param.u64 %rd{{.+}}, [{{.+}}];
|
||||
; CHECK: cvta.to.global.u64 %rd{{.+}}, %rd{{.+}};
|
||||
|
@ -44,6 +43,7 @@
|
|||
; CHECK: cvta.to.global.u64 %rd{{.+}}, %rd{{.+}};
|
||||
; CHECK: mul.wide.u32 %rd{{.+}}, %r{{.+}}, 4;
|
||||
; CHECK: add.s64 %rd{{.+}}, %rd{{.+}}, %rd{{.+}};
|
||||
; CHECK: .loc [[DEBUG_INFO_CU]] 8 13
|
||||
; CHECK: ld.global.f32 %f{{.+}}, [%rd{{.+}}];
|
||||
; CHECK: add.s64 %rd{{.+}}, %rd{{.+}}, %rd{{.+}};
|
||||
; CHECK: .loc [[DEBUG_INFO_CU]] 8 19
|
||||
|
|
|
@ -40,14 +40,15 @@ if.end: ; preds = %if.then, %entry
|
|||
ret void, !dbg !14
|
||||
}
|
||||
|
||||
; CHECK: .loc 1 7 7 prologue_end
|
||||
; CHECK: .loc 1 7 7
|
||||
; CHECK-NOT: .loc
|
||||
; CHECK: # %bb.1
|
||||
; CHECK-NEXT: .file 2 "/tests{{[/\]+}}include.h"
|
||||
; CHECK-NEXT: .loc 2 20 5
|
||||
; CHECK: .loc 1 0 7 is_stmt 0
|
||||
; CHECK-NOT: .loc
|
||||
; CHECK: .loc 2 20 5 is_stmt 1
|
||||
; CHECK: .LBB0_2:
|
||||
; CHECK: .loc 1 10 3
|
||||
; CHECK-NEXT: .loc 2 0 5 is_stmt 0
|
||||
; CHECK-NOT: .loc
|
||||
; CHECK: .loc 1 10 3 is_stmt 1
|
||||
;
|
||||
; DISABLE-NOT: .loc 1 0
|
||||
|
||||
|
|
|
@ -1,74 +0,0 @@
|
|||
# RUN: llc -o - %s -start-before=patchable-function -use-unknown-locations=Default | FileCheck %s --check-prefixes=CHECK,DEFAULT
|
||||
# RUN: llc -o - %s -start-before=patchable-function -use-unknown-locations=Enable | FileCheck %s --check-prefixes=CHECK,ENABLE
|
||||
# RUN: llc -o - %s -start-before=patchable-function -use-unknown-locations=Disable | FileCheck %s --check-prefixes=CHECK,DISABLE
|
||||
--- |
|
||||
target triple = "x86_64--"
|
||||
|
||||
!0 = !DIFile(filename: "dwarf-no-source-loc.mir", directory: "/")
|
||||
!1 = distinct !DICompileUnit(file: !0, language: DW_LANG_C, emissionKind: LineTablesOnly)
|
||||
!2 = distinct !DISubprogram(name: "func", unit: !1)
|
||||
!3 = !DILocation(line: 17, scope: !2)
|
||||
!4 = !DILocation(line: 42, scope: !2)
|
||||
|
||||
!llvm.dbg.cu = !{!1}
|
||||
!llvm.module.flags = !{!10, !11}
|
||||
!10 = !{i32 2, !"Dwarf Version", i32 4}
|
||||
!11 = !{i32 2, !"Debug Info Version", i32 3}
|
||||
|
||||
define void @func() !dbg !2 {
|
||||
unreachable
|
||||
}
|
||||
...
|
||||
---
|
||||
name: func
|
||||
body: |
|
||||
bb.0:
|
||||
NOOP
|
||||
NOOP
|
||||
$eax = MOV32ri 1, debug-location !3
|
||||
; CHECK-LABEL: bb.0
|
||||
; CHECK: nop
|
||||
; CHECK: nop
|
||||
; CHECK: .loc 1 17 0 prologue_end
|
||||
; CHECK: movl $1, %eax
|
||||
|
||||
bb.1:
|
||||
NOOP
|
||||
$ebx = MOV32ri 2, debug-location !4
|
||||
; CHECK-LABEL: bb.1
|
||||
; DEFAULT: .loc 1 42 0
|
||||
; ENABLE: .loc 1 0
|
||||
; DISABLE-NOT: .loc 1 0
|
||||
; CHECK: nop
|
||||
; ENABLE: .loc 1 42 0
|
||||
; CHECK: movl $2, %ebx
|
||||
|
||||
bb.2:
|
||||
NOOP
|
||||
; CHECK-LABEL: bb.2
|
||||
; DEFAULT: .loc 1 0 0 is_stmt 0
|
||||
; ENABLE: .loc 1 0 0 is_stmt 0
|
||||
; DISABLE-NOT: .loc 1 0
|
||||
; CHECK: nop
|
||||
|
||||
bb.3:
|
||||
NOOP
|
||||
$ecx = MOV32ri 3, debug-location !3
|
||||
; CHECK-LABEL: bb.3
|
||||
; CHECK: nop
|
||||
; DEFAULT: .loc 1 17 0 is_stmt 1
|
||||
; ENABLE: .loc 1 17 0 is_stmt 1
|
||||
; DISABLE-NOT: .loc 1 0
|
||||
; CHECK: movl $3, %ecx
|
||||
|
||||
bb.4:
|
||||
NOOP
|
||||
$edx = MOV32ri 4, debug-location !4
|
||||
; CHECK: bb.4
|
||||
; DEFAULT: .loc 1 42 0
|
||||
; ENABLE: .loc 1 0 0 is_stmt 0
|
||||
; DISABLE-NOT: .loc 1 0
|
||||
; CHECK: nop
|
||||
; ENABLE: .loc 1 42 0 is_stmt 1
|
||||
; CHECK: movl $4, %edx
|
||||
...
|
Loading…
Reference in New Issue