Don't use struct buffer in handle_qxfer_btrace

This changes handle_qxfer_btrace and handle_qxfer_btrace_conf, in
gdbserver, to use std::string rather than struct buffer.
This commit is contained in:
Tom Tromey 2022-12-16 07:56:57 -07:00
parent c9d9117a12
commit 873a185be2
5 changed files with 61 additions and 62 deletions

View File

@ -6741,38 +6741,38 @@ linux_process_target::disable_btrace (btrace_target_info *tinfo)
/* Encode an Intel Processor Trace configuration. */
static void
linux_low_encode_pt_config (struct buffer *buffer,
linux_low_encode_pt_config (std::string *buffer,
const struct btrace_data_pt_config *config)
{
buffer_grow_str (buffer, "<pt-config>\n");
*buffer += "<pt-config>\n";
switch (config->cpu.vendor)
{
case CV_INTEL:
buffer_xml_printf (buffer, "<cpu vendor=\"GenuineIntel\" family=\"%u\" "
"model=\"%u\" stepping=\"%u\"/>\n",
config->cpu.family, config->cpu.model,
config->cpu.stepping);
string_xml_appendf (*buffer, "<cpu vendor=\"GenuineIntel\" family=\"%u\" "
"model=\"%u\" stepping=\"%u\"/>\n",
config->cpu.family, config->cpu.model,
config->cpu.stepping);
break;
default:
break;
}
buffer_grow_str (buffer, "</pt-config>\n");
*buffer += "</pt-config>\n";
}
/* Encode a raw buffer. */
static void
linux_low_encode_raw (struct buffer *buffer, const gdb_byte *data,
linux_low_encode_raw (std::string *buffer, const gdb_byte *data,
unsigned int size)
{
if (size == 0)
return;
/* We use hex encoding - see gdbsupport/rsp-low.h. */
buffer_grow_str (buffer, "<raw>\n");
*buffer += "<raw>\n";
while (size-- > 0)
{
@ -6781,17 +6781,17 @@ linux_low_encode_raw (struct buffer *buffer, const gdb_byte *data,
elem[0] = tohex ((*data >> 4) & 0xf);
elem[1] = tohex (*data++ & 0xf);
buffer_grow (buffer, elem, 2);
buffer->append (elem);
}
buffer_grow_str (buffer, "</raw>\n");
*buffer += "</raw>\n";
}
/* See to_read_btrace target method. */
int
linux_process_target::read_btrace (btrace_target_info *tinfo,
buffer *buffer,
std::string *buffer,
enum btrace_read_type type)
{
struct btrace_data btrace;
@ -6801,9 +6801,9 @@ linux_process_target::read_btrace (btrace_target_info *tinfo,
if (err != BTRACE_ERR_NONE)
{
if (err == BTRACE_ERR_OVERFLOW)
buffer_grow_str0 (buffer, "E.Overflow.");
*buffer += "E.Overflow.";
else
buffer_grow_str0 (buffer, "E.Generic Error.");
*buffer += "E.Generic Error.";
return -1;
}
@ -6811,36 +6811,36 @@ linux_process_target::read_btrace (btrace_target_info *tinfo,
switch (btrace.format)
{
case BTRACE_FORMAT_NONE:
buffer_grow_str0 (buffer, "E.No Trace.");
*buffer += "E.No Trace.";
return -1;
case BTRACE_FORMAT_BTS:
buffer_grow_str (buffer, "<!DOCTYPE btrace SYSTEM \"btrace.dtd\">\n");
buffer_grow_str (buffer, "<btrace version=\"1.0\">\n");
*buffer += "<!DOCTYPE btrace SYSTEM \"btrace.dtd\">\n";
*buffer += "<btrace version=\"1.0\">\n";
for (const btrace_block &block : *btrace.variant.bts.blocks)
buffer_xml_printf (buffer, "<block begin=\"0x%s\" end=\"0x%s\"/>\n",
paddress (block.begin), paddress (block.end));
string_xml_appendf (*buffer, "<block begin=\"0x%s\" end=\"0x%s\"/>\n",
paddress (block.begin), paddress (block.end));
buffer_grow_str0 (buffer, "</btrace>\n");
*buffer += "</btrace>\n";
break;
case BTRACE_FORMAT_PT:
buffer_grow_str (buffer, "<!DOCTYPE btrace SYSTEM \"btrace.dtd\">\n");
buffer_grow_str (buffer, "<btrace version=\"1.0\">\n");
buffer_grow_str (buffer, "<pt>\n");
*buffer += "<!DOCTYPE btrace SYSTEM \"btrace.dtd\">\n";
*buffer += "<btrace version=\"1.0\">\n";
*buffer += "<pt>\n";
linux_low_encode_pt_config (buffer, &btrace.variant.pt.config);
linux_low_encode_raw (buffer, btrace.variant.pt.data,
btrace.variant.pt.size);
buffer_grow_str (buffer, "</pt>\n");
buffer_grow_str0 (buffer, "</btrace>\n");
*buffer += "</pt>\n";
*buffer += "</btrace>\n";
break;
default:
buffer_grow_str0 (buffer, "E.Unsupported Trace Format.");
*buffer += "E.Unsupported Trace Format.";
return -1;
}
@ -6851,12 +6851,12 @@ linux_process_target::read_btrace (btrace_target_info *tinfo,
int
linux_process_target::read_btrace_conf (const btrace_target_info *tinfo,
buffer *buffer)
std::string *buffer)
{
const struct btrace_config *conf;
buffer_grow_str (buffer, "<!DOCTYPE btrace-conf SYSTEM \"btrace-conf.dtd\">\n");
buffer_grow_str (buffer, "<btrace-conf version=\"1.0\">\n");
*buffer += "<!DOCTYPE btrace-conf SYSTEM \"btrace-conf.dtd\">\n";
*buffer += "<btrace-conf version=\"1.0\">\n";
conf = linux_btrace_conf (tinfo);
if (conf != NULL)
@ -6867,20 +6867,20 @@ linux_process_target::read_btrace_conf (const btrace_target_info *tinfo,
break;
case BTRACE_FORMAT_BTS:
buffer_xml_printf (buffer, "<bts");
buffer_xml_printf (buffer, " size=\"0x%x\"", conf->bts.size);
buffer_xml_printf (buffer, " />\n");
string_xml_appendf (*buffer, "<bts");
string_xml_appendf (*buffer, " size=\"0x%x\"", conf->bts.size);
string_xml_appendf (*buffer, " />\n");
break;
case BTRACE_FORMAT_PT:
buffer_xml_printf (buffer, "<pt");
buffer_xml_printf (buffer, " size=\"0x%x\"", conf->pt.size);
buffer_xml_printf (buffer, "/>\n");
string_xml_appendf (*buffer, "<pt");
string_xml_appendf (*buffer, " size=\"0x%x\"", conf->pt.size);
string_xml_appendf (*buffer, "/>\n");
break;
}
}
buffer_grow_str0 (buffer, "</btrace-conf>\n");
*buffer += "</btrace-conf>\n";
return 0;
}
#endif /* HAVE_LINUX_BTRACE */

View File

@ -282,11 +282,11 @@ public:
int disable_btrace (btrace_target_info *tinfo) override;
int read_btrace (btrace_target_info *tinfo, buffer *buf,
int read_btrace (btrace_target_info *tinfo, std::string *buf,
enum btrace_read_type type) override;
int read_btrace_conf (const btrace_target_info *tinfo,
buffer *buf) override;
std::string *buf) override;
#endif
bool supports_range_stepping () override;

View File

@ -1825,7 +1825,7 @@ handle_qxfer_btrace (const char *annex,
ULONGEST offset, LONGEST len)
{
client_state &cs = get_client_state ();
static struct buffer cache;
static std::string cache;
struct thread_info *thread;
enum btrace_read_type type;
int result;
@ -1867,13 +1867,13 @@ handle_qxfer_btrace (const char *annex,
if (offset == 0)
{
buffer_free (&cache);
cache.clear ();
try
{
result = target_read_btrace (thread->btrace, &cache, type);
if (result != 0)
memcpy (cs.own_buf, cache.buffer, cache.used_size);
memcpy (cs.own_buf, cache.c_str (), cache.length ());
}
catch (const gdb_exception_error &exception)
{
@ -1884,16 +1884,16 @@ handle_qxfer_btrace (const char *annex,
if (result != 0)
return -3;
}
else if (offset > cache.used_size)
else if (offset > cache.length ())
{
buffer_free (&cache);
cache.clear ();
return -3;
}
if (len > cache.used_size - offset)
len = cache.used_size - offset;
if (len > cache.length () - offset)
len = cache.length () - offset;
memcpy (readbuf, cache.buffer + offset, len);
memcpy (readbuf, cache.c_str () + offset, len);
return len;
}
@ -1906,7 +1906,7 @@ handle_qxfer_btrace_conf (const char *annex,
ULONGEST offset, LONGEST len)
{
client_state &cs = get_client_state ();
static struct buffer cache;
static std::string cache;
struct thread_info *thread;
int result;
@ -1938,13 +1938,13 @@ handle_qxfer_btrace_conf (const char *annex,
if (offset == 0)
{
buffer_free (&cache);
cache.clear ();
try
{
result = target_read_btrace_conf (thread->btrace, &cache);
if (result != 0)
memcpy (cs.own_buf, cache.buffer, cache.used_size);
memcpy (cs.own_buf, cache.c_str (), cache.length ());
}
catch (const gdb_exception_error &exception)
{
@ -1955,16 +1955,16 @@ handle_qxfer_btrace_conf (const char *annex,
if (result != 0)
return -3;
}
else if (offset > cache.used_size)
else if (offset > cache.length ())
{
buffer_free (&cache);
cache.clear ();
return -3;
}
if (len > cache.used_size - offset)
len = cache.used_size - offset;
if (len > cache.length () - offset)
len = cache.length () - offset;
memcpy (readbuf, cache.buffer + offset, len);
memcpy (readbuf, cache.c_str () + offset, len);
return len;
}

View File

@ -717,15 +717,15 @@ process_stratum_target::disable_btrace (btrace_target_info *tinfo)
int
process_stratum_target::read_btrace (btrace_target_info *tinfo,
buffer *buffer,
enum btrace_read_type type)
std::string *buffer,
enum btrace_read_type type)
{
error (_("Target does not support branch tracing."));
}
int
process_stratum_target::read_btrace_conf (const btrace_target_info *tinfo,
buffer *buffer)
std::string *buffer)
{
error (_("Target does not support branch tracing."));
}

View File

@ -33,7 +33,6 @@
#include "gdbsupport/byte-vector.h"
struct emit_ops;
struct buffer;
struct process_info;
/* This structure describes how to resume a particular thread (or all
@ -403,14 +402,14 @@ public:
/* Read branch trace data into buffer.
Return 0 on success; print an error message into BUFFER and return -1,
otherwise. */
virtual int read_btrace (btrace_target_info *tinfo, buffer *buf,
virtual int read_btrace (btrace_target_info *tinfo, std::string *buf,
enum btrace_read_type type);
/* Read the branch trace configuration into BUFFER.
Return 0 on success; print an error message into BUFFER and return -1
otherwise. */
virtual int read_btrace_conf (const btrace_target_info *tinfo,
buffer *buf);
std::string *buf);
/* Return true if target supports range stepping. */
virtual bool supports_range_stepping ();
@ -636,7 +635,7 @@ target_disable_btrace (struct btrace_target_info *tinfo)
static inline int
target_read_btrace (struct btrace_target_info *tinfo,
struct buffer *buffer,
std::string *buffer,
enum btrace_read_type type)
{
return the_target->read_btrace (tinfo, buffer, type);
@ -644,7 +643,7 @@ target_read_btrace (struct btrace_target_info *tinfo,
static inline int
target_read_btrace_conf (struct btrace_target_info *tinfo,
struct buffer *buffer)
std::string *buffer)
{
return the_target->read_btrace_conf (tinfo, buffer);
}