mirror of
https://github.com/RPCSX/llvm.git
synced 2025-02-07 13:09:52 +00:00
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
This commit is contained in:
parent
1cb85674c6
commit
dcf3121094
@ -1043,28 +1043,22 @@ void IRLinker::mapUnneededSubprograms() {
|
||||
for (unsigned I = 0, E = CompileUnits->getNumOperands(); I != E; ++I) {
|
||||
auto *CU = cast<DICompileUnit>(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<DISubprogram *, 8> ImportedEntitySPs;
|
||||
for (auto *IE : CU->getImportedEntities()) {
|
||||
if (auto *SP = getDISubprogram(dyn_cast<MDNode>(IE->getEntity())))
|
||||
ImportedEntitySPs.insert(SP);
|
||||
if (auto *SP = getDISubprogram(dyn_cast<MDNode>(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;
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user