This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [debug-early] reuse variable DIEs and fix their context
- From: Aldy Hernandez <aldyh at redhat dot com>
- To: Richard Biener <richard dot guenther at gmail dot com>
- Cc: gcc-patches <gcc-patches at gcc dot gnu dot org>, jason merrill <jason at redhat dot com>
- Date: Thu, 28 Aug 2014 10:34:56 -0700
- Subject: Re: [debug-early] reuse variable DIEs and fix their context
- Authentication-results: sourceware.org; auth=none
- References: <53FD45A7 dot 4000804 at redhat dot com> <CAFiYyc0rftZkObJxo13UCwLvkhqMPNXkE11g-8tvdefQmhN2BQ at mail dot gmail dot com>
On 08/28/14 06:58, Richard Biener wrote:
On Wed, Aug 27, 2014 at 4:42 AM, Aldy Hernandez <aldyh@redhat.com> wrote:
This patch fixes a bunch of guality failures. With it I get 144 guality.exp
failures vs. 163 for "make check-gcc RUNTESTFLAGS=guality.exp". A lot
better than 100% fail rate ;-).
Variable DIEs were not being reused. Instead, variable DIEs even had the
wrong context (unilaterally the compilation unit). The attached patch
reuses variable DIEs that have been outputted earlier. It also fixes the
context by correcting the context on the second round.
I have also added a bit field to the DIE structure to record if a DIE has
been generated early.
Again, this is all a rough draft, but feel free to comment.
I wonder if we can't not force a proper context die (ISTR dwarf2out.c
lazily handles some contexts in some circumstances). All parent
Hmmm, I don't see any of this lazy context setting you speak of, but...
"trees" should be readily available and we should be able to create
DIEs for them.
I wonder if instead of early dumping of all the DECLs, we could only
dump the toplevel scoped DECLs, and let inheritance set the proper contexts.
We could start with calling dwarf2out_early_decl() for each function
decl, and then for every global. This is analogous to what we currently
do for late dwarf2out.
see final.c for the functions:
if (!DECL_IGNORED_P (current_function_decl))
debug_hooks->function_decl (current_function_decl);
see c/c-decl.c for the globals:
FOR_EACH_VEC_ELT (*all_translation_units, i, t)
c_write_global_declarations_2 (BLOCK_VARS (DECL_INITIAL (t)));
c_write_global_declarations_2 (BLOCK_VARS (ext_block));
The problem being that to calculate `ext_block' above, we need intimate
knowledge of scopes and such, only available in the FE. Is there a
generic way of determining if a DECL is in global scope? If, so we
could do:
foreach decl in fld.decls
if (is_global_scope(decl))
dwarf2out_decl (decl)
...and contexts will magically be set.
Is there such a way, or am I going about this the wrong way?
Aldy