From 9abb538be051d17071e3f5e2322912252fbcd32e Mon Sep 17 00:00:00 2001 From: Douglas Gregor Date: Mon, 8 Mar 2010 02:58:37 +0000 Subject: Revert r97917, which was causing Clang Debug self-host failures. llvm-svn: 97932 --- llvm/include/llvm/ADT/STLExtras.h | 22 --------------- llvm/lib/CodeGen/AsmPrinter/DIE.h | 4 ++- llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp | 44 ++++++++++++++---------------- llvm/lib/CodeGen/AsmPrinter/DwarfDebug.h | 9 ++++-- 4 files changed, 29 insertions(+), 50 deletions(-) diff --git a/llvm/include/llvm/ADT/STLExtras.h b/llvm/include/llvm/ADT/STLExtras.h index 8dbf790..32cf459 100644 --- a/llvm/include/llvm/ADT/STLExtras.h +++ b/llvm/include/llvm/ADT/STLExtras.h @@ -279,28 +279,6 @@ static inline void array_pod_sort(IteratorTy Start, IteratorTy End, qsort(&*Start, End-Start, sizeof(*Start), Compare); } -//===----------------------------------------------------------------------===// -// Extra additions to -//===----------------------------------------------------------------------===// - -/// For a container of pointers, deletes the pointers and then clears the -/// container. -template -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 -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 diff --git a/llvm/lib/CodeGen/AsmPrinter/DIE.h b/llvm/lib/CodeGen/AsmPrinter/DIE.h index 21f5d62..af90289 100644 --- a/llvm/lib/CodeGen/AsmPrinter/DIE.h +++ b/llvm/lib/CodeGen/AsmPrinter/DIE.h @@ -112,6 +112,7 @@ namespace llvm { //===--------------------------------------------------------------------===// /// DIE - A structured debug information entry. Has an abbreviation which /// describes it's organization. + class CompileUnit; class DIEValue; class DIE { @@ -158,6 +159,7 @@ namespace llvm { 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. /// @@ -183,7 +185,7 @@ namespace llvm { } Abbrev.setChildrenFlag(dwarf::DW_CHILDREN_yes); Children.push_back(Child); - Child->Parent = this; + Child->setParent(this); } #ifndef NDEBUG diff --git a/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp b/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp index 6846511..5ad1e5e 100644 --- a/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp +++ b/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp @@ -23,7 +23,6 @@ #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" @@ -51,9 +50,9 @@ class CompileUnit { /// Die - Compile unit debug information entry. /// - const OwningPtr CUDie; + DIE *CUDie; - /// IndexTyDie - An anonymous type for index type. Owned by CUDie + /// IndexTyDie - An anonymous type for index type. DIE *IndexTyDie; /// GVToDieMap - Tracks the mapping of unit level debug informaton @@ -77,10 +76,11 @@ class CompileUnit { 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.get(); } + DIE* getCUDie() const { return CUDie; } const StringMap &getGlobals() const { return Globals; } const StringMap &getGlobalTypes() const { return GlobalTypes; } @@ -174,10 +174,8 @@ class DbgScope { 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. - // Scopes defined in scope. Contents not owned. - SmallVector Scopes; - // Variables declared in scope. Contents owned. - SmallVector Variables; + SmallVector Scopes; // Scopes defined in scope. + SmallVector Variables;// Variables declared in scope. // Private state for dump() mutable unsigned IndentLevel; @@ -198,8 +196,8 @@ public: MDNode *getScopeNode() const { return Desc.getNode(); } unsigned getStartLabelID() const { return StartLabelID; } unsigned getEndLabelID() const { return EndLabelID; } - const SmallVector &getScopes() { return Scopes; } - const SmallVector &getVariables() { return Variables; } + SmallVector &getScopes() { return Scopes; } + SmallVector &getVariables() { return Variables; } void setStartLabelID(unsigned S) { StartLabelID = S; } void setEndLabelID(unsigned E) { EndLabelID = E; } void setLastInsn(const MachineInstr *MI) { LastInsn = MI; } @@ -222,14 +220,14 @@ public: assert (getFirstInsn() && "First instruction is missing!"); // Use the end of last child scope as end of this scope. - const SmallVector &Scopes = getScopes(); + SmallVector &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::const_iterator SI = Scopes.begin(), + for (SmallVector::iterator SI = Scopes.begin(), SE = Scopes.end(); SI != SE; ++SI) { DbgScope *DS = *SI; DS->fixInstructionMarkers(MIIndexMap); @@ -281,6 +279,8 @@ void DbgScope::dump() const { #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 @@ DIE *DwarfDebug::constructScopeDIE(DbgScope *Scope) { } // Add variables to scope. - const SmallVector &Variables = Scope->getVariables(); + SmallVector &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 @@ DIE *DwarfDebug::constructScopeDIE(DbgScope *Scope) { } // Add nested scopes. - const SmallVector &Scopes = Scope->getScopes(); + SmallVector &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,6 +1696,7 @@ CompileUnit *DwarfDebug::constructCompileUnit(MDNode *N) { } CompileUnitMap[DIUnit.getNode()] = Unit; + CompileUnits.push_back(Unit); return Unit; } @@ -1801,7 +1802,7 @@ void DwarfDebug::beginModule(Module *M, MachineModuleInfo *mmi) { E = DbgFinder.compile_unit_end(); I != E; ++I) constructCompileUnit(*I); - if (CompileUnitMap.empty()) { + if (CompileUnits.empty()) { if (TimePassesIsEnabled) DebugTimer->stopTimer(); @@ -1811,7 +1812,7 @@ void DwarfDebug::beginModule(Module *M, MachineModuleInfo *mmi) { // If main compile unit for this module is not seen than randomly // select first compile unit. if (!ModuleCU) - ModuleCU = CompileUnitMap.begin()->second; + ModuleCU = CompileUnits[0]; // Create DIEs for each subprogram. for (DebugInfoFinder::iterator I = DbgFinder.subprogram_begin(), @@ -1943,10 +1944,6 @@ void DwarfDebug::endModule() { // Emit inline info. emitDebugInlineInfo(); - // Clear debug info in preparation for the next Module. - ModuleCU = NULL; - DeleteContainerSeconds(CompileUnitMap); - if (TimePassesIsEnabled) DebugTimer->stopTimer(); } @@ -2117,9 +2114,9 @@ bool DwarfDebug::extractScopeInformation() { while (!WorkList.empty()) { DbgScope *S = WorkList.back(); WorkList.pop_back(); - const SmallVector &Children = S->getScopes(); + SmallVector &Children = S->getScopes(); if (!Children.empty()) - for (SmallVector::const_iterator SI = Children.begin(), + for (SmallVector::iterator SI = Children.begin(), SE = Children.end(); SI != SE; ++SI) WorkList.push_back(*SI); @@ -2224,11 +2221,10 @@ void DwarfDebug::endFunction(const MachineFunction *MF) { // Clear debug info CurrentFnDbgScope = NULL; - DeleteContainerSeconds(DbgScopeMap); + DbgScopeMap.clear(); DbgScopeBeginMap.clear(); DbgScopeEndMap.clear(); ConcreteScopes.clear(); - DeleteContainerSeconds(AbstractScopes); AbstractScopesList.clear(); Lines.clear(); diff --git a/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.h b/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.h index 8d75b1f..55baa92 100644 --- a/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.h +++ b/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.h @@ -66,6 +66,10 @@ class DwarfDebug : public DwarfPrinter { /// compile units. DenseMap CompileUnitMap; + /// CompileUnits - All the compile units in this module. + /// + SmallVector CompileUnits; + /// ModuleCU - All DIEs are inserted in ModuleCU. CompileUnit *ModuleCU; @@ -130,8 +134,7 @@ class DwarfDebug : public DwarfPrinter { // DbgScope *CurrentFnDbgScope; - /// DbgScopeMap - Tracks the scopes in the current function. Owns the - /// contained DbgScope*s. + /// DbgScopeMap - Tracks the scopes in the current function. /// DenseMap DbgScopeMap; @@ -140,7 +143,7 @@ class DwarfDebug : public DwarfPrinter { DenseMap ConcreteScopes; /// AbstractScopes - Tracks the abstract scopes a module. These scopes are - /// not included DbgScopeMap. AbstractScopes owns its DbgScope*s. + /// not included DbgScopeMap. DenseMap AbstractScopes; SmallVectorAbstractScopesList; -- cgit v1.1