diff mbox series

Fix PR87443, bogus/missing DW_AT_abstract_origins

Message ID alpine.LSU.2.20.1809261527230.16707@zhemvz.fhfr.qr
State New
Headers show
Series Fix PR87443, bogus/missing DW_AT_abstract_origins | expand

Commit Message

Richard Biener Sept. 26, 2018, 1:30 p.m. UTC
This fixes mentioned PR (I should stop looking at generated debug
info...) where it notes that concrete inline instance DW_TAG_lexical_block
miss DW_AT_abstract_origin attributes pointing to the abstract instance
and that inline instances of DW_TAG_lexical_block have 
DW_AT_abstract_origins pointing to other inline or concrete instances
rather than the abstract instance.

Bootstrapped on x86_64-unknown-linux-gnu, testing in progress.

I even added a testcase.  Yay.

OK?

Thanks,
Richard.

2018-09-26  Richard Biener  <rguenther@suse.de>

	PR debug/87443
	* dwarf2out.c (gen_lexical_block_die): Do not equate inline
	or concrete instance DIE to the tree.  Create abstract origin
	attributes also for concrete instances.

	* gcc.dg/debug/dwarf2/inline5.c: New testcase.

Comments

Jason Merrill Sept. 26, 2018, 1:40 p.m. UTC | #1
OK.

On Wed, Sep 26, 2018 at 9:30 AM, Richard Biener <rguenther@suse.de> wrote:
>
> This fixes mentioned PR (I should stop looking at generated debug
> info...) where it notes that concrete inline instance DW_TAG_lexical_block
> miss DW_AT_abstract_origin attributes pointing to the abstract instance
> and that inline instances of DW_TAG_lexical_block have
> DW_AT_abstract_origins pointing to other inline or concrete instances
> rather than the abstract instance.
>
> Bootstrapped on x86_64-unknown-linux-gnu, testing in progress.
>
> I even added a testcase.  Yay.
>
> OK?
>
> Thanks,
> Richard.
>
> 2018-09-26  Richard Biener  <rguenther@suse.de>
>
>         PR debug/87443
>         * dwarf2out.c (gen_lexical_block_die): Do not equate inline
>         or concrete instance DIE to the tree.  Create abstract origin
>         attributes also for concrete instances.
>
>         * gcc.dg/debug/dwarf2/inline5.c: New testcase.
>
> Index: gcc/dwarf2out.c
> ===================================================================
> --- gcc/dwarf2out.c     (revision 264594)
> +++ gcc/dwarf2out.c     (working copy)
> @@ -24091,18 +24091,16 @@ gen_lexical_block_die (tree stmt, dw_die
>      }
>    else if (BLOCK_ABSTRACT_ORIGIN (stmt))
>      {
> -      /* If this is an inlined instance, create a new lexical die for
> -        anything below to attach DW_AT_abstract_origin to.  */
> +      /* If this is an inlined or conrecte instance, create a new lexical
> +        die for anything below to attach DW_AT_abstract_origin to.  */
>        if (old_die)
> -       {
> -         stmt_die = new_die (DW_TAG_lexical_block, context_die, stmt);
> -         equate_block_to_die (stmt, stmt_die);
> -         old_die = NULL;
> -       }
> +       stmt_die = new_die (DW_TAG_lexical_block, context_die, stmt);
>
>        tree origin = block_ultimate_origin (stmt);
> -      if (origin != NULL_TREE && origin != stmt)
> +      if (origin != NULL_TREE && (origin != stmt || old_die))
>         add_abstract_origin_attribute (stmt_die, origin);
> +
> +      old_die = NULL;
>      }
>
>    if (old_die)
>
> Index: gcc/testsuite/gcc.dg/debug/dwarf2/inline5.c
> ===================================================================
> --- gcc/testsuite/gcc.dg/debug/dwarf2/inline5.c (nonexistent)
> +++ gcc/testsuite/gcc.dg/debug/dwarf2/inline5.c (working copy)
> @@ -0,0 +1,26 @@
> +/* Verify that the concrete instance DW_TAG_lexical_block has an abstract
> +   origin.  Verify that the inline instance has the abstract instance as
> +   abstract origin rather than the concrete one.  */
> +/* { dg-options "-O -gdwarf -dA" } */
> +/* { dg-do compile } */
> +/* { dg-final { scan-assembler-times "DW_TAG_inlined_subroutine" 2 } } */
> +/* { dg-final { scan-assembler-times "DW_TAG_lexical_block\\)\[^#\]*# DW_AT_abstract_origin" 2 } } */
> +/* { dg-final { scan-assembler-times "DW_TAG_lexical_block\\)\[^#\]*# \\(DIE \\(0x\[0-9a-f\]*\\) DW_TAG_variable" 1 } } */
> +/* We do not know which is output first so look for both invalid abstract
> +   origins on the lexical blocks (knowing that the abstract instance has
> +   no attribute following the DW_TAG_lexical_block.  */
> +/* { dg-final { scan-assembler-not "\\(DIE \\(0x(\[0-9a-f\]*)\\) DW_TAG_lexical_block\\)\[^#\]*# \[^(\].*DW_TAG_lexical_block\\)\[^#x\]*x\\1\[^#\]*# DW_AT_abstract_origin" } } */
> +/* { dg-final { scan-assembler-not "DW_TAG_lexical_block\\)\[^#x\]*x(\[0-9a-f\]*)\[^#\]*# DW_AT_abstract_origin.*\\(DIE \\(0x\\1\\) DW_TAG_lexical_block\\)\[^#\]*# DW_AT" } } */
> +
> +int foo (int i)
> +{
> +    {
> +      volatile int j = i + 3;
> +      return j - 2;
> +    }
> +}
> +int main()
> +{
> +  volatile int z = foo (-1);
> +  return z;
> +}
diff mbox series

Patch

Index: gcc/dwarf2out.c
===================================================================
--- gcc/dwarf2out.c	(revision 264594)
+++ gcc/dwarf2out.c	(working copy)
@@ -24091,18 +24091,16 @@  gen_lexical_block_die (tree stmt, dw_die
     }
   else if (BLOCK_ABSTRACT_ORIGIN (stmt))
     {
-      /* If this is an inlined instance, create a new lexical die for
-	 anything below to attach DW_AT_abstract_origin to.  */
+      /* If this is an inlined or conrecte instance, create a new lexical
+	 die for anything below to attach DW_AT_abstract_origin to.  */
       if (old_die)
-	{
-	  stmt_die = new_die (DW_TAG_lexical_block, context_die, stmt);
-	  equate_block_to_die (stmt, stmt_die);
-	  old_die = NULL;
-	}
+	stmt_die = new_die (DW_TAG_lexical_block, context_die, stmt);
 
       tree origin = block_ultimate_origin (stmt);
-      if (origin != NULL_TREE && origin != stmt)
+      if (origin != NULL_TREE && (origin != stmt || old_die))
 	add_abstract_origin_attribute (stmt_die, origin);
+
+      old_die = NULL;
     }
 
   if (old_die)

Index: gcc/testsuite/gcc.dg/debug/dwarf2/inline5.c
===================================================================
--- gcc/testsuite/gcc.dg/debug/dwarf2/inline5.c	(nonexistent)
+++ gcc/testsuite/gcc.dg/debug/dwarf2/inline5.c	(working copy)
@@ -0,0 +1,26 @@ 
+/* Verify that the concrete instance DW_TAG_lexical_block has an abstract
+   origin.  Verify that the inline instance has the abstract instance as
+   abstract origin rather than the concrete one.  */
+/* { dg-options "-O -gdwarf -dA" } */
+/* { dg-do compile } */
+/* { dg-final { scan-assembler-times "DW_TAG_inlined_subroutine" 2 } } */
+/* { dg-final { scan-assembler-times "DW_TAG_lexical_block\\)\[^#\]*# DW_AT_abstract_origin" 2 } } */
+/* { dg-final { scan-assembler-times "DW_TAG_lexical_block\\)\[^#\]*# \\(DIE \\(0x\[0-9a-f\]*\\) DW_TAG_variable" 1 } } */
+/* We do not know which is output first so look for both invalid abstract
+   origins on the lexical blocks (knowing that the abstract instance has
+   no attribute following the DW_TAG_lexical_block.  */
+/* { dg-final { scan-assembler-not "\\(DIE \\(0x(\[0-9a-f\]*)\\) DW_TAG_lexical_block\\)\[^#\]*# \[^(\].*DW_TAG_lexical_block\\)\[^#x\]*x\\1\[^#\]*# DW_AT_abstract_origin" } } */
+/* { dg-final { scan-assembler-not "DW_TAG_lexical_block\\)\[^#x\]*x(\[0-9a-f\]*)\[^#\]*# DW_AT_abstract_origin.*\\(DIE \\(0x\\1\\) DW_TAG_lexical_block\\)\[^#\]*# DW_AT" } } */
+
+int foo (int i)
+{
+    {
+      volatile int j = i + 3;
+      return j - 2;
+    }
+}
+int main()
+{
+  volatile int z = foo (-1);
+  return z;
+}