From 5a2eb0ef7f9b879c2bbe7b18183353e1d59c93c7 Mon Sep 17 00:00:00 2001 From: Yao Qi Date: Tue, 5 Nov 2013 09:50:21 +0800 Subject: [PATCH] Adjust read_value_memory to use to_xfer_partial As the new to_xfer_partial implementations are done in ctf and tfile targets, read_value_memory can be simplified a lot. Call target_xfer_partial in a loop, check return value, and set bytes unavailable when necessary. gdb: 2014-02-23 Yao Qi * valops.c (read_value_memory): Rewrite it. Call target_xfer_partial in a loop. * exec.h (section_table_available_memory): Remove declaration. Move comments to ... * exec.c (section_table_available_memory): ... here. Make it static. --- gdb/ChangeLog | 9 +++++ gdb/exec.c | 7 +++- gdb/exec.h | 11 ------ gdb/valops.c | 96 ++++++++++++--------------------------------------- 4 files changed, 38 insertions(+), 85 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 55745af8ae7..326909fb5a4 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,12 @@ +2014-02-23 Yao Qi + + * valops.c (read_value_memory): Rewrite it. Call + target_xfer_partial in a loop. + * exec.h (section_table_available_memory): Remove declaration. + Move comments to ... + * exec.c (section_table_available_memory): ... here. Make it + static. + 2014-02-23 Yao Qi * exec.c (section_table_read_available_memory): New function. diff --git a/gdb/exec.c b/gdb/exec.c index 607f5acc140..758e382702f 100644 --- a/gdb/exec.c +++ b/gdb/exec.c @@ -577,7 +577,12 @@ exec_read_partial_read_only (gdb_byte *readbuf, ULONGEST offset, return TARGET_XFER_E_IO; } -VEC(mem_range_s) * +/* 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 + VEC. */ + +static VEC(mem_range_s) * section_table_available_memory (VEC(mem_range_s) *memory, CORE_ADDR memaddr, ULONGEST len, struct target_section *sections, diff --git a/gdb/exec.h b/gdb/exec.h index 84dc40f4bdd..4d9de90078f 100644 --- a/gdb/exec.h +++ b/gdb/exec.h @@ -55,17 +55,6 @@ 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 - VEC. */ - -extern VEC(mem_range_s) * - section_table_available_memory (VEC(mem_range_s) *ranges, - CORE_ADDR memaddr, ULONGEST len, - struct target_section *sections, - struct target_section *sections_end); - /* Read or write from mappable sections of BFD executable files. Request to transfer up to LEN 8-bit bytes of the target sections diff --git a/gdb/valops.c b/gdb/valops.c index 898401dc13c..0d726d0deab 100644 --- a/gdb/valops.c +++ b/gdb/valops.c @@ -949,81 +949,31 @@ read_value_memory (struct value *val, int embedded_offset, int stack, CORE_ADDR memaddr, gdb_byte *buffer, size_t length) { - if (length) - { - VEC(mem_range_s) *available_memory; - - if (!traceframe_available_memory (&available_memory, memaddr, length)) - { - if (stack) - read_stack (memaddr, buffer, length); - else - read_memory (memaddr, buffer, length); - } + ULONGEST xfered = 0; + + while (xfered < length) + { + enum target_xfer_status status; + ULONGEST xfered_len; + + status = target_xfer_partial (current_target.beneath, + TARGET_OBJECT_MEMORY, NULL, + buffer + xfered, NULL, + memaddr + xfered, length - xfered, + &xfered_len); + + if (status == TARGET_XFER_OK) + /* nothing */; + else if (status == TARGET_XFER_E_UNAVAILABLE) + mark_value_bytes_unavailable (val, embedded_offset + xfered, + xfered_len); + else if (status == TARGET_XFER_EOF) + memory_error (TARGET_XFER_E_IO, memaddr + xfered); else - { - struct target_section_table *table; - struct cleanup *old_chain; - CORE_ADDR unavail; - mem_range_s *r; - int i; - - /* Fallback to reading from read-only sections. */ - table = target_get_section_table (&exec_ops); - available_memory = - section_table_available_memory (available_memory, - memaddr, length, - table->sections, - table->sections_end); - - old_chain = make_cleanup (VEC_cleanup(mem_range_s), - &available_memory); - - normalize_mem_ranges (available_memory); + memory_error (status, memaddr + xfered); - /* Mark which bytes are unavailable, and read those which - are available. */ - - unavail = memaddr; - - for (i = 0; - VEC_iterate (mem_range_s, available_memory, i, r); - i++) - { - if (mem_ranges_overlap (r->start, r->length, - memaddr, length)) - { - CORE_ADDR lo1, hi1, lo2, hi2; - CORE_ADDR start, end; - - /* Get the intersection window. */ - lo1 = memaddr; - hi1 = memaddr + length; - lo2 = r->start; - hi2 = r->start + r->length; - start = max (lo1, lo2); - end = min (hi1, hi2); - - gdb_assert (end - memaddr <= length); - - if (start > unavail) - mark_value_bytes_unavailable (val, - (embedded_offset - + unavail - memaddr), - start - unavail); - unavail = end; - - read_memory (start, buffer + start - memaddr, end - start); - } - } - - if (unavail != memaddr + length) - mark_value_bytes_unavailable (val, - embedded_offset + unavail - memaddr, - (memaddr + length) - unavail); - - do_cleanups (old_chain); - } + xfered += xfered_len; + QUIT; } } -- 2.30.2