Revert "DwarfDebug: Pick next location in case of missing location at block begin"

It originally triggered a stepping problem in the debugger, which could
be fixed by adjusting CodeGen/LexicalScopes.cpp however it seems we prefer
the previous behavior anyway.

See the discussion for details: http://lists.llvm.org/pipermail/llvm-commits/Week-of-Mon-20181008/593833.html

This reverts commit r343880.
This reverts commit r343874.

llvm-svn: 344318
diff --git a/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp b/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
index ab3559d..94e1265 100644
--- a/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
+++ b/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
@@ -1371,49 +1371,6 @@
   }
 }
 
-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 @@
     // 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) {
diff --git a/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.h b/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.h
index e115eb7..fecf805 100644
--- a/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.h
+++ b/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.h
@@ -723,9 +723,6 @@
   bool tuneForLLDB() const { return DebuggerTuning == DebuggerKind::LLDB; }
   bool tuneForSCE() const { return DebuggerTuning == DebuggerKind::SCE; }
   /// @}
-
-private:
-  void emitDebugLoc(const DebugLoc &DL);
 };
 
 } // end namespace llvm