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:
Nick Clifton 2014-01-28 13:43:35 +00:00
parent 342df9df24
commit 0a9c7b2bf1
2 changed files with 30 additions and 0 deletions

View file

@ -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

View file

@ -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;