This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [VTA, PR41473] drop NULL locations from lists
On Thu, Nov 26, 2009 at 07:13:36AM -0200, Alexandre Oliva wrote:
> On Nov 24, 2009, Jack Howarth <howarth@bromo.med.uc.edu> wrote:
>
> > I am uncertain if the stock dwarfdump will provide the necessary
> > information to find any residual zero locations.
>
> That doesn't matter, I don't think I'd be able to use it in a
> cross-compilation setting anyway.
>
> On Nov 25, 2009, Jack Howarth <howarth@bromo.med.uc.edu> wrote:
>
> > I've uploaded assembly files (generated with -dA) as well as the
> > preprocessed source for all the object files in the FSF gcc trunk
> > build with your proosed patch...
>
> > http://gcc.gnu.org/ml/gcc-patches/2009-11/msg01329.html
>
> > that still emit zero AT_LOCATIONS and cause dsymutil to assert.
> > These all seem to be of the form...
>
> > .byte 0x0 # DW_AT_location
>
> Thanks. I picked up one of the testcases you posted and found out where
> that location information comes from: it was a DWARF2-representable
> location expression that referenced a symbol that, in the end, wasn't
> emitted.
>
> We used to simply zero out the location information. With the patch
> below, we'll remove attributes and location list entries that fail to
> resolve.
>
> Will you please give it a try and let me know whether any other issues
> remain?
>
> for gcc/ChangeLog
> from Alexandre Oliva <aoliva@redhat.com>
>
> PR debug/41473
> * dwarf2out.c (AT_loc_list_ptr): New.
> (resolve_addr): Remove unresolved attributes and loc_list entries.
>
> Index: gcc/dwarf2out.c
> ===================================================================
> --- gcc/dwarf2out.c.orig 2009-11-26 06:40:48.000000000 -0200
> +++ gcc/dwarf2out.c 2009-11-26 07:04:41.000000000 -0200
> @@ -7206,6 +7206,13 @@ AT_loc_list (dw_attr_ref a)
> return a->dw_attr_val.v.val_loc_list;
> }
>
> +static inline dw_loc_list_ref *
> +AT_loc_list_ptr (dw_attr_ref a)
> +{
> + gcc_assert (a && AT_class (a) == dw_val_class_loc_list);
> + return &a->dw_attr_val.v.val_loc_list;
> +}
> +
> /* Add an address constant attribute value to a DIE. */
>
> static inline void
> @@ -20961,28 +20968,48 @@ resolve_addr (dw_die_ref die)
> {
> dw_die_ref c;
> dw_attr_ref a;
> - dw_loc_list_ref curr;
> + dw_loc_list_ref *curr;
> unsigned ix;
>
> for (ix = 0; VEC_iterate (dw_attr_node, die->die_attr, ix, a); ix++)
> switch (AT_class (a))
> {
> case dw_val_class_loc_list:
> - for (curr = AT_loc_list (a); curr != NULL; curr = curr->dw_loc_next)
> - if (!resolve_addr_in_expr (curr->expr))
> - curr->expr = NULL;
> + curr = AT_loc_list_ptr (a);
> + while (*curr)
> + {
> + if (!resolve_addr_in_expr ((*curr)->expr))
> + {
> + dw_loc_list_ref next = (*curr)->dw_loc_next;
> + if (next && (*curr)->ll_symbol)
> + {
> + gcc_assert (!next->ll_symbol);
> + next->ll_symbol = (*curr)->ll_symbol;
> + }
> + *curr = next;
> + }
> + else
> + curr = &(*curr)->dw_loc_next;
> + }
> + if (!AT_loc_list (a))
> + {
> + remove_AT (die, a->dw_attr);
> + ix--;
> + }
> break;
> case dw_val_class_loc:
> if (!resolve_addr_in_expr (AT_loc (a)))
> - a->dw_attr_val.v.val_loc = NULL;
> + {
> + remove_AT (die, a->dw_attr);
> + ix--;
> + }
> break;
> case dw_val_class_addr:
> if (a->dw_attr == DW_AT_const_value
> && resolve_one_addr (&a->dw_attr_val.v.val_addr, NULL))
> {
> - a->dw_attr = DW_AT_location;
> - a->dw_attr_val.val_class = dw_val_class_loc;
> - a->dw_attr_val.v.val_loc = NULL;
> + remove_AT (die, a->dw_attr);
> + ix--;
> }
> break;
> default:
>
> --
> Alexandre Oliva, freedom fighter http://FSFLA.org/~lxoliva/
> You must be the change you wish to see in the world. -- Gandhi
> Be Free! -- http://FSFLA.org/ FSF Latin America board member
> Free Software Evangelist Red Hat Brazil Compiler Engineer
Alexandre,
This patch alone is insufficient to eliminate all of the asserts in
dsymutil but if I apply it in combination with the previous patch...
http://gcc.gnu.org/ml/gcc-patches/2009-11/msg01329.html
all of the asserts in dsymutil are eliminated during the build. So
we definitely need both patches to solve the problem on darwin.
Thanks for fixing this issue.
Jack