2002-04-20 Daniel Jacobowitz <drow@mvista.com>
authorDaniel Jacobowitz <drow@false.org>
Sat, 20 Apr 2002 17:22:48 +0000 (17:22 +0000)
committerDaniel Jacobowitz <drow@false.org>
Sat, 20 Apr 2002 17:22:48 +0000 (17:22 +0000)
        * gdbserver/inferiors.c (struct inferior_info): Add regcache_data.
        (add_inferior): Call create_register_cache.
        (clear_inferiors): Call free_register_cache.
        (inferior_regcache_data, set_inferior_regcache_data): New functions.
        * gdbserver/regcache.c (struct inferior_regcache_data): New.
        (registers): Remove.
        (get_regcache): New function.
        (create_register_cache, free_register_cache): New functions.
        (set_register_cache): Don't initialize the register cache here.
        (registers_to_string, registers_from_string, register_data): Call
        get_regcache.
        * gdbserver/regcache.h: Add prototypes.
        * gdbserver/server.h: Likewise.

gdb/ChangeLog
gdb/gdbserver/inferiors.c
gdb/gdbserver/regcache.c
gdb/gdbserver/regcache.h
gdb/gdbserver/server.h

index 32f2a24ca009099e1e071aa1efabb320a6239c11..16d3d763cf7c32ef5cc3347ed610f0ecea45e468 100644 (file)
@@ -1,3 +1,19 @@
+2002-04-20  Daniel Jacobowitz  <drow@mvista.com>
+
+       * gdbserver/inferiors.c (struct inferior_info): Add regcache_data.
+       (add_inferior): Call create_register_cache.
+       (clear_inferiors): Call free_register_cache.
+       (inferior_regcache_data, set_inferior_regcache_data): New functions.
+       * gdbserver/regcache.c (struct inferior_regcache_data): New.
+       (registers): Remove.
+       (get_regcache): New function.
+       (create_register_cache, free_register_cache): New functions.
+       (set_register_cache): Don't initialize the register cache here.
+       (registers_to_string, registers_from_string, register_data): Call
+       get_regcache.
+       * gdbserver/regcache.h: Add prototypes.
+       * gdbserver/server.h: Likewise.
+
 2002-04-20  Daniel Jacobowitz  <drow@mvista.com>
 
        * gdbserver/mem-break.c: New file.
index f8cbd04d63b17e320df79c97ea5229b3bc8928ec..774798deae341ba02db184f36a9e685a66aa5e51 100644 (file)
@@ -29,6 +29,7 @@ struct inferior_info
 {
   int pid;
   void *target_data;
+  void *regcache_data;
   struct inferior_info *next;
 };
 
@@ -52,6 +53,8 @@ add_inferior (int pid)
   if (current_inferior == NULL)
     current_inferior = inferiors;
 
+  create_register_cache (new_inferior);
+
   if (signal_pid == 0)
     signal_pid = pid;
 }
@@ -67,6 +70,8 @@ clear_inferiors (void)
 
       if (inf->target_data)
        free (inf->target_data);
+      if (inf->regcache_data)
+       free_register_cache (inf);
 
       free (inf);
       inf = next_inf;
@@ -86,3 +91,15 @@ set_inferior_target_data (struct inferior_info *inferior, void *data)
 {
   inferior->target_data = data;
 }
+
+void *
+inferior_regcache_data (struct inferior_info *inferior)
+{
+  return inferior->regcache_data;
+}
+
+void
+set_inferior_regcache_data (struct inferior_info *inferior, void *data)
+{
+  inferior->regcache_data = data;
+}
index 5e3c62f07b3a44db8ea90054fb46e4dbaf86e895..701d09232f856b527abe5a6972b690b31f46b075 100644 (file)
 #include <stdlib.h>
 #include <string.h>
 
-static char *registers;
+struct inferior_regcache_data
+{
+  char *registers;
+};
+
 static int register_bytes;
 
 static struct reg *reg_defs;
@@ -33,12 +37,47 @@ static int num_registers;
 
 const char **gdbserver_expedite_regs;
 
+static struct inferior_regcache_data *
+get_regcache (struct inferior_info *inf)
+{
+  struct inferior_regcache_data *regcache;
+
+  regcache = (struct inferior_regcache_data *) inferior_regcache_data (inf);
+
+  if (regcache == NULL)
+    fatal ("no register cache");
+
+  return regcache;
+}
+
 int
 registers_length (void)
 {
   return 2 * register_bytes;
 }
 
+void
+create_register_cache (struct inferior_info *inferior)
+{
+  struct inferior_regcache_data *regcache;
+
+  regcache = malloc (sizeof (*regcache));
+
+  regcache->registers = malloc (register_bytes);
+  if (regcache->registers == NULL)
+    fatal ("Could not allocate register cache.");
+
+  set_inferior_regcache_data (inferior, regcache);
+}
+
+void
+free_register_cache (struct inferior_info *inferior)
+{
+  free (get_regcache (current_inferior)->registers);
+  free (get_regcache (current_inferior));
+  set_inferior_regcache_data (inferior, NULL);
+}
+
 void
 set_register_cache (struct reg *regs, int n)
 {
@@ -55,14 +94,13 @@ set_register_cache (struct reg *regs, int n)
     }
 
   register_bytes = offset / 8;
-  registers = malloc (offset / 8);
-  if (!registers)
-    fatal ("Could not allocate register cache.");
 }
 
 void
 registers_to_string (char *buf)
 {
+  char *registers = get_regcache (current_inferior)->registers;
+
   convert_int_to_ascii (registers, buf, register_bytes);
 }
 
@@ -70,6 +108,7 @@ void
 registers_from_string (char *buf)
 {
   int len = strlen (buf);
+  char *registers = get_regcache (current_inferior)->registers;
 
   if (len != register_bytes * 2)
     {
@@ -119,6 +158,8 @@ register_size (int n)
 char *
 register_data (int n)
 {
+  char *registers = get_regcache (current_inferior)->registers;
+
   return registers + (reg_defs[n].offset / 8);
 }
 
index e71aee26e60ad511eaf4364475c0b0a7e446fd9a..1b3b926a2c0cbe09798797311f809236bf79de8c 100644 (file)
 #ifndef REGCACHE_H
 #define REGCACHE_H
 
+/* Create a new register cache for INFERIOR.  */
+
+void create_register_cache (struct inferior_info *inferior);
+
+/* Release all memory associated with the register cache for INFERIOR.  */
+
+void free_register_cache (struct inferior_info *inferior);
+
 /* Convert all registers to a string in the currently specified remote
    format.  */
 
index 0d08422258229e4e858018ff10b5a56e74495abd..32b90b5bcc7922bcdf6c0317c805a9de7af441ef 100644 (file)
@@ -54,6 +54,9 @@
    least the size of a (void *).  */
 typedef long long CORE_ADDR;
 
+/* Opaque inferior process information.  */
+struct inferior_info;
+
 #include "regcache.h"
 #include "gdb/signals.h"
 
@@ -70,14 +73,14 @@ extern char *registers;
 
 /* From inferiors.c.  */
 
-struct inferior_info;
 extern struct inferior_info *current_inferior;
 extern int signal_pid;
 void add_inferior (int pid);
 void clear_inferiors (void);
 void *inferior_target_data (struct inferior_info *);
 void set_inferior_target_data (struct inferior_info *, void *);
-
+void *inferior_regcache_data (struct inferior_info *);
+void set_inferior_regcache_data (struct inferior_info *, void *);
 
 /* Public variables in server.c */