Per-language symbol name hashing algorithm
[deliverable/binutils-gdb.git] / gdb / dictionary.c
CommitLineData
de4f826b
DC
1/* Routines for name->symbol lookups in GDB.
2
61baf725 3 Copyright (C) 2003-2017 Free Software Foundation, Inc.
de4f826b
DC
4
5 Contributed by David Carlton <carlton@bactrian.org> and by Kealia,
6 Inc.
7
8 This file is part of GDB.
9
10 This program is free software; you can redistribute it and/or modify
11 it under the terms of the GNU General Public License as published by
a9762ec7
JB
12 the Free Software Foundation; either version 3 of the License, or
13 (at your option) any later version.
de4f826b 14
a9762ec7
JB
15 This program is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 GNU General Public License for more details.
de4f826b
DC
19
20 You should have received a copy of the GNU General Public License
a9762ec7 21 along with this program. If not, see <http://www.gnu.org/licenses/>. */
de4f826b
DC
22
23#include "defs.h"
c4d840bd 24#include <ctype.h>
de4f826b
DC
25#include "gdb_obstack.h"
26#include "symtab.h"
27#include "buildsym.h"
de4f826b
DC
28#include "dictionary.h"
29
30/* This file implements dictionaries, which are tables that associate
31 symbols to names. They are represented by an opaque type 'struct
32 dictionary'. That type has various internal implementations, which
33 you can choose between depending on what properties you need
34 (e.g. fast lookup, order-preserving, expandable).
35
36 Each dictionary starts with a 'virtual function table' that
37 contains the functions that actually implement the various
38 operations that dictionaries provide. (Note, however, that, for
39 the sake of client code, we also provide some functions that can be
40 implemented generically in terms of the functions in the vtable.)
41
42 To add a new dictionary implementation <impl>, what you should do
43 is:
44
45 * Add a new element DICT_<IMPL> to dict_type.
46
47 * Create a new structure dictionary_<impl>. If your new
48 implementation is a variant of an existing one, make sure that
49 their structs have the same initial data members. Define accessor
50 macros for your new data members.
51
52 * Implement all the functions in dict_vector as static functions,
53 whose name is the same as the corresponding member of dict_vector
54 plus _<impl>. You don't have to do this for those members where
55 you can reuse existing generic functions
56 (e.g. add_symbol_nonexpandable, free_obstack) or in the case where
57 your new implementation is a variant of an existing implementation
58 and where the variant doesn't affect the member function in
59 question.
60
61 * Define a static const struct dict_vector dict_<impl>_vector.
62
63 * Define a function dict_create_<impl> to create these
64 gizmos. Add its declaration to dictionary.h.
65
66 To add a new operation <op> on all existing implementations, what
67 you should do is:
68
69 * Add a new member <op> to struct dict_vector.
70
71 * If there is useful generic behavior <op>, define a static
72 function <op>_something_informative that implements that behavior.
73 (E.g. add_symbol_nonexpandable, free_obstack.)
74
75 * For every implementation <impl> that should have its own specific
76 behavior for <op>, define a static function <op>_<impl>
77 implementing it.
78
79 * Modify all existing dict_vector_<impl>'s to include the appropriate
80 member.
81
82 * Define a function dict_<op> that looks up <op> in the dict_vector
83 and calls the appropriate function. Add a declaration for
0963b4bd 84 dict_<op> to dictionary.h. */
de4f826b
DC
85
86/* An enum representing the various implementations of dictionaries.
87 Used only for debugging. */
88
89enum dict_type
90 {
91 /* Symbols are stored in a fixed-size hash table. */
92 DICT_HASHED,
93 /* Symbols are stored in an expandable hash table. */
94 DICT_HASHED_EXPANDABLE,
95 /* Symbols are stored in a fixed-size array. */
96 DICT_LINEAR,
97 /* Symbols are stored in an expandable array. */
20605361 98 DICT_LINEAR_EXPANDABLE
de4f826b
DC
99 };
100
101/* The virtual function table. */
102
103struct dict_vector
104{
105 /* The type of the dictionary. This is only here to make debugging
106 a bit easier; it's not actually used. */
107 enum dict_type type;
108 /* The function to free a dictionary. */
109 void (*free) (struct dictionary *dict);
110 /* Add a symbol to a dictionary, if possible. */
111 void (*add_symbol) (struct dictionary *dict, struct symbol *sym);
112 /* Iterator functions. */
113 struct symbol *(*iterator_first) (const struct dictionary *dict,
114 struct dict_iterator *iterator);
115 struct symbol *(*iterator_next) (struct dict_iterator *iterator);
116 /* Functions to iterate over symbols with a given name. */
c4d840bd 117 struct symbol *(*iter_match_first) (const struct dictionary *dict,
2edb89d3
JK
118 const char *name,
119 symbol_compare_ftype *equiv,
120 struct dict_iterator *iterator);
c4d840bd 121 struct symbol *(*iter_match_next) (const char *name,
2edb89d3 122 symbol_compare_ftype *equiv,
de4f826b 123 struct dict_iterator *iterator);
de4f826b
DC
124 /* A size function, for maint print symtabs. */
125 int (*size) (const struct dictionary *dict);
126};
127
128/* Now comes the structs used to store the data for different
129 implementations. If two implementations have data in common, put
130 the common data at the top of their structs, ordered in the same
131 way. */
132
133struct dictionary_hashed
134{
135 int nbuckets;
136 struct symbol **buckets;
137};
138
139struct dictionary_hashed_expandable
140{
141 /* How many buckets we currently have. */
142 int nbuckets;
143 struct symbol **buckets;
144 /* How many syms we currently have; we need this so we will know
145 when to add more buckets. */
146 int nsyms;
147};
148
149struct dictionary_linear
150{
151 int nsyms;
152 struct symbol **syms;
153};
154
155struct dictionary_linear_expandable
156{
157 /* How many symbols we currently have. */
158 int nsyms;
159 struct symbol **syms;
160 /* How many symbols we can store before needing to reallocate. */
161 int capacity;
162};
163
164/* And now, the star of our show. */
165
166struct dictionary
167{
5ffa0793 168 const struct language_defn *language;
de4f826b
DC
169 const struct dict_vector *vector;
170 union
171 {
172 struct dictionary_hashed hashed;
173 struct dictionary_hashed_expandable hashed_expandable;
174 struct dictionary_linear linear;
175 struct dictionary_linear_expandable linear_expandable;
176 }
177 data;
178};
179
180/* Accessor macros. */
181
182#define DICT_VECTOR(d) (d)->vector
5ffa0793 183#define DICT_LANGUAGE(d) (d)->language
de4f826b
DC
184
185/* These can be used for DICT_HASHED_EXPANDABLE, too. */
186
187#define DICT_HASHED_NBUCKETS(d) (d)->data.hashed.nbuckets
188#define DICT_HASHED_BUCKETS(d) (d)->data.hashed.buckets
189#define DICT_HASHED_BUCKET(d,i) DICT_HASHED_BUCKETS (d) [i]
190
191#define DICT_HASHED_EXPANDABLE_NSYMS(d) (d)->data.hashed_expandable.nsyms
192
193/* These can be used for DICT_LINEAR_EXPANDABLEs, too. */
194
195#define DICT_LINEAR_NSYMS(d) (d)->data.linear.nsyms
196#define DICT_LINEAR_SYMS(d) (d)->data.linear.syms
197#define DICT_LINEAR_SYM(d,i) DICT_LINEAR_SYMS (d) [i]
198
199#define DICT_LINEAR_EXPANDABLE_CAPACITY(d) \
200 (d)->data.linear_expandable.capacity
201
202/* The initial size of a DICT_*_EXPANDABLE dictionary. */
203
204#define DICT_EXPANDABLE_INITIAL_CAPACITY 10
205
206/* This calculates the number of buckets we'll use in a hashtable,
207 given the number of symbols that it will contain. */
208
209#define DICT_HASHTABLE_SIZE(n) ((n)/5 + 1)
210
211/* Accessor macros for dict_iterators; they're here rather than
212 dictionary.h because code elsewhere should treat dict_iterators as
213 opaque. */
214
215/* The dictionary that the iterator is associated to. */
216#define DICT_ITERATOR_DICT(iter) (iter)->dict
217/* For linear dictionaries, the index of the last symbol returned; for
218 hashed dictionaries, the bucket of the last symbol returned. */
219#define DICT_ITERATOR_INDEX(iter) (iter)->index
220/* For hashed dictionaries, this points to the last symbol returned;
221 otherwise, this is unused. */
222#define DICT_ITERATOR_CURRENT(iter) (iter)->current
223
224/* Declarations of functions for vectors. */
225
226/* Functions that might work across a range of dictionary types. */
227
228static void add_symbol_nonexpandable (struct dictionary *dict,
229 struct symbol *sym);
230
231static void free_obstack (struct dictionary *dict);
232
233/* Functions for DICT_HASHED and DICT_HASHED_EXPANDABLE
234 dictionaries. */
235
236static struct symbol *iterator_first_hashed (const struct dictionary *dict,
237 struct dict_iterator *iterator);
238
239static struct symbol *iterator_next_hashed (struct dict_iterator *iterator);
240
c4d840bd
PH
241static struct symbol *iter_match_first_hashed (const struct dictionary *dict,
242 const char *name,
2edb89d3 243 symbol_compare_ftype *compare,
de4f826b
DC
244 struct dict_iterator *iterator);
245
c4d840bd 246static struct symbol *iter_match_next_hashed (const char *name,
2edb89d3 247 symbol_compare_ftype *compare,
c4d840bd
PH
248 struct dict_iterator *iterator);
249
de4f826b
DC
250/* Functions only for DICT_HASHED. */
251
252static int size_hashed (const struct dictionary *dict);
253
254/* Functions only for DICT_HASHED_EXPANDABLE. */
255
256static void free_hashed_expandable (struct dictionary *dict);
257
258static void add_symbol_hashed_expandable (struct dictionary *dict,
259 struct symbol *sym);
260
261static int size_hashed_expandable (const struct dictionary *dict);
262
263/* Functions for DICT_LINEAR and DICT_LINEAR_EXPANDABLE
264 dictionaries. */
265
266static struct symbol *iterator_first_linear (const struct dictionary *dict,
267 struct dict_iterator *iterator);
268
269static struct symbol *iterator_next_linear (struct dict_iterator *iterator);
270
c4d840bd
PH
271static struct symbol *iter_match_first_linear (const struct dictionary *dict,
272 const char *name,
2edb89d3 273 symbol_compare_ftype *compare,
c4d840bd 274 struct dict_iterator *iterator);
de4f826b 275
c4d840bd 276static struct symbol *iter_match_next_linear (const char *name,
2edb89d3 277 symbol_compare_ftype *compare,
c4d840bd 278 struct dict_iterator *iterator);
de4f826b
DC
279
280static int size_linear (const struct dictionary *dict);
281
282/* Functions only for DICT_LINEAR_EXPANDABLE. */
283
284static void free_linear_expandable (struct dictionary *dict);
285
286static void add_symbol_linear_expandable (struct dictionary *dict,
287 struct symbol *sym);
288
289/* Various vectors that we'll actually use. */
290
291static const struct dict_vector dict_hashed_vector =
292 {
293 DICT_HASHED, /* type */
294 free_obstack, /* free */
295 add_symbol_nonexpandable, /* add_symbol */
a11a1416 296 iterator_first_hashed, /* iterator_first */
de4f826b 297 iterator_next_hashed, /* iterator_next */
c4d840bd
PH
298 iter_match_first_hashed, /* iter_name_first */
299 iter_match_next_hashed, /* iter_name_next */
de4f826b
DC
300 size_hashed, /* size */
301 };
302
303static const struct dict_vector dict_hashed_expandable_vector =
304 {
305 DICT_HASHED_EXPANDABLE, /* type */
306 free_hashed_expandable, /* free */
307 add_symbol_hashed_expandable, /* add_symbol */
a11a1416 308 iterator_first_hashed, /* iterator_first */
de4f826b 309 iterator_next_hashed, /* iterator_next */
c4d840bd
PH
310 iter_match_first_hashed, /* iter_name_first */
311 iter_match_next_hashed, /* iter_name_next */
de4f826b
DC
312 size_hashed_expandable, /* size */
313 };
314
315static const struct dict_vector dict_linear_vector =
316 {
317 DICT_LINEAR, /* type */
318 free_obstack, /* free */
319 add_symbol_nonexpandable, /* add_symbol */
a11a1416 320 iterator_first_linear, /* iterator_first */
de4f826b 321 iterator_next_linear, /* iterator_next */
c4d840bd
PH
322 iter_match_first_linear, /* iter_name_first */
323 iter_match_next_linear, /* iter_name_next */
de4f826b
DC
324 size_linear, /* size */
325 };
326
327static const struct dict_vector dict_linear_expandable_vector =
328 {
329 DICT_LINEAR_EXPANDABLE, /* type */
330 free_linear_expandable, /* free */
331 add_symbol_linear_expandable, /* add_symbol */
a11a1416 332 iterator_first_linear, /* iterator_first */
de4f826b 333 iterator_next_linear, /* iterator_next */
c4d840bd
PH
334 iter_match_first_linear, /* iter_name_first */
335 iter_match_next_linear, /* iter_name_next */
de4f826b
DC
336 size_linear, /* size */
337 };
338
339/* Declarations of helper functions (i.e. ones that don't go into
340 vectors). */
341
342static struct symbol *iterator_hashed_advance (struct dict_iterator *iter);
343
344static void insert_symbol_hashed (struct dictionary *dict,
345 struct symbol *sym);
346
347static void expand_hashtable (struct dictionary *dict);
348
349/* The creation functions. */
350
5ffa0793 351/* See dictionary.h. */
de4f826b
DC
352
353struct dictionary *
354dict_create_hashed (struct obstack *obstack,
5ffa0793 355 enum language language,
de4f826b
DC
356 const struct pending *symbol_list)
357{
358 struct dictionary *retval;
359 int nsyms = 0, nbuckets, i;
360 struct symbol **buckets;
361 const struct pending *list_counter;
362
8d749320 363 retval = XOBNEW (obstack, struct dictionary);
de4f826b 364 DICT_VECTOR (retval) = &dict_hashed_vector;
5ffa0793 365 DICT_LANGUAGE (retval) = language_def (language);
de4f826b
DC
366
367 /* Calculate the number of symbols, and allocate space for them. */
368 for (list_counter = symbol_list;
369 list_counter != NULL;
370 list_counter = list_counter->next)
371 {
372 nsyms += list_counter->nsyms;
373 }
374 nbuckets = DICT_HASHTABLE_SIZE (nsyms);
375 DICT_HASHED_NBUCKETS (retval) = nbuckets;
8d749320 376 buckets = XOBNEWVEC (obstack, struct symbol *, nbuckets);
de4f826b
DC
377 memset (buckets, 0, nbuckets * sizeof (struct symbol *));
378 DICT_HASHED_BUCKETS (retval) = buckets;
379
380 /* Now fill the buckets. */
381 for (list_counter = symbol_list;
382 list_counter != NULL;
383 list_counter = list_counter->next)
384 {
385 for (i = list_counter->nsyms - 1; i >= 0; --i)
386 {
387 insert_symbol_hashed (retval, list_counter->symbol[i]);
388 }
389 }
390
391 return retval;
392}
393
5ffa0793 394/* See dictionary.h. */
de4f826b
DC
395
396extern struct dictionary *
5ffa0793 397dict_create_hashed_expandable (enum language language)
de4f826b 398{
8d749320 399 struct dictionary *retval = XNEW (struct dictionary);
de4f826b 400
de4f826b 401 DICT_VECTOR (retval) = &dict_hashed_expandable_vector;
5ffa0793 402 DICT_LANGUAGE (retval) = language_def (language);
de4f826b 403 DICT_HASHED_NBUCKETS (retval) = DICT_EXPANDABLE_INITIAL_CAPACITY;
224c3ddb
SM
404 DICT_HASHED_BUCKETS (retval) = XCNEWVEC (struct symbol *,
405 DICT_EXPANDABLE_INITIAL_CAPACITY);
de4f826b
DC
406 DICT_HASHED_EXPANDABLE_NSYMS (retval) = 0;
407
408 return retval;
409}
410
5ffa0793 411/* See dictionary.h. */
de4f826b
DC
412
413struct dictionary *
414dict_create_linear (struct obstack *obstack,
5ffa0793 415 enum language language,
de4f826b
DC
416 const struct pending *symbol_list)
417{
418 struct dictionary *retval;
419 int nsyms = 0, i, j;
420 struct symbol **syms;
421 const struct pending *list_counter;
422
8d749320 423 retval = XOBNEW (obstack, struct dictionary);
de4f826b 424 DICT_VECTOR (retval) = &dict_linear_vector;
5ffa0793 425 DICT_LANGUAGE (retval) = language_def (language);
de4f826b
DC
426
427 /* Calculate the number of symbols, and allocate space for them. */
428 for (list_counter = symbol_list;
429 list_counter != NULL;
430 list_counter = list_counter->next)
431 {
432 nsyms += list_counter->nsyms;
433 }
434 DICT_LINEAR_NSYMS (retval) = nsyms;
8d749320 435 syms = XOBNEWVEC (obstack, struct symbol *, nsyms );
de4f826b
DC
436 DICT_LINEAR_SYMS (retval) = syms;
437
438 /* Now fill in the symbols. Start filling in from the back, so as
439 to preserve the original order of the symbols. */
440 for (list_counter = symbol_list, j = nsyms - 1;
441 list_counter != NULL;
442 list_counter = list_counter->next)
443 {
444 for (i = list_counter->nsyms - 1;
445 i >= 0;
446 --i, --j)
447 {
448 syms[j] = list_counter->symbol[i];
449 }
450 }
451
452 return retval;
453}
454
5ffa0793 455/* See dictionary.h. */
de4f826b
DC
456
457struct dictionary *
5ffa0793 458dict_create_linear_expandable (enum language language)
de4f826b 459{
8d749320 460 struct dictionary *retval = XNEW (struct dictionary);
de4f826b 461
de4f826b 462 DICT_VECTOR (retval) = &dict_linear_expandable_vector;
5ffa0793 463 DICT_LANGUAGE (retval) = language_def (language);
de4f826b 464 DICT_LINEAR_NSYMS (retval) = 0;
224c3ddb 465 DICT_LINEAR_EXPANDABLE_CAPACITY (retval) = DICT_EXPANDABLE_INITIAL_CAPACITY;
de4f826b 466 DICT_LINEAR_SYMS (retval)
224c3ddb 467 = XNEWVEC (struct symbol *, DICT_LINEAR_EXPANDABLE_CAPACITY (retval));
de4f826b
DC
468
469 return retval;
470}
471
472/* The functions providing the dictionary interface. */
473
474/* Free the memory used by a dictionary that's not on an obstack. (If
475 any.) */
476
477void
478dict_free (struct dictionary *dict)
479{
480 (DICT_VECTOR (dict))->free (dict);
481}
482
483/* Add SYM to DICT. DICT had better be expandable. */
484
485void
486dict_add_symbol (struct dictionary *dict, struct symbol *sym)
487{
488 (DICT_VECTOR (dict))->add_symbol (dict, sym);
489}
490
0bfa869d
DE
491/* Utility to add a list of symbols to a dictionary.
492 DICT must be an expandable dictionary. */
493
494void
495dict_add_pending (struct dictionary *dict, const struct pending *symbol_list)
496{
497 const struct pending *list;
498 int i;
499
500 for (list = symbol_list; list != NULL; list = list->next)
501 {
502 for (i = 0; i < list->nsyms; ++i)
503 dict_add_symbol (dict, list->symbol[i]);
504 }
505}
506
de4f826b
DC
507/* Initialize ITERATOR to point at the first symbol in DICT, and
508 return that first symbol, or NULL if DICT is empty. */
509
510struct symbol *
511dict_iterator_first (const struct dictionary *dict,
512 struct dict_iterator *iterator)
513{
514 return (DICT_VECTOR (dict))->iterator_first (dict, iterator);
515}
516
517/* Advance ITERATOR, and return the next symbol, or NULL if there are
518 no more symbols. */
519
520struct symbol *
521dict_iterator_next (struct dict_iterator *iterator)
522{
523 return (DICT_VECTOR (DICT_ITERATOR_DICT (iterator)))
524 ->iterator_next (iterator);
525}
526
c4d840bd
PH
527struct symbol *
528dict_iter_match_first (const struct dictionary *dict,
2edb89d3 529 const char *name, symbol_compare_ftype *compare,
c4d840bd
PH
530 struct dict_iterator *iterator)
531{
3e43a32a
MS
532 return (DICT_VECTOR (dict))->iter_match_first (dict, name,
533 compare, iterator);
c4d840bd
PH
534}
535
536struct symbol *
2edb89d3 537dict_iter_match_next (const char *name, symbol_compare_ftype *compare,
c4d840bd 538 struct dict_iterator *iterator)
de4f826b
DC
539{
540 return (DICT_VECTOR (DICT_ITERATOR_DICT (iterator)))
c4d840bd 541 ->iter_match_next (name, compare, iterator);
de4f826b
DC
542}
543
544int
545dict_size (const struct dictionary *dict)
546{
547 return (DICT_VECTOR (dict))->size (dict);
548}
549
550/* Now come functions (well, one function, currently) that are
551 implemented generically by means of the vtable. Typically, they're
552 rarely used. */
553
554/* Test to see if DICT is empty. */
555
556int
557dict_empty (struct dictionary *dict)
558{
559 struct dict_iterator iter;
560
561 return (dict_iterator_first (dict, &iter) == NULL);
562}
563
564
565/* The functions implementing the dictionary interface. */
566
567/* Generic functions, where appropriate. */
568
569static void
570free_obstack (struct dictionary *dict)
571{
572 /* Do nothing! */
573}
574
575static void
576add_symbol_nonexpandable (struct dictionary *dict, struct symbol *sym)
577{
578 internal_error (__FILE__, __LINE__,
e2e0b3e5 579 _("dict_add_symbol: non-expandable dictionary"));
de4f826b
DC
580}
581
582/* Functions for DICT_HASHED and DICT_HASHED_EXPANDABLE. */
583
584static struct symbol *
585iterator_first_hashed (const struct dictionary *dict,
586 struct dict_iterator *iterator)
587{
588 DICT_ITERATOR_DICT (iterator) = dict;
589 DICT_ITERATOR_INDEX (iterator) = -1;
590 return iterator_hashed_advance (iterator);
591}
592
593static struct symbol *
594iterator_next_hashed (struct dict_iterator *iterator)
595{
de4f826b
DC
596 struct symbol *next;
597
598 next = DICT_ITERATOR_CURRENT (iterator)->hash_next;
599
600 if (next == NULL)
601 return iterator_hashed_advance (iterator);
602 else
603 {
604 DICT_ITERATOR_CURRENT (iterator) = next;
605 return next;
606 }
607}
608
609static struct symbol *
610iterator_hashed_advance (struct dict_iterator *iterator)
611{
612 const struct dictionary *dict = DICT_ITERATOR_DICT (iterator);
613 int nbuckets = DICT_HASHED_NBUCKETS (dict);
614 int i;
615
616 for (i = DICT_ITERATOR_INDEX (iterator) + 1; i < nbuckets; ++i)
617 {
618 struct symbol *sym = DICT_HASHED_BUCKET (dict, i);
619
620 if (sym != NULL)
621 {
622 DICT_ITERATOR_INDEX (iterator) = i;
623 DICT_ITERATOR_CURRENT (iterator) = sym;
624 return sym;
625 }
626 }
627
628 return NULL;
629}
630
631static struct symbol *
2edb89d3
JK
632iter_match_first_hashed (const struct dictionary *dict, const char *name,
633 symbol_compare_ftype *compare,
c4d840bd 634 struct dict_iterator *iterator)
de4f826b 635{
5ffa0793
PA
636 unsigned int hash_index
637 = (search_name_hash (DICT_LANGUAGE (dict)->la_language, name)
638 % DICT_HASHED_NBUCKETS (dict));
de4f826b
DC
639 struct symbol *sym;
640
641 DICT_ITERATOR_DICT (iterator) = dict;
642
643 /* Loop through the symbols in the given bucket, breaking when SYM
644 first matches. If SYM never matches, it will be set to NULL;
645 either way, we have the right return value. */
646
647 for (sym = DICT_HASHED_BUCKET (dict, hash_index);
648 sym != NULL;
649 sym = sym->hash_next)
650 {
c4d840bd
PH
651 /* Warning: the order of arguments to compare matters! */
652 if (compare (SYMBOL_SEARCH_NAME (sym), name) == 0)
de4f826b
DC
653 {
654 break;
655 }
656
657 }
658
659 DICT_ITERATOR_CURRENT (iterator) = sym;
660 return sym;
661}
662
663static struct symbol *
2edb89d3 664iter_match_next_hashed (const char *name, symbol_compare_ftype *compare,
c4d840bd 665 struct dict_iterator *iterator)
de4f826b
DC
666{
667 struct symbol *next;
668
669 for (next = DICT_ITERATOR_CURRENT (iterator)->hash_next;
670 next != NULL;
671 next = next->hash_next)
672 {
c4d840bd 673 if (compare (SYMBOL_SEARCH_NAME (next), name) == 0)
de4f826b
DC
674 break;
675 }
676
677 DICT_ITERATOR_CURRENT (iterator) = next;
678
679 return next;
680}
681
682/* Insert SYM into DICT. */
683
684static void
685insert_symbol_hashed (struct dictionary *dict,
686 struct symbol *sym)
687{
688 unsigned int hash_index;
5ffa0793 689 unsigned int hash;
de4f826b
DC
690 struct symbol **buckets = DICT_HASHED_BUCKETS (dict);
691
5ffa0793
PA
692 /* We don't want to insert a symbol into a dictionary of a different
693 language. The two may not use the same hashing algorithm. */
694 gdb_assert (SYMBOL_LANGUAGE (sym) == DICT_LANGUAGE (dict)->la_language);
695
696 hash = search_name_hash (SYMBOL_LANGUAGE (sym), SYMBOL_SEARCH_NAME (sym));
697 hash_index = hash % DICT_HASHED_NBUCKETS (dict);
de4f826b
DC
698 sym->hash_next = buckets[hash_index];
699 buckets[hash_index] = sym;
700}
701
702static int
703size_hashed (const struct dictionary *dict)
704{
705 return DICT_HASHED_NBUCKETS (dict);
706}
707
708/* Functions only for DICT_HASHED_EXPANDABLE. */
709
710static void
711free_hashed_expandable (struct dictionary *dict)
712{
713 xfree (DICT_HASHED_BUCKETS (dict));
714 xfree (dict);
715}
716
717static void
718add_symbol_hashed_expandable (struct dictionary *dict,
719 struct symbol *sym)
720{
721 int nsyms = ++DICT_HASHED_EXPANDABLE_NSYMS (dict);
722
723 if (DICT_HASHTABLE_SIZE (nsyms) > DICT_HASHED_NBUCKETS (dict))
724 expand_hashtable (dict);
725
726 insert_symbol_hashed (dict, sym);
727 DICT_HASHED_EXPANDABLE_NSYMS (dict) = nsyms;
728}
729
730static int
731size_hashed_expandable (const struct dictionary *dict)
732{
733 return DICT_HASHED_EXPANDABLE_NSYMS (dict);
734}
735
736static void
737expand_hashtable (struct dictionary *dict)
738{
739 int old_nbuckets = DICT_HASHED_NBUCKETS (dict);
740 struct symbol **old_buckets = DICT_HASHED_BUCKETS (dict);
224c3ddb
SM
741 int new_nbuckets = 2 * old_nbuckets + 1;
742 struct symbol **new_buckets = XCNEWVEC (struct symbol *, new_nbuckets);
de4f826b
DC
743 int i;
744
745 DICT_HASHED_NBUCKETS (dict) = new_nbuckets;
746 DICT_HASHED_BUCKETS (dict) = new_buckets;
747
6595d32b
MS
748 for (i = 0; i < old_nbuckets; ++i)
749 {
750 struct symbol *sym, *next_sym;
751
752 sym = old_buckets[i];
753 if (sym != NULL)
754 {
755 for (next_sym = sym->hash_next;
756 next_sym != NULL;
757 next_sym = sym->hash_next)
758 {
759 insert_symbol_hashed (dict, sym);
760 sym = next_sym;
761 }
762
763 insert_symbol_hashed (dict, sym);
764 }
de4f826b 765 }
de4f826b
DC
766
767 xfree (old_buckets);
768}
769
5ffa0793 770/* See dictionary.h. */
c4d840bd 771
5ffa0793
PA
772unsigned int
773default_search_name_hash (const char *string0)
c4d840bd
PH
774{
775 /* The Ada-encoded version of a name P1.P2...Pn has either the form
776 P1__P2__...Pn<suffix> or _ada_P1__P2__...Pn<suffix> (where the Pi
777 are lower-cased identifiers). The <suffix> (which can be empty)
778 encodes additional information about the denoted entity. This
779 routine hashes such names to msymbol_hash_iw(Pn). It actually
780 does this for a superset of both valid Pi and of <suffix>, but
781 in other cases it simply returns msymbol_hash_iw(STRING0). */
782
1d2a4540 783 const char *string;
c4d840bd 784 unsigned int hash;
c4d840bd 785
1d2a4540
PH
786 string = string0;
787 if (*string == '_')
788 {
61012eef 789 if (startswith (string, "_ada_"))
1d2a4540
PH
790 string += 5;
791 else
792 return msymbol_hash_iw (string0);
793 }
c4d840bd
PH
794
795 hash = 0;
796 while (*string)
797 {
9ac7f98e
JB
798 /* Ignore "TKB" suffixes.
799
800 These are used by Ada for subprograms implementing a task body.
801 For instance for a task T inside package Pck, the name of the
802 subprogram implementing T's body is `pck__tTKB'. We need to
803 ignore the "TKB" suffix because searches for this task body
804 subprogram are going to be performed using `pck__t' (the encoded
805 version of the natural name `pck.t'). */
806 if (strcmp (string, "TKB") == 0)
807 return hash;
808
c4d840bd
PH
809 switch (*string)
810 {
811 case '$':
812 case '.':
813 case 'X':
1d2a4540
PH
814 if (string0 == string)
815 return msymbol_hash_iw (string0);
816 else
817 return hash;
c4d840bd 818 case ' ':
1d2a4540
PH
819 case '(':
820 return msymbol_hash_iw (string0);
c4d840bd 821 case '_':
1d2a4540 822 if (string[1] == '_' && string != string0)
c4d840bd 823 {
558b1900
JB
824 int c = string[2];
825
826 if ((c < 'a' || c > 'z') && c != 'O')
c4d840bd
PH
827 return hash;
828 hash = 0;
829 string += 2;
830 break;
831 }
832 /* FALL THROUGH */
833 default:
59d7bcaf 834 hash = SYMBOL_HASH_NEXT (hash, *string);
c4d840bd
PH
835 string += 1;
836 break;
837 }
838 }
839 return hash;
840}
841
de4f826b
DC
842/* Functions for DICT_LINEAR and DICT_LINEAR_EXPANDABLE. */
843
844static struct symbol *
845iterator_first_linear (const struct dictionary *dict,
846 struct dict_iterator *iterator)
847{
848 DICT_ITERATOR_DICT (iterator) = dict;
849 DICT_ITERATOR_INDEX (iterator) = 0;
850 return DICT_LINEAR_NSYMS (dict) ? DICT_LINEAR_SYM (dict, 0) : NULL;
851}
852
853static struct symbol *
854iterator_next_linear (struct dict_iterator *iterator)
855{
856 const struct dictionary *dict = DICT_ITERATOR_DICT (iterator);
857
858 if (++DICT_ITERATOR_INDEX (iterator) >= DICT_LINEAR_NSYMS (dict))
859 return NULL;
860 else
861 return DICT_LINEAR_SYM (dict, DICT_ITERATOR_INDEX (iterator));
862}
863
864static struct symbol *
c4d840bd 865iter_match_first_linear (const struct dictionary *dict,
2edb89d3 866 const char *name, symbol_compare_ftype *compare,
c4d840bd 867 struct dict_iterator *iterator)
de4f826b
DC
868{
869 DICT_ITERATOR_DICT (iterator) = dict;
870 DICT_ITERATOR_INDEX (iterator) = -1;
871
c4d840bd 872 return iter_match_next_linear (name, compare, iterator);
de4f826b
DC
873}
874
875static struct symbol *
2edb89d3 876iter_match_next_linear (const char *name, symbol_compare_ftype *compare,
c4d840bd 877 struct dict_iterator *iterator)
de4f826b
DC
878{
879 const struct dictionary *dict = DICT_ITERATOR_DICT (iterator);
880 int i, nsyms = DICT_LINEAR_NSYMS (dict);
881 struct symbol *sym, *retval = NULL;
882
883 for (i = DICT_ITERATOR_INDEX (iterator) + 1; i < nsyms; ++i)
884 {
885 sym = DICT_LINEAR_SYM (dict, i);
c4d840bd 886 if (compare (SYMBOL_SEARCH_NAME (sym), name) == 0)
de4f826b
DC
887 {
888 retval = sym;
889 break;
890 }
891 }
892
893 DICT_ITERATOR_INDEX (iterator) = i;
894
895 return retval;
896}
897
898static int
899size_linear (const struct dictionary *dict)
900{
901 return DICT_LINEAR_NSYMS (dict);
902}
903
904/* Functions only for DICT_LINEAR_EXPANDABLE. */
905
906static void
907free_linear_expandable (struct dictionary *dict)
908{
909 xfree (DICT_LINEAR_SYMS (dict));
910 xfree (dict);
911}
912
913
914static void
915add_symbol_linear_expandable (struct dictionary *dict,
916 struct symbol *sym)
917{
918 int nsyms = ++DICT_LINEAR_NSYMS (dict);
919
920 /* Do we have enough room? If not, grow it. */
6595d32b
MS
921 if (nsyms > DICT_LINEAR_EXPANDABLE_CAPACITY (dict))
922 {
923 DICT_LINEAR_EXPANDABLE_CAPACITY (dict) *= 2;
924 DICT_LINEAR_SYMS (dict)
224c3ddb
SM
925 = XRESIZEVEC (struct symbol *, DICT_LINEAR_SYMS (dict),
926 DICT_LINEAR_EXPANDABLE_CAPACITY (dict));
6595d32b 927 }
de4f826b
DC
928
929 DICT_LINEAR_SYM (dict, nsyms - 1) = sym;
930}
This page took 1.031296 seconds and 4 git commands to generate.