From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from simark.ca by simark.ca with LMTP id 6Fz8NbGitmAgaQAAWB0awg (envelope-from ) for ; Tue, 01 Jun 2021 17:12:17 -0400 Received: by simark.ca (Postfix, from userid 112) id CDE9E1F163; Tue, 1 Jun 2021 17:12:17 -0400 (EDT) X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on simark.ca X-Spam-Level: X-Spam-Status: No, score=-0.6 required=5.0 tests=MAILING_LIST_MULTI, RCVD_IN_MSPIKE_H2,RDNS_DYNAMIC,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.2 Received: from sourceware.org (ip-8-43-85-97.sourceware.org [8.43.85.97]) (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 simark.ca (Postfix) with ESMTPS id 2F3E21E813 for ; Tue, 1 Jun 2021 17:12:17 -0400 (EDT) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 759D5398980F for ; Tue, 1 Jun 2021 21:12:16 +0000 (GMT) Received: from mail.baldwin.cx (bigwig.baldwin.cx [66.216.25.90]) by sourceware.org (Postfix) with ESMTPS id 16EBB3835800 for ; Tue, 1 Jun 2021 21:12:05 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 16EBB3835800 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=FreeBSD.org Authentication-Results: sourceware.org; spf=fail smtp.mailfrom=FreeBSD.org Received: from gimli.baldwin.cx (ralph.baldwin.cx [66.234.199.215]) by mail.baldwin.cx (Postfix) with ESMTPSA id A6DC31A84BC2 for ; Tue, 1 Jun 2021 17:12:02 -0400 (EDT) From: John Baldwin To: gdb-patches@sourceware.org Subject: [PATCH v2] Conditionally restore displaced stepping state after fork. Date: Tue, 1 Jun 2021 14:11:37 -0700 Message-Id: <20210601211137.83647-1-jhb@FreeBSD.org> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20210531161558.10600-1-jhb@FreeBSD.org> References: <20210531161558.10600-1-jhb@FreeBSD.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Greylist: Sender succeeded SMTP AUTH, not delayed by milter-greylist-4.6.4 (mail.baldwin.cx [0.0.0.0]); Tue, 01 Jun 2021 17:12:03 -0400 (EDT) X-Virus-Scanned: clamav-milter 0.103.1 at mail.baldwin.cx X-Virus-Status: Clean X-BeenThere: gdb-patches@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gdb-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: gdb-patches-bounces+public-inbox=simark.ca@sourceware.org Sender: "Gdb-patches" There is no default method for gdbarch_displaced_step_restore_all_in_ptid, so calling it unconditionally for fork events triggered an assertion failure on platforms that do not support displaced stepping. To fix, only invoke the method if the gdbarch supports displaced stepping. Note that not all gdbarches support both displaced stepping and fork events, so gdbarch validation does not require gdbarch_displaced_step_restore_all_in_ptid for any gdbarch supporting displaced stepping. However, the internal assertion in gdbarch_displaced_step_restore_all_in_ptid should catch any gdbarches which do support both but fail to provide this method. gdb/ChangeLog: * infrun.c (handle_inferior_event): Only call gdbarch_displaced_step_restore_all_in_ptid if gdbarch_supports_displaced_stepping is true. --- gdb/ChangeLog | 6 ++++++ gdb/infrun.c | 16 ++++++++++++---- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 03910c0634..b0f448a35e 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,9 @@ +2021-05-30 John Baldwin + + * infrun.c (handle_inferior_event): Only call + gdbarch_displaced_step_restore_all_in_ptid if + gdbarch_supports_displaced_stepping is true. + 2021-05-27 Simon Marchi * Fix tab after space indentation issues throughout. diff --git a/gdb/infrun.c b/gdb/infrun.c index e9624d2a9b..488bcc1e10 100644 --- a/gdb/infrun.c +++ b/gdb/infrun.c @@ -5493,10 +5493,18 @@ handle_inferior_event (struct execution_control_state *ecs) struct gdbarch *gdbarch = regcache->arch (); inferior *parent_inf = find_inferior_ptid (ecs->target, ecs->ptid); - /* If this is a fork (child gets its own address space copy) and some - displaced step buffers were in use at the time of the fork, restore - the displaced step buffer bytes in the child process. */ - if (ecs->ws.kind == TARGET_WAITKIND_FORKED) + /* If this is a fork (child gets its own address space copy) + and some displaced step buffers were in use at the time of + the fork, restore the displaced step buffer bytes in the + child process. + + Architectures which support displaced stepping and fork + events must supply an implementation of + gdbarch_displaced_step_restore_all_in_ptid. This is not + enforced during gdbarch validation to support architectures + which support displaced stepping but not forks. */ + if (ecs->ws.kind == TARGET_WAITKIND_FORKED + && gdbarch_supports_displaced_stepping (gdbarch)) gdbarch_displaced_step_restore_all_in_ptid (gdbarch, parent_inf, ecs->ws.value.related_pid); -- 2.31.1