25#include "gdbsupport/gdb_obstack.h"
29#include "gdbsupport/gdb-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"));
621 if (matches_name (next->search_name (),
name, NULL))
636 unsigned int hash_index;
647 buckets[hash_index] = sym;
656 for (
int i = 0; i < nbuckets; ++i)
700 int new_nbuckets = 2 * old_nbuckets + 1;
701 struct symbol **new_buckets = XCNEWVEC (
struct symbol *, new_nbuckets);
707 for (i = 0; i < old_nbuckets; ++i)
709 struct symbol *sym, *next_sym;
711 sym = old_buckets[i];
748 if (startswith (
string,
"_ada_"))
762 if (string0 ==
string)
770 if (
string[1] ==
'_' &&
string != string0)
774 if (c ==
'B' &&
string[3] ==
'_')
776 for (
string += 4; ISDIGIT (*
string); ++string)
781 if ((c <
'a' || c >
'z') && c !=
'O')
797 if (strcmp (
string,
"TKB") == 0)
851 struct symbol *sym, *retval = NULL;
938static std::unordered_map<enum language, std::vector<symbol *>>
941 std::unordered_map<enum language, std::vector<symbol *>> nsyms;
943 for (
const pending *list_counter = symbol_list;
944 list_counter !=
nullptr; list_counter = list_counter->
next)
946 for (
int i = list_counter->nsyms - 1; i >= 0; --i)
949 nsyms[
language].push_back (list_counter->symbol[i]);
960 const struct pending *symbol_list)
964 std::unordered_map<enum language, std::vector<symbol *>> nsyms
969 = XOBNEWVEC (obstack,
struct dictionary *, nsyms.size ());
973 for (
const auto &pair : nsyms)
976 std::vector<symbol *> symlist = pair.second;
1005 const struct pending *symbol_list)
1009 std::unordered_map<enum language, std::vector<symbol *>> nsyms
1014 = XOBNEWVEC (obstack,
struct dictionary *, nsyms.size ());
1018 for (
const auto &pair : nsyms)
1021 std::vector<symbol *> symlist = pair.second;
1107 internal_error (_(
"create_new_language_dictionary: attempted to expand "
1108 "non-expandable multidictionary"));
1137 if (dict ==
nullptr)
1151 const struct pending *symbol_list)
1153 std::unordered_map<enum language, std::vector<symbol *>> nsyms
1156 for (
const auto &pair : nsyms)
1159 std::vector<symbol *> symlist = pair.second;
1162 if (dict ==
nullptr)
1179 miterator->
mdict = mdict;
1188 if (result !=
nullptr)
1205 if (result !=
nullptr)
1210 for (
unsigned short idx = ++miterator->
current_idx;
1216 if (result !=
nullptr)
1233 miterator->
mdict = mdict;
1243 if (result !=
nullptr)
1259 if (result !=
nullptr)
1264 for (
unsigned short idx = ++miterator->
current_idx;
1270 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
struct dictionary_linear_expandable linear_expandable
struct dictionary_hashed_expandable hashed_expandable
const struct language_defn * language
union dictionary::@38 data
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)