aboutsummaryrefslogtreecommitdiff
path: root/gdb/remote.c
diff options
context:
space:
mode:
authorAlan Hayward <alan.hayward@arm.com>2017-01-18 15:15:50 +0000
committerAlan Hayward <alan.hayward@arm.com>2017-01-18 15:17:55 +0000
commitd1dff2266d29c4739aee6f68c8c587d44b03a717 (patch)
tree2433b48863c8ad6f05aa6d7b6f0d9d488dbcde82 /gdb/remote.c
parent9890e4338dcabf4512b4856b09511f25c81d10f1 (diff)
downloadgdb-d1dff2266d29c4739aee6f68c8c587d44b03a717.zip
gdb-d1dff2266d29c4739aee6f68c8c587d44b03a717.tar.gz
gdb-d1dff2266d29c4739aee6f68c8c587d44b03a717.tar.bz2
Allocate data in cached_reg_t
2017-01-18 Alan Hayward <alan.hayward@arm.com> * remote.c (struct cached_reg): Change data into a pointer. * (stop_reply_dtr): Free data pointers before deleting vector. (process_stop_reply): Likewise. (remote_parse_stop_reply): Allocate space for data
Diffstat (limited to 'gdb/remote.c')
-rw-r--r--gdb/remote.c24
1 files changed, 18 insertions, 6 deletions
diff --git a/gdb/remote.c b/gdb/remote.c
index b81bb2f..c4cec91 100644
--- a/gdb/remote.c
+++ b/gdb/remote.c
@@ -6311,7 +6311,7 @@ remote_console_output (char *msg)
typedef struct cached_reg
{
int num;
- gdb_byte data[MAX_REGISTER_SIZE];
+ gdb_byte *data;
} cached_reg_t;
DEF_VEC_O(cached_reg_t);
@@ -6407,6 +6407,13 @@ static void
stop_reply_dtr (struct notif_event *event)
{
struct stop_reply *r = (struct stop_reply *) event;
+ cached_reg_t *reg;
+ int ix;
+
+ for (ix = 0;
+ VEC_iterate (cached_reg_t, r->regcache, ix, reg);
+ ix++)
+ xfree (reg->data);
VEC_free (cached_reg_t, r->regcache);
}
@@ -6979,6 +6986,7 @@ Packet: '%s'\n"),
{
struct packet_reg *reg = packet_reg_from_pnum (rsa, pnum);
cached_reg_t cached_reg;
+ struct gdbarch *gdbarch = target_gdbarch ();
if (reg == NULL)
error (_("Remote sent bad register number %s: %s\n\
@@ -6986,14 +6994,14 @@ Packet: '%s'\n"),
hex_string (pnum), p, buf);
cached_reg.num = reg->regnum;
+ cached_reg.data = (gdb_byte *)
+ xmalloc (register_size (gdbarch, reg->regnum));
p = p1 + 1;
fieldsize = hex2bin (p, cached_reg.data,
- register_size (target_gdbarch (),
- reg->regnum));
+ register_size (gdbarch, reg->regnum));
p += 2 * fieldsize;
- if (fieldsize < register_size (target_gdbarch (),
- reg->regnum))
+ if (fieldsize < register_size (gdbarch, reg->regnum))
warning (_("Remote reply is too short: %s"), buf);
VEC_safe_push (cached_reg_t, event->regcache, &cached_reg);
@@ -7214,9 +7222,13 @@ process_stop_reply (struct stop_reply *stop_reply,
int ix;
for (ix = 0;
- VEC_iterate(cached_reg_t, stop_reply->regcache, ix, reg);
+ VEC_iterate (cached_reg_t, stop_reply->regcache, ix, reg);
ix++)
+ {
regcache_raw_supply (regcache, reg->num, reg->data);
+ xfree (reg->data);
+ }
+
VEC_free (cached_reg_t, stop_reply->regcache);
}