[llvm-commits] [llvm] r97917 - in /llvm/trunk: include/llvm/ADT/STLExtras.h lib/CodeGen/AsmPrinter/DIE.h lib/CodeGen/AsmPrinter/DwarfDebug.cpp lib/CodeGen/AsmPrinter/DwarfDebug.h

Douglas Gregor dgregor at apple.com
Sun Mar 7 18:58:50 PST 2010


On Mar 7, 2010, at 12:10 PM, Jeffrey Yasskin wrote:

> Author: jyasskin
> Date: Sun Mar  7 11:10:13 2010
> New Revision: 97917
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=97917&view=rev
> Log:
> Roll r97906 forward again, without double-deleting CompileUnit::IndexTyDie.
> 
> Modified:
>    llvm/trunk/include/llvm/ADT/STLExtras.h
>    llvm/trunk/lib/CodeGen/AsmPrinter/DIE.h
>    llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
>    llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.h

This is breaking Clang self-host (Debug) on Darwin, where we get the crash here:

	http://pastebin.com/MYnzHth5



> Modified: llvm/trunk/include/llvm/ADT/STLExtras.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ADT/STLExtras.h?rev=97917&r1=97916&r2=97917&view=diff
> ==============================================================================
> --- llvm/trunk/include/llvm/ADT/STLExtras.h (original)
> +++ llvm/trunk/include/llvm/ADT/STLExtras.h Sun Mar  7 11:10:13 2010
> @@ -279,6 +279,28 @@
>   qsort(&*Start, End-Start, sizeof(*Start), Compare);
> }
> 
> +//===----------------------------------------------------------------------===//
> +//     Extra additions to <algorithm>
> +//===----------------------------------------------------------------------===//
> +
> +/// For a container of pointers, deletes the pointers and then clears the
> +/// container.
> +template<typename Container>
> +void DeleteContainerPointers(Container &C) {
> +  for (typename Container::iterator I = C.begin(), E = C.end(); I != E; ++I)
> +    delete *I;
> +  C.clear();
> +}
> +
> +/// In a container of pairs (usually a map) whose second element is a pointer,
> +/// deletes the second elements and then clears the container.
> +template<typename Container>
> +void DeleteContainerSeconds(Container &C) {
> +  for (typename Container::iterator I = C.begin(), E = C.end(); I != E; ++I)
> +    delete I->second;
> +  C.clear();
> +}
> +
> } // End llvm namespace
> 
> #endif
> 
> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DIE.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DIE.h?rev=97917&r1=97916&r2=97917&view=diff
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/AsmPrinter/DIE.h (original)
> +++ llvm/trunk/lib/CodeGen/AsmPrinter/DIE.h Sun Mar  7 11:10:13 2010
> @@ -112,7 +112,6 @@
>   //===--------------------------------------------------------------------===//
>   /// DIE - A structured debug information entry.  Has an abbreviation which
>   /// describes it's organization.
> -  class CompileUnit;
>   class DIEValue;
> 
>   class DIE {
> @@ -159,7 +158,6 @@
>     void setTag(unsigned Tag) { Abbrev.setTag(Tag); }
>     void setOffset(unsigned O) { Offset = O; }
>     void setSize(unsigned S) { Size = S; }
> -    void setParent(DIE *P) { Parent = P; }
> 
>     /// addValue - Add a value and attributes to a DIE.
>     ///
> @@ -185,7 +183,7 @@
>       }
>       Abbrev.setChildrenFlag(dwarf::DW_CHILDREN_yes);
>       Children.push_back(Child);
> -      Child->setParent(this);
> +      Child->Parent = this;
>     }
> 
> #ifndef NDEBUG
> 
> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp?rev=97917&r1=97916&r2=97917&view=diff
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp (original)
> +++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp Sun Mar  7 11:10:13 2010
> @@ -23,6 +23,7 @@
> #include "llvm/Target/TargetFrameInfo.h"
> #include "llvm/Target/TargetLoweringObjectFile.h"
> #include "llvm/Target/TargetRegisterInfo.h"
> +#include "llvm/ADT/STLExtras.h"
> #include "llvm/ADT/StringExtras.h"
> #include "llvm/Support/Debug.h"
> #include "llvm/Support/ErrorHandling.h"
> @@ -50,9 +51,9 @@
> 
>   /// Die - Compile unit debug information entry.
>   ///
> -  DIE *CUDie;
> +  const OwningPtr<DIE> CUDie;
> 
> -  /// IndexTyDie - An anonymous type for index type.
> +  /// IndexTyDie - An anonymous type for index type.  Owned by CUDie
>   DIE *IndexTyDie;
> 
>   /// GVToDieMap - Tracks the mapping of unit level debug informaton
> @@ -76,11 +77,10 @@
> public:
>   CompileUnit(unsigned I, DIE *D)
>     : ID(I), CUDie(D), IndexTyDie(0) {}
> -  ~CompileUnit() { delete CUDie; delete IndexTyDie; }
> 
>   // Accessors.
>   unsigned getID()                  const { return ID; }
> -  DIE* getCUDie()                   const { return CUDie; }
> +  DIE* getCUDie()                   const { return CUDie.get(); }
>   const StringMap<DIE*> &getGlobals()     const { return Globals; }
>   const StringMap<DIE*> &getGlobalTypes() const { return GlobalTypes; }
> 
> @@ -174,8 +174,10 @@
>   unsigned EndLabelID;                // Label ID of the end of scope.
>   const MachineInstr *LastInsn;       // Last instruction of this scope.
>   const MachineInstr *FirstInsn;      // First instruction of this scope.
> -  SmallVector<DbgScope *, 4> Scopes;  // Scopes defined in scope.
> -  SmallVector<DbgVariable *, 8> Variables;// Variables declared in scope.
> +  // Scopes defined in scope.  Contents not owned.
> +  SmallVector<DbgScope *, 4> Scopes;
> +  // Variables declared in scope.  Contents owned.
> +  SmallVector<DbgVariable *, 8> Variables;
> 
>   // Private state for dump()
>   mutable unsigned IndentLevel;
> @@ -196,8 +198,8 @@
>   MDNode *getScopeNode()         const { return Desc.getNode(); }
>   unsigned getStartLabelID()     const { return StartLabelID; }
>   unsigned getEndLabelID()       const { return EndLabelID; }
> -  SmallVector<DbgScope *, 4> &getScopes() { return Scopes; }
> -  SmallVector<DbgVariable *, 8> &getVariables() { return Variables; }
> +  const SmallVector<DbgScope *, 4> &getScopes() { return Scopes; }
> +  const SmallVector<DbgVariable *, 8> &getVariables() { return Variables; }
>   void setStartLabelID(unsigned S) { StartLabelID = S; }
>   void setEndLabelID(unsigned E)   { EndLabelID = E; }
>   void setLastInsn(const MachineInstr *MI) { LastInsn = MI; }
> @@ -220,14 +222,14 @@
>     assert (getFirstInsn() && "First instruction is missing!");
> 
>     // Use the end of last child scope as end of this scope.
> -    SmallVector<DbgScope *, 4> &Scopes = getScopes();
> +    const SmallVector<DbgScope *, 4> &Scopes = getScopes();
>     const MachineInstr *LastInsn = getFirstInsn();
>     unsigned LIndex = 0;
>     if (Scopes.empty()) {
>       assert (getLastInsn() && "Inner most scope does not have last insn!");
>       return;
>     }
> -    for (SmallVector<DbgScope *, 4>::iterator SI = Scopes.begin(),
> +    for (SmallVector<DbgScope *, 4>::const_iterator SI = Scopes.begin(),
>            SE = Scopes.end(); SI != SE; ++SI) {
>       DbgScope *DS = *SI;
>       DS->fixInstructionMarkers(MIIndexMap);
> @@ -279,8 +281,6 @@
> #endif
> 
> DbgScope::~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];
> }
> @@ -1585,7 +1585,7 @@
>  }
> 
>   // Add variables to scope.
> -  SmallVector<DbgVariable *, 8> &Variables = Scope->getVariables();
> +  const SmallVector<DbgVariable *, 8> &Variables = Scope->getVariables();
>   for (unsigned i = 0, N = Variables.size(); i < N; ++i) {
>     DIE *VariableDIE = constructVariableDIE(Variables[i], Scope);
>     if (VariableDIE)
> @@ -1593,7 +1593,7 @@
>   }
> 
>   // Add nested scopes.
> -  SmallVector<DbgScope *, 4> &Scopes = Scope->getScopes();
> +  const SmallVector<DbgScope *, 4> &Scopes = Scope->getScopes();
>   for (unsigned j = 0, M = Scopes.size(); j < M; ++j) {
>     // Define the Scope debug information entry.
>     DIE *NestedDIE = constructScopeDIE(Scopes[j]);
> @@ -1696,7 +1696,6 @@
>   }
> 
>   CompileUnitMap[DIUnit.getNode()] = Unit;
> -  CompileUnits.push_back(Unit);
>   return Unit;
> }
> 
> @@ -1802,7 +1801,7 @@
>          E = DbgFinder.compile_unit_end(); I != E; ++I)
>     constructCompileUnit(*I);
> 
> -  if (CompileUnits.empty()) {
> +  if (CompileUnitMap.empty()) {
>     if (TimePassesIsEnabled)
>       DebugTimer->stopTimer();
> 
> @@ -1812,7 +1811,7 @@
>   // If main compile unit for this module is not seen than randomly
>   // select first compile unit.
>   if (!ModuleCU)
> -    ModuleCU = CompileUnits[0];
> +    ModuleCU = CompileUnitMap.begin()->second;
> 
>   // Create DIEs for each subprogram.
>   for (DebugInfoFinder::iterator I = DbgFinder.subprogram_begin(),
> @@ -1944,6 +1943,10 @@
>   // Emit inline info.
>   emitDebugInlineInfo();
> 
> +  // Clear debug info in preparation for the next Module.
> +  ModuleCU = NULL;
> +  DeleteContainerSeconds(CompileUnitMap);
> +
>   if (TimePassesIsEnabled)
>     DebugTimer->stopTimer();
> }
> @@ -2114,9 +2117,9 @@
>   while (!WorkList.empty()) {
>     DbgScope *S = WorkList.back(); WorkList.pop_back();
> 
> -    SmallVector<DbgScope *, 4> &Children = S->getScopes();
> +    const SmallVector<DbgScope *, 4> &Children = S->getScopes();
>     if (!Children.empty()) 
> -      for (SmallVector<DbgScope *, 4>::iterator SI = Children.begin(),
> +      for (SmallVector<DbgScope *, 4>::const_iterator SI = Children.begin(),
>              SE = Children.end(); SI != SE; ++SI)
>         WorkList.push_back(*SI);
> 
> @@ -2221,10 +2224,11 @@
> 
>   // Clear debug info
>   CurrentFnDbgScope = NULL;
> -  DbgScopeMap.clear();
> +  DeleteContainerSeconds(DbgScopeMap);
>   DbgScopeBeginMap.clear();
>   DbgScopeEndMap.clear();
>   ConcreteScopes.clear();
> +  DeleteContainerSeconds(AbstractScopes);
>   AbstractScopesList.clear();
>   Lines.clear();
> 
> 
> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.h?rev=97917&r1=97916&r2=97917&view=diff
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.h (original)
> +++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.h Sun Mar  7 11:10:13 2010
> @@ -66,10 +66,6 @@
>   /// compile units.
>   DenseMap<Value *, CompileUnit *> CompileUnitMap;
> 
> -  /// CompileUnits - All the compile units in this module.
> -  ///
> -  SmallVector<CompileUnit *, 8> CompileUnits;
> -
>   /// ModuleCU - All DIEs are inserted in ModuleCU.
>   CompileUnit *ModuleCU;
> 
> @@ -134,7 +130,8 @@
>   //
>   DbgScope *CurrentFnDbgScope;
> 
> -  /// DbgScopeMap - Tracks the scopes in the current function.
> +  /// DbgScopeMap - Tracks the scopes in the current function.  Owns the
> +  /// contained DbgScope*s.
>   ///
>   DenseMap<MDNode *, DbgScope *> DbgScopeMap;
> 
> @@ -143,7 +140,7 @@
>   DenseMap<MDNode *, DbgScope *> ConcreteScopes;
> 
>   /// AbstractScopes - Tracks the abstract scopes a module. These scopes are
> -  /// not included DbgScopeMap.
> +  /// not included DbgScopeMap.  AbstractScopes owns its DbgScope*s.
>   DenseMap<MDNode *, DbgScope *> AbstractScopes;
>   SmallVector<DbgScope *, 4>AbstractScopesList;
> 
> 
> 
> _______________________________________________
> 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