Do not treat beginning of inlined scope as beginning of normal function scope if the location info is missing.

Insetad of doing ...
if (inlined_subroutine && known_location)
  DW_TAG_inline_subroutine
else
  DW_TAG_subprogram

do

if (inlined_subroutine) {
 if (known_location)
   DW_TAG_inline_subroutine
} else {
 DW_TAG_subprogram
}



git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@69300 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/CodeGen/SelectionDAG/SelectionDAGBuild.cpp b/lib/CodeGen/SelectionDAG/SelectionDAGBuild.cpp
index 832ad7e..5204113 100644
--- a/lib/CodeGen/SelectionDAG/SelectionDAGBuild.cpp
+++ b/lib/CodeGen/SelectionDAG/SelectionDAGBuild.cpp
@@ -3966,6 +3966,10 @@
         if (Fast) {
           unsigned ID = DW->RecordInlinedFnEnd(Subprogram);
           if (ID != 0)
+            // Returned ID is 0 if this is unbalanced "end of inlined
+            // scope". This could happen if optimizer eats dbg intrinsics
+            // or "beginning of inlined scope" is not recoginized due to
+            // missing location info. In such cases, do ignore this region.end.
             DAG.setRoot(DAG.getLabel(ISD::DBG_LABEL, getCurDebugLoc(), 
                                      getRoot(), ID));
         }
@@ -4000,6 +4004,12 @@
         if (!Subprogram.describes(MF.getFunction())) {
           // This is a beginning of an inlined function.
 
+          // If llvm.dbg.func.start is seen in a new block before any
+          // llvm.dbg.stoppoint intrinsic then the location info is unknown.
+          // FIXME : Why DebugLoc is reset at the beginning of each block ?
+          if (PrevLoc.isUnknown())
+            return 0;
+
           // Record the source line.
           unsigned Line = Subprogram.getLineNumber();
           unsigned LabelID = DW->RecordSourceLine(Line, 0, SrcFile);