Associate target_dcache to address_space.

Hi,
Nowadays, 'target_dcache' is a global variable in GDB, which is not
necessary.  It can be a per-address-space variable.  In this patch, we
associate target_dcache to address_space.

gdb/doc:

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

	* gdb.texinfo (Caching Target Data): Update doc for
	per-address-space dcache.

gdb:

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

	* progspace.h (struct address_space_data): Declare.
	* target-dcache.c: Include "progspace.h".
	(target_dache): Remove.
	(target_dcache_aspace_key): New.
	(target_dcache_cleanup): New function.
	(target_dcache_init_p): Get data through
	target_dcache_aspace_key.
	(target_dcache_invalidate): Likewise.
	(target_dcache_get): Likewise.
	(target_dcache_get_or_init): Likewise.
	(_initialize_target_dcache): Initialize
	target_dcache_aspace_key.
This commit is contained in:
Yao Qi
2013-10-31 22:18:10 +08:00
parent 3a8356ffac
commit b26dfc9ab3
5 changed files with 65 additions and 14 deletions

View File

@@ -1,3 +1,18 @@
2013-11-20 Yao Qi <yao@codesourcery.com>
* progspace.h (struct address_space_data): Declare.
* target-dcache.c: Include "progspace.h".
(target_dache): Remove.
(target_dcache_aspace_key): New.
(target_dcache_cleanup): New function.
(target_dcache_init_p): Get data through
target_dcache_aspace_key.
(target_dcache_invalidate): Likewise.
(target_dcache_get): Likewise.
(target_dcache_get_or_init): Likewise.
(_initialize_target_dcache): Initialize
target_dcache_aspace_key.
2013-11-20 Yao Qi <yao@codesourcery.com>
* progspace.c (struct address_space): Update comments.

View File

@@ -1,3 +1,8 @@
2013-11-20 Yao Qi <yao@codesourcery.com>
* gdb.texinfo (Caching Target Data): Update doc for
per-address-space dcache.
2013-11-20 Yao Qi <yao@codesourcery.com>
* gdb.texinfo (Data): Rename menu item.

View File

@@ -10828,6 +10828,8 @@ character.
@cindex caching data of targets
@value{GDBN} caches data exchanged between the debugger and a target.
Each cache is associated with the address space of the inferior.
@xref{Inferiors and Programs}, about inferior and address space.
Such caching generally improves performance in remote debugging
(@pxref{Remote Debugging}), because it reduces the overhead of the
remote protocol by bundling memory reads and writes into large chunks.
@@ -10867,11 +10869,11 @@ Show the current state of data caching for memory accesses.
@kindex info dcache
@item info dcache @r{[}line@r{]}
Print the information about the data cache performance. The
information displayed includes the dcache width and depth, and for
each cache line, its number, address, and how many times it was
referenced. This command is useful for debugging the data cache
operation.
Print the information about the performance of data cache of the
current inferior's address space. The information displayed
includes the dcache width and depth, and for each cache line, its
number, address, and how many times it was referenced. This
command is useful for debugging the data cache operation.
If a line number is specified, the contents of that line will be
printed in hex.

View File

@@ -33,6 +33,7 @@ struct inferior;
struct exec;
struct address_space;
struct program_space_data;
struct address_space_data;
typedef struct so_list *so_list_ptr;
DEF_VEC_P (so_list_ptr);

View File

@@ -18,16 +18,31 @@
#include "defs.h"
#include "target-dcache.h"
#include "gdbcmd.h"
#include "progspace.h"
/* Cache of memory operations, to speed up remote access. */
static DCACHE *target_dcache;
/* The target dcache is kept per-address-space. This key lets us
associate the cache with the address space. */
static const struct address_space_data *target_dcache_aspace_key;
/* Clean up dcache, represented by ARG, which is associated with
ASPACE. */
static void
target_dcache_cleanup (struct address_space *aspace, void *arg)
{
dcache_free (arg);
}
/* Target dcache is initialized or not. */
int
target_dcache_init_p (void)
{
return (target_dcache != NULL);
DCACHE *dcache = address_space_data (current_program_space->aspace,
target_dcache_aspace_key);
return (dcache != NULL);
}
/* Invalidate the target dcache. */
@@ -35,8 +50,11 @@ target_dcache_init_p (void)
void
target_dcache_invalidate (void)
{
if (target_dcache_init_p ())
dcache_invalidate (target_dcache);
DCACHE *dcache = address_space_data (current_program_space->aspace,
target_dcache_aspace_key);
if (dcache != NULL)
dcache_invalidate (dcache);
}
/* Return the target dcache. Return NULL if target dcache is not
@@ -45,7 +63,10 @@ target_dcache_invalidate (void)
DCACHE *
target_dcache_get (void)
{
return target_dcache;
DCACHE *dcache = address_space_data (current_program_space->aspace,
target_dcache_aspace_key);
return dcache;
}
/* Return the target dcache. If it is not initialized yet, initialize
@@ -54,10 +75,13 @@ target_dcache_get (void)
DCACHE *
target_dcache_get_or_init (void)
{
if (!target_dcache_init_p ())
target_dcache = dcache_init ();
DCACHE *dcache = address_space_data (current_program_space->aspace,
target_dcache_aspace_key);
return target_dcache;
if (dcache == NULL)
dcache = dcache_init ();
return dcache;
}
/* The option sets this. */
@@ -113,4 +137,8 @@ By default, caching for stack access is on."),
set_stack_cache_enabled_p,
show_stack_cache_enabled_p,
&setlist, &showlist);
target_dcache_aspace_key
= register_address_space_data_with_cleanup (NULL,
target_dcache_cleanup);
}