Message ID | 20230308132607.1674441-2-matti.puputti@intel.com |
---|---|
State | New |
Headers |
Return-Path: <gdb-patches-bounces+patchwork=sourceware.org@sourceware.org> 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 <patchwork@sourceware.org>; 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 <gdb-patches@sourceware.org>; 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 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit 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 <gdb-patches.sourceware.org> List-Unsubscribe: <https://sourceware.org/mailman/options/gdb-patches>, <mailto:gdb-patches-request@sourceware.org?subject=unsubscribe> List-Archive: <https://sourceware.org/pipermail/gdb-patches/> List-Post: <mailto:gdb-patches@sourceware.org> List-Help: <mailto:gdb-patches-request@sourceware.org?subject=help> List-Subscribe: <https://sourceware.org/mailman/listinfo/gdb-patches>, <mailto:gdb-patches-request@sourceware.org?subject=subscribe> From: Matti Puputti via Gdb-patches <gdb-patches@sourceware.org> Reply-To: Matti Puputti <matti.puputti@intel.com> Errors-To: gdb-patches-bounces+patchwork=sourceware.org@sourceware.org Sender: "Gdb-patches" <gdb-patches-bounces+patchwork=sourceware.org@sourceware.org> |
Series |
gdb, infcmd: Support jump command with same line in multiple object files.
|
|
Commit Message
Matti Puputti
March 8, 2023, 1:26 p.m. UTC
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
Comments
Gently pinging for a review. Br, Matti Puputti > -----Original Message----- > From: Gdb-patches <gdb-patches- > bounces+matti.puputti=intel.com@sourceware.org> On Behalf Of Matti > Puputti via Gdb-patches > Sent: Wednesday, March 8, 2023 2:26 PM > To: gdb-patches@sourceware.org > Subject: [PATCH 1/1] gdb, infcmd: Support jump command with same line in > multiple object files. > > 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<symtab_and_line> 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 <http://www.gnu.org/licenses/>. */ > + > +#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 <http://www.gnu.org/licenses/>. */ > +# > +# 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 <http://www.gnu.org/licenses/>. */ > + > +#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 <http://www.gnu.org/licenses/>. */ > + > +#include "jump2.h" > + > +int > +foo (int n) > +{ > + return bar (n); > +} > -- > 2.25.1 > > Intel Deutschland GmbH > Registered Address: Am Campeon 10, 85579 Neubiberg, Germany > Tel: +49 89 99 8853-0, www.intel.de <http://www.intel.de> > Managing Directors: Christin Eisenschmid, Sharon Heck, Tiffany Doon Silva > Chairperson of the Supervisory Board: Nicole Lau > Registered Office: Munich > Commercial Register: Amtsgericht Muenchen HRB 186928 Intel Deutschland GmbH Registered Address: Am Campeon 10, 85579 Neubiberg, Germany Tel: +49 89 99 8853-0, www.intel.de <http://www.intel.de> Managing Directors: Christin Eisenschmid, Sharon Heck, Tiffany Doon Silva Chairperson of the Supervisory Board: Nicole Lau Registered Office: Munich Commercial Register: Amtsgericht Muenchen HRB 186928
*Ping* v2 Br, Matti Puputti > -----Original Message----- > From: Puputti, Matti > Sent: Friday, March 24, 2023 8:19 AM > To: gdb-patches@sourceware.org > Subject: RE: [PATCH 1/1] gdb, infcmd: Support jump command with same line > in multiple object files. > > Gently pinging for a review. > > Br, > Matti Puputti > > > -----Original Message----- > > From: Gdb-patches <gdb-patches- > > bounces+matti.puputti=intel.com@sourceware.org> On Behalf Of Matti > > Puputti via Gdb-patches > > Sent: Wednesday, March 8, 2023 2:26 PM > > To: gdb-patches@sourceware.org > > Subject: [PATCH 1/1] gdb, infcmd: Support jump command with same line > in > > multiple object files. > > > > 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<symtab_and_line> 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 <http://www.gnu.org/licenses/>. > */ > > + > > +#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 <http://www.gnu.org/licenses/>. > */ > > +# > > +# 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 <http://www.gnu.org/licenses/>. > */ > > + > > +#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 <http://www.gnu.org/licenses/>. > */ > > + > > +#include "jump2.h" > > + > > +int > > +foo (int n) > > +{ > > + return bar (n); > > +} > > -- > > 2.25.1 > > > > Intel Deutschland GmbH > > Registered Address: Am Campeon 10, 85579 Neubiberg, Germany > > Tel: +49 89 99 8853-0, www.intel.de <http://www.intel.de> > > Managing Directors: Christin Eisenschmid, Sharon Heck, Tiffany Doon Silva > > Chairperson of the Supervisory Board: Nicole Lau > > Registered Office: Munich > > Commercial Register: Amtsgericht Muenchen HRB 186928 Intel Deutschland GmbH Registered Address: Am Campeon 10, 85579 Neubiberg, Germany Tel: +49 89 99 8853-0, www.intel.de <http://www.intel.de> Managing Directors: Christin Eisenschmid, Sharon Heck, Tiffany Doon Silva Chairperson of the Supervisory Board: Nicole Lau Registered Office: Munich Commercial Register: Amtsgericht Muenchen HRB 186928
*Ping* v3 > -----Original Message----- > From: Puputti, Matti > Sent: Friday, March 31, 2023 7:05 AM > To: 'gdb-patches@sourceware.org' <gdb-patches@sourceware.org> > Subject: RE: [PATCH 1/1] gdb, infcmd: Support jump command with same line > in multiple object files. > > *Ping* v2 > > Br, > Matti Puputti > > > -----Original Message----- > > From: Puputti, Matti > > Sent: Friday, March 24, 2023 8:19 AM > > To: gdb-patches@sourceware.org > > Subject: RE: [PATCH 1/1] gdb, infcmd: Support jump command with same > line > > in multiple object files. > > > > Gently pinging for a review. > > > > Br, > > Matti Puputti > > > > > -----Original Message----- > > > From: Gdb-patches <gdb-patches- > > > bounces+matti.puputti=intel.com@sourceware.org> On Behalf Of Matti > > > Puputti via Gdb-patches > > > Sent: Wednesday, March 8, 2023 2:26 PM > > > To: gdb-patches@sourceware.org > > > Subject: [PATCH 1/1] gdb, infcmd: Support jump command with same line > > in > > > multiple object files. > > > > > > 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<symtab_and_line> 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 <http://www.gnu.org/licenses/>. > > */ > > > + > > > +#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 <http://www.gnu.org/licenses/>. > > */ > > > +# > > > +# 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 <http://www.gnu.org/licenses/>. > > */ > > > + > > > +#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 <http://www.gnu.org/licenses/>. > > */ > > > + > > > +#include "jump2.h" > > > + > > > +int > > > +foo (int n) > > > +{ > > > + return bar (n); > > > +} > > > -- > > > 2.25.1 > > > > > > Intel Deutschland GmbH > > > Registered Address: Am Campeon 10, 85579 Neubiberg, Germany > > > Tel: +49 89 99 8853-0, www.intel.de <http://www.intel.de> > > > Managing Directors: Christin Eisenschmid, Sharon Heck, Tiffany Doon Silva > > > Chairperson of the Supervisory Board: Nicole Lau > > > Registered Office: Munich > > > Commercial Register: Amtsgericht Muenchen HRB 186928 Intel Deutschland GmbH Registered Address: Am Campeon 10, 85579 Neubiberg, Germany Tel: +49 89 99 8853-0, www.intel.de <http://www.intel.de> Managing Directors: Christin Eisenschmid, Sharon Heck, Tiffany Doon Silva Chairperson of the Supervisory Board: Nicole Lau Registered Office: Munich Commercial Register: Amtsgericht Muenchen HRB 186928
On 08/03/2023 14:26, Matti Puputti via Gdb-patches wrote: > If the jump target is found in multiple object files, select the one in > the current object file. Hi, thanks for working on this. I think this is a reasonable change, but I have some comments. First, I think your cover letter description makes for a better commit message than the one you provided here. Also, you say "object file" but use symtab in the code. Each symtab is related to a compilation unit, and an objfile can have multiple compilation units. I think bit more precise in the language would be nice :) > --- > 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<symtab_and_line> 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 I think that a more descriptive name, like jump_multiple_objfiles, would be better. > @@ -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 <http://www.gnu.org/licenses/>. */ > + > +#include "jump2.h" > + > +extern int foo (int n); > + > + > +int main () the coding guidelines ask that this be: 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 <http://www.gnu.org/licenses/>. */ > +# > +# 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\\\)" You can simplify this by using gdb_breakpoint, which is also more resilient that manually setting the breakpoint message. I also tested locally and seen no regressions, but I'd like to see my comments changed before giving my tag
Hi Bruno, Thank you for your comments. I will create a new patch to address these comments. Will submit this afternoon. Br, Matti Puputti > -----Original Message----- > From: Bruno Larsen <blarsen@redhat.com> > Sent: Thursday, April 13, 2023 4:33 PM > To: Puputti, Matti <matti.puputti@intel.com>; gdb-patches@sourceware.org > Subject: Re: [PATCH 1/1] gdb, infcmd: Support jump command with same > line in multiple object files. > > On 08/03/2023 14:26, Matti Puputti via Gdb-patches wrote: > > If the jump target is found in multiple object files, select the one in > > the current object file. > > Hi, thanks for working on this. I think this is a reasonable change, but > I have some comments. > > First, I think your cover letter description makes for a better commit > message than the one you provided here. Also, you say "object file" but > use symtab in the code. Each symtab is related to a compilation unit, > and an objfile can have multiple compilation units. I think bit more > precise in the language would be nice :) > > > --- > > 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<symtab_and_line> 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 > I think that a more descriptive name, like jump_multiple_objfiles, would > be better. > > @@ -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 <http://www.gnu.org/licenses/>. > */ > > + > > +#include "jump2.h" > > + > > +extern int foo (int n); > > + > > + > > +int main () > > the coding guidelines ask that this be: > > 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 <http://www.gnu.org/licenses/>. > */ > > +# > > +# 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\\\)" > > You can simplify this by using gdb_breakpoint, which is also more > resilient that manually setting the breakpoint message. > > I also tested locally and seen no regressions, but I'd like to see my > comments changed before giving my tag > > -- > Cheers, > Bruno > > > + > > +# 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 <http://www.gnu.org/licenses/>. > */ > > + > > +#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 <http://www.gnu.org/licenses/>. > */ > > + > > +#include "jump2.h" > > + > > +int > > +foo (int n) > > +{ > > + return bar (n); > > +} Intel Deutschland GmbH Registered Address: Am Campeon 10, 85579 Neubiberg, Germany Tel: +49 89 99 8853-0, www.intel.de <http://www.intel.de> Managing Directors: Christin Eisenschmid, Sharon Heck, Tiffany Doon Silva Chairperson of the Supervisory Board: Nicole Lau Registered Office: Munich Commercial Register: Amtsgericht Muenchen HRB 186928
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<symtab_and_line> 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 <http://www.gnu.org/licenses/>. */ + +#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 <http://www.gnu.org/licenses/>. */ +# +# 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 <http://www.gnu.org/licenses/>. */ + +#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 <http://www.gnu.org/licenses/>. */ + +#include "jump2.h" + +int +foo (int n) +{ + return bar (n); +}