From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga14.intel.com (mga14.intel.com [192.55.52.115]) by sourceware.org (Postfix) with ESMTPS id D90843858C54 for ; Fri, 12 May 2023 13:33:37 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org D90843858C54 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=intel.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=intel.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1683898417; x=1715434417; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=BRSqOJ5Pof7lWPj1oG7OQM0Ry81HvwdEAwR0Nyl1f18=; b=nKWxhOUnjamL0XG5jVadrRCrJDjBCcSl+40opThavEO1MBS38+X+y1Yn 6SwOr+ft8DRnrrWu7O+8SUMi0RFRmwAh8c5ZneceWZjMTdhiSTEDR9/+q NwiYIc2tQFVkvJKrPAHjIXaorjVKnDg2TMo0nCnlHrImfbXdDfAZFZb9N JMhHtIxdxBlag4bmGQZ6aZP5IJUMWS5lkuAtWvIM1+JJgn1q61zPWHVkO 0KVt2lh1nSjuocwrutSpXq/+Y45A+8Vv2Mw7UMqxJdSiBtd/PkIe40azU DeKQqNB6lmdjqIhx6d7dq+Sytd6YD0tanrcYyswhKe+5PNGfTqrDWhiR+ w==; X-IronPort-AV: E=McAfee;i="6600,9927,10708"; a="350812048" X-IronPort-AV: E=Sophos;i="5.99,269,1677571200"; d="scan'208";a="350812048" Received: from orsmga005.jf.intel.com ([10.7.209.41]) by fmsmga103.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 12 May 2023 06:33:37 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,10708"; a="874390372" X-IronPort-AV: E=Sophos;i="5.99,269,1677571200"; d="scan'208";a="874390372" Received: from ull-mpuputti-02.iul.intel.com (HELO localhost) ([172.28.49.83]) by orsmga005-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 12 May 2023 06:33:36 -0700 From: Matti Puputti To: gdb-patches@sourceware.org Cc: eliz@gnu.org, aburgess@redhat.com Subject: [PATCH v5 1/1] gdb, infcmd: Support jump command with same line in multiple symtabs Date: Fri, 12 May 2023 15:33:20 +0200 Message-Id: <20230512133320.1236624-2-matti.puputti@intel.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20230512133320.1236624-1-matti.puputti@intel.com> References: <20230512133320.1236624-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=-10.1 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,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 List-Id: If a header file defining a static function is included in multiple source files, each calling the function, and GDB is asked to jump to a line inside that function, there would be multiple locations matching the target. The solution in this commit is to select the location in the current symtab. --- gdb/doc/gdb.texinfo | 4 +- gdb/infcmd.c | 14 ++++- .../gdb.base/jump_multiple_objfiles-foo.c | 24 +++++++++ .../gdb.base/jump_multiple_objfiles.c | 30 +++++++++++ .../gdb.base/jump_multiple_objfiles.exp | 54 +++++++++++++++++++ .../gdb.base/jump_multiple_objfiles.h | 30 +++++++++++ 6 files changed, 154 insertions(+), 2 deletions(-) create mode 100755 gdb/testsuite/gdb.base/jump_multiple_objfiles-foo.c create mode 100755 gdb/testsuite/gdb.base/jump_multiple_objfiles.c create mode 100755 gdb/testsuite/gdb.base/jump_multiple_objfiles.exp create mode 100755 gdb/testsuite/gdb.base/jump_multiple_objfiles.h diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo index 531147f6e6b..e43a71a7bbb 100644 --- a/gdb/doc/gdb.texinfo +++ b/gdb/doc/gdb.texinfo @@ -20587,7 +20587,9 @@ an address of your own choosing, with the following commands: Resume execution at the address of the code location that results from resolving @var{locspec}. @xref{Location Specifications}, for a description of the different -forms of @var{locspec}. If @var{locspec} resolves to more than one +forms of @var{locspec}. If @var{locspec} resolves to more than one address, +those outside the current compilation unit are ignored. If considering just +the addresses in the current compilation unit still doesn't yield a unique address, the command aborts before jumping. Execution stops again immediately if there is a breakpoint there. It is common practice to use the @code{tbreak} command in conjunction diff --git a/gdb/infcmd.c b/gdb/infcmd.c index b12b58db9cb..15702f84894 100644 --- a/gdb/infcmd.c +++ b/gdb/infcmd.c @@ -1070,7 +1070,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 symtab. */ + struct symtab_and_line cursal = get_current_source_symtab_and_line (); + sals.erase (std::remove_if (sals.begin (), sals.end (), + [&] (const symtab_and_line &sal) + { + return sal.symtab != cursal.symtab; + }), sals.end ()); + if (sals.size () != 1) + error (_("Jump request is ambiguous: " + "does not resolve to a single address")); + } symtab_and_line &sal = sals[0]; diff --git a/gdb/testsuite/gdb.base/jump_multiple_objfiles-foo.c b/gdb/testsuite/gdb.base/jump_multiple_objfiles-foo.c new file mode 100755 index 00000000000..16863c8594b --- /dev/null +++ b/gdb/testsuite/gdb.base/jump_multiple_objfiles-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 "jump_multiple_objfiles.h" + +int +foo (int n) +{ + return bar (n); +} diff --git a/gdb/testsuite/gdb.base/jump_multiple_objfiles.c b/gdb/testsuite/gdb.base/jump_multiple_objfiles.c new file mode 100755 index 00000000000..b54eede9eb1 --- /dev/null +++ b/gdb/testsuite/gdb.base/jump_multiple_objfiles.c @@ -0,0 +1,30 @@ +/* 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 "jump_multiple_objfiles.h" + +extern int foo (int n); + + +int +main () +{ + int n = foo (1); + bar (n); + + return 0; +} diff --git a/gdb/testsuite/gdb.base/jump_multiple_objfiles.exp b/gdb/testsuite/gdb.base/jump_multiple_objfiles.exp new file mode 100755 index 00000000000..b178e60150e --- /dev/null +++ b/gdb/testsuite/gdb.base/jump_multiple_objfiles.exp @@ -0,0 +1,54 @@ +# 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 -foo.c .h + + +if { [prepare_for_testing "failed to prepare" $testfile \ + [list ${srcfile} ${srcfile2}]] } { + return -1 +} + +if { ![runto_main] } { + 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_breakpoint "${srcfile3}:${bar_first_line}" +gdb_breakpoint "${srcfile3}:${bar_last_line}" + +# 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/jump_multiple_objfiles.h b/gdb/testsuite/gdb.base/jump_multiple_objfiles.h new file mode 100755 index 00000000000..0a3815e1808 --- /dev/null +++ b/gdb/testsuite/gdb.base/jump_multiple_objfiles.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 JUMP_MULTIPLE_OBJFILES_H +#define JUMP_MULTIPLE_OBJFILES_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 /* JUMP_MULTIPLE_OBJFILES_H */ -- 2.25.1 Intel Deutschland GmbH Registered Address: Am Campeon 10, 85579 Neubiberg, Germany Tel: +49 89 99 8853-0, 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