From 2a2f9fe4007a0135ac091878dc7000f91e75e339 Mon Sep 17 00:00:00 2001 From: Yao Qi Date: Tue, 29 Oct 2013 21:34:20 +0800 Subject: [PATCH] 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 * 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. --- gdb/ChangeLog | 20 ++++++++++++++++++++ gdb/dcache.c | 48 +++++++++++++++++++++++++----------------------- gdb/target.c | 47 ++++++++++++++++++++++++++++++++++++++--------- gdb/target.h | 3 +++ 4 files changed, 86 insertions(+), 32 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index e296241194..9de86a3e26 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,23 @@ +2013-11-20 Yao Qi + + * 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 * varobj.c (varobj_get_type): Fix typo. diff --git a/gdb/dcache.c b/gdb/dcache.c index bacd629ec0..dd6671149a 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,12 +648,18 @@ 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 52d1081548..cb758536ce 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 df17be5cb6..87366e6fa1 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, -- 2.34.1