1 /* Routines for name->symbol lookups in GDB. 2 3 Copyright (C) 2003-2019 Free Software Foundation, Inc. 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 12 the Free Software Foundation; either version 3 of the License, or 13 (at your option) any later version. 14 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. 19 20 You should have received a copy of the GNU General Public License 21 along with this program. If not, see <http://www.gnu.org/licenses/>. */ 22 23 #include "defs.h" 24 #include <ctype.h> 25 #include "gdb_obstack.h" 26 #include "symtab.h" 27 #include "buildsym.h" 28 #include "dictionary.h" 29 #include "safe-ctype.h" 30 #include <unordered_map> 31 32 /* This file implements dictionaries, which are tables that associate 33 symbols to names. They are represented by an opaque type 'struct 34 dictionary'. That type has various internal implementations, which 35 you can choose between depending on what properties you need 36 (e.g. fast lookup, order-preserving, expandable). 37 38 Each dictionary starts with a 'virtual function table' that 39 contains the functions that actually implement the various 40 operations that dictionaries provide. (Note, however, that, for 41 the sake of client code, we also provide some functions that can be 42 implemented generically in terms of the functions in the vtable.) 43 44 To add a new dictionary implementation <impl>, what you should do 45 is: 46 47 * Add a new element DICT_<IMPL> to dict_type. 48 49 * Create a new structure dictionary_<impl>. If your new 50 implementation is a variant of an existing one, make sure that 51 their structs have the same initial data members. Define accessor 52 macros for your new data members. 53 54 * Implement all the functions in dict_vector as static functions, 55 whose name is the same as the corresponding member of dict_vector 56 plus _<impl>. You don't have to do this for those members where 57 you can reuse existing generic functions 58 (e.g. add_symbol_nonexpandable, free_obstack) or in the case where 59 your new implementation is a variant of an existing implementation 60 and where the variant doesn't affect the member function in 61 question. 62 63 * Define a static const struct dict_vector dict_<impl>_vector. 64 65 * Define a function dict_create_<impl> to create these 66 gizmos. Add its declaration to dictionary.h. 67 68 To add a new operation <op> on all existing implementations, what 69 you should do is: 70 71 * Add a new member <op> to struct dict_vector. 72 73 * If there is useful generic behavior <op>, define a static 74 function <op>_something_informative that implements that behavior. 75 (E.g. add_symbol_nonexpandable, free_obstack.) 76 77 * For every implementation <impl> that should have its own specific 78 behavior for <op>, define a static function <op>_<impl> 79 implementing it. 80 81 * Modify all existing dict_vector_<impl>'s to include the appropriate 82 member. 83 84 * Define a function dict_<op> that looks up <op> in the dict_vector 85 and calls the appropriate function. Add a declaration for 86 dict_<op> to dictionary.h. */ 87 88 /* An enum representing the various implementations of dictionaries. 89 Used only for debugging. */ 90 91 enum dict_type 92 { 93 /* Symbols are stored in a fixed-size hash table. */ 94 DICT_HASHED, 95 /* Symbols are stored in an expandable hash table. */ 96 DICT_HASHED_EXPANDABLE, 97 /* Symbols are stored in a fixed-size array. */ 98 DICT_LINEAR, 99 /* Symbols are stored in an expandable array. */ 100 DICT_LINEAR_EXPANDABLE 101 }; 102 103 /* The virtual function table. */ 104 105 struct dict_vector 106 { 107 /* The type of the dictionary. This is only here to make debugging 108 a bit easier; it's not actually used. */ 109 enum dict_type type; 110 /* The function to free a dictionary. */ 111 void (*free) (struct dictionary *dict); 112 /* Add a symbol to a dictionary, if possible. */ 113 void (*add_symbol) (struct dictionary *dict, struct symbol *sym); 114 /* Iterator functions. */ 115 struct symbol *(*iterator_first) (const struct dictionary *dict, 116 struct dict_iterator *iterator); 117 struct symbol *(*iterator_next) (struct dict_iterator *iterator); 118 /* Functions to iterate over symbols with a given name. */ 119 struct symbol *(*iter_match_first) (const struct dictionary *dict, 120 const lookup_name_info &name, 121 struct dict_iterator *iterator); 122 struct symbol *(*iter_match_next) (const lookup_name_info &name, 123 struct dict_iterator *iterator); 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 133 struct dictionary_hashed 134 { 135 int nbuckets; 136 struct symbol **buckets; 137 }; 138 139 struct 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 149 struct dictionary_linear 150 { 151 int nsyms; 152 struct symbol **syms; 153 }; 154 155 struct 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 166 struct dictionary 167 { 168 const struct language_defn *language; 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 183 #define DICT_LANGUAGE(d) (d)->language 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 228 static void add_symbol_nonexpandable (struct dictionary *dict, 229 struct symbol *sym); 230 231 static void free_obstack (struct dictionary *dict); 232 233 /* Functions for DICT_HASHED and DICT_HASHED_EXPANDABLE 234 dictionaries. */ 235 236 static struct symbol *iterator_first_hashed (const struct dictionary *dict, 237 struct dict_iterator *iterator); 238 239 static struct symbol *iterator_next_hashed (struct dict_iterator *iterator); 240 241 static struct symbol *iter_match_first_hashed (const struct dictionary *dict, 242 const lookup_name_info &name, 243 struct dict_iterator *iterator); 244 245 static struct symbol *iter_match_next_hashed (const lookup_name_info &name, 246 struct dict_iterator *iterator); 247 248 /* Functions only for DICT_HASHED. */ 249 250 static int size_hashed (const struct dictionary *dict); 251 252 /* Functions only for DICT_HASHED_EXPANDABLE. */ 253 254 static void free_hashed_expandable (struct dictionary *dict); 255 256 static void add_symbol_hashed_expandable (struct dictionary *dict, 257 struct symbol *sym); 258 259 static int size_hashed_expandable (const struct dictionary *dict); 260 261 /* Functions for DICT_LINEAR and DICT_LINEAR_EXPANDABLE 262 dictionaries. */ 263 264 static struct symbol *iterator_first_linear (const struct dictionary *dict, 265 struct dict_iterator *iterator); 266 267 static struct symbol *iterator_next_linear (struct dict_iterator *iterator); 268 269 static struct symbol *iter_match_first_linear (const struct dictionary *dict, 270 const lookup_name_info &name, 271 struct dict_iterator *iterator); 272 273 static struct symbol *iter_match_next_linear (const lookup_name_info &name, 274 struct dict_iterator *iterator); 275 276 static int size_linear (const struct dictionary *dict); 277 278 /* Functions only for DICT_LINEAR_EXPANDABLE. */ 279 280 static void free_linear_expandable (struct dictionary *dict); 281 282 static void add_symbol_linear_expandable (struct dictionary *dict, 283 struct symbol *sym); 284 285 /* Various vectors that we'll actually use. */ 286 287 static const struct dict_vector dict_hashed_vector = 288 { 289 DICT_HASHED, /* type */ 290 free_obstack, /* free */ 291 add_symbol_nonexpandable, /* add_symbol */ 292 iterator_first_hashed, /* iterator_first */ 293 iterator_next_hashed, /* iterator_next */ 294 iter_match_first_hashed, /* iter_name_first */ 295 iter_match_next_hashed, /* iter_name_next */ 296 size_hashed, /* size */ 297 }; 298 299 static const struct dict_vector dict_hashed_expandable_vector = 300 { 301 DICT_HASHED_EXPANDABLE, /* type */ 302 free_hashed_expandable, /* free */ 303 add_symbol_hashed_expandable, /* add_symbol */ 304 iterator_first_hashed, /* iterator_first */ 305 iterator_next_hashed, /* iterator_next */ 306 iter_match_first_hashed, /* iter_name_first */ 307 iter_match_next_hashed, /* iter_name_next */ 308 size_hashed_expandable, /* size */ 309 }; 310 311 static const struct dict_vector dict_linear_vector = 312 { 313 DICT_LINEAR, /* type */ 314 free_obstack, /* free */ 315 add_symbol_nonexpandable, /* add_symbol */ 316 iterator_first_linear, /* iterator_first */ 317 iterator_next_linear, /* iterator_next */ 318 iter_match_first_linear, /* iter_name_first */ 319 iter_match_next_linear, /* iter_name_next */ 320 size_linear, /* size */ 321 }; 322 323 static const struct dict_vector dict_linear_expandable_vector = 324 { 325 DICT_LINEAR_EXPANDABLE, /* type */ 326 free_linear_expandable, /* free */ 327 add_symbol_linear_expandable, /* add_symbol */ 328 iterator_first_linear, /* iterator_first */ 329 iterator_next_linear, /* iterator_next */ 330 iter_match_first_linear, /* iter_name_first */ 331 iter_match_next_linear, /* iter_name_next */ 332 size_linear, /* size */ 333 }; 334 335 /* Declarations of helper functions (i.e. ones that don't go into 336 vectors). */ 337 338 static struct symbol *iterator_hashed_advance (struct dict_iterator *iter); 339 340 static void insert_symbol_hashed (struct dictionary *dict, 341 struct symbol *sym); 342 343 static void expand_hashtable (struct dictionary *dict); 344 345 /* The creation functions. */ 346 347 /* Create a hashed dictionary of a given language. */ 348 349 static struct dictionary * 350 dict_create_hashed (struct obstack *obstack, 351 enum language language, 352 const std::vector<symbol *> &symbol_list) 353 { 354 /* Allocate the dictionary. */ 355 struct dictionary *retval = XOBNEW (obstack, struct dictionary); 356 DICT_VECTOR (retval) = &dict_hashed_vector; 357 DICT_LANGUAGE (retval) = language_def (language); 358 359 /* Allocate space for symbols. */ 360 int nsyms = symbol_list.size (); 361 int nbuckets = DICT_HASHTABLE_SIZE (nsyms); 362 DICT_HASHED_NBUCKETS (retval) = nbuckets; 363 struct symbol **buckets = XOBNEWVEC (obstack, struct symbol *, nbuckets); 364 memset (buckets, 0, nbuckets * sizeof (struct symbol *)); 365 DICT_HASHED_BUCKETS (retval) = buckets; 366 367 /* Now fill the buckets. */ 368 for (const auto &sym : symbol_list) 369 insert_symbol_hashed (retval, sym); 370 371 return retval; 372 } 373 374 /* Create an expandable hashed dictionary of a given language. */ 375 376 static struct dictionary * 377 dict_create_hashed_expandable (enum language language) 378 { 379 struct dictionary *retval = XNEW (struct dictionary); 380 381 DICT_VECTOR (retval) = &dict_hashed_expandable_vector; 382 DICT_LANGUAGE (retval) = language_def (language); 383 DICT_HASHED_NBUCKETS (retval) = DICT_EXPANDABLE_INITIAL_CAPACITY; 384 DICT_HASHED_BUCKETS (retval) = XCNEWVEC (struct symbol *, 385 DICT_EXPANDABLE_INITIAL_CAPACITY); 386 DICT_HASHED_EXPANDABLE_NSYMS (retval) = 0; 387 388 return retval; 389 } 390 391 /* Create a linear dictionary of a given language. */ 392 393 static struct dictionary * 394 dict_create_linear (struct obstack *obstack, 395 enum language language, 396 const std::vector<symbol *> &symbol_list) 397 { 398 struct dictionary *retval = XOBNEW (obstack, struct dictionary); 399 DICT_VECTOR (retval) = &dict_linear_vector; 400 DICT_LANGUAGE (retval) = language_def (language); 401 402 /* Allocate space for symbols. */ 403 int nsyms = symbol_list.size (); 404 DICT_LINEAR_NSYMS (retval) = nsyms; 405 struct symbol **syms = XOBNEWVEC (obstack, struct symbol *, nsyms); 406 DICT_LINEAR_SYMS (retval) = syms; 407 408 /* Now fill in the symbols. */ 409 int idx = nsyms - 1; 410 for (const auto &sym : symbol_list) 411 syms[idx--] = sym; 412 413 return retval; 414 } 415 416 /* Create an expandable linear dictionary of a given language. */ 417 418 static struct dictionary * 419 dict_create_linear_expandable (enum language language) 420 { 421 struct dictionary *retval = XNEW (struct dictionary); 422 423 DICT_VECTOR (retval) = &dict_linear_expandable_vector; 424 DICT_LANGUAGE (retval) = language_def (language); 425 DICT_LINEAR_NSYMS (retval) = 0; 426 DICT_LINEAR_EXPANDABLE_CAPACITY (retval) = DICT_EXPANDABLE_INITIAL_CAPACITY; 427 DICT_LINEAR_SYMS (retval) 428 = XNEWVEC (struct symbol *, DICT_LINEAR_EXPANDABLE_CAPACITY (retval)); 429 430 return retval; 431 } 432 433 /* The functions providing the dictionary interface. */ 434 435 /* Free the memory used by a dictionary that's not on an obstack. (If 436 any.) */ 437 438 static void 439 dict_free (struct dictionary *dict) 440 { 441 (DICT_VECTOR (dict))->free (dict); 442 } 443 444 /* Add SYM to DICT. DICT had better be expandable. */ 445 446 static void 447 dict_add_symbol (struct dictionary *dict, struct symbol *sym) 448 { 449 (DICT_VECTOR (dict))->add_symbol (dict, sym); 450 } 451 452 /* Utility to add a list of symbols to a dictionary. 453 DICT must be an expandable dictionary. */ 454 455 static void 456 dict_add_pending (struct dictionary *dict, 457 const std::vector<symbol *> &symbol_list) 458 { 459 /* Preserve ordering by reversing the list. */ 460 for (auto sym = symbol_list.rbegin (); sym != symbol_list.rend (); ++sym) 461 dict_add_symbol (dict, *sym); 462 } 463 464 /* Initialize ITERATOR to point at the first symbol in DICT, and 465 return that first symbol, or NULL if DICT is empty. */ 466 467 struct symbol * 468 dict_iterator_first (const struct dictionary *dict, 469 struct dict_iterator *iterator) 470 { 471 return (DICT_VECTOR (dict))->iterator_first (dict, iterator); 472 } 473 474 /* Advance ITERATOR, and return the next symbol, or NULL if there are 475 no more symbols. */ 476 477 struct symbol * 478 dict_iterator_next (struct dict_iterator *iterator) 479 { 480 return (DICT_VECTOR (DICT_ITERATOR_DICT (iterator))) 481 ->iterator_next (iterator); 482 } 483 484 struct symbol * 485 dict_iter_match_first (const struct dictionary *dict, 486 const lookup_name_info &name, 487 struct dict_iterator *iterator) 488 { 489 return (DICT_VECTOR (dict))->iter_match_first (dict, name, iterator); 490 } 491 492 struct symbol * 493 dict_iter_match_next (const lookup_name_info &name, 494 struct dict_iterator *iterator) 495 { 496 return (DICT_VECTOR (DICT_ITERATOR_DICT (iterator))) 497 ->iter_match_next (name, iterator); 498 } 499 500 static int 501 dict_size (const struct dictionary *dict) 502 { 503 return (DICT_VECTOR (dict))->size (dict); 504 } 505 506 /* Now come functions (well, one function, currently) that are 507 implemented generically by means of the vtable. Typically, they're 508 rarely used. */ 509 510 /* Test to see if DICT is empty. */ 511 512 static int 513 dict_empty (struct dictionary *dict) 514 { 515 struct dict_iterator iter; 516 517 return (dict_iterator_first (dict, &iter) == NULL); 518 } 519 520 521 /* The functions implementing the dictionary interface. */ 522 523 /* Generic functions, where appropriate. */ 524 525 static void 526 free_obstack (struct dictionary *dict) 527 { 528 /* Do nothing! */ 529 } 530 531 static void 532 add_symbol_nonexpandable (struct dictionary *dict, struct symbol *sym) 533 { 534 internal_error (__FILE__, __LINE__, 535 _("dict_add_symbol: non-expandable dictionary")); 536 } 537 538 /* Functions for DICT_HASHED and DICT_HASHED_EXPANDABLE. */ 539 540 static struct symbol * 541 iterator_first_hashed (const struct dictionary *dict, 542 struct dict_iterator *iterator) 543 { 544 DICT_ITERATOR_DICT (iterator) = dict; 545 DICT_ITERATOR_INDEX (iterator) = -1; 546 return iterator_hashed_advance (iterator); 547 } 548 549 static struct symbol * 550 iterator_next_hashed (struct dict_iterator *iterator) 551 { 552 struct symbol *next; 553 554 next = DICT_ITERATOR_CURRENT (iterator)->hash_next; 555 556 if (next == NULL) 557 return iterator_hashed_advance (iterator); 558 else 559 { 560 DICT_ITERATOR_CURRENT (iterator) = next; 561 return next; 562 } 563 } 564 565 static struct symbol * 566 iterator_hashed_advance (struct dict_iterator *iterator) 567 { 568 const struct dictionary *dict = DICT_ITERATOR_DICT (iterator); 569 int nbuckets = DICT_HASHED_NBUCKETS (dict); 570 int i; 571 572 for (i = DICT_ITERATOR_INDEX (iterator) + 1; i < nbuckets; ++i) 573 { 574 struct symbol *sym = DICT_HASHED_BUCKET (dict, i); 575 576 if (sym != NULL) 577 { 578 DICT_ITERATOR_INDEX (iterator) = i; 579 DICT_ITERATOR_CURRENT (iterator) = sym; 580 return sym; 581 } 582 } 583 584 return NULL; 585 } 586 587 static struct symbol * 588 iter_match_first_hashed (const struct dictionary *dict, 589 const lookup_name_info &name, 590 struct dict_iterator *iterator) 591 { 592 const language_defn *lang = DICT_LANGUAGE (dict); 593 unsigned int hash_index = (name.search_name_hash (lang->la_language) 594 % DICT_HASHED_NBUCKETS (dict)); 595 symbol_name_matcher_ftype *matches_name 596 = get_symbol_name_matcher (lang, name); 597 struct symbol *sym; 598 599 DICT_ITERATOR_DICT (iterator) = dict; 600 601 /* Loop through the symbols in the given bucket, breaking when SYM 602 first matches. If SYM never matches, it will be set to NULL; 603 either way, we have the right return value. */ 604 605 for (sym = DICT_HASHED_BUCKET (dict, hash_index); 606 sym != NULL; 607 sym = sym->hash_next) 608 { 609 /* Warning: the order of arguments to compare matters! */ 610 if (matches_name (SYMBOL_SEARCH_NAME (sym), name, NULL)) 611 break; 612 } 613 614 DICT_ITERATOR_CURRENT (iterator) = sym; 615 return sym; 616 } 617 618 static struct symbol * 619 iter_match_next_hashed (const lookup_name_info &name, 620 struct dict_iterator *iterator) 621 { 622 const language_defn *lang = DICT_LANGUAGE (DICT_ITERATOR_DICT (iterator)); 623 symbol_name_matcher_ftype *matches_name 624 = get_symbol_name_matcher (lang, name); 625 struct symbol *next; 626 627 for (next = DICT_ITERATOR_CURRENT (iterator)->hash_next; 628 next != NULL; 629 next = next->hash_next) 630 { 631 if (matches_name (SYMBOL_SEARCH_NAME (next), name, NULL)) 632 break; 633 } 634 635 DICT_ITERATOR_CURRENT (iterator) = next; 636 637 return next; 638 } 639 640 /* Insert SYM into DICT. */ 641 642 static void 643 insert_symbol_hashed (struct dictionary *dict, 644 struct symbol *sym) 645 { 646 unsigned int hash_index; 647 unsigned int hash; 648 struct symbol **buckets = DICT_HASHED_BUCKETS (dict); 649 650 /* We don't want to insert a symbol into a dictionary of a different 651 language. The two may not use the same hashing algorithm. */ 652 gdb_assert (SYMBOL_LANGUAGE (sym) == DICT_LANGUAGE (dict)->la_language); 653 654 hash = search_name_hash (SYMBOL_LANGUAGE (sym), SYMBOL_SEARCH_NAME (sym)); 655 hash_index = hash % DICT_HASHED_NBUCKETS (dict); 656 sym->hash_next = buckets[hash_index]; 657 buckets[hash_index] = sym; 658 } 659 660 static int 661 size_hashed (const struct dictionary *dict) 662 { 663 return DICT_HASHED_NBUCKETS (dict); 664 } 665 666 /* Functions only for DICT_HASHED_EXPANDABLE. */ 667 668 static void 669 free_hashed_expandable (struct dictionary *dict) 670 { 671 xfree (DICT_HASHED_BUCKETS (dict)); 672 xfree (dict); 673 } 674 675 static void 676 add_symbol_hashed_expandable (struct dictionary *dict, 677 struct symbol *sym) 678 { 679 int nsyms = ++DICT_HASHED_EXPANDABLE_NSYMS (dict); 680 681 if (DICT_HASHTABLE_SIZE (nsyms) > DICT_HASHED_NBUCKETS (dict)) 682 expand_hashtable (dict); 683 684 insert_symbol_hashed (dict, sym); 685 DICT_HASHED_EXPANDABLE_NSYMS (dict) = nsyms; 686 } 687 688 static int 689 size_hashed_expandable (const struct dictionary *dict) 690 { 691 return DICT_HASHED_EXPANDABLE_NSYMS (dict); 692 } 693 694 static void 695 expand_hashtable (struct dictionary *dict) 696 { 697 int old_nbuckets = DICT_HASHED_NBUCKETS (dict); 698 struct symbol **old_buckets = DICT_HASHED_BUCKETS (dict); 699 int new_nbuckets = 2 * old_nbuckets + 1; 700 struct symbol **new_buckets = XCNEWVEC (struct symbol *, new_nbuckets); 701 int i; 702 703 DICT_HASHED_NBUCKETS (dict) = new_nbuckets; 704 DICT_HASHED_BUCKETS (dict) = new_buckets; 705 706 for (i = 0; i < old_nbuckets; ++i) 707 { 708 struct symbol *sym, *next_sym; 709 710 sym = old_buckets[i]; 711 if (sym != NULL) 712 { 713 for (next_sym = sym->hash_next; 714 next_sym != NULL; 715 next_sym = sym->hash_next) 716 { 717 insert_symbol_hashed (dict, sym); 718 sym = next_sym; 719 } 720 721 insert_symbol_hashed (dict, sym); 722 } 723 } 724 725 xfree (old_buckets); 726 } 727 728 /* See dictionary.h. */ 729 730 unsigned int 731 default_search_name_hash (const char *string0) 732 { 733 /* The Ada-encoded version of a name P1.P2...Pn has either the form 734 P1__P2__...Pn<suffix> or _ada_P1__P2__...Pn<suffix> (where the Pi 735 are lower-cased identifiers). The <suffix> (which can be empty) 736 encodes additional information about the denoted entity. This 737 routine hashes such names to msymbol_hash_iw(Pn). It actually 738 does this for a superset of both valid Pi and of <suffix>, but 739 in other cases it simply returns msymbol_hash_iw(STRING0). */ 740 741 const char *string; 742 unsigned int hash; 743 744 string = string0; 745 if (*string == '_') 746 { 747 if (startswith (string, "_ada_")) 748 string += 5; 749 else 750 return msymbol_hash_iw (string0); 751 } 752 753 hash = 0; 754 while (*string) 755 { 756 switch (*string) 757 { 758 case '$': 759 case '.': 760 case 'X': 761 if (string0 == string) 762 return msymbol_hash_iw (string0); 763 else 764 return hash; 765 case ' ': 766 case '(': 767 return msymbol_hash_iw (string0); 768 case '_': 769 if (string[1] == '_' && string != string0) 770 { 771 int c = string[2]; 772 773 if ((c < 'a' || c > 'z') && c != 'O') 774 return hash; 775 hash = 0; 776 string += 2; 777 continue; 778 } 779 break; 780 case 'T': 781 /* Ignore "TKB" suffixes. 782 783 These are used by Ada for subprograms implementing a task body. 784 For instance for a task T inside package Pck, the name of the 785 subprogram implementing T's body is `pck__tTKB'. We need to 786 ignore the "TKB" suffix because searches for this task body 787 subprogram are going to be performed using `pck__t' (the encoded 788 version of the natural name `pck.t'). */ 789 if (strcmp (string, "TKB") == 0) 790 return hash; 791 break; 792 } 793 794 hash = SYMBOL_HASH_NEXT (hash, *string); 795 string += 1; 796 } 797 return hash; 798 } 799 800 /* Functions for DICT_LINEAR and DICT_LINEAR_EXPANDABLE. */ 801 802 static struct symbol * 803 iterator_first_linear (const struct dictionary *dict, 804 struct dict_iterator *iterator) 805 { 806 DICT_ITERATOR_DICT (iterator) = dict; 807 DICT_ITERATOR_INDEX (iterator) = 0; 808 return DICT_LINEAR_NSYMS (dict) ? DICT_LINEAR_SYM (dict, 0) : NULL; 809 } 810 811 static struct symbol * 812 iterator_next_linear (struct dict_iterator *iterator) 813 { 814 const struct dictionary *dict = DICT_ITERATOR_DICT (iterator); 815 816 if (++DICT_ITERATOR_INDEX (iterator) >= DICT_LINEAR_NSYMS (dict)) 817 return NULL; 818 else 819 return DICT_LINEAR_SYM (dict, DICT_ITERATOR_INDEX (iterator)); 820 } 821 822 static struct symbol * 823 iter_match_first_linear (const struct dictionary *dict, 824 const lookup_name_info &name, 825 struct dict_iterator *iterator) 826 { 827 DICT_ITERATOR_DICT (iterator) = dict; 828 DICT_ITERATOR_INDEX (iterator) = -1; 829 830 return iter_match_next_linear (name, iterator); 831 } 832 833 static struct symbol * 834 iter_match_next_linear (const lookup_name_info &name, 835 struct dict_iterator *iterator) 836 { 837 const struct dictionary *dict = DICT_ITERATOR_DICT (iterator); 838 const language_defn *lang = DICT_LANGUAGE (dict); 839 symbol_name_matcher_ftype *matches_name 840 = get_symbol_name_matcher (lang, name); 841 842 int i, nsyms = DICT_LINEAR_NSYMS (dict); 843 struct symbol *sym, *retval = NULL; 844 845 for (i = DICT_ITERATOR_INDEX (iterator) + 1; i < nsyms; ++i) 846 { 847 sym = DICT_LINEAR_SYM (dict, i); 848 849 if (matches_name (SYMBOL_SEARCH_NAME (sym), name, NULL)) 850 { 851 retval = sym; 852 break; 853 } 854 } 855 856 DICT_ITERATOR_INDEX (iterator) = i; 857 858 return retval; 859 } 860 861 static int 862 size_linear (const struct dictionary *dict) 863 { 864 return DICT_LINEAR_NSYMS (dict); 865 } 866 867 /* Functions only for DICT_LINEAR_EXPANDABLE. */ 868 869 static void 870 free_linear_expandable (struct dictionary *dict) 871 { 872 xfree (DICT_LINEAR_SYMS (dict)); 873 xfree (dict); 874 } 875 876 877 static void 878 add_symbol_linear_expandable (struct dictionary *dict, 879 struct symbol *sym) 880 { 881 int nsyms = ++DICT_LINEAR_NSYMS (dict); 882 883 /* Do we have enough room? If not, grow it. */ 884 if (nsyms > DICT_LINEAR_EXPANDABLE_CAPACITY (dict)) 885 { 886 DICT_LINEAR_EXPANDABLE_CAPACITY (dict) *= 2; 887 DICT_LINEAR_SYMS (dict) 888 = XRESIZEVEC (struct symbol *, DICT_LINEAR_SYMS (dict), 889 DICT_LINEAR_EXPANDABLE_CAPACITY (dict)); 890 } 891 892 DICT_LINEAR_SYM (dict, nsyms - 1) = sym; 893 } 894 895 /* Multi-language dictionary support. */ 896 897 /* The structure describing a multi-language dictionary. */ 898 899 struct multidictionary 900 { 901 /* An array of dictionaries, one per language. All dictionaries 902 must be of the same type. This should be free'd for expandable 903 dictionary types. */ 904 struct dictionary **dictionaries; 905 906 /* The number of language dictionaries currently allocated. 907 Only used for expandable dictionaries. */ 908 unsigned short n_allocated_dictionaries; 909 }; 910 911 /* A hasher for enum language. Injecting this into std is a convenience 912 when using unordered_map with C++11. */ 913 914 namespace std 915 { 916 template<> struct hash<enum language> 917 { 918 typedef enum language argument_type; 919 typedef std::size_t result_type; 920 921 result_type operator() (const argument_type &l) const noexcept 922 { 923 return static_cast<result_type> (l); 924 } 925 }; 926 } /* namespace std */ 927 928 /* A helper function to collate symbols on the pending list by language. */ 929 930 static std::unordered_map<enum language, std::vector<symbol *>> 931 collate_pending_symbols_by_language (const struct pending *symbol_list) 932 { 933 std::unordered_map<enum language, std::vector<symbol *>> nsyms; 934 935 for (const struct pending *list_counter = symbol_list; 936 list_counter != nullptr; list_counter = list_counter->next) 937 { 938 for (int i = list_counter->nsyms - 1; i >= 0; --i) 939 { 940 enum language language = SYMBOL_LANGUAGE (list_counter->symbol[i]); 941 nsyms[language].push_back (list_counter->symbol[i]); 942 } 943 } 944 945 return nsyms; 946 } 947 948 /* See dictionary.h. */ 949 950 struct multidictionary * 951 mdict_create_hashed (struct obstack *obstack, 952 const struct pending *symbol_list) 953 { 954 struct multidictionary *retval 955 = XOBNEW (obstack, struct multidictionary); 956 std::unordered_map<enum language, std::vector<symbol *>> nsyms 957 = collate_pending_symbols_by_language (symbol_list); 958 959 /* Loop over all languages and create/populate dictionaries. */ 960 retval->dictionaries 961 = XOBNEWVEC (obstack, struct dictionary *, nsyms.size ()); 962 retval->n_allocated_dictionaries = nsyms.size (); 963 964 int idx = 0; 965 for (const auto &pair : nsyms) 966 { 967 enum language language = pair.first; 968 std::vector<symbol *> symlist = pair.second; 969 970 retval->dictionaries[idx++] 971 = dict_create_hashed (obstack, language, symlist); 972 } 973 974 return retval; 975 } 976 977 /* See dictionary.h. */ 978 979 struct multidictionary * 980 mdict_create_hashed_expandable (enum language language) 981 { 982 struct multidictionary *retval = XNEW (struct multidictionary); 983 984 /* We have no symbol list to populate, but we create an empty 985 dictionary of the requested language to populate later. */ 986 retval->n_allocated_dictionaries = 1; 987 retval->dictionaries = XNEW (struct dictionary *); 988 retval->dictionaries[0] = dict_create_hashed_expandable (language); 989 990 return retval; 991 } 992 993 /* See dictionary.h. */ 994 995 struct multidictionary * 996 mdict_create_linear (struct obstack *obstack, 997 const struct pending *symbol_list) 998 { 999 struct multidictionary *retval 1000 = XOBNEW (obstack, struct multidictionary); 1001 std::unordered_map<enum language, std::vector<symbol *>> nsyms 1002 = collate_pending_symbols_by_language (symbol_list); 1003 1004 /* Loop over all languages and create/populate dictionaries. */ 1005 retval->dictionaries 1006 = XOBNEWVEC (obstack, struct dictionary *, nsyms.size ()); 1007 retval->n_allocated_dictionaries = nsyms.size (); 1008 1009 int idx = 0; 1010 for (const auto &pair : nsyms) 1011 { 1012 enum language language = pair.first; 1013 std::vector<symbol *> symlist = pair.second; 1014 1015 retval->dictionaries[idx++] 1016 = dict_create_linear (obstack, language, symlist); 1017 } 1018 1019 return retval; 1020 } 1021 1022 /* See dictionary.h. */ 1023 1024 struct multidictionary * 1025 mdict_create_linear_expandable (enum language language) 1026 { 1027 struct multidictionary *retval = XNEW (struct multidictionary); 1028 1029 /* We have no symbol list to populate, but we create an empty 1030 dictionary to populate later. */ 1031 retval->n_allocated_dictionaries = 1; 1032 retval->dictionaries = XNEW (struct dictionary *); 1033 retval->dictionaries[0] = dict_create_linear_expandable (language); 1034 1035 return retval; 1036 } 1037 1038 /* See dictionary.h. */ 1039 1040 void 1041 mdict_free (struct multidictionary *mdict) 1042 { 1043 /* Grab the type of dictionary being used. */ 1044 enum dict_type type = mdict->dictionaries[0]->vector->type; 1045 1046 /* Loop over all dictionaries and free them. */ 1047 for (unsigned short idx = 0; idx < mdict->n_allocated_dictionaries; ++idx) 1048 dict_free (mdict->dictionaries[idx]); 1049 1050 /* Free the dictionary list, if needed. */ 1051 switch (type) 1052 { 1053 case DICT_HASHED: 1054 case DICT_LINEAR: 1055 /* Memory was allocated on an obstack when created. */ 1056 break; 1057 1058 case DICT_HASHED_EXPANDABLE: 1059 case DICT_LINEAR_EXPANDABLE: 1060 xfree (mdict->dictionaries); 1061 break; 1062 } 1063 } 1064 1065 /* Helper function to find the dictionary associated with LANGUAGE 1066 or NULL if there is no dictionary of that language. */ 1067 1068 static struct dictionary * 1069 find_language_dictionary (const struct multidictionary *mdict, 1070 enum language language) 1071 { 1072 for (unsigned short idx = 0; idx < mdict->n_allocated_dictionaries; ++idx) 1073 { 1074 if (DICT_LANGUAGE (mdict->dictionaries[idx])->la_language == language) 1075 return mdict->dictionaries[idx]; 1076 } 1077 1078 return nullptr; 1079 } 1080 1081 /* Create a new language dictionary for LANGUAGE and add it to the 1082 multidictionary MDICT's list of dictionaries. If MDICT is not 1083 based on expandable dictionaries, this function throws an 1084 internal error. */ 1085 1086 static struct dictionary * 1087 create_new_language_dictionary (struct multidictionary *mdict, 1088 enum language language) 1089 { 1090 struct dictionary *retval = nullptr; 1091 1092 /* We use the first dictionary entry to decide what create function 1093 to call. Not optimal but sufficient. */ 1094 gdb_assert (mdict->dictionaries[0] != nullptr); 1095 switch (mdict->dictionaries[0]->vector->type) 1096 { 1097 case DICT_HASHED: 1098 case DICT_LINEAR: 1099 internal_error (__FILE__, __LINE__, 1100 _("create_new_language_dictionary: attempted to expand " 1101 "non-expandable multidictionary")); 1102 1103 case DICT_HASHED_EXPANDABLE: 1104 retval = dict_create_hashed_expandable (language); 1105 break; 1106 1107 case DICT_LINEAR_EXPANDABLE: 1108 retval = dict_create_linear_expandable (language); 1109 break; 1110 } 1111 1112 /* Grow the dictionary vector and save the new dictionary. */ 1113 mdict->dictionaries 1114 = (struct dictionary **) xrealloc (mdict->dictionaries, 1115 (++mdict->n_allocated_dictionaries 1116 * sizeof (struct dictionary *))); 1117 mdict->dictionaries[mdict->n_allocated_dictionaries - 1] = retval; 1118 1119 return retval; 1120 } 1121 1122 /* See dictionary.h. */ 1123 1124 void 1125 mdict_add_symbol (struct multidictionary *mdict, struct symbol *sym) 1126 { 1127 struct dictionary *dict 1128 = find_language_dictionary (mdict, SYMBOL_LANGUAGE (sym)); 1129 1130 if (dict == nullptr) 1131 { 1132 /* SYM is of a new language that we haven't previously seen. 1133 Create a new dictionary for it. */ 1134 dict = create_new_language_dictionary (mdict, SYMBOL_LANGUAGE (sym)); 1135 } 1136 1137 dict_add_symbol (dict, sym); 1138 } 1139 1140 /* See dictionary.h. */ 1141 1142 void 1143 mdict_add_pending (struct multidictionary *mdict, 1144 const struct pending *symbol_list) 1145 { 1146 std::unordered_map<enum language, std::vector<symbol *>> nsyms 1147 = collate_pending_symbols_by_language (symbol_list); 1148 1149 for (const auto &pair : nsyms) 1150 { 1151 enum language language = pair.first; 1152 std::vector<symbol *> symlist = pair.second; 1153 struct dictionary *dict = find_language_dictionary (mdict, language); 1154 1155 if (dict == nullptr) 1156 { 1157 /* The language was not previously seen. Create a new dictionary 1158 for it. */ 1159 dict = create_new_language_dictionary (mdict, language); 1160 } 1161 1162 dict_add_pending (dict, symlist); 1163 } 1164 } 1165 1166 /* See dictionary.h. */ 1167 1168 struct symbol * 1169 mdict_iterator_first (const multidictionary *mdict, 1170 struct mdict_iterator *miterator) 1171 { 1172 miterator->mdict = mdict; 1173 miterator->current_idx = 0; 1174 1175 for (unsigned short idx = miterator->current_idx; 1176 idx < mdict->n_allocated_dictionaries; ++idx) 1177 { 1178 struct symbol *result 1179 = dict_iterator_first (mdict->dictionaries[idx], &miterator->iterator); 1180 1181 if (result != nullptr) 1182 { 1183 miterator->current_idx = idx; 1184 return result; 1185 } 1186 } 1187 1188 return nullptr; 1189 } 1190 1191 /* See dictionary.h. */ 1192 1193 struct symbol * 1194 mdict_iterator_next (struct mdict_iterator *miterator) 1195 { 1196 struct symbol *result = dict_iterator_next (&miterator->iterator); 1197 1198 if (result != nullptr) 1199 return result; 1200 1201 /* The current dictionary had no matches -- move to the next 1202 dictionary, if any. */ 1203 for (unsigned short idx = ++miterator->current_idx; 1204 idx < miterator->mdict->n_allocated_dictionaries; ++idx) 1205 { 1206 result 1207 = dict_iterator_first (miterator->mdict->dictionaries[idx], 1208 &miterator->iterator); 1209 if (result != nullptr) 1210 { 1211 miterator->current_idx = idx; 1212 return result; 1213 } 1214 } 1215 1216 return nullptr; 1217 } 1218 1219 /* See dictionary.h. */ 1220 1221 struct symbol * 1222 mdict_iter_match_first (const struct multidictionary *mdict, 1223 const lookup_name_info &name, 1224 struct mdict_iterator *miterator) 1225 { 1226 miterator->mdict = mdict; 1227 miterator->current_idx = 0; 1228 1229 for (unsigned short idx = miterator->current_idx; 1230 idx < mdict->n_allocated_dictionaries; ++idx) 1231 { 1232 struct symbol *result 1233 = dict_iter_match_first (mdict->dictionaries[idx], name, 1234 &miterator->iterator); 1235 1236 if (result != nullptr) 1237 return result; 1238 } 1239 1240 return nullptr; 1241 } 1242 1243 /* See dictionary.h. */ 1244 1245 struct symbol * 1246 mdict_iter_match_next (const lookup_name_info &name, 1247 struct mdict_iterator *miterator) 1248 { 1249 /* Search the current dictionary. */ 1250 struct symbol *result = dict_iter_match_next (name, &miterator->iterator); 1251 1252 if (result != nullptr) 1253 return result; 1254 1255 /* The current dictionary had no matches -- move to the next 1256 dictionary, if any. */ 1257 for (unsigned short idx = ++miterator->current_idx; 1258 idx < miterator->mdict->n_allocated_dictionaries; ++idx) 1259 { 1260 result 1261 = dict_iter_match_first (miterator->mdict->dictionaries[idx], 1262 name, &miterator->iterator); 1263 if (result != nullptr) 1264 { 1265 miterator->current_idx = idx; 1266 return result; 1267 } 1268 } 1269 1270 return nullptr; 1271 } 1272 1273 /* See dictionary.h. */ 1274 1275 int 1276 mdict_size (const struct multidictionary *mdict) 1277 { 1278 int size = 0; 1279 1280 for (unsigned short idx = 0; idx < mdict->n_allocated_dictionaries; ++idx) 1281 size += dict_size (mdict->dictionaries[idx]); 1282 1283 return size; 1284 } 1285 1286 /* See dictionary.h. */ 1287 1288 bool 1289 mdict_empty (const struct multidictionary *mdict) 1290 { 1291 for (unsigned short idx = 0; idx < mdict->n_allocated_dictionaries; ++idx) 1292 { 1293 if (!dict_empty (mdict->dictionaries[idx])) 1294 return false; 1295 } 1296 1297 return true; 1298 } 1299