From patchwork Tue Jan 7 21:29:22 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Simon Marchi X-Patchwork-Id: 104299 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id C01833858290 for ; Tue, 7 Jan 2025 21:30:53 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org C01833858290 Authentication-Results: sourceware.org; dkim=pass (1024-bit key, unprotected) header.d=polymtl.ca header.i=@polymtl.ca header.a=rsa-sha256 header.s=default header.b=tn+tbhX/ X-Original-To: gdb-patches@sourceware.org Delivered-To: gdb-patches@sourceware.org Received: from smtp.polymtl.ca (smtp.polymtl.ca [132.207.4.11]) by sourceware.org (Postfix) with ESMTPS id 423D23858D34 for ; Tue, 7 Jan 2025 21:29:45 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 423D23858D34 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=polymtl.ca Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=polymtl.ca ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 423D23858D34 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=132.207.4.11 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1736285385; cv=none; b=hPxv8wk7PCPSp0DxhoOVj1kYnSfcgaksH5OwHu7UXeXEMT+l6s21D3JjKkBFvYI7EpkN6SPsajiKOVnGwxXkPrxV73EMPpdPguzicMI/Vqz+i2Z5ENrspIdtoC5tysdUHUUHryVTw2DKCdtYIpR91asTohADEpMMU26IBEn+JUU= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1736285385; c=relaxed/simple; bh=3PNA9YcgIsBGluLD9tX8YgySncRNKvXHZ1VAZyJF3Dw=; h=DKIM-Signature:From:To:Subject:Date:Message-ID:MIME-Version; b=HhrU4C8w2pcFGytkHBbJz4pKY39zdMR+Lmdg4CGol962ul4/Xfcfq7O3LV3ttU6py60chNJaTF8FLkWr6/2WxyAGM8G/5it/DOBEuIN2nUbTkIXSRg8fKRCiBDxB8yW5G1LK/mqzvSiRIeeyKYNvlb/FWhZ/8xMfOh+LOjoRBRA= ARC-Authentication-Results: i=1; server2.sourceware.org DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 423D23858D34 Received: from simark.ca (simark.ca [158.69.221.121]) (authenticated bits=0) by smtp.polymtl.ca (8.14.7/8.14.7) with ESMTP id 507LTdpe048806 (version=TLSv1/SSLv3 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT) for ; Tue, 7 Jan 2025 16:29:44 -0500 DKIM-Filter: OpenDKIM Filter v2.11.0 smtp.polymtl.ca 507LTdpe048806 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=polymtl.ca; s=default; t=1736285384; bh=Q09ahvXkzOzSUqWPEbqsliz5fKzTSmjpzL5EDK7y3Tw=; h=From:To:Cc:Subject:Date:From; b=tn+tbhX/1rlo7VqHpIacJvMa5V/hQFuvajmxAOYYQKuE6eQhIOvGReO0J1Tjx6tIo fup8YN9tWaH64gIUoPkkdsi94v7NVuqT+SvRpK5a2v9Z8GJAVeckx57+2OTUBKI3iK QZ9MTmc9WA0j1LpRgAhTZRPbB107Nq/Wj1RiKWBg= Received: by simark.ca (Postfix, from userid 112) id C56161E0C1; Tue, 7 Jan 2025 16:29:39 -0500 (EST) X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-Spam-Level: X-Spam-Status: No, score=-3188.2 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, RCVD_IN_MSPIKE_H3, RCVD_IN_MSPIKE_WL, SPF_HELO_PASS, SPF_NONE, TXREP autolearn=ham autolearn_force=no version=3.4.6 Received: from simark.localdomain (modemcable238.237-201-24.mc.videotron.ca [24.201.237.238]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (prime256v1) server-digest SHA256) (No client certificate requested) by simark.ca (Postfix) with ESMTPSA id C31D61E05C; Tue, 7 Jan 2025 16:29:37 -0500 (EST) From: simon.marchi@polymtl.ca To: gdb-patches@sourceware.org Cc: Simon Marchi Subject: [PATCH] gdb, gdbserver, gdbsupport: turn regcache_register_size into methods Date: Tue, 7 Jan 2025 16:29:22 -0500 Message-ID: <20250107212936.2759850-1-simon.marchi@polymtl.ca> X-Mailer: git-send-email 2.47.1 MIME-Version: 1.0 X-Poly-FromMTA: (simark.ca [158.69.221.121]) at Tue, 7 Jan 2025 21:29:39 +0000 X-BeenThere: gdb-patches@sourceware.org X-Mailman-Version: 2.1.30 Precedence: list List-Id: Gdb-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: gdb-patches-bounces~patchwork=sourceware.org@sourceware.org From: Simon Marchi Add an abstract virtual method "register_size" to reg_buffer_common, and implement in both sides (gdb and gdbserver). Change-Id: I1f55dd6f409a6b8798d57366505fdad2bda61ea8 Reviewed-by: Thiago Jung Bauermann --- gdb/amd64-windows-tdep.c | 2 +- gdb/i387-tdep.c | 4 ++-- gdb/nat/aarch64-hw-point.c | 2 +- gdb/regcache-dump.c | 2 +- gdb/regcache.c | 20 +++++++++----------- gdb/regcache.h | 3 +++ gdbserver/regcache.cc | 7 +++---- gdbserver/regcache.h | 3 +++ gdbsupport/common-regcache.h | 14 +++++--------- 9 files changed, 28 insertions(+), 29 deletions(-) base-commit: 69053cf7eba1001f1a24a78f30d6334a88ec5a56 diff --git a/gdb/amd64-windows-tdep.c b/gdb/amd64-windows-tdep.c index e3e815e1123a..9e255bb2d433 100644 --- a/gdb/amd64-windows-tdep.c +++ b/gdb/amd64-windows-tdep.c @@ -211,7 +211,7 @@ amd64_windows_store_arg_in_reg (struct regcache *regcache, gdb_assert (valbuf.size () <= 8); std::copy (valbuf.begin (), valbuf.end (), buf.begin ()); - size_t reg_size = regcache_register_size (regcache, regno); + size_t reg_size = regcache->register_size (regno); gdb_assert (reg_size <= buf.size ()); gdb::array_view view (buf); regcache->cooked_write (regno, view.slice (0, reg_size)); diff --git a/gdb/i387-tdep.c b/gdb/i387-tdep.c index 96869613d103..35a039ed659b 100644 --- a/gdb/i387-tdep.c +++ b/gdb/i387-tdep.c @@ -1564,7 +1564,7 @@ i387_collect_xsave (const struct regcache *regcache, int regnum, byte_order, I387_FCTRL_INIT_VAL); else memset (FXSAVE_ADDR (tdep, regs, i), 0, - regcache_register_size (regcache, i)); + regcache->register_size (i)); } } } @@ -1887,7 +1887,7 @@ i387_collect_xsave (const struct regcache *regcache, int regnum, int regsize; regcache->raw_collect (i, raw); - regsize = regcache_register_size (regcache, i); + regsize = regcache->register_size (i); p = FXSAVE_ADDR (tdep, regs, i); if (memcmp (raw, p, regsize)) { diff --git a/gdb/nat/aarch64-hw-point.c b/gdb/nat/aarch64-hw-point.c index 6acee0fb814c..8ab91fe85142 100644 --- a/gdb/nat/aarch64-hw-point.c +++ b/gdb/nat/aarch64-hw-point.c @@ -166,7 +166,7 @@ aarch64_point_is_aligned (ptid_t ptid, int is_watchpoint, CORE_ADDR addr, /* Set alignment to 2 only if the current process is 32-bit, since thumb instruction can be 2-byte aligned. Otherwise, set alignment to AARCH64_HBP_ALIGNMENT. */ - if (regcache_register_size (regcache, 0) == 8) + if (regcache->register_size (0) == 8) alignment = AARCH64_HBP_ALIGNMENT; else alignment = 2; diff --git a/gdb/regcache-dump.c b/gdb/regcache-dump.c index 037a232189c7..fd39f95734f2 100644 --- a/gdb/regcache-dump.c +++ b/gdb/regcache-dump.c @@ -113,7 +113,7 @@ class register_dump_reg_buffer : public register_dump, reg_buffer { if (regnum < gdbarch_num_regs (m_gdbarch) || m_has_pseudo) { - auto size = register_size (m_gdbarch, regnum); + auto size = ::register_size (m_gdbarch, regnum); if (size == 0) return; diff --git a/gdb/regcache.c b/gdb/regcache.c index f2c403b88d0c..23552977bb9b 100644 --- a/gdb/regcache.c +++ b/gdb/regcache.c @@ -176,13 +176,12 @@ register_size (struct gdbarch *gdbarch, int regnum) return size; } -/* See gdbsupport/common-regcache.h. */ +/* See regcache.h. */ int -regcache_register_size (const reg_buffer_common *regcache, int n) +reg_buffer::register_size (int n) const { - return register_size - (gdb::checked_static_cast (regcache)->arch (), n); + return ::register_size (this->arch (), n); } reg_buffer::reg_buffer (gdbarch *gdbarch, bool has_pseudo) @@ -939,7 +938,7 @@ register_status readable_regcache::read_part (int regnum, int offset, gdb::array_view dst, bool is_raw) { - int reg_size = register_size (arch (), regnum); + int reg_size = this->register_size (regnum); gdb_assert (offset >= 0); gdb_assert (offset + dst.size () <= reg_size); @@ -983,7 +982,7 @@ void reg_buffer::raw_collect_part (int regnum, int offset, gdb::array_view dst) const { - int reg_size = register_size (arch (), regnum); + int reg_size = this->register_size (regnum); gdb_assert (offset >= 0); gdb_assert (offset + dst.size () <= reg_size); @@ -1013,7 +1012,7 @@ register_status regcache::write_part (int regnum, int offset, gdb::array_view src, bool is_raw) { - int reg_size = register_size (arch (), regnum); + int reg_size = this->register_size (regnum); gdb_assert (offset >= 0); gdb_assert (offset + src.size () <= reg_size); @@ -1065,7 +1064,7 @@ void reg_buffer::raw_supply_part (int regnum, int offset, gdb::array_view src) { - int reg_size = register_size (arch (), regnum); + int reg_size = this->register_size (regnum); gdb_assert (offset >= 0); gdb_assert (offset + src.size () <= reg_size); @@ -1236,8 +1235,7 @@ regcache::transfer_regset_register (struct regcache *out_regcache, int regnum, const gdb_byte *in_buf, gdb_byte *out_buf, int slot_size, int offs) const { - struct gdbarch *gdbarch = arch (); - int reg_size = std::min (register_size (gdbarch, regnum), slot_size); + int reg_size = std::min (this->register_size (regnum), slot_size); /* Use part versions and reg_size to prevent possible buffer overflows when accessing the regcache. */ @@ -1254,7 +1252,7 @@ regcache::transfer_regset_register (struct regcache *out_regcache, int regnum, else if (in_buf != nullptr) { /* Zero-extend the register value if the slot is smaller than the register. */ - if (slot_size < register_size (gdbarch, regnum)) + if (slot_size < this->register_size (regnum)) out_regcache->raw_supply_zeroed (regnum); out_regcache->raw_supply_part (regnum, 0, gdb::make_array_view (in_buf + offs, diff --git a/gdb/regcache.h b/gdb/regcache.h index 71f17b349c9d..0e76e8da09fb 100644 --- a/gdb/regcache.h +++ b/gdb/regcache.h @@ -199,6 +199,9 @@ class reg_buffer : public reg_buffer_common /* See gdbsupport/common-regcache.h. */ enum register_status get_register_status (int regnum) const override; + /* See gdbsupport/common-regcache.h. */ + int register_size (int n) const override final; + /* See gdbsupport/common-regcache.h. */ void raw_collect (int regnum, gdb::array_view dst) const override; diff --git a/gdbserver/regcache.cc b/gdbserver/regcache.cc index 5b064ae04d1e..acd42089ca98 100644 --- a/gdbserver/regcache.cc +++ b/gdbserver/regcache.cc @@ -303,13 +303,12 @@ register_size (const struct target_desc *tdesc, int n) return find_register_by_number (tdesc, n).size / 8; } -/* See gdbsupport/common-regcache.h. */ +/* See regcache.h. */ int -regcache_register_size (const reg_buffer_common *regcache, int n) +regcache::register_size (int n) const { - return register_size - (gdb::checked_static_cast (regcache)->tdesc, n); + return ::register_size (this->tdesc, n); } static gdb::array_view diff --git a/gdbserver/regcache.h b/gdbserver/regcache.h index 12345a3439cd..90fa5be4f145 100644 --- a/gdbserver/regcache.h +++ b/gdbserver/regcache.h @@ -50,6 +50,9 @@ struct regcache : public reg_buffer_common /* See gdbsupport/common-regcache.h. */ enum register_status get_register_status (int regnum) const override; + /* See gdbsupport/common-regcache.h. */ + int register_size (int n) const override; + /* See gdbsupport/common-regcache.h. */ void raw_supply (int regnum, gdb::array_view src) override; diff --git a/gdbsupport/common-regcache.h b/gdbsupport/common-regcache.h index cd30ae949cad..b3a498189c83 100644 --- a/gdbsupport/common-regcache.h +++ b/gdbsupport/common-regcache.h @@ -48,11 +48,6 @@ enum register_status : signed char extern reg_buffer_common *get_thread_regcache_for_ptid (ptid_t ptid); -/* Return the size of register numbered N in REGCACHE. This function - must be provided by the client. */ - -extern int regcache_register_size (const reg_buffer_common *regcache, int n); - /* Read the PC register. This function must be provided by the client. */ @@ -78,6 +73,9 @@ struct reg_buffer_common buffer. */ virtual register_status get_register_status (int regnum) const = 0; +/* Return the size of register numbered N in this buffer. */ + virtual int register_size (int n) const = 0; + /* Supply register REGNUM, whose contents are stored in SRC, to this register buffer. */ virtual void raw_supply (int regnum, gdb::array_view src) @@ -92,8 +90,7 @@ struct reg_buffer_common void raw_supply (int regnum, const gdb_byte *src) { raw_supply (regnum, - gdb::make_array_view (src, - regcache_register_size (this, regnum))); + gdb::make_array_view (src, this->register_size (regnum))); } /* Supply part of register REGNUM with zeroed value. Start at OFFSET in @@ -116,8 +113,7 @@ struct reg_buffer_common void raw_collect (int regnum, gdb_byte *dst) { raw_collect (regnum, - gdb::make_array_view (dst, - regcache_register_size (this, regnum))); + gdb::make_array_view (dst, this->register_size (regnum))); } /* Compare the contents of the register stored in the regcache (ignoring the