Remove last_cache
authorYao Qi <yao@codesourcery.com>
Tue, 29 Oct 2013 13:34:20 +0000 (21:34 +0800)
committerYao Qi <yao@codesourcery.com>
Wed, 20 Nov 2013 03:40:43 +0000 (11:40 +0800)
This patch removes global variable 'last_cache', and initialize
'target_dcache' lazily, so that 'target_dcache' can replace
'last_cache'.  No functionalities should be changed after this patch.

gdb:

2013-11-20  Yao Qi  <yao@codesourcery.com>

* dcache.c (last_cache): Remove.
(dcache_free, dcache_init): Update.
(dcache_update):
(dcache_print_line): Add parameter 'dcache'.  Replace
'target_dcache' with 'dcache'.
(dcache_info): Move code to dcache_info_1. Call
'dcache_info_1'.
(dcache_info_1): New function.
(set_dcache_size): Call target_dcache_invalidate.
(set_dcache_line_size): Call target_dcache_invalidate.
* target.c (target_dcache_init_p): New function.
(target_dcache_invalidate): Check target_dcache_init_p first.
(target_dcache_get, target_dcache_get_or_init): New function.
(memory_xfer_partial_1): Adjust.
(initialize_target): Don't initialize 'target_dcache'.
* target.h (struct dcache_struct): Declare.
(target_dcache_get): Declare.

gdb/ChangeLog
gdb/dcache.c
gdb/target.c
gdb/target.h

index e29624119493edd0799b9524252eb6ad93ff2740..9de86a3e268280962f67bc6a12d1977621028d77 100644 (file)
@@ -1,3 +1,23 @@
+2013-11-20  Yao Qi  <yao@codesourcery.com>
+
+       * dcache.c (last_cache): Remove.
+       (dcache_free, dcache_init): Update.
+       (dcache_update):
+       (dcache_print_line): Add parameter 'dcache'.  Replace
+       'target_dcache' with 'dcache'.
+       (dcache_info): Move code to dcache_info_1. Call
+       'dcache_info_1'.
+       (dcache_info_1): New function.
+       (set_dcache_size): Call target_dcache_invalidate.
+       (set_dcache_line_size): Call target_dcache_invalidate.
+       * target.c (target_dcache_init_p): New function.
+       (target_dcache_invalidate): Check target_dcache_init_p first.
+       (target_dcache_get, target_dcache_get_or_init): New function.
+       (memory_xfer_partial_1): Adjust.
+       (initialize_target): Don't initialize 'target_dcache'.
+       * target.h (struct dcache_struct): Declare.
+       (target_dcache_get): Declare.
+
 2013-11-19  Yao Qi  <yao@codesourcery.com>
 
        * varobj.c (varobj_get_type): Fix typo.
index bacd629ec0d2af37f2add1af2e117b65bf6790d1..dd6671149a6254e3a4ccbff7f295a02b8ac64598 100644 (file)
@@ -139,8 +139,6 @@ show_dcache_enabled_p (struct ui_file *file, int from_tty,
   fprintf_filtered (file, _("Deprecated remotecache flag is %s.\n"), value);
 }
 
-static DCACHE *last_cache; /* Used by info dcache.  */
-
 /* Add BLOCK to circular block list BLIST, behind the block at *BLIST.
    *BLIST is not updated (unless it was previously NULL of course).
    This is for the least-recently-allocated list's sake:
@@ -225,9 +223,6 @@ free_block (struct dcache_block *block, void *param)
 void
 dcache_free (DCACHE *dcache)
 {
-  if (last_cache == dcache)
-    last_cache = NULL;
-
   splay_tree_delete (dcache->tree);
   for_each_block (&dcache->oldest, free_block, NULL);
   for_each_block (&dcache->freelist, free_block, NULL);
@@ -468,7 +463,6 @@ dcache_init (void)
   dcache->size = 0;
   dcache->line_size = dcache_line_size;
   dcache->ptid = null_ptid;
-  last_cache = dcache;
 
   return dcache;
 }
@@ -557,26 +551,28 @@ dcache_update (DCACHE *dcache, CORE_ADDR memaddr, gdb_byte *myaddr, int len)
     dcache_poke_byte (dcache, memaddr + i, myaddr + i);
 }
 
+/* Print DCACHE line INDEX.  */
+
 static void
-dcache_print_line (int index)
+dcache_print_line (DCACHE *dcache, int index)
 {
   splay_tree_node n;
   struct dcache_block *db;
   int i, j;
 
-  if (!last_cache)
+  if (dcache == NULL)
     {
       printf_filtered (_("No data cache available.\n"));
       return;
     }
 
-  n = splay_tree_min (last_cache->tree);
+  n = splay_tree_min (dcache->tree);
 
   for (i = index; i > 0; --i)
     {
       if (!n)
        break;
-      n = splay_tree_successor (last_cache->tree, n->key);
+      n = splay_tree_successor (dcache->tree, n->key);
     }
 
   if (!n)
@@ -590,19 +586,21 @@ dcache_print_line (int index)
   printf_filtered (_("Line %d: address %s [%d hits]\n"),
                   index, paddress (target_gdbarch (), db->addr), db->refs);
 
-  for (j = 0; j < last_cache->line_size; j++)
+  for (j = 0; j < dcache->line_size; j++)
     {
       printf_filtered ("%02x ", db->data[j]);
 
       /* Print a newline every 16 bytes (48 characters).  */
-      if ((j % 16 == 15) && (j != last_cache->line_size - 1))
+      if ((j % 16 == 15) && (j != dcache->line_size - 1))
        printf_filtered ("\n");
     }
   printf_filtered ("\n");
 }
 
+/* Parse EXP and show the info about DCACHE.  */
+
 static void
-dcache_info (char *exp, int tty)
+dcache_info_1 (DCACHE *dcache, char *exp)
 {
   splay_tree_node n;
   int i, refcount;
@@ -618,27 +616,27 @@ dcache_info (char *exp, int tty)
           return;
        }
 
-      dcache_print_line (i);
+      dcache_print_line (dcache, i);
       return;
     }
 
   printf_filtered (_("Dcache %u lines of %u bytes each.\n"),
                   dcache_size,
-                  last_cache ? (unsigned) last_cache->line_size
+                  dcache ? (unsigned) dcache->line_size
                   : dcache_line_size);
 
-  if (!last_cache || ptid_equal (last_cache->ptid, null_ptid))
+  if (dcache == NULL || ptid_equal (dcache->ptid, null_ptid))
     {
       printf_filtered (_("No data cache available.\n"));
       return;
     }
 
   printf_filtered (_("Contains data for %s\n"),
-                  target_pid_to_str (last_cache->ptid));
+                  target_pid_to_str (dcache->ptid));
 
   refcount = 0;
 
-  n = splay_tree_min (last_cache->tree);
+  n = splay_tree_min (dcache->tree);
   i = 0;
 
   while (n)
@@ -650,12 +648,18 @@ dcache_info (char *exp, int tty)
       i++;
       refcount += db->refs;
 
-      n = splay_tree_successor (last_cache->tree, n->key);
+      n = splay_tree_successor (dcache->tree, n->key);
     }
 
   printf_filtered (_("Cache state: %d active lines, %d hits\n"), i, refcount);
 }
 
+static void
+dcache_info (char *exp, int tty)
+{
+  dcache_info_1 (target_dcache_get (), exp);
+}
+
 static void
 set_dcache_size (char *args, int from_tty,
                 struct cmd_list_element *c)
@@ -665,8 +669,7 @@ set_dcache_size (char *args, int from_tty,
       dcache_size = DCACHE_DEFAULT_SIZE;
       error (_("Dcache size must be greater than 0."));
     }
-  if (last_cache)
-    dcache_invalidate (last_cache);
+  target_dcache_invalidate ();
 }
 
 static void
@@ -680,8 +683,7 @@ set_dcache_line_size (char *args, int from_tty,
       dcache_line_size = DCACHE_DEFAULT_LINE_SIZE;
       error (_("Invalid dcache line size: %u (must be power of 2)."), d);
     }
-  if (last_cache)
-    dcache_invalidate (last_cache);
+  target_dcache_invalidate ();
 }
 
 static void
index 52d1081548a87d0424454343df81c97fd0832260..cb758536ce58bb79958718c26d90e0f97e9cefb7 100644 (file)
@@ -238,12 +238,42 @@ show_stack_cache_enabled_p (struct ui_file *file, int from_tty,
 /* Cache of memory operations, to speed up remote access.  */
 static DCACHE *target_dcache;
 
+/* Target dcache is initialized or not.  */
+
+static int
+target_dcache_init_p (void)
+{
+  return (target_dcache != NULL);
+}
+
 /* Invalidate the target dcache.  */
 
 void
 target_dcache_invalidate (void)
 {
-  dcache_invalidate (target_dcache);
+  if (target_dcache_init_p ())
+    dcache_invalidate (target_dcache);
+}
+
+/* Return the target dcache.  Return NULL if target dcache is not
+   initialized yet.  */
+
+DCACHE *
+target_dcache_get (void)
+{
+  return target_dcache;
+}
+
+/* Return the target dcache.  If it is not initialized yet, initialize
+   it.  */
+
+static DCACHE *
+target_dcache_get_or_init (void)
+{
+  if (!target_dcache_init_p ())
+    target_dcache = dcache_init ();
+
+  return target_dcache;
 }
 
 /* The user just typed 'target' without the name of a target.  */
@@ -1588,15 +1618,15 @@ memory_xfer_partial_1 (struct target_ops *ops, enum target_object object,
       && (region->attrib.cache
          || (stack_cache_enabled_p && object == TARGET_OBJECT_STACK_MEMORY)))
     {
+      DCACHE *dcache = target_dcache_get_or_init ();
+
       if (readbuf != NULL)
-       res = dcache_xfer_memory (ops, target_dcache, memaddr, readbuf,
-                                 reg_len, 0);
+       res = dcache_xfer_memory (ops, dcache, memaddr, readbuf, reg_len, 0);
       else
        /* FIXME drow/2006-08-09: If we're going to preserve const
           correctness dcache_xfer_memory should take readbuf and
           writebuf.  */
-       res = dcache_xfer_memory (ops, target_dcache, memaddr,
-                                 (void *) writebuf,
+       res = dcache_xfer_memory (ops, dcache, memaddr, (void *) writebuf,
                                  reg_len, 1);
       if (res <= 0)
        return -1;
@@ -1641,7 +1671,9 @@ memory_xfer_partial_1 (struct target_ops *ops, enum target_object object,
       && stack_cache_enabled_p
       && object != TARGET_OBJECT_STACK_MEMORY)
     {
-      dcache_update (target_dcache, memaddr, (void *) writebuf, res);
+      DCACHE *dcache = target_dcache_get_or_init ();
+
+      dcache_update (dcache, memaddr, (void *) writebuf, res);
     }
 
   /* If we still haven't got anything, return the last error.  We
@@ -5193,7 +5225,4 @@ When this permission is on, GDB may interrupt/stop the target's execution.\n\
 Otherwise, any attempt to interrupt or stop will be ignored."),
                           set_target_permissions, NULL,
                           &setlist, &showlist);
-
-
-  target_dcache = dcache_init ();
 }
index df17be5cb6d2beb0e79eabfa5762e4448b5ba75a..87366e6fa1b0d8d620111ab15f6e704cfe00da0a 100644 (file)
@@ -37,6 +37,7 @@ struct uploaded_tp;
 struct static_tracepoint_marker;
 struct traceframe_info;
 struct expression;
+struct dcache_struct;
 
 /* This include file defines the interface between the main part
    of the debugger, and the part which is target-specific, or
@@ -1045,6 +1046,8 @@ int target_supports_disable_randomization (void);
 /* Invalidate all target dcaches.  */
 extern void target_dcache_invalidate (void);
 
+extern struct dcache_struct *target_dcache_get (void);
+
 extern int target_read_string (CORE_ADDR, char **, int, int *);
 
 extern int target_read_memory (CORE_ADDR memaddr, gdb_byte *myaddr,