diff options
-rw-r--r-- | gdb/ChangeLog | 15 | ||||
-rw-r--r-- | gdb/doc/ChangeLog | 5 | ||||
-rw-r--r-- | gdb/doc/gdb.texinfo | 12 | ||||
-rw-r--r-- | gdb/progspace.h | 1 | ||||
-rw-r--r-- | 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 7ec16dd..d854f46 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); } |