aboutsummaryrefslogtreecommitdiff
path: root/gdb/testsuite/gdb.base/list-multi-source.c
diff options
context:
space:
mode:
authorAndrew Burgess <aburgess@redhat.com>2025-11-17 11:43:36 +0000
committerAndrew Burgess <aburgess@redhat.com>2025-12-05 10:05:42 +0000
commit9e05bcf99ce772451d9e00eb646296c7c3170c97 (patch)
treebead62fee9fa30f0a9b54d7ef3ecec478bb1160e /gdb/testsuite/gdb.base/list-multi-source.c
parentd181d22cb383ca7d90946a51994b4dfee34a5610 (diff)
downloadbinutils-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.c60
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