diff options
Diffstat (limited to 'bfd')
-rw-r--r-- | bfd/ChangeLog | 19 | ||||
-rw-r--r-- | bfd/dwarf2.c | 78 | ||||
-rw-r--r-- | bfd/elf-eh-frame.c | 58 | ||||
-rw-r--r-- | bfd/libbfd-in.h | 3 | ||||
-rw-r--r-- | bfd/libbfd.c | 58 | ||||
-rw-r--r-- | bfd/libbfd.h | 3 |
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); |