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.