Message ID | 69EEE46A-D88C-4B4F-86A2-E35F6DAFD90A@arm.com |
---|---|
State | New |
Headers | show |
Alan Hayward <Alan.Hayward@arm.com> writes: > - regcache_cooked_read (regcache, entry->u.reg.num, reg); > - regcache_cooked_write (regcache, entry->u.reg.num, > - record_full_get_loc (entry)); > - memcpy (record_full_get_loc (entry), reg, entry->u.reg.len); The original code is about swapping contents of register REG in regcache and record_full_get_loc (entry), and the length is known entry->u.reg.len. > + value = regcache->cooked_read_value (entry->u.reg.num); > + gdb_assert (value != NULL); > + regcache->cooked_write (entry->u.reg.num, record_full_get_loc (entry)); > + memcpy (record_full_get_loc (entry), value_contents_all (value), > + entry->u.reg.len); > + release_value (value); > + value_free (value); It is a overkill to use value to swap these two buffers, IMO. How about xmalloc "reg" instead?
diff --git a/gdb/record-full.c b/gdb/record-full.c index 31ff558d2a633cff71d3e6082e42f5d6fb88bcf1..2f09e2fc316d7d3073de035f961f7c3bf9d3002c 100644 --- a/gdb/record-full.c +++ b/gdb/record-full.c @@ -698,7 +698,7 @@ record_full_exec_insn (struct regcache *regcache, { case record_full_reg: /* reg */ { - gdb_byte reg[MAX_REGISTER_SIZE]; + struct value *value; if (record_debug > 1) fprintf_unfiltered (gdb_stdlog, @@ -707,10 +707,13 @@ record_full_exec_insn (struct regcache *regcache, host_address_to_string (entry), entry->u.reg.num); - regcache_cooked_read (regcache, entry->u.reg.num, reg); - regcache_cooked_write (regcache, entry->u.reg.num, - record_full_get_loc (entry)); - memcpy (record_full_get_loc (entry), reg, entry->u.reg.len); + value = regcache->cooked_read_value (entry->u.reg.num); + gdb_assert (value != NULL); + regcache->cooked_write (entry->u.reg.num, record_full_get_loc (entry)); + memcpy (record_full_get_loc (entry), value_contents_all (value), + entry->u.reg.len); + release_value (value); + value_free (value); } break;