Remove last_cache

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.
This commit is contained in:
Yao Qi
2013-10-29 21:34:20 +08:00
parent 3e9ecad3e8
commit 2a2f9fe400
4 changed files with 86 additions and 32 deletions

View 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