dwarf2: Set DW_AT_declaration for undefined fns [PR97060]
authorJason Merrill <jason@redhat.com>
Tue, 10 Nov 2020 23:02:04 +0000 (18:02 -0500)
committerJason Merrill <jason@redhat.com>
Thu, 12 Nov 2020 05:58:04 +0000 (00:58 -0500)
If DECL_INITIAL isn't set, we can't emit anything about the body of the
function, so add the declaration attribute.

gcc/ChangeLog:

PR debug/97060
* dwarf2out.c (gen_subprogram_die): It's a declaration
if DECL_INITIAL isn't set.

gcc/testsuite/ChangeLog:

PR debug/97060
* gcc.dg/debug/dwarf2/pr97060.c: New test.

gcc/dwarf2out.c
gcc/testsuite/gcc.dg/debug/dwarf2/pr97060.c [new file with mode: 0644]

index bea02f9fbce54a0c5b05dde0148549e312440f1a..4452b9fa89eff78df602cb53e84f501ec29b6e48 100644 (file)
@@ -22859,6 +22859,7 @@ gen_subprogram_die (tree decl, dw_die_ref context_die)
           available.
   */
   int declaration = (current_function_decl != decl
+                    || (!DECL_INITIAL (decl) && !origin)
                     || class_or_namespace_scope_p (context_die));
 
   /* A declaration that has been previously dumped needs no
diff --git a/gcc/testsuite/gcc.dg/debug/dwarf2/pr97060.c b/gcc/testsuite/gcc.dg/debug/dwarf2/pr97060.c
new file mode 100644 (file)
index 0000000..c07b904
--- /dev/null
@@ -0,0 +1,13 @@
+/* PR debug/97060 */
+/* { dg-do compile } */
+/* { dg-options "-g -dA" } */
+/* { dg-final { scan-assembler-times "DW_AT_declaration" 2 } } */
+
+extern int foo (unsigned int, unsigned int);
+
+int
+bar (void)
+{
+  foo (1, 2);
+  return 0;
+}