diff options
Diffstat (limited to 'llvm/lib')
-rw-r--r-- | llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp | 112 | ||||
-rw-r--r-- | llvm/lib/CodeGen/AsmPrinter/DwarfDebug.h | 3 |
2 files changed, 74 insertions, 41 deletions
diff --git a/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp b/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp index 6c6a861306d..ede606131ff 100644 --- a/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp +++ b/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp @@ -1313,6 +1313,49 @@ 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); @@ -1352,54 +1395,41 @@ 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; - // 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); + // 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(); } + recordSourceLine(/*Line=*/0, Column, Scope, /*Flags=*/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 (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; + emitDebugLoc(DL); } static DebugLoc findPrologueEndLoc(const MachineFunction *MF) { diff --git a/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.h b/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.h index 23aa2ba094e..ba40ad28eb7 100644 --- a/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.h +++ b/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.h @@ -719,6 +719,9 @@ public: bool tuneForLLDB() const { return DebuggerTuning == DebuggerKind::LLDB; } bool tuneForSCE() const { return DebuggerTuning == DebuggerKind::SCE; } /// @} + +private: + void emitDebugLoc(const DebugLoc &DL); }; } // end namespace llvm |