From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 15339 invoked by alias); 23 Apr 2011 04:53:45 -0000 Received: (qmail 15329 invoked by uid 22791); 23 Apr 2011 04:53:43 -0000 X-SWARE-Spam-Status: No, hits=-6.2 required=5.0 tests=AWL,BAYES_00,RCVD_IN_DNSWL_HI,SPF_HELO_PASS,TW_BJ,TW_FN,TW_GD,TW_YM,T_RP_MATCHES_RCVD X-Spam-Check-By: sourceware.org Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Sat, 23 Apr 2011 04:53:24 +0000 Received: from int-mx02.intmail.prod.int.phx2.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id p3N4rOaS014874 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Sat, 23 Apr 2011 00:53:24 -0400 Received: from host1.jankratochvil.net (ovpn01.gateway.prod.ext.phx2.redhat.com [10.5.9.1]) by int-mx02.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id p3N4rLcw010591 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Sat, 23 Apr 2011 00:53:23 -0400 Received: from host1.jankratochvil.net (localhost [127.0.0.1]) by host1.jankratochvil.net (8.14.4/8.14.4) with ESMTP id p3N4rKEa027960; Sat, 23 Apr 2011 06:53:20 +0200 Received: (from jkratoch@localhost) by host1.jankratochvil.net (8.14.4/8.14.4/Submit) id p3N4rK26027955; Sat, 23 Apr 2011 06:53:20 +0200 Date: Sat, 23 Apr 2011 04:53:00 -0000 From: Jan Kratochvil To: Tom Tromey Cc: gdb-patches@sourceware.org Subject: [wrong patch] Re: [patch+7.3] gdbindex regression: stabs forgotten Message-ID: <20110423045320.GA6190@host1.jankratochvil.net> References: <20110409152300.GA13143@host1.jankratochvil.net> <20110417163126.GA23189@host1.jankratochvil.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.21 (2010-09-15) X-IsSubscribed: yes Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2011-04/txt/msg00420.txt.bz2 On Mon, 18 Apr 2011 19:31:21 +0200, Tom Tromey wrote: > >>>>> "Jan" == Jan Kratochvil 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; } - - /* 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 . */ + +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 . */ + +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 . + +# 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 .*"