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 | 68f6cf990a34f25f96d130695e5abbc38a00a65c (patch) | |
tree | 868401b28f4b88dd443ad897150ffbef1de17d5e /gdb/dwarf2-frame.c | |
parent | 04ed252fc113049bd1a05997f51b24d932f6fa09 (diff) | |
download | gdb-68f6cf990a34f25f96d130695e5abbc38a00a65c.zip gdb-68f6cf990a34f25f96d130695e5abbc38a00a65c.tar.gz gdb-68f6cf990a34f25f96d130695e5abbc38a00a65c.tar.bz2 |
* dwarf2-frame.c (read_encoded_value): Add support for
DW_EH_PE_aligned encoding.
Diffstat (limited to 'gdb/dwarf2-frame.c')
-rw-r--r-- | gdb/dwarf2-frame.c | 27 |
1 files changed, 20 insertions, 7 deletions
diff --git a/gdb/dwarf2-frame.c b/gdb/dwarf2-frame.c index 9b23841..c1a79ce 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"); |