From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by sourceware.org (Postfix) with ESMTPS id 199743858414 for ; Wed, 10 May 2023 13:24:29 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 199743858414 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=redhat.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=redhat.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1683725068; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: in-reply-to:in-reply-to:references:references; bh=eI+cAZk0wNpB7vkckrUynixkNCZ/+jrN4cvqZuQPP+I=; b=aRQHM6CEgE8+8Nmi+mJilO6oT7cWZpJCos2S5qf5cKHFhp+EUA1byR9ecmwUCXr+H6DZw6 mVKYjcUZdtfVMnF8nc2v0LHoyh7eCl3qIqj+McG/FUfybYt8OhM8FwFIfAx0I0Qs1qLush 9ZYiP3ygnPev07Ta0ABEX+IWs3BPaZ0= Received: from mail-wr1-f72.google.com (mail-wr1-f72.google.com [209.85.221.72]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-516-110A9CZgNwqMqUm4hbh55g-1; Wed, 10 May 2023 09:24:25 -0400 X-MC-Unique: 110A9CZgNwqMqUm4hbh55g-1 Received: by mail-wr1-f72.google.com with SMTP id ffacd0b85a97d-306489b7585so2503957f8f.3 for ; Wed, 10 May 2023 06:24:25 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1683725064; x=1686317064; h=mime-version:message-id:date:references:in-reply-to:subject:to:from :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=eI+cAZk0wNpB7vkckrUynixkNCZ/+jrN4cvqZuQPP+I=; b=HT9o+wTljrngxvsUdjkx272ksMmqc15W6pw0bCRMJgmESFijEo9JxGnvWXsfZl466r NiQkiY1bk8u4C0aVvkfboxnjVoOWXO252cmZnQ1L4xBQaTSyjgQphqoY0EcFuhc0S4us 1y9zxj8fJO0rN+qAdKBkf8Z1OBVus9lp/JnsQtaqNRMtSN238zVxtmRqY+ProA3MUr/k KIeDqbJa54Za0WMM8fdd7LEUs4ZJWR8Jn/iKoL/ZwP29VE4Z0Awi9xK1PPClzg3gP6sD MRXScVZuPswqaZKjy1SeapNTe4KScWXDSVrC6Utst9vgA5yLmW8EJE53MyicXwd7NR/m zjQg== X-Gm-Message-State: AC+VfDxm1RTQcEXXy2DCs4Xxxyl2+yqYyQ4g1E+43GLxWxV/haW2ov9z njLQxFJWzMyB3WFQoJDz59oe/i+4JWXUQdfzYe/7XY9SshXYb6cScKXYbVhDSOwhvybI7p2tJNi Xh9S7k/BQFWyjsqQ60HY/8Iyb505f4Q== X-Received: by 2002:adf:f902:0:b0:307:34d4:7ed4 with SMTP id b2-20020adff902000000b0030734d47ed4mr11547954wrr.6.1683725064295; Wed, 10 May 2023 06:24:24 -0700 (PDT) X-Google-Smtp-Source: ACHHUZ7eDF2Lvs/hyREzeu61eVaZH4lPaGfP4urj15388ciMODOsHHDE8Eln7cnsDHK9+bHeszPnTQ== X-Received: by 2002:adf:f902:0:b0:307:34d4:7ed4 with SMTP id b2-20020adff902000000b0030734d47ed4mr11547934wrr.6.1683725063864; Wed, 10 May 2023 06:24:23 -0700 (PDT) Received: from localhost (11.72.115.87.dyn.plus.net. [87.115.72.11]) by smtp.gmail.com with ESMTPSA id g22-20020a7bc4d6000000b003f049a42689sm22514437wmk.25.2023.05.10.06.24.23 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 10 May 2023 06:24:23 -0700 (PDT) From: Andrew Burgess To: Matti Puputti , gdb-patches@sourceware.org Subject: Re: [PATCH v4 1/1] gdb, infcmd: Support jump command with same line in multiple symtabs In-Reply-To: <20230510111230.839619-2-matti.puputti@intel.com> References: <20230510111230.839619-1-matti.puputti@intel.com> <20230510111230.839619-2-matti.puputti@intel.com> Date: Wed, 10 May 2023 14:24:22 +0100 Message-ID: <875y90720p.fsf@redhat.com> MIME-Version: 1.0 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Type: text/plain X-Spam-Status: No, score=-11.6 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,GIT_PATCH_0,KAM_SHORT,RCVD_IN_DNSWL_NONE,RCVD_IN_MSPIKE_H2,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: Matti Puputti writes: > 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. Thanks for the updates. I think the code changes are now OK, but you'll need to Eli's approval for the docs part before pushing. Approved-By: Andrew Burgess Thanks, Andrew > --- > gdb/doc/gdb.texinfo | 5 +- > gdb/infcmd.c | 13 ++++- > .../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, 153 insertions(+), 3 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 4ae84ec5a63..921cff16597 100644 > --- a/gdb/doc/gdb.texinfo > +++ b/gdb/doc/gdb.texinfo > @@ -20586,8 +20586,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 > -address, the command aborts before jumping. > +forms of @var{locspec}. If @var{locspec} resolves to more than one address, > +those outside the current compilation unit are ignored. If still not a > +unique address found, 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 > with @code{jump}. @xref{Set Breaks, ,Setting Breakpoints}. > diff --git a/gdb/infcmd.c b/gdb/infcmd.c > index b12b58db9cb..c43c4e005a0 100644 > --- a/gdb/infcmd.c > +++ b/gdb/infcmd.c > @@ -1070,7 +1070,18 @@ 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 (_("Unreasonable jump request")); > + } > > 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