[llvm-commits] [llvm] r69116 - in /llvm/trunk: include/llvm/CodeGen/DwarfWriter.h lib/CodeGen/AsmPrinter/AsmPrinter.cpp lib/CodeGen/AsmPrinter/DwarfWriter.cpp lib/CodeGen/SelectionDAG/FastISel.cpp

Nick Lewycky nicholas at mxc.ca
Tue Apr 14 21:56:53 PDT 2009


Hi Devang,

Either this patch or r69115 introduced a new failure in 
test/DebugInfo/2008-11-05-InlinedFuncStart.ll , and given that that the 
other patch didn't claim to affect debug info I'm suspecting this one.

Please investigate.
http://google1.osuosl.org:8011/builders/llvm-x86_64-linux/builds/3218/steps/test/logs/stdio

Nick

Devang Patel wrote:
> Author: dpatel
> Date: Tue Apr 14 19:10:26 2009
> New Revision: 69116
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=69116&view=rev
> Log:
> Construct and emit DW_TAG_inlined_subroutine DIEs for inlined subroutine scopes (only in FastISel mode). 
> 
> Modified:
>     llvm/trunk/include/llvm/CodeGen/DwarfWriter.h
>     llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
>     llvm/trunk/lib/CodeGen/AsmPrinter/DwarfWriter.cpp
>     llvm/trunk/lib/CodeGen/SelectionDAG/FastISel.cpp
> 
> Modified: llvm/trunk/include/llvm/CodeGen/DwarfWriter.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/CodeGen/DwarfWriter.h?rev=69116&r1=69115&r2=69116&view=diff
> 
> ==============================================================================
> --- llvm/trunk/include/llvm/CodeGen/DwarfWriter.h (original)
> +++ llvm/trunk/include/llvm/CodeGen/DwarfWriter.h Tue Apr 14 19:10:26 2009
> @@ -29,11 +29,15 @@
>  class DwarfException;
>  class MachineModuleInfo;
>  class MachineFunction;
> +class MachineInstr;
>  class Value;
>  class Module;
>  class GlobalVariable;
>  class TargetAsmInfo;
>  class raw_ostream;
> +class Instruction;
> +class DISubprogram;
> +class DIVariable;
>  
>  //===----------------------------------------------------------------------===//
>  // DwarfWriter - Emits Dwarf debug and exception handling directives.
> @@ -94,9 +98,6 @@
>    /// RecordRegionStart - Indicate the start of a region.
>    unsigned RecordRegionStart(GlobalVariable *V);
>  
> -  /// RecordRegionStart - Indicate the start of a region.
> -  unsigned RecordRegionStart(GlobalVariable *V, unsigned ID);
> -
>    /// RecordRegionEnd - Indicate the end of a region.
>    unsigned RecordRegionEnd(GlobalVariable *V);
>  
> @@ -105,15 +106,23 @@
>  
>    /// RecordVariable - Indicate the declaration of  a local variable.
>    ///
> -  void RecordVariable(GlobalVariable *GV, unsigned FrameIndex);
> +  void RecordVariable(GlobalVariable *GV, unsigned FrameIndex, 
> +                      const MachineInstr *MI);
>  
>    /// ShouldEmitDwarfDebug - Returns true if Dwarf debugging declarations should
>    /// be emitted.
>    bool ShouldEmitDwarfDebug() const;
>  
> -  //// RecordInlineInfo - Global variable GV is inlined at the location marked
> -  //// by LabelID label.
> -  void RecordInlineInfo(GlobalVariable *GV, unsigned LabelID);
> +  //// RecordInlinedFnStart - Indicate the start of a inlined function.
> +  void RecordInlinedFnStart(Instruction *I, DISubprogram &SP, unsigned LabelID,
> +                            unsigned Src, unsigned Line, unsigned Col);
> +
> +  /// RecordInlinedFnEnd - Indicate the end of inlined subroutine.
> +  unsigned RecordInlinedFnEnd(DISubprogram &SP);
> +
> +  /// RecordVariableScope - Record scope for the variable declared by
> +  /// DeclareMI. DeclareMI must describe TargetInstrInfo::DECLARE.
> +  void RecordVariableScope(DIVariable &DV, const MachineInstr *DeclareMI);
>  };
>  
>  
> 
> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp?rev=69116&r1=69115&r2=69116&view=diff
> 
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp (original)
> +++ llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp Tue Apr 14 19:10:26 2009
> @@ -1532,7 +1532,7 @@
>  void AsmPrinter::printDeclare(const MachineInstr *MI) const {
>    unsigned FI = MI->getOperand(0).getIndex();
>    GlobalValue *GV = MI->getOperand(1).getGlobal();
> -  DW->RecordVariable(cast<GlobalVariable>(GV), FI);
> +  DW->RecordVariable(cast<GlobalVariable>(GV), FI, MI);
>  }
>  
>  /// PrintAsmOperand - Print the specified operand of MI, an INLINEASM
> 
> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfWriter.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfWriter.cpp?rev=69116&r1=69115&r2=69116&view=diff
> 
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfWriter.cpp (original)
> +++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfWriter.cpp Tue Apr 14 19:10:26 2009
> @@ -1140,7 +1140,7 @@
>    DbgScope(DbgScope *P, DIDescriptor D)
>    : Parent(P), Desc(D), StartLabelID(0), EndLabelID(0), Scopes(), Variables()
>    {}
> -  ~DbgScope() {
> +  virtual ~DbgScope() {
>      for (unsigned i = 0, N = Scopes.size(); i < N; ++i) delete Scopes[i];
>      for (unsigned j = 0, M = Variables.size(); j < M; ++j) delete Variables[j];
>    }
> @@ -1162,6 +1162,32 @@
>    /// AddVariable - Add a variable to the scope.
>    ///
>    void AddVariable(DbgVariable *V) { Variables.push_back(V); }
> +
> +  virtual bool isInlinedSubroutine() { return false; }
> +  virtual unsigned getLine()   { assert ( 0 && "Unexpected scope!"); }
> +  virtual unsigned getColumn() { assert ( 0 && "Unexpected scope!"); }
> +  virtual unsigned getFile()   { assert ( 0 && "Unexpected scope!"); }
> +};
> +
> +
> +//===----------------------------------------------------------------------===//
> +/// DbgInlinedSubroutineScope - This class is used to track inlined subroutine
> +/// scope information.
> +///
> +class DbgInlinedSubroutineScope : public DbgScope {
> +  unsigned Src;
> +  unsigned Line;
> +  unsigned Col;
> +public:
> +  DbgInlinedSubroutineScope(DbgScope *P, DIDescriptor D, 
> +                            unsigned S, unsigned L, unsigned C)
> +    : DbgScope(P, D), Src(S), Line(L), Col(C)
> +  {}
> +
> +  unsigned getLine()         { return Line; }
> +  unsigned getColumn()       { return Col; }
> +  unsigned getFile()         { return Src; }
> +  bool isInlinedSubroutine() { return true; }
>  };
>  
>  //===----------------------------------------------------------------------===//
> @@ -1252,10 +1278,17 @@
>    /// DbgScopeMap - Tracks the scopes in the current function.
>    DenseMap<GlobalVariable *, DbgScope *> DbgScopeMap;
>  
> +  /// DbgInlinedScopeMap - Tracks inlined scopes in the current function.
> +  DenseMap<GlobalVariable *, SmallVector<DbgScope *, 2> > DbgInlinedScopeMap;
> +
>    /// InlineInfo - Keep track of inlined functions and their location.
>    /// This information is used to populate debug_inlined section.
>    DenseMap<GlobalVariable *, SmallVector<unsigned, 4> > InlineInfo;
>  
> +  /// InlinedVariableScopes - Scopes information for the inlined subroutine
> +  /// variables.
> +  DenseMap<const MachineInstr *, DbgScope *> InlinedVariableScopes;
> +
>    /// DebugTimer - Timer for the Dwarf debug writer.
>    Timer *DebugTimer;
>    
> @@ -1469,7 +1502,7 @@
>    /// AddDelta - Add a label delta attribute data and value.
>    ///
>    void AddDelta(DIE *Die, unsigned Attribute, unsigned Form,
> -                          const DWLabel &Hi, const DWLabel &Lo) {
> +                const DWLabel &Hi, const DWLabel &Lo) {
>      FoldingSetNodeID ID;
>      DIEDelta::Profile(ID, Hi, Lo);
>      void *Where;
> @@ -1550,7 +1583,7 @@
>    /// AddAddress - Add an address attribute to a die based on the location
>    /// provided.
>    void AddAddress(DIE *Die, unsigned Attribute,
> -                            const MachineLocation &Location) {
> +                  const MachineLocation &Location) {
>      unsigned Reg = RI->getDwarfRegNum(Location.getReg(), false);
>      DIEBlock *Block = new DIEBlock();
>  
> @@ -1933,6 +1966,10 @@
>  
>      if (!SP.isLocalToUnit())
>        AddUInt(SPDie, DW_AT_external, DW_FORM_flag, 1);
> +    
> +    // DW_TAG_inlined_subroutine may refer to this DIE.
> +    DIE *&Slot = DW_Unit->getDieMapSlotFor(SP.getGV());
> +    Slot = SPDie;
>      return SPDie;
>    }
>  
> @@ -1987,33 +2024,39 @@
>      DbgScope *&Slot = DbgScopeMap[V];
>      if (Slot) return Slot;
>  
> -    // FIXME - breaks down when the context is an inlined function.
> -    DIDescriptor ParentDesc;
> -    DIDescriptor Desc(V);
> -
> -    if (Desc.getTag() == dwarf::DW_TAG_lexical_block) {
> -      DIBlock Block(V);
> -      ParentDesc = Block.getContext();
> +    DbgScope *Parent = NULL;
> +    DIBlock Block(V);
> +    if (!Block.isNull()) {
> +      DIDescriptor ParentDesc = Block.getContext();
> +      Parent = 
> +        ParentDesc.isNull() ?  NULL : getOrCreateScope(ParentDesc.getGV());
>      }
> +    Slot = new DbgScope(Parent, DIDescriptor(V));
>  
> -    DbgScope *Parent = ParentDesc.isNull() ? 
> -      NULL : getOrCreateScope(ParentDesc.getGV());
> -    Slot = new DbgScope(Parent, Desc);
> -
> -    if (Parent) {
> +    if (Parent)
>        Parent->AddScope(Slot);
> -    } else if (RootDbgScope) {
> -      // FIXME - Add inlined function scopes to the root so we can delete them
> -      // later.  Long term, handle inlined functions properly.
> -      RootDbgScope->AddScope(Slot);
> -    } else {
> +    else
>        // First function is top level function.
>        RootDbgScope = Slot;
> -    }
>  
>      return Slot;
>    }
>  
> +  /// createInlinedSubroutineScope - Returns the scope associated with the 
> +  /// inlined subroutine.
> +  ///
> +  DbgScope *createInlinedSubroutineScope(DISubprogram SP, unsigned Src, 
> +                                         unsigned Line, unsigned Col) {
> +    DbgScope *Scope = 
> +      new DbgInlinedSubroutineScope(NULL, SP, Src, Line, Col);
> +
> +    // FIXME - Add inlined function scopes to the root so we can delete them
> +    // later.  
> +    assert (RootDbgScope && "Function scope info missing!");
> +    RootDbgScope->AddScope(Scope);
> +    return Scope;
> +  }
> +
>    /// ConstructDbgScope - Construct the components of a scope.
>    ///
>    void ConstructDbgScope(DbgScope *ParentScope,
> @@ -2035,12 +2078,11 @@
>        unsigned StartID = MMI->MappedLabel(Scope->getStartLabelID());
>        unsigned EndID = MMI->MappedLabel(Scope->getEndLabelID());
>  
> -      // Ignore empty scopes.
> +      // Ignore empty scopes. 
> +      // Do not ignore inlined scope even if it does not have any
> +      // variables or scopes.
>        if (StartID == EndID && StartID != 0) continue;
> -
> -      // Do not ignore inlined scope even if it is empty. Inlined scope 
> -      // does not have any parent.
> -      if (Scope->getParent() 
> +      if (!Scope->isInlinedSubroutine()
>            && Scope->getScopes().empty() && Scope->getVariables().empty()) 
>          continue;
>  
> @@ -2048,27 +2090,37 @@
>          // Just add stuff to the parent scope.
>          ConstructDbgScope(Scope, ParentStartID, ParentEndID, ParentDie, Unit);
>        } else {
> -        DIE *ScopeDie = new DIE(DW_TAG_lexical_block);
> -
> -        // Add the scope bounds.
> -        if (StartID) {
> -          AddLabel(ScopeDie, DW_AT_low_pc, DW_FORM_addr,
> -                             DWLabel("label", StartID));
> -        } else {
> -          AddLabel(ScopeDie, DW_AT_low_pc, DW_FORM_addr,
> -                             DWLabel("func_begin", SubprogramCount));
> +        DIE *ScopeDie = NULL;
> +        if (MainCU && TAI->doesDwarfUsesInlineInfoSection()) {
> +          ScopeDie = new DIE(DW_TAG_inlined_subroutine);
> +          DIE *Origin = MainCU->getDieMapSlotFor(Scope->getDesc().getGV());
> +          AddDIEntry(ScopeDie, DW_AT_abstract_origin, DW_FORM_ref4, Origin);
> +          AddUInt(ScopeDie, DW_AT_call_file, 0, Scope->getFile());
> +          AddUInt(ScopeDie, DW_AT_call_line, 0, Scope->getLine());
> +          AddUInt(ScopeDie, DW_AT_call_column, 0, Scope->getColumn());
>          }
> -        if (EndID) {
> -          AddLabel(ScopeDie, DW_AT_high_pc, DW_FORM_addr,
> -                             DWLabel("label", EndID));
> -        } else {
> -          AddLabel(ScopeDie, DW_AT_high_pc, DW_FORM_addr,
> -                             DWLabel("func_end", SubprogramCount));
> -        }
> -
> -        // Add the scope contents.
> -        ConstructDbgScope(Scope, StartID, EndID, ScopeDie, Unit);
> -        ParentDie->AddChild(ScopeDie);
> +        else
> +          ScopeDie = new DIE(DW_TAG_lexical_block);
> +          
> +          // Add the scope bounds.
> +          if (StartID) {
> +            AddLabel(ScopeDie, DW_AT_low_pc, DW_FORM_addr,
> +                     DWLabel("label", StartID));
> +          } else {
> +            AddLabel(ScopeDie, DW_AT_low_pc, DW_FORM_addr,
> +                     DWLabel("func_begin", SubprogramCount));
> +          }
> +          if (EndID) {
> +            AddLabel(ScopeDie, DW_AT_high_pc, DW_FORM_addr,
> +                     DWLabel("label", EndID));
> +          } else {
> +            AddLabel(ScopeDie, DW_AT_high_pc, DW_FORM_addr,
> +                     DWLabel("func_end", SubprogramCount));
> +          }
> +          
> +          // Add the scope contents.
> +          ConstructDbgScope(Scope, StartID, EndID, ScopeDie, Unit);
> +          ParentDie->AddChild(ScopeDie);
>        }
>      }
>    }
> @@ -3286,6 +3338,8 @@
>      if (RootDbgScope) {
>        delete RootDbgScope;
>        DbgScopeMap.clear();
> +      DbgInlinedScopeMap.clear();
> +      InlinedVariableScopes.clear();
>        RootDbgScope = NULL;
>      }
>  
> @@ -3423,20 +3477,6 @@
>      return ID;
>    }
>  
> -  /// RecordRegionStart - Indicate the start of a region.
> -  unsigned RecordRegionStart(GlobalVariable *V, unsigned ID) {
> -    if (TimePassesIsEnabled)
> -      DebugTimer->startTimer();
> -
> -    DbgScope *Scope = getOrCreateScope(V);
> -    if (!Scope->getStartLabelID()) Scope->setStartLabelID(ID);
> -
> -    if (TimePassesIsEnabled)
> -      DebugTimer->stopTimer();
> -
> -    return ID;
> -  }
> -
>    /// RecordRegionEnd - Indicate the end of a region.
>    unsigned RecordRegionEnd(GlobalVariable *V) {
>      if (TimePassesIsEnabled)
> @@ -3453,7 +3493,8 @@
>    }
>  
>    /// RecordVariable - Indicate the declaration of  a local variable.
> -  void RecordVariable(GlobalVariable *GV, unsigned FrameIndex) {
> +  void RecordVariable(GlobalVariable *GV, unsigned FrameIndex,
> +                      const MachineInstr *MI) {
>      if (TimePassesIsEnabled)
>        DebugTimer->startTimer();
>  
> @@ -3465,9 +3506,16 @@
>        DIGlobalVariable DG(GV);
>        Scope = getOrCreateScope(DG.getContext().getGV());
>      } else {
> +      DenseMap<const MachineInstr *, DbgScope *>::iterator 
> +        SI = InlinedVariableScopes.find(MI);
> +      if (SI != InlinedVariableScopes.end())  {
> +        // or GV is an inlined local variable.
> +        Scope = SI->second;
> +      } else {
>        // or GV is a local variable.
> -      DIVariable DV(GV);
> -      Scope = getOrCreateScope(DV.getContext().getGV());
> +        DIVariable DV(GV);
> +        Scope = getOrCreateScope(DV.getContext().getGV());
> +      }
>      }
>  
>      assert(Scope && "Unable to find variable' scope");
> @@ -3478,10 +3526,28 @@
>        DebugTimer->stopTimer();
>    }
>  
> -  //// RecordInlineInfo - Global variable GV is inlined at the location marked
> -  //// by LabelID label.
> -  void RecordInlineInfo(GlobalVariable *GV, unsigned LabelID) {
> +  //// RecordInlinedFnStart - Indicate the start of inlined subroutine.
> +  void RecordInlinedFnStart(Instruction *FSI, DISubprogram &SP, unsigned LabelID,
> +                            unsigned Src, unsigned Line, unsigned Col) {
> +    if (!TAI->doesDwarfUsesInlineInfoSection())
> +      return;
> +
> +    DbgScope *Scope = createInlinedSubroutineScope(SP, Src, Line, Col);
> +    Scope->setStartLabelID(LabelID);
>      MMI->RecordUsedDbgLabel(LabelID);
> +    GlobalVariable *GV = SP.getGV();
> +
> +    DenseMap<GlobalVariable *, SmallVector<DbgScope *, 2> >::iterator
> +      SI = DbgInlinedScopeMap.find(GV);
> +    if (SI == DbgInlinedScopeMap.end()) {
> +      SmallVector<DbgScope *, 2> Scopes;
> +      Scopes.push_back(Scope);
> +      DbgInlinedScopeMap[GV] = Scopes;
> +    } else {
> +      SmallVector<DbgScope *, 2> &Scopes = SI->second;
> +      Scopes.push_back(Scope);
> +    }
> +
>      DenseMap<GlobalVariable *, SmallVector<unsigned, 4> >::iterator
>        I = InlineInfo.find(GV);
>      if (I == InlineInfo.end()) {
> @@ -3494,6 +3560,43 @@
>      SmallVector<unsigned, 4> &Labels = I->second;
>      Labels.push_back(LabelID);
>    }
> +
> +  /// RecordInlinedFnEnd - Indicate the end of inlined subroutine.
> +  unsigned RecordInlinedFnEnd(DISubprogram &SP) {
> +    if (!TAI->doesDwarfUsesInlineInfoSection())
> +      return 0;
> +
> +    GlobalVariable *GV = SP.getGV();
> +    DenseMap<GlobalVariable *, SmallVector<DbgScope *, 2> >::iterator
> +      I = DbgInlinedScopeMap.find(GV);
> +    if (I == DbgInlinedScopeMap.end()) 
> +      return 0;
> +
> +    SmallVector<DbgScope *, 2> &Scopes = I->second;
> +    DbgScope *Scope = Scopes.back(); Scopes.pop_back();
> +    unsigned ID = MMI->NextLabelID();
> +    MMI->RecordUsedDbgLabel(ID);
> +    Scope->setEndLabelID(ID);
> +    return ID;
> +  }
> +
> +  /// RecordVariableScope - Record scope for the variable declared by
> +  /// DeclareMI. DeclareMI must describe TargetInstrInfo::DECLARE.
> +  /// Record scopes for only inlined subroutine variables. Other
> +  /// variables' scopes are determined during RecordVariable().
> +  void RecordVariableScope(DIVariable &DV, const MachineInstr *DeclareMI) {
> +    DISubprogram SP(DV.getContext().getGV());
> +    if (SP.isNull())
> +      return;
> +    DenseMap<GlobalVariable *, SmallVector<DbgScope *, 2> >::iterator
> +      I = DbgInlinedScopeMap.find(SP.getGV());
> +    if (I == DbgInlinedScopeMap.end())
> +      return;
> +
> +    SmallVector<DbgScope *, 2> &Scopes = I->second;
> +    InlinedVariableScopes[DeclareMI] = Scopes.back();
> +  }
> +
>  };
>  
>  //===----------------------------------------------------------------------===//
> @@ -4652,11 +4755,6 @@
>    return DD->RecordRegionStart(V);
>  }
>  
> -/// RecordRegionStart - Indicate the start of a region.
> -unsigned DwarfWriter::RecordRegionStart(GlobalVariable *V, unsigned ID) {
> -  return DD->RecordRegionStart(V, ID);
> -}
> -
>  /// RecordRegionEnd - Indicate the end of a region.
>  unsigned DwarfWriter::RecordRegionEnd(GlobalVariable *V) {
>    return DD->RecordRegionEnd(V);
> @@ -4669,8 +4767,9 @@
>  
>  /// RecordVariable - Indicate the declaration of  a local variable.
>  ///
> -void DwarfWriter::RecordVariable(GlobalVariable *GV, unsigned FrameIndex) {
> -  DD->RecordVariable(GV, FrameIndex);
> +void DwarfWriter::RecordVariable(GlobalVariable *GV, unsigned FrameIndex,
> +                                 const MachineInstr *MI) {
> +  DD->RecordVariable(GV, FrameIndex, MI);
>  }
>  
>  /// ShouldEmitDwarfDebug - Returns true if Dwarf debugging declarations should
> @@ -4679,9 +4778,22 @@
>    return DD->ShouldEmitDwarfDebug();
>  }
>  
> -//// RecordInlineInfo - Global variable GV is inlined at the location marked
> +//// RecordInlinedFnStart - Global variable GV is inlined at the location marked
>  //// by LabelID label.
> -void DwarfWriter::RecordInlineInfo(GlobalVariable *GV, unsigned LabelID) {
> -  DD->RecordInlineInfo(GV, LabelID);
> +void DwarfWriter::RecordInlinedFnStart(Instruction *I, DISubprogram &SP, 
> +                                       unsigned LabelID, unsigned Src, 
> +                                       unsigned Line, unsigned Col) {
> +  DD->RecordInlinedFnStart(I, SP, LabelID, Src, Line, Col);
> +}
> +
> +/// RecordInlinedFnEnd - Indicate the end of inlined subroutine.
> +unsigned DwarfWriter::RecordInlinedFnEnd(DISubprogram &SP) {
> +  return DD->RecordInlinedFnEnd(SP);
> +}
> +
> +/// RecordVariableScope - Record scope for the variable declared by
> +/// DeclareMI. DeclareMI must describe TargetInstrInfo::DECLARE.
> +void DwarfWriter::RecordVariableScope(DIVariable &DV,
> +                                      const MachineInstr *DeclareMI) {
> +  DD->RecordVariableScope(DV, DeclareMI);
>  }
> -
> 
> Modified: llvm/trunk/lib/CodeGen/SelectionDAG/FastISel.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/FastISel.cpp?rev=69116&r1=69115&r2=69116&view=diff
> 
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/SelectionDAG/FastISel.cpp (original)
> +++ llvm/trunk/lib/CodeGen/SelectionDAG/FastISel.cpp Tue Apr 14 19:10:26 2009
> @@ -47,6 +47,7 @@
>  #include "llvm/CodeGen/MachineInstrBuilder.h"
>  #include "llvm/CodeGen/MachineModuleInfo.h"
>  #include "llvm/CodeGen/MachineRegisterInfo.h"
> +#include "llvm/CodeGen/DebugLoc.h"
>  #include "llvm/CodeGen/DwarfWriter.h"
>  #include "llvm/Analysis/DebugInfo.h"
>  #include "llvm/Target/TargetData.h"
> @@ -354,10 +355,18 @@
>    case Intrinsic::dbg_region_end: {
>      DbgRegionEndInst *REI = cast<DbgRegionEndInst>(I);
>      if (DW && DW->ValidDebugInfo(REI->getContext(), true)) {
> -      unsigned ID = 
> -        DW->RecordRegionEnd(cast<GlobalVariable>(REI->getContext()));
> -      const TargetInstrDesc &II = TII.get(TargetInstrInfo::DBG_LABEL);
> -      BuildMI(MBB, DL, II).addImm(ID);
> +     unsigned ID = 0;
> +     DISubprogram Subprogram(cast<GlobalVariable>(REI->getContext()));
> +      if (!Subprogram.describes(MF.getFunction())) {
> +        // This is end of an inlined function.
> +        const TargetInstrDesc &II = TII.get(TargetInstrInfo::DBG_LABEL);
> +        ID = DW->RecordInlinedFnEnd(Subprogram);
> +        BuildMI(MBB, DL, II).addImm(ID);
> +      } else {
> +        const TargetInstrDesc &II = TII.get(TargetInstrInfo::DBG_LABEL);
> +        ID =  DW->RecordRegionEnd(cast<GlobalVariable>(REI->getContext()));
> +        BuildMI(MBB, DL, II).addImm(ID);
> +      }
>      }
>      return true;
>    }
> @@ -369,6 +378,7 @@
>      if (DW->ValidDebugInfo(SP, true)) {
>        // llvm.dbg.func.start implicitly defines a dbg_stoppoint which is what
>        // (most?) gdb expects.
> +      DebugLoc PrevLoc = DL;
>        DISubprogram Subprogram(cast<GlobalVariable>(SP));
>        DICompileUnit CompileUnit = Subprogram.getCompileUnit();
>        std::string Dir, FN;
> @@ -379,17 +389,15 @@
>        unsigned Line = Subprogram.getLineNumber();
>        unsigned LabelID = DW->RecordSourceLine(Line, 0, SrcFile);
>        setCurDebugLoc(DebugLoc::get(MF.getOrCreateDebugLocID(SrcFile, Line, 0)));
> -
> -      std::string SPName;
> -      Subprogram.getLinkageName(SPName);
> -      if (!SPName.empty() 
> -          && strcmp(SPName.c_str(), MF.getFunction()->getNameStart())) {
> -        // This is a beginning of inlined function.
> -        DW->RecordRegionStart(cast<GlobalVariable>(FSI->getSubprogram()), 
> -                              LabelID);
> +      if (!Subprogram.describes(MF.getFunction())) {
> +        // This is a beginning of an inlined function.
>          const TargetInstrDesc &II = TII.get(TargetInstrInfo::DBG_LABEL);
>          BuildMI(MBB, DL, II).addImm(LabelID);
> -        DW->RecordInlineInfo(Subprogram.getGV(), LabelID);
> +        DebugLocTuple PrevLocTpl = MF.getDebugLocTuple(PrevLoc);
> +        DW->RecordInlinedFnStart(FSI, Subprogram, LabelID, 
> +                                 PrevLocTpl.Src,
> +                                 PrevLocTpl.Line,
> +                                 PrevLocTpl.Col);
>        } else {
>          // llvm.dbg.func_start also defines beginning of function scope.
>          DW->RecordRegionStart(cast<GlobalVariable>(FSI->getSubprogram()));
> @@ -419,7 +427,13 @@
>  
>        // Build the DECLARE instruction.
>        const TargetInstrDesc &II = TII.get(TargetInstrInfo::DECLARE);
> -      BuildMI(MBB, DL, II).addFrameIndex(FI).addGlobalAddress(GV);
> +      MachineInstr *DeclareMI 
> +        = BuildMI(MBB, DL, II).addFrameIndex(FI).addGlobalAddress(GV);
> +      DIVariable DV(cast<GlobalVariable>(GV));
> +      if (!DV.isNull()) {
> +        // This is a local variable
> +        DW->RecordVariableScope(DV, DeclareMI);
> +      }
>      }
>      return true;
>    }
> 
> 
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
> 




More information about the llvm-commits mailing list