When parsing a DW_FORM_ref_addr attribute the CU containing the
authorNick Clifton <nickc@redhat.com>
Tue, 28 Jan 2014 13:43:35 +0000 (13:43 +0000)
committerNick Clifton <nickc@redhat.com>
Tue, 28 Jan 2014 13:43:35 +0000 (13:43 +0000)
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
bfd/dwarf2.c

index a5fcadf..f3acbca 100644 (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
index 4a904ea..43d4c1d 100644 (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;