From patchwork Tue Mar 28 18:48:09 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Maciej W. Rozycki" X-Patchwork-Id: 67045 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 329BE3857C48 for ; Tue, 28 Mar 2023 18:48:29 +0000 (GMT) X-Original-To: gdb-patches@sourceware.org Delivered-To: gdb-patches@sourceware.org Received: from mail-ed1-x52e.google.com (mail-ed1-x52e.google.com [IPv6:2a00:1450:4864:20::52e]) by sourceware.org (Postfix) with ESMTPS id 6CC4C3858C53 for ; Tue, 28 Mar 2023 18:48:13 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 6CC4C3858C53 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=embecosm.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=embecosm.com Received: by mail-ed1-x52e.google.com with SMTP id h8so53647950ede.8 for ; Tue, 28 Mar 2023 11:48:13 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=embecosm.com; s=google; t=1680029291; h=mime-version:user-agent:references:message-id:in-reply-to:subject :cc:to:from:date:from:to:cc:subject:date:message-id:reply-to; bh=+bo3UDTGWEvfsB0FsfzpD+hb9cs8YcHwK/gnCdi5SRM=; b=E+rg7OpPVnIm1ymWEWrH0zooLK+8eLOiDHissLPZW50QwNZW/8sOTaCZr/f0oxI0Mm zFGU+wpAJWPPUmEck0LurG627Dy3i+1FJt/MnChwL7Gw6mPjNtSu6wkGaAImiBrbcGZA b74hxUPd/+vKAiKc2bg5B2vZaXyCTKP5BWDf9g5xUUbmfVyCSbixdb4ekTTGJ4O2ft+A fqPYs3VYm1b3lAv/Lr9gJN+ADNYlmJlR5bqRfbAw1cBhM1zH0qlTiszvNs0YRYedrdFs TzIcz8Eb+lmRyzGWqgGwzd8cARcT0EZb7VjEY5JcAFRlE5nrXJzR61+hl2Vu7XLluqa7 FSzQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; t=1680029291; h=mime-version:user-agent:references:message-id:in-reply-to:subject :cc:to:from:date:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=+bo3UDTGWEvfsB0FsfzpD+hb9cs8YcHwK/gnCdi5SRM=; b=LePmUaca9jAYcXTHf4mdot0dpF3eg9ElHhCeFTVNaO6Au0alSb5Vmq+zkfVB0ZyjI3 WEb5sQEBrAQ+g8S7RHEacWeM3DLQP1vcm/rn6qpJcgjwTW3PbxsopoYo4mVq46BM+HcG T7uV47e/b/QxhHbBJ8qXewMNigSDnzVv8ZneIrWVo5jiRgEGo1kgla3Ak9cUEuQwr0G0 ulydzh+11WPKmZuo0qXMoSjH8zBCyv6/2qAJ4sMPHgvOfEYKPTh/AKIShl9o6G7SyNPz l+VyssqR2Z2bEwKPRuP60oDXuJe6su6tkxf5R0F1KJHKjJFTsoXRLZ1v8NyZu4yEG7Jd 7Xog== X-Gm-Message-State: AAQBX9cq4f8MU1ek4PBOZyY8q7MMeqaN6tUmH49T/v43gnTxKCWvkKRG AI5LMWXK/8XSJoFsJ0ELgPFFnnaCDw0/XsohLBs= X-Google-Smtp-Source: AKy350Zq4Y5g8MHgEri1ll51xWN4+pbkFEkq92ysmB/SJPW5rLJaZqAjWFB9S92iYNbf6okN+xsKfA== X-Received: by 2002:a17:906:7090:b0:885:a62c:5a5c with SMTP id b16-20020a170906709000b00885a62c5a5cmr16409628ejk.46.1680029291679; Tue, 28 Mar 2023 11:48:11 -0700 (PDT) Received: from annie.orcam.me.uk (annie.orcam.me.uk. [2001:4190:8020::48]) by smtp.gmail.com with ESMTPSA id g13-20020a170906198d00b008c16025b318sm15527715ejd.155.2023.03.28.11.48.10 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Tue, 28 Mar 2023 11:48:11 -0700 (PDT) Date: Tue, 28 Mar 2023 19:48:09 +0100 (BST) From: "Maciej W. Rozycki" To: gdb-patches@sourceware.org cc: Richard Bunt Subject: [PATCH v2 1/3] GDB: Favor full symbol main name for backtrace stop In-Reply-To: Message-ID: References: User-Agent: Alpine 2.20 (DEB 67 2015-01-07) MIME-Version: 1.0 X-Spam-Status: No, score=-2.1 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, KAM_ASCII_DIVIDERS, KAM_SHORT, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=no 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" From: Richard Bunt In the case where a Fortran program has a program name of "main" and there is also a minimal symbol called main, such as with programs built with GCC version 4.4.7 or below, the backtrace will erroneously stop at the minimal symbol rather than the user specified main, e.g.: (gdb) bt #0 bar () at .../gdb/testsuite/gdb.fortran/backtrace.f90:17 #1 0x0000000000402556 in foo () at .../gdb/testsuite/gdb.fortran/backtrace.f90:21 #2 0x0000000000402575 in main () at .../gdb/testsuite/gdb.fortran/backtrace.f90:31 #3 0x00000000004025aa in main () (gdb) This patch fixes this issue by increasing the precedence of the full symbol when the language of the current frame is Fortran. Newer versions of GCC transform the program name to "MAIN__" in this case, avoiding the problem. Co-Authored-By: Maciej W. Rozycki --- Changes from v1: - Remove testsuite status mistakenly copied to the change description. --- gdb/frame.c | 25 ++++++++++++--------- gdb/testsuite/gdb.fortran/backtrace.exp | 38 ++++++++++++++++++++++++++++++++ gdb/testsuite/gdb.fortran/backtrace.f90 | 32 ++++++++++++++++++++++++++ 3 files changed, 85 insertions(+), 10 deletions(-) gdb-richard-favour-full-symbol-main-name-for-backtrace-stop.diff Index: src/gdb/frame.c =================================================================== --- src.orig/gdb/frame.c +++ src/gdb/frame.c @@ -2542,29 +2542,34 @@ inside_main_func (frame_info_ptr this_fr bound_minimal_symbol msymbol = lookup_minimal_symbol (name, NULL, current_program_space->symfile_object_file); - if (msymbol.minsym == nullptr) + + if (msymbol.minsym != nullptr) + sym_addr = msymbol.value_address (); + + /* Favor a full symbol in Fortran, for the case where the Fortran main + is also called "main". */ + if (msymbol.minsym == nullptr + || get_frame_language (this_frame) == language_fortran) { /* In some language (for example Fortran) there will be no minimal symbol with the name of the main function. In this case we should search the full symbols to see if we can find a match. */ struct block_symbol bs = lookup_symbol (name, NULL, VAR_DOMAIN, 0); - if (bs.symbol == nullptr) - return false; /* We might have found some unrelated symbol. For example, the Rust compiler can emit both a subprogram and a namespace with the same name in the same scope; and due to how gdb's symbol tables currently work, we can't request the one we'd prefer. */ - if (bs.symbol->aclass () != LOC_BLOCK) + if (bs.symbol != nullptr && bs.symbol->aclass () == LOC_BLOCK) + { + const struct block *block = bs.symbol->value_block (); + gdb_assert (block != nullptr); + sym_addr = block->start (); + } + else if (msymbol.minsym == nullptr) return false; - - const struct block *block = bs.symbol->value_block (); - gdb_assert (block != nullptr); - sym_addr = block->start (); } - else - sym_addr = msymbol.value_address (); /* Convert any function descriptor addresses into the actual function code address. */ Index: src/gdb/testsuite/gdb.fortran/backtrace.exp =================================================================== --- /dev/null +++ src/gdb/testsuite/gdb.fortran/backtrace.exp @@ -0,0 +1,38 @@ +# Copyright 2023 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +require allow_fortran_tests + +load_lib fortran.exp + +standard_testfile .f90 + +if {[prepare_for_testing ${testfile}.exp ${testfile} ${srcfile} {debug f90}]} { + return -1 +} + +if {![fortran_runto_main]} { + perror "Could not run to main." + return +} + +gdb_breakpoint [gdb_get_line_number "Break here"] +gdb_continue_to_breakpoint "continue to bar" + +gdb_test "bt" \ + [multi_line \ + "#0\[ \t\]*bar \\(\\) at \[^\r\n\]+" \ + "#1\[ \t\]*$hex in foo \\(\\) at \[^\r\n\]+" \ + "#2\[ \t\]*$hex in \(?:MAIN__\|main\) \\(\\) at \[^\r\n\]+" ] Index: src/gdb/testsuite/gdb.fortran/backtrace.f90 =================================================================== --- /dev/null +++ src/gdb/testsuite/gdb.fortran/backtrace.f90 @@ -0,0 +1,32 @@ +! Copyright 2023 Free Software Foundation, Inc. +! +! This program is free software; you can redistribute it and/or modify +! it under the terms of the GNU General Public License as published by +! the Free Software Foundation; either version 3 of the License, or +! (at your option) any later version. +! +! This program is distributed in the hope that it will be useful, +! but WITHOUT ANY WARRANTY; without even the implied warranty of +! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +! GNU General Public License for more details. +! +! You should have received a copy of the GNU General Public License +! along with this program. If not, see . + +subroutine bar () + return ! Break here +end subroutine bar + +subroutine foo () + call bar () +end subroutine foo + +program main + interface + subroutine bar () + end subroutine bar + subroutine foo () + end subroutine foo + end interface + call foo () +end program main