From dcf3121094d7d0666827454237000ab36d9b4056 Mon Sep 17 00:00:00 2001 From: "Duncan P. N. Exon Smith" Date: Sat, 2 Apr 2016 17:39:31 +0000 Subject: [PATCH] Linker: Avoid unnecessary work when moving named metadata IRLinker::mapUnneededSubprograms has to be sure that any "needed" subprograms get linked in. Rather than traversing through imported entities using llvm::getSubprogram, call MapMetadata. The latter memoizes the result in the ValueMap (sharing work with IRLinker::linkNamedMDNodes proper), and makes the local SmallPtrSet redundant. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@265231 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Linker/IRMover.cpp | 28 +++++++++++----------------- 1 file changed, 11 insertions(+), 17 deletions(-) diff --git a/lib/Linker/IRMover.cpp b/lib/Linker/IRMover.cpp index f104db44bb8..9a69d0bae46 100644 --- a/lib/Linker/IRMover.cpp +++ b/lib/Linker/IRMover.cpp @@ -1043,28 +1043,22 @@ void IRLinker::mapUnneededSubprograms() { for (unsigned I = 0, E = CompileUnits->getNumOperands(); I != E; ++I) { auto *CU = cast(CompileUnits->getOperand(I)); assert(CU && "Expected valid compile unit"); - // Ensure that we don't remove subprograms referenced by DIImportedEntity. - // It is not legal to have a DIImportedEntity with a null entity or scope. - // Using getDISubprogram handles the case where the subprogram is reached - // via an intervening DILexicalBlock. + + // Seed the ValueMap with the imported entities, in case they reference new + // subprograms. // FIXME: The DISubprogram for functions not linked in but kept due to // being referenced by a DIImportedEntity should also get their // IsDefinition flag is unset. - SmallPtrSet ImportedEntitySPs; - for (auto *IE : CU->getImportedEntities()) { - if (auto *SP = getDISubprogram(dyn_cast(IE->getEntity()))) - ImportedEntitySPs.insert(SP); - if (auto *SP = getDISubprogram(dyn_cast(IE->getScope()))) - ImportedEntitySPs.insert(SP); - } + if (MDTuple *IEs = CU->getImportedEntities().get()) + (void)MapMetadata(IEs, ValueMap, + ValueMapperFlags | RF_NullMapMissingGlobalValues, + &TypeMap, &GValMaterializer); - // Try to insert nullptr into the map for any SP not referenced from - // functions and not in the imported entities. If the insertino succeeded, - // set HasUnneededSPs. + // Try to insert nullptr into the map for any SP not already mapped. If + // the insertion succeeds, we don't need this subprogram. for (auto *Op : CU->getSubprograms()) - if (!ImportedEntitySPs.count(Op)) - if (ValueMap.MD().insert(std::make_pair(Op, TrackingMDRef())).second) - HasUnneededSPs = true; + if (ValueMap.MD().insert(std::make_pair(Op, TrackingMDRef())).second) + HasUnneededSPs = true; } } -- 2.11.0