[llvm-commits] [llvm] r72191 - in /llvm/trunk: include/llvm/CodeGen/DebugLoc.h include/llvm/CodeGen/FastISel.h include/llvm/CodeGen/MachineFunction.h lib/CodeGen/AsmPrinter/AsmPrinter.cpp lib/CodeGen/DebugLoc.cpp lib/CodeGen/MachineFunction.cpp l

Bill Wendling isanbard at gmail.com
Wed May 20 16:54:12 PDT 2009


Argiris,

This is causing this failure during an llvm-gcc bootstrap. Please investigate.

Assertion failed: (!CurScope.isInvalid() && "Mismatched region.end
?"), function ExitDebugScope, file
/Volumes/Sandbox/Buildbot/llvm/full-llvm/build/llvm.src/lib/CodeGen/DebugLoc.cpp,
line 30.
../../llvm-gcc.src/gcc/libgcc2.c:1147: internal compiler error: Abort trap
Please submit a full bug report,
with preprocessed source if appropriate.
See <URL:http://llvm.org/bugs/> for instructions.
make[4]: *** [libgcc/./_umoddi3.o] Error 1
make[4]: *** Waiting for unfinished jobs....
make[3]: *** [stmp-multilib] Error 2
rm fsf-funding.pod gcov.pod gfdl.pod cpp.pod gpl.pod gcc.pod
make[2]: *** [all-stage1-gcc] Error 2
make[1]: *** [stage1-bubble] Error 2
make: *** [all] Error 2

-bw

On Wed, May 20, 2009 at 3:57 PM, Argiris Kirtzidis <akyrtzi at gmail.com> wrote:
> Author: akirtzidis
> Date: Wed May 20 17:57:17 2009
> New Revision: 72191
>
> URL: http://llvm.org/viewvc/llvm-project?rev=72191&view=rev
> Log:
> Introduce DebugScope which gets embedded into the machine instructions' DebugLoc.
> DebugScope refers to a debug region, function or block.
>
> Added:
>    llvm/trunk/lib/CodeGen/DebugLoc.cpp
> Modified:
>    llvm/trunk/include/llvm/CodeGen/DebugLoc.h
>    llvm/trunk/include/llvm/CodeGen/FastISel.h
>    llvm/trunk/include/llvm/CodeGen/MachineFunction.h
>    llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
>    llvm/trunk/lib/CodeGen/MachineFunction.cpp
>    llvm/trunk/lib/CodeGen/SelectionDAG/FastISel.cpp
>    llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuild.cpp
>    llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuild.h
>
> Modified: llvm/trunk/include/llvm/CodeGen/DebugLoc.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/CodeGen/DebugLoc.h?rev=72191&r1=72190&r2=72191&view=diff
>
> ==============================================================================
> --- llvm/trunk/include/llvm/CodeGen/DebugLoc.h (original)
> +++ llvm/trunk/include/llvm/CodeGen/DebugLoc.h Wed May 20 17:57:17 2009
> @@ -20,18 +20,77 @@
>
>  namespace llvm {
>   class GlobalVariable;
> +  class MachineFunction;
>
> -  /// DebugLocTuple - Debug location tuple of filename id, line and column.
> +  /// DebugScope - Debug scope id. This is carried into DebugLocTuple to index
> +  /// into a vector of DebugScopeInfos. Provides the ability to associate a
> +  /// SDNode/MachineInstr with the debug scope that it belongs to.
> +  ///
> +  class DebugScope {
> +    unsigned Idx;
> +
> +  public:
> +    DebugScope() : Idx(~0U) {}  // Defaults to null.
> +
> +    static DebugScope getInvalid()   { DebugScope S; S.Idx = ~0U; return S; }
> +    static DebugScope get(unsigned idx) { DebugScope S; S.Idx = idx; return S; }
> +
> +    unsigned getIndex() const { return Idx; }
> +
> +    /// isInvalid - Return true if it doesn't refer to any scope.
> +    bool isInvalid() const { return Idx == ~0U; }
> +
> +    bool operator==(const DebugScope &DS) const { return Idx == DS.Idx; }
> +    bool operator!=(const DebugScope &DS) const { return !(*this == DS); }
> +  };
> +
> +  /// DebugScopeInfo - Contains info about the scope global variable and the
> +  /// parent debug scope. DebugScope is only a "cookie" that can point to a
> +  /// specific DebugScopeInfo.
> +  ///
> +  struct DebugScopeInfo {
> +    GlobalVariable *GV;
> +    DebugScope Parent;
> +
> +    DebugScopeInfo(GlobalVariable *gv, DebugScope parent)
> +      : GV(gv), Parent(parent) {}
> +    DebugScopeInfo()
> +      : GV(0), Parent(DebugScope::getInvalid()) {}
> +  };
> +
> +  /// DebugScopeTracker - Create and keep track of the debug scope while
> +  /// entering/exiting subprograms and blocks. Used by the instruction
> +  /// selectors.
> +  ///
> +  class DebugScopeTracker {
> +    DebugScope CurScope;
> +
> +  public:
> +    /// getCurScope - The current debug scope that we "entered" through
> +    /// EnterDebugScope.
> +    DebugScope getCurScope() const { return CurScope; }
> +
> +    /// EnterDebugScope - Start a new debug scope. ScopeGV can be a DISubprogram
> +    /// or a DIBlock.
> +    void EnterDebugScope(GlobalVariable *ScopeGV, MachineFunction &MF);
> +
> +    /// ExitDebugScope - "Pop" a DISubprogram or a DIBlock.
> +    void ExitDebugScope(GlobalVariable *ScopeGV, MachineFunction &MF);
> +  };
> +
> +  /// DebugLocTuple - Debug location tuple of a DICompileUnit global variable,
> +  /// debug scope, line and column.
>   ///
>   struct DebugLocTuple {
>     GlobalVariable *CompileUnit;
> +    DebugScope Scope;
>     unsigned Line, Col;
>
> -    DebugLocTuple(GlobalVariable *v, unsigned l, unsigned c)
> -      : CompileUnit(v), Line(l), Col(c) {};
> +    DebugLocTuple(GlobalVariable *v, DebugScope s, unsigned l, unsigned c)
> +      : CompileUnit(v), Scope(s), Line(l), Col(c) {};
>
>     bool operator==(const DebugLocTuple &DLT) const {
> -      return CompileUnit == DLT.CompileUnit &&
> +      return CompileUnit == DLT.CompileUnit && Scope == DLT.Scope &&
>              Line == DLT.Line && Col == DLT.Col;
>     }
>     bool operator!=(const DebugLocTuple &DLT) const {
> @@ -63,18 +122,20 @@
>   // Partially specialize DenseMapInfo for DebugLocTyple.
>   template<>  struct DenseMapInfo<DebugLocTuple> {
>     static inline DebugLocTuple getEmptyKey() {
> -      return DebugLocTuple(0, ~0U, ~0U);
> +      return DebugLocTuple(0, DebugScope::getInvalid(), ~0U, ~0U);
>     }
>     static inline DebugLocTuple getTombstoneKey() {
> -      return DebugLocTuple((GlobalVariable*)~1U, ~1U, ~1U);
> +      return DebugLocTuple((GlobalVariable*)~1U,DebugScope::get(~1U), ~1U, ~1U);
>     }
>     static unsigned getHashValue(const DebugLocTuple &Val) {
>       return DenseMapInfo<GlobalVariable*>::getHashValue(Val.CompileUnit) ^
> +             DenseMapInfo<unsigned>::getHashValue(Val.Scope.getIndex()) ^
>              DenseMapInfo<unsigned>::getHashValue(Val.Line) ^
>              DenseMapInfo<unsigned>::getHashValue(Val.Col);
>     }
>     static bool isEqual(const DebugLocTuple &LHS, const DebugLocTuple &RHS) {
>       return LHS.CompileUnit == RHS.CompileUnit &&
> +             LHS.Scope       == RHS.Scope &&
>              LHS.Line        == RHS.Line &&
>              LHS.Col         == RHS.Col;
>     }
>
> Modified: llvm/trunk/include/llvm/CodeGen/FastISel.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/CodeGen/FastISel.h?rev=72191&r1=72190&r2=72191&view=diff
>
> ==============================================================================
> --- llvm/trunk/include/llvm/CodeGen/FastISel.h (original)
> +++ llvm/trunk/include/llvm/CodeGen/FastISel.h Wed May 20 17:57:17 2009
> @@ -57,6 +57,7 @@
>   MachineFrameInfo &MFI;
>   MachineConstantPool &MCP;
>   DebugLoc DL;
> +  DebugScopeTracker DbgScopeTrack;
>   const TargetMachine &TM;
>   const TargetData &TD;
>   const TargetInstrInfo &TII;
>
> Modified: llvm/trunk/include/llvm/CodeGen/MachineFunction.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/CodeGen/MachineFunction.h?rev=72191&r1=72190&r2=72191&view=diff
>
> ==============================================================================
> --- llvm/trunk/include/llvm/CodeGen/MachineFunction.h (original)
> +++ llvm/trunk/include/llvm/CodeGen/MachineFunction.h Wed May 20 17:57:17 2009
> @@ -111,6 +111,8 @@
>   // Tracks debug locations.
>   DebugLocTracker DebugLocInfo;
>
> +  std::vector<DebugScopeInfo> DbgScopeInfos;
> +
>  public:
>   MachineFunction(const Function *Fn, const TargetMachine &TM);
>   ~MachineFunction();
> @@ -332,7 +334,7 @@
>   /// getOrCreateDebugLocID - Look up the DebugLocTuple index with the given
>   /// source file, line, and column. If none currently exists, create a new
>   /// DebugLocTuple, and insert it into the DebugIdMap.
> -  unsigned getOrCreateDebugLocID(GlobalVariable *CompileUnit,
> +  unsigned getOrCreateDebugLocID(GlobalVariable *CompileUnit, DebugScope Scope,
>                                  unsigned Line, unsigned Col);
>
>   /// getDebugLocTuple - Get the DebugLocTuple for a given DebugLoc object.
> @@ -345,6 +347,12 @@
>   /// setDefaultDebugLoc - Get the default debug location for the machine
>   /// function.
>   void setDefaultDebugLoc(DebugLoc DL) { DefaultDebugLoc = DL; }
> +
> +  /// CreateDebugScope - Create a new debug scope.
> +  DebugScope CreateDebugScope(GlobalVariable *ScopeGV, DebugScope Parent);
> +
> +  /// getDebugScopeInfo - Get the DebugScopeInfo for a given DebugScope object.
> +  const DebugScopeInfo &getDebugScopeInfo(DebugScope DS) const;
>  };
>
>  //===--------------------------------------------------------------------===//
>
> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp?rev=72191&r1=72190&r2=72191&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp (original)
> +++ llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp Wed May 20 17:57:17 2009
> @@ -1311,7 +1311,7 @@
>  void AsmPrinter::processDebugLoc(DebugLoc DL) {
>   if (TAI->doesSupportDebugInformation() && DW->ShouldEmitDwarfDebug()) {
>     if (!DL.isUnknown()) {
> -      static DebugLocTuple PrevDLT(0, ~0U, ~0U);
> +      static DebugLocTuple PrevDLT(0, DebugScope::getInvalid(), ~0U, ~0U);
>       DebugLocTuple CurDLT = MF->getDebugLocTuple(DL);
>
>       if (CurDLT.CompileUnit != 0 && PrevDLT != CurDLT)
>
> Added: llvm/trunk/lib/CodeGen/DebugLoc.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/DebugLoc.cpp?rev=72191&view=auto
>
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/DebugLoc.cpp (added)
> +++ llvm/trunk/lib/CodeGen/DebugLoc.cpp Wed May 20 17:57:17 2009
> @@ -0,0 +1,38 @@
> +//===-- DebugLoc.cpp ------------------------------------------------------===//
> +//
> +//                     The LLVM Compiler Infrastructure
> +//
> +// This file is distributed under the University of Illinois Open Source
> +// License. See LICENSE.TXT for details.
> +//
> +//===----------------------------------------------------------------------===//
> +//
> +// Implementation for DebugScopeTracker.
> +//
> +//===----------------------------------------------------------------------===//
> +
> +#include "llvm/CodeGen/DebugLoc.h"
> +#include "llvm/CodeGen/MachineFunction.h"
> +using namespace llvm;
> +
> +/// EnterDebugScope - Start a new debug scope. ScopeGV can be a DISubprogram
> +/// or a DIBlock.
> +void DebugScopeTracker::EnterDebugScope(GlobalVariable *ScopeGV,
> +                                        MachineFunction &MF) {
> +  assert(ScopeGV && "GlobalVariable for scope is null!");
> +  CurScope = MF.CreateDebugScope(ScopeGV, CurScope);
> +}
> +
> +/// ExitDebugScope - "Pop" a DISubprogram or a DIBlock.
> +void DebugScopeTracker::ExitDebugScope(GlobalVariable *ScopeGV,
> +                                       MachineFunction &MF) {
> +  assert(ScopeGV && "GlobalVariable for scope is null!");
> +  assert(!CurScope.isInvalid() && "Mismatched region.end ?");
> +  // We may have skipped a region.end because it was in an unreachable block.
> +  // Go up the scope chain until we reach the scope that ScopeGV points to.
> +  DebugScopeInfo DSI;
> +  do {
> +    DSI =  MF.getDebugScopeInfo(CurScope);
> +    CurScope = DSI.Parent;
> +  } while (!DSI.Parent.isInvalid() && DSI.GV != ScopeGV);
> +}
>
> Modified: llvm/trunk/lib/CodeGen/MachineFunction.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/MachineFunction.cpp?rev=72191&r1=72190&r2=72191&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/MachineFunction.cpp (original)
> +++ llvm/trunk/lib/CodeGen/MachineFunction.cpp Wed May 20 17:57:17 2009
> @@ -403,8 +403,9 @@
>  /// source file, line, and column. If none currently exists, create a new
>  /// DebugLocTuple, and insert it into the DebugIdMap.
>  unsigned MachineFunction::getOrCreateDebugLocID(GlobalVariable *CompileUnit,
> +                                                DebugScope Scope,
>                                                 unsigned Line, unsigned Col) {
> -  DebugLocTuple Tuple(CompileUnit, Line, Col);
> +  DebugLocTuple Tuple(CompileUnit, Scope, Line, Col);
>   DenseMap<DebugLocTuple, unsigned>::iterator II
>     = DebugLocInfo.DebugIdMap.find(Tuple);
>   if (II != DebugLocInfo.DebugIdMap.end())
> @@ -424,6 +425,21 @@
>   return DebugLocInfo.DebugLocations[Idx];
>  }
>
> +/// CreateDebugScope - Create a new debug scope.
> +DebugScope MachineFunction::CreateDebugScope(GlobalVariable *ScopeGV,
> +                                             DebugScope Parent) {
> +  DbgScopeInfos.push_back(DebugScopeInfo(ScopeGV, Parent));
> +  return DebugScope::get(DbgScopeInfos.size() - 1);
> +}
> +
> +/// getDebugScopeInfo - Get the DebugScopeInfo for a given DebugScope object.
> +const DebugScopeInfo &MachineFunction::getDebugScopeInfo(DebugScope DS) const {
> +  unsigned Idx = DS.getIndex();
> +  assert(Idx < DbgScopeInfos.size() && "Invalid index into debug scopes!");
> +  return DbgScopeInfos[Idx];
> +}
> +
> +
>  //===----------------------------------------------------------------------===//
>  //  MachineFrameInfo implementation
>  //===----------------------------------------------------------------------===//
>
> Modified: llvm/trunk/lib/CodeGen/SelectionDAG/FastISel.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/FastISel.cpp?rev=72191&r1=72190&r2=72191&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/SelectionDAG/FastISel.cpp (original)
> +++ llvm/trunk/lib/CodeGen/SelectionDAG/FastISel.cpp Wed May 20 17:57:17 2009
> @@ -331,17 +331,22 @@
>       DICompileUnit CU(cast<GlobalVariable>(SPI->getContext()));
>       unsigned Line = SPI->getLine();
>       unsigned Col = SPI->getColumn();
> -      unsigned Idx = MF.getOrCreateDebugLocID(CU.getGV(), Line, Col);
> +      unsigned Idx = MF.getOrCreateDebugLocID(CU.getGV(),
> +                                              DbgScopeTrack.getCurScope(),
> +                                              Line, Col);
>       setCurDebugLoc(DebugLoc::get(Idx));
>     }
>     return true;
>   }
>   case Intrinsic::dbg_region_start: {
>     DbgRegionStartInst *RSI = cast<DbgRegionStartInst>(I);
> -    if (DIDescriptor::ValidDebugInfo(RSI->getContext(), CodeGenOpt::None) &&
> -        DW && DW->ShouldEmitDwarfDebug()) {
> -      unsigned ID =
> -        DW->RecordRegionStart(cast<GlobalVariable>(RSI->getContext()));
> +    if (!DIDescriptor::ValidDebugInfo(RSI->getContext(), CodeGenOpt::None))
> +      return true;
> +
> +    GlobalVariable *Rgn = cast<GlobalVariable>(RSI->getContext());
> +    DbgScopeTrack.EnterDebugScope(Rgn, MF);
> +    if (DW && DW->ShouldEmitDwarfDebug()) {
> +      unsigned ID = DW->RecordRegionStart(Rgn);
>       const TargetInstrDesc &II = TII.get(TargetInstrInfo::DBG_LABEL);
>       BuildMI(MBB, DL, II).addImm(ID);
>     }
> @@ -349,10 +354,14 @@
>   }
>   case Intrinsic::dbg_region_end: {
>     DbgRegionEndInst *REI = cast<DbgRegionEndInst>(I);
> -    if (DIDescriptor::ValidDebugInfo(REI->getContext(), CodeGenOpt::None) &&
> -        DW && DW->ShouldEmitDwarfDebug()) {
> +    if (!DIDescriptor::ValidDebugInfo(REI->getContext(), CodeGenOpt::None))
> +      return true;
> +
> +    GlobalVariable *Rgn = cast<GlobalVariable>(REI->getContext());
> +    DbgScopeTrack.ExitDebugScope(Rgn, MF);
> +    if (DW && DW->ShouldEmitDwarfDebug()) {
>      unsigned ID = 0;
> -     DISubprogram Subprogram(cast<GlobalVariable>(REI->getContext()));
> +     DISubprogram Subprogram(Rgn);
>      if (!Subprogram.isNull() && !Subprogram.describes(MF.getFunction())) {
>         // This is end of an inlined function.
>         const TargetInstrDesc &II = TII.get(TargetInstrInfo::DBG_LABEL);
> @@ -382,6 +391,7 @@
>     DebugLoc PrevLoc = DL;
>     DISubprogram Subprogram(cast<GlobalVariable>(SP));
>     DICompileUnit CompileUnit = Subprogram.getCompileUnit();
> +    DbgScopeTrack.EnterDebugScope(Subprogram.getGV(), MF);
>
>     if (!Subprogram.describes(MF.getFunction())) {
>       // This is a beginning of an inlined function.
> @@ -393,8 +403,10 @@
>         return true;
>       // Record the source line.
>       unsigned Line = Subprogram.getLineNumber();
> -      setCurDebugLoc(DebugLoc::get(MF.getOrCreateDebugLocID(
> -                                              CompileUnit.getGV(), Line, 0)));
> +      setCurDebugLoc(
> +        DebugLoc::get(MF.getOrCreateDebugLocID(CompileUnit.getGV(),
> +                                               DbgScopeTrack.getCurScope(),
> +                                               Line, 0)));
>
>       if (DW && DW->ShouldEmitDwarfDebug()) {
>         DebugLocTuple PrevLocTpl = MF.getDebugLocTuple(PrevLoc);
> @@ -408,8 +420,10 @@
>     } else {
>       // Record the source line.
>       unsigned Line = Subprogram.getLineNumber();
> -      MF.setDefaultDebugLoc(DebugLoc::get(MF.getOrCreateDebugLocID(
> -                                              CompileUnit.getGV(), Line, 0)));
> +      MF.setDefaultDebugLoc(
> +        DebugLoc::get(MF.getOrCreateDebugLocID(CompileUnit.getGV(),
> +                                               DbgScopeTrack.getCurScope(),
> +                                               Line, 0)));
>       if (DW && DW->ShouldEmitDwarfDebug()) {
>         // llvm.dbg.func_start also defines beginning of function scope.
>         DW->RecordRegionStart(cast<GlobalVariable>(FSI->getSubprogram()));
>
> Modified: llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuild.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuild.cpp?rev=72191&r1=72190&r2=72191&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuild.cpp (original)
> +++ llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuild.cpp Wed May 20 17:57:17 2009
> @@ -312,6 +312,17 @@
>             !StaticAllocaMap.count(cast<AllocaInst>(I)))
>           InitializeRegForValue(I);
>
> +  // FIXME: PHI instructions currently get an invalid scope. This is because
> +  // tracking of debug scopes is done through a simple mechanism where
> +  // "entering" a scope implies that the scope is entered for the first time.
> +  // If we keep track of debug scopes for the following loop, the PHI
> +  // instructions would get scopes that will not be used again later by the
> +  // instruction selectors.
> +  // Either provide a mechanism to re-enter a previously created scope or wait
> +  // for when the DebugLoc is retrieved from Instruction, in which case the
> +  // current debug scope tracking mechanism will be obsolete.
> +  DebugScope DbgScope;
> +
>   // Create an initial MachineBasicBlock for each LLVM BasicBlock in F.  This
>   // also creates the initial PHI MachineInstrs, though none of the input
>   // operands are populated.
> @@ -337,6 +348,7 @@
>                                              CodeGenOpt::Default)) {
>               DICompileUnit CU(cast<GlobalVariable>(SPI->getContext()));
>               unsigned idx = MF->getOrCreateDebugLocID(CU.getGV(),
> +                                                       DbgScope,
>                                                        SPI->getLine(),
>                                                        SPI->getColumn());
>               DL = DebugLoc::get(idx);
> @@ -352,7 +364,7 @@
>               DISubprogram Subprogram(cast<GlobalVariable>(SP));
>               DICompileUnit CU(Subprogram.getCompileUnit());
>               unsigned Line = Subprogram.getLineNumber();
> -              DL = DebugLoc::get(MF->getOrCreateDebugLocID(CU.getGV(),
> +              DL = DebugLoc::get(MF->getOrCreateDebugLocID(CU.getGV(), DbgScope,
>                                                            Line, 0));
>             }
>
> @@ -3909,7 +3921,9 @@
>       MachineFunction &MF = DAG.getMachineFunction();
>       DICompileUnit CU(cast<GlobalVariable>(SPI.getContext()));
>       DebugLoc Loc = DebugLoc::get(MF.getOrCreateDebugLocID(CU.getGV(),
> -                                              SPI.getLine(), SPI.getColumn()));
> +                                                 DbgScopeTrack.getCurScope(),
> +                                                           SPI.getLine(),
> +                                                           SPI.getColumn()));
>       setCurDebugLoc(Loc);
>
>       if (OptLevel == CodeGenOpt::None)
> @@ -3923,11 +3937,14 @@
>   case Intrinsic::dbg_region_start: {
>     DwarfWriter *DW = DAG.getDwarfWriter();
>     DbgRegionStartInst &RSI = cast<DbgRegionStartInst>(I);
> +    if (!DIDescriptor::ValidDebugInfo(RSI.getContext(), OptLevel))
> +      return 0;
>
> -    if (DIDescriptor::ValidDebugInfo(RSI.getContext(), OptLevel) &&
> -        DW && DW->ShouldEmitDwarfDebug()) {
> -      unsigned LabelID =
> -        DW->RecordRegionStart(cast<GlobalVariable>(RSI.getContext()));
> +    MachineFunction &MF = DAG.getMachineFunction();
> +    GlobalVariable *Rgn = cast<GlobalVariable>(RSI.getContext());
> +    DbgScopeTrack.EnterDebugScope(Rgn, MF);
> +    if (DW && DW->ShouldEmitDwarfDebug()) {
> +      unsigned LabelID = DW->RecordRegionStart(Rgn);
>       DAG.setRoot(DAG.getLabel(ISD::DBG_LABEL, getCurDebugLoc(),
>                                getRoot(), LabelID));
>     }
> @@ -3937,11 +3954,14 @@
>   case Intrinsic::dbg_region_end: {
>     DwarfWriter *DW = DAG.getDwarfWriter();
>     DbgRegionEndInst &REI = cast<DbgRegionEndInst>(I);
> +    if (!DIDescriptor::ValidDebugInfo(REI.getContext(), OptLevel))
> +      return 0;
>
> -    if (DIDescriptor::ValidDebugInfo(REI.getContext(), OptLevel) &&
> -        DW && DW->ShouldEmitDwarfDebug()) {
> -      MachineFunction &MF = DAG.getMachineFunction();
> -      DISubprogram Subprogram(cast<GlobalVariable>(REI.getContext()));
> +    MachineFunction &MF = DAG.getMachineFunction();
> +    GlobalVariable *Rgn = cast<GlobalVariable>(REI.getContext());
> +    DbgScopeTrack.ExitDebugScope(Rgn, MF);
> +    if (DW && DW->ShouldEmitDwarfDebug()) {
> +      DISubprogram Subprogram(Rgn);
>
>       if (Subprogram.isNull() || Subprogram.describes(MF.getFunction())) {
>         unsigned LabelID =
> @@ -3974,6 +3994,7 @@
>       return 0;
>
>     MachineFunction &MF = DAG.getMachineFunction();
> +    DbgScopeTrack.EnterDebugScope(cast<GlobalVariable>(SP), MF);
>     if (OptLevel == CodeGenOpt::None) {
>       // llvm.dbg.func.start implicitly defines a dbg_stoppoint which is what
>       // (most?) gdb expects.
> @@ -3993,7 +4014,9 @@
>         // Record the source line.
>         unsigned Line = Subprogram.getLineNumber();
>         setCurDebugLoc(DebugLoc::get(
> -                     MF.getOrCreateDebugLocID(CompileUnit.getGV(), Line, 0)));
> +                     MF.getOrCreateDebugLocID(CompileUnit.getGV(),
> +                                              DbgScopeTrack.getCurScope(),
> +                                              Line, 0)));
>
>         if (DW && DW->ShouldEmitDwarfDebug()) {
>           DebugLocTuple PrevLocTpl = MF.getDebugLocTuple(PrevLoc);
> @@ -4008,7 +4031,9 @@
>         // Record the source line.
>         unsigned Line = Subprogram.getLineNumber();
>         MF.setDefaultDebugLoc(DebugLoc::get(
> -                     MF.getOrCreateDebugLocID(CompileUnit.getGV(), Line, 0)));
> +                     MF.getOrCreateDebugLocID(CompileUnit.getGV(),
> +                                              DbgScopeTrack.getCurScope(),
> +                                              Line, 0)));
>         if (DW && DW->ShouldEmitDwarfDebug()) {
>           // llvm.dbg.func_start also defines beginning of function scope.
>           DW->RecordRegionStart(cast<GlobalVariable>(FSI.getSubprogram()));
> @@ -4035,7 +4060,9 @@
>       // create a label if this is a beginning of inlined function.
>       unsigned Line = Subprogram.getLineNumber();
>       setCurDebugLoc(DebugLoc::get(
> -                     MF.getOrCreateDebugLocID(CompileUnit.getGV(), Line, 0)));
> +                     MF.getOrCreateDebugLocID(CompileUnit.getGV(),
> +                                              DbgScopeTrack.getCurScope(),
> +                                              Line, 0)));
>       // FIXME -  Start new region because llvm.dbg.func_start also defines
>       // beginning of function scope.
>     }
>
> Modified: llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuild.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuild.h?rev=72191&r1=72190&r2=72191&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuild.h (original)
> +++ llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuild.h Wed May 20 17:57:17 2009
> @@ -169,6 +169,8 @@
>   /// CurDebugLoc - current file + line number.  Changes as we build the DAG.
>   DebugLoc CurDebugLoc;
>
> +  DebugScopeTracker DbgScopeTrack;
> +
>   DenseMap<const Value*, SDValue> NodeMap;
>
>   /// PendingLoads - Loads are not emitted to the program immediately.  We bunch
>
>
> _______________________________________________
> 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