From eee1f7cef856241ad7d66b715c584d29b1c89ca9 Mon Sep 17 00:00:00 2001 From: Hans Wennborg Date: Fri, 29 Sep 2023 14:09:04 +0200 Subject: Revert "[DebugMetadata][DwarfDebug] Support function-local types in lexical block scopes (4/7)" This caused asserts: llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp:2331: virtual void llvm::DwarfDebug::endFunctionImpl(const llvm::MachineFunction *): Assertion `LScopes.getAbstractScopesList().size() == NumAbstractSubprograms && "getOrCreateAbstractScope() inserted an abstract subprogram scope"' failed. See comment on the code review for reproducer. > RFC https://discourse.llvm.org/t/rfc-dwarfdebug-fix-and-improve-handling-imported-entities-types-and-static-local-in-subprogram-and-lexical-block-scopes/68544 > > Similar to imported declarations, the patch tracks function-local types in > DISubprogram's 'retainedNodes' field. DwarfDebug is adjusted in accordance with > the aforementioned metadata change and provided a support of function-local > types scoped within a lexical block. > > The patch assumes that DICompileUnit's 'enums field' no longer tracks local > types and DwarfDebug would assert if any locally-scoped types get placed there. > > Reviewed By: jmmartinez > > Differential Revision: https://reviews.llvm.org/D144006 This reverts commit f8aab289b5549086062588fba627b0e4d3a5ab15. --- llvm/lib/Bitcode/Reader/MetadataLoader.cpp | 86 ++++++++++++------------------ 1 file changed, 33 insertions(+), 53 deletions(-) (limited to 'llvm/lib/Bitcode/Reader/MetadataLoader.cpp') diff --git a/llvm/lib/Bitcode/Reader/MetadataLoader.cpp b/llvm/lib/Bitcode/Reader/MetadataLoader.cpp index e124354..74ccb2dd 100644 --- a/llvm/lib/Bitcode/Reader/MetadataLoader.cpp +++ b/llvm/lib/Bitcode/Reader/MetadataLoader.cpp @@ -549,8 +549,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) { @@ -558,66 +556,48 @@ class MetadataLoader::MetadataLoaderImpl { if (!CU) continue; - SetVector MetadataToRemove; - // Collect imported entities to be moved. - if (CU->getRawImportedEntities()) + if (CU->getRawImportedEntities()) { + // Collect a set of imported entities to be moved. + SetVector EntitiesToRemove; for (Metadata *Op : CU->getImportedEntities()->operands()) { auto *IE = cast(Op); - if (dyn_cast_or_null(IE->getScope())) - MetadataToRemove.insert(IE); - } - // Collect enums to be moved. - if (CU->getRawEnumTypes()) - for (Metadata *Op : CU->getEnumTypes()->operands()) { - auto *Enum = cast(Op); - if (dyn_cast_or_null(Enum->getScope())) - MetadataToRemove.insert(Enum); + if (dyn_cast_or_null(IE->getScope())) { + EntitiesToRemove.insert(IE); + } } - if (!MetadataToRemove.empty()) { - // Make a new list of CU's 'imports'. - SmallVector 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 NewImports; + for (Metadata *Op : CU->getImportedEntities()->operands()) { + if (!EntitiesToRemove.contains(cast(Op))) { NewImports.push_back(Op); + } + } - // Make a new list of CU's 'enums'. - SmallVector 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> SPToEntities; - for (auto *I : MetadataToRemove) { - DILocalScope *Scope = nullptr; - if (auto *Entity = dyn_cast(I)) - Scope = cast(Entity->getScope()); - else if (auto *Enum = dyn_cast(I)) - Scope = cast(Enum->getScope()); - - if (auto *SP = findEnclosingSubprogram(Scope)) - SPToEntities[SP].push_back(I); - } + // Find DISubprogram corresponding to each entity. + std::map> SPToEntities; + for (auto *I : EntitiesToRemove) { + auto *Entity = cast(I); + if (auto *SP = findEnclosingSubprogram( + cast(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 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 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)); + } } } } -- cgit v1.1