summaryrefslogtreecommitdiffstats
path: root/llvm/lib
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/lib')
-rw-r--r--llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp112
-rw-r--r--llvm/lib/CodeGen/AsmPrinter/DwarfDebug.h3
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
OpenPOWER on IntegriCloud