diff --git a/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp b/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp index f58bddf99c7..8528ab7edf5 100644 --- a/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp +++ b/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp @@ -1356,12 +1356,14 @@ DIE *CompileUnit::getOrCreateSubprogramDIE(DISubprogram SP) { if (SPDie) return SPDie; - SPDie = new DIE(dwarf::DW_TAG_subprogram); + DISubprogram SPDecl = SP.getFunctionDeclaration(); + if (SPDecl.isSubprogram()) + // Add subprogram definitions to the CU die directly. + ContextDIE = CUDie.get(); // DW_TAG_inlined_subroutine may refer to this DIE. - insertDIE(SP, SPDie); + SPDie = createAndAddDIE(dwarf::DW_TAG_subprogram, *ContextDIE, SP); - DISubprogram SPDecl = SP.getFunctionDeclaration(); DIE *DeclDie = NULL; if (SPDecl.isSubprogram()) DeclDie = getOrCreateSubprogramDIE(SPDecl); @@ -1375,15 +1377,9 @@ DIE *CompileUnit::getOrCreateSubprogramDIE(DISubprogram SP) { // Refer function declaration directly. addDIEEntry(SPDie, dwarf::DW_AT_specification, DeclDie); - // Add subprogram definitions to the CU die directly. - addDie(SPDie); - return SPDie; } - // Add to context owner. - ContextDIE->addChild(SPDie); - // Add the linkage name if we have one. StringRef LinkageName = SP.getLinkageName(); if (!LinkageName.empty()) diff --git a/test/DebugInfo/X86/DW_AT_object_pointer.ll b/test/DebugInfo/X86/DW_AT_object_pointer.ll index 2bfc4c50045..f7533d49f85 100644 --- a/test/DebugInfo/X86/DW_AT_object_pointer.ll +++ b/test/DebugInfo/X86/DW_AT_object_pointer.ll @@ -6,7 +6,7 @@ ; CHECK: DW_TAG ; CHECK: DW_TAG_class_type ; CHECK: DW_AT_object_pointer [DW_FORM_ref4] (cu + 0x{{[0-9a-f]*}} => {[[PARAM:0x[0-9a-f]*]]}) -; CHECK: [[PARAM]]: DW_TAG_formal_parameter [13] +; CHECK: [[PARAM]]: DW_TAG_formal_parameter ; CHECK-NEXT: DW_AT_name [DW_FORM_strp] ( .debug_str[0x{{[0-9a-f]*}}] = "this") %class.A = type { i32 } diff --git a/test/DebugInfo/X86/DW_AT_specification.ll b/test/DebugInfo/X86/DW_AT_specification.ll index f36e8ee9330..301a970f86d 100644 --- a/test/DebugInfo/X86/DW_AT_specification.ll +++ b/test/DebugInfo/X86/DW_AT_specification.ll @@ -3,8 +3,10 @@ ; test that the DW_AT_specification is a back edge in the file. -; CHECK: 0x0000[[OFFSET:[0-9a-f]*]]: DW_TAG_subprogram [7] * -; CHECK: DW_AT_specification [DW_FORM_ref4] (cu + 0x[[OFFSET]] => {0x0000[[OFFSET]]}) +; CHECK: DW_TAG_subprogram [{{[0-9]+}}] * +; CHECK: DW_AT_specification [DW_FORM_ref4] (cu + 0x[[OFFSET:[0-9a-f]*]] => {0x0000[[OFFSET]]}) +; CHECK: 0x0000[[OFFSET]]: DW_TAG_subprogram [{{[0-9]+}}] * +; CHECK: DW_AT_name [DW_FORM_strp] ( .debug_str[0x{{[0-9a-f]*}}] = "bar") @_ZZN3foo3barEvE1x = constant i32 0, align 4 diff --git a/test/DebugInfo/X86/elf-names.ll b/test/DebugInfo/X86/elf-names.ll index b85f5fb84bf..96538150f69 100644 --- a/test/DebugInfo/X86/elf-names.ll +++ b/test/DebugInfo/X86/elf-names.ll @@ -4,11 +4,14 @@ ; CHECK: 0x0000000b: DW_TAG_compile_unit ; CHECK: DW_AT_name [DW_FORM_strp] ( .debug_str[0x00000035] = "foo.cpp") -; CHECK: 0x0000003c: DW_TAG_class_type -; CHECK: DW_AT_name [DW_FORM_strp] ( .debug_str[0x0000006d] = "D") -; CHECK: 0x00000044: DW_TAG_member -; CHECK: DW_AT_name [DW_FORM_strp] ( .debug_str[0x0000005d] = "c1") -; CHECK: DW_AT_artificial [DW_FORM_flag_present] (true) +; CHECK: 0x{{[0-9a-f]+}}: DW_TAG_class_type +; CHECK: DW_AT_name [DW_FORM_strp] ( .debug_str[0x{{[0-9a-f]+}}] = "D") +; CHECK: 0x{{[0-9a-f]+}}: DW_TAG_member +; CHECK: DW_AT_name [DW_FORM_strp] ( .debug_str[0x{{[0-9a-f]+}}] = "c1") +; CHECK: DW_TAG_subprogram +; CHECK-NEXT: DW_AT_name [DW_FORM_strp] ( .debug_str[0x{{[0-9a-f]+}}] = "D") +; CHECK: DW_TAG_formal_parameter +; CHECK: DW_AT_artificial [DW_FORM_flag_present] (true) ; CHECK-DIS: [artificial] diff --git a/test/DebugInfo/X86/pr11300.ll b/test/DebugInfo/X86/pr11300.ll index cdd5a743d30..e2ccf6848f0 100644 --- a/test/DebugInfo/X86/pr11300.ll +++ b/test/DebugInfo/X86/pr11300.ll @@ -3,8 +3,11 @@ ; test that the DW_AT_specification is a back edge in the file. -; CHECK: [[BACK:0x[0-9a-f]*]]: DW_TAG_subprogram [6] -; CHECK: DW_AT_specification [DW_FORM_ref4] (cu + {{.*}} => {[[BACK]]}) +; CHECK: DW_TAG_subprogram +; CHECK: DW_AT_name [DW_FORM_strp] ( .debug_str[0x{{[0-9a-f]*}}] = "zed") +; CHECK: DW_TAG_subprogram +; CHECK-NEXT: DW_AT_specification [DW_FORM_ref4] (cu + {{.*}} => {[[BACK:0x[0-9a-f]*]]}) +; CHECK: [[BACK]]: DW_TAG_subprogram %struct.foo = type { i8 } diff --git a/test/DebugInfo/X86/template.ll b/test/DebugInfo/X86/template.ll index 2cf52e3460d..606d8b4cc15 100644 --- a/test/DebugInfo/X86/template.ll +++ b/test/DebugInfo/X86/template.ll @@ -17,9 +17,6 @@ ; CHECK-NOT: NULL ; CHECK: DW_TAG_template_type_parameter -; CHECK: [[INTPTR:0x[0-9a-f]*]]:{{ *}}DW_TAG_pointer_type -; CHECK-NEXT: DW_AT_type{{.*}} => {[[INT]]} - ; CHECK: DW_AT_name{{.*}}"func<3, &glbl, y_impl, 1, 2>" ; CHECK-NOT: NULL ; CHECK: DW_TAG_template_value_parameter @@ -33,7 +30,7 @@ ; CHECK-NEXT: DW_AT_const_value [DW_FORM_sdata]{{.*}}(3) ; CHECK: DW_TAG_template_value_parameter -; CHECK-NEXT: DW_AT_type{{.*}}=> {[[INTPTR]]} +; CHECK-NEXT: DW_AT_type{{.*}}=> {[[INTPTR:0x[0-9a-f]*]]} ; The address of the global 'glbl', followed by DW_OP_stack_value (9f), to use ; the value immediately, rather than indirecting through the address. @@ -56,6 +53,9 @@ ; CHECK-NEXT: DW_AT_type{{.*}}=> {[[INT]]} ; CHECK-NEXT: DW_AT_const_value [DW_FORM_sdata]{{.*}}(2) +; CHECK: [[INTPTR]]:{{ *}}DW_TAG_pointer_type +; CHECK-NEXT: DW_AT_type{{.*}} => {[[INT]]} + %"struct.y_impl::nested" = type { i8 } @glbl = global i32 0, align 4