[llvm-commits] [llvm] r97990 - in /llvm/trunk: include/llvm/Analysis/DebugInfo.h lib/Analysis/DebugInfo.cpp lib/CodeGen/AsmPrinter/DwarfDebug.cpp lib/CodeGen/AsmPrinter/DwarfDebug.h

Jeffrey Yasskin jyasskin at google.com
Tue Mar 9 10:54:07 PST 2010


Now that nothing uses the result of constructCompileUnit() unless it
assigns the ModuleCU, can we just bail early when !DIUnit.isMain() and
avoid new'ing the DIE and CompileUnit? Then, if we delete ModuleCU in
endModule(), this memory leak would go away.

On Mon, Mar 8, 2010 at 2:02 PM, Devang Patel <dpatel at apple.com> wrote:
> Author: dpatel
> Date: Mon Mar  8 16:02:50 2010
> New Revision: 97990
>
> URL: http://llvm.org/viewvc/llvm-project?rev=97990&view=rev
> Log:
> Derive DIType from DIScope. This simplifies getContext() where for members the context is a type. This also eliminates need of CompileUnitMaps maintained by dwarf writer.
>
> Modified:
>    llvm/trunk/include/llvm/Analysis/DebugInfo.h
>    llvm/trunk/lib/Analysis/DebugInfo.cpp
>    llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
>    llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.h
>
> Modified: llvm/trunk/include/llvm/Analysis/DebugInfo.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/DebugInfo.h?rev=97990&r1=97989&r2=97990&view=diff
> ==============================================================================
> --- llvm/trunk/include/llvm/Analysis/DebugInfo.h (original)
> +++ llvm/trunk/include/llvm/Analysis/DebugInfo.h Mon Mar  8 16:02:50 2010
> @@ -172,7 +172,7 @@
>   /// DIType - This is a wrapper for a type.
>   /// FIXME: Types should be factored much better so that CV qualifiers and
>   /// others do not require a huge and empty descriptor full of zeros.
> -  class DIType : public DIDescriptor {
> +  class DIType : public DIScope {
>   public:
>     enum {
>       FlagPrivate          = 1 << 0,
> @@ -188,7 +188,7 @@
>   protected:
>     // This ctor is used when the Tag has already been validated by a derived
>     // ctor.
> -    DIType(MDNode *N, bool, bool) : DIDescriptor(N) {}
> +    DIType(MDNode *N, bool, bool) : DIScope(N) {}
>
>   public:
>
> @@ -199,7 +199,7 @@
>     explicit DIType() {}
>     virtual ~DIType() {}
>
> -    DIDescriptor getContext() const     { return getDescriptorField(1); }
> +    DIScope getContext() const          { return getFieldAs<DIScope>(1); }
>     StringRef getName() const           { return getStringField(2);     }
>     DICompileUnit getCompileUnit() const{ return getFieldAs<DICompileUnit>(3); }
>     unsigned getLineNumber() const      { return getUnsignedField(4); }
> @@ -234,6 +234,8 @@
>     bool isValid() const {
>       return DbgNode && (isBasicType() || isDerivedType() || isCompositeType());
>     }
> +    StringRef getFilename() const    { return getCompileUnit().getFilename();}
> +    StringRef getDirectory() const   { return getCompileUnit().getDirectory();}
>     /// dump - print type.
>     void dump() const;
>   };
> @@ -305,7 +307,7 @@
>   public:
>     virtual ~DIGlobal() {}
>
> -    DIDescriptor getContext() const     { return getDescriptorField(2); }
> +    DIScope getContext() const          { return getFieldAs<DIScope>(2); }
>     StringRef getName() const         { return getStringField(3); }
>     StringRef getDisplayName() const  { return getStringField(4); }
>     StringRef getLinkageName() const  { return getStringField(5); }
> @@ -327,7 +329,7 @@
>   public:
>     explicit DISubprogram(MDNode *N = 0) : DIScope(N) {}
>
> -    DIDescriptor getContext() const     { return getDescriptorField(2); }
> +    DIScope getContext() const          { return getFieldAs<DIScope>(2); }
>     StringRef getName() const         { return getStringField(3); }
>     StringRef getDisplayName() const  { return getStringField(4); }
>     StringRef getLinkageName() const  { return getStringField(5); }
> @@ -396,8 +398,8 @@
>     explicit DIVariable(MDNode *N = 0)
>       : DIDescriptor(N) {}
>
> -    DIDescriptor getContext() const { return getDescriptorField(1); }
> -    StringRef getName() const     { return getStringField(2);     }
> +    DIScope getContext() const          { return getFieldAs<DIScope>(1); }
> +    StringRef getName() const           { return getStringField(2);     }
>     DICompileUnit getCompileUnit() const{ return getFieldAs<DICompileUnit>(3); }
>     unsigned getLineNumber() const      { return getUnsignedField(4); }
>     DIType getType() const              { return getFieldAs<DIType>(5); }
>
> Modified: llvm/trunk/lib/Analysis/DebugInfo.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/DebugInfo.cpp?rev=97990&r1=97989&r2=97990&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Analysis/DebugInfo.cpp (original)
> +++ llvm/trunk/lib/Analysis/DebugInfo.cpp Mon Mar  8 16:02:50 2010
> @@ -243,7 +243,7 @@
>  // Simple Descriptor Constructors and other Methods
>  //===----------------------------------------------------------------------===//
>
> -DIType::DIType(MDNode *N) : DIDescriptor(N) {
> +DIType::DIType(MDNode *N) : DIScope(N) {
>   if (!N) return;
>   if (!isBasicType() && !isDerivedType() && !isCompositeType()) {
>     DbgNode = 0;
> @@ -412,6 +412,8 @@
>  }
>
>  StringRef DIScope::getFilename() const {
> +  if (!DbgNode)
> +    return StringRef();
>   if (isLexicalBlock())
>     return DILexicalBlock(DbgNode).getFilename();
>   if (isSubprogram())
> @@ -420,11 +422,15 @@
>     return DICompileUnit(DbgNode).getFilename();
>   if (isNameSpace())
>     return DINameSpace(DbgNode).getFilename();
> +  if (isType())
> +    return DIType(DbgNode).getFilename();
>   assert(0 && "Invalid DIScope!");
>   return StringRef();
>  }
>
>  StringRef DIScope::getDirectory() const {
> +  if (!DbgNode)
> +    return StringRef();
>   if (isLexicalBlock())
>     return DILexicalBlock(DbgNode).getDirectory();
>   if (isSubprogram())
> @@ -433,6 +439,8 @@
>     return DICompileUnit(DbgNode).getDirectory();
>   if (isNameSpace())
>     return DINameSpace(DbgNode).getDirectory();
> +  if (isType())
> +    return DIType(DbgNode).getDirectory();
>   assert(0 && "Invalid DIScope!");
>   return StringRef();
>  }
>
> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp?rev=97990&r1=97989&r2=97990&view=diff
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp (original)
> +++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp Mon Mar  8 16:02:50 2010
> @@ -417,7 +417,8 @@
>     return;
>
>   unsigned Line = V->getLineNumber();
> -  unsigned FileID = findCompileUnit(V->getCompileUnit())->getID();
> +  unsigned FileID = GetOrCreateSourceID(V->getContext().getDirectory(),
> +                                        V->getContext().getFilename());
>   assert(FileID && "Invalid file id");
>   addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
>   addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
> @@ -431,7 +432,8 @@
>     return;
>
>   unsigned Line = G->getLineNumber();
> -  unsigned FileID = findCompileUnit(G->getCompileUnit())->getID();
> +  unsigned FileID = GetOrCreateSourceID(G->getContext().getDirectory(),
> +                                        G->getContext().getFilename());
>   assert(FileID && "Invalid file id");
>   addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
>   addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
> @@ -447,9 +449,11 @@
>   if (SP->getLineNumber() == 0)
>     return;
>
> -
>   unsigned Line = SP->getLineNumber();
> -  unsigned FileID = findCompileUnit(SP->getCompileUnit())->getID();
> +  if (!SP->getContext().Verify())
> +    return;
> +  unsigned FileID = GetOrCreateSourceID(SP->getContext().getDirectory(),
> +                                        SP->getContext().getFilename());
>   assert(FileID && "Invalid file id");
>   addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
>   addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
> @@ -464,7 +468,10 @@
>     return;
>
>   unsigned Line = Ty->getLineNumber();
> -  unsigned FileID = findCompileUnit(CU)->getID();
> +  if (!Ty->getContext().Verify())
> +    return;
> +  unsigned FileID = GetOrCreateSourceID(Ty->getContext().getDirectory(),
> +                                        Ty->getContext().getFilename());
>   assert(FileID && "Invalid file id");
>   addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID);
>   addUInt(Die, dwarf::DW_AT_decl_line, 0, Line);
> @@ -1233,16 +1240,6 @@
>   return SPDie;
>  }
>
> -/// findCompileUnit - Get the compile unit for the given descriptor.
> -///
> -CompileUnit *DwarfDebug::findCompileUnit(DICompileUnit Unit) {
> -  DenseMap<Value *, CompileUnit *>::const_iterator I =
> -    CompileUnitMap.find(Unit.getNode());
> -  if (I == CompileUnitMap.end())
> -    return constructCompileUnit(Unit.getNode());
> -  return I->second;
> -}
> -
>  /// getUpdatedDbgScope - Find or create DbgScope assicated with the instruction.
>  /// Initialize scope and update scope hierarchy.
>  DbgScope *DwarfDebug::getUpdatedDbgScope(MDNode *N, const MachineInstr *MI,
> @@ -1676,8 +1673,6 @@
>     ModuleCU = Unit;
>   }
>
> -  CompileUnitMap[DIUnit.getNode()] = Unit;
> -  CompileUnits.push_back(Unit);
>   return Unit;
>  }
>
> @@ -1783,17 +1778,8 @@
>          E = DbgFinder.compile_unit_end(); I != E; ++I)
>     constructCompileUnit(*I);
>
> -  if (CompileUnits.empty()) {
> -    if (TimePassesIsEnabled)
> -      DebugTimer->stopTimer();
> -
> -    return;
> -  }
> -
> -  // If main compile unit for this module is not seen than randomly
> -  // select first compile unit.
>   if (!ModuleCU)
> -    ModuleCU = CompileUnits[0];
> +    return;
>
>   // Create DIEs for each subprogram.
>   for (DebugInfoFinder::iterator I = DbgFinder.subprogram_begin(),
>
> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.h?rev=97990&r1=97989&r2=97990&view=diff
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.h (original)
> +++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.h Mon Mar  8 16:02:50 2010
> @@ -62,14 +62,6 @@
>   // Attributes used to construct specific Dwarf sections.
>   //
>
> -  /// CompileUnitMap - A map of global variables representing compile units to
> -  /// 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;
>
> @@ -357,10 +349,6 @@
>   /// createSubprogramDIE - Create new DIE using SP.
>   DIE *createSubprogramDIE(const DISubprogram &SP, bool MakeDecl = false);
>
> -  /// findCompileUnit - Get the compile unit for the given descriptor.
> -  ///
> -  CompileUnit *findCompileUnit(DICompileUnit Unit);
> -
>   /// getUpdatedDbgScope - Find or create DbgScope assicated with
>   /// the instruction. Initialize scope and update scope hierarchy.
>   DbgScope *getUpdatedDbgScope(MDNode *N, const MachineInstr *MI, MDNode *InlinedAt);
>
>
> _______________________________________________
> 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