diff options
| author | Andrew Burgess <aburgess@redhat.com> | 2025-11-17 11:43:36 +0000 |
|---|---|---|
| committer | Andrew Burgess <aburgess@redhat.com> | 2025-12-05 10:05:42 +0000 |
| commit | 9e05bcf99ce772451d9e00eb646296c7c3170c97 (patch) | |
| tree | bead62fee9fa30f0a9b54d7ef3ecec478bb1160e /gdb/testsuite/gdb.base/list-multi-source.c | |
| parent | d181d22cb383ca7d90946a51994b4dfee34a5610 (diff) | |
| download | binutils-9e05bcf99ce772451d9e00eb646296c7c3170c97.zip binutils-9e05bcf99ce772451d9e00eb646296c7c3170c97.tar.gz binutils-9e05bcf99ce772451d9e00eb646296c7c3170c97.tar.bz2 | |
gdb: fix 'list' for multiple source file results
This commit:
commit c7a45b98a61451f05ff654c4fb72a9c9cb2fba36
Date: Thu Jun 12 15:37:50 2025 +0000
gdb, linespec: avoid multiple locations with same PC
broke GDB's ability to list multiple source files using a 'list'
command. In GDB 16 and earlier something like 'list foo.c:10' could
print multiple results if there were multiple 'foo.c' files compiled
into the executable.
The above commit added a filter to add_sal_to_sals (linespec.c) such
that multiple sals in the same program space, but with the same pc
value, could not be added, only the first sal would actually be
recorded. The problem with this is that add_sal_to_sals is used from
decode_digits_list_mode (also linespec.c) where the pc value is forced
to zero. This force to zero makes sense I think as there might not be
any compiled code for the requested line (this is for 'list' after
all), so there might not be a valid pc to use.
I'm not a fan of using '0' as a special pc value, there are embedded
targets where 0 is a valid pc value, but given we're already using 0
here, I propose to just roll with it.
So, my proposal is that, if the pc is 0, add_sal_to_sals should always
add the sal. This fixes the decode_digits_list_mode, but should keep
the fix that c7a45b98a614 introduced.
Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=33647
Approved-By: Tom Tromey <tom@tromey.com>
Reviewed-By: Kevin Buettner <kevinb@redhat.com>
Diffstat (limited to 'gdb/testsuite/gdb.base/list-multi-source.c')
| -rw-r--r-- | gdb/testsuite/gdb.base/list-multi-source.c | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/gdb/testsuite/gdb.base/list-multi-source.c b/gdb/testsuite/gdb.base/list-multi-source.c new file mode 100644 index 0000000..ab2b6a0 --- /dev/null +++ b/gdb/testsuite/gdb.base/list-multi-source.c @@ -0,0 +1,60 @@ +/* This testcase is part of GDB, the GNU debugger. + + Copyright 2025 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/>. */ + +extern int function_a (void); +extern int function_b (void); + +#ifdef MAIN +int +main (void) +{ + int res; + + res = function_a (); + + res += function_b (); + + return res; +} +#endif + +#if defined FILE_A || defined FILE_B +static int +get_value_common (void) +{ + /* NOTE: When reading this file in the source tree, the variable used in + the return statement below will be replaced by a constant value when + the file is copied into the source tree. */ + return value_to_return; /* List this line. */ +} +#endif + +#ifdef FILE_A +int +function_a (void) +{ + return get_value_common (); +} +#endif + +#ifdef FILE_B +int +function_b (void) +{ + return get_value_common (); +} +#endif |
