From 99a547d6792f51503719e01937129b94597c5a67 Mon Sep 17 00:00:00 2001 From: Joel Brobecker Date: Thu, 10 May 2012 16:24:40 +0000 Subject: [PATCH] Search global symbols from the expression's block objfile first. gdb/ChangeLog: * findvar.c (default_read_var_value): For LOC_UNRESOLVED symbols, try locating the symbol in the symbol's own objfile first, before extending the search to all objfiles. * symtab.c (lookup_symbol_aux_objfile): New function, extracted out of lookup_symbol_aux_symtabs. (lookup_symbol_aux_symtabs): Add new parameter "exclude_objfile". Replace extracted-out code by call to lookup_symbol_aux_objfile. Do not search EXCLUDE_OBJFILE. (lookup_static_symbol_aux): Update call to lookup_symbol_aux_symtabs. (lookup_symbol_global): Search for matches in the block's objfile first, before searching all other objfiles. --- gdb/ChangeLog | 14 ++++++++ gdb/findvar.c | 10 +++++- gdb/symtab.c | 108 +++++++++++++++++++++++++++++++++++++++++----------------- 3 files changed, 99 insertions(+), 33 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index be59495..01f4be9 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,17 @@ +2012-05-10 Joel Brobecker + + * findvar.c (default_read_var_value): For LOC_UNRESOLVED symbols, + try locating the symbol in the symbol's own objfile first, before + extending the search to all objfiles. + * symtab.c (lookup_symbol_aux_objfile): New function, extracted + out of lookup_symbol_aux_symtabs. + (lookup_symbol_aux_symtabs): Add new parameter "exclude_objfile". + Replace extracted-out code by call to lookup_symbol_aux_objfile. + Do not search EXCLUDE_OBJFILE. + (lookup_static_symbol_aux): Update call to lookup_symbol_aux_symtabs. + (lookup_symbol_global): Search for matches in the block's objfile + first, before searching all other objfiles. + 2012-05-10 Tristan Gingold * printcmd.c (set_command): Add pre/post inc/dec. diff --git a/gdb/findvar.c b/gdb/findvar.c index 9009e6f..ed7903c 100644 --- a/gdb/findvar.c +++ b/gdb/findvar.c @@ -562,7 +562,15 @@ default_read_var_value (struct symbol *var, struct frame_info *frame) struct minimal_symbol *msym; struct obj_section *obj_section; - msym = lookup_minimal_symbol (SYMBOL_LINKAGE_NAME (var), NULL, NULL); + /* First, try locating the associated minimal symbol within + the same objfile. This prevents us from selecting another + symbol with the same name but located in a different objfile. */ + msym = lookup_minimal_symbol (SYMBOL_LINKAGE_NAME (var), NULL, + SYMBOL_SYMTAB (var)->objfile); + /* If the lookup failed, try expanding the search to all + objfiles. */ + if (msym == NULL) + msym = lookup_minimal_symbol (SYMBOL_LINKAGE_NAME (var), NULL, NULL); if (msym == NULL) error (_("No global symbol \"%s\"."), SYMBOL_LINKAGE_NAME (var)); if (overlay_debugging) diff --git a/gdb/symtab.c b/gdb/symtab.c index d68e542..3fce349 100644 --- a/gdb/symtab.c +++ b/gdb/symtab.c @@ -95,7 +95,8 @@ struct symbol *lookup_symbol_aux_local (const char *name, static struct symbol *lookup_symbol_aux_symtabs (int block_index, const char *name, - const domain_enum domain); + const domain_enum domain, + struct objfile *exclude_objfile); static struct symbol *lookup_symbol_aux_quick (struct objfile *objfile, @@ -1361,7 +1362,7 @@ lookup_static_symbol_aux (const char *name, const domain_enum domain) struct objfile *objfile; struct symbol *sym; - sym = lookup_symbol_aux_symtabs (STATIC_BLOCK, name, domain); + sym = lookup_symbol_aux_symtabs (STATIC_BLOCK, name, domain, NULL); if (sym != NULL) return sym; @@ -1500,40 +1501,61 @@ lookup_global_symbol_from_objfile (const struct objfile *main_objfile, return NULL; } -/* Check to see if the symbol is defined in one of the symtabs. - BLOCK_INDEX should be either GLOBAL_BLOCK or STATIC_BLOCK, +/* Check to see if the symbol is defined in one of the OBJFILE's + symtabs. BLOCK_INDEX should be either GLOBAL_BLOCK or STATIC_BLOCK, depending on whether or not we want to search global symbols or static symbols. */ static struct symbol * -lookup_symbol_aux_symtabs (int block_index, const char *name, - const domain_enum domain) +lookup_symbol_aux_objfile (struct objfile *objfile, int block_index, + const char *name, const domain_enum domain) { - struct symbol *sym; - struct objfile *objfile; + struct symbol *sym = NULL; struct blockvector *bv; const struct block *block; struct symtab *s; + if (objfile->sf) + objfile->sf->qf->pre_expand_symtabs_matching (objfile, block_index, + name, domain); + + ALL_OBJFILE_SYMTABS (objfile, s) + if (s->primary) + { + bv = BLOCKVECTOR (s); + block = BLOCKVECTOR_BLOCK (bv, block_index); + sym = lookup_block_symbol (block, name, domain); + if (sym) + { + block_found = block; + return fixup_symbol_section (sym, objfile); + } + } + + return NULL; +} + +/* Same as lookup_symbol_aux_objfile, except that it searches all + objfiles except for EXCLUDE_OBJFILE. Return the first match found. + + If EXCLUDE_OBJFILE is NULL, then all objfiles are searched. */ + +static struct symbol * +lookup_symbol_aux_symtabs (int block_index, const char *name, + const domain_enum domain, + struct objfile *exclude_objfile) +{ + struct symbol *sym; + struct objfile *objfile; + ALL_OBJFILES (objfile) { - if (objfile->sf) - objfile->sf->qf->pre_expand_symtabs_matching (objfile, - block_index, - name, domain); - - ALL_OBJFILE_SYMTABS (objfile, s) - if (s->primary) - { - bv = BLOCKVECTOR (s); - block = BLOCKVECTOR_BLOCK (bv, block_index); - sym = lookup_block_symbol (block, name, domain); - if (sym) - { - block_found = block; - return fixup_symbol_section (sym, objfile); - } - } + if (objfile != exclude_objfile) + { + sym = lookup_symbol_aux_objfile (objfile, block_index, name, domain); + if (sym) + return sym; + } } return NULL; @@ -1659,24 +1681,46 @@ lookup_symbol_global (const char *name, const domain_enum domain) { struct symbol *sym = NULL; + struct objfile *block_objfile = NULL; struct objfile *objfile = NULL; /* Call library-specific lookup procedure. */ - objfile = lookup_objfile_from_block (block); - if (objfile != NULL) - sym = solib_global_lookup (objfile, name, domain); + block_objfile = lookup_objfile_from_block (block); + if (block_objfile != NULL) + sym = solib_global_lookup (block_objfile, name, domain); if (sym != NULL) return sym; - sym = lookup_symbol_aux_symtabs (GLOBAL_BLOCK, name, domain); + /* If BLOCK_OBJFILE is not NULL, then search this objfile first. + In case the global symbol is defined in multiple objfiles, + we have a better chance of finding the most relevant symbol. */ + + if (block_objfile != NULL) + { + sym = lookup_symbol_aux_objfile (block_objfile, GLOBAL_BLOCK, + name, domain); + if (sym == NULL) + sym = lookup_symbol_aux_quick (block_objfile, GLOBAL_BLOCK, + name, domain); + if (sym != NULL) + return sym; + } + + /* Symbol not found in the BLOCK_OBJFILE, so try all the other + objfiles, starting with symtabs first, and then partial symtabs. */ + + sym = lookup_symbol_aux_symtabs (GLOBAL_BLOCK, name, domain, block_objfile); if (sym != NULL) return sym; ALL_OBJFILES (objfile) { - sym = lookup_symbol_aux_quick (objfile, GLOBAL_BLOCK, name, domain); - if (sym) - return sym; + if (objfile != block_objfile) + { + sym = lookup_symbol_aux_quick (objfile, GLOBAL_BLOCK, name, domain); + if (sym) + return sym; + } } return NULL; -- 2.7.4