Index: lib/IR/DIBuilder.cpp =================================================================== --- lib/IR/DIBuilder.cpp +++ lib/IR/DIBuilder.cpp @@ -119,10 +119,16 @@ if (!AllGVs.empty()) CUNode->replaceGlobalVariables(MDTuple::get(VMContext, AllGVs)); - if (!AllImportedModules.empty()) - CUNode->replaceImportedEntities(MDTuple::get( - VMContext, SmallVector(AllImportedModules.begin(), - AllImportedModules.end()))); + // Create imported entities list without duplications. + SmallVector ImportedModules; + SmallPtrSet AlreadyImported; + std::remove_copy_if(AllImportedModules.begin(), AllImportedModules.end(), + std::back_inserter(ImportedModules), + [&AlreadyImported](TrackingMDNodeRef &Ref) { + return !AlreadyImported.insert(Ref.get()).second; + }); + if (!ImportedModules.empty()) + CUNode->replaceImportedEntities(MDTuple::get(VMContext, ImportedModules)); // Now that all temp nodes have been replaced or deleted, resolve remaining // cycles. @@ -170,12 +176,8 @@ createImportedModule(LLVMContext &C, dwarf::Tag Tag, DIScope *Context, Metadata *NS, unsigned Line, StringRef Name, SmallVectorImpl &AllImportedModules) { - unsigned EntitiesCount = C.pImpl->DIImportedEntitys.size(); auto *M = DIImportedEntity::get(C, Tag, Context, DINodeRef(NS), Line, Name); - if (EntitiesCount < C.pImpl->DIImportedEntitys.size()) - // A new Imported Entity was just added to the context. - // Add it to the Imported Modules list. - AllImportedModules.emplace_back(M); + AllImportedModules.emplace_back(M); return M; }