From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from progateway7-pub.mail.pro1.eigbox.com (gproxy5-pub.mail.unifiedlayer.com [67.222.38.55]) by sourceware.org (Postfix) with ESMTPS id 4B3DB3858D35 for ; Tue, 20 Jun 2023 17:36:40 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 4B3DB3858D35 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=tromey.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=tromey.com Received: from cmgw15.mail.unifiedlayer.com (unknown [10.0.90.130]) by progateway7.mail.pro1.eigbox.com (Postfix) with ESMTP id AF7B410047409 for ; Tue, 20 Jun 2023 17:36:39 +0000 (UTC) Received: from box5379.bluehost.com ([162.241.216.53]) by cmsmtp with ESMTP id BfHTqBTGddXwjBfHTqXVN1; Tue, 20 Jun 2023 17:36:39 +0000 X-Authority-Reason: nr=8 X-Authority-Analysis: v=2.4 cv=YZd4Wydf c=1 sm=1 tr=0 ts=6491e3a7 a=ApxJNpeYhEAb1aAlGBBbmA==:117 a=ApxJNpeYhEAb1aAlGBBbmA==:17 a=dLZJa+xiwSxG16/P+YVxDGlgEgI=:19 a=IkcTkHD0fZMA:10:nop_charset_1 a=of4jigFt-DYA:10:nop_rcvd_month_year a=Qbun_eYptAEA:10:endurance_base64_authed_username_1 a=b9YYscLdcuf7v5m7BcsA:9 a=QEXdDO2ut3YA:10:nop_charset_2 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=tromey.com; s=default; h=To:In-Reply-To:References:Message-Id:Content-Transfer-Encoding: Content-Type:MIME-Version:Subject:Date:From:Sender:Reply-To:Cc:Content-ID: Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc :Resent-Message-ID:List-Id:List-Help:List-Unsubscribe:List-Subscribe: List-Post:List-Owner:List-Archive; bh=HbL0TSgLXch+Bnbs52Rfij5ccfvYGeNPtHJ7In61P7M=; b=IpK8z6Z8I9nuHoo1w2iCap1WPf PCyWnhQmIntJJLCNFadRL4lEJeKvtNGUzbimAy68TzZAn8aMTl7O+Fj4G0FNJhyw6CWzZNBDKY3IL 3g8j28ABBCrADGTvC7PvGR2GA; Received: from 75-166-136-83.hlrn.qwest.net ([75.166.136.83]:54256 helo=[192.168.0.21]) by box5379.bluehost.com with esmtpsa (TLS1.2) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.95) (envelope-from ) id 1qBfHT-001PQG-HP for gdb-patches@sourceware.org; Tue, 20 Jun 2023 11:36:39 -0600 From: Tom Tromey Date: Tue, 20 Jun 2023 11:36:39 -0600 Subject: [PATCH v2 3/8] Use std::vector for agent_expr::reg_mask MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit Message-Id: <20230619-ax-new-v2-3-47638d750dd7@tromey.com> References: <20230619-ax-new-v2-0-47638d750dd7@tromey.com> In-Reply-To: <20230619-ax-new-v2-0-47638d750dd7@tromey.com> To: gdb-patches@sourceware.org X-Mailer: b4 0.12.2 X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - box5379.bluehost.com X-AntiAbuse: Original Domain - sourceware.org X-AntiAbuse: Originator/Caller UID/GID - [47 12] / [47 12] X-AntiAbuse: Sender Address Domain - tromey.com X-BWhitelist: no X-Source-IP: 75.166.136.83 X-Source-L: No X-Exim-ID: 1qBfHT-001PQG-HP X-Source: X-Source-Args: X-Source-Dir: X-Source-Sender: 75-166-136-83.hlrn.qwest.net ([192.168.0.21]) [75.166.136.83]:54256 X-Source-Auth: tom+tromey.com X-Email-Count: 12 X-Source-Cap: ZWx5bnJvYmk7ZWx5bnJvYmk7Ym94NTM3OS5ibHVlaG9zdC5jb20= X-Local-Domain: yes X-Spam-Status: No, score=-3025.4 required=5.0 tests=BAYES_00,DKIM_SIGNED,DKIM_VALID,GIT_PATCH_0,JMQ_SPF_NEUTRAL,RCVD_IN_DNSWL_NONE,RCVD_IN_MSPIKE_H3,RCVD_IN_MSPIKE_WL,SPF_HELO_NONE,SPF_PASS,TXREP,T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: agent_expr::reg_mask implements its own packed boolean vector. This patch replaces it with a std::vector, simplifying the code. --- gdb/ax-general.c | 33 +++++++++------------------------ gdb/ax.h | 15 +++++---------- gdb/tracepoint.c | 16 +++++----------- 3 files changed, 19 insertions(+), 45 deletions(-) diff --git a/gdb/ax-general.c b/gdb/ax-general.c index d5f4c51e65d..e2a3c31e7f4 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; } } diff --git a/gdb/ax.h b/gdb/ax.h index 608af4c8c68..b0eb20daf75 100644 --- 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 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 335df997c05..205380476b3 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); } } } -- 2.39.2