https://gcc.gnu.org/bugzilla/show_bug.cgi?id=97060

Jakub Jelinek <jakub at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |jason at gcc dot gnu.org

--- Comment #12 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
So, I've tried to bootstrap/regtest an adjusted patch:
2020-09-16  Jakub Jelinek  <ja...@redhat.com>

        PR debug/97060
        * dwarf2out.c (dwarf2out_early_global_decl): For FUNCTION_DECLs
        and their abstract origins, if they don't have gimple body,
        set current_function_decl to NULL rather than the decl or origin.

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

--- gcc/dwarf2out.c.jj  2020-09-07 13:17:58.383594248 +0200
+++ gcc/dwarf2out.c     2020-09-16 11:14:57.763550862 +0200
@@ -26547,7 +26547,12 @@ dwarf2out_early_global_decl (tree decl)
              && ((origin_die = lookup_decl_die (origin)) == NULL
                  || is_declaration_die (origin_die)))
            {
-             current_function_decl = origin;
+             cgraph_node *cnode = cgraph_node::get (origin);
+             if ((cnode && cnode->has_gimple_body_p ())
+                 || decl_ultimate_origin (origin))
+               current_function_decl = origin;
+             else
+               current_function_decl = NULL_TREE;
              dwarf2out_decl (origin);
            }

@@ -26556,7 +26561,12 @@ dwarf2out_early_global_decl (tree decl)
          if ((old_die = lookup_decl_die (decl)) == NULL
              || is_declaration_die (old_die))
            {
-             current_function_decl = decl;
+             cgraph_node *cnode = cgraph_node::get (decl);
+             if ((cnode && cnode->has_gimple_body_p ())
+                 || decl_ultimate_origin (decl))
+               current_function_decl = decl;
+             else
+               current_function_decl = NULL_TREE;
              dwarf2out_decl (decl);
            }

--- gcc/testsuite/gcc.dg/debug/dwarf2/pr97060.c.jj      2020-09-16
11:03:22.358420449 +0200
+++ gcc/testsuite/gcc.dg/debug/dwarf2/pr97060.c 2020-09-16 11:03:17.717486318
+0200
@@ -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;
+}

It passes bootstrap, but causes some regressions:
-FAIL: g++.dg/guality/pr55665.C   -O2 -flto -fno-use-linker-plugin
-flto-partition=none  line 23 p == 40
+FAIL: g++.dg/debug/dwarf2/array-3.C  -std=gnu++11  scan-assembler-times 
DW_TAG_const_type 5
+FAIL: g++.dg/debug/dwarf2/array-3.C  -std=gnu++14  scan-assembler-times 
DW_TAG_const_type 5
+FAIL: g++.dg/debug/dwarf2/array-3.C  -std=gnu++17  scan-assembler-times 
DW_TAG_const_type 5
+FAIL: g++.dg/debug/dwarf2/array-3.C  -std=gnu++2a  scan-assembler-times 
DW_TAG_const_type 5
+FAIL: g++.dg/debug/dwarf2/array-3.C  -std=gnu++98  scan-assembler-times 
DW_TAG_const_type 5
+FAIL: g++.dg/debug/dwarf2/array-4.C  -std=gnu++11  scan-assembler-times 
DW_TAG_const_type 4
+FAIL: g++.dg/debug/dwarf2/array-4.C  -std=gnu++14  scan-assembler-times 
DW_TAG_const_type 4
+FAIL: g++.dg/debug/dwarf2/array-4.C  -std=gnu++17  scan-assembler-times 
DW_TAG_const_type 4
+FAIL: g++.dg/debug/dwarf2/array-4.C  -std=gnu++2a  scan-assembler-times 
DW_TAG_const_type 4
+FAIL: g++.dg/debug/dwarf2/array-4.C  -std=gnu++98  scan-assembler-times 
DW_TAG_const_type 4
+FAIL: g++.dg/debug/dwarf2/defaulted-member-function-2.C   scan-assembler-times
0x2[ \\t][^\\n]* DW_AT_defaulted 1
+FAIL: g++.dg/debug/dwarf2/local-var-in-contructor.C  -std=gnu++11 
scan-assembler problem
+FAIL: g++.dg/debug/dwarf2/local-var-in-contructor.C  -std=gnu++14 
scan-assembler problem
+FAIL: g++.dg/debug/dwarf2/local-var-in-contructor.C  -std=gnu++17 
scan-assembler problem
+FAIL: g++.dg/debug/dwarf2/local-var-in-contructor.C  -std=gnu++2a 
scan-assembler problem
+FAIL: g++.dg/debug/dwarf2/local-var-in-contructor.C  -std=gnu++98 
scan-assembler problem
+FAIL: g++.dg/debug/dwarf2/pubnames-2.C  -std=gnu++11  scan-assembler
"one::c1::c1\\\\\\\\0"+[ \\t]+[#;/|@!]+[ \\t]+external name
+FAIL: g++.dg/debug/dwarf2/pubnames-2.C  -std=gnu++11  scan-assembler
"one::c1::~c1\\\\\\\\0"+[ \\t]+[#;/|@!]+[ \\t]+external name
+FAIL: g++.dg/debug/dwarf2/pubnames-2.C  -std=gnu++11  scan-assembler
"two::c2<double>::c2\\\\\\\\0"+[ \\t]+[#;/|@!]+[ \\t]+external name
+FAIL: g++.dg/debug/dwarf2/pubnames-2.C  -std=gnu++11  scan-assembler
"two::c2<double>::~c2\\\\\\\\0"+[ \\t]+[#;/|@!]+[ \\t]+external name
+FAIL: g++.dg/debug/dwarf2/pubnames-2.C  -std=gnu++11  scan-assembler
"two::c2<int const\\\\*>::c2\\\\\\\\0"+[ \\t]+[#;/|@!]+[ \\t]+external name
+FAIL: g++.dg/debug/dwarf2/pubnames-2.C  -std=gnu++11  scan-assembler
"two::c2<int const\\\\*>::~c2\\\\\\\\0"+[ \\t]+[#;/|@!]+[ \\t]+external name
+FAIL: g++.dg/debug/dwarf2/pubnames-2.C  -std=gnu++11  scan-assembler
"two::c2<int>::c2\\\\\\\\0"+[ \\t]+[#;/|@!]+[ \\t]+external name
+FAIL: g++.dg/debug/dwarf2/pubnames-2.C  -std=gnu++11  scan-assembler
"two::c2<int>::~c2\\\\\\\\0"+[ \\t]+[#;/|@!]+[ \\t]+external name
+FAIL: g++.dg/debug/dwarf2/pubnames-2.C  -std=gnu++14  scan-assembler
"one::c1::c1\\\\\\\\0"+[ \\t]+[#;/|@!]+[ \\t]+external name
+FAIL: g++.dg/debug/dwarf2/pubnames-2.C  -std=gnu++14  scan-assembler
"one::c1::~c1\\\\\\\\0"+[ \\t]+[#;/|@!]+[ \\t]+external name
+FAIL: g++.dg/debug/dwarf2/pubnames-2.C  -std=gnu++14  scan-assembler
"two::c2<double>::c2\\\\\\\\0"+[ \\t]+[#;/|@!]+[ \\t]+external name
+FAIL: g++.dg/debug/dwarf2/pubnames-2.C  -std=gnu++14  scan-assembler
"two::c2<double>::~c2\\\\\\\\0"+[ \\t]+[#;/|@!]+[ \\t]+external name
+FAIL: g++.dg/debug/dwarf2/pubnames-2.C  -std=gnu++14  scan-assembler
"two::c2<int const\\\\*>::c2\\\\\\\\0"+[ \\t]+[#;/|@!]+[ \\t]+external name
+FAIL: g++.dg/debug/dwarf2/pubnames-2.C  -std=gnu++14  scan-assembler
"two::c2<int const\\\\*>::~c2\\\\\\\\0"+[ \\t]+[#;/|@!]+[ \\t]+external name
+FAIL: g++.dg/debug/dwarf2/pubnames-2.C  -std=gnu++14  scan-assembler
"two::c2<int>::c2\\\\\\\\0"+[ \\t]+[#;/|@!]+[ \\t]+external name
+FAIL: g++.dg/debug/dwarf2/pubnames-2.C  -std=gnu++14  scan-assembler
"two::c2<int>::~c2\\\\\\\\0"+[ \\t]+[#;/|@!]+[ \\t]+external name
+FAIL: g++.dg/debug/dwarf2/pubnames-2.C  -std=gnu++17  scan-assembler
"one::c1::c1\\\\\\\\0"+[ \\t]+[#;/|@!]+[ \\t]+external name
+FAIL: g++.dg/debug/dwarf2/pubnames-2.C  -std=gnu++17  scan-assembler
"one::c1::~c1\\\\\\\\0"+[ \\t]+[#;/|@!]+[ \\t]+external name
+FAIL: g++.dg/debug/dwarf2/pubnames-2.C  -std=gnu++17  scan-assembler
"two::c2<double>::c2\\\\\\\\0"+[ \\t]+[#;/|@!]+[ \\t]+external name
+FAIL: g++.dg/debug/dwarf2/pubnames-2.C  -std=gnu++17  scan-assembler
"two::c2<double>::~c2\\\\\\\\0"+[ \\t]+[#;/|@!]+[ \\t]+external name
+FAIL: g++.dg/debug/dwarf2/pubnames-2.C  -std=gnu++17  scan-assembler
"two::c2<int const\\\\*>::c2\\\\\\\\0"+[ \\t]+[#;/|@!]+[ \\t]+external name
+FAIL: g++.dg/debug/dwarf2/pubnames-2.C  -std=gnu++17  scan-assembler
"two::c2<int const\\\\*>::~c2\\\\\\\\0"+[ \\t]+[#;/|@!]+[ \\t]+external name
+FAIL: g++.dg/debug/dwarf2/pubnames-2.C  -std=gnu++17  scan-assembler
"two::c2<int>::c2\\\\\\\\0"+[ \\t]+[#;/|@!]+[ \\t]+external name
+FAIL: g++.dg/debug/dwarf2/pubnames-2.C  -std=gnu++17  scan-assembler
"two::c2<int>::~c2\\\\\\\\0"+[ \\t]+[#;/|@!]+[ \\t]+external name
+FAIL: g++.dg/debug/dwarf2/pubnames-2.C  -std=gnu++2a  scan-assembler
"one::c1::c1\\\\\\\\0"+[ \\t]+[#;/|@!]+[ \\t]+external name
+FAIL: g++.dg/debug/dwarf2/pubnames-2.C  -std=gnu++2a  scan-assembler
"one::c1::~c1\\\\\\\\0"+[ \\t]+[#;/|@!]+[ \\t]+external name
+FAIL: g++.dg/debug/dwarf2/pubnames-2.C  -std=gnu++2a  scan-assembler
"two::c2<double>::c2\\\\\\\\0"+[ \\t]+[#;/|@!]+[ \\t]+external name
+FAIL: g++.dg/debug/dwarf2/pubnames-2.C  -std=gnu++2a  scan-assembler
"two::c2<double>::~c2\\\\\\\\0"+[ \\t]+[#;/|@!]+[ \\t]+external name
+FAIL: g++.dg/debug/dwarf2/pubnames-2.C  -std=gnu++2a  scan-assembler
"two::c2<int const\\\\*>::c2\\\\\\\\0"+[ \\t]+[#;/|@!]+[ \\t]+external name
+FAIL: g++.dg/debug/dwarf2/pubnames-2.C  -std=gnu++2a  scan-assembler
"two::c2<int const\\\\*>::~c2\\\\\\\\0"+[ \\t]+[#;/|@!]+[ \\t]+external name
+FAIL: g++.dg/debug/dwarf2/pubnames-2.C  -std=gnu++2a  scan-assembler
"two::c2<int>::c2\\\\\\\\0"+[ \\t]+[#;/|@!]+[ \\t]+external name
+FAIL: g++.dg/debug/dwarf2/pubnames-2.C  -std=gnu++2a  scan-assembler
"two::c2<int>::~c2\\\\\\\\0"+[ \\t]+[#;/|@!]+[ \\t]+external name
+FAIL: g++.dg/debug/dwarf2/pubnames-3.C  -std=gnu++11  scan-assembler
"one::c1::c1\\\\\\\\0"+[ \\t]+[#;/|@!]+[ \\t]+external name
+FAIL: g++.dg/debug/dwarf2/pubnames-3.C  -std=gnu++11  scan-assembler
"one::c1::~c1\\\\\\\\0"+[ \\t]+[#;/|@!]+[ \\t]+external name
+FAIL: g++.dg/debug/dwarf2/pubnames-3.C  -std=gnu++11  scan-assembler
"two::c2<double>::c2\\\\\\\\0"+[ \\t]+[#;/|@!]+[ \\t]+external name
+FAIL: g++.dg/debug/dwarf2/pubnames-3.C  -std=gnu++11  scan-assembler
"two::c2<double>::~c2\\\\\\\\0"+[ \\t]+[#;/|@!]+[ \\t]+external name
+FAIL: g++.dg/debug/dwarf2/pubnames-3.C  -std=gnu++11  scan-assembler
"two::c2<int const\\\\*>::c2\\\\\\\\0"+[ \\t]+[#;/|@!]+[ \\t]+external name
+FAIL: g++.dg/debug/dwarf2/pubnames-3.C  -std=gnu++11  scan-assembler
"two::c2<int const\\\\*>::~c2\\\\\\\\0"+[ \\t]+[#;/|@!]+[ \\t]+external name
+FAIL: g++.dg/debug/dwarf2/pubnames-3.C  -std=gnu++11  scan-assembler
"two::c2<int>::c2\\\\\\\\0"+[ \\t]+[#;/|@!]+[ \\t]+external name
+FAIL: g++.dg/debug/dwarf2/pubnames-3.C  -std=gnu++11  scan-assembler
"two::c2<int>::~c2\\\\\\\\0"+[ \\t]+[#;/|@!]+[ \\t]+external name
+FAIL: g++.dg/debug/dwarf2/pubnames-3.C  -std=gnu++14  scan-assembler
"one::c1::c1\\\\\\\\0"+[ \\t]+[#;/|@!]+[ \\t]+external name
+FAIL: g++.dg/debug/dwarf2/pubnames-3.C  -std=gnu++14  scan-assembler
"one::c1::~c1\\\\\\\\0"+[ \\t]+[#;/|@!]+[ \\t]+external name
+FAIL: g++.dg/debug/dwarf2/pubnames-3.C  -std=gnu++14  scan-assembler
"two::c2<double>::c2\\\\\\\\0"+[ \\t]+[#;/|@!]+[ \\t]+external name
+FAIL: g++.dg/debug/dwarf2/pubnames-3.C  -std=gnu++14  scan-assembler
"two::c2<double>::~c2\\\\\\\\0"+[ \\t]+[#;/|@!]+[ \\t]+external name
+FAIL: g++.dg/debug/dwarf2/pubnames-3.C  -std=gnu++14  scan-assembler
"two::c2<int const\\\\*>::c2\\\\\\\\0"+[ \\t]+[#;/|@!]+[ \\t]+external name
+FAIL: g++.dg/debug/dwarf2/pubnames-3.C  -std=gnu++14  scan-assembler
"two::c2<int const\\\\*>::~c2\\\\\\\\0"+[ \\t]+[#;/|@!]+[ \\t]+external name
+FAIL: g++.dg/debug/dwarf2/pubnames-3.C  -std=gnu++14  scan-assembler
"two::c2<int>::c2\\\\\\\\0"+[ \\t]+[#;/|@!]+[ \\t]+external name
+FAIL: g++.dg/debug/dwarf2/pubnames-3.C  -std=gnu++14  scan-assembler
"two::c2<int>::~c2\\\\\\\\0"+[ \\t]+[#;/|@!]+[ \\t]+external name
+FAIL: g++.dg/debug/dwarf2/pubnames-3.C  -std=gnu++17  scan-assembler
"one::c1::c1\\\\\\\\0"+[ \\t]+[#;/|@!]+[ \\t]+external name
+FAIL: g++.dg/debug/dwarf2/pubnames-3.C  -std=gnu++17  scan-assembler
"one::c1::~c1\\\\\\\\0"+[ \\t]+[#;/|@!]+[ \\t]+external name
+FAIL: g++.dg/debug/dwarf2/pubnames-3.C  -std=gnu++17  scan-assembler
"two::c2<double>::c2\\\\\\\\0"+[ \\t]+[#;/|@!]+[ \\t]+external name
+FAIL: g++.dg/debug/dwarf2/pubnames-3.C  -std=gnu++17  scan-assembler
"two::c2<double>::~c2\\\\\\\\0"+[ \\t]+[#;/|@!]+[ \\t]+external name
+FAIL: g++.dg/debug/dwarf2/pubnames-3.C  -std=gnu++17  scan-assembler
"two::c2<int const\\\\*>::c2\\\\\\\\0"+[ \\t]+[#;/|@!]+[ \\t]+external name
+FAIL: g++.dg/debug/dwarf2/pubnames-3.C  -std=gnu++17  scan-assembler
"two::c2<int const\\\\*>::~c2\\\\\\\\0"+[ \\t]+[#;/|@!]+[ \\t]+external name
+FAIL: g++.dg/debug/dwarf2/pubnames-3.C  -std=gnu++17  scan-assembler
"two::c2<int>::c2\\\\\\\\0"+[ \\t]+[#;/|@!]+[ \\t]+external name
+FAIL: g++.dg/debug/dwarf2/pubnames-3.C  -std=gnu++17  scan-assembler
"two::c2<int>::~c2\\\\\\\\0"+[ \\t]+[#;/|@!]+[ \\t]+external name
+FAIL: g++.dg/debug/dwarf2/pubnames-3.C  -std=gnu++2a  scan-assembler
"one::c1::c1\\\\\\\\0"+[ \\t]+[#;/|@!]+[ \\t]+external name
+FAIL: g++.dg/debug/dwarf2/pubnames-3.C  -std=gnu++2a  scan-assembler
"one::c1::~c1\\\\\\\\0"+[ \\t]+[#;/|@!]+[ \\t]+external name
+FAIL: g++.dg/debug/dwarf2/pubnames-3.C  -std=gnu++2a  scan-assembler
"two::c2<double>::c2\\\\\\\\0"+[ \\t]+[#;/|@!]+[ \\t]+external name
+FAIL: g++.dg/debug/dwarf2/pubnames-3.C  -std=gnu++2a  scan-assembler
"two::c2<double>::~c2\\\\\\\\0"+[ \\t]+[#;/|@!]+[ \\t]+external name
+FAIL: g++.dg/debug/dwarf2/pubnames-3.C  -std=gnu++2a  scan-assembler
"two::c2<int const\\\\*>::c2\\\\\\\\0"+[ \\t]+[#;/|@!]+[ \\t]+external name
+FAIL: g++.dg/debug/dwarf2/pubnames-3.C  -std=gnu++2a  scan-assembler
"two::c2<int const\\\\*>::~c2\\\\\\\\0"+[ \\t]+[#;/|@!]+[ \\t]+external name
+FAIL: g++.dg/debug/dwarf2/pubnames-3.C  -std=gnu++2a  scan-assembler
"two::c2<int>::c2\\\\\\\\0"+[ \\t]+[#;/|@!]+[ \\t]+external name
+FAIL: g++.dg/debug/dwarf2/pubnames-3.C  -std=gnu++2a  scan-assembler
"two::c2<int>::~c2\\\\\\\\0"+[ \\t]+[#;/|@!]+[ \\t]+external name
+FAIL: g++.dg/debug/dwarf2/static-local-var-in-ctor.C  -std=gnu++11 
scan-assembler DW_OP_addr[^\\n\\r]*[\\n\\r]*[^\\n\\r]*staticvar1
+FAIL: g++.dg/debug/dwarf2/static-local-var-in-ctor.C  -std=gnu++14 
scan-assembler DW_OP_addr[^\\n\\r]*[\\n\\r]*[^\\n\\r]*staticvar1
+FAIL: g++.dg/debug/dwarf2/static-local-var-in-ctor.C  -std=gnu++17 
scan-assembler DW_OP_addr[^\\n\\r]*[\\n\\r]*[^\\n\\r]*staticvar1
+FAIL: g++.dg/debug/dwarf2/static-local-var-in-ctor.C  -std=gnu++2a 
scan-assembler DW_OP_addr[^\\n\\r]*[\\n\\r]*[^\\n\\r]*staticvar1
+FAIL: g++.dg/debug/dwarf2/static-local-var-in-ctor.C  -std=gnu++98 
scan-assembler DW_OP_addr[^\\n\\r]*[\\n\\r]*[^\\n\\r]*staticvar1
+FAIL: g++.dg/pr78112-2.C   scan-assembler-times DW_AT_object_pointer 12
+FAIL: g++.dg/pr82155.C  -std=gnu++11 (internal compiler error)
+FAIL: g++.dg/pr82155.C  -std=gnu++11 (test for excess errors)
+FAIL: g++.dg/pr82155.C  -std=gnu++14 (internal compiler error)
+FAIL: g++.dg/pr82155.C  -std=gnu++14 (test for excess errors)
+FAIL: g++.dg/pr82155.C  -std=gnu++17 (internal compiler error)
+FAIL: g++.dg/pr82155.C  -std=gnu++17 (test for excess errors)
+FAIL: g++.dg/pr82155.C  -std=gnu++2a (internal compiler error)
+FAIL: g++.dg/pr82155.C  -std=gnu++2a (test for excess errors)

The ICEs are due to dwarf2out_early_finish -> prune_unused_types ->
prune_unused_types_prune -> mark_removed -> mark_removed marking the k method's
DW_TAG_subprogram as removed (surprisingly, for k itself the above patch makes
no difference, it only makes operator-> and some ctor variants
DW_AT_declaration).  Later on during function versioning, IPA calls
dwarf2out_abstract_function on k and that function assumes lookup_decl_die
succeeds, but due to the pruning it does not.
The other changes are not ICEs, I'd say again type prunning results in fewer
attributes being emitted.
But why it hasn't been a problem before the PR96383 changes is a mystery.

Reply via email to