From 7488b5779f3d2c350ce7b2bfe8e8cce145efe417 Mon Sep 17 00:00:00 2001 From: Richard Biener Date: Thu, 31 Aug 2017 11:20:54 +0000 Subject: [PATCH] re PR c++/82054 (ICE in add_dwarf_attr with -fopenmp and -g) 2017-08-31 Richard Biener PR middle-end/82054 * dwarf2out.c (dwarf2out_early_global_decl): Process each function only once. * g++.dg/gomp/pr82054.C: New testcase. From-SVN: r251559 --- gcc/ChangeLog | 6 ++++++ gcc/dwarf2out.c | 19 ++++++++++++++----- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/g++.dg/gomp/pr82054.C | 13 +++++++++++++ 4 files changed, 38 insertions(+), 5 deletions(-) create mode 100644 gcc/testsuite/g++.dg/gomp/pr82054.C diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 239c9339063..175759c54aa 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2017-08-31 Richard Biener + + PR middle-end/82054 + * dwarf2out.c (dwarf2out_early_global_decl): Process each + function only once. + 2017-08-31 Tamar Christina * config/aarch64/aarch64-builtins.c (aarch64_init_simd_builtins): diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c index 42da36ca62e..651dd0c7872 100644 --- a/gcc/dwarf2out.c +++ b/gcc/dwarf2out.c @@ -25492,9 +25492,10 @@ dwarf2out_early_global_decl (tree decl) if (TREE_CODE (decl) != TYPE_DECL && TREE_CODE (decl) != PARM_DECL) { - tree save_fndecl = current_function_decl; if (TREE_CODE (decl) == FUNCTION_DECL) { + tree save_fndecl = current_function_decl; + /* For nested functions, make sure we have DIEs for the parents first so that all nested DIEs are generated at the proper scope in the first shot. */ @@ -25521,11 +25522,19 @@ dwarf2out_early_global_decl (tree decl) dwarf2out_decl (origin); } - current_function_decl = decl; + /* Emit the DIE for decl but avoid doing that multiple times. */ + dw_die_ref old_die; + if ((old_die = lookup_decl_die (decl)) == NULL + || is_declaration_die (old_die)) + { + current_function_decl = decl; + dwarf2out_decl (decl); + } + + current_function_decl = save_fndecl; } - dwarf2out_decl (decl); - if (TREE_CODE (decl) == FUNCTION_DECL) - current_function_decl = save_fndecl; + else + dwarf2out_decl (decl); } symtab->global_info_ready = save; } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 98b269e3dbf..ff5169ae1f7 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2017-08-31 Richard Biener + + PR middle-end/82054 + * g++.dg/gomp/pr82054.C: New testcase. + 2017-08-31 Renlin Li Aaron Sawdey diff --git a/gcc/testsuite/g++.dg/gomp/pr82054.C b/gcc/testsuite/g++.dg/gomp/pr82054.C new file mode 100644 index 00000000000..3c6aa27c7f4 --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/pr82054.C @@ -0,0 +1,13 @@ +// { dg-do compile } +// { dg-additional-options "-g" } + +class a +{ + bool b (); +}; +bool +a::b () +{ +#pragma omp parallel + ; +} -- 2.30.2