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
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
}
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);
-
- 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;
- }
+ if (reg >= ax->reg_mask.size ())
+ ax->reg_mask.resize (reg);
- ax->reg_mask[byte] |= 1 << (reg % 8);
+ ax->reg_mask[reg] = true;
}
}
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
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
void
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. */
- if (aexpr->reg_mask[ndx1] != 0)
- {
- /* 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);
- }
+ /* It's used -- record it. */
+ add_remote_register (ndx1);
}
}
}