aboutsummaryrefslogtreecommitdiff
path: root/gdb/ada-lang.c
diff options
context:
space:
mode:
authorPaul N. Hilfinger <hilfinger@adacore.com>2008-06-06 06:48:36 +0000
committerPaul N. Hilfinger <hilfinger@adacore.com>2008-06-06 06:48:36 +0000
commitaced2898db4da63573b0d9af3da8d58fac23c434 (patch)
tree38e27048a8cdc1d45bfab153d4cd5531fc1543d5 /gdb/ada-lang.c
parent97407faf3da58e5e3bd1d042e746d8e328b00ce3 (diff)
downloadgdb-aced2898db4da63573b0d9af3da8d58fac23c434.zip
gdb-aced2898db4da63573b0d9af3da8d58fac23c434.tar.gz
gdb-aced2898db4da63573b0d9af3da8d58fac23c434.tar.bz2
ada_value_assign: Correct big-endian case to take into account the bitsize
of the 'from' operand.
Diffstat (limited to 'gdb/ada-lang.c')
-rw-r--r--gdb/ada-lang.c8
1 files changed, 5 insertions, 3 deletions
diff --git a/gdb/ada-lang.c b/gdb/ada-lang.c
index ea55bbc..cb85617 100644
--- a/gdb/ada-lang.c
+++ b/gdb/ada-lang.c
@@ -2252,6 +2252,7 @@ ada_value_assign (struct value *toval, struct value *fromval)
{
int len = (value_bitpos (toval)
+ bits + HOST_CHAR_BIT - 1) / HOST_CHAR_BIT;
+ int from_size;
char *buffer = (char *) alloca (len);
struct value *val;
CORE_ADDR to_addr = VALUE_ADDRESS (toval) + value_offset (toval);
@@ -2260,11 +2261,12 @@ ada_value_assign (struct value *toval, struct value *fromval)
fromval = value_cast (type, fromval);
read_memory (to_addr, buffer, len);
+ from_size = value_bitsize (fromval);
+ if (from_size == 0)
+ from_size = TYPE_LENGTH (value_type (fromval)) * TARGET_CHAR_BIT;
if (gdbarch_bits_big_endian (current_gdbarch))
move_bits (buffer, value_bitpos (toval),
- value_contents (fromval),
- TYPE_LENGTH (value_type (fromval)) * TARGET_CHAR_BIT -
- bits, bits);
+ value_contents (fromval), from_size - bits, bits);
else
move_bits (buffer, value_bitpos (toval), value_contents (fromval),
0, bits);