aboutsummaryrefslogtreecommitdiff
path: root/bfd
diff options
context:
space:
mode:
Diffstat (limited to 'bfd')
-rw-r--r--bfd/ChangeLog19
-rw-r--r--bfd/dwarf2.c78
-rw-r--r--bfd/elf-eh-frame.c58
-rw-r--r--bfd/libbfd-in.h3
-rw-r--r--bfd/libbfd.c58
-rw-r--r--bfd/libbfd.h3
6 files changed, 93 insertions, 126 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 48ffee2..fb35f09 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -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>
diff --git a/bfd/dwarf2.c b/bfd/dwarf2.c
index d86c66e..d5544d9 100644
--- a/bfd/dwarf2.c
+++ b/bfd/dwarf2.c
@@ -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)
diff --git a/bfd/elf-eh-frame.c b/bfd/elf-eh-frame.c
index 0c0b32c..6e811b3 100644
--- a/bfd/elf-eh-frame.c
+++ b/bfd/elf-eh-frame.c
@@ -26,64 +26,6 @@
#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 \
{ \
diff --git a/bfd/libbfd-in.h b/bfd/libbfd-in.h
index 86e6942..65d5d82 100644
--- a/bfd/libbfd-in.h
+++ b/bfd/libbfd-in.h
@@ -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 *);
+
diff --git a/bfd/libbfd.c b/bfd/libbfd.c
index 2791ca3..b2f83c4 100644
--- a/bfd/libbfd.c
+++ b/bfd/libbfd.c
@@ -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;
+}
diff --git a/bfd/libbfd.h b/bfd/libbfd.h
index c53fcda..0905522 100644
--- a/bfd/libbfd.h
+++ b/bfd/libbfd.h
@@ -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);