Do not treat beginning of inlined scope as beginning of normal function scope if...
authorDevang Patel <dpatel@apple.com>
Thu, 16 Apr 2009 17:55:30 +0000 (17:55 +0000)
committerDevang Patel <dpatel@apple.com>
Thu, 16 Apr 2009 17:55:30 +0000 (17:55 +0000)
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

lib/CodeGen/SelectionDAG/FastISel.cpp
lib/CodeGen/SelectionDAG/SelectionDAGBuild.cpp

index 9a2491959dd84c5dd801c19e31525722e8099ca3..12b0b12c40b57304836cc0dabcb9335386dbfdd2 100644 (file)
@@ -362,7 +362,10 @@ bool FastISel::SelectCall(User *I) {
         const TargetInstrDesc &II = TII.get(TargetInstrInfo::DBG_LABEL);
         ID = DW->RecordInlinedFnEnd(Subprogram);
         if (ID)
-          // If ID is 0 then this was not an end of inlined region.
+          // 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.
           BuildMI(MBB, DL, II).addImm(ID);
       } else {
         const TargetInstrDesc &II = TII.get(TargetInstrInfo::DBG_LABEL);
@@ -387,9 +390,14 @@ bool FastISel::SelectCall(User *I) {
       unsigned SrcFile = DW->getOrCreateSourceID(CompileUnit.getDirectory(Dir),
                                                  CompileUnit.getFilename(FN));
 
-      if (!Subprogram.describes(MF.getFunction()) && !PrevLoc.isUnknown()) {
+      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 true;
         // Record the source line.
         unsigned Line = Subprogram.getLineNumber();
         unsigned LabelID = DW->RecordSourceLine(Line, 0, SrcFile);
index 832ad7ef5ae9e8521d0cb1797e29a1c3f3c1a290..5204113b3aa058deb040dbbc48af0c6e257f4d26 100644 (file)
@@ -3966,6 +3966,10 @@ SelectionDAGLowering::visitIntrinsicCall(CallInst &I, unsigned Intrinsic) {
         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 @@ SelectionDAGLowering::visitIntrinsicCall(CallInst &I, unsigned Intrinsic) {
         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);