mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-06-20 01:50:24 +08:00
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:
@ -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>
|
2013-11-19 Yao Qi <yao@codesourcery.com>
|
||||||
|
|
||||||
* varobj.c (varobj_get_type): Fix typo.
|
* varobj.c (varobj_get_type): Fix typo.
|
||||||
|
48
gdb/dcache.c
48
gdb/dcache.c
@ -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);
|
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.
|
/* Add BLOCK to circular block list BLIST, behind the block at *BLIST.
|
||||||
*BLIST is not updated (unless it was previously NULL of course).
|
*BLIST is not updated (unless it was previously NULL of course).
|
||||||
This is for the least-recently-allocated list's sake:
|
This is for the least-recently-allocated list's sake:
|
||||||
@ -225,9 +223,6 @@ free_block (struct dcache_block *block, void *param)
|
|||||||
void
|
void
|
||||||
dcache_free (DCACHE *dcache)
|
dcache_free (DCACHE *dcache)
|
||||||
{
|
{
|
||||||
if (last_cache == dcache)
|
|
||||||
last_cache = NULL;
|
|
||||||
|
|
||||||
splay_tree_delete (dcache->tree);
|
splay_tree_delete (dcache->tree);
|
||||||
for_each_block (&dcache->oldest, free_block, NULL);
|
for_each_block (&dcache->oldest, free_block, NULL);
|
||||||
for_each_block (&dcache->freelist, free_block, NULL);
|
for_each_block (&dcache->freelist, free_block, NULL);
|
||||||
@ -468,7 +463,6 @@ dcache_init (void)
|
|||||||
dcache->size = 0;
|
dcache->size = 0;
|
||||||
dcache->line_size = dcache_line_size;
|
dcache->line_size = dcache_line_size;
|
||||||
dcache->ptid = null_ptid;
|
dcache->ptid = null_ptid;
|
||||||
last_cache = dcache;
|
|
||||||
|
|
||||||
return 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);
|
dcache_poke_byte (dcache, memaddr + i, myaddr + i);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Print DCACHE line INDEX. */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
dcache_print_line (int index)
|
dcache_print_line (DCACHE *dcache, int index)
|
||||||
{
|
{
|
||||||
splay_tree_node n;
|
splay_tree_node n;
|
||||||
struct dcache_block *db;
|
struct dcache_block *db;
|
||||||
int i, j;
|
int i, j;
|
||||||
|
|
||||||
if (!last_cache)
|
if (dcache == NULL)
|
||||||
{
|
{
|
||||||
printf_filtered (_("No data cache available.\n"));
|
printf_filtered (_("No data cache available.\n"));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
n = splay_tree_min (last_cache->tree);
|
n = splay_tree_min (dcache->tree);
|
||||||
|
|
||||||
for (i = index; i > 0; --i)
|
for (i = index; i > 0; --i)
|
||||||
{
|
{
|
||||||
if (!n)
|
if (!n)
|
||||||
break;
|
break;
|
||||||
n = splay_tree_successor (last_cache->tree, n->key);
|
n = splay_tree_successor (dcache->tree, n->key);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!n)
|
if (!n)
|
||||||
@ -590,19 +586,21 @@ dcache_print_line (int index)
|
|||||||
printf_filtered (_("Line %d: address %s [%d hits]\n"),
|
printf_filtered (_("Line %d: address %s [%d hits]\n"),
|
||||||
index, paddress (target_gdbarch (), db->addr), db->refs);
|
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]);
|
printf_filtered ("%02x ", db->data[j]);
|
||||||
|
|
||||||
/* Print a newline every 16 bytes (48 characters). */
|
/* 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");
|
||||||
}
|
}
|
||||||
printf_filtered ("\n");
|
printf_filtered ("\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Parse EXP and show the info about DCACHE. */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
dcache_info (char *exp, int tty)
|
dcache_info_1 (DCACHE *dcache, char *exp)
|
||||||
{
|
{
|
||||||
splay_tree_node n;
|
splay_tree_node n;
|
||||||
int i, refcount;
|
int i, refcount;
|
||||||
@ -618,27 +616,27 @@ dcache_info (char *exp, int tty)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
dcache_print_line (i);
|
dcache_print_line (dcache, i);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
printf_filtered (_("Dcache %u lines of %u bytes each.\n"),
|
printf_filtered (_("Dcache %u lines of %u bytes each.\n"),
|
||||||
dcache_size,
|
dcache_size,
|
||||||
last_cache ? (unsigned) last_cache->line_size
|
dcache ? (unsigned) dcache->line_size
|
||||||
: 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"));
|
printf_filtered (_("No data cache available.\n"));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
printf_filtered (_("Contains data for %s\n"),
|
printf_filtered (_("Contains data for %s\n"),
|
||||||
target_pid_to_str (last_cache->ptid));
|
target_pid_to_str (dcache->ptid));
|
||||||
|
|
||||||
refcount = 0;
|
refcount = 0;
|
||||||
|
|
||||||
n = splay_tree_min (last_cache->tree);
|
n = splay_tree_min (dcache->tree);
|
||||||
i = 0;
|
i = 0;
|
||||||
|
|
||||||
while (n)
|
while (n)
|
||||||
@ -650,12 +648,18 @@ dcache_info (char *exp, int tty)
|
|||||||
i++;
|
i++;
|
||||||
refcount += db->refs;
|
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);
|
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
|
static void
|
||||||
set_dcache_size (char *args, int from_tty,
|
set_dcache_size (char *args, int from_tty,
|
||||||
struct cmd_list_element *c)
|
struct cmd_list_element *c)
|
||||||
@ -665,8 +669,7 @@ set_dcache_size (char *args, int from_tty,
|
|||||||
dcache_size = DCACHE_DEFAULT_SIZE;
|
dcache_size = DCACHE_DEFAULT_SIZE;
|
||||||
error (_("Dcache size must be greater than 0."));
|
error (_("Dcache size must be greater than 0."));
|
||||||
}
|
}
|
||||||
if (last_cache)
|
target_dcache_invalidate ();
|
||||||
dcache_invalidate (last_cache);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -680,8 +683,7 @@ set_dcache_line_size (char *args, int from_tty,
|
|||||||
dcache_line_size = DCACHE_DEFAULT_LINE_SIZE;
|
dcache_line_size = DCACHE_DEFAULT_LINE_SIZE;
|
||||||
error (_("Invalid dcache line size: %u (must be power of 2)."), d);
|
error (_("Invalid dcache line size: %u (must be power of 2)."), d);
|
||||||
}
|
}
|
||||||
if (last_cache)
|
target_dcache_invalidate ();
|
||||||
dcache_invalidate (last_cache);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
47
gdb/target.c
47
gdb/target.c
@ -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. */
|
/* Cache of memory operations, to speed up remote access. */
|
||||||
static DCACHE *target_dcache;
|
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. */
|
/* Invalidate the target dcache. */
|
||||||
|
|
||||||
void
|
void
|
||||||
target_dcache_invalidate (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. */
|
/* 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
|
&& (region->attrib.cache
|
||||||
|| (stack_cache_enabled_p && object == TARGET_OBJECT_STACK_MEMORY)))
|
|| (stack_cache_enabled_p && object == TARGET_OBJECT_STACK_MEMORY)))
|
||||||
{
|
{
|
||||||
|
DCACHE *dcache = target_dcache_get_or_init ();
|
||||||
|
|
||||||
if (readbuf != NULL)
|
if (readbuf != NULL)
|
||||||
res = dcache_xfer_memory (ops, target_dcache, memaddr, readbuf,
|
res = dcache_xfer_memory (ops, dcache, memaddr, readbuf, reg_len, 0);
|
||||||
reg_len, 0);
|
|
||||||
else
|
else
|
||||||
/* FIXME drow/2006-08-09: If we're going to preserve const
|
/* FIXME drow/2006-08-09: If we're going to preserve const
|
||||||
correctness dcache_xfer_memory should take readbuf and
|
correctness dcache_xfer_memory should take readbuf and
|
||||||
writebuf. */
|
writebuf. */
|
||||||
res = dcache_xfer_memory (ops, target_dcache, memaddr,
|
res = dcache_xfer_memory (ops, dcache, memaddr, (void *) writebuf,
|
||||||
(void *) writebuf,
|
|
||||||
reg_len, 1);
|
reg_len, 1);
|
||||||
if (res <= 0)
|
if (res <= 0)
|
||||||
return -1;
|
return -1;
|
||||||
@ -1641,7 +1671,9 @@ memory_xfer_partial_1 (struct target_ops *ops, enum target_object object,
|
|||||||
&& stack_cache_enabled_p
|
&& stack_cache_enabled_p
|
||||||
&& object != TARGET_OBJECT_STACK_MEMORY)
|
&& 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
|
/* 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."),
|
Otherwise, any attempt to interrupt or stop will be ignored."),
|
||||||
set_target_permissions, NULL,
|
set_target_permissions, NULL,
|
||||||
&setlist, &showlist);
|
&setlist, &showlist);
|
||||||
|
|
||||||
|
|
||||||
target_dcache = dcache_init ();
|
|
||||||
}
|
}
|
||||||
|
@ -37,6 +37,7 @@ struct uploaded_tp;
|
|||||||
struct static_tracepoint_marker;
|
struct static_tracepoint_marker;
|
||||||
struct traceframe_info;
|
struct traceframe_info;
|
||||||
struct expression;
|
struct expression;
|
||||||
|
struct dcache_struct;
|
||||||
|
|
||||||
/* This include file defines the interface between the main part
|
/* This include file defines the interface between the main part
|
||||||
of the debugger, and the part which is target-specific, or
|
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. */
|
/* Invalidate all target dcaches. */
|
||||||
extern void target_dcache_invalidate (void);
|
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_string (CORE_ADDR, char **, int, int *);
|
||||||
|
|
||||||
extern int target_read_memory (CORE_ADDR memaddr, gdb_byte *myaddr,
|
extern int target_read_memory (CORE_ADDR memaddr, gdb_byte *myaddr,
|
||||||
|
Reference in New Issue
Block a user