diff options
author | Mark Kettenis <kettenis@gnu.org> | 2003-09-08 22:43:40 +0000 |
---|---|---|
committer | Mark Kettenis <kettenis@gnu.org> | 2003-09-08 22:43:40 +0000 |
commit | 71ea8a532ec69f465a33d03f659105ab29366ca2 (patch) | |
tree | 4e75abc76e55ed62db4a57800401227977622565 /gdb | |
parent | 1bbc4824010dff2aa0ef1a5a3fb1b6182f272960 (diff) | |
download | gdb-71ea8a532ec69f465a33d03f659105ab29366ca2.tar.gz |
* dwarf2-frame.c (read_encoded_value): Add support for
DW_EH_PE_aligned encoding.
Diffstat (limited to 'gdb')
-rw-r--r-- | gdb/ChangeLog | 5 | ||||
-rw-r--r-- | gdb/dwarf2-frame.c | 27 |
2 files changed, 25 insertions, 7 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 308c71919c6..40d58ca55d9 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,8 @@ +2003-09-09 Mark Kettenis <kettenis@gnu.org> + + * dwarf2-frame.c (read_encoded_value): Add support for + DW_EH_PE_aligned encoding. + 2003-09-08 Daniel Jacobowitz <drow@mvista.com> * infrun.c (normal_stop): Don't print a message if the inferior diff --git a/gdb/dwarf2-frame.c b/gdb/dwarf2-frame.c index 9b23841967b..c1a79ceef2a 100644 --- a/gdb/dwarf2-frame.c +++ b/gdb/dwarf2-frame.c @@ -932,6 +932,8 @@ static CORE_ADDR read_encoded_value (struct comp_unit *unit, unsigned char encoding, char *buf, unsigned int *bytes_read_ptr) { + int ptr_len = size_of_encoded_value (DW_EH_PE_absptr); + ptrdiff_t offset; CORE_ADDR base; /* GCC currently doesn't generate DW_EH_PE_indirect encodings for @@ -940,6 +942,8 @@ read_encoded_value (struct comp_unit *unit, unsigned char encoding, internal_error (__FILE__, __LINE__, "Unsupported encoding: DW_EH_PE_indirect"); + *bytes_read_ptr = 0; + switch (encoding & 0x70) { case DW_EH_PE_absptr: @@ -952,32 +956,41 @@ read_encoded_value (struct comp_unit *unit, unsigned char encoding, case DW_EH_PE_datarel: base = unit->dbase; break; + case DW_EH_PE_aligned: + base = 0; + offset = buf - unit->dwarf_frame_buffer; + if ((offset % ptr_len) != 0) + { + *bytes_read_ptr = ptr_len - (offset % ptr_len); + buf += *bytes_read_ptr; + } + break; default: internal_error (__FILE__, __LINE__, "Invalid or unsupported encoding"); } if ((encoding & 0x0f) == 0x00) - encoding |= encoding_for_size (TYPE_LENGTH(builtin_type_void_data_ptr)); + encoding |= encoding_for_size (ptr_len); switch (encoding & 0x0f) { case DW_EH_PE_udata2: - *bytes_read_ptr = 2; + *bytes_read_ptr += 2; return (base + bfd_get_16 (unit->abfd, (bfd_byte *) buf)); case DW_EH_PE_udata4: - *bytes_read_ptr = 4; + *bytes_read_ptr += 4; return (base + bfd_get_32 (unit->abfd, (bfd_byte *) buf)); case DW_EH_PE_udata8: - *bytes_read_ptr = 8; + *bytes_read_ptr += 8; return (base + bfd_get_64 (unit->abfd, (bfd_byte *) buf)); case DW_EH_PE_sdata2: - *bytes_read_ptr = 2; + *bytes_read_ptr += 2; return (base + bfd_get_signed_16 (unit->abfd, (bfd_byte *) buf)); case DW_EH_PE_sdata4: - *bytes_read_ptr = 4; + *bytes_read_ptr += 4; return (base + bfd_get_signed_32 (unit->abfd, (bfd_byte *) buf)); case DW_EH_PE_sdata8: - *bytes_read_ptr = 8; + *bytes_read_ptr += 8; return (base + bfd_get_signed_64 (unit->abfd, (bfd_byte *) buf)); default: internal_error (__FILE__, __LINE__, "Invalid or unsupported encoding"); |