re PR target/41473 (dsymutil "Assertion failed ...")
PR debug/41473 * dwarf2out.c (AT_loc_list_ptr): New. (resolve_addr): Remove unresolved attributes and loc_list entries. From-SVN: r155222
This commit is contained in:
parent
23198957a2
commit
2a7d7a8dd7
|
@ -1,5 +1,9 @@
|
||||||
2009-12-14 Alexandre Oliva <aoliva@redhat.com>
|
2009-12-14 Alexandre Oliva <aoliva@redhat.com>
|
||||||
|
|
||||||
|
PR debug/41473
|
||||||
|
* dwarf2out.c (AT_loc_list_ptr): New.
|
||||||
|
(resolve_addr): Remove unresolved attributes and loc_list entries.
|
||||||
|
|
||||||
PR debug/41473
|
PR debug/41473
|
||||||
* dwarf2out.c (add_var_loc_to_decl): Don't drop initial empty
|
* dwarf2out.c (add_var_loc_to_decl): Don't drop initial empty
|
||||||
locations.
|
locations.
|
||||||
|
|
|
@ -7211,6 +7211,13 @@ AT_loc_list (dw_attr_ref a)
|
||||||
return a->dw_attr_val.v.val_loc_list;
|
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. */
|
/* Add an address constant attribute value to a DIE. */
|
||||||
|
|
||||||
static inline void
|
static inline void
|
||||||
|
@ -20968,28 +20975,48 @@ resolve_addr (dw_die_ref die)
|
||||||
{
|
{
|
||||||
dw_die_ref c;
|
dw_die_ref c;
|
||||||
dw_attr_ref a;
|
dw_attr_ref a;
|
||||||
dw_loc_list_ref curr;
|
dw_loc_list_ref *curr;
|
||||||
unsigned ix;
|
unsigned ix;
|
||||||
|
|
||||||
for (ix = 0; VEC_iterate (dw_attr_node, die->die_attr, ix, a); ix++)
|
for (ix = 0; VEC_iterate (dw_attr_node, die->die_attr, ix, a); ix++)
|
||||||
switch (AT_class (a))
|
switch (AT_class (a))
|
||||||
{
|
{
|
||||||
case dw_val_class_loc_list:
|
case dw_val_class_loc_list:
|
||||||
for (curr = AT_loc_list (a); curr != NULL; curr = curr->dw_loc_next)
|
curr = AT_loc_list_ptr (a);
|
||||||
if (!resolve_addr_in_expr (curr->expr))
|
while (*curr)
|
||||||
curr->expr = NULL;
|
{
|
||||||
|
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;
|
break;
|
||||||
case dw_val_class_loc:
|
case dw_val_class_loc:
|
||||||
if (!resolve_addr_in_expr (AT_loc (a)))
|
if (!resolve_addr_in_expr (AT_loc (a)))
|
||||||
a->dw_attr_val.v.val_loc = NULL;
|
{
|
||||||
|
remove_AT (die, a->dw_attr);
|
||||||
|
ix--;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case dw_val_class_addr:
|
case dw_val_class_addr:
|
||||||
if (a->dw_attr == DW_AT_const_value
|
if (a->dw_attr == DW_AT_const_value
|
||||||
&& resolve_one_addr (&a->dw_attr_val.v.val_addr, NULL))
|
&& resolve_one_addr (&a->dw_attr_val.v.val_addr, NULL))
|
||||||
{
|
{
|
||||||
a->dw_attr = DW_AT_location;
|
remove_AT (die, a->dw_attr);
|
||||||
a->dw_attr_val.val_class = dw_val_class_loc;
|
ix--;
|
||||||
a->dw_attr_val.v.val_loc = NULL;
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
|
Loading…
Reference in New Issue