Avoid leaking CompileUnits in DwarfDebug.cpp.

llvm-svn: 98268
This commit is contained in:
Jeffrey Yasskin 2010-03-11 18:29:55 +00:00
parent 44e51ea41f
commit 0708de1f97
2 changed files with 15 additions and 14 deletions

View File

@ -52,9 +52,9 @@ class CompileUnit {
/// Die - Compile unit debug information entry. /// Die - Compile unit debug information entry.
/// ///
DIE *CUDie; OwningPtr<DIE> CUDie;
/// IndexTyDie - An anonymous type for index type. /// IndexTyDie - An anonymous type for index type. Owned by CUDie.
DIE *IndexTyDie; DIE *IndexTyDie;
/// GVToDieMap - Tracks the mapping of unit level debug informaton /// GVToDieMap - Tracks the mapping of unit level debug informaton
@ -78,11 +78,10 @@ class CompileUnit {
public: public:
CompileUnit(unsigned I, DIE *D) CompileUnit(unsigned I, DIE *D)
: ID(I), CUDie(D), IndexTyDie(0) {} : ID(I), CUDie(D), IndexTyDie(0) {}
~CompileUnit() { delete CUDie; delete IndexTyDie; }
// Accessors. // Accessors.
unsigned getID() const { return ID; } 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*> &getGlobals() const { return Globals; }
const StringMap<DIE*> &getGlobalTypes() const { return GlobalTypes; } const StringMap<DIE*> &getGlobalTypes() const { return GlobalTypes; }
@ -1622,8 +1621,12 @@ DIE *DwarfDebug::getOrCreateNameSpace(DINameSpace NS) {
return NDie; return NDie;
} }
CompileUnit *DwarfDebug::constructCompileUnit(MDNode *N) { void DwarfDebug::constructCompileUnit(MDNode *N) {
DICompileUnit DIUnit(N); DICompileUnit DIUnit(N);
// Use first compile unit marked as isMain as the compile unit for this
// module.
if (ModuleCU || !DIUnit.isMain())
return;
StringRef FN = DIUnit.getFilename(); StringRef FN = DIUnit.getFilename();
StringRef Dir = DIUnit.getDirectory(); StringRef Dir = DIUnit.getDirectory();
unsigned ID = GetOrCreateSourceID(Dir, FN); unsigned ID = GetOrCreateSourceID(Dir, FN);
@ -1653,14 +1656,9 @@ CompileUnit *DwarfDebug::constructCompileUnit(MDNode *N) {
addUInt(Die, dwarf::DW_AT_APPLE_major_runtime_vers, addUInt(Die, dwarf::DW_AT_APPLE_major_runtime_vers,
dwarf::DW_FORM_data1, RVer); dwarf::DW_FORM_data1, RVer);
CompileUnit *Unit = new CompileUnit(ID, Die); assert(!ModuleCU &&
if (!ModuleCU && DIUnit.isMain()) { "ModuleCU assigned since the top of constructCompileUnit");
// Use first compile unit marked as isMain as the compile unit ModuleCU = new CompileUnit(ID, Die);
// for this module.
ModuleCU = Unit;
}
return Unit;
} }
void DwarfDebug::constructGlobalVariableDIE(MDNode *N) { void DwarfDebug::constructGlobalVariableDIE(MDNode *N) {
@ -1898,6 +1896,9 @@ void DwarfDebug::endModule() {
// Emit inline info. // Emit inline info.
emitDebugInlineInfo(); emitDebugInlineInfo();
delete ModuleCU;
ModuleCU = NULL; // Reset for the next Module, if any.
if (TimePassesIsEnabled) if (TimePassesIsEnabled)
DebugTimer->stopTimer(); DebugTimer->stopTimer();
} }

View File

@ -473,7 +473,7 @@ class DwarfDebug : public DwarfPrinter {
/// as well. /// as well.
unsigned GetOrCreateSourceID(StringRef DirName, StringRef FileName); unsigned GetOrCreateSourceID(StringRef DirName, StringRef FileName);
CompileUnit *constructCompileUnit(MDNode *N); void constructCompileUnit(MDNode *N);
void constructGlobalVariableDIE(MDNode *N); void constructGlobalVariableDIE(MDNode *N);