diff options
Diffstat (limited to 'llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp')
-rw-r--r-- | llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp | 112 |
1 files changed, 41 insertions, 71 deletions
diff --git a/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp b/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp index ab3559d63cc..94e12658cfe 100644 --- a/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp +++ b/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp @@ -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) { |