* findvar.c (read_frame_register_value): Respect value_offset
of the register value. Remove big-endian special case.
This commit is contained in:
parent
732f3f122e
commit
01efb93640
@ -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:
|
||||
|
@ -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++;
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user