From patchwork Tue May 2 18:34:44 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Mark Wielaard X-Patchwork-Id: 68635 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 EFCDF3858421 for ; Tue, 2 May 2023 18:35:20 +0000 (GMT) X-Original-To: gdb-patches@sourceware.org Delivered-To: gdb-patches@sourceware.org Received: from gnu.wildebeest.org (gnu.wildebeest.org [45.83.234.184]) by sourceware.org (Postfix) with ESMTPS id 545D4385771A for ; Tue, 2 May 2023 18:35:06 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 545D4385771A Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=klomp.org Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=klomp.org Received: from csb.redhat.com (213-10-231-91.fixed.kpn.net [213.10.231.91]) (using TLSv1.2 with cipher ADH-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by gnu.wildebeest.org (Postfix) with ESMTPSA id 16C52302BB02; Tue, 2 May 2023 20:35:04 +0200 (CEST) Received: by csb.redhat.com (Postfix, from userid 10916) id B72BC9F7B2; Tue, 2 May 2023 20:35:04 +0200 (CEST) From: Mark Wielaard To: gdb-patches@sourceware.org Cc: Tom Tromey , Mark Wielaard Subject: [PATCH] Pass const frame_info_ptr reference for skip_[language_]trampoline Date: Tue, 2 May 2023 20:34:44 +0200 Message-Id: <20230502183444.1445634-1-mark@klomp.org> X-Mailer: git-send-email 2.31.1 MIME-Version: 1.0 X-Spam-Status: No, score=-3036.4 required=5.0 tests=BAYES_00, GIT_PATCH_0, JMQ_SPF_NEUTRAL, KAM_DMARC_STATUS, SPF_HELO_NONE, SPF_PASS, 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.29 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 Sender: "Gdb-patches" g++ 13.1.1 produces a -Werror=dangling-pointer= In file included from ../../binutils-gdb/gdb/frame.h:75, from ../../binutils-gdb/gdb/symtab.h:40, from ../../binutils-gdb/gdb/language.c:33: In member function ‘void intrusive_list::push_empty(T&) [with T = frame_info_ptr; AsNode = intrusive_base_node]’, inlined from ‘void intrusive_list::push_back(reference) [with T = frame_info_ptr; AsNode = intrusive_base_node]’ at gdbsupport/intrusive_list.h:332:24, inlined from ‘frame_info_ptr::frame_info_ptr(const frame_info_ptr&)’ at gdb/frame.h:241:26, inlined from ‘CORE_ADDR skip_language_trampoline(frame_info_ptr, CORE_ADDR)’ at gdb/language.c:530:49: gdbsupport/intrusive_list.h:415:12: error: storing the address of local variable ‘’ in ‘frame_info_ptr::frame_list.intrusive_list::m_back’ [-Werror=dangling-pointer=] 415 | m_back = &elem; | ~~~~~~~^~~~~~~ gdb/language.c: In function ‘CORE_ADDR skip_language_trampoline(frame_info_ptr, CORE_ADDR)’: gdb/language.c:530:49: note: ‘’ declared here 530 | CORE_ADDR real_pc = lang->skip_trampoline (frame, pc); | ~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~ gdb/frame.h:359:41: note: ‘frame_info_ptr::frame_list’ declared here 359 | static intrusive_list frame_list; | ^~~~~~~~~~ Each new frame_info_ptr is being pushed on a static frame list and g++ cannot see why that is safe in case the frame_info_ptr is created and destroyed immediately when passed as value. It isn't clear why only in this one place g++ sees the issue (probably because it can inlined enough code in this specific case). Since passing the frame_info_ptr as const reference is cheaper, use that as workaround for this warning. Tested-by: Kevin Buettner Reviewed-by: Kevin Buettner Reviewed-By: Tom Tromey --- gdb/c-lang.c | 2 +- gdb/language.c | 2 +- gdb/language.h | 4 ++-- gdb/objc-lang.c | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/gdb/c-lang.c b/gdb/c-lang.c index 6535ab93498..484f81e455b 100644 --- a/gdb/c-lang.c +++ b/gdb/c-lang.c @@ -1002,7 +1002,7 @@ class cplus_language : public language_defn /* See language.h. */ - CORE_ADDR skip_trampoline (frame_info_ptr fi, + CORE_ADDR skip_trampoline (const frame_info_ptr &fi, CORE_ADDR pc) const override { return cplus_skip_trampoline (fi, pc); diff --git a/gdb/language.c b/gdb/language.c index 0b4202ff839..f82c5b173b3 100644 --- a/gdb/language.c +++ b/gdb/language.c @@ -523,7 +523,7 @@ add_set_language_command () Return the result from the first that returns non-zero, or 0 if all `fail'. */ CORE_ADDR -skip_language_trampoline (frame_info_ptr frame, CORE_ADDR pc) +skip_language_trampoline (const frame_info_ptr &frame, CORE_ADDR pc) { for (const auto &lang : language_defn::languages) { diff --git a/gdb/language.h b/gdb/language.h index 4c91776d94d..0ebd4c1d957 100644 --- a/gdb/language.h +++ b/gdb/language.h @@ -471,7 +471,7 @@ struct language_defn If that PC falls in a trampoline belonging to this language, return the address of the first pc in the real function, or 0 if it isn't a language tramp for this language. */ - virtual CORE_ADDR skip_trampoline (frame_info_ptr fi, CORE_ADDR pc) const + virtual CORE_ADDR skip_trampoline (const frame_info_ptr &fi, CORE_ADDR pc) const { return (CORE_ADDR) 0; } @@ -790,7 +790,7 @@ extern const char *language_str (enum language); /* Check for a language-specific trampoline. */ -extern CORE_ADDR skip_language_trampoline (frame_info_ptr, CORE_ADDR pc); +extern CORE_ADDR skip_language_trampoline (const frame_info_ptr &, CORE_ADDR pc); /* Return information about whether TYPE should be passed (and returned) by reference at the language level. */ diff --git a/gdb/objc-lang.c b/gdb/objc-lang.c index ccbe7c19729..6af25d9c988 100644 --- a/gdb/objc-lang.c +++ b/gdb/objc-lang.c @@ -282,7 +282,7 @@ class objc_language : public language_defn /* See language.h. */ - CORE_ADDR skip_trampoline (frame_info_ptr frame, + CORE_ADDR skip_trampoline (const frame_info_ptr &frame, CORE_ADDR stop_pc) const override { struct gdbarch *gdbarch = get_frame_arch (frame);