ada_value_assign: Correct big-endian case to take into account the bitsize
authorPaul N. Hilfinger <hilfinger@adacore.com>
Fri, 6 Jun 2008 06:48:36 +0000 (06:48 +0000)
committerPaul N. Hilfinger <hilfinger@adacore.com>
Fri, 6 Jun 2008 06:48:36 +0000 (06:48 +0000)
  of the 'from' operand.

gdb/ChangeLog
gdb/ada-lang.c

index d899475..f17ed40 100644 (file)
@@ -1,3 +1,8 @@
+2008-06-06  Paul N. Hilfinger  <hilfinger@adacore.com>
+
+       * ada-lang.c (ada_value_assign): Correct big-endian case to take into
+       account the bitsize of the 'from' operand.
+
 2008-06-06  Pedro Alves  <pedro@codesourcery.com>
 
        * annotate.h (annotate_thread_changed): Declare.
index ea55bbc..cb85617 100644 (file)
@@ -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);