forked from Imagelibrary/binutils-gdb
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:
@@ -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>
|
2014-02-23 Yao Qi <yao@codesourcery.com>
|
||||||
|
|
||||||
* tracefile-tfile.c (tfile_has_all_memory): Remove.
|
* tracefile-tfile.c (tfile_has_all_memory): Remove.
|
||||||
|
|||||||
42
gdb/ctf.c
42
gdb/ctf.c
@@ -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);
|
bt_iter_set_pos (bt_ctf_get_iter (ctf_iter), pos);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* It's unduly pedantic to refuse to look at the executable for
|
return exec_read_partial_read_only (readbuf, offset, len, xfered_len);
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* This is the implementation of target_ops method
|
/* This is the implementation of target_ops method
|
||||||
|
|||||||
47
gdb/exec.c
47
gdb/exec.c
@@ -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) *
|
VEC(mem_range_s) *
|
||||||
section_table_available_memory (VEC(mem_range_s) *memory,
|
section_table_available_memory (VEC(mem_range_s) *memory,
|
||||||
CORE_ADDR memaddr, ULONGEST len,
|
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);
|
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
|
/* Appends all read-only memory ranges found in the target section
|
||||||
table defined by SECTIONS and SECTIONS_END, starting at (and
|
table defined by SECTIONS and SECTIONS_END, starting at (and
|
||||||
intersected with) MEMADDR for LEN bytes. Returns the augmented
|
intersected with) MEMADDR for LEN bytes. Returns the augmented
|
||||||
|
|||||||
@@ -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
|
return exec_read_partial_read_only (readbuf, offset, len, xfered_len);
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Iterate through the blocks of a trace frame, looking for a 'V'
|
/* Iterate through the blocks of a trace frame, looking for a 'V'
|
||||||
|
|||||||
@@ -20,6 +20,7 @@
|
|||||||
#include "defs.h"
|
#include "defs.h"
|
||||||
#include "tracefile.h"
|
#include "tracefile.h"
|
||||||
#include "ctf.h"
|
#include "ctf.h"
|
||||||
|
#include "exec.h"
|
||||||
|
|
||||||
/* Helper macros. */
|
/* Helper macros. */
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user