diff options
-rw-r--r-- | gdb/ChangeLog | 8 | ||||
-rw-r--r-- | gdb/symtab.c | 97 | ||||
-rw-r--r-- | gdb/testsuite/ChangeLog | 8 | ||||
-rw-r--r-- | gdb/testsuite/gdb.base/symtab-search-order-1.c | 1 | ||||
-rw-r--r-- | gdb/testsuite/gdb.base/symtab-search-order-shlib-1.c | 7 | ||||
-rw-r--r-- | gdb/testsuite/gdb.base/symtab-search-order.c | 11 | ||||
-rw-r--r-- | gdb/testsuite/gdb.base/symtab-search-order.exp | 59 |
7 files changed, 137 insertions, 54 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index ea055da..56e4341 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,11 @@ +2014-11-10 Doug Evans <xdje42@gmail.com> + + 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 <uweigand@de.ibm.com> * eval.c (evaluate_subexp_standard): Work around GCC bug 63748. diff --git a/gdb/symtab.c b/gdb/symtab.c index df974bf..4f4ecf8 100644 --- a/gdb/symtab.c +++ b/gdb/symtab.c @@ -80,11 +80,6 @@ struct symbol *lookup_local_symbol (const char *name, 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, const char *name, @@ -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 6187c74..898a910 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2014-11-10 Doug Evans <xdje42@gmail.com> + + 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 <palves@redhat.com> 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 0000000..bff9b7a --- /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 0000000..a23da5f --- /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 0000000..ab38db6 --- /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 0000000..eb39d87 --- /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 <http://www.gnu.org/licenses/>. + +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" "= .*<shlib_1_func>" +gdb_test "p static_global" " = 23" |