Allocate data in cached_reg_t
authorAlan Hayward <alan.hayward@arm.com>
Wed, 18 Jan 2017 15:15:50 +0000 (15:15 +0000)
committerAlan Hayward <alan.hayward@arm.com>
Wed, 18 Jan 2017 15:17:55 +0000 (15:17 +0000)
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

gdb/ChangeLog
gdb/remote.c

index 8942e25127b148860c2fd3337dd6024126ab7758..9e1e67db7ab34a4de074b95409ab28f757ce73b5 100644 (file)
@@ -1,3 +1,10 @@
+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
+
 2017-01-18  Alan Hayward  <alan.hayward@arm.com>
 
        * amd64-tdep.c (amd64_pseudo_register_read_value): remove
index b81bb2f4302fc518cf057ce3c52643a121bf76be..c4cec910c44cf91cc7f36b7f2d87cde3f46de41e 100644 (file)
@@ -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);
        }