This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
FYI: fix PR symtab/11198
- From: Tom Tromey <tromey at redhat dot com>
- To: gdb-patches at sourceware dot org
- Date: Thu, 21 Jan 2010 10:11:56 -0700
- Subject: FYI: fix PR symtab/11198
- Reply-to: tromey at redhat dot com
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)
{