[wrong patch] Re: [patch+7.3] gdbindex regression: stabs forgotten

Jan Kratochvil
2011-04-23T04:53:45Z

On Mon, 18 Apr 2011 19:31:21 +0200, Tom Tromey wrote:
> >>>>> "Jan" == Jan Kratochvil <jan.kratochvil@redhat.com> writes:
> Jan> if (dwarf2_has_info (objfile))
> Jan> {
> Jan> - if (dwarf2_initialize_objfile (objfile))
> Jan> + /* elf_sym_fns_gdb_index cannot handle simultaneous non-DWARF debug
> Jan> + information present in OBJFILE. If there is such debug info present
> Jan> + never use .gdb_index. */
> Jan> +
> Jan> + if (!objfile_has_partial_symbols (objfile)
> Jan> + && dwarf2_initialize_objfile (objfile))
>
> This makes the case of "stabs, plus gnu index, plus -readnow" a little
> worse.

I tried to use elf_sym_fns_gdb_index even for STABS+DWARF files but that does
not work:
$ ../gdb -readnow -nx gdb.base/gdbindex-stabs -ex 'list stabs_function' -ex q
No line number known for stabs_function.

It seems even understandable for me. dwarf2_gdb_index_functions would need to
fallback to psym_functions IMO, if you meant that. I am not going to
implement that part, therefore just FYI.

> It is hard to imagine anybody caring about this kind of thing though.
> I just thought it was funny.

While it will probably never happen in Fedora still STABS is in use at least
for Firefox upstream and static libraries are also in use outside of Fedora so
I can imagine it may happen. Still -readnow needs no optimizations, I agree.

Thanks,
Jan

--- a/gdb/dwarf2read.c
+++ b/gdb/dwarf2read.c
@@ -2044,10 +2044,11 @@ find_slot_in_mapped_hash (struct mapped_index *index, const char *name,
}

/* Read the index file. If everything went ok, initialize the "quick"
- elements of all the CUs and return 1. Otherwise, return 0. */
+ elements of all the CUs and return 1 to use the GNU index. Otherwise,
+ return 0 so this file will use psymtabs. */

-static int
-dwarf2_read_index (struct objfile *objfile)
+int
+dwarf2_initialize_objfile (struct objfile *objfile)
{
char *addr;
struct mapped_index *map;
@@ -2727,49 +2728,31 @@ const struct quick_symbol_functions dwarf2_gdb_index_functions =
dw2_map_symbol_filenames
};

-/* Initialize for reading DWARF for this objfile. Return 0 if this
- file will use psymtabs, or 1 if using the GNU index. */
+/* If we're about to read full symbols, don't bother with the indices. In this
+ case we also don't care if some other debug format is making psymtabs,
+ because they are all about to be expanded anyway. */

-int
-dwarf2_initialize_objfile (struct objfile *objfile)
+void
+dwarf2_initialize_objfile_readnow (struct objfile *objfile)
{
- /* If we're about to read full symbols, don't bother with the
- indices. In this case we also don't care if some other debug
- format is making psymtabs, because they are all about to be
- expanded anyway. */
- if ((objfile->flags & OBJF_READNOW))
- {
- int i;
-
- dwarf2_per_objfile->using_index = 1;
- create_all_comp_units (objfile);
- create_debug_types_hash_table (objfile);
- dwarf2_per_objfile->quick_file_names_table =
- create_quick_file_names_table (dwarf2_per_objfile->n_comp_units);
+ int i;

- for (i = 0; i < (dwarf2_per_objfile->n_comp_units
- + dwarf2_per_objfile->n_type_comp_units); ++i)
- {
- struct dwarf2_per_cu_data *per_cu = dw2_get_cu (i);
+ dwarf2_per_objfile->using_index = 1;
+ create_all_comp_units (objfile);
+ create_debug_types_hash_table (objfile);
+ dwarf2_per_objfile->quick_file_names_table =
+ create_quick_file_names_table (dwarf2_per_objfile->n_comp_units);

- per_cu->v.quick = OBSTACK_ZALLOC (&objfile->objfile_obstack,
- struct dwarf2_per_cu_quick_data);
- }
+ for (i = 0; i < (dwarf2_per_objfile->n_comp_units
+ + dwarf2_per_objfile->n_type_comp_units); ++i)
+ {
+ struct dwarf2_per_cu_data *per_cu = dw2_get_cu (i);

- /* Return 1 so that gdb sees the "quick" functions. However,
- these functions will be no-ops because we will have expanded
- all symtabs. */
- return 1;
+ per_cu->v.quick = OBSTACK_ZALLOC (&objfile->objfile_obstack,
+ struct dwarf2_per_cu_quick_data);
}
-
- if (dwarf2_read_index (objfile))
- return 1;
-
- return 0;
}

-\f
-
/* Build a partial symbol table. */

void
--- a/gdb/elfread.c
+++ b/gdb/elfread.c
@@ -1396,7 +1396,19 @@ elf_symfile_read (struct objfile *objfile, int symfile_flags)

if (dwarf2_has_info (objfile))
{
- if (dwarf2_initialize_objfile (objfile))
+ if (objfile->flags & OBJF_READNOW)
+ {
+ dwarf2_initialize_objfile_readnow (objfile);
+
+ /* GDB will use the "quick" functions. However, these functions will
+ be no-ops because we will have expanded all symtabs. */
+ objfile->sf = &elf_sym_fns_gdb_index;
+ }
+ /* elf_sym_fns_gdb_index cannot handle simultaneous non-DWARF debug
+ information present in OBJFILE. If there is such debug info present
+ never use .gdb_index. */
+ else if (!objfile_has_partial_symbols (objfile)
+ && dwarf2_initialize_objfile (objfile))
objfile->sf = &elf_sym_fns_gdb_index;
else
{
--- a/gdb/objfiles.c
+++ b/gdb/objfiles.c
@@ -909,8 +909,9 @@ objfile_has_partial_symbols (struct objfile *objfile)
/* If we have not read psymbols, but we have a function capable of
reading them, then that is an indication that they are in fact
available. */
- if ((objfile->flags & OBJF_PSYMTABS_READ) == 0)
- return objfile->sf->sym_read_psymbols != NULL;
+ if ((objfile->flags & OBJF_PSYMTABS_READ) == 0
+ && objfile->sf->sym_read_psymbols != NULL)
+ return 1;
return objfile->sf->qf->has_symbols (objfile);
}

--- a/gdb/symfile.h
+++ b/gdb/symfile.h
@@ -556,6 +556,7 @@ extern struct cleanup *increment_reading_symtab (void);
extern int dwarf2_has_info (struct objfile *);

extern int dwarf2_initialize_objfile (struct objfile *);
+extern void dwarf2_initialize_objfile_readnow (struct objfile *);
extern void dwarf2_build_psymtabs (struct objfile *);
extern void dwarf2_build_frame_info (struct objfile *);

--- /dev/null
+++ b/gdb/testsuite/gdb.base/gdbindex-stabs-dwarf.c
@@ -0,0 +1,25 @@
+/* This testcase is part of GDB, the GNU debugger.
+
+ Copyright 2011 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 void stabs_function (void);
+
+int
+main (void)
+{
+ stabs_function ();
+ return 0;
+}
--- /dev/null
+++ b/gdb/testsuite/gdb.base/gdbindex-stabs.c
@@ -0,0 +1,21 @@
+/* This testcase is part of GDB, the GNU debugger.
+
+ Copyright 2011 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/>. */
+
+void
+stabs_function (void) /* marker-here */
+{
+}
--- /dev/null
+++ b/gdb/testsuite/gdb.base/gdbindex-stabs.exp
@@ -0,0 +1,36 @@
+# Copyright (C) 2011 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/>.
+
+# This problem is reproducible only when using `gdb/cc-with-index.sh'.
+
+set testfile gdbindex-stabs
+set executable ${testfile}
+set binfile ${objdir}/${subdir}/${executable}
+set srcfile_stabs ${testfile}.c
+set srcfile_dwarf ${testfile}-dwarf.c
+set objfile_stabs ${testfile}.o
+set objfile_dwarf ${testfile}-dwarf.o
+
+if {[gdb_compile "${srcdir}/${subdir}/${srcfile_stabs}" ${objfile_stabs} object {additional_flags=-gstabs}] != ""
+ || [gdb_compile "${srcdir}/${subdir}/${srcfile_dwarf}" ${objfile_dwarf} object {additional_flags=-gdwarf-2}] != ""
+ || [gdb_compile "${objfile_stabs} ${objfile_dwarf}" ${binfile} executable {nodebug}] != ""} {
+ untested ${testfile}.exp
+ return -1
+}
+
+clean_restart ${executable}
+
+# FAIL was: No line number known for stabs_function.
+gdb_test "list stabs_function" " marker-here .*"