From: Andrew Burgess <aburgess@redhat.com>
To: Tom Tromey <tromey@adacore.com>, gdb-patches@sourceware.org
Cc: Tom Tromey <tromey@adacore.com>
Subject: Re: [PATCH] Sort symtabs using their display filename
Date: Wed, 10 Jun 2026 17:01:43 +0100 [thread overview]
Message-ID: <87y0gmpeoo.fsf@redhat.com> (raw)
In-Reply-To: <20260609163416.3421440-1-tromey@adacore.com>
Tom Tromey <tromey@adacore.com> writes:
> While working on gnat-llvm, I found that many tests in
> gdb.ada/info_auto_lang.exp were failing. Investigating this, the
> difference turned out to be a different sort order for the output. I
> then tracked this down to gnat-llvm emitting:
>
> <e3d> DW_AT_name : (indirect string, offset: 0xdd4): pck.adb
> ...
> <e45> DW_AT_comp_dir : (indirect string, offset: 0xddc): /home/tromey/AdaCore/binutils-gdb/gdb/testsuite/gdb.ada/mi_dyn_arr/
>
> ... whereas GCC emits:
>
> <108b> DW_AT_name : (indirect line string, offset: 0x10f): /home/tromey/gdb/binutils-gdb/gdb/testsuite/gdb.ada/mi_dyn_arr/pck.adb
> <108f> DW_AT_comp_dir : (indirect line string, offset: 0): /home/tromey/gdb/build/gdb/testsuite/outputs/gdb.ada/mi_dyn_arr
>
> This distinction isn't relevant to the test, so I tried "set
> filename-display basename". However, this setting had no effect.
>
> It seems to me that, for "info types" and the like, the output should
> be sorted according to the user's display preferences. This patch
> implements this and adds a new DWARF assembler test.
I think this sounds like the right thing to do. Just a couple of minor
nits...
>
> Finally, this updates info_auto_lang.exp to be insensitive to this
> quirk of gnat-llvm.
> ---
> gdb/symtab.c | 6 +-
> gdb/testsuite/gdb.ada/info_auto_lang.exp | 18 ++--
> gdb/testsuite/gdb.dwarf2/symtab-sorting.exp | 108 ++++++++++++++++++++
> 3 files changed, 122 insertions(+), 10 deletions(-)
> create mode 100644 gdb/testsuite/gdb.dwarf2/symtab-sorting.exp
>
> diff --git a/gdb/symtab.c b/gdb/symtab.c
> index 3c10e1fd750..00205c31975 100644
> --- a/gdb/symtab.c
> +++ b/gdb/symtab.c
> @@ -4610,8 +4610,10 @@ symbol_search::compare_search_syms (const symbol_search &sym_a,
> {
> int c;
>
> - c = FILENAME_CMP (sym_a.symbol->symtab ()->filename (),
> - sym_b.symbol->symtab ()->filename ());
> + /* The output is going to be displayed to the user, so sort the file
> + names according to how they will be shown. */
> + c = FILENAME_CMP (symtab_to_filename_for_display (sym_a.symbol->symtab ()),
> + symtab_to_filename_for_display (sym_b.symbol->symtab ()));
> if (c != 0)
> return c;
>
> diff --git a/gdb/testsuite/gdb.ada/info_auto_lang.exp b/gdb/testsuite/gdb.ada/info_auto_lang.exp
> index e717802a8d2..2b060a4939b 100644
> --- a/gdb/testsuite/gdb.ada/info_auto_lang.exp
> +++ b/gdb/testsuite/gdb.ada/info_auto_lang.exp
> @@ -44,6 +44,8 @@ if {[gdb_compile_ada "${srcfile}" "${binfile}" executable [list debug]] != "" }
>
> clean_restart ${testfile}
>
> +gdb_test_no_output "set filename-display basename"
> +
> set bp_location [gdb_get_line_number "STOP" ${testdir}/some_c.c]
> if {![runto "some_c.c:$bp_location"]} {
> return
> @@ -119,10 +121,10 @@ foreach_with_prefix language_choice { "auto" "ada" "c" } {
> [multi_line \
> "All functions matching regular expression \"proc_in_\":" \
> "" \
> - "File .*proc_in_ada.adb:" \
> + "File proc_in_ada.adb:" \
> $func_in_ada($ada_match) \
> "" \
> - "File .*some_c.c:" \
> + "File some_c.c:" \
> $func_in_c($c_match)
> ]
>
> @@ -130,10 +132,10 @@ foreach_with_prefix language_choice { "auto" "ada" "c" } {
> [multi_line \
> "All types matching regular expression \"some_type\":" \
> "" \
> - "File .*global_pack.ads:" \
> + "File global_pack.ads:" \
> $type_in_ada($ada_match)\
> "" \
> - "File .*some_c.c:" \
> + "File some_c.c:" \
> $type_in_c($c_match)
> ]
>
> @@ -141,18 +143,18 @@ foreach_with_prefix language_choice { "auto" "ada" "c" } {
> [multi_line \
> "All variables matching regular expression \"some_struct\":" \
> "" \
> - "File .*global_pack.ads:" \
> + "File global_pack.ads:" \
> $var_in_ada($ada_match) \
> "" \
> - "File .*some_c.c:" \
> + "File some_c.c:" \
> $var_in_c($c_match)
> ]
>
> gdb_test "rbreak proc_in_" \
> [multi_line \
> - "Breakpoint.*file .*proc_in_ada.adb,.*" \
> + "Breakpoint.*file proc_in_ada.adb,.*" \
> $rbreak_func_in_ada($ada_match) \
> - "Breakpoint.*file .*some_c.c,.*" \
> + "Breakpoint.*file some_c.c,.*" \
> $rbreak_func_in_c($c_match) \
> "Successfully created breakpoints $decimal-$decimal."
> ]
> diff --git a/gdb/testsuite/gdb.dwarf2/symtab-sorting.exp b/gdb/testsuite/gdb.dwarf2/symtab-sorting.exp
> new file mode 100644
> index 00000000000..833c08ec4f1
> --- /dev/null
> +++ b/gdb/testsuite/gdb.dwarf2/symtab-sorting.exp
> @@ -0,0 +1,108 @@
> +# Copyright 2026 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/>.
> +
> +# Test handling of an array type whose bound comes from the field of a
> +# structure.
Copy and paste comment? This doesn't seem to describe this test.
> +
> +load_lib dwarf.exp
> +
> +# This test can only be run on targets which support DWARF-2 and use gas.
> +require dwarf2_support
> +
> +standard_testfile main.c -debug.S
> +
> +# Set up the DWARF for the test.
> +
> +set asm_file [standard_output_file $srcfile2]
> +Dwarf::assemble $asm_file {
> + global srcdir subdir srcfile
> +
> + cu {} {
> + DW_TAG_compile_unit {
> + DW_AT_language @DW_LANG_C
> + DW_AT_name /tmp/aaaa.c
> + } {
> + DW_TAG_base_type {
> + DW_AT_byte_size 1 DW_FORM_sdata
> + DW_AT_encoding @DW_ATE_unsigned
> + DW_AT_name byte1
> + }
> + }
> + }
> + cu {} {
> + DW_TAG_compile_unit {
> + DW_AT_language @DW_LANG_C
> + DW_AT_name bbbb.c
> + DW_AT_comp_dir /tmp
> + } {
> + DW_TAG_base_type {
> + DW_AT_byte_size 1 DW_FORM_sdata
> + DW_AT_encoding @DW_ATE_unsigned
> + DW_AT_name byte2
> + }
> + }
> + }
> + cu {} {
> + DW_TAG_compile_unit {
> + DW_AT_language @DW_LANG_C
> + DW_AT_name /tmp/cccc.c
> + } {
> + DW_TAG_base_type {
> + DW_AT_byte_size 1 DW_FORM_sdata
> + DW_AT_encoding @DW_ATE_unsigned
> + DW_AT_name byte3
> + }
> + }
> + }
> +}
> +
> +if { [prepare_for_testing "failed to prepare" ${testfile} \
> + [list $srcfile $asm_file] {nodebug}] } {
> + return
> +}
> +
> +gdb_test_no_output "set filename-display relative"
> +
> +# Here, bbbb.c is at the end because it sorts after "/tmp/cccc.c".
> +gdb_test "info types byte" \
> + [multi_line \
> + "All types matching regular expression \"byte\":" \
> + "" \
> + "File /tmp/aaaa.c:" \
> + " byte1" \
> + "" \
> + "File /tmp/cccc.c:" \
> + " byte3" \
> + "" \
> + "File bbbb.c:" \
> + " byte2"] \
> + "info types relative filenames"
> +
> +gdb_test_no_output "set filename-display basename"
> +
> +# Here the order is by basename.
> +gdb_test "info types byte" \
> + [multi_line \
> + "All types matching regular expression \"byte\":" \
> + "" \
> + "File aaaa.c:" \
> + " byte1" \
> + "" \
> + "File bbbb.c:" \
> + " byte2" \
> + "" \
> + "File cccc.c:" \
> + " byte3"] \
> + "info types basenames"
>
For completeness, would it be worth adding a third test here using "set
filename-display absolute"?
With these two issues fixed:
Approved-By: Andrew Burgess <aburgess@redhat.com>
Thanks,
Andrew
> base-commit: 1eed06ae51d73a195b78ce0903ada9c9c2c14cfb
> --
> 2.54.0
next prev parent reply other threads:[~2026-06-10 16:03 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-06-09 16:34 Tom Tromey
2026-06-10 16:01 ` Andrew Burgess [this message]
2026-06-10 20:21 ` Tom Tromey
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=87y0gmpeoo.fsf@redhat.com \
--to=aburgess@redhat.com \
--cc=gdb-patches@sourceware.org \
--cc=tromey@adacore.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox