forked from OSchip/llvm-project
DebugInfo: Fix cross-CU references for scopes (and variables within those scopes) in abstract definitions of cross-CU inlined functions
Found by Adrian Prantl during post-commit review of r209335. llvm-svn: 209498
This commit is contained in:
parent
0e57b91f9c
commit
96fb9024f2
|
|
@ -528,11 +528,12 @@ void DwarfDebug::constructAbstractSubprogramScopeDIE(DwarfCompileUnit &TheCU,
|
||||||
|
|
||||||
// Find the subprogram's DwarfCompileUnit in the SPMap in case the subprogram
|
// Find the subprogram's DwarfCompileUnit in the SPMap in case the subprogram
|
||||||
// was inlined from another compile unit.
|
// was inlined from another compile unit.
|
||||||
DIE *ScopeDIE = SPMap[Sub]->getDIE(Sub);
|
DwarfCompileUnit &SPCU = *SPMap[Sub];
|
||||||
|
DIE *ScopeDIE = SPCU.getDIE(Sub);
|
||||||
assert(ScopeDIE);
|
assert(ScopeDIE);
|
||||||
AbstractSPDies.insert(std::make_pair(Sub, ScopeDIE));
|
AbstractSPDies.insert(std::make_pair(Sub, ScopeDIE));
|
||||||
TheCU.addUInt(*ScopeDIE, dwarf::DW_AT_inline, None, dwarf::DW_INL_inlined);
|
SPCU.addUInt(*ScopeDIE, dwarf::DW_AT_inline, None, dwarf::DW_INL_inlined);
|
||||||
createAndAddScopeChildren(TheCU, Scope, *ScopeDIE);
|
createAndAddScopeChildren(SPCU, Scope, *ScopeDIE);
|
||||||
}
|
}
|
||||||
|
|
||||||
DIE &DwarfDebug::constructSubprogramScopeDIE(DwarfCompileUnit &TheCU,
|
DIE &DwarfDebug::constructSubprogramScopeDIE(DwarfCompileUnit &TheCU,
|
||||||
|
|
|
||||||
|
|
@ -27,6 +27,9 @@
|
||||||
; CHECK-NEXT: DW_AT_abstract_origin {{.*}}[[ABS_FUNC:........]])
|
; CHECK-NEXT: DW_AT_abstract_origin {{.*}}[[ABS_FUNC:........]])
|
||||||
; CHECK: DW_TAG_formal_parameter
|
; CHECK: DW_TAG_formal_parameter
|
||||||
; CHECK-NEXT: DW_AT_abstract_origin {{.*}}[[ABS_VAR:........]])
|
; CHECK-NEXT: DW_AT_abstract_origin {{.*}}[[ABS_VAR:........]])
|
||||||
|
; CHECK: 0x[[INT:.*]]: DW_TAG_base_type
|
||||||
|
; CHECK-NOT: DW_TAG
|
||||||
|
; CHECK: DW_AT_name {{.*}} "int"
|
||||||
|
|
||||||
; Check the abstract definition is in the 'b.cpp' CU and doesn't contain any
|
; Check the abstract definition is in the 'b.cpp' CU and doesn't contain any
|
||||||
; concrete information (address range or variable location)
|
; concrete information (address range or variable location)
|
||||||
|
|
@ -35,6 +38,9 @@
|
||||||
; CHECK: 0x[[ABS_FUNC]]: DW_TAG_subprogram
|
; CHECK: 0x[[ABS_FUNC]]: DW_TAG_subprogram
|
||||||
; CHECK-NOT: DW_AT_low_pc
|
; CHECK-NOT: DW_AT_low_pc
|
||||||
; CHECK: 0x[[ABS_VAR]]: DW_TAG_formal_parameter
|
; CHECK: 0x[[ABS_VAR]]: DW_TAG_formal_parameter
|
||||||
|
; CHECK-NOT: DW_TAG
|
||||||
|
; CHECK-NOT: DW_AT_location
|
||||||
|
; CHECK: DW_AT_type [DW_FORM_ref_addr] (0x00000000[[INT]])
|
||||||
; CHECK-NOT: DW_AT_location
|
; CHECK-NOT: DW_AT_location
|
||||||
|
|
||||||
; Check the concrete out of line definition references the abstract and
|
; Check the concrete out of line definition references the abstract and
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue