When parsing a DW_FORM_ref_addr attribute the CU containing the
abbreviation may not be the current CU. Thus we need to make sure that when we read the abbreviation we use the correct CU. * dwarf2.c (find_abstract_instance_name): For DW_FORM_ref_addr attributes select the CU containing the abbreviation, which may not be the current CU.
This commit is contained in:
parent
342df9df24
commit
0a9c7b2bf1
2 changed files with 30 additions and 0 deletions
|
@ -1,3 +1,9 @@
|
|||
2014-01-28 Nick Clifton <nickc@redhat.com>
|
||||
|
||||
* dwarf2.c (find_abstract_instance_name): For DW_FORM_ref_addr
|
||||
attributes select the CU containing the abbreviation, which may not
|
||||
be the current CU.
|
||||
|
||||
2014-01-24 Alan Modra <amodra@gmail.com>
|
||||
|
||||
* elf64-ppc.c (ppc_build_one_stub): Correct reloc count passed
|
||||
|
|
24
bfd/dwarf2.c
24
bfd/dwarf2.c
|
@ -2128,6 +2128,28 @@ find_abstract_instance_name (struct comp_unit *unit,
|
|||
abort ();
|
||||
|
||||
info_ptr = unit->sec_info_ptr + die_ref;
|
||||
|
||||
/* Now find the CU containing this pointer. */
|
||||
if (info_ptr >= unit->info_ptr_unit && info_ptr < unit->end_ptr)
|
||||
;
|
||||
else
|
||||
{
|
||||
/* Check other CUs to see if they contain the abbrev. */
|
||||
struct comp_unit * u;
|
||||
|
||||
for (u = unit->prev_unit; u != NULL; u = u->prev_unit)
|
||||
if (info_ptr >= u->info_ptr_unit && info_ptr < u->end_ptr)
|
||||
break;
|
||||
|
||||
if (u == NULL)
|
||||
for (u = unit->next_unit; u != NULL; u = u->next_unit)
|
||||
if (info_ptr >= u->info_ptr_unit && info_ptr < u->end_ptr)
|
||||
break;
|
||||
|
||||
if (u)
|
||||
unit = u;
|
||||
/* else FIXME: What do we do now ? */
|
||||
}
|
||||
}
|
||||
else if (attr_ptr->form == DW_FORM_GNU_ref_alt)
|
||||
{
|
||||
|
@ -2139,6 +2161,8 @@ find_abstract_instance_name (struct comp_unit *unit,
|
|||
bfd_set_error (bfd_error_bad_value);
|
||||
return name;
|
||||
}
|
||||
/* FIXME: Do we need to locate the correct CU, in a similar
|
||||
fashion to the code in the DW_FORM_ref_addr case above ? */
|
||||
}
|
||||
else
|
||||
info_ptr = unit->info_ptr_unit + die_ref;
|
||||
|
|
Loading…
Reference in a new issue