From 0a9c7b2bf1903322a9b03d76c9c171bcd2ad3cf0 Mon Sep 17 00:00:00 2001 From: Nick Clifton Date: Tue, 28 Jan 2014 13:43:35 +0000 Subject: [PATCH] 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. --- bfd/ChangeLog | 6 ++++++ bfd/dwarf2.c | 24 ++++++++++++++++++++++++ 2 files changed, 30 insertions(+) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index a5fcadf..f3acbca 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,9 @@ +2014-01-28 Nick Clifton + + * 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 * elf64-ppc.c (ppc_build_one_stub): Correct reloc count passed 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; -- 2.7.4