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.
This commit is contained in:
parent
f5272a3bb3
commit
670e35fad9
3 changed files with 17 additions and 69 deletions
|
@ -1,3 +1,9 @@
|
|||
2020-06-15 Tom Tromey <tromey@adacore.com>
|
||||
|
||||
* valprint.c (read_string): Update comment.
|
||||
* target.c (MIN): Remove.
|
||||
(target_read_string): Rewrite.
|
||||
|
||||
2020-06-15 Tom Tromey <tromey@adacore.com>
|
||||
|
||||
* corefile.c (read_memory_string): Remove.
|
||||
|
|
72
gdb/target.c
72
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;
|
||||
int bytes_read;
|
||||
gdb::unique_xmalloc_ptr<gdb_byte> buffer;
|
||||
|
||||
gdb_assert (string);
|
||||
/* Note that the endian-ness does not matter here. */
|
||||
int errcode = read_string (memaddr, -1, 1, len, BFD_ENDIAN_LITTLE,
|
||||
&buffer, &bytes_read);
|
||||
|
||||
/* 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;
|
||||
|
||||
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;
|
||||
|
||||
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 *
|
||||
|
|
|
@ -2027,13 +2027,7 @@ partial_memory_read (CORE_ADDR memaddr, gdb_byte *myaddr,
|
|||
|
||||
Unless an exception is thrown, BUFFER will always be allocated, even on
|
||||
failure. In this case, some characters might have been read before the
|
||||
failure happened. Check BYTES_READ to recognize this situation.
|
||||
|
||||
Note: There was a FIXME asking to make this code use target_read_string,
|
||||
but this function is more general (can read past null characters, up to
|
||||
given LEN). Besides, it is used much more often than target_read_string
|
||||
so it is more tested. Perhaps callers of target_read_string should use
|
||||
this function instead? */
|
||||
failure happened. Check BYTES_READ to recognize this situation. */
|
||||
|
||||
int
|
||||
read_string (CORE_ADDR addr, int len, int width, unsigned int fetchlimit,
|
||||
|
|
Loading…
Add table
Reference in a new issue