Share code on to_xfer_partial for tfile and ctf target

In the to_xfer_partial implementations of ctf and tfile, the code on
reading from read-only sections is duplicated.  This patch moves it to
a separate function exec_read_partial_read_only.

gdb:

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.
This commit is contained in:
Yao Qi 2014-02-10 17:17:32 +08:00
parent a283690eb7
commit 1ca49d376d
6 changed files with 67 additions and 76 deletions

View File

@ -1,3 +1,11 @@
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.

View File

@ -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

View File

@ -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,

View File

@ -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

View File

@ -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'

View File

@ -20,6 +20,7 @@
#include "defs.h"
#include "tracefile.h"
#include "ctf.h"
#include "exec.h"
/* Helper macros. */