From 39aae6036286c24bdb1d7dd49ccd588f93e8cb8f Mon Sep 17 00:00:00 2001 From: Richard Biener Date: Wed, 26 Sep 2018 14:35:48 +0000 Subject: [PATCH] re PR debug/87443 (GCC mixes abstract and concrete instances in abstract origins for inlines) 2018-09-26 Richard Biener 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. From-SVN: r264643 --- gcc/ChangeLog | 7 ++++++ gcc/dwarf2out.c | 14 +++++------ gcc/testsuite/ChangeLog | 5 ++++ gcc/testsuite/gcc.dg/debug/dwarf2/inline5.c | 26 +++++++++++++++++++++ 4 files changed, 44 insertions(+), 8 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/debug/dwarf2/inline5.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 1531c39102b..a9e276957d2 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2018-09-26 Richard Biener + + 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. + 2018-09-26 Alexey Neyman * graphite.h: Include and ; these diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c index 3c10ec8bbcc..b0c5c4f2512 100644 --- a/gcc/dwarf2out.c +++ b/gcc/dwarf2out.c @@ -24091,18 +24091,16 @@ gen_lexical_block_die (tree stmt, dw_die_ref context_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) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 49df3a1398b..aa005e71441 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2018-09-26 Richard Biener + + PR debug/87443 + * gcc.dg/debug/dwarf2/inline5.c: New testcase. + 2018-09-26 Martin Jambor PR c/87347 diff --git a/gcc/testsuite/gcc.dg/debug/dwarf2/inline5.c b/gcc/testsuite/gcc.dg/debug/dwarf2/inline5.c new file mode 100644 index 00000000000..4f4463b1868 --- /dev/null +++ b/gcc/testsuite/gcc.dg/debug/dwarf2/inline5.c @@ -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; +} -- 2.30.2