summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp14
-rw-r--r--test/DebugInfo/X86/DW_AT_object_pointer.ll2
-rw-r--r--test/DebugInfo/X86/DW_AT_specification.ll6
-rw-r--r--test/DebugInfo/X86/elf-names.ll13
-rw-r--r--test/DebugInfo/X86/pr11300.ll7
-rw-r--r--test/DebugInfo/X86/template.ll8
6 files changed, 27 insertions, 23 deletions
diff --git a/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp b/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp
index f58bddf99c..8528ab7edf 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 2bfc4c5004..f7533d49f8 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 f36e8ee933..301a970f86 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 b85f5fb84b..96538150f6 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 cdd5a743d3..e2ccf6848f 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 2cf52e3460..606d8b4cc1 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<int>::nested" = type { i8 }
@glbl = global i32 0, align 4