]> oss.titaniummirror.com Git - msp430-binutils.git/blobdiff - debian/patches/201-hjl-bfd-ref_addr.dpatch
Import 2.18.1~cvs20080103-0tinyos1 from old svn repo.
[msp430-binutils.git] / debian / patches / 201-hjl-bfd-ref_addr.dpatch
diff --git a/debian/patches/201-hjl-bfd-ref_addr.dpatch b/debian/patches/201-hjl-bfd-ref_addr.dpatch
new file mode 100755 (executable)
index 0000000..a463150
--- /dev/null
@@ -0,0 +1,193 @@
+#!/bin/sh -e
+## 201-hjl-bfd-ref-addr.dpatch
+##
+## DP: Description: Support DW_FORM_ref_addr in Dwarf 2 reader in linker.
+## DP: Author: H.J. Lu  <hongjiu.lu@intel.com>
+## DP: Upstream status: hjl post 2.17.50.0.18, PR ld/3191
+## DP: Original patch: bfd-ref_addr-6.patch
+
+if [ $# -ne 1 ]; then
+    echo >&2 "`basename $0`: script expects -patch|-unpatch as argument"
+    exit 1
+fi
+
+[ -f debian/patches/00patch-opts ] && . debian/patches/00patch-opts
+patch_opts="${patch_opts:--f --no-backup-if-mismatch}"
+
+case "$1" in
+       -patch) patch $patch_opts -p1 < $0;;
+       -unpatch) patch $patch_opts -p1 -R < $0;;
+        *)
+                echo >&2 "`basename $0`: script expects -patch|-unpatch as argument"
+                exit 1;;
+esac
+
+exit 0
+
+2006-09-29  H.J. Lu  <hongjiu.lu@intel.com>
+
+       PR ld/3191
+       * dwarf2.c (find_abstract_instance_name): Pass a pointer to
+       attribute instead of offset.  For DW_FORM_ref_addr, get the
+       entry at the offset from the .debug_info section.
+       (scan_unit_for_symbols): Updated.
+       (_bfd_dwarf2_find_nearest_line): Adjust debug_info
+       section vma when needed.
+
+@DPATCH@
+diff -urNad binutils-2.18~cvs20070812~/bfd/dwarf2.c binutils-2.18~cvs20070812/bfd/dwarf2.c
+--- binutils-2.18~cvs20070812~/bfd/dwarf2.c    2007-07-26 10:31:03.000000000 +0200
++++ binutils-2.18~cvs20070812/bfd/dwarf2.c     2007-08-12 13:15:54.000000000 +0200
+@@ -1710,16 +1710,30 @@
+ }
+ static char *
+-find_abstract_instance_name (struct comp_unit *unit, bfd_uint64_t die_ref)
++find_abstract_instance_name (struct comp_unit *unit,
++                           struct attribute *attr_ptr)
+ {
+   bfd *abfd = unit->abfd;
+   bfd_byte *info_ptr;
+   unsigned int abbrev_number, bytes_read, i;
+   struct abbrev_info *abbrev;
++  bfd_uint64_t die_ref = attr_ptr->u.val;
+   struct attribute attr;
+   char *name = 0;
+-  info_ptr = unit->info_ptr_unit + die_ref;
++  /* DW_FORM_ref_addr can reference an entry in a different CU. It
++     is an offset from the .debug_info section, not the current CU.  */
++  if (attr_ptr->form == DW_FORM_ref_addr)
++    {
++      /* FIXME: How to handle DW_FORM_ref_addr references an entry in
++       a different file?  */ 
++      if (!die_ref)
++      abort ();
++
++      info_ptr = unit->stash->sec_info_ptr + die_ref;
++    }
++  else 
++    info_ptr = unit->info_ptr_unit + die_ref;
+   abbrev_number = read_unsigned_leb128 (abfd, info_ptr, &bytes_read);
+   info_ptr += bytes_read;
+@@ -1745,7 +1759,7 @@
+                   name = attr.u.str;
+                 break;
+               case DW_AT_specification:
+-                name = find_abstract_instance_name (unit, attr.u.val);
++                name = find_abstract_instance_name (unit, &attr);
+                 break;
+               case DW_AT_MIPS_linkage_name:
+                 name = attr.u.str;
+@@ -1907,7 +1921,7 @@
+                 break;
+               case DW_AT_abstract_origin:
+-                func->name = find_abstract_instance_name (unit, attr.u.val);
++                func->name = find_abstract_instance_name (unit, &attr);
+                 break;
+               case DW_AT_name:
+@@ -2876,6 +2890,11 @@
+       bfd *debug_bfd;
+       bfd_size_type total_size;
+       asection *msec;
++      bfd_vma last_vma;
++      bfd_size_type size;
++      asection *first_msec;
++      asection **msecs = NULL;
++      unsigned int i, count;
+       *pinfo = stash;
+@@ -2909,9 +2928,28 @@
+        Read them all in and produce one large stash.  We do this in two
+        passes - in the first pass we just accumulate the section sizes.
+        In the second pass we read in the section's contents.  The allows
+-       us to avoid reallocing the data as we add sections to the stash.  */
++       us to avoid reallocing the data as we add sections to the stash.
++       
++       We may need to adjust debug_info section vmas since we will
++       concatenate them together.  Otherwise relocations may be
++       incorrect.  */
++      first_msec = msec;
++      last_vma = 0;
++      count = 0;
+       for (total_size = 0; msec; msec = find_debug_info (debug_bfd, msec))
+-      total_size += msec->size;
++      {
++        size = msec->size;
++        if (size == 0)
++          continue;
++
++        total_size += size;
++
++        BFD_ASSERT (msec->vma == 0 && msec->alignment_power == 0);
++
++        msec->vma = last_vma;
++        last_vma += size;
++        count++;
++      }
+       stash->info_ptr = bfd_alloc (debug_bfd, total_size);
+       if (stash->info_ptr == NULL)
+@@ -2919,17 +2957,27 @@
+       stash->info_ptr_end = stash->info_ptr;
+-      for (msec = find_debug_info (debug_bfd, NULL);
++      if (count > 1)
++      {
++        count--;
++        msecs = (asection **) bfd_malloc2 (count, sizeof (*msecs));
++      }
++
++      for (i = 0, msec = first_msec;
+          msec;
+          msec = find_debug_info (debug_bfd, msec))
+       {
+-        bfd_size_type size;
+         bfd_size_type start;
+         size = msec->size;
+         if (size == 0)
+           continue;
++        if (i && msecs)
++          msecs [i - 1] = msec;
++
++        i++;
++
+         start = stash->info_ptr_end - stash->info_ptr;
+         if ((bfd_simple_get_relocated_section_contents
+@@ -2939,9 +2987,27 @@
+         stash->info_ptr_end = stash->info_ptr + start + size;
+       }
++      /* Restore section vma. */
++      if (count)
++      {
++        if (msecs)
++          {
++            for (i = 0; i < count; i++)
++              msecs [i]->vma = 0;
++            free (msecs);
++          }
++        else
++          {
++            for (msec = find_debug_info (debug_bfd, first_msec);
++                 msec;
++                 msec = find_debug_info (debug_bfd, msec))
++              msec->vma = 0;
++          }
++      }
++
+       BFD_ASSERT (stash->info_ptr_end == stash->info_ptr + total_size);
+-      stash->sec = find_debug_info (debug_bfd, NULL);
++      stash->sec = first_msec;
+       stash->sec_info_ptr = stash->info_ptr;
+       stash->syms = symbols;
+       stash->bfd = debug_bfd;