Index: lib/DebugInfo/DWARFDebugInfoEntry.cpp =================================================================== --- lib/DebugInfo/DWARFDebugInfoEntry.cpp +++ lib/DebugInfo/DWARFDebugInfoEntry.cpp @@ -120,6 +120,20 @@ formValue.dump(OS, u); } + // We have dumped the attribute raw value. For some attributes + // having both the raw value and the pretty-printed value is + // interesting. These attributes are handled below. + if ((attr == DW_AT_specification || attr == DW_AT_abstract_origin) && + // The signature references aren't handled. + formValue.getForm() != DW_FORM_ref_sig8) { + uint32_t Ref = formValue.getAsReference(u).getValue(); + DWARFDebugInfoEntryMinimal DIE; + if (const DWARFUnit *RefU = findUnitAndExtractFast(DIE, u, &Ref)) + if (const char *Ref = DIE.getSubroutineName(RefU, + FunctionNameKind::LinkageName)) + OS << " \"" << Ref << '\"'; + } + OS << ")\n"; } Index: test/DebugInfo/X86/DW_AT_specification.ll =================================================================== --- test/DebugInfo/X86/DW_AT_specification.ll +++ test/DebugInfo/X86/DW_AT_specification.ll @@ -7,7 +7,7 @@ ; CHECK-NEXT: DW_AT_MIPS_linkage_name {{.*}} "_ZN3foo3barEv" ; CHECK: DW_TAG_subprogram ; CHECK-NOT: DW_TAG -; CHECK: DW_AT_specification {{.*}} {[[BAR_DECL]]} +; CHECK: DW_AT_specification {{.*}} {[[BAR_DECL]]} "_ZN3foo3barEv") @_ZZN3foo3barEvE1x = constant i32 0, align 4 Index: test/DebugInfo/X86/concrete_out_of_line.ll =================================================================== --- test/DebugInfo/X86/concrete_out_of_line.ll +++ test/DebugInfo/X86/concrete_out_of_line.ll @@ -16,43 +16,43 @@ ; CHECK: [[D2_ABS:.*]]: DW_TAG_subprogram ; CHECK-NEXT: DW_AT_{{.*}}linkage_name {{.*}}D2 -; CHECK-NEXT: DW_AT_specification {{.*}} {[[DTOR_DECL]]} +; CHECK-NEXT: DW_AT_specification {{.*}} {[[DTOR_DECL]]} "~nsAutoRefCnt") ; CHECK-NEXT: DW_AT_inline ; CHECK-NOT: DW_AT ; CHECK: DW_TAG ; CHECK: [[D1_ABS:.*]]: DW_TAG_subprogram ; CHECK-NEXT: DW_AT_{{.*}}linkage_name {{.*}}D1 -; CHECK-NEXT: DW_AT_specification {{.*}} {[[DTOR_DECL]]} +; CHECK-NEXT: DW_AT_specification {{.*}} {[[DTOR_DECL]]} "~nsAutoRefCnt") ; CHECK-NEXT: DW_AT_inline ; CHECK-NOT: DW_AT ; CHECK: [[D1_THIS_ABS:.*]]: DW_TAG_formal_parameter ; CHECK: [[RELEASE:0x........]]: DW_TAG_subprogram -; CHECK: DW_AT_specification {{.*}} {[[RELEASE_DECL]]} +; CHECK: DW_AT_specification {{.*}} {[[RELEASE_DECL]]} "_ZN17nsAutoRefCnt7ReleaseEv") ; CHECK: DW_TAG_formal_parameter ; CHECK-NOT: NULL ; CHECK-NOT: DW_TAG ; CHECK: DW_TAG_inlined_subroutine -; CHECK-NEXT: DW_AT_abstract_origin {{.*}} {[[ASSIGN:0x........]]} +; CHECK-NEXT: DW_AT_abstract_origin {{.*}} {[[ASSIGN:0x........]]} "_ZN12nsAutoRefCntaSEi") ; CHECK-NOT: NULL ; CHECK-NOT: DW_TAG ; CHECK: DW_TAG_inlined_subroutine -; CHECK-NEXT: DW_AT_abstract_origin {{.*}} {[[D1_ABS]]} +; CHECK-NEXT: DW_AT_abstract_origin {{.*}} {[[D1_ABS]]} "_ZN17nsAutoRefCntD1Ev") ; CHECK-NOT: NULL ; CHECK-NOT: DW_TAG ; CHECK: DW_TAG_inlined_subroutine -; CHECK-NEXT: DW_AT_abstract_origin {{.*}} {[[D2_ABS]]} +; CHECK-NEXT: DW_AT_abstract_origin {{.*}} {[[D2_ABS]]} "_ZN17nsAutoRefCntD2Ev") ; and then that a TAG_subprogram refers to it with AT_abstract_origin. ; CHECK: DW_TAG_subprogram ; CHECK-NOT: DW_TAG -; CHECK: DW_AT_abstract_origin {{.*}} {[[D1_ABS]]} +; CHECK: DW_AT_abstract_origin {{.*}} {[[D1_ABS]]} "_ZN17nsAutoRefCntD1Ev") ; CHECK: DW_TAG_formal_parameter ; CHECK-NOT: DW_TAG ; CHECK: DW_AT_abstract_origin {{.*}} {[[D1_THIS_ABS]]} ; CHECK: DW_TAG_inlined_subroutine -; CHECK-NEXT: DW_AT_abstract_origin {{.*}} {[[D2_ABS]]} +; CHECK-NEXT: DW_AT_abstract_origin {{.*}} {[[D2_ABS]]} "_ZN17nsAutoRefCntD2Ev" define i32 @_ZN17nsAutoRefCnt7ReleaseEv() { Index: test/DebugInfo/X86/gnu-public-names.ll =================================================================== --- test/DebugInfo/X86/gnu-public-names.ll +++ test/DebugInfo/X86/gnu-public-names.ll @@ -160,11 +160,11 @@ ; CHECK: [[MEM_FUNC:0x[0-9a-f]+]]: DW_TAG_subprogram ; CHECK-NOT: DW_TAG -; CHECK: DW_AT_specification {{.*}} {[[MEM_FUNC_DECL]]} +; CHECK: DW_AT_specification {{.*}} {[[MEM_FUNC_DECL]]} "_ZN1C15member_functionEv") ; CHECK: [[STATIC_MEM_FUNC:0x[0-9a-f]+]]: DW_TAG_subprogram ; CHECK-NOT: DW_TAG -; CHECK: DW_AT_specification {{.*}} {[[STATIC_MEM_FUNC_DECL]]} +; CHECK: DW_AT_specification {{.*}} {[[STATIC_MEM_FUNC_DECL]]} "_ZN1C22static_member_functionEv") ; CHECK: [[GLOBAL_FUNC:0x[0-9a-f]+]]: DW_TAG_subprogram ; CHECK-NOT: DW_TAG Index: test/DebugInfo/X86/recursive_inlining.ll =================================================================== --- test/DebugInfo/X86/recursive_inlining.ll +++ test/DebugInfo/X86/recursive_inlining.ll @@ -63,7 +63,7 @@ ; The concrete definition of C::m_fn2 ; CHECK: DW_TAG_subprogram ; CHECK-NOT: DW_TAG -; CHECK: DW_AT_abstract_origin {{.*}} {[[M_FN2_ABS_DEF]]} +; CHECK: DW_AT_abstract_origin {{.*}} {[[M_FN2_ABS_DEF]]} "_ZN1C5m_fn2Ev") ; CHECK-NOT: {{DW_TAG|NULL}} ; CHECK: DW_TAG_formal_parameter ; CHECK-NOT: DW_TAG @@ -78,7 +78,7 @@ ; Inlined C::m_fn2: ; CHECK: DW_TAG_inlined_subroutine ; CHECK-NOT: DW_TAG -; CHECK: DW_AT_abstract_origin {{.*}} {[[M_FN2_ABS_DEF]]} +; CHECK: DW_AT_abstract_origin {{.*}} {[[M_FN2_ABS_DEF]]} "_ZN1C5m_fn2Ev") ; CHECK-NOT: {{DW_TAG|NULL}} ; CHECK: DW_TAG_formal_parameter ; CHECK-NOT: DW_TAG Index: test/DebugInfo/cross-cu-inlining.ll =================================================================== --- test/DebugInfo/cross-cu-inlining.ll +++ test/DebugInfo/cross-cu-inlining.ll @@ -25,7 +25,7 @@ ; CHECK: DW_TAG_subprogram ; CHECK: DW_AT_type [DW_FORM_ref_addr] (0x00000000[[INT:.*]]) ; CHECK: DW_TAG_inlined_subroutine -; CHECK: DW_AT_abstract_origin {{.*}}[[ABS_FUNC:........]]) +; CHECK: DW_AT_abstract_origin {{.*}}[[ABS_FUNC:........]] "_Z4funci") ; CHECK: DW_TAG_formal_parameter ; CHECK: DW_AT_abstract_origin {{.*}}[[ABS_VAR:........]]) Index: test/DebugInfo/incorrect-variable-debugloc.ll =================================================================== --- test/DebugInfo/incorrect-variable-debugloc.ll +++ test/DebugInfo/incorrect-variable-debugloc.ll @@ -42,7 +42,7 @@ ; CHECK-NOT: DW_TAG ; CHECK: DW_AT_name {{.*}} "m_fn3" -; CHECK: DW_AT_specification {{.*}} {[[FN3_DECL]]} +; CHECK: DW_AT_specification {{.*}} {[[FN3_DECL]]} "_ZN1C5m_fn3Ev") ; CHECK-NOT: DW_TAG ; CHECK: DW_TAG_formal_parameter ; CHECK-NOT: DW_TAG Index: test/DebugInfo/inline-scopes.ll =================================================================== --- test/DebugInfo/inline-scopes.ll +++ test/DebugInfo/inline-scopes.ll @@ -24,17 +24,22 @@ ; Ensure that lexical_blocks within inlined_subroutines are preserved/emitted. ; CHECK: DW_TAG_inlined_subroutine ; CHECK-NOT: DW_TAG -; CHECK-NOT: NULL -; CHECK: DW_TAG_lexical_block -; CHECK-NOT: DW_TAG -; CHECK-NOT: NULL -; CHECK: DW_TAG_variable +; CHECK: DW_AT_abstract_origin {{.*}} "_Z2f1v") +; CHECK-NOT: {{DW_TAG|NULL}} +; CHECK: DW_TAG_lexical_block +; CHECK-NOT: {{DW_TAG|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: DW_TAG_variable ; CHECK-NOT: DW_TAG -; CHECK: DW_AT_abstract_origin +; CHECK: DW_AT_abstract_origin {{.*}} "_Z2f2v") +; CHECK-NOT: {{DW_TAG|NULL}} +; CHECK: DW_TAG_lexical_block +; CHECK-NOT: {{DW_TAG|NULL}} +; CHECK: DW_TAG_variable +; CHECK-NOT: DW_TAG +; CHECK: DW_AT_abstract_origin {{.*}} ; Function Attrs: uwtable define i32 @main() #0 { Index: test/DebugInfo/namespace_inline_function_definition.ll =================================================================== --- test/DebugInfo/namespace_inline_function_definition.ll +++ test/DebugInfo/namespace_inline_function_definition.ll @@ -24,7 +24,7 @@ ; CHECK-NOT: NULL ; CHECK: DW_TAG_subprogram ; CHECK-NOT: DW_TAG -; CHECK: DW_AT_abstract_origin {{.*}} {[[ABS_DEF]]} +; CHECK: DW_AT_abstract_origin {{.*}} {[[ABS_DEF]]} "_ZN2ns4funcEi") ; CHECK-NOT: DW_TAG ; CHECK: DW_TAG_formal_parameter ; CHECK: DW_AT_abstract_origin {{.*}} {[[ABS_PRM]]} Index: test/Linker/type-unique-odr-a.ll =================================================================== --- test/Linker/type-unique-odr-a.ll +++ test/Linker/type-unique-odr-a.ll @@ -41,7 +41,7 @@ ; CHECK: DW_AT_MIPS_linkage_name {{.*}} "_ZL3barv" ; getFoo and A may only appear once. -; CHECK-NOT: {{(getFoo)|("A")}} +; CHECK-NOT: AT_name{{.*(getFoo)|("A")}} ; ModuleID = 'type-unique-odr-a.cpp'