/* GDB routines for manipulating the minimal symbol tables.
Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001,
- 2002, 2003, 2004, 2007, 2008, 2009 Free Software Foundation, Inc.
+ 2002, 2003, 2004, 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
Contributed by Cygnus Support, using pieces from other GDB modules.
This file is part of GDB.
msymbol_hash_iw (const char *string)
{
unsigned int hash = 0;
+
while (*string && *string != '(')
{
while (isspace (*string))
msymbol_hash (const char *string)
{
unsigned int hash = 0;
+
for (; *string; ++string)
hash = hash * 67 + *string - 113;
return hash;
{
unsigned int hash
= msymbol_hash (SYMBOL_LINKAGE_NAME (sym)) % MINIMAL_SYMBOL_HASH_SIZE;
+
sym->hash_next = table[hash];
table[hash] = sym;
}
{
unsigned int hash
= msymbol_hash_iw (SYMBOL_SEARCH_NAME (sym)) % MINIMAL_SYMBOL_HASH_SIZE;
+
sym->demangled_hash_next = table[hash];
table[hash] = sym;
}
if (sfile != NULL)
{
char *p = strrchr (sfile, '/');
+
if (p != NULL)
sfile = p + 1;
}
if (current_language->la_language == language_cplus)
{
char *cname = cp_canonicalize_string (name);
+
if (cname)
{
modified_name = cname;
objfile = objfile->next)
{
if (objf == NULL || objf == objfile
- || objf->separate_debug_objfile == objfile)
+ || objf == objfile->separate_debug_objfile_backlink)
{
/* Do two passes: the first over the ordinary hash table,
and the second over the demangled hash table. */
objfile = objfile->next)
{
if (objf == NULL || objf == objfile
- || objf->separate_debug_objfile == objfile)
+ || objf == objfile->separate_debug_objfile_backlink)
{
for (msymbol = objfile->msymbol_hash[hash];
msymbol != NULL && found_symbol == NULL;
objfile = objfile->next)
{
if (objf == NULL || objf == objfile
- || objf->separate_debug_objfile == objfile)
+ || objf == objfile->separate_debug_objfile_backlink)
{
for (msymbol = objfile->msymbol_hash[hash];
msymbol != NULL;
objfile = objfile->next)
{
if (objf == NULL || objf == objfile
- || objf->separate_debug_objfile == objfile)
+ || objf == objfile->separate_debug_objfile_backlink)
{
for (msymbol = objfile->msymbol_hash[hash];
msymbol != NULL && found_symbol == NULL;
no telling which one will have the minimal symbols. */
gdb_assert (section != NULL);
- objfile = section->objfile;
- if (objfile->separate_debug_objfile)
- objfile = objfile->separate_debug_objfile;
- for (; objfile != NULL; objfile = objfile->separate_debug_objfile_backlink)
+ for (objfile = section->objfile;
+ objfile != NULL;
+ objfile = objfile_separate_debug_iterate (section->objfile, objfile))
{
/* If this objfile has a minimal symbol table, go search it using
a binary search. Note that a minimal symbol table always consists
{
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,
mixing ABIs then the user will need to "set cp-abi"
manually. */
const char *name = SYMBOL_LINKAGE_NAME (&objfile->msymbols[i]);
+
if (name[0] == '_' && name[1] == 'Z'
&& SYMBOL_DEMANGLED_NAME (&objfile->msymbols[i]) != NULL)
{
SYMBOL_LINKAGE_NAME (tsymbol)) == 0)
{
CORE_ADDR func;
+
func = gdbarch_convert_from_func_ptr_addr
(get_objfile_arch (objfile),
SYMBOL_VALUE_ADDRESS (msymbol),