Use std::vector<bool> for agent_expr::reg_mask
authorTom Tromey <tom@tromey.com>
Sat, 17 Jun 2023 18:52:11 +0000 (12:52 -0600)
committerTom Tromey <tom@tromey.com>
Tue, 20 Jun 2023 17:21:51 +0000 (11:21 -0600)
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>
gdb/ax-general.c
gdb/ax.h
gdb/tracepoint.c

index d5f4c51e65df061fd40017c145d630a5bfa5639d..e2a3c31e7f41ca3a41520989dd12c452cd555077 100644 (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);
-
-         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;
     }
 }
 
index 608af4c8c68cddd815e3f31d2e52cb07896b9a99..b0eb20daf75c33d1f68e1b03b8022c8d70643c32 100644 (file)
--- a/gdb/ax.h
+++ b/gdb/ax.h
@@ -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
index 335df997c0598c2add24d8663f77542ba88dc88d..205380476b3ad2fc08f4c05dcff494eb8ed1ee04 100644 (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.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);
        }
     }
 }