Use std::vector<bool> for agent_expr::reg_mask

agent_expr::reg_mask implements its own packed boolean vector.  This
patch replaces it with a std::vector<bool>, simplifying the code.

Reviewed-by: John Baldwin <jhb@FreeBSD.org>
This commit is contained in:
Tom Tromey
2023-06-17 12:52:11 -06:00
parent 6f96f4854f
commit a2bbca9fa5
3 changed files with 19 additions and 45 deletions

View File

@@ -41,17 +41,12 @@ agent_expr::agent_expr (struct gdbarch *gdbarch, CORE_ADDR scope)
this->gdbarch = gdbarch;
this->scope = scope;
/* Bit vector for registers used. */
this->reg_mask_len = 1;
this->reg_mask = XCNEWVEC (unsigned char, this->reg_mask_len);
this->tracing = 0;
this->trace_string = 0;
}
agent_expr::~agent_expr ()
{
xfree (this->reg_mask);
}
/* Append the low N bytes of VAL as an N-byte integer to the
@@ -330,8 +325,12 @@ ax_print (struct ui_file *f, struct agent_expr *x)
gdb_printf (f, _("Scope: %s\n"), paddress (x->gdbarch, x->scope));
gdb_printf (f, _("Reg mask:"));
for (i = 0; i < x->reg_mask_len; ++i)
gdb_printf (f, _(" %02x"), x->reg_mask[i]);
for (i = 0; i < x->reg_mask.size (); ++i)
{
if ((i % 8) == 0)
gdb_printf (f, " ");
gdb_printf (f, _("%d"), (int) x->reg_mask[i]);
}
gdb_printf (f, _("\n"));
/* Check the size of the name array against the number of entries in
@@ -401,28 +400,14 @@ ax_reg_mask (struct agent_expr *ax, int reg)
}
else
{
int byte;
/* Get the remote register number. */
reg = gdbarch_remote_register_number (ax->gdbarch, reg);
byte = reg / 8;
/* Grow the bit mask if necessary. */
if (byte >= ax->reg_mask_len)
{
/* It's not appropriate to double here. This isn't a
string buffer. */
int new_len = byte + 1;
unsigned char *new_reg_mask
= XRESIZEVEC (unsigned char, ax->reg_mask, new_len);
if (reg >= ax->reg_mask.size ())
ax->reg_mask.resize (reg);
memset (new_reg_mask + ax->reg_mask_len, 0,
(new_len - ax->reg_mask_len) * sizeof (ax->reg_mask[0]));
ax->reg_mask_len = new_len;
ax->reg_mask = new_reg_mask;
}
ax->reg_mask[byte] |= 1 << (reg % 8);
ax->reg_mask[reg] = true;
}
}

View File

@@ -110,14 +110,10 @@ struct agent_expr
int max_data_size;
/* Bit vector of registers needed. Register R is needed iff
reg_mask[R / 8] & (1 << (R % 8))
is non-zero. Note! You may not assume that this bitmask is long
enough to hold bits for all the registers of the machine; the
agent expression code has no idea how many registers the machine
has. However, the bitmask is reg_mask_len bytes long, so the
valid register numbers run from 0 to reg_mask_len * 8 - 1.
reg_mask[R] is non-zero. Note! You may not assume that this
bitmask is long enough to hold bits for all the registers of
the machine; the agent expression code has no idea how many
registers the machine has.
Also note that this mask may contain registers that are needed
for the original collection expression to work, but that are
@@ -126,8 +122,7 @@ struct agent_expr
compiler sets the mask bit and skips generating a bytecode whose
result is going to be discarded anyway.
*/
int reg_mask_len;
unsigned char *reg_mask;
std::vector<bool> reg_mask;
/* For the data tracing facility, we need to insert `trace' bytecodes
before each data fetch; this records all the memory that the

View File

@@ -835,19 +835,13 @@ collection_list::add_remote_register (unsigned int regno)
void
collection_list::add_ax_registers (struct agent_expr *aexpr)
{
if (aexpr->reg_mask_len > 0)
{
for (int ndx1 = 0; ndx1 < aexpr->reg_mask_len; ndx1++)
for (int ndx1 = 0; ndx1 < aexpr->reg_mask.size (); ndx1++)
{
QUIT; /* Allow user to bail out with ^C. */
if (aexpr->reg_mask[ndx1] != 0)
if (aexpr->reg_mask[ndx1])
{
/* Assume chars have 8 bits. */
for (int ndx2 = 0; ndx2 < 8; ndx2++)
if (aexpr->reg_mask[ndx1] & (1 << ndx2))
/* It's used -- record it. */
add_remote_register (ndx1 * 8 + ndx2);
}
add_remote_register (ndx1);
}
}
}