summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Kettenis <kettenis@gnu.org>2003-09-08 22:43:40 +0000
committerMark Kettenis <kettenis@gnu.org>2003-09-08 22:43:40 +0000
commit71ea8a532ec69f465a33d03f659105ab29366ca2 (patch)
tree4e75abc76e55ed62db4a57800401227977622565
parent1bbc4824010dff2aa0ef1a5a3fb1b6182f272960 (diff)
downloadgdb-71ea8a532ec69f465a33d03f659105ab29366ca2.tar.gz
* dwarf2-frame.c (read_encoded_value): Add support for
DW_EH_PE_aligned encoding.
-rw-r--r--gdb/ChangeLog5
-rw-r--r--gdb/dwarf2-frame.c27
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");