From: Pedro Franco de Carvalho <pedromfc@linux.ibm.com>
To: gdb-patches@sourceware.org
Cc: uweigand@de.ibm.com
Subject: [PATCH v2 5/6] Variable size for regs mask in collection list
Date: Fri, 27 Jul 2018 21:03:00 -0000 [thread overview]
Message-ID: <20180727210318.2960-6-pedromfc@linux.ibm.com> (raw)
In-Reply-To: <20180727210318.2960-1-pedromfc@linux.ibm.com>
This patch changes collection_list to allow larger register masks.
The mask is changed from an array to a vector and is initialized to
hold the maximum possible remote register number. The stringify
method is updated to resize temp_buf if needed.
gdb/ChangeLog:
YYYY-MM-DD Pedro Franco de Carvalho <pedromfc@linux.ibm.com>
* tracepoint.h (collection_list) <m_regs_mask>: Change type to
std::vector<unsigned char>.
* tracepoint.c (collection_list::collection_list): Remove
m_regs_mask initializer from initializer list. Resize m_regs_mask
using the largest remote register number.
(collection_list::add_remote_register): Remove size check on
m_regs_mask. Use at to access element.
(collection_list::stringify): Change type of temp_buf to
gdb::char_vector. Update uses of temp_buf. Resize if needed to
stringify the register mask. Use pack_hex_byte for the register
mask.
---
gdb/tracepoint.c | 64 +++++++++++++++++++++++++++++++++++++-------------------
gdb/tracepoint.h | 5 +++--
2 files changed, 45 insertions(+), 24 deletions(-)
diff --git a/gdb/tracepoint.c b/gdb/tracepoint.c
index f06386158a..fffc9cc173 100644
--- a/gdb/tracepoint.c
+++ b/gdb/tracepoint.c
@@ -818,10 +818,8 @@ collection_list::add_remote_register (unsigned int regno)
{
if (info_verbose)
printf_filtered ("collect register %d\n", regno);
- if (regno >= (8 * sizeof (m_regs_mask)))
- error (_("Internal: register number %d too large for tracepoint"),
- regno);
- m_regs_mask[regno / 8] |= 1 << (regno % 8);
+
+ m_regs_mask.at (regno / 8) |= 1 << (regno % 8);
}
/* Add all the registers from the mask in AEXPR to the mask in the
@@ -1122,9 +1120,20 @@ collection_list::add_static_trace_data ()
}
collection_list::collection_list ()
- : m_regs_mask (),
- m_strace_data (false)
+ : m_strace_data (false)
{
+ int max_remote_regno = 0;
+ for (int i = 0; i < gdbarch_num_regs (target_gdbarch ()); i++)
+ {
+ int remote_regno = (gdbarch_remote_register_number
+ (target_gdbarch (), i));
+
+ if (remote_regno >= 0 && remote_regno > max_remote_regno)
+ max_remote_regno = remote_regno;
+ }
+
+ m_regs_mask.resize ((max_remote_regno / 8) + 1);
+
m_memranges.reserve (128);
m_aexprs.reserve (128);
}
@@ -1134,7 +1143,8 @@ collection_list::collection_list ()
std::vector<std::string>
collection_list::stringify ()
{
- char temp_buf[2048];
+ gdb::char_vector temp_buf (2048);
+
int count;
char *end;
long i;
@@ -1144,35 +1154,45 @@ collection_list::stringify ()
{
if (info_verbose)
printf_filtered ("\nCollecting static trace data\n");
- end = temp_buf;
+ end = temp_buf.data ();
*end++ = 'L';
- str_list.emplace_back (temp_buf, end - temp_buf);
+ str_list.emplace_back (temp_buf.data (), end - temp_buf.data ());
}
- for (i = sizeof (m_regs_mask) - 1; i > 0; i--)
+ for (i = m_regs_mask.size () - 1; i > 0; i--)
if (m_regs_mask[i] != 0) /* Skip leading zeroes in regs_mask. */
break;
if (m_regs_mask[i] != 0) /* Prepare to send regs_mask to the stub. */
{
if (info_verbose)
printf_filtered ("\nCollecting registers (mask): 0x");
- end = temp_buf;
+
+ /* One char for 'R', one for the null terminator and two per
+ mask byte. */
+ std::size_t new_size = (i + 1) * 2 + 2;
+ if (new_size > temp_buf.size ())
+ temp_buf.resize (new_size);
+
+ end = temp_buf.data ();
*end++ = 'R';
for (; i >= 0; i--)
{
QUIT; /* Allow user to bail out with ^C. */
if (info_verbose)
printf_filtered ("%02X", m_regs_mask[i]);
- sprintf (end, "%02X", m_regs_mask[i]);
- end += 2;
+
+ end = pack_hex_byte (end, m_regs_mask[i]);
}
- str_list.emplace_back (temp_buf);
+ *end = '\0';
+
+ str_list.emplace_back (temp_buf.data ());
}
if (info_verbose)
printf_filtered ("\n");
if (!m_memranges.empty () && info_verbose)
printf_filtered ("Collecting memranges: \n");
- for (i = 0, count = 0, end = temp_buf; i < m_memranges.size (); i++)
+ for (i = 0, count = 0, end = temp_buf.data ();
+ i < m_memranges.size (); i++)
{
QUIT; /* Allow user to bail out with ^C. */
if (info_verbose)
@@ -1186,9 +1206,9 @@ collection_list::stringify ()
}
if (count + 27 > MAX_AGENT_EXPR_LEN)
{
- str_list.emplace_back (temp_buf, count);
+ str_list.emplace_back (temp_buf.data (), count);
count = 0;
- end = temp_buf;
+ end = temp_buf.data ();
}
{
@@ -1208,7 +1228,7 @@ collection_list::stringify ()
}
count += strlen (end);
- end = temp_buf + count;
+ end = temp_buf.data () + count;
}
for (i = 0; i < m_aexprs.size (); i++)
@@ -1216,9 +1236,9 @@ collection_list::stringify ()
QUIT; /* Allow user to bail out with ^C. */
if ((count + 10 + 2 * m_aexprs[i]->len) > MAX_AGENT_EXPR_LEN)
{
- str_list.emplace_back (temp_buf, count);
+ str_list.emplace_back (temp_buf.data (), count);
count = 0;
- end = temp_buf;
+ end = temp_buf.data ();
}
sprintf (end, "X%08X,", m_aexprs[i]->len);
end += 10; /* 'X' + 8 hex digits + ',' */
@@ -1230,9 +1250,9 @@ collection_list::stringify ()
if (count != 0)
{
- str_list.emplace_back (temp_buf, count);
+ str_list.emplace_back (temp_buf.data (), count);
count = 0;
- end = temp_buf;
+ end = temp_buf.data ();
}
return str_list;
diff --git a/gdb/tracepoint.h b/gdb/tracepoint.h
index 8bdad3567e..c185672cc1 100644
--- a/gdb/tracepoint.h
+++ b/gdb/tracepoint.h
@@ -292,8 +292,9 @@ public:
{ return m_computed; }
private:
- /* room for up to 256 regs */
- unsigned char m_regs_mask[32];
+ /* We need the allocator zero-initialize the mask, so we don't use
+ gdb::byte_vector. */
+ std::vector<unsigned char> m_regs_mask;
std::vector<memrange> m_memranges;
--
2.13.6
next prev parent reply other threads:[~2018-07-27 21:03 UTC|newest]
Thread overview: 23+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-07-27 21:03 [PATCH v2 0/6] Fix tracepoint register limitations Pedro Franco de Carvalho
2018-07-27 21:03 ` [PATCH v2 3/6] Use get_remote_packet_size in download_tracepoint Pedro Franco de Carvalho
2018-08-02 16:47 ` Ulrich Weigand
2018-08-03 21:41 ` Pedro Franco de Carvalho
2018-08-03 21:41 ` Pedro Franco de Carvalho
2018-08-06 12:40 ` Ulrich Weigand
[not found] ` <feb8623a-b89e-7519-22de-0d6ede3d5768@arm.com>
2018-08-08 10:33 ` [committed] Fix gdb/remote.c build failure Szabolcs Nagy
2018-08-08 12:25 ` Ulrich Weigand
2018-08-08 15:55 ` [PATCH v2 3/6] Use get_remote_packet_size in download_tracepoint Pedro Franco de Carvalho
2018-07-27 21:03 ` Pedro Franco de Carvalho [this message]
2018-08-02 17:01 ` [PATCH v2 5/6] Variable size for regs mask in collection list Ulrich Weigand
2018-07-27 21:03 ` [PATCH v2 6/6] Allow larger regblock sizes when saving tracefiles Pedro Franco de Carvalho
2018-08-02 17:04 ` Ulrich Weigand
2018-07-27 21:03 ` [PATCH v2 2/6] Remove trailing '-' from the last QTDP action packet Pedro Franco de Carvalho
2018-08-02 16:44 ` Ulrich Weigand
2018-07-27 21:03 ` [PATCH v2 4/6] Use remote register numbers in tracepoint mask Pedro Franco de Carvalho
2018-08-02 16:58 ` Ulrich Weigand
2018-08-03 22:09 ` Pedro Franco de Carvalho
2018-08-03 22:10 ` Pedro Franco de Carvalho
2018-08-06 12:42 ` Ulrich Weigand
2018-08-06 20:18 ` Pedro Franco de Carvalho
2018-07-27 21:03 ` [PATCH v2 1/6] Fix indentation in remote_target::download_tracepoint Pedro Franco de Carvalho
2018-08-02 16:43 ` Ulrich Weigand
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20180727210318.2960-6-pedromfc@linux.ibm.com \
--to=pedromfc@linux.ibm.com \
--cc=gdb-patches@sourceware.org \
--cc=uweigand@de.ibm.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox