From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from simark.ca by simark.ca with LMTP id 6VFGB/dKHGmIMw8AWB0awg (envelope-from ) for ; Tue, 18 Nov 2025 05:31:19 -0500 Authentication-Results: simark.ca; dkim=pass (1024-bit key; unprotected) header.d=redhat.com header.i=@redhat.com header.a=rsa-sha256 header.s=mimecast20190719 header.b=Qt3Gkl+p; dkim-atps=neutral Received: by simark.ca (Postfix, from userid 112) id 19A601E0B6; Tue, 18 Nov 2025 05:31:19 -0500 (EST) X-Spam-Checker-Version: SpamAssassin 4.0.1 (2024-03-25) on simark.ca X-Spam-Level: X-Spam-Status: No, score=-3.4 required=5.0 tests=ARC_SIGNED,ARC_VALID,BAYES_00, DKIMWL_WL_HIGH,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,MAILING_LIST_MULTI, RCVD_IN_DNSWL_MED,RCVD_IN_VALIDITY_CERTIFIED_BLOCKED, RCVD_IN_VALIDITY_RPBL_BLOCKED,RCVD_IN_VALIDITY_SAFE_BLOCKED autolearn=ham autolearn_force=no version=4.0.1 Received: from server2.sourceware.org (server2.sourceware.org [8.43.85.97]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange x25519 server-signature ECDSA (prime256v1) server-digest SHA256) (No client certificate requested) by simark.ca (Postfix) with ESMTPS id 38E8D1E08D for ; Tue, 18 Nov 2025 05:31:18 -0500 (EST) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id D01B43857835 for ; Tue, 18 Nov 2025 10:31:17 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org D01B43857835 Authentication-Results: sourceware.org; dkim=pass (1024-bit key, unprotected) header.d=redhat.com header.i=@redhat.com header.a=rsa-sha256 header.s=mimecast20190719 header.b=Qt3Gkl+p Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by sourceware.org (Postfix) with ESMTP id 593503857830 for ; Tue, 18 Nov 2025 10:29:11 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 593503857830 Authentication-Results: sourceware.org; dmarc=pass (p=quarantine dis=none) header.from=redhat.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=redhat.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 593503857830 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=170.10.133.124 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1763461751; cv=none; b=YRYG5sBVvsBHqCWIaSktHUieOdS2bDMTJHCd6Q5PEo89/T/u1QMhOkumsJbIFiMCFUK4iYKEFhO/lOIL6mTLClU9ho7vRNY+IwnsSrXIMu3+VlZiWXJ7ci0h/kjm1acM46+L2ed4IkuedY4T6/Dhk312cNv0BTCCreW/9xX/A5E= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1763461751; c=relaxed/simple; bh=UIRPl0vJCdfxTQstnsyoMbj9xwMg0vFcSL3y25OaHyA=; h=DKIM-Signature:From:To:Subject:Date:Message-ID:MIME-Version; b=Ps63r3/3MHF5uvg82+C69xcsUgweIGtMQsRgIiecnhouEJ1kasrJWmZ0vJGAJvnJsAFvzC4tdwG0MBntuky+J/dKkz5XOlKYP4ANRJ5ycBzAJwolCZOKQwmhh2M8E5nVBsGhcKCwqVdhfIeFqV6YLU0sStXjr/yZGY+vic9MAwk= ARC-Authentication-Results: i=1; server2.sourceware.org DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 593503857830 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1763461751; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=xGBNYbFa5YGlfeh3GPPNt6Q88a+qs5rZFQZpE03oHOE=; b=Qt3Gkl+pHsbr1WmmReAZ/vfikocx/VuZ8Jt5s/KZsYWj7i9yCwP1jNPvujCCplm2TnEEDN 16k4LqjVf6jmf/iBzy4hiRP0qHbdsGQkUo2V2y7wH4eQa9QZeec9zshv+gS6yk3I/Dk/6S C/KVW89p5B5RYfx5HHNFKPtZmJoX+28= Received: from mail-wm1-f69.google.com (mail-wm1-f69.google.com [209.85.128.69]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-396-jID_KOiCMpmii3kE2sJZ1g-1; Tue, 18 Nov 2025 05:28:59 -0500 X-MC-Unique: jID_KOiCMpmii3kE2sJZ1g-1 X-Mimecast-MFC-AGG-ID: jID_KOiCMpmii3kE2sJZ1g_1763461739 Received: by mail-wm1-f69.google.com with SMTP id 5b1f17b1804b1-477563e531cso44478545e9.1 for ; Tue, 18 Nov 2025 02:28:59 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1763461738; x=1764066538; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=xGBNYbFa5YGlfeh3GPPNt6Q88a+qs5rZFQZpE03oHOE=; b=ZDSki4aJfaWPaiyNTzZlkQLul7X5+vKoM8er5geQA79BEb1wsP6mNFFyp2kgfvHvdh 1hYn+MAIyFq7IBAIc+Yb5JlUgYsSZlxYazX8X6JO3MYWZE5blEmHAqvKCCU2vy1kKA50 k96COrkv4ndCp/9i9hhKFb2Wgcw3keXilHfcR39gr05jwIHNNQYdvDHC7JOJuiuV9kUK aTYqGDQzs1xsiM+J6xI2fZc6icweForguT3UtlgevEK3Z1ET6ER3M/WOsML+Dd1jxnMj FqRMn64+j+7e3AIB2WZojbL0zHwYOApOH0zoiRhs/hnmCliym0LPSwV3TOi5OqafF+Ft BADw== X-Gm-Message-State: AOJu0YxyrWAP+J3a/REuU1vxGOUNeAHoq7MxAkUwN5bKw4g/ez4q45u6 oemTonU4WOgsX6EN32/ltf03pti4xNLgcFgaNrosc0Oh4gzt2N+jgMQeg86wKtk2XWGjyAC8eQ9 QWx5FQqL7t/qe4kcxHq56pWd8w/eoqiYZNldqv/zIAhqWy87Tc4Q10coPOpwO6f8ELU+TdeAnM/ y30qz7WMOH7AEttZr3aDB2K4IuRCBbA98Y5zfB4NNbw0l4dT8= X-Gm-Gg: ASbGncvrsVwes2nHR8gERFSc6EA4U8CqdphB2hKWCuHtI6FwUegmwbBJUDAsps209eC J/uY0HOLGp3ASFE6aMJ4QWGU9ZFpQsTQbxL2r+0JDEP1nxMz6Yn8CiDAbufEal4h/Fvz6mi4jBu vBNequdjHBdYCZc5iXlue8m2W5oVRfHjHZlI3kzGIya9ufcR0j9c9foiknNXCW2gNYIa9XWvIhl QhcYigT4VmGATB7C2xxtJ8Z+sNr5PYj8Dx/7zSThaLa13OXb3/eU6nZj0dzhZ4G8MSWc9Ej6piI S4INH1KJgUU5eXVSCk87uInsBt/H93/zvn8xB0nkm5SG+LofxsbKkKNpN0OlfAcxK6rpnm60fSL a6+Sl X-Received: by 2002:a05:600c:1c02:b0:477:aed0:f403 with SMTP id 5b1f17b1804b1-477aed0fb98mr4903815e9.8.1763461738089; Tue, 18 Nov 2025 02:28:58 -0800 (PST) X-Google-Smtp-Source: AGHT+IFEACtP1eeVbgpP6jGzfnmnw8KYO00IsIr67NFi5FVvJv2zAZ+Whw7jUYNyPToAVVz5cq6bew== X-Received: by 2002:a05:600c:1c02:b0:477:aed0:f403 with SMTP id 5b1f17b1804b1-477aed0fb98mr4903455e9.8.1763461737459; Tue, 18 Nov 2025 02:28:57 -0800 (PST) Received: from localhost ([31.111.84.207]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-42b53e982d6sm31446326f8f.21.2025.11.18.02.28.56 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 18 Nov 2025 02:28:56 -0800 (PST) From: Andrew Burgess To: gdb-patches@sourceware.org Cc: Andrew Burgess Subject: [PATCH 1/2] gdb: fix 'list' for multiple source file results Date: Tue, 18 Nov 2025 10:28:52 +0000 Message-ID: <9998f4f077aa5ea8ce683a78714ecd760bd3381c.1763461561.git.aburgess@redhat.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: References: MIME-Version: 1.0 X-Mimecast-Spam-Score: 0 X-Mimecast-MFC-PROC-ID: PVtPsybQIh5ItxlQby1uVpICEKsYKBxVl0iJOa0Nz9Y_1763461739 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: 8bit content-type: text/plain; charset="US-ASCII"; x-default=true X-BeenThere: gdb-patches@sourceware.org X-Mailman-Version: 2.1.30 Precedence: list List-Id: Gdb-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: gdb-patches-bounces~public-inbox=simark.ca@sourceware.org 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 --- gdb/linespec.c | 15 ++-- gdb/testsuite/gdb.base/list-multi-source.c | 60 +++++++++++++ gdb/testsuite/gdb.base/list-multi-source.exp | 95 ++++++++++++++++++++ 3 files changed, 165 insertions(+), 5 deletions(-) create mode 100644 gdb/testsuite/gdb.base/list-multi-source.c create mode 100644 gdb/testsuite/gdb.base/list-multi-source.exp diff --git a/gdb/linespec.c b/gdb/linespec.c index 277b45b4b7f..2cbfe2fcc20 100644 --- a/gdb/linespec.c +++ b/gdb/linespec.c @@ -1071,11 +1071,16 @@ add_sal_to_sals (struct linespec_state *self, const symtab_and_line &sal, const char *symname, bool literal_canonical) { - /* We don't want two SALs with the same PC from the - same program space. */ - for (const auto &s : sals) - if (sal.pc == s.pc && sal.pspace == s.pspace) - return; + /* We don't want two SALs with the same PC from the same program space. + However, for the 'list' command we force the pc value to be 0, and in + this case we do want to see all SALs. See decode_digits_list_mode + for where the 0 originates from. */ + if (sal.pc != 0) + { + for (const auto &s : sals) + if (sal.pc == s.pc && sal.pspace == s.pspace) + return; + } sals.push_back (sal); 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 00000000000..ab2b6a01b36 --- /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 . */ + +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 diff --git a/gdb/testsuite/gdb.base/list-multi-source.exp b/gdb/testsuite/gdb.base/list-multi-source.exp new file mode 100644 index 00000000000..7809167bd0f --- /dev/null +++ b/gdb/testsuite/gdb.base/list-multi-source.exp @@ -0,0 +1,95 @@ +# 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 . + +# Test that 'list FILE:LINE' can print multiple results if FILE +# matches multiple files from the source tree. +# +# Then test that we can use 'list DIR/FILE:LINE' to restrict the +# results to a single source file. + +# This test uses a single source file that is copied into the build +# tree 3 times. The three copies are then copied with different +# defines set so that we see different functions in each copy. +standard_testfile .c + +# Create the source tree within the build directory. +set src_root [standard_output_file "src"] +set src_a "$src_root/a" +set src_b "$src_root/b" +set file_a "$src_a/foo.c" +set file_b "$src_b/foo.c" +set file_main "$src_root/main.c" +remote_exec build "mkdir -p \"$src_root\"" +remote_exec build "mkdir -p \"$src_a\"" +remote_exec build "mkdir -p \"$src_b\"" + +# Make three copies of the single source file in the build directory +# based source tree. Two of the source files are modified slighly to +# make the output of 'list' unique for each copy. +remote_exec build "cp \"$srcdir/$subdir/$srcfile\" \"$file_main\"" +remote_exec build "cp \"$srcdir/$subdir/$srcfile\" \"$file_a\"" +remote_exec build "cp \"$srcdir/$subdir/$srcfile\" \"$file_b\"" +remote_exec build "sed -i -e \"s/value_to_return/3/\" \"$file_a\"" +remote_exec build "sed -i -e \"s/value_to_return/-3/\" \"$file_b\"" + +# Build the executable. Use defines to make the source files +# different. +if { [prepare_for_testing_full "failed to prepare" \ + [list $testfile debug \ + $file_main [list debug additional_flags=-DMAIN] \ + $file_a [list debug additional_flags=-DFILE_A] \ + $file_b [list debug additional_flags=-DFILE_B]]]} { + return +} + +# The LINENUM we should list, and the first and last lines that should +# appear in the list output. +set linenum [gdb_get_line_number "List this line"] +set first_linenum [expr {$linenum - 5}] +set last_linenum [expr {$linenum + 4}] + +# List using FILE:LINE for a filename that is ambiguous. +gdb_test "list foo.c:$linenum" \ + [multi_line \ + "file: \"\[^\r\n\]+/a/foo.c\", line number: $linenum, symbol: \"\[^\r\n\]+\"" \ + "$first_linenum\\s+\[^\r\n\]+" \ + ".*" \ + "$linenum\\s+[string_to_regexp {return 3; /* List this line. */}]" \ + ".*" \ + "$last_linenum\\s+\[^\r\n\]+" \ + "file: \"\[^\r\n\]+/b/foo.c\", line number: $linenum, symbol: \"\[^\r\n\]+\"" \ + "$first_linenum\\s+\[^\r\n\]+" \ + ".*" \ + "$linenum\\s+[string_to_regexp {return -3; /* List this line. */}]" \ + ".*" \ + "$last_linenum\\s+\[^\r\n\]+"] + +# Now list using a more acurate filename, we should only get a single +# result. +gdb_test "list a/foo.c:$linenum" \ + [multi_line \ + "^$first_linenum\\s+\[^\r\n\]+" \ + ".*" \ + "$linenum\\s+[string_to_regexp {return 3; /* List this line. */}]" \ + ".*" \ + "$last_linenum\\s+\[^\r\n\]+"] + +gdb_test "list b/foo.c:$linenum" \ + [multi_line \ + "^$first_linenum\\s+\[^\r\n\]+" \ + ".*" \ + "$linenum\\s+[string_to_regexp {return -3; /* List this line. */}]" \ + ".*" \ + "$last_linenum\\s+\[^\r\n\]+"] -- 2.47.1