From patchwork Wed Mar 8 13:26:07 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Matti Puputti X-Patchwork-Id: 66129 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 A1E353850855 for ; Wed, 8 Mar 2023 13:27:03 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org A1E353850855 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1678282023; bh=mN1bxjMXRY1547fRAdXrUR4yslqRWselmhyg5+wqD4A=; h=To:Subject:Date:In-Reply-To:References:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To: From; b=laiwrwjKMsegp1fUno+YQQdm2/UHhwKOfiKC6ztdZ3Tbx51SSqZgn5eWPGR6pfls6 AVeYtBtEhhJgbpmVrfyJHdIfKYB8xyE62NKbkzIWaPLgHf1Wb9srteGtObpdwSCmMU nCj3XFbEcfaPfmpbtkvZW2pEPdHnpXOQSNUWzbTg= X-Original-To: gdb-patches@sourceware.org Delivered-To: gdb-patches@sourceware.org Received: from mga04.intel.com (mga04.intel.com [192.55.52.120]) by sourceware.org (Postfix) with ESMTPS id A95973851160 for ; Wed, 8 Mar 2023 13:26:39 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org A95973851160 X-IronPort-AV: E=McAfee;i="6500,9779,10642"; a="334862096" X-IronPort-AV: E=Sophos;i="5.98,243,1673942400"; d="scan'208";a="334862096" Received: from orsmga002.jf.intel.com ([10.7.209.21]) by fmsmga104.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 08 Mar 2023 05:26:38 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6500,9779,10642"; a="676969561" X-IronPort-AV: E=Sophos;i="5.98,243,1673942400"; d="scan'208";a="676969561" Received: from ull-mpuputti-02.iul.intel.com (HELO localhost) ([172.28.49.83]) by orsmga002-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 08 Mar 2023 05:26:31 -0800 To: gdb-patches@sourceware.org Subject: [PATCH 1/1] gdb, infcmd: Support jump command with same line in multiple object files. Date: Wed, 8 Mar 2023 14:26:07 +0100 Message-Id: <20230308132607.1674441-2-matti.puputti@intel.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20230308132607.1674441-1-matti.puputti@intel.com> References: <20230308132607.1674441-1-matti.puputti@intel.com> MIME-Version: 1.0 X-Spam-Status: No, score=-9.8 required=5.0 tests=BAYES_00, DKIMWL_WL_HIGH, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, KAM_SHORT, SPF_HELO_NONE, SPF_NONE, 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: Matti Puputti via Gdb-patches From: Matti Puputti Reply-To: Matti Puputti Errors-To: gdb-patches-bounces+patchwork=sourceware.org@sourceware.org Sender: "Gdb-patches" If the jump target is found in multiple object files, select the one in the current object file. --- gdb/infcmd.c | 14 ++++++- gdb/testsuite/gdb.base/jump2.c | 29 +++++++++++++++ gdb/testsuite/gdb.base/jump2.exp | 59 ++++++++++++++++++++++++++++++ gdb/testsuite/gdb.base/jump2.h | 30 +++++++++++++++ gdb/testsuite/gdb.base/jump2_foo.c | 24 ++++++++++++ 5 files changed, 155 insertions(+), 1 deletion(-) create mode 100755 gdb/testsuite/gdb.base/jump2.c create mode 100755 gdb/testsuite/gdb.base/jump2.exp create mode 100755 gdb/testsuite/gdb.base/jump2.h create mode 100755 gdb/testsuite/gdb.base/jump2_foo.c diff --git a/gdb/infcmd.c b/gdb/infcmd.c index c369b795757..1b91562f137 100644 --- a/gdb/infcmd.c +++ b/gdb/infcmd.c @@ -1080,7 +1080,19 @@ jump_command (const char *arg, int from_tty) std::vector sals = decode_line_with_last_displayed (arg, DECODE_LINE_FUNFIRSTLINE); if (sals.size () != 1) - error (_("Unreasonable jump request")); + { + /* If multiple sal-objects were found, try dropping those that aren't + from the current objectfile. */ + sals.erase (std::remove_if (sals.begin (), sals.end (), + [] (symtab_and_line &sal) + { + struct symtab_and_line cursal + = get_current_source_symtab_and_line (); + return sal.symtab != cursal.symtab; + }), sals.end ()); + if (sals.size () != 1) + error (_("Unreasonable jump request")); + } symtab_and_line &sal = sals[0]; diff --git a/gdb/testsuite/gdb.base/jump2.c b/gdb/testsuite/gdb.base/jump2.c new file mode 100755 index 00000000000..468838a9d1a --- /dev/null +++ b/gdb/testsuite/gdb.base/jump2.c @@ -0,0 +1,29 @@ +/* This testcase is part of GDB, the GNU debugger. + + Copyright 2021-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 . */ + +#include "jump2.h" + +extern int foo (int n); + + +int main () +{ + int n = foo (1); + bar (n); + + return 0; +} diff --git a/gdb/testsuite/gdb.base/jump2.exp b/gdb/testsuite/gdb.base/jump2.exp new file mode 100755 index 00000000000..f6bc29dfe1c --- /dev/null +++ b/gdb/testsuite/gdb.base/jump2.exp @@ -0,0 +1,59 @@ +# Copyright 2021-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 . */ +# +# Tests GDBs support for jump, when the source line is in multiple +# object files. + + +standard_testfile .c +set srcfile2 jump2_foo.c +set srcfile3 jump2.h + + +if { [prepare_for_testing "failed to prepare" $testfile \ + [list ${srcfile} ${srcfile2}]] } { + return -1 +} + +if { ![runto_main] } { + perror "couldn't run to breakpoint" + return -1 +} + + +set bar_first_line [gdb_get_line_number "bar-first-line" ${srcfile3}] +set bar_middle_line [gdb_get_line_number "bar-middle-line" ${srcfile3}] +set bar_last_line [gdb_get_line_number "bar-last-line" ${srcfile3}] + + +# Set breakpoints in the function bar. Executable has two object files, +# and both have a copy of the same source lines. Therefore breakpoints +# will have two locations. +gdb_test "break ${srcfile3}:${bar_first_line}" \ + "Breakpoint.* at .*${srcfile3}:${bar_first_line}\\\. \\\(2 locations\\\)" +gdb_test "break ${srcfile3}:${bar_last_line}" \ + "Breakpoint.* at .*${srcfile3}:${bar_last_line}\\\. \\\(2 locations\\\)" + +# Run to the breakpoint in bar. +gdb_continue_to_breakpoint "bar_first_line" \ + ".*${srcfile3}:${bar_first_line}.*" + +# Jump within the function. Debugger shall be able to jump, even if the +# target line is in two different object files. After jump, we will hit +# the breakpoint at the last line of bar. +gdb_test "jump ${bar_middle_line}" [multi_line \ + "Continuing at ($hex).*" \ + "Breakpoint ${decimal}.* at .*${srcfile3}:${bar_last_line}.*"] \ + "Jump within the objectfile" diff --git a/gdb/testsuite/gdb.base/jump2.h b/gdb/testsuite/gdb.base/jump2.h new file mode 100755 index 00000000000..5e3849cb3cb --- /dev/null +++ b/gdb/testsuite/gdb.base/jump2.h @@ -0,0 +1,30 @@ +/* Copyright (C) 2021-2023 Free Software Foundation, Inc. + + This file is part of GDB. + + 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 . */ + +#ifndef JUMP2_H +#define JUMP2_H + +static int +bar (int n) +{ + int retval = n; + retval += 1; /* bar-first-line */ + retval *= -1; /* bar-middle-line */ + return retval; /* bar-last-line */ +} + +#endif /* JUMP2_H */ diff --git a/gdb/testsuite/gdb.base/jump2_foo.c b/gdb/testsuite/gdb.base/jump2_foo.c new file mode 100755 index 00000000000..667f2398551 --- /dev/null +++ b/gdb/testsuite/gdb.base/jump2_foo.c @@ -0,0 +1,24 @@ +/* This testcase is part of GDB, the GNU debugger. + + Copyright 2021-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 . */ + +#include "jump2.h" + +int +foo (int n) +{ + return bar (n); +}