mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2025-01-06 12:09:26 +08:00
b8c2de06bc
In the next commit we would like to have mdict_size return the number of symbols in the dictionary, currently mdict_size is just a heuristic, sometimes it returns the number of symbols, and sometimes the number of buckets in a hashing dictionary (see size_hashed in dictionary.c). Currently this vague notion of size is good enough, the only place mdict_size is used is in a maintenance command in order to print a message containing the size of the dictionary ... so we don't really care that the value isn't correct. However, in the next commit we do want the size returned to be the number of symbols in the dictionary, so this commit makes mdict_size return the symbol count in all cases. The new use is still not on a hot path -- it's going to be a Python __repr__ method, so all I do in this commit is have size_hashed walk the dictionary and count the entries, obviously this could be slow if we have a large number of symbols, but for now I'm not worrying about that case. We could always store the symbol count if we wanted, but that would increase the size of every dictionary for a use case that isn't going to be hit that often. I've updated the text in 'maint print symbols' so that we don't talk about the size being 'syms/buckets', but just 'symbols' now.
212 lines
6.8 KiB
C++
212 lines
6.8 KiB
C++
/* Routines for name->symbol lookups in GDB.
|
|
|
|
Copyright (C) 2003-2023 Free Software Foundation, Inc.
|
|
|
|
Contributed by David Carlton <carlton@bactrian.org> and by Kealia,
|
|
Inc.
|
|
|
|
This file is part of GDB.
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation; either version 3 of the License, or
|
|
(at your option) any later version.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
|
|
|
#ifndef DICTIONARY_H
|
|
#define DICTIONARY_H
|
|
|
|
#include "symfile.h"
|
|
|
|
/* An opaque type for multi-language dictionaries; only dictionary.c should
|
|
know about its innards. */
|
|
|
|
struct multidictionary;
|
|
|
|
/* Other types needed for declarations. */
|
|
|
|
struct symbol;
|
|
struct obstack;
|
|
struct pending;
|
|
struct language_defn;
|
|
|
|
/* The creation functions for various implementations of
|
|
multi-language dictionaries. */
|
|
|
|
/* Create a multi-language dictionary of symbols implemented via
|
|
a fixed-size hashtable. All memory it uses is allocated on
|
|
OBSTACK; the environment is initialized from SYMBOL_LIST. */
|
|
|
|
extern struct multidictionary *
|
|
mdict_create_hashed (struct obstack *obstack,
|
|
const struct pending *symbol_list);
|
|
|
|
/* Create a multi-language dictionary of symbols, implemented
|
|
via a hashtable that grows as necessary. The initial dictionary of
|
|
LANGUAGE is empty; to add symbols to it, call mdict_add_symbol().
|
|
Call mdict_free() when you're done with it. */
|
|
|
|
extern struct multidictionary *
|
|
mdict_create_hashed_expandable (enum language language);
|
|
|
|
/* Create a multi-language dictionary of symbols, implemented
|
|
via a fixed-size array. All memory it uses is allocated on
|
|
OBSTACK; the environment is initialized from the SYMBOL_LIST. The
|
|
symbols are ordered in the same order that they're found in
|
|
SYMBOL_LIST. */
|
|
|
|
extern struct multidictionary *
|
|
mdict_create_linear (struct obstack *obstack,
|
|
const struct pending *symbol_list);
|
|
|
|
/* Create a multi-language dictionary of symbols, implemented
|
|
via an array that grows as necessary. The multidictionary initially
|
|
contains a single empty dictionary of LANGUAGE; to add symbols to it,
|
|
call mdict_add_symbol(). Call mdict_free() when you're done with it. */
|
|
|
|
extern struct multidictionary *
|
|
mdict_create_linear_expandable (enum language language);
|
|
|
|
/* The functions providing the interface to multi-language dictionaries.
|
|
Note that the most common parts of the interface, namely symbol lookup,
|
|
are only provided via iterator functions. */
|
|
|
|
/* Free the memory used by a multidictionary that's not on an obstack. (If
|
|
any.) */
|
|
|
|
extern void mdict_free (struct multidictionary *mdict);
|
|
|
|
/* Add a symbol to an expandable multidictionary. */
|
|
|
|
extern void mdict_add_symbol (struct multidictionary *mdict,
|
|
struct symbol *sym);
|
|
|
|
/* Utility to add a list of symbols to a multidictionary. */
|
|
|
|
extern void mdict_add_pending (struct multidictionary *mdict,
|
|
const struct pending *symbol_list);
|
|
|
|
/* A type containing data that is used when iterating over all symbols
|
|
in a dictionary. Don't ever look at its innards; this type would
|
|
be opaque if we didn't need to be able to allocate it on the
|
|
stack. */
|
|
|
|
struct dict_iterator
|
|
{
|
|
/* The dictionary that this iterator is associated to. */
|
|
const struct dictionary *dict;
|
|
/* The next two members are data that is used in a way that depends
|
|
on DICT's implementation type. */
|
|
int index;
|
|
struct symbol *current;
|
|
};
|
|
|
|
/* The multi-language dictionary iterator. Like dict_iterator above,
|
|
these contents should be considered private. */
|
|
|
|
struct mdict_iterator
|
|
{
|
|
/* The multidictionary with whcih this iterator is associated. */
|
|
const struct multidictionary *mdict;
|
|
|
|
/* The iterator used to iterate through individual dictionaries. */
|
|
struct dict_iterator iterator;
|
|
|
|
/* The current index of the dictionary being iterated over. */
|
|
unsigned short current_idx;
|
|
};
|
|
|
|
/* Initialize ITERATOR to point at the first symbol in MDICT, and
|
|
return that first symbol, or NULL if MDICT is empty. */
|
|
|
|
extern struct symbol *
|
|
mdict_iterator_first (const struct multidictionary *mdict,
|
|
struct mdict_iterator *miterator);
|
|
|
|
/* Advance MITERATOR, and return the next symbol, or NULL if there are
|
|
no more symbols. Don't call this if you've previously received
|
|
NULL from mdict_iterator_first or mdict_iterator_next on this
|
|
iteration. */
|
|
|
|
extern struct symbol *mdict_iterator_next (struct mdict_iterator *miterator);
|
|
|
|
/* Initialize MITERATOR to point at the first symbol in MDICT whose
|
|
search_name () is NAME, as tested using COMPARE (which must use
|
|
the same conventions as strcmp_iw and be compatible with any
|
|
dictionary hashing function), and return that first symbol, or NULL
|
|
if there are no such symbols. */
|
|
|
|
extern struct symbol *
|
|
mdict_iter_match_first (const struct multidictionary *mdict,
|
|
const lookup_name_info &name,
|
|
struct mdict_iterator *miterator);
|
|
|
|
/* Advance MITERATOR to point at the next symbol in MDICT whose
|
|
search_name () is NAME, as tested using COMPARE (see
|
|
dict_iter_match_first), or NULL if there are no more such symbols.
|
|
Don't call this if you've previously received NULL from
|
|
mdict_iterator_match_first or mdict_iterator_match_next on this
|
|
iteration. And don't call it unless MITERATOR was created by a
|
|
previous call to mdict_iter_match_first with the same NAME and COMPARE. */
|
|
|
|
extern struct symbol *mdict_iter_match_next (const lookup_name_info &name,
|
|
struct mdict_iterator *miterator);
|
|
|
|
/* Return the number of symbols in multidictionary MDICT. */
|
|
|
|
extern int mdict_size (const struct multidictionary *mdict);
|
|
|
|
/* An iterator that wraps an mdict_iterator. The naming here is
|
|
unfortunate, but mdict_iterator was named before gdb switched to
|
|
C++. */
|
|
struct mdict_iterator_wrapper
|
|
{
|
|
typedef mdict_iterator_wrapper self_type;
|
|
typedef struct symbol *value_type;
|
|
|
|
explicit mdict_iterator_wrapper (const struct multidictionary *mdict)
|
|
: m_sym (mdict_iterator_first (mdict, &m_iter))
|
|
{
|
|
}
|
|
|
|
mdict_iterator_wrapper ()
|
|
: m_sym (nullptr)
|
|
{
|
|
}
|
|
|
|
value_type operator* () const
|
|
{
|
|
return m_sym;
|
|
}
|
|
|
|
bool operator== (const self_type &other) const
|
|
{
|
|
return m_sym == other.m_sym;
|
|
}
|
|
|
|
bool operator!= (const self_type &other) const
|
|
{
|
|
return m_sym != other.m_sym;
|
|
}
|
|
|
|
self_type &operator++ ()
|
|
{
|
|
m_sym = mdict_iterator_next (&m_iter);
|
|
return *this;
|
|
}
|
|
|
|
private:
|
|
|
|
struct symbol *m_sym;
|
|
struct mdict_iterator m_iter;
|
|
};
|
|
|
|
#endif /* DICTIONARY_H */
|