Author: Vladislav Dzhidzhoev Date: 2025-04-24T21:48:37+02:00 New Revision: 7c18ece9e5dd45f48c658a8c86a473bd979dee31
URL: https://github.com/llvm/llvm-project/commit/7c18ece9e5dd45f48c658a8c86a473bd979dee31 DIFF: https://github.com/llvm/llvm-project/commit/7c18ece9e5dd45f48c658a8c86a473bd979dee31.diff LOG: Revert "Revert "[DebugInfo][DWARF] Emit DW_AT_abstract_origin for concrete/in…" This reverts commit dd9f92c8862a08c4a632edfd5f254b08c225b412. Added: Modified: llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.h llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp llvm/test/DebugInfo/Generic/inline-scopes.ll llvm/test/DebugInfo/X86/lexical-block-file-inline.ll llvm/test/DebugInfo/X86/missing-abstract-variable.ll Removed: ################################################################################ diff --git a/llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp b/llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp index 3939dae81841f..a20c374e08935 100644 --- a/llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp +++ b/llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp @@ -782,6 +782,8 @@ DIE *DwarfCompileUnit::constructLexicalScopeDIE(LexicalScope *Scope) { assert(!LexicalBlockDIEs.count(DS) && "Concrete out-of-line DIE for this scope exists!"); LexicalBlockDIEs[DS] = ScopeDIE; + } else { + InlinedLocalScopeDIEs[DS].push_back(ScopeDIE); } attachRangesOrLowHighPC(*ScopeDIE, Scope->getRanges()); @@ -1491,6 +1493,19 @@ void DwarfCompileUnit::finishEntityDefinition(const DbgEntity *Entity) { getDwarfDebug().addAccelName(*this, CUNode->getNameTableKind(), Name, *Die); } +void DwarfCompileUnit::attachLexicalScopesAbstractOrigins() { + auto AttachAO = [&](const DILocalScope *LS, DIE *ScopeDIE) { + if (auto *AbsLSDie = getAbstractScopeDIEs().lookup(LS)) + addDIEEntry(*ScopeDIE, dwarf::DW_AT_abstract_origin, *AbsLSDie); + }; + + for (auto [LScope, ScopeDIE] : LexicalBlockDIEs) + AttachAO(LScope, ScopeDIE); + for (auto &[LScope, ScopeDIEs] : InlinedLocalScopeDIEs) + for (auto *ScopeDIE : ScopeDIEs) + AttachAO(LScope, ScopeDIE); +} + DbgEntity *DwarfCompileUnit::getExistingAbstractEntity(const DINode *Node) { auto &AbstractEntities = getAbstractEntities(); auto I = AbstractEntities.find(Node); diff --git a/llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.h b/llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.h index 104039db03c7c..09be22ce35e36 100644 --- a/llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.h +++ b/llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.h @@ -82,6 +82,10 @@ class DwarfCompileUnit final : public DwarfUnit { // List of abstract local scopes (either DISubprogram or DILexicalBlock). DenseMap<const DILocalScope *, DIE *> AbstractLocalScopeDIEs; + // List of inlined lexical block scopes that belong to subprograms within this + // CU. + DenseMap<const DILocalScope *, SmallVector<DIE *, 2>> InlinedLocalScopeDIEs; + DenseMap<const DINode *, std::unique_ptr<DbgEntity>> AbstractEntities; /// DWO ID for correlating skeleton and split units. @@ -299,6 +303,7 @@ class DwarfCompileUnit final : public DwarfUnit { void finishSubprogramDefinition(const DISubprogram *SP); void finishEntityDefinition(const DbgEntity *Entity); + void attachLexicalScopesAbstractOrigins(); /// Find abstract variable associated with Var. using InlinedEntity = DbgValueHistoryMap::InlinedEntity; diff --git a/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp b/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp index bbf8b5c576349..642404db8ce43 100644 --- a/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp +++ b/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp @@ -1262,6 +1262,7 @@ void DwarfDebug::finalizeModuleInfo() { auto &TheCU = *P.second; if (TheCU.getCUNode()->isDebugDirectivesOnly()) continue; + TheCU.attachLexicalScopesAbstractOrigins(); // Emit DW_AT_containing_type attribute to connect types with their // vtable holding type. TheCU.constructContainingTypeDIEs(); diff --git a/llvm/test/DebugInfo/Generic/inline-scopes.ll b/llvm/test/DebugInfo/Generic/inline-scopes.ll index 8e7543eb16e69..45ecdd0594f64 100644 --- a/llvm/test/DebugInfo/Generic/inline-scopes.ll +++ b/llvm/test/DebugInfo/Generic/inline-scopes.ll @@ -20,16 +20,29 @@ ; } ; Ensure that lexical_blocks within inlined_subroutines are preserved/emitted. +; CHECK: DW_TAG_subprogram +; CHECK-NEXT: DW_AT_linkage_name ("_Z2f1v") +; CHECK: [[ADDR1:0x[0-9a-f]+]]: DW_TAG_lexical_block +; CHECK: DW_TAG_subprogram +; CHECK-NEXT: DW_AT_linkage_name ("_Z2f2v") +; CHECK: [[ADDR2:0x[0-9a-f]+]]: DW_TAG_lexical_block ; CHECK: DW_TAG_inlined_subroutine ; CHECK-NOT: DW_TAG ; CHECK-NOT: NULL -; CHECK: DW_TAG_lexical_block +; CHECK: DW_TAG_lexical_block +; CHECK-NOT: {{DW_TAG|NULL}} +; CHECK: DW_AT_abstract_origin ([[ADDR1]] ; CHECK-NOT: DW_TAG ; CHECK-NOT: NULL ; CHECK: DW_TAG_variable ; Ensure that file changes don't interfere with creating inlined subroutines. ; (see the line directive inside 'f2' in thesource) ; CHECK: DW_TAG_inlined_subroutine +; CHECK-NOT: {{DW_TAG|NULL}} +; CHECK: DW_TAG_lexical_block +; CHECK-NOT: {{DW_TAG|NULL}} +; CHECK: DW_AT_abstract_origin ([[ADDR2]] +; CHECK-NOT: {{DW_TAG|NULL}} ; CHECK: DW_TAG_variable ; CHECK-NOT: DW_TAG ; CHECK: DW_AT_abstract_origin diff --git a/llvm/test/DebugInfo/X86/lexical-block-file-inline.ll b/llvm/test/DebugInfo/X86/lexical-block-file-inline.ll index 15d0785bde93d..e8136f8eea965 100644 --- a/llvm/test/DebugInfo/X86/lexical-block-file-inline.ll +++ b/llvm/test/DebugInfo/X86/lexical-block-file-inline.ll @@ -28,9 +28,11 @@ ; CHECK: DW_TAG_subprogram ; CHECK-NOT: {{DW_TAG|NULL}} ; CHECK: DW_AT_abstract_origin {{.*}} {[[Offset_bar:0x[0-9abcdef]+]]} -; CHECK-NOT: {{DW_TAG|NULL}} +; CHECK-NOT: {{DW_TAG|NULL}} ; CHECK: DW_TAG_lexical_block -; CHECK-NOT: {{DW_TAG|NULL}} +; CHECK-NOT: {{DW_TAG|NULL}} +; CHECK: DW_AT_abstract_origin {{.*}}[[Offset_lb:0x[0-9a-f]+]] +; CHECK-NOT: {{DW_TAG|NULL}} ; CHECK: DW_TAG_variable ;; Abstract "bar" function @@ -40,7 +42,7 @@ ; CHECK-NOT: {{DW_TAG|NULL}} ; CHECK: DW_AT_inline ; CHECK-NOT: {{DW_TAG|NULL}} -; CHECK: DW_TAG_lexical_block +; CHECK: [[Offset_lb]]: DW_TAG_lexical_block ; CHECK-NOT: {{DW_TAG|NULL}} ; CHECK: DW_TAG_variable ; CHECK-NOT: {{DW_TAG|NULL}} @@ -56,8 +58,10 @@ ; CHECK-NEXT: DW_AT_abstract_origin {{.*}} {[[Offset_bar]]} ; CHECK-NOT: {{DW_TAG|NULL}} ; CHECK: DW_TAG_lexical_block -; CHECK-NOT: {{DW_TAG|NULL}} -; CHECK: DW_TAG_variable +; CHECK-NOT: {{DW_TAG|NULL}} +; CHECK: DW_AT_abstract_origin {{.*}}[[Offset_lb]] +; CHECK-NOT: {{DW_TAG|NULL}} +; CHECK: DW_TAG_variable ; Function Attrs: alwaysinline nounwind define i32 @_Z3barv() #0 !dbg !4 { diff --git a/llvm/test/DebugInfo/X86/missing-abstract-variable.ll b/llvm/test/DebugInfo/X86/missing-abstract-variable.ll index 572dca2c2cb6c..21363805aff2f 100644 --- a/llvm/test/DebugInfo/X86/missing-abstract-variable.ll +++ b/llvm/test/DebugInfo/X86/missing-abstract-variable.ll @@ -37,7 +37,7 @@ ; CHECK-NOT: DW_TAG ; CHECK: DW_AT_name ("b") ; CHECK-NOT: {{DW_TAG|NULL}} -; CHECK: DW_TAG_lexical_block +; CHECK: [[LB_DECL:.*]]: DW_TAG_lexical_block ; CHECK-NOT: {{DW_TAG|NULL}} ; CHECK: DW_TAG_variable ; CHECK-NOT: DW_TAG @@ -82,7 +82,9 @@ ; CHECK-NOT: {{DW_TAG|NULL}} ; CHECK: DW_TAG_lexical_block -; CHECK-NOT: {{DW_TAG|NULL}} +; CHECK-NOT: {{DW_TAG|NULL}} +; CHECK: DW_AT_abstract_origin {{.*}}[[LB_DECL]] +; CHECK-NOT: {{DW_TAG|NULL}} ; CHECK: DW_TAG_variable ; CHECK-NOT: DW_TAG ; CHECK: DW_AT_abstract_origin {{.*}} "s" _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits