PR symtab/11198:
authorTom Tromey <tromey@redhat.com>
Thu, 21 Jan 2010 17:12:18 +0000 (17:12 +0000)
committerTom Tromey <tromey@redhat.com>
Thu, 21 Jan 2010 17:12:18 +0000 (17:12 +0000)
* symtab.h (lookup_minimal_symbol_and_objfile): Declare.
* minsyms.c (lookup_minimal_symbol_and_objfile): New function.
* glibc-tdep.c (find_minsym_and_objfile): Remove.
(glibc_skip_solib_resolver): Use
lookup_minimal_symbol_and_objfile.

gdb/ChangeLog
gdb/glibc-tdep.c
gdb/minsyms.c
gdb/symtab.h

index 3787a30..74d4031 100644 (file)
@@ -1,3 +1,12 @@
+2010-01-21  Tom Tromey  <tromey@redhat.com>
+
+       PR symtab/11198:
+       * symtab.h (lookup_minimal_symbol_and_objfile): Declare.
+       * minsyms.c (lookup_minimal_symbol_and_objfile): New function.
+       * glibc-tdep.c (find_minsym_and_objfile): Remove.
+       (glibc_skip_solib_resolver): Use
+       lookup_minimal_symbol_and_objfile.
+
 2010-01-21  Kai Tietz  <kai.tietz@onevision.com>
 
        * inflow.c (check_syscall): Guard by #if clause for GO32 and
index 38b8b39..044dc70 100644 (file)
 
 /* Calling functions in shared libraries.  */
 
-/* Find the minimal symbol named NAME, and return both the minsym
-   struct and its objfile.  This probably ought to be in minsym.c, but
-   everything there is trying to deal with things like C++ and
-   SOFUN_ADDRESS_MAYBE_TURQUOISE, ...  Since this is so simple, it may
-   be considered too special-purpose for general consumption.  */
-
-static struct minimal_symbol *
-find_minsym_and_objfile (char *name, struct objfile **objfile_p)
-{
-  struct objfile *objfile;
-
-  ALL_OBJFILES (objfile)
-    {
-      struct minimal_symbol *msym;
-
-      ALL_OBJFILE_MSYMBOLS (objfile, msym)
-       {
-         if (SYMBOL_LINKAGE_NAME (msym)
-             && strcmp (SYMBOL_LINKAGE_NAME (msym), name) == 0)
-           {
-             *objfile_p = objfile;
-             return msym;
-           }
-       }
-    }
-
-  return 0;
-}
-
 /* See the comments for SKIP_SOLIB_RESOLVER at the top of infrun.c.
    This function:
    1) decides whether a PLT has sent us into the linker to resolve
@@ -85,7 +56,7 @@ glibc_skip_solib_resolver (struct gdbarch *gdbarch, CORE_ADDR pc)
 
   struct objfile *objfile;
   struct minimal_symbol *resolver 
-    = find_minsym_and_objfile ("_dl_runtime_resolve", &objfile);
+    = lookup_minimal_symbol_and_objfile ("_dl_runtime_resolve", &objfile);
 
   if (resolver)
     {
index ee730a4..287f9de 100644 (file)
@@ -693,6 +693,37 @@ lookup_minimal_symbol_by_pc (CORE_ADDR pc)
 {
   return lookup_minimal_symbol_by_pc_section (pc, NULL);
 }
+
+/* Find the minimal symbol named NAME, and return both the minsym
+   struct and its objfile.  This only checks the linkage name.  Sets
+   *OBJFILE_P and returns the minimal symbol, if it is found.  If it
+   is not found, returns NULL.  */
+
+struct minimal_symbol *
+lookup_minimal_symbol_and_objfile (const char *name,
+                                  struct objfile **objfile_p)
+{
+  struct objfile *objfile;
+  unsigned int hash = msymbol_hash (name) % MINIMAL_SYMBOL_HASH_SIZE;
+
+  ALL_OBJFILES (objfile)
+    {
+      struct minimal_symbol *msym;
+
+      for (msym = objfile->msymbol_hash[hash];
+          msym != NULL;
+          msym = msym->hash_next)
+       {
+         if (strcmp (SYMBOL_LINKAGE_NAME (msym), name) == 0)
+           {
+             *objfile_p = objfile;
+             return msym;
+           }
+       }
+    }
+
+  return 0;
+}
 \f
 
 /* Return leading symbol character for a BFD. If BFD is NULL,
index 800ffd8..8759732 100644 (file)
@@ -1158,6 +1158,10 @@ extern struct minimal_symbol *lookup_minimal_symbol_by_pc_name
 
 extern struct minimal_symbol *lookup_minimal_symbol_by_pc (CORE_ADDR);
 
+extern struct minimal_symbol *
+    lookup_minimal_symbol_and_objfile (const char *,
+                                      struct objfile **);
+
 extern struct minimal_symbol
   *lookup_minimal_symbol_by_pc_section (CORE_ADDR, struct obj_section *);