From: Tom Tromey Date: Tue, 13 Jul 2010 20:49:26 +0000 (+0000) Subject: * symtab.c (lookup_symbol_aux_symtabs): Call pre-expand hook. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=58b6ab1339836b1684461bec9eb72682bc2972df;p=binutils-gdb.git * symtab.c (lookup_symbol_aux_symtabs): Call pre-expand hook. (basic_lookup_transparent_type): Likewise. * symfile.h (struct quick_symbol_functions) : New field. * psymtab.c (pre_expand_symtabs_matching_psymtabs): New function. (psym_functions): Update. --- diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 4937d9475b5..fdfaaa2c4a6 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,12 @@ +2010-07-13 Tom Tromey + + * symtab.c (lookup_symbol_aux_symtabs): Call pre-expand hook. + (basic_lookup_transparent_type): Likewise. + * symfile.h (struct quick_symbol_functions) + : New field. + * psymtab.c (pre_expand_symtabs_matching_psymtabs): New function. + (psym_functions): Update. + 2010-07-13 Tom Tromey PR breakpoints/8357: diff --git a/gdb/psymtab.c b/gdb/psymtab.c index 367cf1ea12b..ca06130215d 100644 --- a/gdb/psymtab.c +++ b/gdb/psymtab.c @@ -421,6 +421,14 @@ lookup_symbol_aux_psymtabs (struct objfile *objfile, return NULL; } +static void +pre_expand_symtabs_matching_psymtabs (struct objfile *objfile, + int kind, const char *name, + domain_enum domain) +{ + /* Nothing. */ +} + /* Look, in partial_symtab PST, for symbol whose natural name is NAME. Check the global symbols if GLOBAL, the static symbols if not. */ @@ -1199,6 +1207,7 @@ const struct quick_symbol_functions psym_functions = forget_cached_source_info_partial, lookup_symtab_via_partial_symtab, lookup_symbol_aux_psymtabs, + pre_expand_symtabs_matching_psymtabs, print_psymtab_stats_for_objfile, dump_psymtabs_for_objfile, relocate_psymtabs, diff --git a/gdb/symfile.h b/gdb/symfile.h index d53c465c6d7..a869fa30176 100644 --- a/gdb/symfile.h +++ b/gdb/symfile.h @@ -171,6 +171,15 @@ struct quick_symbol_functions int kind, const char *name, domain_enum domain); + /* This is called to expand symbol tables before looking up a + symbol. A backend can choose to implement this and then have its + `lookup_symbol' hook always return NULL, or the reverse. (It + doesn't make sense to implement both.) The arguments are as for + `lookup_symbol'. */ + void (*pre_expand_symtabs_matching) (struct objfile *objfile, + int kind, const char *name, + domain_enum domain); + /* Print statistics about any indices loaded for OBJFILE. The statistics should be printed to gdb_stdout. This is used for "maint print statistics". */ diff --git a/gdb/symtab.c b/gdb/symtab.c index 9472c24e4b7..4e48e4804e6 100644 --- a/gdb/symtab.c +++ b/gdb/symtab.c @@ -1295,16 +1295,25 @@ lookup_symbol_aux_symtabs (int block_index, const char *name, const struct block *block; struct symtab *s; - ALL_PRIMARY_SYMTABS (objfile, s) + ALL_OBJFILES (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); - } + 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; @@ -1547,15 +1556,24 @@ basic_lookup_transparent_type (const char *name) of the desired name as a global, then do psymtab-to-symtab conversion on the fly and return the found symbol. */ - ALL_PRIMARY_SYMTABS (objfile, s) + ALL_OBJFILES (objfile) { - bv = BLOCKVECTOR (s); - block = BLOCKVECTOR_BLOCK (bv, GLOBAL_BLOCK); - sym = lookup_block_symbol (block, name, STRUCT_DOMAIN); - if (sym && !TYPE_IS_OPAQUE (SYMBOL_TYPE (sym))) - { - return SYMBOL_TYPE (sym); - } + if (objfile->sf) + objfile->sf->qf->pre_expand_symtabs_matching (objfile, + GLOBAL_BLOCK, + name, STRUCT_DOMAIN); + + ALL_OBJFILE_SYMTABS (objfile, s) + if (s->primary) + { + bv = BLOCKVECTOR (s); + block = BLOCKVECTOR_BLOCK (bv, GLOBAL_BLOCK); + sym = lookup_block_symbol (block, name, STRUCT_DOMAIN); + if (sym && !TYPE_IS_OPAQUE (SYMBOL_TYPE (sym))) + { + return SYMBOL_TYPE (sym); + } + } } ALL_OBJFILES (objfile)