From af3768e945b188caa141e3285dc3eb84f440a673 Mon Sep 17 00:00:00 2001 From: Doug Evans Date: Mon, 10 Nov 2014 15:48:49 -0800 Subject: [PATCH] PR 17564: Fix objfile search order for static symbols. When searching static symbols, gdb would search over all expanded symtabs of all objfiles, and if that fails only then would it search all partial/gdb_index tables of all objfiles. This means that the user could get a random instance of the symbol depending on what symtabs have been previously expanded. Now the search is consistent, searching each objfile completely before proceeding to the next one. gdb/ChangeLog: PR symtab/17564 * symtab.c (lookup_symbol_in_all_objfiles): Delete. (lookup_static_symbol): Move definition to new location and rewrite. (lookup_symbol_in_objfile): New function. (lookup_symbol_global_iterator_cb): Call it. gdb/testsuite/ChangeLog: PR symtab/17564 * gdb.base/symtab-search-order.exp: New file. * gdb.base/symtab-search-order.c: New file. * gdb.base/symtab-search-order-1.c: New file. * gdb.base/symtab-search-order-shlib-1.c: New file. --- gdb/ChangeLog | 8 ++ gdb/symtab.c | 97 ++++++++----------- gdb/testsuite/ChangeLog | 8 ++ .../gdb.base/symtab-search-order-1.c | 1 + .../gdb.base/symtab-search-order-shlib-1.c | 7 ++ gdb/testsuite/gdb.base/symtab-search-order.c | 11 +++ .../gdb.base/symtab-search-order.exp | 59 +++++++++++ 7 files changed, 137 insertions(+), 54 deletions(-) create mode 100644 gdb/testsuite/gdb.base/symtab-search-order-1.c create mode 100644 gdb/testsuite/gdb.base/symtab-search-order-shlib-1.c create mode 100644 gdb/testsuite/gdb.base/symtab-search-order.c create mode 100644 gdb/testsuite/gdb.base/symtab-search-order.exp diff --git a/gdb/ChangeLog b/gdb/ChangeLog index ea055da4a5..56e43410fc 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,11 @@ +2014-11-10 Doug Evans + + PR symtab/17564 + * symtab.c (lookup_symbol_in_all_objfiles): Delete. + (lookup_static_symbol): Move definition to new location and rewrite. + (lookup_symbol_in_objfile): New function. + (lookup_symbol_global_iterator_cb): Call it. + 2014-11-10 Ulrich Weigand  * eval.c (evaluate_subexp_standard): Work around GCC bug 63748. diff --git a/gdb/symtab.c b/gdb/symtab.c index df974bfbb9..4f4ecf81e8 100644 --- a/gdb/symtab.c +++ b/gdb/symtab.c @@ -79,11 +79,6 @@ struct symbol *lookup_local_symbol (const char *name, const domain_enum domain, enum language language); -static -struct symbol *lookup_symbol_in_all_objfiles (int block_index, - const char *name, - const domain_enum domain); - static struct symbol *lookup_symbol_via_quick_fns (struct objfile *objfile, int block_index, @@ -1474,28 +1469,6 @@ lookup_symbol_aux (const char *name, const struct block *block, return lookup_static_symbol (name, domain); } -/* See symtab.h. */ - -struct symbol * -lookup_static_symbol (const char *name, const domain_enum domain) -{ - struct objfile *objfile; - struct symbol *sym; - - sym = lookup_symbol_in_all_objfiles (STATIC_BLOCK, name, domain); - if (sym != NULL) - return sym; - - ALL_OBJFILES (objfile) - { - sym = lookup_symbol_via_quick_fns (objfile, STATIC_BLOCK, name, domain); - if (sym != NULL) - return sym; - } - - return NULL; -} - /* Check to see if the symbol is defined in BLOCK or its superiors. Don't search STATIC_BLOCK or GLOBAL_BLOCK. */ @@ -1650,27 +1623,6 @@ lookup_symbol_in_objfile_symtabs (struct objfile *objfile, int block_index, return NULL; } -/* Wrapper around lookup_symbol_in_objfile_symtabs to search all objfiles. - Returns the first match found. */ - -static struct symbol * -lookup_symbol_in_all_objfiles (int block_index, const char *name, - const domain_enum domain) -{ - struct symbol *sym; - struct objfile *objfile; - - ALL_OBJFILES (objfile) - { - sym = lookup_symbol_in_objfile_symtabs (objfile, block_index, name, - domain); - if (sym) - return sym; - } - - return NULL; -} - /* Wrapper around lookup_symbol_in_objfile_symtabs for search_symbols. Look up LINKAGE_NAME in DOMAIN in the global and static blocks of OBJFILE and all related objfiles. */ @@ -1774,7 +1726,7 @@ basic_lookup_symbol_nonlocal (const char *name, not it would be appropriate to search the current global block here as well. (That's what this code used to do before the is_a_field_of_this check was moved up.) On the one hand, it's - redundant with the lookup_symbol_in_all_objfiles search that happens + redundant with the lookup in all objfiles search that happens next. On the other hand, if decode_line_1 is passed an argument like filename:var, then the user presumably wants 'var' to be searched for in filename. On the third hand, there shouldn't be @@ -1818,6 +1770,46 @@ lookup_symbol_in_static_block (const char *name, return NULL; } +/* Perform the standard symbol lookup of NAME in OBJFILE: + 1) First search expanded symtabs, and if not found + 2) Search the "quick" symtabs (partial or .gdb_index). + BLOCK_INDEX is one of GLOBAL_BLOCK or STATIC_BLOCK. */ + +static struct symbol * +lookup_symbol_in_objfile (struct objfile *objfile, int block_index, + const char *name, const domain_enum domain) +{ + struct symbol *result; + + result = lookup_symbol_in_objfile_symtabs (objfile, block_index, + name, domain); + if (result == NULL) + { + result = lookup_symbol_via_quick_fns (objfile, block_index, + name, domain); + } + + return result; +} + +/* See symtab.h. */ + +struct symbol * +lookup_static_symbol (const char *name, const domain_enum domain) +{ + struct objfile *objfile; + struct symbol *result; + + ALL_OBJFILES (objfile) + { + result = lookup_symbol_in_objfile (objfile, STATIC_BLOCK, name, domain); + if (result != NULL) + return result; + } + + return NULL; +} + /* Private data to be used with lookup_symbol_global_iterator_cb. */ struct global_sym_lookup_data @@ -1847,11 +1839,8 @@ lookup_symbol_global_iterator_cb (struct objfile *objfile, gdb_assert (data->result == NULL); - data->result = lookup_symbol_in_objfile_symtabs (objfile, GLOBAL_BLOCK, - data->name, data->domain); - if (data->result == NULL) - data->result = lookup_symbol_via_quick_fns (objfile, GLOBAL_BLOCK, - data->name, data->domain); + data->result = lookup_symbol_in_objfile (objfile, GLOBAL_BLOCK, + data->name, data->domain); /* If we found a match, tell the iterator to stop. Otherwise, keep going. */ diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 6187c749dc..898a910cb5 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2014-11-10 Doug Evans + + PR symtab/17564 + * gdb.base/symtab-search-order.exp: New file. + * gdb.base/symtab-search-order.c: New file. + * gdb.base/symtab-search-order-1.c: New file. + * gdb.base/symtab-search-order-shlib-1.c: New file. + 2014-11-07 Pedro Alves PR gdb/17511 diff --git a/gdb/testsuite/gdb.base/symtab-search-order-1.c b/gdb/testsuite/gdb.base/symtab-search-order-1.c new file mode 100644 index 0000000000..bff9b7ac12 --- /dev/null +++ b/gdb/testsuite/gdb.base/symtab-search-order-1.c @@ -0,0 +1 @@ +static int static_global = 23; diff --git a/gdb/testsuite/gdb.base/symtab-search-order-shlib-1.c b/gdb/testsuite/gdb.base/symtab-search-order-shlib-1.c new file mode 100644 index 0000000000..a23da5f313 --- /dev/null +++ b/gdb/testsuite/gdb.base/symtab-search-order-shlib-1.c @@ -0,0 +1,7 @@ +static int static_global = 42; + +int +shlib_1_func (void) +{ + return static_global; +} diff --git a/gdb/testsuite/gdb.base/symtab-search-order.c b/gdb/testsuite/gdb.base/symtab-search-order.c new file mode 100644 index 0000000000..ab38db6ee8 --- /dev/null +++ b/gdb/testsuite/gdb.base/symtab-search-order.c @@ -0,0 +1,11 @@ +extern int shlib_1_func (void); + +int +main () +{ + /* We need a reference to shlib_1_func to make sure its shlib is + not discarded from the link. This happens on windows. */ + int x = shlib_1_func (); + + return 0; +} diff --git a/gdb/testsuite/gdb.base/symtab-search-order.exp b/gdb/testsuite/gdb.base/symtab-search-order.exp new file mode 100644 index 0000000000..eb39d87bb8 --- /dev/null +++ b/gdb/testsuite/gdb.base/symtab-search-order.exp @@ -0,0 +1,59 @@ +# Copyright 2014 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 . + +if {[skip_shlib_tests]} { + return 0 +} + +standard_testfile .c symtab-search-order-1.c symtab-search-order-shlib-1.c +set srcfile $srcdir/$subdir/$srcfile +set srcfile2 $srcdir/$subdir/$srcfile2 +set lib1src $srcdir/$subdir/$srcfile3 +set lib1 [standard_output_file symtab-search-order-1.sl] + +set lib_opts "debug" +set exec_opts [list debug shlib=$lib1] + +if [get_compiler_info] { + return -1 +} + +if { [gdb_compile_shlib $lib1src $lib1 $lib_opts] != "" + || [gdb_compile [list $srcfile $srcfile2] $binfile executable \ + $exec_opts] != ""} { + untested "Could not compile $lib1, or $srcfile." + return -1 +} + +# Start with a fresh gdb. + +clean_restart $binfile +gdb_load_shlibs $lib1 + +if ![runto_main] { + fail "Can't run to main" + return -1 +} + +# PR 17564 +# Expand something in the shared library, +# and then try to print static_global in the binary. +# We should get the static_global in the binary. +# Note: static_global in the binary needs to be in a file +# other than the one with "main" because gdb will expand +# the symtab with main when starting. + +gdb_test "p shlib_1_func" "= .*" +gdb_test "p static_global" " = 23" -- 2.34.1