[llvm] r241308 - DIBuilder: Now that DICompileUnit is distinct, stop using temporary nodes

Adrian Prantl aprantl at apple.com
Mon Jul 6 09:37:53 PDT 2015


> On Jul 5, 2015, at 3:24 AM, Yaron Keren <yaron.keren at gmail.com> wrote:
> 
> >void replaceEnumTypes(DISubprogramArray N) {
> >void replaceRetainedTypes(DISubprogramArray N) {
> >void replaceImportedEntities(DIGlobalVariableArray N) {
> 
> Shouldn't replaceEnumTypes, replaceRetainedTypes and replaceImportedEntities accept DICompositeTypeArray, DITypeArray and DIImportedEntityArray respectively?
> 

Thanks! r241464.

— adrian

> 
> 2015-07-03 1:32 GMT+03:00 Adrian Prantl <aprantl at apple.com>:
> Author: adrian
> Date: Thu Jul  2 17:32:52 2015
> New Revision: 241308
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=241308&view=rev
> Log:
> DIBuilder: Now that DICompileUnit is distinct, stop using temporary nodes
> for the arrays.
> 
> Modified:
>     llvm/trunk/include/llvm/IR/DIBuilder.h
>     llvm/trunk/include/llvm/IR/DebugInfoMetadata.h
>     llvm/trunk/lib/IR/DIBuilder.cpp
> 
> Modified: llvm/trunk/include/llvm/IR/DIBuilder.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/IR/DIBuilder.h?rev=241308&r1=241307&r2=241308&view=diff
> ==============================================================================
> --- llvm/trunk/include/llvm/IR/DIBuilder.h (original)
> +++ llvm/trunk/include/llvm/IR/DIBuilder.h Thu Jul  2 17:32:52 2015
> @@ -36,14 +36,9 @@ namespace llvm {
>      Module &M;
>      LLVMContext &VMContext;
> 
> -    TempMDTuple TempEnumTypes;
> -    TempMDTuple TempRetainTypes;
> -    TempMDTuple TempSubprograms;
> -    TempMDTuple TempGVs;
> -    TempMDTuple TempImportedModules;
> -
> -    Function *DeclareFn;     // llvm.dbg.declare
> -    Function *ValueFn;       // llvm.dbg.value
> +    DICompileUnit *CUNode;   ///< The one compile unit created by this DIBuiler.
> +    Function *DeclareFn;     ///< llvm.dbg.declare
> +    Function *ValueFn;       ///< llvm.dbg.value
> 
>      SmallVector<Metadata *, 4> AllEnumTypes;
>      /// Track the RetainTypes, since they can be updated later on.
> 
> Modified: llvm/trunk/include/llvm/IR/DebugInfoMetadata.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/IR/DebugInfoMetadata.h?rev=241308&r1=241307&r2=241308&view=diff
> ==============================================================================
> --- llvm/trunk/include/llvm/IR/DebugInfoMetadata.h (original)
> +++ llvm/trunk/include/llvm/IR/DebugInfoMetadata.h Thu Jul  2 17:32:52 2015
> @@ -1085,12 +1085,21 @@ public:
>    /// deleted on a uniquing collision.  In practice, uniquing collisions on \a
>    /// DICompileUnit should be fairly rare.
>    /// @{
> +  void replaceEnumTypes(DISubprogramArray N) {
> +    replaceOperandWith(4, N.get());
> +  }
> +  void replaceRetainedTypes(DISubprogramArray N) {
> +    replaceOperandWith(5, N.get());
> +  }
>    void replaceSubprograms(DISubprogramArray N) {
>      replaceOperandWith(6, N.get());
>    }
>    void replaceGlobalVariables(DIGlobalVariableArray N) {
>      replaceOperandWith(7, N.get());
>    }
> +  void replaceImportedEntities(DIGlobalVariableArray N) {
> +    replaceOperandWith(8, N.get());
> +  }
>    /// @}
> 
>    static bool classof(const Metadata *MD) {
> 
> Modified: llvm/trunk/lib/IR/DIBuilder.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/DIBuilder.cpp?rev=241308&r1=241307&r2=241308&view=diff
> ==============================================================================
> --- llvm/trunk/lib/IR/DIBuilder.cpp (original)
> +++ llvm/trunk/lib/IR/DIBuilder.cpp Thu Jul  2 17:32:52 2015
> @@ -58,8 +58,7 @@ public:
>  }
> 
>  DIBuilder::DIBuilder(Module &m, bool AllowUnresolvedNodes)
> -    : M(m), VMContext(M.getContext()), TempEnumTypes(nullptr),
> -      TempRetainTypes(nullptr), TempSubprograms(nullptr), TempGVs(nullptr),
> +  : M(m), VMContext(M.getContext()), CUNode(nullptr),
>        DeclareFn(nullptr), ValueFn(nullptr),
>        AllowUnresolvedNodes(AllowUnresolvedNodes) {}
> 
> @@ -74,35 +73,37 @@ void DIBuilder::trackIfUnresolved(MDNode
>  }
> 
>  void DIBuilder::finalize() {
> -  TempEnumTypes->replaceAllUsesWith(MDTuple::get(VMContext, AllEnumTypes));
> +  if (CUNode) {
> +    CUNode->replaceEnumTypes(MDTuple::get(VMContext, AllEnumTypes));
> 
> -  SmallVector<Metadata *, 16> RetainValues;
> -  // Declarations and definitions of the same type may be retained. Some
> -  // clients RAUW these pairs, leaving duplicates in the retained types
> -  // list. Use a set to remove the duplicates while we transform the
> -  // TrackingVHs back into Values.
> -  SmallPtrSet<Metadata *, 16> RetainSet;
> -  for (unsigned I = 0, E = AllRetainTypes.size(); I < E; I++)
> -    if (RetainSet.insert(AllRetainTypes[I]).second)
> -      RetainValues.push_back(AllRetainTypes[I]);
> -  TempRetainTypes->replaceAllUsesWith(MDTuple::get(VMContext, RetainValues));
> -
> -  DISubprogramArray SPs = MDTuple::get(VMContext, AllSubprograms);
> -  TempSubprograms->replaceAllUsesWith(SPs.get());
> -  for (auto *SP : SPs) {
> -    if (MDTuple *Temp = SP->getVariables().get()) {
> -      const auto &PV = PreservedVariables.lookup(SP);
> -      SmallVector<Metadata *, 4> Variables(PV.begin(), PV.end());
> -      DINodeArray AV = getOrCreateArray(Variables);
> -      TempMDTuple(Temp)->replaceAllUsesWith(AV.get());
> +    SmallVector<Metadata *, 16> RetainValues;
> +    // Declarations and definitions of the same type may be retained. Some
> +    // clients RAUW these pairs, leaving duplicates in the retained types
> +    // list. Use a set to remove the duplicates while we transform the
> +    // TrackingVHs back into Values.
> +    SmallPtrSet<Metadata *, 16> RetainSet;
> +    for (unsigned I = 0, E = AllRetainTypes.size(); I < E; I++)
> +      if (RetainSet.insert(AllRetainTypes[I]).second)
> +        RetainValues.push_back(AllRetainTypes[I]);
> +    CUNode->replaceRetainedTypes(MDTuple::get(VMContext, RetainValues));
> +
> +    DISubprogramArray SPs = MDTuple::get(VMContext, AllSubprograms);
> +    CUNode->replaceSubprograms(SPs.get());
> +    for (auto *SP : SPs) {
> +      if (MDTuple *Temp = SP->getVariables().get()) {
> +        const auto &PV = PreservedVariables.lookup(SP);
> +        SmallVector<Metadata *, 4> Variables(PV.begin(), PV.end());
> +        DINodeArray AV = getOrCreateArray(Variables);
> +        TempMDTuple(Temp)->replaceAllUsesWith(AV.get());
> +      }
>      }
> -  }
> 
> -  TempGVs->replaceAllUsesWith(MDTuple::get(VMContext, AllGVs));
> +    CUNode->replaceGlobalVariables(MDTuple::get(VMContext, AllGVs));
> 
> -  TempImportedModules->replaceAllUsesWith(MDTuple::get(
> -      VMContext, SmallVector<Metadata *, 16>(AllImportedModules.begin(),
> -                                             AllImportedModules.end())));
> +    CUNode->replaceImportedEntities(MDTuple::get(
> +        VMContext, SmallVector<Metadata *, 16>(AllImportedModules.begin(),
> +                                               AllImportedModules.end())));
> +  }
> 
>    // Now that all temp nodes have been replaced or deleted, resolve remaining
>    // cycles.
> @@ -133,19 +134,11 @@ DICompileUnit *DIBuilder::createCompileU
>    assert(!Filename.empty() &&
>           "Unable to create compile unit without filename");
> 
> -  // TODO: Once we make DICompileUnit distinct, stop using temporaries here
> -  // (just start with operands assigned to nullptr).
> -  TempEnumTypes = MDTuple::getTemporary(VMContext, None);
> -  TempRetainTypes = MDTuple::getTemporary(VMContext, None);
> -  TempSubprograms = MDTuple::getTemporary(VMContext, None);
> -  TempGVs = MDTuple::getTemporary(VMContext, None);
> -  TempImportedModules = MDTuple::getTemporary(VMContext, None);
> -
> -  DICompileUnit *CUNode = DICompileUnit::getDistinct(
> +  assert(!CUNode && "Can only make one compile unit per DIBuilder instance");
> +  CUNode = DICompileUnit::getDistinct(
>        VMContext, Lang, DIFile::get(VMContext, Filename, Directory), Producer,
> -      isOptimized, Flags, RunTimeVer, SplitName, Kind, TempEnumTypes.get(),
> -      TempRetainTypes.get(), TempSubprograms.get(), TempGVs.get(),
> -      TempImportedModules.get(), DWOId);
> +      isOptimized, Flags, RunTimeVer, SplitName, Kind, nullptr,
> +      nullptr, nullptr, nullptr, nullptr, DWOId);
> 
>    // Create a named metadata so that it is easier to find cu in a module.
>    // Note that we only generate this when the caller wants to actually
> 
> 
> _______________________________________________
> 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