This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
Re: [PATCH 07/10] Associate target_dcache to address_space.
- From: Yao Qi <yao at codesourcery dot com>
- To: Doug Evans <dje at google dot com>
- Cc: gdb-patches <gdb-patches at sourceware dot org>
- Date: Wed, 20 Nov 2013 12:44:48 +0800
- Subject: Re: [PATCH 07/10] Associate target_dcache to address_space.
- Authentication-results: sourceware.org; auth=none
- References: <1383458049-20893-1-git-send-email-yao at codesourcery dot com> <1383458049-20893-8-git-send-email-yao at codesourcery dot com> <CADPb22Sgp_3WsUcXS5gEujtAarPa6GW+RsPode-+PTchZibDdw at mail dot gmail dot com>
On 11/18/2013 05:09 AM, Doug Evans wrote:
> Ok.
>
> [I realize I've asked for changes that will affect this patch, but
> beyond that it's ok.]
Update the patch, and fix the doc pointed out by Eli.
Patch below is pushed.
--
Yao (éå)
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.
---
gdb/ChangeLog | 15 +++++++++++++++
gdb/doc/ChangeLog | 5 +++++
gdb/doc/gdb.texinfo | 12 +++++++-----
gdb/progspace.h | 1 +
gdb/target-dcache.c | 46 +++++++++++++++++++++++++++++++++++++---------
5 files changed, 65 insertions(+), 14 deletions(-)
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index e8df902..dadea24 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,5 +1,20 @@
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.
<REGISTRY_FIELDS>: New fields.
DEFINE_REGISTRY for address_space.
diff --git a/gdb/doc/ChangeLog b/gdb/doc/ChangeLog
index 9b641e6..207b845 100644
--- a/gdb/doc/ChangeLog
+++ b/gdb/doc/ChangeLog
@@ -1,5 +1,10 @@
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.
(Caching Remote Data): Rename to ...
(Caching Target Data): ... it. Update.
diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo
index acad48d..d1fa6c8 100644
--- a/gdb/doc/gdb.texinfo
+++ b/gdb/doc/gdb.texinfo
@@ -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.
diff --git a/gdb/progspace.h b/gdb/progspace.h
index 04ac374..e2786ec 100644
--- a/gdb/progspace.h
+++ b/gdb/progspace.h
@@ -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);
diff --git a/gdb/target-dcache.c b/gdb/target-dcache.c
index bf04679..eb7d478 100644
--- a/gdb/target-dcache.c
+++ b/gdb/target-dcache.c
@@ -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);
}
--
1.7.7.6