diff options
author | Tom Tromey <tromey@adacore.com> | 2020-06-15 06:28:09 -0600 |
---|---|---|
committer | Tom Tromey <tromey@adacore.com> | 2020-06-15 06:28:09 -0600 |
commit | 670e35fad9c17e8e166c5a6260201eebcc2ba9e6 (patch) | |
tree | cb1bc7136ff9bea87b01fe85aa20238f5296cddc /gdb/target.c | |
parent | f5272a3bb3928e8e45a122c19aa72a00a23a9d4d (diff) | |
download | binutils-670e35fad9c17e8e166c5a6260201eebcc2ba9e6.zip binutils-670e35fad9c17e8e166c5a6260201eebcc2ba9e6.tar.gz binutils-670e35fad9c17e8e166c5a6260201eebcc2ba9e6.tar.bz2 |
Rewrite target_read_string
This rewrites target_read_string in terms of read_string.
gdb/ChangeLog
2020-06-15 Tom Tromey <tromey@adacore.com>
* valprint.c (read_string): Update comment.
* target.c (MIN): Remove.
(target_read_string): Rewrite.
Diffstat (limited to 'gdb/target.c')
-rw-r--r-- | gdb/target.c | 72 |
1 files changed, 10 insertions, 62 deletions
diff --git a/gdb/target.c b/gdb/target.c index 82c405a8..897b8fd 100644 --- a/gdb/target.c +++ b/gdb/target.c @@ -50,6 +50,7 @@ #include "terminal.h" #include <unordered_map> #include "target-connection.h" +#include "valprint.h" static void generic_tls_error (void) ATTRIBUTE_NORETURN; @@ -803,9 +804,6 @@ target_xfer_status_to_string (enum target_xfer_status status) }; -#undef MIN -#define MIN(A, B) (((A) <= (B)) ? (A) : (B)) - /* target_read_string -- read a null terminated string, up to LEN bytes, from MEMADDR in target. Set *ERRNOP to the errno code, or 0 if successful. Set *STRING to a pointer to malloc'd memory containing the data; the caller @@ -816,68 +814,18 @@ int target_read_string (CORE_ADDR memaddr, gdb::unique_xmalloc_ptr<char> *string, int len, int *errnop) { - int tlen, offset, i; - gdb_byte buf[4]; - int errcode = 0; - char *buffer; - int buffer_allocated; - char *bufptr; - unsigned int nbytes_read = 0; - - gdb_assert (string); - - /* Small for testing. */ - buffer_allocated = 4; - buffer = (char *) xmalloc (buffer_allocated); - bufptr = buffer; - - while (len > 0) - { - tlen = MIN (len, 4 - (memaddr & 3)); - offset = memaddr & 3; + int bytes_read; + gdb::unique_xmalloc_ptr<gdb_byte> buffer; - errcode = target_read_memory (memaddr & ~3, buf, sizeof buf); - if (errcode != 0) - { - /* The transfer request might have crossed the boundary to an - unallocated region of memory. Retry the transfer, requesting - a single byte. */ - tlen = 1; - offset = 0; - errcode = target_read_memory (memaddr, buf, 1); - if (errcode != 0) - goto done; - } - - if (bufptr - buffer + tlen > buffer_allocated) - { - unsigned int bytes; + /* Note that the endian-ness does not matter here. */ + int errcode = read_string (memaddr, -1, 1, len, BFD_ENDIAN_LITTLE, + &buffer, &bytes_read); - bytes = bufptr - buffer; - buffer_allocated *= 2; - buffer = (char *) xrealloc (buffer, buffer_allocated); - bufptr = buffer + bytes; - } - - for (i = 0; i < tlen; i++) - { - *bufptr++ = buf[i + offset]; - if (buf[i + offset] == '\000') - { - nbytes_read += i + 1; - goto done; - } - } - - memaddr += tlen; - len -= tlen; - nbytes_read += tlen; - } -done: - string->reset (buffer); - if (errnop != NULL) + if (errnop != nullptr) *errnop = errcode; - return nbytes_read; + + string->reset ((char *) buffer.release ()); + return bytes_read; } struct target_section_table * |