diff options
Diffstat (limited to 'llvm/lib')
| -rw-r--r-- | llvm/lib/CodeGen/SelectionDAG/FastISel.cpp | 12 | ||||
| -rw-r--r-- | llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuild.cpp | 10 | 
2 files changed, 20 insertions, 2 deletions
diff --git a/llvm/lib/CodeGen/SelectionDAG/FastISel.cpp b/llvm/lib/CodeGen/SelectionDAG/FastISel.cpp index 9a2491959dd..12b0b12c40b 100644 --- a/llvm/lib/CodeGen/SelectionDAG/FastISel.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/FastISel.cpp @@ -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); diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuild.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuild.cpp index 832ad7ef5ae..5204113b3aa 100644 --- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuild.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuild.cpp @@ -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);  | 

