|
@@ -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) {
|