diff options
-rw-r--r-- | gdb/ChangeLog | 8 | ||||
-rw-r--r-- | gdb/ctf.c | 42 | ||||
-rw-r--r-- | gdb/exec.c | 47 | ||||
-rw-r--r-- | gdb/exec.h | 9 | ||||
-rw-r--r-- | gdb/tracefile-tfile.c | 36 | ||||
-rw-r--r-- | gdb/tracefile.c | 1 |
6 files changed, 67 insertions, 76 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index d7c3310..11b70b8 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,5 +1,13 @@ 2014-02-23 Yao Qi <yao@codesourcery.com> + * ctf.c (ctf_xfer_partial): Move code to ... + * exec.c (exec_read_partial_read_only): ... it. New function. + * tracefile-tfile.c (tfile_xfer_partial): Likewise. + * tracefile.c: Include "exec.h". + * exec.h (exec_read_partial_read_only): Declare. + +2014-02-23 Yao Qi <yao@codesourcery.com> + * tracefile-tfile.c (tfile_has_all_memory): Remove. (tfile_has_memory): Remove. (init_tfile_ops): Don't set fields to_has_all_memory and @@ -1467,47 +1467,7 @@ ctf_xfer_partial (struct target_ops *ops, enum target_object object, bt_iter_set_pos (bt_ctf_get_iter (ctf_iter), pos); } - /* It's unduly pedantic to refuse to look at the executable for - read-only pieces; so do the equivalent of readonly regions aka - QTro packet. */ - if (exec_bfd != NULL) - { - asection *s; - bfd_size_type size; - bfd_vma vma; - - for (s = exec_bfd->sections; s; s = s->next) - { - if ((s->flags & SEC_LOAD) == 0 - || (s->flags & SEC_READONLY) == 0) - continue; - - vma = s->vma; - size = bfd_get_section_size (s); - if (vma <= offset && offset < (vma + size)) - { - ULONGEST amt; - - amt = (vma + size) - offset; - if (amt > len) - amt = len; - - amt = bfd_get_section_contents (exec_bfd, s, - readbuf, offset - vma, amt); - - if (amt == 0) - return TARGET_XFER_EOF; - else - { - *xfered_len = amt; - return TARGET_XFER_OK; - } - } - } - } - - /* Indicate failure to find the requested memory block. */ - return TARGET_XFER_E_IO; + return exec_read_partial_read_only (readbuf, offset, len, xfered_len); } /* This is the implementation of target_ops method @@ -530,6 +530,53 @@ remove_target_sections (void *owner) +enum target_xfer_status +exec_read_partial_read_only (gdb_byte *readbuf, ULONGEST offset, + ULONGEST len, ULONGEST *xfered_len) +{ + /* It's unduly pedantic to refuse to look at the executable for + read-only pieces; so do the equivalent of readonly regions aka + QTro packet. */ + if (exec_bfd != NULL) + { + asection *s; + bfd_size_type size; + bfd_vma vma; + + for (s = exec_bfd->sections; s; s = s->next) + { + if ((s->flags & SEC_LOAD) == 0 + || (s->flags & SEC_READONLY) == 0) + continue; + + vma = s->vma; + size = bfd_get_section_size (s); + if (vma <= offset && offset < (vma + size)) + { + ULONGEST amt; + + amt = (vma + size) - offset; + if (amt > len) + amt = len; + + amt = bfd_get_section_contents (exec_bfd, s, + readbuf, offset - vma, amt); + + if (amt == 0) + return TARGET_XFER_EOF; + else + { + *xfered_len = amt; + return TARGET_XFER_OK; + } + } + } + } + + /* Indicate failure to find the requested memory block. */ + return TARGET_XFER_E_IO; +} + VEC(mem_range_s) * section_table_available_memory (VEC(mem_range_s) *memory, CORE_ADDR memaddr, ULONGEST len, @@ -46,6 +46,15 @@ extern int build_section_table (struct bfd *, struct target_section **, extern int resize_section_table (struct target_section_table *, int); +/* Read from mappable read-only sections of BFD executable files. + Return TARGET_XFER_OK, if read is successful. Return + TARGET_XFER_EOF if read is done. Return TARGET_XFER_E_IO + otherwise. */ + +extern enum target_xfer_status + exec_read_partial_read_only (gdb_byte *readbuf, ULONGEST offset, + ULONGEST len, ULONGEST *xfered_len); + /* Appends all read-only memory ranges found in the target section table defined by SECTIONS and SECTIONS_END, starting at (and intersected with) MEMADDR for LEN bytes. Returns the augmented diff --git a/gdb/tracefile-tfile.c b/gdb/tracefile-tfile.c index 3ef109e..02122eb 100644 --- a/gdb/tracefile-tfile.c +++ b/gdb/tracefile-tfile.c @@ -938,41 +938,7 @@ tfile_xfer_partial (struct target_ops *ops, enum target_object object, } } - /* It's unduly pedantic to refuse to look at the executable for - read-only pieces; so do the equivalent of readonly regions aka - QTro packet. */ - /* FIXME account for relocation at some point. */ - if (exec_bfd) - { - asection *s; - bfd_size_type size; - bfd_vma vma; - - for (s = exec_bfd->sections; s; s = s->next) - { - if ((s->flags & SEC_LOAD) == 0 - || (s->flags & SEC_READONLY) == 0) - continue; - - vma = s->vma; - size = bfd_get_section_size (s); - if (vma <= offset && offset < (vma + size)) - { - ULONGEST amt; - - amt = (vma + size) - offset; - if (amt > len) - amt = len; - - *xfered_len = bfd_get_section_contents (exec_bfd, s, - readbuf, offset - vma, amt); - return TARGET_XFER_OK; - } - } - } - - /* Indicate failure to find the requested memory block. */ - return TARGET_XFER_E_IO; + return exec_read_partial_read_only (readbuf, offset, len, xfered_len); } /* Iterate through the blocks of a trace frame, looking for a 'V' diff --git a/gdb/tracefile.c b/gdb/tracefile.c index 508f898..a7c3cf7 100644 --- a/gdb/tracefile.c +++ b/gdb/tracefile.c @@ -20,6 +20,7 @@ #include "defs.h" #include "tracefile.h" #include "ctf.h" +#include "exec.h" /* Helper macros. */ |