re PR debug/40012 (Revision 146817 generated bad debug info for local variables)

PR debug/40012

        * cfgexpand.c (set_rtl): Store place also in DECL_RTL, if all
        partitions use the same.
        (expand_one_var): Deal with DECL_RTL sometimes begin set also
        for basevars of SSA_NAMEs.
        (expand_used_vars): Reset TREE_USED for basevars of SSA_NAMEs,
        to not expand them twice.
        (gimple_expand_cfg): Clear DECL_RTL for those decls that have
        multiple places.

From-SVN: r148273
This commit is contained in:
Michael Matz 2009-06-08 11:37:12 +00:00 committed by Michael Matz
parent 2153915d0a
commit eb7adebcd8
2 changed files with 47 additions and 3 deletions

View File

@ -1,3 +1,16 @@
2009-06-08 Michael Matz <matz@suse.de>
PR debug/40012
* cfgexpand.c (set_rtl): Store place also in DECL_RTL, if all
partitions use the same.
(expand_one_var): Deal with DECL_RTL sometimes begin set also
for basevars of SSA_NAMEs.
(expand_used_vars): Reset TREE_USED for basevars of SSA_NAMEs,
to not expand them twice.
(gimple_expand_cfg): Clear DECL_RTL for those decls that have
multiple places.
2009-06-08 Alexandre Oliva <aoliva@redhat.com>
* common.opt (fcompare-debug=, fcompare-debug-second): New.

View File

@ -455,6 +455,28 @@ set_rtl (tree t, rtx x)
SA.partition_to_pseudo[var_to_partition (SA.map, t)] = x;
if (x && !MEM_P (x))
set_reg_attrs_for_decl_rtl (SSA_NAME_VAR (t), x);
/* For the benefit of debug information at -O0 (where vartracking
doesn't run) record the place also in the base DECL if it's
a normal variable (not a parameter). */
if (x && x != pc_rtx && TREE_CODE (SSA_NAME_VAR (t)) == VAR_DECL)
{
tree var = SSA_NAME_VAR (t);
/* If we don't yet have something recorded, just record it now. */
if (!DECL_RTL_SET_P (var))
SET_DECL_RTL (var, x);
/* If we have it set alrady to "multiple places" don't
change this. */
else if (DECL_RTL (var) == pc_rtx)
;
/* If we have something recorded and it's not the same place
as we want to record now, we have multiple partitions for the
same base variable, with different places. We can't just
randomly chose one, hence we have to say that we don't know.
This only happens with optimization, and there var-tracking
will figure out the right thing. */
else if (DECL_RTL (var) != x)
SET_DECL_RTL (var, pc_rtx);
}
}
else
SET_DECL_RTL (t, x);
@ -1161,7 +1183,6 @@ expand_one_var (tree var, bool toplevel, bool really_expand)
|| (!DECL_EXTERNAL (var)
&& !DECL_HAS_VALUE_EXPR_P (var)
&& !TREE_STATIC (var)
&& !DECL_RTL_SET_P (var)
&& TREE_TYPE (var) != error_mark_node
&& !DECL_HARD_REGISTER (var)
&& really_expand));
@ -1174,7 +1195,7 @@ expand_one_var (tree var, bool toplevel, bool really_expand)
;
else if (TREE_STATIC (var))
;
else if (DECL_RTL_SET_P (var))
else if (TREE_CODE (origvar) != SSA_NAME && DECL_RTL_SET_P (var))
;
else if (TREE_TYPE (var) == error_mark_node)
{
@ -1561,7 +1582,11 @@ expand_used_vars (void)
/* Expanded above already. */
if (is_gimple_reg (var))
;
{
TREE_USED (var) = 0;
ggc_free (t);
continue;
}
/* We didn't set a block for static or extern because it's hard
to tell the difference between a global variable (re)declared
in a local scope, and one that's really declared there to
@ -2495,6 +2520,12 @@ gimple_expand_cfg (void)
&& !SA.partition_to_pseudo[i])
SA.partition_to_pseudo[i] = DECL_RTL_IF_SET (var);
gcc_assert (SA.partition_to_pseudo[i]);
/* If this decl was marked as living in multiple places, reset
this now to NULL. */
if (DECL_RTL_IF_SET (var) == pc_rtx)
SET_DECL_RTL (var, NULL);
/* Some RTL parts really want to look at DECL_RTL(x) when x
was a decl marked in REG_ATTR or MEM_ATTR. We could use
SET_DECL_RTL here making this available, but that would mean