OSDN Git Service

2005-01-17 H.J. Lu <hongjiu.lu@intel.com>
authorH.J. Lu <hjl@lucon.org>
Mon, 17 Jan 2005 17:12:00 +0000 (17:12 +0000)
committerH.J. Lu <hjl@lucon.org>
Mon, 17 Jan 2005 17:12:00 +0000 (17:12 +0000)
* dwarf2.c (dwarf2_debug): Move info_ptr_unit to ...
(comp_unit): Here.
(read_unsigned_leb128): Removed.
(read_signed_leb128): Removed.
(find_abstract_instance_name): Updated.
(parse_comp_unit): Accept info_ptr_unit.
(_bfd_dwarf2_find_nearest_line): Set info_ptr_unit for each
comp unit and pass it to parse_comp_unit.

* elf-eh-frame.c (read_unsigned_leb128): Moved to ...
(read_signed_leb128): Moved to ...
* libbfd.c: Here.

* libbfd-in.h (read_unsigned_leb128): New prototype.
(read_signed_leb128): Likewise.
* libbfd.h: Regenerated.

bfd/ChangeLog
bfd/dwarf2.c
bfd/elf-eh-frame.c
bfd/libbfd-in.h
bfd/libbfd.c
bfd/libbfd.h

index 48ffee2..fb35f09 100644 (file)
@@ -1,3 +1,22 @@
+2005-01-17  H.J. Lu  <hongjiu.lu@intel.com>
+
+       * dwarf2.c (dwarf2_debug): Move info_ptr_unit to ...
+       (comp_unit): Here.
+       (read_unsigned_leb128): Removed.
+       (read_signed_leb128): Removed.
+       (find_abstract_instance_name): Updated.
+       (parse_comp_unit): Accept info_ptr_unit.
+       (_bfd_dwarf2_find_nearest_line): Set info_ptr_unit for each
+       comp unit and pass it to parse_comp_unit.
+
+       * elf-eh-frame.c (read_unsigned_leb128): Moved to ...
+       (read_signed_leb128): Moved to ...
+       * libbfd.c: Here.
+
+       * libbfd-in.h (read_unsigned_leb128): New prototype.
+       (read_signed_leb128): Likewise.
+       * libbfd.h: Regenerated.
+
 2005-01-17  Andrew Stubbs  <andrew.stubbs@st.com>
            Nick Clifton   <nickc@redhat.com>
 
index d86c66e..d5544d9 100644 (file)
@@ -84,10 +84,6 @@ struct dwarf2_debug
      into a buffer yet.  */
   char* info_ptr;
 
-  /* Preserve the original value of info_ptr for the current
-     comp_unit so we can find a given entry by its reference. */
-  char* info_ptr_unit;
-
   /* Pointer to the end of the .debug_info section memory buffer.  */
   char* info_ptr_end;
 
@@ -155,6 +151,10 @@ struct comp_unit
   /* TRUE if there is a line number table associated with this comp. unit.  */
   int stmtlist;
 
+  /* Pointer to the current comp_unit so that we can find a given entry
+     by its reference.  */
+  char *info_ptr_unit;
+
   /* The offset into .debug_line of the line number table.  */
   unsigned long line_offset;
 
@@ -321,67 +321,6 @@ read_indirect_string (struct comp_unit* unit,
   return buf;
 }
 
-static unsigned int
-read_unsigned_leb128 (bfd *abfd ATTRIBUTE_UNUSED,
-                     char *buf,
-                     unsigned int *bytes_read_ptr)
-{
-  unsigned int  result;
-  unsigned int  num_read;
-  int           shift;
-  unsigned char byte;
-
-  result   = 0;
-  shift    = 0;
-  num_read = 0;
-
-  do
-    {
-      byte = bfd_get_8 (abfd, buf);
-      buf ++;
-      num_read ++;
-      result |= ((byte & 0x7f) << shift);
-      shift += 7;
-    }
-  while (byte & 0x80);
-
-  * bytes_read_ptr = num_read;
-
-  return result;
-}
-
-static int
-read_signed_leb128 (bfd *abfd ATTRIBUTE_UNUSED,
-                   char *buf,
-                   unsigned int * bytes_read_ptr)
-{
-  int           result;
-  int           shift;
-  int           num_read;
-  unsigned char byte;
-
-  result = 0;
-  shift = 0;
-  num_read = 0;
-
-  do
-    {
-      byte = bfd_get_8 (abfd, buf);
-      buf ++;
-      num_read ++;
-      result |= ((byte & 0x7f) << shift);
-      shift += 7;
-    }
-  while (byte & 0x80);
-
-  if ((shift < 32) && (byte & 0x40))
-    result |= -(1 << shift);
-
-  * bytes_read_ptr = num_read;
-
-  return result;
-}
-
 /* END VERBATIM */
 
 static bfd_uint64_t
@@ -1332,7 +1271,7 @@ find_abstract_instance_name (struct comp_unit *unit, bfd_uint64_t die_ref)
   struct attribute attr;
   char *name = 0;
 
-  info_ptr = unit->stash->info_ptr_unit + die_ref;
+  info_ptr = unit->info_ptr_unit + die_ref;
   abbrev_number = read_unsigned_leb128 (abfd, info_ptr, &bytes_read);
   info_ptr += bytes_read;
 
@@ -1478,6 +1417,7 @@ static struct comp_unit *
 parse_comp_unit (bfd *abfd,
                 struct dwarf2_debug *stash,
                 bfd_vma unit_length,
+                char *info_ptr_unit,
                 unsigned int offset_size)
 {
   struct comp_unit* unit;
@@ -1558,6 +1498,7 @@ parse_comp_unit (bfd *abfd,
   unit->abbrevs = abbrevs;
   unit->end_ptr = end_ptr;
   unit->stash = stash;
+  unit->info_ptr_unit = info_ptr_unit;
 
   for (i = 0; i < abbrev->num_attrs; ++i)
     {
@@ -1803,7 +1744,6 @@ _bfd_dwarf2_find_nearest_line (bfd *abfd,
       if (stash->info_ptr == NULL)
        return FALSE;
 
-      stash->info_ptr_unit = stash->info_ptr;
       stash->info_ptr_end = stash->info_ptr;
 
       for (msec = find_debug_info (abfd, NULL);
@@ -1851,6 +1791,7 @@ _bfd_dwarf2_find_nearest_line (bfd *abfd,
       bfd_vma length;
       bfd_boolean found;
       unsigned int offset_size = addr_size;
+      char *info_ptr_unit = stash->info_ptr;
 
       length = read_4_bytes (abfd, stash->info_ptr);
       /* A 0xffffff length is the DWARF3 way of indicating we use
@@ -1883,7 +1824,8 @@ _bfd_dwarf2_find_nearest_line (bfd *abfd,
 
       if (length > 0)
        {
-         each = parse_comp_unit (abfd, stash, length, offset_size);
+         each = parse_comp_unit (abfd, stash, length, info_ptr_unit,
+                                 offset_size);
          stash->info_ptr += length;
 
          if ((bfd_vma) (stash->info_ptr - stash->sec_info_ptr)
index 0c0b32c..6e811b3 100644 (file)
 
 #define EH_FRAME_HDR_SIZE 8
 
-/* Helper function for reading uleb128 encoded data.  */
-
-static bfd_vma
-read_unsigned_leb128 (bfd *abfd ATTRIBUTE_UNUSED,
-                     char *buf,
-                     unsigned int *bytes_read_ptr)
-{
-  bfd_vma result;
-  unsigned int num_read;
-  int shift;
-  unsigned char byte;
-
-  result = 0;
-  shift = 0;
-  num_read = 0;
-  do
-    {
-      byte = bfd_get_8 (abfd, (bfd_byte *) buf);
-      buf++;
-      num_read++;
-      result |= (((bfd_vma) byte & 0x7f) << shift);
-      shift += 7;
-    }
-  while (byte & 0x80);
-  *bytes_read_ptr = num_read;
-  return result;
-}
-
-/* Helper function for reading sleb128 encoded data.  */
-
-static bfd_signed_vma
-read_signed_leb128 (bfd *abfd ATTRIBUTE_UNUSED,
-                   char *buf,
-                   unsigned int * bytes_read_ptr)
-{
-  bfd_vma result;
-  int shift;
-  int num_read;
-  unsigned char byte;
-
-  result = 0;
-  shift = 0;
-  num_read = 0;
-  do
-    {
-      byte = bfd_get_8 (abfd, (bfd_byte *) buf);
-      buf ++;
-      num_read ++;
-      result |= (((bfd_vma) byte & 0x7f) << shift);
-      shift += 7;
-    }
-  while (byte & 0x80);
-  if (byte & 0x40)
-    result |= (((bfd_vma) -1) << (shift - 7)) << 7;
-  *bytes_read_ptr = num_read;
-  return result;
-}
-
 #define read_uleb128(VAR, BUF)                                 \
 do                                                             \
   {                                                            \
index 86e6942..65d5d82 100644 (file)
@@ -686,3 +686,6 @@ extern void bfd_section_already_linked_table_traverse
   (bfd_boolean (*) (struct bfd_section_already_linked_hash_entry *,
                    void *), void *);
 
+extern bfd_vma read_unsigned_leb128 (bfd *, char *, unsigned int *);
+extern bfd_signed_vma read_signed_leb128 (bfd *, char *, unsigned int *);
+
index 2791ca3..b2f83c4 100644 (file)
@@ -860,3 +860,61 @@ warn_deprecated (const char *what,
       mask |= ~(size_t) func;
     }
 }
+
+/* Helper function for reading uleb128 encoded data.  */
+
+bfd_vma
+read_unsigned_leb128 (bfd *abfd ATTRIBUTE_UNUSED,
+                     char *buf,
+                     unsigned int *bytes_read_ptr)
+{
+  bfd_vma result;
+  unsigned int num_read;
+  int shift;
+  unsigned char byte;
+
+  result = 0;
+  shift = 0;
+  num_read = 0;
+  do
+    {
+      byte = bfd_get_8 (abfd, (bfd_byte *) buf);
+      buf++;
+      num_read++;
+      result |= (((bfd_vma) byte & 0x7f) << shift);
+      shift += 7;
+    }
+  while (byte & 0x80);
+  *bytes_read_ptr = num_read;
+  return result;
+}
+
+/* Helper function for reading sleb128 encoded data.  */
+
+bfd_signed_vma
+read_signed_leb128 (bfd *abfd ATTRIBUTE_UNUSED,
+                   char *buf,
+                   unsigned int * bytes_read_ptr)
+{
+  bfd_vma result;
+  int shift;
+  int num_read;
+  unsigned char byte;
+
+  result = 0;
+  shift = 0;
+  num_read = 0;
+  do
+    {
+      byte = bfd_get_8 (abfd, (bfd_byte *) buf);
+      buf ++;
+      num_read ++;
+      result |= (((bfd_vma) byte & 0x7f) << shift);
+      shift += 7;
+    }
+  while (byte & 0x80);
+  if ((shift < 8 * sizeof (result)) && (byte & 0x40))
+    result |= (((bfd_vma) -1) << shift);
+  *bytes_read_ptr = num_read;
+  return result;
+}
index c53fcda..0905522 100644 (file)
@@ -691,6 +691,9 @@ extern void bfd_section_already_linked_table_traverse
   (bfd_boolean (*) (struct bfd_section_already_linked_hash_entry *,
                    void *), void *);
 
+extern bfd_vma read_unsigned_leb128 (bfd *, char *, unsigned int *);
+extern bfd_signed_vma read_signed_leb128 (bfd *, char *, unsigned int *);
+
 /* Extracted from init.c.  */
 /* Extracted from libbfd.c.  */
 bfd_boolean bfd_write_bigendian_4byte_int (bfd *, unsigned int);