diff options
author | Yao Qi <yao@codesourcery.com> | 2013-10-29 21:34:20 +0800 |
---|---|---|
committer | Yao Qi <yao@codesourcery.com> | 2013-11-20 11:40:43 +0800 |
commit | 2a2f9fe4007a0135ac091878dc7000f91e75e339 (patch) | |
tree | 9ea6cec1fab0a4a2c3ef5f78af7ad693589abf39 | |
parent | 3e9ecad3e843a588fa610c2419f7d3117014a927 (diff) | |
download | gdb-2a2f9fe4007a0135ac091878dc7000f91e75e339.zip gdb-2a2f9fe4007a0135ac091878dc7000f91e75e339.tar.gz gdb-2a2f9fe4007a0135ac091878dc7000f91e75e339.tar.bz2 |
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.
-rw-r--r-- | gdb/ChangeLog | 20 | ||||
-rw-r--r-- | gdb/dcache.c | 48 | ||||
-rw-r--r-- | gdb/target.c | 47 | ||||
-rw-r--r-- | gdb/target.h | 3 |
4 files changed, 86 insertions, 32 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index e296241..9de86a3 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -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> * varobj.c (varobj_get_type): Fix typo. diff --git a/gdb/dcache.c b/gdb/dcache.c index bacd629..dd66711 100644 --- a/gdb/dcache.c +++ b/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); } -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,13 +648,19 @@ 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 diff --git a/gdb/target.c b/gdb/target.c index 52d1081..cb75853 100644 --- a/gdb/target.c +++ b/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. */ 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. */ 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. */ @@ -1588,15 +1618,15 @@ memory_xfer_partial_1 (struct target_ops *ops, enum target_object object, && (region->attrib.cache || (stack_cache_enabled_p && object == TARGET_OBJECT_STACK_MEMORY))) { + DCACHE *dcache = target_dcache_get_or_init (); + if (readbuf != NULL) - res = dcache_xfer_memory (ops, target_dcache, memaddr, readbuf, - reg_len, 0); + res = dcache_xfer_memory (ops, dcache, memaddr, readbuf, reg_len, 0); else /* FIXME drow/2006-08-09: If we're going to preserve const correctness dcache_xfer_memory should take readbuf and writebuf. */ - res = dcache_xfer_memory (ops, target_dcache, memaddr, - (void *) writebuf, + res = dcache_xfer_memory (ops, dcache, memaddr, (void *) writebuf, reg_len, 1); if (res <= 0) return -1; @@ -1641,7 +1671,9 @@ memory_xfer_partial_1 (struct target_ops *ops, enum target_object object, && stack_cache_enabled_p && 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 @@ -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."), set_target_permissions, NULL, &setlist, &showlist); - - - target_dcache = dcache_init (); } diff --git a/gdb/target.h b/gdb/target.h index df17be5..87366e6 100644 --- a/gdb/target.h +++ b/gdb/target.h @@ -37,6 +37,7 @@ struct uploaded_tp; struct static_tracepoint_marker; struct traceframe_info; struct expression; +struct dcache_struct; /* This include file defines the interface between the main part 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. */ 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_memory (CORE_ADDR memaddr, gdb_byte *myaddr, |