* findvar.c (read_frame_register_value): Respect value_offset
authorUlrich Weigand <uweigand@de.ibm.com>
Fri, 18 Nov 2011 20:03:42 +0000 (20:03 +0000)
committerUlrich Weigand <uweigand@de.ibm.com>
Fri, 18 Nov 2011 20:03:42 +0000 (20:03 +0000)
of the register value.  Remove big-endian special case.

gdb/ChangeLog
gdb/findvar.c

index 1a5d5f771eaf11926326de9ba43892ba7eb60411..1fbb409f9569d300087f1553320352eedd540701 100644 (file)
@@ -1,3 +1,8 @@
+2011-11-18  Ulrich Weigand  <uweigand@de.ibm.com>
+
+       * findvar.c (read_frame_register_value): Respect value_offset
+       of the register value.  Remove big-endian special case.
+
 2011-11-18  Tom Tromey  <tromey@redhat.com>
 
        PR build/7196:
index 426b488f79482e68f757301e188bd205fa74eb1c..33332c6acd57fffcdaa886b6c6f2397a14c3b1ca 100644 (file)
@@ -631,31 +631,37 @@ default_value_from_register (struct type *type, int regnum,
 void
 read_frame_register_value (struct value *value, struct frame_info *frame)
 {
+  struct gdbarch *gdbarch = get_frame_arch (frame);
   int offset = 0;
+  int reg_offset = value_offset (value);
   int regnum = VALUE_REGNUM (value);
-  const int len = TYPE_LENGTH (check_typedef (value_type (value)));
+  int len = TYPE_LENGTH (check_typedef (value_type (value)));
 
   gdb_assert (VALUE_LVAL (value) == lval_register);
 
-  while (offset < len)
+  /* Skip registers wholly inside of REG_OFFSET.  */
+  while (reg_offset >= register_size (gdbarch, regnum))
+    {
+      reg_offset -= register_size (gdbarch, regnum);
+      regnum++;
+    }
+
+  /* Copy the data.  */
+  while (len > 0)
     {
       struct value *regval = get_frame_register_value (frame, regnum);
-      int reg_len = TYPE_LENGTH (value_type (regval));
-      int reg_offset = 0;
+      int reg_len = TYPE_LENGTH (value_type (regval)) - reg_offset;
 
       /* If the register length is larger than the number of bytes
          remaining to copy, then only copy the appropriate bytes.  */
-      if (offset + reg_len > len)
-       {
-         reg_len = len - offset;
-         if (gdbarch_byte_order (get_frame_arch (frame)) == BFD_ENDIAN_BIG)
-           reg_offset = TYPE_LENGTH (value_type (regval)) - reg_len;
-       }
+      if (reg_len > len)
+       reg_len = len;
 
-      value_contents_copy (value, offset, regval,
-                           value_offset (regval) + reg_offset, reg_len);
+      value_contents_copy (value, offset, regval, reg_offset, reg_len);
 
       offset += reg_len;
+      len -= reg_len;
+      reg_offset = 0;
       regnum++;
     }
 }