diff options
author | Joel Brobecker <brobecker@gnat.com> | 2012-06-05 13:50:40 +0000 |
---|---|---|
committer | Joel Brobecker <brobecker@gnat.com> | 2012-06-05 13:50:40 +0000 |
commit | 67ff19f7de8c61147c5401c7f56ad30fda0f5491 (patch) | |
tree | f0545b792e6b7ddbfab091e3eb96a4b98948629f /gdb/symtab.c | |
parent | c56e7c4390ed81ff5466f3415198e91ee63a0744 (diff) | |
download | gdb-67ff19f7de8c61147c5401c7f56ad30fda0f5491.zip gdb-67ff19f7de8c61147c5401c7f56ad30fda0f5491.tar.gz gdb-67ff19f7de8c61147c5401c7f56ad30fda0f5491.tar.bz2 |
Revert "Search global symbols from the expression's block objfile first."
The search order used in this patch breaks global symbol lookups
for certain symbols when copy-relocation is used. A slightly different
search order will be implemented later.
gdb/ChangeLog:
Revert the following patch:
* 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.
Diffstat (limited to 'gdb/symtab.c')
-rw-r--r-- | gdb/symtab.c | 105 |
1 files changed, 31 insertions, 74 deletions
diff --git a/gdb/symtab.c b/gdb/symtab.c index 318310a..7e6483f 100644 --- a/gdb/symtab.c +++ b/gdb/symtab.c @@ -95,8 +95,7 @@ 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, - struct objfile *exclude_objfile); + const domain_enum domain); static struct symbol *lookup_symbol_aux_quick (struct objfile *objfile, @@ -1360,7 +1359,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, NULL); + sym = lookup_symbol_aux_symtabs (STATIC_BLOCK, name, domain); if (sym != NULL) return sym; @@ -1499,60 +1498,40 @@ lookup_global_symbol_from_objfile (const struct objfile *main_objfile, return NULL; } -/* 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, +/* Check to see if the symbol is defined in one of the 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_objfile (struct objfile *objfile, int block_index, - const char *name, const domain_enum domain) +lookup_symbol_aux_symtabs (int block_index, const char *name, + const domain_enum domain) { - struct symbol *sym = NULL; + struct symbol *sym; + struct objfile *objfile; 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_OBJFILES (objfile) + { + if (objfile->sf) + objfile->sf->qf->pre_expand_symtabs_matching (objfile, + block_index, + name, domain); - ALL_OBJFILE_PRIMARY_SYMTABS (objfile, s) - { - bv = BLOCKVECTOR (s); - block = BLOCKVECTOR_BLOCK (bv, block_index); - sym = lookup_block_symbol (block, name, domain); - if (sym) + ALL_OBJFILE_SYMTABS (objfile, s) + if (s->primary) { - block_found = block; - return fixup_symbol_section (sym, objfile); + 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 != exclude_objfile) - { - sym = lookup_symbol_aux_objfile (objfile, block_index, name, domain); - if (sym) - return sym; - } } return NULL; @@ -1678,46 +1657,24 @@ 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. */ - block_objfile = lookup_objfile_from_block (block); - if (block_objfile != NULL) - sym = solib_global_lookup (block_objfile, name, domain); + objfile = lookup_objfile_from_block (block); + if (objfile != NULL) + sym = solib_global_lookup (objfile, name, domain); if (sym != NULL) return sym; - /* 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); + sym = lookup_symbol_aux_symtabs (GLOBAL_BLOCK, name, domain); if (sym != NULL) return sym; ALL_OBJFILES (objfile) { - if (objfile != block_objfile) - { - sym = lookup_symbol_aux_quick (objfile, GLOBAL_BLOCK, name, domain); - if (sym) - return sym; - } + sym = lookup_symbol_aux_quick (objfile, GLOBAL_BLOCK, name, domain); + if (sym) + return sym; } return NULL; |