This is the mail archive of the gdb-patches@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

FYI: fix PR symtab/11198


I'm checking this in.

This fixes PR symtab/11198.  The bug is that stepping into a particular
shared library make find_minsym_and_objfile take a lot of CPU time.

find_minsym_and_objfile was doing a linear search of all minsyms,
instead of using the hash table.

Also, find_minsym_and_objfile was in the wrong file, so I moved it.

Built and regtested on x86-64 (compile farm).
Also, Andre tried it on his test case and reports that it fixes the
performance problem.

Tom

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.

Index: minsyms.c
===================================================================
RCS file: /cvs/src/src/gdb/minsyms.c,v
retrieving revision 1.70
diff -u -r1.70 minsyms.c
--- minsyms.c	6 Jan 2010 10:11:04 -0000	1.70
+++ minsyms.c	21 Jan 2010 17:07:33 -0000
@@ -693,6 +693,37 @@
 {
   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;
+}
 
 
 /* Return leading symbol character for a BFD. If BFD is NULL,
Index: symtab.h
===================================================================
RCS file: /cvs/src/src/gdb/symtab.h,v
retrieving revision 1.144
diff -u -r1.144 symtab.h
--- symtab.h	1 Jan 2010 07:31:42 -0000	1.144
+++ symtab.h	21 Jan 2010 17:07:33 -0000
@@ -1158,6 +1158,10 @@
 
 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 *);
 
Index: glibc-tdep.c
===================================================================
RCS file: /cvs/src/src/gdb/glibc-tdep.c,v
retrieving revision 1.12
diff -u -r1.12 glibc-tdep.c
--- glibc-tdep.c	1 Jan 2010 07:31:32 -0000	1.12
+++ glibc-tdep.c	21 Jan 2010 17:07:33 -0000
@@ -28,35 +28,6 @@
 
 /* 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 @@
 
   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 Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]