25#include "gdbsupport/gdb_obstack.h"
29#include "safe-ctype.h"
30#include <unordered_map>
183#define DICT_VECTOR(d) (d)->vector
184#define DICT_LANGUAGE(d) (d)->language
188#define DICT_HASHED_NBUCKETS(d) (d)->data.hashed.nbuckets
189#define DICT_HASHED_BUCKETS(d) (d)->data.hashed.buckets
190#define DICT_HASHED_BUCKET(d,i) DICT_HASHED_BUCKETS (d) [i]
192#define DICT_HASHED_EXPANDABLE_NSYMS(d) (d)->data.hashed_expandable.nsyms
196#define DICT_LINEAR_NSYMS(d) (d)->data.linear.nsyms
197#define DICT_LINEAR_SYMS(d) (d)->data.linear.syms
198#define DICT_LINEAR_SYM(d,i) DICT_LINEAR_SYMS (d) [i]
200#define DICT_LINEAR_EXPANDABLE_CAPACITY(d) \
201 (d)->data.linear_expandable.capacity
205#define DICT_EXPANDABLE_INITIAL_CAPACITY 10
210#define DICT_HASHTABLE_SIZE(n) ((n)/5 + 1)
217#define DICT_ITERATOR_DICT(iter) (iter)->dict
220#define DICT_ITERATOR_INDEX(iter) (iter)->index
223#define DICT_ITERATOR_CURRENT(iter) (iter)->current
353 const std::vector<symbol *> &symbol_list)
361 int nsyms = symbol_list.size ();
365 memset (buckets, 0, nbuckets *
sizeof (
struct symbol *));
369 for (
const auto &sym : symbol_list)
397 const std::vector<symbol *> &symbol_list)
404 int nsyms = symbol_list.size ();
411 for (
const auto &sym : symbol_list)
458 const std::vector<symbol *> &symbol_list)
461 for (
auto sym = symbol_list.rbegin (); sym != symbol_list.rend (); ++sym)
472 return (
DICT_VECTOR (dict))->iterator_first (dict, iterator);
482 ->iterator_next (iterator);
498 ->iter_match_next (
name, iterator);
525 internal_error (_(
"dict_add_symbol: non-expandable dictionary"));
636 unsigned int hash_index;
647 buckets[hash_index] = sym;
689 int new_nbuckets = 2 * old_nbuckets + 1;
690 struct symbol **new_buckets = XCNEWVEC (
struct symbol *, new_nbuckets);
696 for (i = 0; i < old_nbuckets; ++i)
698 struct symbol *sym, *next_sym;
700 sym = old_buckets[i];
737 if (startswith (
string,
"_ada_"))
751 if (string0 ==
string)
759 if (
string[1] ==
'_' &&
string != string0)
763 if (c ==
'B' &&
string[3] ==
'_')
765 for (
string += 4; ISDIGIT (*
string); ++string)
770 if ((c <
'a' || c >
'z') && c !=
'O')
786 if (strcmp (
string,
"TKB") == 0)
840 struct symbol *sym, *retval = NULL;
927static std::unordered_map<enum language, std::vector<symbol *>>
930 std::unordered_map<enum language, std::vector<symbol *>> nsyms;
932 for (
const pending *list_counter = symbol_list;
933 list_counter !=
nullptr; list_counter = list_counter->
next)
935 for (
int i = list_counter->nsyms - 1; i >= 0; --i)
938 nsyms[
language].push_back (list_counter->symbol[i]);
949 const struct pending *symbol_list)
953 std::unordered_map<enum language, std::vector<symbol *>> nsyms
958 = XOBNEWVEC (obstack,
struct dictionary *, nsyms.size ());
962 for (
const auto &pair : nsyms)
965 std::vector<symbol *> symlist = pair.second;
994 const struct pending *symbol_list)
998 std::unordered_map<enum language, std::vector<symbol *>> nsyms
1003 = XOBNEWVEC (obstack,
struct dictionary *, nsyms.size ());
1007 for (
const auto &pair : nsyms)
1010 std::vector<symbol *> symlist = pair.second;
1096 internal_error (_(
"create_new_language_dictionary: attempted to expand "
1097 "non-expandable multidictionary"));
1126 if (dict ==
nullptr)
1140 const struct pending *symbol_list)
1142 std::unordered_map<enum language, std::vector<symbol *>> nsyms
1145 for (
const auto &pair : nsyms)
1148 std::vector<symbol *> symlist = pair.second;
1151 if (dict ==
nullptr)
1168 miterator->
mdict = mdict;
1177 if (result !=
nullptr)
1194 if (result !=
nullptr)
1199 for (
unsigned short idx = ++miterator->
current_idx;
1205 if (result !=
nullptr)
1222 miterator->
mdict = mdict;
1232 if (result !=
nullptr)
1248 if (result !=
nullptr)
1253 for (
unsigned short idx = ++miterator->
current_idx;
1259 if (result !=
nullptr)
void * xrealloc(void *ptr, size_t size)
int mdict_size(const struct multidictionary *mdict)
static void dict_add_pending(struct dictionary *dict, const std::vector< symbol * > &symbol_list)
#define DICT_HASHED_BUCKET(d, i)
static struct dictionary * dict_create_linear_expandable(enum language language)
#define DICT_LINEAR_SYMS(d)
static struct dictionary * dict_create_hashed(struct obstack *obstack, enum language language, const std::vector< symbol * > &symbol_list)
static struct symbol * iterator_first_hashed(const struct dictionary *dict, struct dict_iterator *iterator)
static const struct dict_vector dict_linear_vector
static struct symbol * iterator_hashed_advance(struct dict_iterator *iter)
void mdict_free(struct multidictionary *mdict)
static int size_hashed(const struct dictionary *dict)
#define DICT_ITERATOR_CURRENT(iter)
static struct dictionary * find_language_dictionary(const struct multidictionary *mdict, enum language language)
static struct symbol * iter_match_next_hashed(const lookup_name_info &name, struct dict_iterator *iterator)
struct symbol * mdict_iterator_first(const multidictionary *mdict, struct mdict_iterator *miterator)
#define DICT_HASHED_EXPANDABLE_NSYMS(d)
static struct symbol * dict_iterator_next(struct dict_iterator *iterator)
static std::unordered_map< enum language, std::vector< symbol * > > collate_pending_symbols_by_language(const struct pending *symbol_list)
struct symbol * mdict_iter_match_next(const lookup_name_info &name, struct mdict_iterator *miterator)
static struct symbol * dict_iterator_first(const struct dictionary *dict, struct dict_iterator *iterator)
struct multidictionary * mdict_create_hashed_expandable(enum language language)
static struct dictionary * create_new_language_dictionary(struct multidictionary *mdict, enum language language)
struct multidictionary * mdict_create_linear_expandable(enum language language)
struct multidictionary * mdict_create_hashed(struct obstack *obstack, const struct pending *symbol_list)
#define DICT_LINEAR_SYM(d, i)
static const struct dict_vector dict_linear_expandable_vector
static struct dictionary * dict_create_linear(struct obstack *obstack, enum language language, const std::vector< symbol * > &symbol_list)
static int size_hashed_expandable(const struct dictionary *dict)
#define DICT_HASHED_NBUCKETS(d)
#define DICT_HASHED_BUCKETS(d)
static const struct dict_vector dict_hashed_vector
static struct symbol * iterator_next_hashed(struct dict_iterator *iterator)
#define DICT_LINEAR_EXPANDABLE_CAPACITY(d)
struct symbol * mdict_iter_match_first(const struct multidictionary *mdict, const lookup_name_info &name, struct mdict_iterator *miterator)
static struct symbol * iter_match_first_linear(const struct dictionary *dict, const lookup_name_info &name, struct dict_iterator *iterator)
static void add_symbol_nonexpandable(struct dictionary *dict, struct symbol *sym)
static struct symbol * iterator_next_linear(struct dict_iterator *iterator)
static struct symbol * dict_iter_match_next(const lookup_name_info &name, struct dict_iterator *iterator)
static void expand_hashtable(struct dictionary *dict)
static struct symbol * dict_iter_match_first(const struct dictionary *dict, const lookup_name_info &name, struct dict_iterator *iterator)
#define DICT_ITERATOR_DICT(iter)
#define DICT_LINEAR_NSYMS(d)
static void free_hashed_expandable(struct dictionary *dict)
static struct symbol * iterator_first_linear(const struct dictionary *dict, struct dict_iterator *iterator)
static int size_linear(const struct dictionary *dict)
static void free_linear_expandable(struct dictionary *dict)
#define DICT_HASHTABLE_SIZE(n)
static void add_symbol_hashed_expandable(struct dictionary *dict, struct symbol *sym)
static int dict_size(const struct dictionary *dict)
static struct dictionary * dict_create_hashed_expandable(enum language language)
static struct symbol * iter_match_first_hashed(const struct dictionary *dict, const lookup_name_info &name, struct dict_iterator *iterator)
static void dict_add_symbol(struct dictionary *dict, struct symbol *sym)
static void dict_free(struct dictionary *dict)
static const struct dict_vector dict_hashed_expandable_vector
void mdict_add_symbol(struct multidictionary *mdict, struct symbol *sym)
static void add_symbol_linear_expandable(struct dictionary *dict, struct symbol *sym)
static void insert_symbol_hashed(struct dictionary *dict, struct symbol *sym)
struct symbol * mdict_iterator_next(struct mdict_iterator *miterator)
static struct symbol * iter_match_next_linear(const lookup_name_info &name, struct dict_iterator *iterator)
#define DICT_EXPANDABLE_INITIAL_CAPACITY
struct multidictionary * mdict_create_linear(struct obstack *obstack, const struct pending *symbol_list)
void mdict_add_pending(struct multidictionary *mdict, const struct pending *symbol_list)
#define DICT_ITERATOR_INDEX(iter)
static void free_obstack(struct dictionary *dict)
const struct language_defn * language_def(enum language lang)
static void add_symbol(struct symbol *, struct symtab *, struct block *)
unsigned int msymbol_hash_iw(const char *string)
#define SYMBOL_HASH_NEXT(hash, c)
void(* add_symbol)(struct dictionary *dict, struct symbol *sym)
int(* size)(const struct dictionary *dict)
void(* free)(struct dictionary *dict)
struct dictionary_hashed hashed
const struct dict_vector * vector
struct dictionary_linear linear
union dictionary::@36 data
struct dictionary_linear_expandable linear_expandable
struct dictionary_hashed_expandable hashed_expandable
const struct language_defn * language
const char * search_name() const
enum language language() const
enum language la_language
symbol_name_matcher_ftype * get_symbol_name_matcher(const lookup_name_info &lookup_name) const
virtual unsigned int search_name_hash(const char *name) const
struct dict_iterator iterator
const struct multidictionary * mdict
unsigned short current_idx
unsigned short n_allocated_dictionaries
struct dictionary ** dictionaries
enum language argument_type
struct symbol * hash_next
unsigned int search_name_hash(enum language language, const char *search_name)
bool() symbol_name_matcher_ftype(const char *symbol_search_name, const lookup_name_info &lookup_name, completion_match_result *comp_match_res)