From patchwork Wed Dec 14 03:34:36 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Simon Marchi X-Patchwork-Id: 61894 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 6D83138378D0 for ; Wed, 14 Dec 2022 03:37:15 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 6D83138378D0 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1670989035; bh=mQD4wO0kBncy8wvNuGI8a/SJtD427cclO+lKhXgSlOs=; h=To:Cc:Subject:Date:In-Reply-To:References:List-Id: List-Unsubscribe:List-Archive:List-Post:List-Help:List-Subscribe: From:Reply-To:From; b=Gr1Kpb3sT2OF3HOVRTZqCjG4JXEqrEDezsVxCKiBXuFnprOZhejA8b4+K1M+mCdDz DO9ElFmYtlR43JCmhCWj0TxFqHLhTzuoi+U7JdXLDblxmkYPV/Qf9L38Hpzm11sz0x 9vekTX8lkmfnWptKWjYH5vdJktqk1olxyK00eP1U= 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 B3B2A38378CE for ; Wed, 14 Dec 2022 03:36:50 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org B3B2A38378CE 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 2BE3ajBc029856 (version=TLSv1/SSLv3 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 13 Dec 2022 22:36:49 -0500 DKIM-Filter: OpenDKIM Filter v2.11.0 smtp.polymtl.ca 2BE3ajBc029856 Received: from simark.localdomain (unknown [217.28.27.60]) (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 ESMTPSA id 017BC1E0CD; Tue, 13 Dec 2022 22:36:44 -0500 (EST) To: gdb-patches@sourceware.org Cc: Simon Marchi Subject: [PATCH v2 08/13] gdb: add user-created frames to stash Date: Tue, 13 Dec 2022 22:34:36 -0500 Message-Id: <20221214033441.499512-9-simon.marchi@polymtl.ca> X-Mailer: git-send-email 2.38.1 In-Reply-To: <20221214033441.499512-1-simon.marchi@polymtl.ca> References: <20221214033441.499512-1-simon.marchi@polymtl.ca> MIME-Version: 1.0 X-Poly-FromMTA: (simark.ca [158.69.221.121]) at Wed, 14 Dec 2022 03:36:45 +0000 X-Spam-Status: No, score=-3189.5 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_PASS, TXREP 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.29 Precedence: list List-Id: Gdb-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Simon Marchi via Gdb-patches From: Simon Marchi Reply-To: Simon Marchi Errors-To: gdb-patches-bounces+patchwork=sourceware.org@sourceware.org Sender: "Gdb-patches" A subsequent patch makes it possible for frame_info_ptr to reinflate user-created frames. If two frame_info_ptr objects wrapping the same user-created frame_info need to do reinflation, we want them to end up pointing to the same frame_info instance, and not create two separate frame_infos. Otherwise, GDB gets confused down the line, as the state kept in one frame_info object starts differing from the other frame_info. Achieve this by making create_new_frame place the user-created frames in the frame stash. This way, when the second frame_info_ptr does reinflation, it will find the existing frame_info object, created by the other frame_info_ptr, in the frame stash. To make the frame stash differentiate between regular and user-created frame infos which would otherwise be equal, change frame_addr_hash and frame_id::operator== to account for frame_id::user_created_p. I made create_new_frame look up existing frames in the stash, and only create one if it doesn't find one. The goal is to avoid the "select-frame view"/"info frame view"/"frame view" commands from overriding existing entries into the stash, should the user specify the same frame more than once. This will also help in the subsequent patch that makes frame_info_ptr capable of reinflating user-created frames. It will be able to just call create_new_frame and it will do the right thing. Change-Id: I14ba5799012056c007b4992ecb5c7adafd0c2404 --- gdb/frame.c | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/gdb/frame.c b/gdb/frame.c index 1010f82d4738..528ad76b58de 100644 --- a/gdb/frame.c +++ b/gdb/frame.c @@ -240,6 +240,9 @@ frame_addr_hash (const void *ap) hash = iterative_hash (&f_id.special_addr, sizeof (f_id.special_addr), hash); + char user_created_p = f_id.user_created_p; + hash = iterative_hash (&user_created_p, sizeof (user_created_p), hash); + return hash; } @@ -775,6 +778,8 @@ frame_id::operator== (const frame_id &r) const else if (artificial_depth != r.artificial_depth) /* If artificial depths are different, the frames must be different. */ eq = false; + else if (user_created_p != r.user_created_p) + eq = false; else /* Frames are equal. */ eq = true; @@ -1931,6 +1936,14 @@ create_new_frame (CORE_ADDR addr, CORE_ADDR pc) frame_debug_printf ("addr=%s, pc=%s", hex_string (addr), hex_string (pc)); + /* Avoid creating duplicate frames, search for an existing frame with that id + in the stash. */ + frame_id id = frame_id_build (addr, pc); + id.user_created_p = 1; + frame_info_ptr frame = frame_stash_find (id); + if (frame != nullptr) + return frame; + fi = FRAME_OBSTACK_ZALLOC (struct frame_info); fi->next = create_sentinel_frame (current_program_space, @@ -1952,8 +1965,10 @@ create_new_frame (CORE_ADDR addr, CORE_ADDR pc) frame_unwind_find_by_frame (frame_info_ptr (fi), &fi->prologue_cache); fi->this_id.p = frame_id_status::COMPUTED; - fi->this_id.value = frame_id_build (addr, pc); - fi->this_id.value.user_created_p = 1; + fi->this_id.value = id; + + bool added = frame_stash_add (fi); + gdb_assert (added); frame_debug_printf (" -> %s", fi->to_string ().c_str ());