diff options
-rw-r--r-- | gdb/ax-general.c | 33 | ||||
-rw-r--r-- | gdb/ax.h | 15 | ||||
-rw-r--r-- | gdb/tracepoint.c | 16 |
3 files changed, 19 insertions, 45 deletions
diff --git a/gdb/ax-general.c b/gdb/ax-general.c index d5f4c51..e2a3c31 100644 --- a/gdb/ax-general.c +++ b/gdb/ax-general.c @@ -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); - - 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; } } @@ -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 diff --git a/gdb/tracepoint.c b/gdb/tracepoint.c index 335df99..2053804 100644 --- a/gdb/tracepoint.c +++ b/gdb/tracepoint.c @@ -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.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); } } } |