* symtab.c (lookup_symbol_aux_symtabs): Call pre-expand hook.
authorTom Tromey <tromey@redhat.com>
Tue, 13 Jul 2010 20:49:26 +0000 (20:49 +0000)
committerTom Tromey <tromey@redhat.com>
Tue, 13 Jul 2010 20:49:26 +0000 (20:49 +0000)
(basic_lookup_transparent_type): Likewise.
* symfile.h (struct quick_symbol_functions)
<pre_expand_symtabs_matching>: New field.
* psymtab.c (pre_expand_symtabs_matching_psymtabs): New function.
(psym_functions): Update.

gdb/ChangeLog
gdb/psymtab.c
gdb/symfile.h
gdb/symtab.c

index 4937d9475b549f9034e20caf3d69ec22bc340788..fdfaaa2c4a60370656d17792ce7116b9bc002d44 100644 (file)
@@ -1,3 +1,12 @@
+2010-07-13  Tom Tromey  <tromey@redhat.com>
+
+       * symtab.c (lookup_symbol_aux_symtabs): Call pre-expand hook.
+       (basic_lookup_transparent_type): Likewise.
+       * symfile.h (struct quick_symbol_functions)
+       <pre_expand_symtabs_matching>: New field.
+       * psymtab.c (pre_expand_symtabs_matching_psymtabs): New function.
+       (psym_functions): Update.
+
 2010-07-13  Tom Tromey  <tromey@redhat.com>
 
        PR breakpoints/8357:
index 367cf1ea12be3bdf7b74f7252460e3928007396b..ca06130215d719e6530d224a0a0a452802adb31e 100644 (file)
@@ -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,
index d53c465c6d7b7fb53ad08e6e13bf7068ed4c496f..a869fa301765f429309bf4ab2587db65dbd63e87 100644 (file)
@@ -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".  */
index 9472c24e4b7e7273c6421c8c8c2b2a80d9e93c92..4e48e4804e664751a3c455f7690d6c2d7fb4a69a 100644 (file)
@@ -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)