diff options
Diffstat (limited to 'lib/IR/DIBuilder.cpp')
| -rw-r--r-- | lib/IR/DIBuilder.cpp | 91 | 
1 files changed, 48 insertions, 43 deletions
diff --git a/lib/IR/DIBuilder.cpp b/lib/IR/DIBuilder.cpp index c41d84492b865..6a3ff0e8e457a 100644 --- a/lib/IR/DIBuilder.cpp +++ b/lib/IR/DIBuilder.cpp @@ -55,11 +55,10 @@ public:      return HeaderBuilder().concat("0x" + Twine::utohexstr(Tag));    }  }; -} // namespace +}  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 *N) {  }  void DIBuilder::finalize() { -  TempEnumTypes->replaceAllUsesWith(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()); +  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]); +    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,21 +134,11 @@ DICompileUnit *DIBuilder::createCompileUnit(    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); - -  // TODO: Switch to getDistinct().  We never want to merge compile units based -  // on contents. -  DICompileUnit *CUNode = DICompileUnit::get( +  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 @@ -186,6 +177,12 @@ DIImportedEntity *DIBuilder::createImportedModule(DIScope *Context,                                  Context, NS, Line, StringRef(), AllImportedModules);  } +DIImportedEntity *DIBuilder::createImportedModule(DIScope *Context, DIModule *M, +                                                  unsigned Line) { +  return ::createImportedModule(VMContext, dwarf::DW_TAG_imported_module, +                                Context, M, Line, StringRef(), AllImportedModules); +} +  DIImportedEntity *DIBuilder::createImportedDeclaration(DIScope *Context,                                                         DINode *Decl,                                                         unsigned Line, @@ -703,6 +700,14 @@ DINamespace *DIBuilder::createNameSpace(DIScope *Scope, StringRef Name,                            LineNo);  } +DIModule *DIBuilder::createModule(DIScope *Scope, StringRef Name, +                                  StringRef ConfigurationMacros, +                                  StringRef IncludePath, +                                  StringRef ISysRoot) { + return DIModule::get(VMContext, getNonCompileUnitScope(Scope), Name, +                      ConfigurationMacros, IncludePath, ISysRoot); +} +  DILexicalBlockFile *DIBuilder::createLexicalBlockFile(DIScope *Scope,                                                        DIFile *File,                                                        unsigned Discriminator) {  | 
