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->gdbarch = gdbarch;
this->scope = scope; 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->tracing = 0;
this->trace_string = 0; this->trace_string = 0;
} }
agent_expr::~agent_expr () agent_expr::~agent_expr ()
{ {
xfree (this->reg_mask);
} }
/* Append the low N bytes of VAL as an N-byte integer to the /* 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, _("Scope: %s\n"), paddress (x->gdbarch, x->scope));
gdb_printf (f, _("Reg mask:")); gdb_printf (f, _("Reg mask:"));
for (i = 0; i < x->reg_mask_len; ++i) for (i = 0; i < x->reg_mask.size (); ++i)
gdb_printf (f, _(" %02x"), x->reg_mask[i]); {
if ((i % 8) == 0)
gdb_printf (f, " ");
gdb_printf (f, _("%d"), (int) x->reg_mask[i]);
}
gdb_printf (f, _("\n")); gdb_printf (f, _("\n"));
/* Check the size of the name array against the number of entries in /* 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 else
{ {
int byte;
/* Get the remote register number. */ /* Get the remote register number. */
reg = gdbarch_remote_register_number (ax->gdbarch, reg); reg = gdbarch_remote_register_number (ax->gdbarch, reg);
byte = reg / 8;
/* Grow the bit mask if necessary. */ /* Grow the bit mask if necessary. */
if (byte >= ax->reg_mask_len) if (reg >= ax->reg_mask.size ())
{ ax->reg_mask.resize (reg);
/* 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);
memset (new_reg_mask + ax->reg_mask_len, 0, ax->reg_mask[reg] = true;
(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);
} }
} }

View File

@@ -110,14 +110,10 @@ struct agent_expr
int max_data_size; int max_data_size;
/* Bit vector of registers needed. Register R is needed iff /* Bit vector of registers needed. Register R is needed iff
reg_mask[R] is non-zero. Note! You may not assume that this
reg_mask[R / 8] & (1 << (R % 8)) bitmask is long enough to hold bits for all the registers of
the machine; the agent expression code has no idea how many
is non-zero. Note! You may not assume that this bitmask is long registers the machine has.
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.
Also note that this mask may contain registers that are needed Also note that this mask may contain registers that are needed
for the original collection expression to work, but that are 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 compiler sets the mask bit and skips generating a bytecode whose
result is going to be discarded anyway. result is going to be discarded anyway.
*/ */
int reg_mask_len; std::vector<bool> reg_mask;
unsigned char *reg_mask;
/* For the data tracing facility, we need to insert `trace' bytecodes /* For the data tracing facility, we need to insert `trace' bytecodes
before each data fetch; this records all the memory that the 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 void
collection_list::add_ax_registers (struct agent_expr *aexpr) collection_list::add_ax_registers (struct agent_expr *aexpr)
{ {
if (aexpr->reg_mask_len > 0) for (int ndx1 = 0; ndx1 < aexpr->reg_mask.size (); ndx1++)
{ {
for (int ndx1 = 0; ndx1 < aexpr->reg_mask_len; ndx1++) QUIT; /* Allow user to bail out with ^C. */
if (aexpr->reg_mask[ndx1])
{ {
QUIT; /* Allow user to bail out with ^C. */ /* It's used -- record it. */
if (aexpr->reg_mask[ndx1] != 0) add_remote_register (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);
}
} }
} }
} }