aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/Bitcode/Reader/MetadataLoader.cpp
diff options
context:
space:
mode:
authorDavide Italiano <davidino@fb.com>2024-01-16 16:56:24 -0800
committerDavide Italiano <davidino@fb.com>2024-01-16 17:01:01 -0800
commitb6f922fbf5e983122271aa12acb33f6172046d4d (patch)
treea09e77e1349eabc624db86005386de27eb1d5a9a /llvm/lib/Bitcode/Reader/MetadataLoader.cpp
parentc3f96acb41ef20a1f84715b1b6fb39e916f9aac8 (diff)
downloadllvm-b6f922fbf5e983122271aa12acb33f6172046d4d.zip
llvm-b6f922fbf5e983122271aa12acb33f6172046d4d.tar.gz
llvm-b6f922fbf5e983122271aa12acb33f6172046d4d.tar.bz2
Revert "[CloneFunction][DebugInfo] Avoid cloning DILocalVariables of inlined functions (#75385)"
This reverts commit fc6faa1113e9069f41b5500db051210af0eea843.
Diffstat (limited to 'llvm/lib/Bitcode/Reader/MetadataLoader.cpp')
-rw-r--r--llvm/lib/Bitcode/Reader/MetadataLoader.cpp111
1 files changed, 33 insertions, 78 deletions
diff --git a/llvm/lib/Bitcode/Reader/MetadataLoader.cpp b/llvm/lib/Bitcode/Reader/MetadataLoader.cpp
index d118695..910e974 100644
--- a/llvm/lib/Bitcode/Reader/MetadataLoader.cpp
+++ b/llvm/lib/Bitcode/Reader/MetadataLoader.cpp
@@ -547,8 +547,6 @@ class MetadataLoader::MetadataLoaderImpl {
/// Move local imports from DICompileUnit's 'imports' field to
/// DISubprogram's retainedNodes.
- /// Move fucntion-local enums from DICompileUnit's enums
- /// to DISubprogram's retainedNodes.
void upgradeCULocals() {
if (NamedMDNode *CUNodes = TheModule.getNamedMetadata("llvm.dbg.cu")) {
for (unsigned I = 0, E = CUNodes->getNumOperands(); I != E; ++I) {
@@ -556,66 +554,48 @@ class MetadataLoader::MetadataLoaderImpl {
if (!CU)
continue;
- SetVector<Metadata *> MetadataToRemove;
- // Collect imported entities to be moved.
- if (CU->getRawImportedEntities())
+ if (CU->getRawImportedEntities()) {
+ // Collect a set of imported entities to be moved.
+ SetVector<Metadata *> EntitiesToRemove;
for (Metadata *Op : CU->getImportedEntities()->operands()) {
auto *IE = cast<DIImportedEntity>(Op);
- if (dyn_cast_or_null<DILocalScope>(IE->getScope()))
- MetadataToRemove.insert(IE);
- }
- // Collect enums to be moved.
- if (CU->getRawEnumTypes())
- for (Metadata *Op : CU->getEnumTypes()->operands()) {
- auto *Enum = cast<DICompositeType>(Op);
- if (dyn_cast_or_null<DILocalScope>(Enum->getScope()))
- MetadataToRemove.insert(Enum);
+ if (dyn_cast_or_null<DILocalScope>(IE->getScope())) {
+ EntitiesToRemove.insert(IE);
+ }
}
- if (!MetadataToRemove.empty()) {
- // Make a new list of CU's 'imports'.
- SmallVector<Metadata *> NewImports;
- if (CU->getRawImportedEntities())
- for (Metadata *Op : CU->getImportedEntities()->operands())
- if (!MetadataToRemove.contains(Op))
+ if (!EntitiesToRemove.empty()) {
+ // Make a new list of CU's 'imports'.
+ SmallVector<Metadata *> NewImports;
+ for (Metadata *Op : CU->getImportedEntities()->operands()) {
+ if (!EntitiesToRemove.contains(cast<DIImportedEntity>(Op))) {
NewImports.push_back(Op);
+ }
+ }
- // Make a new list of CU's 'enums'.
- SmallVector<Metadata *> NewEnums;
- if (CU->getRawEnumTypes())
- for (Metadata *Op : CU->getEnumTypes()->operands())
- if (!MetadataToRemove.contains(Op))
- NewEnums.push_back(Op);
-
- // Find DISubprogram corresponding to each entity.
- std::map<DISubprogram *, SmallVector<Metadata *>> SPToEntities;
- for (auto *I : MetadataToRemove) {
- DILocalScope *Scope = nullptr;
- if (auto *Entity = dyn_cast<DIImportedEntity>(I))
- Scope = cast<DILocalScope>(Entity->getScope());
- else if (auto *Enum = dyn_cast<DICompositeType>(I))
- Scope = cast<DILocalScope>(Enum->getScope());
-
- if (auto *SP = findEnclosingSubprogram(Scope))
- SPToEntities[SP].push_back(I);
- }
+ // Find DISubprogram corresponding to each entity.
+ std::map<DISubprogram *, SmallVector<Metadata *>> SPToEntities;
+ for (auto *I : EntitiesToRemove) {
+ auto *Entity = cast<DIImportedEntity>(I);
+ if (auto *SP = findEnclosingSubprogram(
+ cast<DILocalScope>(Entity->getScope()))) {
+ SPToEntities[SP].push_back(Entity);
+ }
+ }
- // Update DISubprograms' retainedNodes.
- for (auto I = SPToEntities.begin(); I != SPToEntities.end(); ++I) {
- auto *SP = I->first;
- auto RetainedNodes = SP->getRetainedNodes();
- SmallVector<Metadata *> MDs(RetainedNodes.begin(),
- RetainedNodes.end());
- MDs.append(I->second);
- SP->replaceRetainedNodes(MDNode::get(Context, MDs));
- }
+ // Update DISubprograms' retainedNodes.
+ for (auto I = SPToEntities.begin(); I != SPToEntities.end(); ++I) {
+ auto *SP = I->first;
+ auto RetainedNodes = SP->getRetainedNodes();
+ SmallVector<Metadata *> MDs(RetainedNodes.begin(),
+ RetainedNodes.end());
+ MDs.append(I->second);
+ SP->replaceRetainedNodes(MDNode::get(Context, MDs));
+ }
- // Remove entities with local scope from CU.
- if (CU->getRawImportedEntities())
+ // Remove entities with local scope from CU.
CU->replaceImportedEntities(MDTuple::get(Context, NewImports));
- // Remove enums with local scope from CU.
- if (CU->getRawEnumTypes())
- CU->replaceEnumTypes(MDTuple::get(Context, NewEnums));
+ }
}
}
}
@@ -731,29 +711,6 @@ class MetadataLoader::MetadataLoaderImpl {
upgradeCULocals();
}
- void cloneLocalTypes() {
- for (unsigned I = 0; I < MetadataList.size(); ++I) {
- if (auto *SP = dyn_cast_or_null<DISubprogram>(MetadataList[I])) {
- auto RetainedNodes = SP->getRetainedNodes();
- SmallVector<Metadata *> MDs(RetainedNodes.begin(), RetainedNodes.end());
- bool HasChanged = false;
- for (auto &N : MDs)
- if (auto *T = dyn_cast<DIType>(N))
- if (auto *LS = dyn_cast_or_null<DILocalScope>(T->getScope()))
- if (auto *Parent = findEnclosingSubprogram(LS))
- if (Parent != SP) {
- HasChanged = true;
- auto NewT = T->clone();
- NewT->replaceOperandWith(1, SP);
- N = MDNode::replaceWithUniqued(std::move(NewT));
- }
-
- if (HasChanged)
- SP->replaceRetainedNodes(MDNode::get(Context, MDs));
- }
- }
- }
-
void callMDTypeCallback(Metadata **Val, unsigned TypeID);
public:
@@ -1129,7 +1086,6 @@ Error MetadataLoader::MetadataLoaderImpl::parseMetadata(bool ModuleLevel) {
// placeholders, that we flush here.
resolveForwardRefsAndPlaceholders(Placeholders);
upgradeDebugInfo(ModuleLevel);
- cloneLocalTypes();
// Return at the beginning of the block, since it is easy to skip it
// entirely from there.
Stream.ReadBlockEnd(); // Pop the abbrev block context.
@@ -1161,7 +1117,6 @@ Error MetadataLoader::MetadataLoaderImpl::parseMetadata(bool ModuleLevel) {
case BitstreamEntry::EndBlock:
resolveForwardRefsAndPlaceholders(Placeholders);
upgradeDebugInfo(ModuleLevel);
- cloneLocalTypes();
return Error::success();
case BitstreamEntry::Record:
// The interesting case.