From patchwork Fri Dec 1 16:27:24 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Simon Marchi X-Patchwork-Id: 81142 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 0AD00386185E for ; Fri, 1 Dec 2023 16:30:20 +0000 (GMT) X-Original-To: gdb-patches@sourceware.org Delivered-To: gdb-patches@sourceware.org Received: from simark.ca (simark.ca [158.69.221.121]) by sourceware.org (Postfix) with ESMTPS id 752A0385C416 for ; Fri, 1 Dec 2023 16:29:57 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 752A0385C416 Authentication-Results: sourceware.org; dmarc=fail (p=none dis=none) header.from=efficios.com Authentication-Results: sourceware.org; spf=fail smtp.mailfrom=efficios.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 752A0385C416 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=158.69.221.121 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1701448199; cv=none; b=EGwC8up5kwIjHq1Gy7nq70aeiu3E2cq7BmEwH5EyqVwQd+RejY5heBS6yEwAXCoB/E7Sd/ULmUiAqhdvDMgD74gllGNNUiZAngY8pserKxXkS1tAws6gORTo8IplSFfworWY8Imp8TVPm2SagHKkzDk7B7shZzMLkkIkLBO5zMU= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1701448199; c=relaxed/simple; bh=+7td15jb4Akq9DFlKzXnSVVSd8jpbBYPMmsnP5aKFfA=; h=From:To:Subject:Date:Message-ID:MIME-Version; b=PFS027gO9ZiGDwJYtLdVnYQG80XxS54gxpdTd//eVwIrzqic9UNi5EvXn1Wl3LVmi5UCycDk1cj5oYFwTYhOfAOzDmte9LtwffA9mqIt3qLBazbsyDwJb+3H+a0HrVDoHySIJUg7dNc66QD+YcWQN8CUkzLonL2Vbbp9rj3ZviA= ARC-Authentication-Results: i=1; server2.sourceware.org Received: from smarchi-efficios.internal.efficios.com (192-222-143-198.qc.cable.ebox.net [192.222.143.198]) (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 E1C2A1E11B; Fri, 1 Dec 2023 11:29:56 -0500 (EST) From: Simon Marchi To: gdb-patches@sourceware.org Cc: Luis Machado , John Baldwin , "Aktemur, Tankut Baris" , Simon Marchi , John Baldwin Subject: [PATCH 11/24] gdb: make put_frame_register_bytes take the next frame Date: Fri, 1 Dec 2023 11:27:24 -0500 Message-ID: <20231201162751.741751-12-simon.marchi@efficios.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20231201162751.741751-1-simon.marchi@efficios.com> References: <20231201162751.741751-1-simon.marchi@efficios.com> MIME-Version: 1.0 X-Spam-Status: No, score=-3496.6 required=5.0 tests=BAYES_00, GIT_PATCH_0, KAM_DMARC_NONE, KAM_DMARC_STATUS, SPF_HELO_PASS, SPF_SOFTFAIL, 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 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 Similar to the previous patches, change put_frame_register_bytes to take the "next frame" instead of "this frame". Change-Id: I27bcb26573686d99b231230823cff8db6405a788 Reviewed-By: John Baldwin --- gdb/dwarf2/expr.c | 6 +++--- gdb/frame.c | 14 +++++--------- gdb/frame.h | 4 ++-- gdb/mips-tdep.c | 11 ++++++----- gdb/valops.c | 32 +++++++++++++++----------------- 5 files changed, 31 insertions(+), 36 deletions(-) diff --git a/gdb/dwarf2/expr.c b/gdb/dwarf2/expr.c index b21016eb38bb..7fc7b3abf5ca 100644 --- a/gdb/dwarf2/expr.c +++ b/gdb/dwarf2/expr.c @@ -272,9 +272,9 @@ rw_pieced_value (value *v, value *from, bool check_optimized) copy_bitwise (buffer.data (), bits_to_skip % 8, from_contents, offset, this_size_bits, bits_big_endian); - put_frame_register_bytes (frame, gdb_regnum, - bits_to_skip / 8, - buffer); + put_frame_register_bytes + (get_next_frame_sentinel_okay (frame), gdb_regnum, + bits_to_skip / 8, buffer); } } break; diff --git a/gdb/frame.c b/gdb/frame.c index 44c4906e9cc1..982aaa6d6753 100644 --- a/gdb/frame.c +++ b/gdb/frame.c @@ -1537,11 +1537,11 @@ get_frame_register_bytes (frame_info_ptr frame, int regnum, } void -put_frame_register_bytes (frame_info_ptr frame, int regnum, +put_frame_register_bytes (frame_info_ptr next_frame, int regnum, CORE_ADDR offset, gdb::array_view buffer) { - struct gdbarch *gdbarch = get_frame_arch (frame); + gdbarch *gdbarch = frame_unwind_arch (next_frame); /* Skip registers wholly inside of OFFSET. */ while (offset >= register_size (gdbarch, regnum)) @@ -1557,19 +1557,15 @@ put_frame_register_bytes (frame_info_ptr frame, int regnum, buffer.size ()); if (curr_len == register_size (gdbarch, regnum)) - put_frame_register (get_next_frame_sentinel_okay (frame), regnum, - buffer.slice (0, curr_len)); + put_frame_register (next_frame, regnum, buffer.slice (0, curr_len)); else { - value *value - = frame_unwind_register_value (frame_info_ptr (frame->next), - regnum); + value *value = frame_unwind_register_value (next_frame, regnum); gdb_assert (value != nullptr); copy (buffer.slice (0, curr_len), value->contents_writeable ().slice (offset, curr_len)); - put_frame_register (get_next_frame_sentinel_okay (frame), regnum, - value->contents_raw ()); + put_frame_register (next_frame, regnum, value->contents_raw ()); release_value (value); } diff --git a/gdb/frame.h b/gdb/frame.h index 1d870d619ca5..5ce3a1b285aa 100644 --- a/gdb/frame.h +++ b/gdb/frame.h @@ -743,8 +743,8 @@ extern bool get_frame_register_bytes (frame_info_ptr frame, int regnum, int *optimizedp, int *unavailablep); /* Write bytes from BUFFER to one or multiple registers starting with REGNUM - in frame FRAME, starting at OFFSET. */ -extern void put_frame_register_bytes (frame_info_ptr frame, int regnum, + in NEXT_FRAME's previous frame, starting at OFFSET. */ +extern void put_frame_register_bytes (frame_info_ptr next_frame, int regnum, CORE_ADDR offset, gdb::array_view buffer); diff --git a/gdb/mips-tdep.c b/gdb/mips-tdep.c index dbdf8a668b8f..9c0cfede492a 100644 --- a/gdb/mips-tdep.c +++ b/gdb/mips-tdep.c @@ -999,7 +999,8 @@ mips_value_to_register (frame_info_ptr frame, int regnum, { gdb_byte fill[8]; size_t len = type->length (); - + frame_info_ptr next_frame = get_next_frame_sentinel_okay (frame); + /* Sign extend values, irrespective of type, that are stored to a 64-bit general purpose register. (32-bit unsigned values are stored as signed quantities within a 64-bit register. @@ -1012,8 +1013,8 @@ mips_value_to_register (frame_info_ptr frame, int regnum, store_signed_integer (fill, 8, BFD_ENDIAN_BIG, -1); else store_signed_integer (fill, 8, BFD_ENDIAN_BIG, 0); - put_frame_register_bytes (frame, regnum, 0, {fill, 8 - len}); - put_frame_register_bytes (frame, regnum, 8 - len, {from, len}); + put_frame_register_bytes (next_frame, regnum, 0, {fill, 8 - len}); + put_frame_register_bytes (next_frame, regnum, 8 - len, {from, len}); } else { @@ -1021,8 +1022,8 @@ mips_value_to_register (frame_info_ptr frame, int regnum, store_signed_integer (fill, 8, BFD_ENDIAN_LITTLE, -1); else store_signed_integer (fill, 8, BFD_ENDIAN_LITTLE, 0); - put_frame_register_bytes (frame, regnum, 0, {from, len}); - put_frame_register_bytes (frame, regnum, len, {fill, 8 - len}); + put_frame_register_bytes (next_frame, regnum, 0, {from, len}); + put_frame_register_bytes (next_frame, regnum, len, {fill, 8 - len}); } } else diff --git a/gdb/valops.c b/gdb/valops.c index 6521580a1e83..8e1849837cf1 100644 --- a/gdb/valops.c +++ b/gdb/valops.c @@ -1191,10 +1191,6 @@ value_assign (struct value *toval, struct value *fromval) case lval_register: { - frame_info_ptr frame; - struct gdbarch *gdbarch; - int value_reg; - /* Figure out which frame this register value is in. The value holds the frame_id for the next frame, that is the frame this register value was unwound from. @@ -1202,15 +1198,14 @@ value_assign (struct value *toval, struct value *fromval) Below we will call put_frame_register_bytes which requires that we pass it the actual frame in which the register value is valid, i.e. not the next frame. */ - frame = frame_find_by_id (VALUE_NEXT_FRAME_ID (toval)); - frame = get_prev_frame_always (frame); + frame_info_ptr next_frame = frame_find_by_id (VALUE_NEXT_FRAME_ID (toval)); - value_reg = VALUE_REGNUM (toval); + int value_reg = VALUE_REGNUM (toval); - if (!frame) + if (next_frame == nullptr) error (_("Value being assigned to is no longer active.")); - gdbarch = get_frame_arch (frame); + gdbarch *gdbarch = frame_unwind_arch (next_frame); if (toval->bitsize ()) { @@ -1230,9 +1225,10 @@ value_assign (struct value *toval, struct value *fromval) "don't fit in a %d bit word."), (int) sizeof (LONGEST) * HOST_CHAR_BIT); - if (!get_frame_register_bytes (frame, value_reg, offset, - {buffer, changed_len}, - &optim, &unavail)) + if (!get_frame_register_bytes (get_prev_frame_always (next_frame), + value_reg, offset, + { buffer, changed_len }, &optim, + &unavail)) { if (optim) throw_error (OPTIMIZED_OUT_ERROR, @@ -1245,8 +1241,8 @@ value_assign (struct value *toval, struct value *fromval) modify_field (type, buffer, value_as_long (fromval), toval->bitpos (), toval->bitsize ()); - put_frame_register_bytes (frame, value_reg, offset, - {buffer, changed_len}); + put_frame_register_bytes (next_frame, value_reg, offset, + { buffer, changed_len }); } else { @@ -1256,17 +1252,19 @@ value_assign (struct value *toval, struct value *fromval) /* If TOVAL is a special machine register requiring conversion of program values to a special raw format. */ - gdbarch_value_to_register (gdbarch, frame, + gdbarch_value_to_register (gdbarch, + get_prev_frame_always (next_frame), VALUE_REGNUM (toval), type, fromval->contents ().data ()); } else - put_frame_register_bytes (frame, value_reg, + put_frame_register_bytes (next_frame, value_reg, toval->offset (), fromval->contents ()); } - gdb::observers::register_changed.notify (frame, value_reg); + gdb::observers::register_changed.notify + (get_prev_frame_always (next_frame), value_reg); break; }