* dwarf2-frame.c (struct comp_unit): Add member `dbase'.
authorMark Kettenis <kettenis@gnu.org>
Wed, 4 Jun 2003 21:03:23 +0000 (21:03 +0000)
committerMark Kettenis <kettenis@gnu.org>
Wed, 4 Jun 2003 21:03:23 +0000 (21:03 +0000)
(read_encoded_value): Handle DW_EH_PE_datarel encoding.
(dwarf2_build_frame_info): Set base for DW_EH_PE_datarel encodings
when handling .eh_frame sections.

gdb/ChangeLog
gdb/dwarf2-frame.c

index 83782c62ab3e71d522e06af7a9394bfbb84d7c5a..ef26dd977d7785000c7e2dec2203867b13fb2cdb 100644 (file)
@@ -1,3 +1,10 @@
+2003-06-04  Mark Kettenis  <kettenis@gnu.org>
+
+       * dwarf2-frame.c (struct comp_unit): Add member `dbase'.
+       (read_encoded_value): Handle DW_EH_PE_datarel encoding.
+       (dwarf2_build_frame_info): Set base for DW_EH_PE_datarel encodings
+       when handling .eh_frame sections.
+
 2003-06-04  J. Brobecker  <brobecker@gnat.com>
 
        * config/pa/nm-hppah.h (PREPARE_TO_PROCEED): Use the generic
index 7dbd0dbf753faac7cda5c41bc9c102bea6e24061..f28fade3d7c22db0f977bfa9d136a34612a48926 100644 (file)
@@ -747,6 +747,9 @@ struct comp_unit
 
   /* Pointer to the .debug_frame section.  */
   asection *dwarf_frame_section;
+
+  /* Base for DW_EH_PE_datarel encodings.  */
+  bfd_vma dbase;
 };
 
 static unsigned int
@@ -916,6 +919,9 @@ read_encoded_value (struct comp_unit *unit, unsigned char encoding,
       base = bfd_get_section_vma (unit->bfd, unit->dwarf_frame_section);
       base += (buf - unit->dwarf_frame_buffer);
       break;
+    case DW_EH_PE_datarel:
+      base = unit->dbase;
+      break;
     default:
       internal_error (__FILE__, __LINE__, "Invalid or unsupported encoding");
     }
@@ -1251,11 +1257,14 @@ dwarf2_build_frame_info (struct objfile *objfile)
   unit.abfd = objfile->obfd;
   unit.objfile = objfile;
   unit.addr_size = objfile->obfd->arch_info->bits_per_address / 8;
+  unit.dbase = 0;
 
   /* First add the information from the .eh_frame section.  That way,
      the FDEs from that section are searched last.  */
   if (dwarf_eh_frame_offset)
     {
+      asection *got;
+
       unit.cie = NULL;
       unit.dwarf_frame_buffer = dwarf2_read_section (objfile,
                                                     dwarf_eh_frame_offset,
@@ -1265,6 +1274,14 @@ dwarf2_build_frame_info (struct objfile *objfile)
       unit.dwarf_frame_size = dwarf_eh_frame_size;
       unit.dwarf_frame_section = dwarf_eh_frame_section;
 
+      /* FIXME: kettenis/20030602: This is the DW_EH_PE_datarel base
+         that for the i386/amd64 target, which currently is the only
+         target in GCC that supports/uses the DW_EH_PE_datarel
+         encoding.  */
+      got = bfd_get_section_by_name (unit.abfd, ".got");
+      if (got)
+       unit.dbase = got->vma;
+
       frame_ptr = unit.dwarf_frame_buffer;
       while (frame_ptr < unit.dwarf_frame_buffer + unit.dwarf_frame_size)
        frame_ptr = decode_frame_entry (&unit, frame_ptr, 1);