diff options
author | Yao Qi <yao@codesourcery.com> | 2013-11-01 12:26:10 +0800 |
---|---|---|
committer | Yao Qi <yao@codesourcery.com> | 2013-11-24 14:56:49 +0800 |
commit | 29453a14557af65ed7a0867722b0145bb9f0e0c2 (patch) | |
tree | b73a98586473bb5a36387711bcf71778b27bab20 /gdb/target.c | |
parent | 0fb14d8ffde0940e0b55d529c50a5d424b763b13 (diff) | |
download | gdb-29453a14557af65ed7a0867722b0145bb9f0e0c2.zip gdb-29453a14557af65ed7a0867722b0145bb9f0e0c2.tar.gz gdb-29453a14557af65ed7a0867722b0145bb9f0e0c2.tar.bz2 |
set/show code-cache
Similar to stack cache, in this patch, we add
TARGET_OBJECT_CODE_MEMORY to read code from target and add a new
option "set code-cache on|off" to optimize code accesses by
using the target memory cache.
In V4:
- Remove "without affecting correctness" from NEWS and doc.
- Replace "ON" with "on" in doc.
- "access" -> "accesses".
In V3:
- Rename functions and variables.
- Update command help, doc and NEWS entry.
- Invalidate cache on option transitions, to align with
the behaviour of "stack-cache". Since cache invalidation is
transparent to users, users don't know option "stack-cache"
transitions cause code cache invalidation.
V2 was reviewed by Doug. There are some changes in V3, so I post it
here.
gdb:
2013-11-24 Yao Qi <yao@codesourcery.com>
* NEWS: Add note on new "set code-cache" option.
* target-dcache.c (code_cache_enabled_1): New variable.
(code_cache_enabled): New variable.
(show_code_cache, set_code_cache): New function.
(code_cache_enabled_p): New function.
(_initialize_target_dcache): Register command.
* target-dcache.h (code_cache_enabled_p): Declare.
* target.c (memory_xfer_partial_1):Handle
TARGET_OBJECT_CODE_MEMORY and code_cache_enabled.
(target_read_code): New function.
* target.h (enum target_object) <TARGET_OBJECT_CODE_MEMORY>:
New.
(target_read_code): Declare.
gdb/doc:
2013-11-24 Yao Qi <yao@codesourcery.com>
* gdb.texinfo (Caching Remote Data): Document new
"set/show stack-cache" option.
Diffstat (limited to 'gdb/target.c')
-rw-r--r-- | gdb/target.c | 23 |
1 files changed, 19 insertions, 4 deletions
diff --git a/gdb/target.c b/gdb/target.c index f402a18..cc6194b 100644 --- a/gdb/target.c +++ b/gdb/target.c @@ -1547,7 +1547,8 @@ memory_xfer_partial_1 (struct target_ops *ops, enum target_object object, the collected memory range fails. */ && get_traceframe_number () == -1 && (region->attrib.cache - || (stack_cache_enabled_p () && object == TARGET_OBJECT_STACK_MEMORY))) + || (stack_cache_enabled_p () && object == TARGET_OBJECT_STACK_MEMORY) + || (code_cache_enabled_p () && object == TARGET_OBJECT_CODE_MEMORY))) { DCACHE *dcache = target_dcache_get_or_init (); @@ -1600,8 +1601,8 @@ memory_xfer_partial_1 (struct target_ops *ops, enum target_object object, && writebuf != NULL && target_dcache_init_p () && !region->attrib.cache - && stack_cache_enabled_p () - && object != TARGET_OBJECT_STACK_MEMORY) + && ((stack_cache_enabled_p () && object != TARGET_OBJECT_STACK_MEMORY) + || (code_cache_enabled_p () && object != TARGET_OBJECT_CODE_MEMORY))) { DCACHE *dcache = target_dcache_get (); @@ -1697,7 +1698,8 @@ target_xfer_partial (struct target_ops *ops, /* If this is a memory transfer, let the memory-specific code have a look at it instead. Memory transfers are more complicated. */ - if (object == TARGET_OBJECT_MEMORY || object == TARGET_OBJECT_STACK_MEMORY) + if (object == TARGET_OBJECT_MEMORY || object == TARGET_OBJECT_STACK_MEMORY + || object == TARGET_OBJECT_CODE_MEMORY) retval = memory_xfer_partial (ops, object, readbuf, writebuf, offset, len); else @@ -1799,6 +1801,19 @@ target_read_stack (CORE_ADDR memaddr, gdb_byte *myaddr, ssize_t len) return TARGET_XFER_E_IO; } +/* Like target_read_memory, but specify explicitly that this is a read from + the target's code. This may trigger different cache behavior. */ + +int +target_read_code (CORE_ADDR memaddr, gdb_byte *myaddr, ssize_t len) +{ + if (target_read (current_target.beneath, TARGET_OBJECT_CODE_MEMORY, NULL, + myaddr, memaddr, len) == len) + return 0; + else + return TARGET_XFER_E_IO; +} + /* Write LEN bytes from MYADDR to target memory at address MEMADDR. Returns either 0 for success or a target_xfer_error value if any error occurs. If an error occurs, no guarantee is made about how |