Re: MI: -file-list-exec-source-files

Eli Zaretskii
2006-06-03T09:46:53Z

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1: Type: text/plain, Size: 5641 bytes --]

> From: Nick Roberts <nickrob@snap.net.nz>
> Date: Sat, 3 Jun 2006 13:27:48 +1200
> Cc: Jim Blandy <jimb@codesourcery.com>, gdb@sourceware.org
>
> I think it's always best to start with the simplest case:
>
> mytest.c:
>
> main ()
> {
> myproc ();
> }
>
>
> myproc.c:
>
> myproc ()
> {
> return 0;
> }
>
> With gcc (GCC) 4.1.0 20060304 (Red Hat 4.1.0-3)
> cc -g -c myproc.c
> cc -g -o mytest mytest.c myproc.o
>
> With GNU gdb 6.5.50.20060601-cvs, I get:
>
> (gdb)
> -file-list-exec-source-files
> ^done,files=[{file="myproc.c",fullname="/home/nickrob/myproc.c"},{file="myproc.c",fullname="/home/nickrob/myproc.c"},{file="mytest.c",fullname="/home/nickrob/mytest.c"},{file="mytest.c",fullname="/home/nickrob/mytest.c"}]

With GDB 6.4 and GCC 3.3.5, just stepping through the code of
mi_cmd_file_list_exec_source_files, I clearly see that there are two
psymtab entries for each source file:

(top-gdb) br mi_cmd_file_list_exec_source_files
Breakpoint 3 at 0x80bf7c8: file ../gdb/mi/mi-cmd-file.c, line 74.
(top-gdb) cd ../..
Working directory /home/e/eliz.
(top-gdb) r --interpreter=mi ./mytest
Starting program: /home/e/eliz/gdb-6.4/gdb/gdb --interpreter=mi ./mytest
~"GNU gdb 6.4\n"
~"Copyright 2005 Free Software Foundation, Inc.\n"
~"GDB is free software, covered by the GNU General Public License, and you are\n"
~"welcome to change it and/or distribute copies of it under certain conditions.\n"
~"Type \"show copying\" to see the conditions.\n"
~"There is absolutely no warranty for GDB. Type \"show warranty\" for details.\n"
~"This GDB was configured as \"i686-pc-linux-gnu\"..."
~"Using host libthread_db library \"/lib/tls/libthread_db.so.1\".\n"
~"\n"
(gdb)
-file-list-exec-source-files

Breakpoint 3, mi_cmd_file_list_exec_source_files (
command=0x83304b0 "file-list-exec-source-files", argv=
During symbol reading, incomplete CFI data; unspecified registers (e.g., eax) at 0x80bf7c8.
0x83304b0, argc=137561264) at ../gdb/mi/mi-cmd-file.c:74
74 if (!mi_valid_noargs ("mi_cmd_file_list_exec_source_files", argc, argv))
(top-gdb) n
78 ui_out_begin (uiout, ui_out_type_list, "files");
(top-gdb) n
81 ALL_SYMTABS (objfile, s)
(top-gdb) n
97 ALL_PSYMTABS (objfile, ps)
(top-gdb) p *objfile
$3 = {next = 0x0, name = 0x8312838 "/home/e/eliz/mytest", flags = 6,
symtabs = 0x0, psymtabs = 0x8335740, free_psymtabs = 0x0, obfd = 0x8312878,
mtime = 1149325604, objfile_obstack = {chunk_size = 4072, chunk = 0x83356e0,
[...]
stats = {n_minsyms = 36, n_psyms = 109, n_syms = 0, n_stabs = 0,
n_types = 0, sz_strtab = 0}, cp_namespace_symtab = 0x0}
(top-gdb) p *objfile->psymtabs
$4 = {next = 0x83356e8,
filename = 0x8335788 "/build/buildd/glibc-2.3.2.ds1/build-tree/i386-libc/csu/crtn.S", fullname = 0x0,
dirname = 0x8330470 "/build/buildd/glibc-2.3.2.ds1/build-tree/glibc-2.3.2/csu", objfile = 0x8326a98, section_offsets = 0x832cd6c, textlow = 0, texthigh = 0,
dependencies = 0x0, number_of_dependencies = 0, globals_offset = 3,
n_global_syms = 0, statics_offset = 106, n_static_syms = 0, symtab = 0x0,
read_symtab = 0x814e870 <dwarf2_psymtab_to_symtab>,
read_symtab_private = 0x8331e38 "±\n", readin = 0 '\0'}
(top-gdb) p *objfile->psymtabs->next
$5 = {next = 0x8332694, filename = 0x8335730 "myproc.c", fullname = 0x0,
dirname = 0x0, objfile = 0x8326a98, section_offsets = 0x832cd6c,
textlow = 0, texthigh = 0, dependencies = 0x833573c,
number_of_dependencies = 1, globals_offset = 0, n_global_syms = 0,
statics_offset = 0, n_static_syms = 0, symtab = 0x0,
read_symtab = 0x814e870 <dwarf2_psymtab_to_symtab>,
read_symtab_private = 0x0, readin = 0 '\0'}
(top-gdb) p *objfile->psymtabs->next->next
$6 = {next = 0x833263c, filename = 0x83326dc "myproc.c", fullname = 0x0,
dirname = 0x8314b70 "/home/e/eliz", objfile = 0x8326a98,
section_offsets = 0x832cd6c, textlow = 134513516, texthigh = 134513526,
dependencies = 0x0, number_of_dependencies = 0, globals_offset = 2,
n_global_syms = 1, statics_offset = 105, n_static_syms = 1, symtab = 0x0,
read_symtab = 0x814e870 <dwarf2_psymtab_to_symtab>,
read_symtab_private = 0x8331e24 "9\n", readin = 0 '\0'}
(top-gdb) p *objfile->psymtabs->next->next->next
$7 = {next = 0x83325e8, filename = 0x8332684 "mytest.c", fullname = 0x0,
dirname = 0x0, objfile = 0x8326a98, section_offsets = 0x832cd6c,
textlow = 0, texthigh = 0, dependencies = 0x8332690,
number_of_dependencies = 1, globals_offset = 0, n_global_syms = 0,
statics_offset = 0, n_static_syms = 0, symtab = 0x0,
read_symtab = 0x814e870 <dwarf2_psymtab_to_symtab>,
read_symtab_private = 0x0, readin = 0 '\0'}
(top-gdb) p *objfile->psymtabs->next->next->next->next
$8 = {next = 0x8332560, filename = 0x8332630 "mytest.c", fullname = 0x0,
dirname = 0x8314300 "/home/e/eliz", objfile = 0x8326a98,
section_offsets = 0x832cd6c, textlow = 134513492, texthigh = 134513515,
dependencies = 0x0, number_of_dependencies = 0, globals_offset = 1,
n_global_syms = 1, statics_offset = 104, n_static_syms = 1, symtab = 0x0,
read_symtab = 0x814e870 <dwarf2_psymtab_to_symtab>,
read_symtab_private = 0x8331e10 "¬\t", readin = 0 '\0'}
(top-gdb)

As you see, there are two entries for myproc.c and two entries for
mytest.c, one with a NULL dirname, the other with a non-NULL dirname.

Sounds like we should implement duplicate removal from the UI lists?