forked from Imagelibrary/binutils-gdb
Use new to_xfer_partial interface in ctf and tfile target
This patch adjust both ctf and tfile target implementation of to_xfer_partial, to return TARGET_XFER_E_UNAVAILABLE and set *XFERED_LEN if data is unavailable. Note that some code on xfer in exec.c can be shared, but we can do it in a separate pass later. gdb: 2014-02-23 Yao Qi <yao@codesourcery.com> * exec.c (section_table_read_available_memory): New function. * exec.h (section_table_read_available_memory): Declare. * ctf.c (ctf_xfer_partial): Call section_table_read_available_memory. * tracefile-tfile.c (tfile_xfer_partial): Likewise.
This commit is contained in:
@@ -1,3 +1,11 @@
|
|||||||
|
2014-02-23 Yao Qi <yao@codesourcery.com>
|
||||||
|
|
||||||
|
* exec.c (section_table_read_available_memory): New function.
|
||||||
|
* exec.h (section_table_read_available_memory): Declare.
|
||||||
|
* ctf.c (ctf_xfer_partial): Call
|
||||||
|
section_table_read_available_memory.
|
||||||
|
* tracefile-tfile.c (tfile_xfer_partial): Likewise.
|
||||||
|
|
||||||
2014-02-23 Yao Qi <yao@codesourcery.com>
|
2014-02-23 Yao Qi <yao@codesourcery.com>
|
||||||
|
|
||||||
* ctf.c (ctf_xfer_partial): Move code to ...
|
* ctf.c (ctf_xfer_partial): Move code to ...
|
||||||
|
|||||||
@@ -1465,9 +1465,14 @@ ctf_xfer_partial (struct target_ops *ops, enum target_object object,
|
|||||||
|
|
||||||
/* Restore the position. */
|
/* Restore the position. */
|
||||||
bt_iter_set_pos (bt_ctf_get_iter (ctf_iter), pos);
|
bt_iter_set_pos (bt_ctf_get_iter (ctf_iter), pos);
|
||||||
}
|
|
||||||
|
|
||||||
return exec_read_partial_read_only (readbuf, offset, len, xfered_len);
|
return exec_read_partial_read_only (readbuf, offset, len, xfered_len);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Fallback to reading from read-only sections. */
|
||||||
|
return section_table_read_available_memory (readbuf, offset, len, xfered_len);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* This is the implementation of target_ops method
|
/* This is the implementation of target_ops method
|
||||||
|
|||||||
54
gdb/exec.c
54
gdb/exec.c
@@ -614,6 +614,60 @@ section_table_available_memory (VEC(mem_range_s) *memory,
|
|||||||
return memory;
|
return memory;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
enum target_xfer_status
|
||||||
|
section_table_read_available_memory (gdb_byte *readbuf, ULONGEST offset,
|
||||||
|
ULONGEST len, ULONGEST *xfered_len)
|
||||||
|
{
|
||||||
|
VEC(mem_range_s) *available_memory = NULL;
|
||||||
|
struct target_section_table *table;
|
||||||
|
struct cleanup *old_chain;
|
||||||
|
mem_range_s *r;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
table = target_get_section_table (&exec_ops);
|
||||||
|
available_memory = section_table_available_memory (available_memory,
|
||||||
|
offset, len,
|
||||||
|
table->sections,
|
||||||
|
table->sections_end);
|
||||||
|
|
||||||
|
old_chain = make_cleanup (VEC_cleanup(mem_range_s),
|
||||||
|
&available_memory);
|
||||||
|
|
||||||
|
normalize_mem_ranges (available_memory);
|
||||||
|
|
||||||
|
for (i = 0;
|
||||||
|
VEC_iterate (mem_range_s, available_memory, i, r);
|
||||||
|
i++)
|
||||||
|
{
|
||||||
|
if (mem_ranges_overlap (r->start, r->length, offset, len))
|
||||||
|
{
|
||||||
|
CORE_ADDR end;
|
||||||
|
enum target_xfer_status status;
|
||||||
|
|
||||||
|
/* Get the intersection window. */
|
||||||
|
end = min (offset + len, r->start + r->length);
|
||||||
|
|
||||||
|
gdb_assert (end - offset <= len);
|
||||||
|
|
||||||
|
if (offset >= r->start)
|
||||||
|
status = exec_read_partial_read_only (readbuf, offset,
|
||||||
|
end - offset,
|
||||||
|
xfered_len);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
*xfered_len = r->start - offset;
|
||||||
|
status = TARGET_XFER_E_UNAVAILABLE;
|
||||||
|
}
|
||||||
|
do_cleanups (old_chain);
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
do_cleanups (old_chain);
|
||||||
|
|
||||||
|
*xfered_len = len;
|
||||||
|
return TARGET_XFER_E_UNAVAILABLE;
|
||||||
|
}
|
||||||
|
|
||||||
enum target_xfer_status
|
enum target_xfer_status
|
||||||
section_table_xfer_memory_partial (gdb_byte *readbuf, const gdb_byte *writebuf,
|
section_table_xfer_memory_partial (gdb_byte *readbuf, const gdb_byte *writebuf,
|
||||||
ULONGEST offset, ULONGEST len,
|
ULONGEST offset, ULONGEST len,
|
||||||
|
|||||||
@@ -91,6 +91,14 @@ extern enum target_xfer_status
|
|||||||
struct target_section *,
|
struct target_section *,
|
||||||
const char *);
|
const char *);
|
||||||
|
|
||||||
|
/* Read from mappable read-only sections of BFD executable files.
|
||||||
|
Similar to exec_read_partial_read_only, but return
|
||||||
|
TARGET_XFER_E_UNAVAILABLE if data is unavailable. */
|
||||||
|
|
||||||
|
extern enum target_xfer_status
|
||||||
|
section_table_read_available_memory (gdb_byte *readbuf, ULONGEST offset,
|
||||||
|
ULONGEST len, ULONGEST *xfered_len);
|
||||||
|
|
||||||
/* Set the loaded address of a section. */
|
/* Set the loaded address of a section. */
|
||||||
extern void exec_set_section_address (const char *, int, CORE_ADDR);
|
extern void exec_set_section_address (const char *, int, CORE_ADDR);
|
||||||
|
|
||||||
|
|||||||
@@ -936,9 +936,15 @@ tfile_xfer_partial (struct target_ops *ops, enum target_object object,
|
|||||||
/* Skip over this block. */
|
/* Skip over this block. */
|
||||||
pos += (8 + 2 + mlen);
|
pos += (8 + 2 + mlen);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
return exec_read_partial_read_only (readbuf, offset, len, xfered_len);
|
return exec_read_partial_read_only (readbuf, offset, len, xfered_len);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Fallback to reading from read-only sections. */
|
||||||
|
return section_table_read_available_memory (readbuf, offset, len,
|
||||||
|
xfered_len);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Iterate through the blocks of a trace frame, looking for a 'V'
|
/* Iterate through the blocks of a trace frame, looking for a 'V'
|
||||||
|
|||||||
Reference in New Issue
Block a user