diff options
author | Pierre-Marie de Rodat <derodat@adacore.com> | 2017-09-25 12:26:36 +0000 |
---|---|---|
committer | Pierre-Marie de Rodat <pmderodat@gcc.gnu.org> | 2017-09-25 12:26:36 +0000 |
commit | 504e0b5f2c7128a89f869ca984949d063bab52c4 (patch) | |
tree | 1835ef494a1d2796ab0739ed02b9dfc3d0206767 /gcc/dwarf2out.c | |
parent | d362ac6c6d5a9419d9b7a0db84155a065e113434 (diff) | |
download | gcc-504e0b5f2c7128a89f869ca984949d063bab52c4.zip gcc-504e0b5f2c7128a89f869ca984949d063bab52c4.tar.gz gcc-504e0b5f2c7128a89f869ca984949d063bab52c4.tar.bz2 |
[PR82155] Fix crash in dwarf2out_abstract_function
This patch is an attempt to fix the crash reported in PR82155.
When generating a C++ class method for a class that is itself nested in
a class method, dwarf2out_early_global_decl currently leaves the
existing context DIE as it is if it already exists. However, it is
possible that this call happens at a point where this context DIE is
just a declaration that is itself not located in its own context.
From there, if dwarf2out_early_global_decl is not called on any of the
FUNCTION_DECL in the context chain, DIEs will be left badly scoped and
some (such as the nested method) will be removed by the type pruning
machinery. As a consequence, dwarf2out_abstract_function will will
crash when called on the corresponding DECL because it asserts that the
DECL has a DIE.
This patch fixes this crash making dwarf2out_early_global_decl process
context DIEs the same way we process abstract origins for FUNCTION_DECL:
if the corresponding DIE exists but is only a declaration, call
dwarf2out_decl anyway on it so that it is turned into a more complete
DIE and so that it is relocated in the proper context.
Bootstrapped and regtested on x86_64-linux.
gcc/
PR debug/82155
* dwarf2out.c (dwarf2out_early_global_decl): Call dwarf2out_decl
on the FUNCTION_DECL function context if it has a DIE that is a
declaration.
gcc/testsuite/
* g++.dg/pr82155.C: New testcase.
From-SVN: r253147
Diffstat (limited to 'gcc/dwarf2out.c')
-rw-r--r-- | gcc/dwarf2out.c | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c index dda569f..e97ceb6 100644 --- a/gcc/dwarf2out.c +++ b/gcc/dwarf2out.c @@ -25490,10 +25490,16 @@ dwarf2out_early_global_decl (tree decl) so that all nested DIEs are generated at the proper scope in the first shot. */ tree context = decl_function_context (decl); - if (context != NULL && lookup_decl_die (context) == NULL) + if (context != NULL) { + dw_die_ref context_die = lookup_decl_die (context); current_function_decl = context; - dwarf2out_decl (context); + + /* Avoid emitting DIEs multiple times, but still process CONTEXT + enough so that it lands in its own context. This avoids type + pruning issues later on. */ + if (context_die == NULL || is_declaration_die (context_die)) + dwarf2out_decl (context); } /* Emit an abstract origin of a function first. This happens |