Add code for (re)building the minimal symbol hash tables.

This commit is contained in:
Kevin Buettner 2000-08-04 18:41:05 +00:00
parent 679ebd0f9c
commit afbb8d7a46
2 changed files with 46 additions and 11 deletions

View File

@ -1,5 +1,10 @@
2000-08-04 Kevin Buettner <kevinb@redhat.com>
* minsyms.c (build_minimal_symbol_hash_tables): New function.
(compact_minimal_symbols): Don't construct hash tables here.
(install_minimal_symbols): Instead, construct them here.
(msymbols_sort): And rebuild them here too.
* dwarf2read.c (struct comp_unit_head): Add fields offset_size
and initial_length_size. Change type of ``length'' field to long.
(read_initial_length, read_offset): New functions.

View File

@ -801,11 +801,7 @@ compact_minimal_symbols (struct minimal_symbol *msymbol, int mcount,
copyfrom++;
}
else
{
*copyto++ = *copyfrom++;
add_minsym_to_hash_table (copyto - 1, objfile->msymbol_hash);
}
*copyto++ = *copyfrom++;
}
*copyto++ = *copyfrom++;
mcount = copyto - msymbol;
@ -813,6 +809,38 @@ compact_minimal_symbols (struct minimal_symbol *msymbol, int mcount,
return (mcount);
}
/* Build (or rebuild) the minimal symbol hash tables. This is necessary
after compacting or sorting the table since the entries move around
thus causing the internal minimal_symbol pointers to become jumbled. */
static void
build_minimal_symbol_hash_tables (struct objfile *objfile)
{
int i;
struct minimal_symbol *msym;
/* Clear the hash tables. */
for (i = 0; i < MINIMAL_SYMBOL_HASH_SIZE; i++)
{
objfile->msymbol_hash[i] = 0;
objfile->msymbol_demangled_hash[i] = 0;
}
/* Now, (re)insert the actual entries. */
for (i = objfile->minimal_symbol_count, msym = objfile->msymbols;
i > 0;
i--, msym++)
{
msym->hash_next = 0;
add_minsym_to_hash_table (msym, objfile->msymbol_hash);
msym->demangled_hash_next = 0;
if (SYMBOL_DEMANGLED_NAME (msym) != NULL)
add_minsym_to_demangled_hash_table (msym,
objfile->msymbol_demangled_hash);
}
}
/* Add the minimal symbols in the existing bunches to the objfile's official
minimal symbol table. In most cases there is no minimal symbol table yet
for this objfile, and the existing bunches are used to create one. Once
@ -928,12 +956,13 @@ install_minimal_symbols (struct objfile *objfile)
ones and attempting to cache their C++ demangled names. */
for (; mcount-- > 0; msymbols++)
{
SYMBOL_INIT_DEMANGLED_NAME (msymbols, &objfile->symbol_obstack);
if (SYMBOL_DEMANGLED_NAME (msymbols) != NULL)
add_minsym_to_demangled_hash_table (msymbols,
objfile->msymbol_demangled_hash);
}
SYMBOL_INIT_DEMANGLED_NAME (msymbols, &objfile->symbol_obstack);
/* Now build the hash tables; we can't do this incrementally
at an earlier point since we weren't finished with the obstack
yet. (And if the msymbol obstack gets moved, all the internal
pointers to other msymbols need to be adjusted.) */
build_minimal_symbol_hash_tables (objfile);
}
}
@ -944,6 +973,7 @@ msymbols_sort (struct objfile *objfile)
{
qsort (objfile->msymbols, objfile->minimal_symbol_count,
sizeof (struct minimal_symbol), compare_minimal_symbols);
build_minimal_symbol_hash_tables (objfile);
}
/* Check if PC is in a shared library trampoline code stub.