diff options
| author | Devang Patel <dpatel@apple.com> | 2009-04-16 02:33:41 +0000 | 
|---|---|---|
| committer | Devang Patel <dpatel@apple.com> | 2009-04-16 02:33:41 +0000 | 
| commit | 653dee08849edc5f4b5575a670d3d0ed2e077f6f (patch) | |
| tree | f8516590fc432009946f9f1eb1846af994981ef1 /llvm/lib | |
| parent | 46b04e4d067456c4964925a714168aac956ae681 (diff) | |
| download | bcm5719-llvm-653dee08849edc5f4b5575a670d3d0ed2e077f6f.tar.gz bcm5719-llvm-653dee08849edc5f4b5575a670d3d0ed2e077f6f.zip | |
In -fast mode do what FastISel does.
This code could use some refactoring help!
llvm-svn: 69254
Diffstat (limited to 'llvm/lib')
| -rw-r--r-- | llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuild.cpp | 95 | ||||
| -rw-r--r-- | llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp | 6 | 
2 files changed, 71 insertions, 30 deletions
| diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuild.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuild.cpp index 96fae4d3eec..90e12ddeefe 100644 --- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuild.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuild.cpp @@ -3961,8 +3961,14 @@ SelectionDAGLowering::visitIntrinsicCall(CallInst &I, unsigned Intrinsic) {        Subprogram.getLinkageName(SPName);        if (!SPName.empty()             && strcmp(SPName.c_str(), MF.getFunction()->getNameStart())) { -        // This is end of inlined function. Debugging information for -        // inlined function is not handled yet (only supported by FastISel). +          // This is end of inlined function. Debugging information for +          // inlined function is not handled yet (only supported by FastISel). +        if (Fast) { +          unsigned ID = DW->RecordInlinedFnEnd(Subprogram); +          if (ID != 0) +            DAG.setRoot(DAG.getLabel(ISD::DBG_LABEL, getCurDebugLoc(),  +                                     getRoot(), ID)); +        }          return 0;        } @@ -3980,38 +3986,67 @@ SelectionDAGLowering::visitIntrinsicCall(CallInst &I, unsigned Intrinsic) {      DbgFuncStartInst &FSI = cast<DbgFuncStartInst>(I);      Value *SP = FSI.getSubprogram();      if (SP && DW->ValidDebugInfo(SP, Fast)) { -      // llvm.dbg.func.start implicitly defines a dbg_stoppoint which is -      // what (most?) gdb expects. -      MachineFunction &MF = DAG.getMachineFunction(); -      DISubprogram Subprogram(cast<GlobalVariable>(SP)); - -      std::string SPName; -      Subprogram.getLinkageName(SPName); -      if (!SPName.empty()  -          && strcmp(SPName.c_str(), MF.getFunction()->getNameStart())) { -        // This is beginning of inlined function. Debugging information for -        // inlined function is not handled yet (only supported by FastISel). -        return 0; -      } - -      DICompileUnit CompileUnit = Subprogram.getCompileUnit(); -      std::string Dir, FN; -      unsigned SrcFile = DW->getOrCreateSourceID(CompileUnit.getDirectory(Dir), -                                                 CompileUnit.getFilename(FN)); - -      // Record the source line but does not create a label for the normal -      // function start. It will be emitted at asm emission time. However, -      // create a label if this is a beginning of inlined function. -      unsigned Line = Subprogram.getLineNumber(); - +        MachineFunction &MF = DAG.getMachineFunction();        if (Fast) { -        unsigned LabelID = DW->RecordSourceLine(Line, 0, SrcFile); -        if (DW->getRecordSourceLineCount() != 1) +        // llvm.dbg.func.start implicitly defines a dbg_stoppoint which is what +        // (most?) gdb expects. +        DebugLoc PrevLoc = CurDebugLoc; +        DISubprogram Subprogram(cast<GlobalVariable>(SP)); +        DICompileUnit CompileUnit = Subprogram.getCompileUnit(); +        std::string Dir, FN; +        unsigned SrcFile = DW->getOrCreateSourceID(CompileUnit.getDirectory(Dir), +                                                   CompileUnit.getFilename(FN)); +         +        if (!Subprogram.describes(MF.getFunction())) { +          // This is a beginning of an inlined function. + +          // Record the source line. +          unsigned Line = Subprogram.getLineNumber(); +          unsigned LabelID = DW->RecordSourceLine(Line, 0, SrcFile); +          setCurDebugLoc(DebugLoc::get(MF.getOrCreateDebugLocID(SrcFile, Line, 0))); +            DAG.setRoot(DAG.getLabel(ISD::DBG_LABEL, getCurDebugLoc(),                                     getRoot(), LabelID)); -      } +          DebugLocTuple PrevLocTpl = MF.getDebugLocTuple(PrevLoc); +          DW->RecordInlinedFnStart(&FSI, Subprogram, LabelID,  +                                   PrevLocTpl.Src, +                                   PrevLocTpl.Line, +                                   PrevLocTpl.Col); +        } else { +          // Record the source line. +          unsigned Line = Subprogram.getLineNumber(); +          setCurDebugLoc(DebugLoc::get(MF.getOrCreateDebugLocID(SrcFile, Line, 0))); -      setCurDebugLoc(DebugLoc::get(MF.getOrCreateDebugLocID(SrcFile, Line, 0))); +          // llvm.dbg.func_start also defines beginning of function scope. +          DW->RecordRegionStart(cast<GlobalVariable>(FSI.getSubprogram())); +        } +      } else { +        DISubprogram Subprogram(cast<GlobalVariable>(SP)); +         +        std::string SPName; +        Subprogram.getLinkageName(SPName); +        if (!SPName.empty()  +            && strcmp(SPName.c_str(), MF.getFunction()->getNameStart())) { +          // This is beginning of inlined function. Debugging information for +          // inlined function is not handled yet (only supported by FastISel). +          return 0; +        } + +        // llvm.dbg.func.start implicitly defines a dbg_stoppoint which is +        // what (most?) gdb expects. +        DICompileUnit CompileUnit = Subprogram.getCompileUnit(); +        std::string Dir, FN; +        unsigned SrcFile = DW->getOrCreateSourceID(CompileUnit.getDirectory(Dir), +                                                   CompileUnit.getFilename(FN)); +         +        // Record the source line but does not create a label for the normal +        // function start. It will be emitted at asm emission time. However, +        // create a label if this is a beginning of inlined function. +        unsigned Line = Subprogram.getLineNumber(); +        setCurDebugLoc(DebugLoc::get(MF.getOrCreateDebugLocID(SrcFile, Line, 0))); +        // FIXME -  Start new region because llvm.dbg.func_start also defines  +        // beginning of function scope. +      }      }      return 0; diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp index 7343b838b1e..49ff4f2a5d5 100644 --- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp @@ -296,6 +296,12 @@ bool SelectionDAGISel::runOnFunction(Function &Fn) {    assert((!EnableFastISelAbort || EnableFastISel) &&           "-fast-isel-abort requires -fast-isel"); +  // Do not codegen any 'available_externally' functions at all, they have +  // definitions outside the translation unit. +  if (Fn.hasAvailableExternallyLinkage()) +    return false; + +    // Get alias analysis for load/store combining.    AA = &getAnalysis<AliasAnalysis>(); | 

