From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from simark.ca by simark.ca with LMTP id 8TjZFQiIHGmzyQ8AWB0awg (envelope-from ) for ; Tue, 18 Nov 2025 09:51:52 -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=D0oycBp0; dkim-atps=neutral Received: by simark.ca (Postfix, from userid 112) id 470F21E048; Tue, 18 Nov 2025 09:51:52 -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 251AC1E048 for ; Tue, 18 Nov 2025 09:51:51 -0500 (EST) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 3372F385770D for ; Tue, 18 Nov 2025 14:51:50 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 3372F385770D 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=D0oycBp0 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) by sourceware.org (Postfix) with ESMTP id 4E987385770D for ; Tue, 18 Nov 2025 14:28:11 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 4E987385770D 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 4E987385770D Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=170.10.129.124 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1763476091; cv=none; b=lVftASnz03fYmn4lLgHOCV3E+Yj27eAw2eWNinkK2PSMKXl3KcvY6/j8+0DsqJ0Aicsl91zn7zRBJdC9IbsmlSXzdJQLEFc/h6kbdKCoKzimJD4dlYqmPQpAKvixfW+9L4Z0//LYVWfNc65+9N8ibTa2L0oNWXR2+F3yKQ3VFMo= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1763476091; c=relaxed/simple; bh=//5W2xe7itLmzlypqhOS1kBg2jIeZ1aYBiydSEh+ZvY=; h=DKIM-Signature:From:To:Subject:Date:Message-ID:MIME-Version; b=VOtHuTkO292+Xu1tzuI5rIVdkjM3+C2+enrjftarMjo+ZZ/QBuyjEZ21l1hoxpwNZ76WG4jmvTpt48H3xzQQAm6WoWb8GFtBUF0QL/N2gOFHeemBdJ98ROoKc5t4KFqtnA3nsSJsWs/4lbduyUt1RbKnW3B8omY4abvzHL7Sl0o= ARC-Authentication-Results: i=1; server2.sourceware.org DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 4E987385770D DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1763476091; 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: in-reply-to:in-reply-to:references:references; bh=JlOuSZ/VQ3qjXOVUT3RQ6j81uFBHmtz5Pms7Ms8HYHg=; b=D0oycBp0pcXaUvyd9uR7PElmuJKQV/HZnj3rKkPWRnZTxdUBVikGb7HSZBJZbJNbqvL5y0 wMFj8zHVgqIQpFqu11vcB6OuOFhAV0pa1nuum9udW6EC2XC5kIuJU2TilktFbFlMxOqbwh S4tLCGMKND378cYr8X0BwTxx0BupGFY= 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-689-lxxG9Qf0OaqQCv6JlnSoAA-1; Tue, 18 Nov 2025 09:28:09 -0500 X-MC-Unique: lxxG9Qf0OaqQCv6JlnSoAA-1 X-Mimecast-MFC-AGG-ID: lxxG9Qf0OaqQCv6JlnSoAA_1763476089 Received: by mail-wr1-f72.google.com with SMTP id ffacd0b85a97d-42b2f79759bso4010575f8f.2 for ; Tue, 18 Nov 2025 06:28:09 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1763476088; x=1764080888; h=mime-version:message-id:date:references:in-reply-to:subject:cc:to :from:x-gm-gg:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=JlOuSZ/VQ3qjXOVUT3RQ6j81uFBHmtz5Pms7Ms8HYHg=; b=Tjyz2QkWr51g9C7JkDOSyXXtMu8L6KvQfhKD6yTLT3J8w45VprZTV+ma6z/P6D2B/H gYB16h4y4JsiYZyxzSM/CrN+PGVjvBgmbV4MI1QgTCBXEt2rCXZQ6f3KT/gkuqIPnpJd DE0/xqdoXYvr8uMmm86hwQge9CaR9nftcPsXhLxAcEqZa4t1FWYuWf7lBn1GuUTOF6mA 7uzgYix+8pOvJAYjZJOl7VXDwwJa3aPBbEuGt2HzirCXLLN0vvvYN1ieL1czJ+EpWS/s PFXzfz7hvnSyvJZuvzbpThm3J2deOzp+YUDrO9rDnBAlyCWK7R3E41Z0Wrla1q/naKfj pDxg== X-Gm-Message-State: AOJu0YzE7HzcIm01L0c4v3j5InXC3EA9KfOEPEtsWbyNJfSmFmU2Sr+4 pbgYEH6YA9sLRA5ctWGpOfAcOq6+zbAt/hG1rGmjxYa57WxmTuUEGy4fqcClX9H+A8BHeeR6ZwT LwQZ1v/v3NiqtVBxEUQIF85oLRg54jbKfmSu7cXg61b+sHdZftjdAAb4eiulomcPoWiBOunA= X-Gm-Gg: ASbGncsZ/VPZ6WNFD5+NQaNnIgQ4g4MC//gQE6mocVw4HQCSeHdk0UqzE0/HzgYmNLx 8zrwsLGiCapYeFEGOOCq0ArCcLOFC8AZK+SX5+dcpNf71Ky93ISZ1/rB/gwgw7TDd/VlsEx6Jx4 1NJqt9yvvTjnFC+TvnEoty//WlsE7o/KcUYGouYVubrbWKYvaI24Tm7o6nYbR7pxSmKU/uyAgVM dDJw94phZgfLP0xjum9yhz5uvhxWjxyfgXNab21Gdfch+ruYl6TCQm7d6NVCljw/jPG7EyOgTlb bWjGKhTs+t8/wKgB0KmoNnA/YpgwAOSXZV88VBTDayCFZ51VrwcRIb5sZcnntaLpg2fuBksRQA1 X6PtQ X-Received: by 2002:a5d:5f47:0:b0:427:9e6:3a64 with SMTP id ffacd0b85a97d-42b593847f2mr15423111f8f.47.1763476088036; Tue, 18 Nov 2025 06:28:08 -0800 (PST) X-Google-Smtp-Source: AGHT+IFXF4kV8uEVbv7F0utJ2OOdfJ60J6zQLrxIzltk1HUPppUkJKZfmKJtzLbjO1Xi4zkEhA657Q== X-Received: by 2002:a5d:5f47:0:b0:427:9e6:3a64 with SMTP id ffacd0b85a97d-42b593847f2mr15423078f8f.47.1763476087446; Tue, 18 Nov 2025 06:28:07 -0800 (PST) Received: from localhost ([31.111.84.207]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-42b53f21948sm32289659f8f.43.2025.11.18.06.28.07 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 18 Nov 2025 06:28:07 -0800 (PST) From: Andrew Burgess To: Andreas Schwab Cc: gdb-patches@sourceware.org Subject: Re: [PATCH 1/2] gdb: fix 'list' for multiple source file results In-Reply-To: References: <9998f4f077aa5ea8ce683a78714ecd760bd3381c.1763461561.git.aburgess@redhat.com> Date: Tue, 18 Nov 2025 14:28:06 +0000 Message-ID: <875xb7v2ix.fsf@redhat.com> MIME-Version: 1.0 X-Mimecast-Spam-Score: 0 X-Mimecast-MFC-PROC-ID: FRSZ9HbPyV4KsoffuvRkEPK3gadRVKlN0N4MNumw5us_1763476089 X-Mimecast-Originator: redhat.com Content-Type: text/plain 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 Andreas Schwab writes: > On Nov 18 2025, Andrew Burgess wrote: > >> +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\"" > > If you combine the cp and sed commands then you don't need the > nonportable -i option. Thank you for your feedback. An updated patch is below that avoids '-i'. Thanks, Andrew --- commit bb6621f9b7b57737d8c3f8238a38713d98b1205b Author: Andrew Burgess Date: Mon Nov 17 11:43:36 2025 +0000 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 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..76c6990adb1 --- /dev/null +++ b/gdb/testsuite/gdb.base/list-multi-source.exp @@ -0,0 +1,121 @@ +# 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" +file mkdir "$src_root" +file mkdir "$src_a" +file mkdir "$src_b" + +# Helper proc. Copy global SRCFILE to DEST, replacing +# 'value_to_return' with VALUE during the copy. +proc copy_and_update_source_file { dest value } { + # Open the source file for reading. + set in [open "$::srcdir/$::subdir/$::srcfile" r] + + # Read in the entire contents of the file. This should be fine as + # the input file is not large. + set file_content [read $in] + + # Close the input file. + close $in + + # Perform the replacement over the entire file contents. + set updated_content [string map \ + [list "value_to_return" $value] \ + $file_content] + + # Open the destination file for writing. + set out [open $dest w] + + # Write the modified content to the destination file. + puts -nonewline $out $updated_content + + # Close the output file. + close $out +} + +# 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. +file copy "$srcdir/$subdir/$srcfile" "$file_main" +copy_and_update_source_file $file_a "3" +copy_and_update_source_file $file_b "-3" + +# 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\]+"]