commit 1c14f39bb70a05475bb9dfaf5e21103772a9605f Author: Joel Brobecker Date: Fri Oct 21 14:34:54 2011 -0700 handle variables stored in muliple consecutive registers gdb/ChangeLog: * value.c (read_frame_register_value): New function. * findvar.c (value_from_register): Use read_frame_register_value instead of get_frame_register_value + value_contents_copy to get value contents. diff --git a/gdb/findvar.c b/gdb/findvar.c index 8e986f1..a417c02 100644 --- a/gdb/findvar.c +++ b/gdb/findvar.c @@ -661,16 +661,11 @@ value_from_register (struct type *type, int regnum, struct frame_info *frame) } else { - int len = TYPE_LENGTH (type); - struct value *v2; - /* Construct the value. */ v = gdbarch_value_from_register (gdbarch, type, regnum, frame); /* Get the data. */ - v2 = get_frame_register_value (frame, regnum); - - value_contents_copy (v, 0, v2, value_offset (v), len); + read_frame_register_value (v, frame); } return v; diff --git a/gdb/value.c b/gdb/value.c index 087cdfd..8dc9258 100644 --- a/gdb/value.c +++ b/gdb/value.c @@ -3140,6 +3140,35 @@ using_struct_return (struct gdbarch *gdbarch, != RETURN_VALUE_REGISTER_CONVENTION); } +/* VALUE must be an lval_register value. If regnum is the value's + associated register number, and len the length of the values type, + read one or more registers in FRAME, starting with register REGNUM, + until we've read LEN bytes. */ + +void +read_frame_register_value (struct value *value, struct frame_info *frame) +{ + int offset = 0; + int regnum = value->regnum; + const int len = TYPE_LENGTH (value_type (value)); + + gdb_assert (value->lval == lval_register); + + while (offset < len) + { + struct value *regval = get_frame_register_value (frame, regnum); + int reg_len = TYPE_LENGTH (value_type (regval)); + + if (offset + reg_len > len) + reg_len = len - offset; + value_contents_copy (value, offset, regval, value_offset (regval), + reg_len); + + offset += reg_len; + regnum++; + } +} + /* Set the initialized field in a value struct. */ void diff --git a/gdb/value.h b/gdb/value.h index 5d61a0b..a933958 100644 --- a/gdb/value.h +++ b/gdb/value.h @@ -493,6 +493,9 @@ extern struct value *value_from_register (struct type *type, int regnum, extern CORE_ADDR address_from_register (struct type *type, int regnum, struct frame_info *frame); +extern void read_frame_register_value (struct value *value, + struct frame_info *frame); + extern struct value *value_of_variable (struct symbol *var, struct block *b); extern struct value *address_of_variable (struct symbol *var, struct block *b);