Skip to content

Commit 91a7b5a

Browse files
committed
Merging r318289:
------------------------------------------------------------------------ r318289 | jdevlieghere | 2017-11-15 02:57:05 -0800 (Wed, 15 Nov 2017) | 14 lines [DebugInfo] Fix potential CU mismatch for SubprogramScopeDIEs. In constructAbstractSubprogramScopeDIE there can be a potential mismatch between `this` and the CU of ContextDIE when a scope is shared between two DISubprograms belonging to a different CU. In that case, `this` is the CU that was specified in the IR, but the CU of ContextDIE is that of the first subprogram that was emitted. This patch fixes the mismatch by looking up the CU of ContextDIE, and switching to use that. This fixes PR35212 (https://bugs.llvm.org/show_bug.cgi?id=35212) Patch by Philip Craig! Differential revision: https://reviews.llvm.org/D39981 ------------------------------------------------------------------------ git-svn-id: https://llvm.org/svn/llvm-project/llvm/branches/release_50@318542 91177308-0d34-0410-b5e6-96231b3b80d8
1 parent 52e96d1 commit 91a7b5a

File tree

3 files changed

+67
-8
lines changed

3 files changed

+67
-8
lines changed

lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -621,6 +621,7 @@ void DwarfCompileUnit::constructAbstractSubprogramScopeDIE(
621621
auto *SP = cast<DISubprogram>(Scope->getScopeNode());
622622

623623
DIE *ContextDIE;
624+
DwarfCompileUnit *ContextCU = this;
624625

625626
if (includeMinimalInlineScopes())
626627
ContextDIE = &getUnitDie();
@@ -631,18 +632,23 @@ void DwarfCompileUnit::constructAbstractSubprogramScopeDIE(
631632
else if (auto *SPDecl = SP->getDeclaration()) {
632633
ContextDIE = &getUnitDie();
633634
getOrCreateSubprogramDIE(SPDecl);
634-
} else
635+
} else {
635636
ContextDIE = getOrCreateContextDIE(resolve(SP->getScope()));
637+
// The scope may be shared with a subprogram that has already been
638+
// constructed in another CU, in which case we need to construct this
639+
// subprogram in the same CU.
640+
ContextCU = DD->lookupCU(ContextDIE->getUnitDie());
641+
}
636642

637643
// Passing null as the associated node because the abstract definition
638644
// shouldn't be found by lookup.
639-
AbsDef = &createAndAddDIE(dwarf::DW_TAG_subprogram, *ContextDIE, nullptr);
640-
applySubprogramAttributesToDefinition(SP, *AbsDef);
645+
AbsDef = &ContextCU->createAndAddDIE(dwarf::DW_TAG_subprogram, *ContextDIE, nullptr);
646+
ContextCU->applySubprogramAttributesToDefinition(SP, *AbsDef);
641647

642-
if (!includeMinimalInlineScopes())
643-
addUInt(*AbsDef, dwarf::DW_AT_inline, None, dwarf::DW_INL_inlined);
644-
if (DIE *ObjectPointer = createAndAddScopeChildren(Scope, *AbsDef))
645-
addDIEEntry(*AbsDef, dwarf::DW_AT_object_pointer, *ObjectPointer);
648+
if (!ContextCU->includeMinimalInlineScopes())
649+
ContextCU->addUInt(*AbsDef, dwarf::DW_AT_inline, None, dwarf::DW_INL_inlined);
650+
if (DIE *ObjectPointer = ContextCU->createAndAddScopeChildren(Scope, *AbsDef))
651+
ContextCU->addDIEEntry(*AbsDef, dwarf::DW_AT_object_pointer, *ObjectPointer);
646652
}
647653

648654
DIE *DwarfCompileUnit::constructImportedEntityDIE(

lib/CodeGen/AsmPrinter/DwarfDebug.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -283,7 +283,7 @@ class DwarfDebug : public DebugHandlerBase {
283283
// 0, referencing the comp_dir of all the type units that use it.
284284
MCDwarfDwoLineTable SplitTypeUnitFileTable;
285285
/// @}
286-
286+
287287
/// True iff there are multiple CUs in this module.
288288
bool SingleCU;
289289
bool IsDarwin;
@@ -562,6 +562,9 @@ class DwarfDebug : public DebugHandlerBase {
562562
bool isLexicalScopeDIENull(LexicalScope *Scope);
563563

564564
bool hasDwarfPubSections(bool includeMinimalInlineScopes) const;
565+
566+
/// Find the matching DwarfCompileUnit for the given CU DIE.
567+
DwarfCompileUnit *lookupCU(const DIE *Die) { return CUDieMap.lookup(Die); }
565568
};
566569
} // End of namespace llvm
567570

test/DebugInfo/cross-cu-scope.ll

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
; RUN: %llc_dwarf %s -filetype=obj -o %t
2+
; RUN: llvm-dwarfdump -debug-dump=info %t | FileCheck %s
3+
4+
; Reduced test case from PR35212. Two DISubprogram belong to a different CU but
5+
; share a scope. Both are declarations and end up in the scope's CU. We want to
6+
; check that the CU from the context DIE is used (rather than from the IR).
7+
; This manifests itself by the DW_base_type ending up in the second CU, rather
8+
; than in the first one as specified in the IR.
9+
10+
; CHECK: DW_TAG_compile_unit
11+
; CHECK-NEXT: discriminator 0
12+
; CHECK: DW_TAG_compile_unit
13+
; CHECK-NEXT: discriminator 1
14+
; CHECK: DW_TAG_structure_type
15+
; CHECK-NOT: NULL
16+
; CHECK: DW_TAG_subprogram
17+
; CHECK-NOT: NULL
18+
; CHECK: DW_TAG_formal_parameter
19+
; CHECK-NOT: NULL
20+
; CHECK: DW_AT_type{{.*}}{[[USIZE_LABEL:0x[0-9a-f]+]]}
21+
; CHECK: NULL
22+
; CHECK: [[USIZE_LABEL]]: DW_TAG_base_type
23+
; CHECK-NOT: NULL
24+
; CHECK: DW_AT_name{{.*}}"usize"
25+
26+
define hidden void @foo() !dbg !4 {
27+
ret void, !dbg !7
28+
}
29+
30+
!llvm.dbg.cu = !{!0, !2}
31+
!llvm.module.flags = !{!3}
32+
33+
!0 = distinct !DICompileUnit(language: DW_LANG_Rust, file: !1, producer: "clang LLVM (rustc version 1.23.0-nightly (discriminator 0))", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug)
34+
!1 = !DIFile(filename: "../lib.rs", directory: "/home/alex/code/rust4/lol")
35+
!2 = distinct !DICompileUnit(language: DW_LANG_Rust, file: !1, producer: "clang LLVM (rustc version 1.23.0-nightly (discriminator 1))", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug)
36+
!3 = !{i32 2, !"Debug Info Version", i32 3}
37+
!4 = distinct !DISubprogram(name: "clone<alloc::string::String>", linkageName: "_ZN5alloc3vec8{{impl}}28clone<alloc::string::String>E", scope: null, file: !1, line: 1519, type: !5, isLocal: false, isDefinition: true, scopeLine: 1519, flags: DIFlagPrototyped, isOptimized: true, unit: !0, templateParams: !6, variables: !6)
38+
!5 = !DISubroutineType(types: !6)
39+
!6 = !{}
40+
!7 = !DILocation(line: 1612, scope: !8, inlinedAt: !11)
41+
!8 = distinct !DILexicalBlock(scope: !9, file: !1, line: 86, column: 12)
42+
!9 = distinct !DISubprogram(name: "allocate_in<alloc::string::String,alloc::heap::Heap>", linkageName: "_ZN5alloc7raw_vec8{{impl}}52allocate_in<alloc::string::String,alloc::heap::Heap>E", scope: !10, file: !1, line: 82, type: !5, isLocal: false, isDefinition: true, scopeLine: 82, flags: DIFlagPrototyped, isOptimized: true, unit: !2, templateParams: !6, variables: !6)
43+
!10 = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "RawVec<alloc::string::String, alloc::heap::Heap>", file: !1, size: 128, align: 64, elements: !6, identifier: "5c6e4db16d2c64555e40661d70c4d81e")
44+
!11 = distinct !DILocation(line: 86, scope: !8, inlinedAt: !12)
45+
!12 = distinct !DILocation(line: 141, scope: !13, inlinedAt: !17)
46+
!13 = distinct !DISubprogram(name: "with_capacity<alloc::string::String>", linkageName: "_ZN5alloc7raw_vec8{{impl}}36with_capacity<alloc::string::String>E", scope: !10, file: !1, line: 140, type: !5, isLocal: false, isDefinition: true, scopeLine: 140, flags: DIFlagPrototyped, isOptimized: true, unit: !0, templateParams: !6, variables: !14)
47+
!14 = !{!15}
48+
!15 = !DILocalVariable(name: "cap", arg: 1, scope: !13, file: !1, line: 1, type: !16)
49+
!16 = !DIBasicType(name: "usize", size: 64, encoding: DW_ATE_unsigned)
50+
!17 = !DILocation(line: 1521, scope: !4)

0 commit comments

Comments
 (0)