From patchwork Tue Jun 2 14:33:36 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Guinevere Larsen X-Patchwork-Id: 136304 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from vm01.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 47CFB4BA2E1B for ; Tue, 2 Jun 2026 14:36:58 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 47CFB4BA2E1B Authentication-Results: sourceware.org; dkim=pass (1024-bit key, unprotected) header.d=redhat.com header.i=@redhat.com header.a=rsa-sha256 header.s=mimecast20190719 header.b=HKW9sAwB X-Original-To: gdb-patches@sourceware.org Delivered-To: gdb-patches@sourceware.org Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by sourceware.org (Postfix) with ESMTP id 74B184BA2E23 for ; Tue, 2 Jun 2026 14:35:56 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 74B184BA2E23 Authentication-Results: sourceware.org; dmarc=pass (p=quarantine dis=none) header.from=redhat.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=redhat.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 74B184BA2E23 Authentication-Results: sourceware.org; arc=none smtp.remote-ip=170.10.133.124 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1780410956; cv=none; b=rhfLf06gnYsEr5R0Rfpa6zco0B83EzNV9vWTHjX/WlSXDMYe7xReHph5zv70Qa2rDw0EQUyl9GSZl1nKTg/lb19uUcLagl3FpPxIVvueBJRrVdB35XeZz5wN/suaY7M0lxnv4ANLtI02d0QB7ok3bJtgqWtvsKpSEQPBFiyvvLY= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1780410956; c=relaxed/simple; bh=pJbCsCCXcXqQc2VlJmFu35KqQsLi+owHiEgejc8z6Xc=; h=DKIM-Signature:From:To:Subject:Date:Message-ID:MIME-Version; b=Lrc97Qs6m5PVmzrNMAhOHt8I1IulTogVUPoaPWSY1L8321FiwGuUqQI8I3DbbgnrtmcEJ1DCkjSIk7LtNSihMftkkG9dauv2WFFQ8ZaCUsbBHrNq/+YYn/wwDp4qCQxDTZ64kpJSFX5MJkaTAJB3vvXeSjjfwR5/54rLaQlO75o= ARC-Authentication-Results: i=1; sourceware.org; dkim=pass (1024-bit key, unprotected) header.d=redhat.com header.i=@redhat.com header.a=rsa-sha256 header.s=mimecast20190719 header.b=HKW9sAwB DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 74B184BA2E23 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1780410956; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=fiIXkzTA+oKi5cF+aXmnOJoEyvPxwtS3q400qu5EzUw=; b=HKW9sAwBhyzgw1HzvF5t3v3iX0MDS1n9XrgT0n3cZ0Vk2zIb3MPb4+i4NiSMZKtJZv73hZ 52h5dMfFV+DIyUm/S8EuTkFvVBNaxjnyhA1DXj+n5P6P58qQFkI5uPxl3YxHw2BejHslkp iavcbhHKJFJddOWknnjZcpD2YfGnjMI= Received: from mx-prod-mc-01.mail-002.prod.us-west-2.aws.redhat.com (ec2-54-186-198-63.us-west-2.compute.amazonaws.com [54.186.198.63]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-500-0TiXMpdGNMyL3PNrXlXo5g-1; Tue, 02 Jun 2026 10:35:54 -0400 X-MC-Unique: 0TiXMpdGNMyL3PNrXlXo5g-1 X-Mimecast-MFC-AGG-ID: 0TiXMpdGNMyL3PNrXlXo5g_1780410954 Received: from mx-prod-int-10.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-10.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.95]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-01.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id E54BF1956089 for ; Tue, 2 Jun 2026 14:35:53 +0000 (UTC) Received: from fedora.redhat.com (unknown [10.96.134.9]) by mx-prod-int-10.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id AC4031681; Tue, 2 Jun 2026 14:35:52 +0000 (UTC) From: Guinevere Larsen To: gdb-patches@sourceware.org Cc: Guinevere Larsen Subject: [PATCH v4 2/8] gdb/record: factor out reading and writing the execution log to corefile Date: Tue, 2 Jun 2026 11:33:36 -0300 Message-ID: <20260602143342.12245-3-guinevere@redhat.com> In-Reply-To: <20260602143342.12245-1-guinevere@redhat.com> References: <20260602143342.12245-1-guinevere@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.6 on 10.30.177.95 X-Mimecast-Spam-Score: 0 X-Mimecast-MFC-PROC-ID: RwvKXVwoRT2GJAMRptLTHB7MowEp0BpB6tEZNvJ25Vg_1780410954 X-Mimecast-Originator: redhat.com content-type: text/plain; charset="US-ASCII"; x-default=true X-Spam-Status: No, score=-11.3 required=5.0 tests=BAYES_00, DKIMWL_WL_HIGH, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, RCVD_IN_DNSWL_BLOCKED, RCVD_IN_HOSTKARMA_W, RCVD_IN_MSPIKE_H5, RCVD_IN_MSPIKE_WL, RCVD_IN_SBL_CSS, SPF_HELO_PASS, SPF_NONE, TXREP shortcircuit=no autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on 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 Before this commit, the functions to read and write the execution log to a corefile would would have a large section dedicated to handling a single entry from the log. This commit factors out those large sections into their own functions, record_full_read_entry_from_bfd and record_full_write_entry_to_bfd, respectively. There should be no functional changes after this commit. Reviewed-By: Christina Schimpe --- gdb/record-full.c | 279 ++++++++++++++++++++++++---------------------- 1 file changed, 147 insertions(+), 132 deletions(-) diff --git a/gdb/record-full.c b/gdb/record-full.c index a6dfecd7d1f..7cfaab48aef 100644 --- a/gdb/record-full.c +++ b/gdb/record-full.c @@ -2186,6 +2186,83 @@ netorder32 (uint32_t input) return ret; } +static void +record_full_read_entry_from_bfd (bfd *cbfd, asection *osec, int *bfd_offset) +{ + uint8_t rectype; + uint32_t regnum, len; + uint64_t addr; + regcache *cache = get_thread_regcache (inferior_thread ()); + + bfdcore_read (cbfd, osec, &rectype, sizeof (rectype), bfd_offset); + + switch (rectype) + { + case record_full_reg: /* reg */ + { + /* Get register number to regnum. */ + bfdcore_read (cbfd, osec, ®num, sizeof (regnum), bfd_offset); + regnum = netorder32 (regnum); + + record_full_entry rec; + + rec = record_full_reg_init (cache, regnum); + + /* Get val. */ + bfdcore_read (cbfd, osec, record_full_get_loc (&rec), + rec.u.reg.len, bfd_offset); + + if (record_debug) + gdb_printf (gdb_stdlog, + " Reading register %d (1 " + "plus %lu plus %d bytes)\n", + rec.u.reg.num, + (unsigned long) sizeof (regnum), + rec.u.reg.len); + + record_full_arch_list_add (rec); + break; + } + + case record_full_mem: /* mem */ + { + /* Get len. */ + bfdcore_read (cbfd, osec, &len, sizeof (len), bfd_offset); + len = netorder32 (len); + + /* Get addr. */ + bfdcore_read (cbfd, osec, &addr, sizeof (addr), bfd_offset); + addr = netorder64 (addr); + + record_full_entry rec; + rec = record_full_mem_init (addr, len); + + /* Get val. */ + bfdcore_read (cbfd, osec, record_full_get_loc (&rec), + len, bfd_offset); + + if (record_debug) + gdb_printf (gdb_stdlog, + " Reading memory %s (1 plus " + "%lu plus %lu plus %d bytes)\n", + paddress (get_current_arch (), + rec.u.mem.addr), + (unsigned long) sizeof (addr), + (unsigned long) sizeof (len), + rec.u.mem.len); + + record_full_arch_list_add (rec); + break; + } + + default: + error (_("Bad entry type in core file %ps."), + styled_string (file_name_style.style (), + bfd_get_filename (cbfd))); + break; + } +} + /* Restore the execution log from core file CBFD. */ static void @@ -2229,13 +2306,10 @@ record_full_restore (struct bfd &cbfd) try { - regcache *regcache = get_thread_regcache (inferior_thread ()); - while (bfd_offset < osec_size) { - uint8_t rectype, sigval; - uint32_t regnum, len, eff_count, insn_num; - uint64_t addr; + uint8_t sigval; + uint32_t eff_count, insn_num; record_full_reset_incomplete (); @@ -2256,76 +2330,7 @@ record_full_restore (struct bfd &cbfd) { eff_count--; - bfdcore_read (&cbfd, osec, &rectype, sizeof (rectype), &bfd_offset); - - switch (rectype) - { - case record_full_reg: /* reg */ - { - /* Get register number to regnum. */ - bfdcore_read (&cbfd, osec, ®num, sizeof (regnum), - &bfd_offset); - regnum = netorder32 (regnum); - - record_full_entry rec; - - rec = record_full_reg_init (regcache, regnum); - - /* Get val. */ - bfdcore_read (&cbfd, osec, record_full_get_loc (&rec), - rec.u.reg.len, &bfd_offset); - - if (record_debug) - gdb_printf (gdb_stdlog, - " Reading register %d (1 " - "plus %lu plus %d bytes)\n", - rec.u.reg.num, - (unsigned long) sizeof (regnum), - rec.u.reg.len); - - record_full_arch_list_add (rec); - break; - } - - case record_full_mem: /* mem */ - { - /* Get len. */ - bfdcore_read (&cbfd, osec, &len, sizeof (len), - &bfd_offset); - len = netorder32 (len); - - /* Get addr. */ - bfdcore_read (&cbfd, osec, &addr, sizeof (addr), - &bfd_offset); - addr = netorder64 (addr); - - record_full_entry rec; - rec = record_full_mem_init (addr, len); - - /* Get val. */ - bfdcore_read (&cbfd, osec, record_full_get_loc (&rec), - len, &bfd_offset); - - if (record_debug) - gdb_printf (gdb_stdlog, - " Reading memory %s (1 plus " - "%lu plus %lu plus %d bytes)\n", - paddress (get_current_arch (), - rec.u.mem.addr), - (unsigned long) sizeof (addr), - (unsigned long) sizeof (len), - rec.u.mem.len); - - record_full_arch_list_add (rec); - break; - } - - default: - error (_("Bad entry type in core file %ps."), - styled_string (file_name_style.style (), - bfd_get_filename (&cbfd))); - break; - } + record_full_read_entry_from_bfd (&cbfd, osec, &bfd_offset); } record_full_save_instruction (); @@ -2382,6 +2387,71 @@ cmd_record_full_restore (const char *args, int from_tty) record_full_open (nullptr, from_tty); } +static void +record_full_write_entry_to_bfd (record_full_entry &entry, + gdb_bfd_ref_ptr obfd, + asection *osec, int *bfd_offset, + gdbarch *gdbarch) +{ + /* Save entry. */ + uint8_t type; + uint32_t regnum, len; + uint64_t addr; + + type = entry.type; + bfdcore_write (obfd.get (), osec, &type, sizeof (type), bfd_offset); + + switch (entry.type) + { + case record_full_reg: /* reg */ + if (record_debug) + gdb_printf (gdb_stdlog, + " Writing register %d (1 " + "plus %lu plus %d bytes)\n", + entry.u.reg.num, + (unsigned long) sizeof (regnum), + entry.u.reg.len); + + /* Write regnum. */ + regnum = netorder32 (entry.u.reg.num); + bfdcore_write (obfd.get (), osec, ®num, + sizeof (regnum), bfd_offset); + + /* Write regval. */ + bfdcore_write (obfd.get (), osec, + record_full_get_loc (&entry), + entry.u.reg.len, bfd_offset); + break; + + case record_full_mem: /* mem */ + if (record_debug) + gdb_printf (gdb_stdlog, + " Writing memory %s (1 plus " + "%lu plus %lu plus %d bytes)\n", + paddress (gdbarch, + entry.u.mem.addr), + (unsigned long) sizeof (addr), + (unsigned long) sizeof (len), + entry.u.mem.len); + + /* Write memlen. */ + len = netorder32 (entry.u.mem.len); + bfdcore_write (obfd.get (), osec, &len, sizeof (len), + bfd_offset); + + /* Write memaddr. */ + addr = netorder64 (entry.u.mem.addr); + bfdcore_write (obfd.get (), osec, &addr, + sizeof (addr), bfd_offset); + + /* Write memval. */ + bfdcore_write (obfd.get (), osec, + record_full_get_loc (&entry), + entry.u.mem.len, bfd_offset); + break; + } +} + /* Save the execution log to a file. We use a modified elf corefile format, with an extra section for our data. */ @@ -2483,63 +2553,8 @@ record_full_base_target::save_record (const char *recfilename) for (auto &entry : record_full_list[i].effects) { - /* Save entry. */ - uint8_t type; - uint32_t regnum, len; - uint64_t addr; - - type = entry.type; - bfdcore_write (obfd.get (), osec, &type, sizeof (type), &bfd_offset); - - switch (entry.type) - { - case record_full_reg: /* reg */ - if (record_debug) - gdb_printf (gdb_stdlog, - " Writing register %d (1 " - "plus %lu plus %d bytes)\n", - entry.u.reg.num, - (unsigned long) sizeof (regnum), - entry.u.reg.len); - - /* Write regnum. */ - regnum = netorder32 (entry.u.reg.num); - bfdcore_write (obfd.get (), osec, ®num, - sizeof (regnum), &bfd_offset); - - /* Write regval. */ - bfdcore_write (obfd.get (), osec, - record_full_get_loc (&entry), - entry.u.reg.len, &bfd_offset); - break; - - case record_full_mem: /* mem */ - if (record_debug) - gdb_printf (gdb_stdlog, - " Writing memory %s (1 plus " - "%lu plus %lu plus %d bytes)\n", - paddress (gdbarch, - entry.u.mem.addr), - (unsigned long) sizeof (addr), - (unsigned long) sizeof (len), - entry.u.mem.len); - - /* Write memlen. */ - len = netorder32 (entry.u.mem.len); - bfdcore_write (obfd.get (), osec, &len, sizeof (len), - &bfd_offset); - - /* Write memaddr. */ - addr = netorder64 (entry.u.mem.addr); - bfdcore_write (obfd.get (), osec, &addr, - sizeof (addr), &bfd_offset); - - /* Write memval. */ - bfdcore_write (obfd.get (), osec, - record_full_get_loc (&entry), - entry.u.mem.len, &bfd_offset); - break; - } + record_full_write_entry_to_bfd (entry, obfd, osec, &bfd_offset, + gdbarch); } if (i < record_full_next_insn)