This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Commit: BFD: Select correct CU for DW_FORM_ref_addr


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;


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]