* [PATCH 0/1] gdb, infcmd: Support jump command with same line in multiple object files. @ 2023-03-08 13:26 Matti Puputti 2023-03-08 13:26 ` [PATCH 1/1] " Matti Puputti 0 siblings, 1 reply; 7+ messages in thread From: Matti Puputti @ 2023-03-08 13:26 UTC (permalink / raw) To: gdb-patches Fixes the issue where jump fails if the jump target is in multiple object files. For example, a header file defining a static function is included in multiple source files, each calling the function. When debugger is aksed to jump a line inside that function, there would be multiple locations matching the target. Solution in this commit is to select the location in the current object file. Matti Puputti (1): gdb, infcmd: Support jump command with same line in multiple object files. 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 -- 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 ^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH 1/1] gdb, infcmd: Support jump command with same line in multiple object files. 2023-03-08 13:26 [PATCH 0/1] gdb, infcmd: Support jump command with same line in multiple object files Matti Puputti @ 2023-03-08 13:26 ` Matti Puputti 2023-03-24 7:19 ` Puputti, Matti 2023-04-13 14:32 ` Bruno Larsen 0 siblings, 2 replies; 7+ messages in thread From: Matti Puputti @ 2023-03-08 13:26 UTC (permalink / raw) To: 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<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 ^ permalink raw reply [flat|nested] 7+ messages in thread
* RE: [PATCH 1/1] gdb, infcmd: Support jump command with same line in multiple object files. 2023-03-08 13:26 ` [PATCH 1/1] " Matti Puputti @ 2023-03-24 7:19 ` Puputti, Matti 2023-03-31 5:04 ` Puputti, Matti 2023-04-13 14:32 ` Bruno Larsen 1 sibling, 1 reply; 7+ messages in thread From: Puputti, Matti @ 2023-03-24 7:19 UTC (permalink / raw) To: gdb-patches 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 ^ permalink raw reply [flat|nested] 7+ messages in thread
* RE: [PATCH 1/1] gdb, infcmd: Support jump command with same line in multiple object files. 2023-03-24 7:19 ` Puputti, Matti @ 2023-03-31 5:04 ` Puputti, Matti 2023-04-06 12:59 ` [PING] " Puputti, Matti 0 siblings, 1 reply; 7+ messages in thread From: Puputti, Matti @ 2023-03-31 5:04 UTC (permalink / raw) To: gdb-patches *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 ^ permalink raw reply [flat|nested] 7+ messages in thread
* RE: [PING] [PATCH 1/1] gdb, infcmd: Support jump command with same line in multiple object files. 2023-03-31 5:04 ` Puputti, Matti @ 2023-04-06 12:59 ` Puputti, Matti 0 siblings, 0 replies; 7+ messages in thread From: Puputti, Matti @ 2023-04-06 12:59 UTC (permalink / raw) To: gdb-patches *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 ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH 1/1] gdb, infcmd: Support jump command with same line in multiple object files. 2023-03-08 13:26 ` [PATCH 1/1] " Matti Puputti 2023-03-24 7:19 ` Puputti, Matti @ 2023-04-13 14:32 ` Bruno Larsen 2023-04-14 12:28 ` Puputti, Matti 1 sibling, 1 reply; 7+ messages in thread From: Bruno Larsen @ 2023-04-13 14:32 UTC (permalink / raw) To: Matti Puputti, gdb-patches 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); > +} ^ permalink raw reply [flat|nested] 7+ messages in thread
* RE: [PATCH 1/1] gdb, infcmd: Support jump command with same line in multiple object files. 2023-04-13 14:32 ` Bruno Larsen @ 2023-04-14 12:28 ` Puputti, Matti 0 siblings, 0 replies; 7+ messages in thread From: Puputti, Matti @ 2023-04-14 12:28 UTC (permalink / raw) To: Bruno Larsen, gdb-patches 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 ^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2023-04-14 12:29 UTC | newest] Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2023-03-08 13:26 [PATCH 0/1] gdb, infcmd: Support jump command with same line in multiple object files Matti Puputti 2023-03-08 13:26 ` [PATCH 1/1] " Matti Puputti 2023-03-24 7:19 ` Puputti, Matti 2023-03-31 5:04 ` Puputti, Matti 2023-04-06 12:59 ` [PING] " Puputti, Matti 2023-04-13 14:32 ` Bruno Larsen 2023-04-14 12:28 ` Puputti, Matti
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).