This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: dwarf2out var loc handling fix
- From: Richard Guenther <rguenther at suse dot de>
- To: Jan Hubicka <hubicka at ucw dot cz>
- Cc: gcc-patches at gcc dot gnu dot org, jakub at redhat dot com, jason at redhat dot com
- Date: Mon, 21 Sep 2009 14:00:03 +0200 (CEST)
- Subject: Re: dwarf2out var loc handling fix
- References: <20090921114119.GB29481@kam.mff.cuni.cz>
On Mon, 21 Sep 2009, Jan Hubicka wrote:
> Hi,
> when outputting debug info for function in .final, we first populate our
> location lists hashtable and then we start expanding scope block. When
> hitting scope block of inline function we call
> dwarf2out_abstract_function that nullifies the hashtable. This causes
> us to lose most of location info in any function with some inlines.
>
> It is neccesary to avoid inline abstract function to reffer to the
> hashtable or the locations would be output in abstract function that is
> wrong. This patch avoids it by setting the hashtable to NULL and
> restoring it at exit and modifying lookup_decl_loc.
>
> THe patch increases amount of variables tracked in tramp3d from 4900 to
> 16000.
>
> Bootstrapped/regtested x86_64-linux, OK?
Hm, I guess this sort-of asks for a dwarf2out context we can push/pop
at some places. But yes, the patch is obviously an improvement.
Ok.
Thanks,
Richard.
> Honza
>
> * gcc.dg/guality/inline-params.c: New testcase.
>
> * dwarf2out.c (lookup_decl_loc): Allow decl_loc_table to be NULL.
> (dwarf2out_abstract_function): NULLify decl_loc_table at begginig and
> restore at the end.
> Index: testsuite/gcc.dg/guality/inline-params.c
> ===================================================================
> *** testsuite/gcc.dg/guality/inline-params.c (revision 0)
> --- testsuite/gcc.dg/guality/inline-params.c (revision 0)
> ***************
> *** 0 ****
> --- 1,41 ----
> + /* { dg-do run { xfail *-*-* } } */
> + /* IPA-SRA removes the argumet as dead, so we don't see their values. */
> + /* { dg-options "-g -fno-ipa-sra" } */
> + #define GUALITY_DONT_FORCE_LIVE_AFTER -1
> +
> + #ifndef STATIC_INLINE
> + #define STATIC_INLINE /*static*/
> + #endif
> +
> +
> + #include "guality.h"
> +
> + struct a{
> + struct b {int a;} b;
> + struct c{ int a;} c;
> + };
> +
> + __attribute__ ((always_inline)) static inline void
> + t1 (struct b *ab, int b)
> + {
> + GUALCHKXPRVAL ("b", 0xbbb, 0);
> + GUALCHKVAL (ab);
> + }
> + __attribute__ ((always_inline)) static inline void
> + t2 (struct c *ac, char *msg)
> + {
> + GUALCHKVAL (ac);
> + GUALCHKVAL (msg);
> + }
> + __attribute__ ((always_inline)) static inline void
> + t3 (struct a *a)
> + {
> + t1(&a->b, 0xbbb);
> + t2(&a->c, "test");
> + }
> + struct a a={{0},{1}};
> + int
> + main (int argc, char *argv[])
> + {
> + t3(&a);
> + }
> Index: dwarf2out.c
> ===================================================================
> *** dwarf2out.c (revision 151901)
> --- dwarf2out.c (working copy)
> *************** decl_loc_table_eq (const void *x, const
> *** 7491,7496 ****
> --- 7491,7498 ----
> static inline var_loc_list *
> lookup_decl_loc (const_tree decl)
> {
> + if (!decl_loc_table)
> + return NULL;
> return (var_loc_list *)
> htab_find_with_hash (decl_loc_table, decl, DECL_UID (decl));
> }
> *************** dwarf2out_abstract_function (tree decl)
> *** 15533,15548 ****
> tree save_fn;
> tree context;
> int was_abstract = DECL_ABSTRACT (decl);
>
> /* Make sure we have the actual abstract inline, not a clone. */
> decl = DECL_ORIGIN (decl);
> - htab_empty (decl_loc_table);
>
> old_die = lookup_decl_die (decl);
> if (old_die && get_AT (old_die, DW_AT_inline))
> /* We've already generated the abstract instance. */
> return;
>
> /* Be sure we've emitted the in-class declaration DIE (if any) first, so
> we don't get confused by DECL_ABSTRACT. */
> if (debug_info_level > DINFO_LEVEL_TERSE)
> --- 15535,15556 ----
> tree save_fn;
> tree context;
> int was_abstract = DECL_ABSTRACT (decl);
> + htab_t old_decl_loc_table;
>
> /* Make sure we have the actual abstract inline, not a clone. */
> decl = DECL_ORIGIN (decl);
>
> old_die = lookup_decl_die (decl);
> if (old_die && get_AT (old_die, DW_AT_inline))
> /* We've already generated the abstract instance. */
> return;
>
> + /* We can be called while recursively when seeing block defining inlined subroutine
> + DIE. Be sure to not clobber the outer location table nor use it or we would
> + get locations in abstract instantces. */
> + old_decl_loc_table = decl_loc_table;
> + decl_loc_table = NULL;
> +
> /* Be sure we've emitted the in-class declaration DIE (if any) first, so
> we don't get confused by DECL_ABSTRACT. */
> if (debug_info_level > DINFO_LEVEL_TERSE)
> *************** dwarf2out_abstract_function (tree decl)
> *** 15564,15569 ****
> --- 15572,15578 ----
> set_decl_abstract_flags (decl, 0);
>
> current_function_decl = save_fn;
> + decl_loc_table = old_decl_loc_table;
> pop_cfun ();
> }
>
>
>
--
Richard Guenther <rguenther@suse.de>
Novell / SUSE Labs
SUSE LINUX Products GmbH - Nuernberg - AG Nuernberg - HRB 16746 - GF: Markus Rex