return lookup (addr) != nullptr;
}
+/* See block.h. */
+
+struct symbol *
+blockvector::symbol_at_address (CORE_ADDR addr) const
+{
+ for (int i = GLOBAL_BLOCK; i <= STATIC_BLOCK; ++i)
+ {
+ const struct block *b = block (i);
+
+ for (struct symbol *sym : block_iterator_range (b))
+ {
+ if (sym->loc_class () == LOC_STATIC && sym->value_address () == addr)
+ return sym;
+ }
+ }
+
+ return nullptr;
+}
+
blockvector::~blockvector ()
{
for (struct block *bl : m_blocks)
/* Return true if the blockvector contains ADDR, false otherwise. */
bool contains (CORE_ADDR addr) const;
+ /* Return symbol at ADDR or NULL if no symbol is found. Only exact matches
+ for ADDR are considered. */
+ struct symbol *symbol_at_address (CORE_ADDR addr) const;
+
private:
/* An address map mapping addresses to blocks in this blockvector.
This pointer is zero if the blocks' start and end addresses are
/* See symtab.h. */
+struct symbol *
+compunit_symtab::symbol_at_address (CORE_ADDR addr) const
+{
+ return blockvector ()->symbol_at_address (addr);
+}
+
+/* See symtab.h. */
+
compunit_symtab::compunit_symtab (struct objfile *objfile,
const char *name_)
: m_objfile (objfile),
struct symbol *
find_symbol_at_address (CORE_ADDR address)
{
- /* A helper function to search a given symtab for a symbol matching
- ADDR. */
- auto search_symtab = [] (compunit_symtab *symtab, CORE_ADDR addr) -> symbol *
- {
- const struct blockvector *bv = symtab->blockvector ();
-
- for (int i = GLOBAL_BLOCK; i <= STATIC_BLOCK; ++i)
- {
- const struct block *b = bv->block (i);
-
- for (struct symbol *sym : block_iterator_range (b))
- {
- if (sym->loc_class () == LOC_STATIC
- && sym->value_address () == addr)
- return sym;
- }
- }
- return nullptr;
- };
-
for (objfile &objfile : current_program_space->objfiles ())
{
/* If this objfile was read with -readnow, then we need to
{
for (compunit_symtab &symtab : objfile.compunits ())
{
- struct symbol *sym = search_symtab (&symtab, address);
+ struct symbol *sym
+ = symtab.symbol_at_address (address);
if (sym != nullptr)
return sym;
}
= objfile.find_compunit_symtab_by_address (address);
if (symtab != NULL)
{
- struct symbol *sym = search_symtab (symtab, address);
+ struct symbol *sym = symtab->symbol_at_address (address);
if (sym != nullptr)
return sym;
}
/* Clear any cached source file names. */
void forget_cached_source_info ();
+ /* Return symbol at ADDR or NULL if no symbol is found. Only exact matches
+ for ADDR are considered. */
+ struct symbol *symbol_at_address (CORE_ADDR addr) const;
+
/* Object file from which this symtab information was read. */
struct objfile *m_objfile;