This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
Commit: BFD: Select correct CU for DW_FORM_ref_addr
- From: Nick Clifton <nickc at redhat dot com>
- To: binutils at sourceware dot org
- Date: Tue, 28 Jan 2014 13:43:12 +0000
- Subject: Commit: BFD: Select correct CU for DW_FORM_ref_addr
- Authentication-results: sourceware.org; auth=none
Hi Guys,
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. This patch
takes care of that.
Tested without any regressions on a wide variety of different
toolchains.
Cheers
Nick
bfd/ChangeLog
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.
diff --git a/bfd/dwarf2.c b/bfd/dwarf2.c
index 4a904ea..43d4c1d 100644
--- a/bfd/dwarf2.c
+++ b/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;