diff options
author | Yao Qi <yao@codesourcery.com> | 2014-03-11 10:47:48 +0800 |
---|---|---|
committer | Yao Qi <yao@codesourcery.com> | 2014-03-22 18:31:30 +0800 |
commit | 8acf9577e5acd99c23fe8f3fa87a961668de7805 (patch) | |
tree | 23ca50f0997a15f90038522062faa4e75ab8cc9f /gdb/tracefile-tfile.c | |
parent | 25d743f9e6f23ec5fc1529a56d7178ad9cfe5611 (diff) | |
download | gdb-8acf9577e5acd99c23fe8f3fa87a961668de7805.zip gdb-8acf9577e5acd99c23fe8f3fa87a961668de7805.tar.gz gdb-8acf9577e5acd99c23fe8f3fa87a961668de7805.tar.bz2 |
Move the traceframe_available_memory code from memory_xfer_partial_1 down to the targets
As a follow-up to
[PATCH 7/8] Adjust read_value_memory to use to_xfer_partial
https://sourceware.org/ml/gdb-patches/2014-02/msg00384.html
this patch moves traceframe_available_memory down to the target side.
After this patch, the gdb core code is cleaner, and code on handling
unavailable memory is moved to remote/tfile/ctf targets.
In details, this patch moves traceframe_available_memory code from
memory_xfer_partial_1 to remote target only, so remote target still
uses traceframe_info mechanism to check unavailable memory, and use
remote_ops to read them from read-only sections. We don't use
traceframe_info mechanism for tfile and ctf target, because it is
fast to iterate all traceframes from trace file, so the summary
information got from traceframe_info is not necessary.
This patch also moves two functions to remote.c from target.c,
because they are only used in remote.c. I'll clean them up in another
patch.
gdb:
2014-03-22 Yao Qi <yao@codesourcery.com>
* ctf.c (ctf_xfer_partial): Check the return value of
exec_read_partial_read_only, if it is not TARGET_XFER_OK,
return TARGET_XFER_UNAVAILABLE.
* tracefile-tfile.c (tfile_xfer_partial): Likewise.
* target.c (target_read_live_memory): Move it to remote.c.
(memory_xfer_live_readonly_partial): Likewise.
(memory_xfer_partial_1): Move some code to remote_read_bytes.
* remote.c (target_read_live_memory): Moved from target.c.
(memory_xfer_live_readonly_partial): Likewise.
(remote_read_bytes): New, factored out from
memory_xfer_partial_1.
Diffstat (limited to 'gdb/tracefile-tfile.c')
-rw-r--r-- | gdb/tracefile-tfile.c | 16 |
1 files changed, 15 insertions, 1 deletions
diff --git a/gdb/tracefile-tfile.c b/gdb/tracefile-tfile.c index cbf746d..a36596f 100644 --- a/gdb/tracefile-tfile.c +++ b/gdb/tracefile-tfile.c @@ -900,6 +900,7 @@ tfile_xfer_partial (struct target_ops *ops, enum target_object object, if (get_traceframe_number () != -1) { int pos = 0; + enum target_xfer_status res; /* Iterate through the traceframe's blocks, looking for memory. */ @@ -937,7 +938,20 @@ tfile_xfer_partial (struct target_ops *ops, enum target_object object, pos += (8 + 2 + mlen); } - return exec_read_partial_read_only (readbuf, offset, len, xfered_len); + /* Requested memory is unavailable in the context of traceframes, + and this address falls within a read-only section, fallback + to reading from executable. */ + res = exec_read_partial_read_only (readbuf, offset, len, xfered_len); + + if (res == TARGET_XFER_OK) + return TARGET_XFER_OK; + else + { + /* No use trying further, we know some memory starting + at MEMADDR isn't available. */ + *xfered_len = len; + return TARGET_XFER_UNAVAILABLE; + } } else { |