Revert r288212 due to lldb failure.

llvm-svn: 288216
This commit is contained in:
Paul Robinson 2016-11-29 23:20:35 +00:00
parent bb32a0735a
commit 07eb523cd7
6 changed files with 17 additions and 139 deletions

View File

@ -201,10 +201,8 @@ void DebugHandlerBase::endInstruction() {
assert(CurMI != nullptr);
// Don't create a new label after DBG_VALUE instructions.
// They don't generate code.
if (!CurMI->isDebugValue()) {
if (!CurMI->isDebugValue())
PrevLabel = nullptr;
PrevInstBB = CurMI->getParent();
}
DenseMap<const MachineInstr *, MCSymbol *>::iterator I =
LabelsAfterInsn.find(CurMI);

View File

@ -38,12 +38,10 @@ protected:
MachineModuleInfo *MMI;
/// Previous instruction's location information. This is used to
/// determine label location to indicate scope boundaries in debug info.
/// We track the previous instruction's source location (if not line 0),
/// whether it was a label, and its parent BB.
/// determine label location to indicate scope boundries in dwarf
/// debug info.
DebugLoc PrevInstLoc;
MCSymbol *PrevLabel = nullptr;
const MachineBasicBlock *PrevInstBB = nullptr;
/// This location indicates end of function prologue and beginning of
/// function body.

View File

@ -1010,70 +1010,31 @@ void DwarfDebug::beginInstruction(const MachineInstr *MI) {
if (MI->isDebugValue())
return;
const DebugLoc &DL = MI->getDebugLoc();
// When we emit a line-0 record, we don't update PrevInstLoc; so look at
// the last line number actually emitted, to see if it was line 0.
unsigned LastAsmLine =
Asm->OutStreamer->getContext().getCurrentDwarfLoc().getLine();
if (DL == PrevInstLoc) {
// If we have an ongoing unspecified location, nothing to do here.
if (!DL)
return;
// We have an explicit location, same as the previous location.
// But we might be coming back to it after a line 0 record.
if (LastAsmLine == 0 && DL.getLine() != 0) {
// Reinstate the source location but not marked as a statement.
const MDNode *Scope = DL.getScope();
recordSourceLine(DL.getLine(), DL.getCol(), Scope, /*Flags=*/0);
}
if (DL == PrevInstLoc)
return;
}
if (!DL) {
// We have an unspecified location, which might want to be line 0.
// If we have already emitted a line-0 record, don't repeat it.
if (LastAsmLine == 0)
return;
// 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 || PrevLabel ||
(PrevInstBB && PrevInstBB != MI->getParent())) {
// Preserve the file number, if we can, to save space in the line table.
// Do not update PrevInstLoc, it remembers the last non-0 line.
// FIXME: Also preserve the column number, to save more space?
const MDNode *Scope = PrevInstLoc ? PrevInstLoc.getScope() : nullptr;
recordSourceLine(0, 0, Scope, 0);
if (UnknownLocations) {
PrevInstLoc = DL;
recordSourceLine(0, 0, nullptr, 0);
}
return;
}
// 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 (DL.getLine() == 0 && LastAsmLine == 0)
return;
// We have a new, explicit location.
unsigned Flags = 0;
PrevInstLoc = DL;
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)
if (DL.getLine() !=
Asm->OutStreamer->getContext().getCurrentDwarfLoc().getLine())
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) {

View File

@ -3888,27 +3888,23 @@ entry:
define void @test32() #1 !dbg !7 {
entry:
; LINUX-I386-LABEL: test32:
; LINUX-I386: .loc 1 4 2 prologue_end
; LINUX-I386: .loc 1 0 0
; LINUX-I386: .loc 1 0 0 prologue_end
; LINUX-I386-NEXT: calll __stack_chk_fail
; LINUX-X64-LABEL: test32:
; LINUX-X64: .loc 1 4 2 prologue_end
; LINUX-X64: .loc 1 0 0
; LINUX-X64: .loc 1 0 0 prologue_end
; LINUX-X64-NEXT: callq __stack_chk_fail
; LINUX-KERNEL-X64-LABEL: test32:
; LINUX-KERNEL-X64: .loc 1 4 2 prologue_end
; LINUX-KERNEL-X64: .loc 1 0 0
; LINUX-KERNEL-X64: .loc 1 0 0 prologue_end
; LINUX-KERNEL-X64-NEXT: callq __stack_chk_fail
; OPENBSD-AMD64-LABEL: test32:
; OPENBSD-AMD64: .loc 1 4 2 prologue_end
; OPENBSD-AMD64: .loc 1 0 0
; OPENBSD-AMD64: .loc 1 0 0 prologue_end
; OPENBSD-AMD64-NEXT: movl
; OPENBSD-AMD64-NEXT: callq __stack_smash_handler
%0 = alloca [5 x i8], align 1
ret void, !dbg !9
ret void
}
declare double @testi_aux()
@ -3944,4 +3940,3 @@ attributes #5 = { ssp "stack-protector-buffer-size"="6" }
!6 = distinct !DISubprogram(name: "__stack_chk_fail", scope: !1, type: !8, unit: !0)
!7 = distinct !DISubprogram(name: "test32", scope: !1, type: !8, unit: !0)
!8 = !DISubroutineType(types: !2)
!9 = !DILocation(line: 4, column: 2, scope: !7)

View File

@ -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: 0x0000003e
CHECK: total_length: 0x0000003c

View File

@ -1,74 +0,0 @@
; Verify "no source location" directives appear in appropriate places.
; RUN: llc %s -o - | FileCheck %s
; Generated from this .cpp targeting linux using -g
; and then removed function attributes as clutter.
;
; void bar(int *);
; void baz(int *);
; # 5 "no-source-loc.cpp"
; void foo(int x) {
; int z;
; if (x)
; # 20 "include.h"
; bar(&z);
; # 10 "no-source-loc.cpp"
; baz(&z);
; }
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"
; Function Attrs: uwtable
define void @_Z3fooi(i32 %x) !dbg !6 {
entry:
%x.addr = alloca i32, align 4
%z = alloca i32, align 4
store i32 %x, i32* %x.addr, align 4
%0 = load i32, i32* %x.addr, align 4, !dbg !8
%tobool = icmp ne i32 %0, 0, !dbg !8
br i1 %tobool, label %if.then, label %if.end, !dbg !8
if.then: ; preds = %entry
call void @_Z3barPi(i32* %z), !dbg !9
br label %if.end, !dbg !9
if.end: ; preds = %if.then, %entry
call void @_Z3bazPi(i32* %z), !dbg !12
ret void, !dbg !14
}
; CHECK: .loc 1 7 7
; CHECK-NOT: .loc
; CHECK: .loc 1 0 0 is_stmt 0
; CHECK-NOT: .loc
; CHECK: .loc 2 20 5 is_stmt 1
; CHECK: .LBB0_2:
; CHECK-NEXT: .loc 2 0 0 is_stmt 0
; CHECK-NOT: .loc
; CHECK: .loc 1 10 3 is_stmt 1
declare void @_Z3barPi(i32*)
declare void @_Z3bazPi(i32*)
!llvm.dbg.cu = !{!0}
!llvm.module.flags = !{!3, !4}
!llvm.ident = !{!5}
!0 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus, file: !1, producer: "clang version 4.0.0 (trunk 278782)", isOptimized: false, runtimeVersion: 0, emissionKind: LineTablesOnly, enums: !2)
!1 = !DIFile(filename: "no-source-loc.cpp", directory: "/tests")
!2 = !{}
!3 = !{i32 2, !"Dwarf Version", i32 4}
!4 = !{i32 2, !"Debug Info Version", i32 3}
!5 = !{!"clang version 4.0.0 (trunk 278782)"}
!6 = distinct !DISubprogram(name: "foo", scope: !1, file: !1, line: 5, type: !7, isLocal: false, isDefinition: true, scopeLine: 5, flags: DIFlagPrototyped, isOptimized: false, unit: !0, variables: !2)
!7 = !DISubroutineType(types: !2)
!8 = !DILocation(line: 7, column: 7, scope: !6)
!9 = !DILocation(line: 20, column: 5, scope: !10)
!10 = !DILexicalBlockFile(scope: !6, file: !11, discriminator: 0)
!11 = !DIFile(filename: "include.h", directory: "/tests")
!12 = !DILocation(line: 10, column: 3, scope: !13)
!13 = !DILexicalBlockFile(scope: !6, file: !1, discriminator: 0)
!14 = !DILocation(line: 11, column: 1, scope: !13)