1 /* hash.c -- hash table routines for BFD 2 Copyright (C) 1993-2025 Free Software Foundation, Inc. 3 Written by Steve Chamberlain <sac (at) cygnus.com> 4 5 This file is part of BFD, the Binary File Descriptor library. 6 7 This program is free software; you can redistribute it and/or modify 8 it under the terms of the GNU General Public License as published by 9 the Free Software Foundation; either version 3 of the License, or 10 (at your option) any later version. 11 12 This program is distributed in the hope that it will be useful, 13 but WITHOUT ANY WARRANTY; without even the implied warranty of 14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 GNU General Public License for more details. 16 17 You should have received a copy of the GNU General Public License 18 along with this program; if not, write to the Free Software 19 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, 20 MA 02110-1301, USA. */ 21 22 #include "sysdep.h" 23 #include "bfd.h" 24 #include "libbfd.h" 25 #include "objalloc.h" 26 #include "libiberty.h" 27 28 /* 29 SECTION 30 Hash Tables 31 32 @cindex Hash tables 33 BFD provides a simple set of hash table functions. Routines 34 are provided to initialize a hash table, to free a hash table, 35 to look up a string in a hash table and optionally create an 36 entry for it, and to traverse a hash table. There is 37 currently no routine to delete an string from a hash table. 38 39 The basic hash table does not permit any data to be stored 40 with a string. However, a hash table is designed to present a 41 base class from which other types of hash tables may be 42 derived. These derived types may store additional information 43 with the string. Hash tables were implemented in this way, 44 rather than simply providing a data pointer in a hash table 45 entry, because they were designed for use by the linker back 46 ends. The linker may create thousands of hash table entries, 47 and the overhead of allocating private data and storing and 48 following pointers becomes noticeable. 49 50 The basic hash table code is in <<hash.c>>. 51 52 @menu 53 @* Creating and Freeing a Hash Table:: 54 @* Looking Up or Entering a String:: 55 @* Traversing a Hash Table:: 56 @* Deriving a New Hash Table Type:: 57 @end menu 58 59 INODE 60 Creating and Freeing a Hash Table, Looking Up or Entering a String, Hash Tables, Hash Tables 61 SUBSECTION 62 Creating and freeing a hash table 63 64 @findex bfd_hash_table_init 65 @findex bfd_hash_table_init_n 66 To create a hash table, create an instance of a <<struct 67 bfd_hash_table>> (defined in <<bfd.h>>) and call 68 <<bfd_hash_table_init>> (if you know approximately how many 69 entries you will need, the function <<bfd_hash_table_init_n>>, 70 which takes a @var{size} argument, may be used). 71 <<bfd_hash_table_init>> returns <<FALSE>> if some sort of 72 error occurs. 73 74 @findex bfd_hash_newfunc 75 The function <<bfd_hash_table_init>> take as an argument a 76 function to use to create new entries. For a basic hash 77 table, use the function <<bfd_hash_newfunc>>. @xref{Deriving 78 a New Hash Table Type}, for why you would want to use a 79 different value for this argument. 80 81 @findex bfd_hash_allocate 82 <<bfd_hash_table_init>> will create an objalloc which will be 83 used to allocate new entries. You may allocate memory on this 84 objalloc using <<bfd_hash_allocate>>. 85 86 @findex bfd_hash_table_free 87 Use <<bfd_hash_table_free>> to free up all the memory that has 88 been allocated for a hash table. This will not free up the 89 <<struct bfd_hash_table>> itself, which you must provide. 90 91 @findex bfd_hash_set_default_size 92 Use <<bfd_hash_set_default_size>> to set the default size of 93 hash table to use. 94 95 INODE 96 Looking Up or Entering a String, Traversing a Hash Table, Creating and Freeing a Hash Table, Hash Tables 97 SUBSECTION 98 Looking up or entering a string 99 100 @findex bfd_hash_lookup 101 The function <<bfd_hash_lookup>> is used both to look up a 102 string in the hash table and to create a new entry. 103 104 If the @var{create} argument is <<FALSE>>, <<bfd_hash_lookup>> 105 will look up a string. If the string is found, it will 106 returns a pointer to a <<struct bfd_hash_entry>>. If the 107 string is not found in the table <<bfd_hash_lookup>> will 108 return <<NULL>>. You should not modify any of the fields in 109 the returns <<struct bfd_hash_entry>>. 110 111 If the @var{create} argument is <<TRUE>>, the string will be 112 entered into the hash table if it is not already there. 113 Either way a pointer to a <<struct bfd_hash_entry>> will be 114 returned, either to the existing structure or to a newly 115 created one. In this case, a <<NULL>> return means that an 116 error occurred. 117 118 If the @var{create} argument is <<TRUE>>, and a new entry is 119 created, the @var{copy} argument is used to decide whether to 120 copy the string onto the hash table objalloc or not. If 121 @var{copy} is passed as <<FALSE>>, you must be careful not to 122 deallocate or modify the string as long as the hash table 123 exists. 124 125 INODE 126 Traversing a Hash Table, Deriving a New Hash Table Type, Looking Up or Entering a String, Hash Tables 127 SUBSECTION 128 Traversing a hash table 129 130 @findex bfd_hash_traverse 131 The function <<bfd_hash_traverse>> may be used to traverse a 132 hash table, calling a function on each element. The traversal 133 is done in a random order. 134 135 <<bfd_hash_traverse>> takes as arguments a function and a 136 generic <<void *>> pointer. The function is called with a 137 hash table entry (a <<struct bfd_hash_entry *>>) and the 138 generic pointer passed to <<bfd_hash_traverse>>. The function 139 must return a <<boolean>> value, which indicates whether to 140 continue traversing the hash table. If the function returns 141 <<FALSE>>, <<bfd_hash_traverse>> will stop the traversal and 142 return immediately. 143 144 INODE 145 Deriving a New Hash Table Type, , Traversing a Hash Table, Hash Tables 146 SUBSECTION 147 Deriving a new hash table type 148 149 Many uses of hash tables want to store additional information 150 which each entry in the hash table. Some also find it 151 convenient to store additional information with the hash table 152 itself. This may be done using a derived hash table. 153 154 Since C is not an object oriented language, creating a derived 155 hash table requires sticking together some boilerplate 156 routines with a few differences specific to the type of hash 157 table you want to create. 158 159 An example of a derived hash table is the linker hash table. 160 The structures for this are defined in <<bfdlink.h>>. The 161 functions are in <<linker.c>>. 162 163 You may also derive a hash table from an already derived hash 164 table. For example, the a.out linker backend code uses a hash 165 table derived from the linker hash table. 166 167 @menu 168 @* Define the Derived Structures:: 169 @* Write the Derived Creation Routine:: 170 @* Write Other Derived Routines:: 171 @end menu 172 173 INODE 174 Define the Derived Structures, Write the Derived Creation Routine, Deriving a New Hash Table Type, Deriving a New Hash Table Type 175 SUBSUBSECTION 176 Define the derived structures 177 178 You must define a structure for an entry in the hash table, 179 and a structure for the hash table itself. 180 181 The first field in the structure for an entry in the hash 182 table must be of the type used for an entry in the hash table 183 you are deriving from. If you are deriving from a basic hash 184 table this is <<struct bfd_hash_entry>>, which is defined in 185 <<bfd.h>>. The first field in the structure for the hash 186 table itself must be of the type of the hash table you are 187 deriving from itself. If you are deriving from a basic hash 188 table, this is <<struct bfd_hash_table>>. 189 190 For example, the linker hash table defines <<struct 191 bfd_link_hash_entry>> (in <<bfdlink.h>>). The first field, 192 <<root>>, is of type <<struct bfd_hash_entry>>. Similarly, 193 the first field in <<struct bfd_link_hash_table>>, <<table>>, 194 is of type <<struct bfd_hash_table>>. 195 196 INODE 197 Write the Derived Creation Routine, Write Other Derived Routines, Define the Derived Structures, Deriving a New Hash Table Type 198 SUBSUBSECTION 199 Write the derived creation routine 200 201 You must write a routine which will create and initialize an 202 entry in the hash table. This routine is passed as the 203 function argument to <<bfd_hash_table_init>>. 204 205 In order to permit other hash tables to be derived from the 206 hash table you are creating, this routine must be written in a 207 standard way. 208 209 The first argument to the creation routine is a pointer to a 210 hash table entry. This may be <<NULL>>, in which case the 211 routine should allocate the right amount of space. Otherwise 212 the space has already been allocated by a hash table type 213 derived from this one. 214 215 After allocating space, the creation routine must call the 216 creation routine of the hash table type it is derived from, 217 passing in a pointer to the space it just allocated. This 218 will initialize any fields used by the base hash table. 219 220 Finally the creation routine must initialize any local fields 221 for the new hash table type. 222 223 Here is a boilerplate example of a creation routine. 224 @var{function_name} is the name of the routine. 225 @var{entry_type} is the type of an entry in the hash table you 226 are creating. @var{base_newfunc} is the name of the creation 227 routine of the hash table type your hash table is derived 228 from. 229 230 EXAMPLE 231 232 .struct bfd_hash_entry * 233 .@var{function_name} (struct bfd_hash_entry *entry, 234 . struct bfd_hash_table *table, 235 . const char *string) 236 .{ 237 . struct @var{entry_type} *ret = (@var{entry_type} *) entry; 238 . 239 . {* Allocate the structure if it has not already been allocated by a 240 . derived class. *} 241 . if (ret == NULL) 242 . { 243 . ret = bfd_hash_allocate (table, sizeof (* ret)); 244 . if (ret == NULL) 245 . return NULL; 246 . } 247 . 248 . {* Call the allocation method of the base class. *} 249 . ret = ((@var{entry_type} *) 250 . @var{base_newfunc} ((struct bfd_hash_entry *) ret, table, string)); 251 . 252 . {* Initialize the local fields here. *} 253 . 254 . return (struct bfd_hash_entry *) ret; 255 .} 256 257 DESCRIPTION 258 The creation routine for the linker hash table, which is in 259 <<linker.c>>, looks just like this example. 260 @var{function_name} is <<_bfd_link_hash_newfunc>>. 261 @var{entry_type} is <<struct bfd_link_hash_entry>>. 262 @var{base_newfunc} is <<bfd_hash_newfunc>>, the creation 263 routine for a basic hash table. 264 265 <<_bfd_link_hash_newfunc>> also initializes the local fields 266 in a linker hash table entry: <<type>>, <<written>> and 267 <<next>>. 268 269 INODE 270 Write Other Derived Routines, , Write the Derived Creation Routine, Deriving a New Hash Table Type 271 SUBSUBSECTION 272 Write other derived routines 273 274 You will want to write other routines for your new hash table, 275 as well. 276 277 You will want an initialization routine which calls the 278 initialization routine of the hash table you are deriving from 279 and initializes any other local fields. For the linker hash 280 table, this is <<_bfd_link_hash_table_init>> in <<linker.c>>. 281 282 You will want a lookup routine which calls the lookup routine 283 of the hash table you are deriving from and casts the result. 284 The linker hash table uses <<bfd_link_hash_lookup>> in 285 <<linker.c>> (this actually takes an additional argument which 286 it uses to decide how to return the looked up value). 287 288 You may want a traversal routine. This should just call the 289 traversal routine of the hash table you are deriving from with 290 appropriate casts. The linker hash table uses 291 <<bfd_link_hash_traverse>> in <<linker.c>>. 292 293 These routines may simply be defined as macros. For example, 294 the a.out backend linker hash table, which is derived from the 295 linker hash table, uses macros for the lookup and traversal 296 routines. These are <<aout_link_hash_lookup>> and 297 <<aout_link_hash_traverse>> in aoutx.h. 298 299 EXTERNAL 300 .{* An element in the hash table. Most uses will actually use a larger 301 . structure, and an instance of this will be the first field. *} 302 . 303 .struct bfd_hash_entry 304 .{ 305 . {* Next entry for this hash code. *} 306 . struct bfd_hash_entry *next; 307 . {* String being hashed. *} 308 . const char *string; 309 . {* Hash code. This is the full hash code, not the index into the 310 . table. *} 311 . unsigned long hash; 312 .}; 313 . 314 .{* A hash table. *} 315 . 316 .struct bfd_hash_table 317 .{ 318 . {* The hash array. *} 319 . struct bfd_hash_entry **table; 320 . {* A function used to create new elements in the hash table. The 321 . first entry is itself a pointer to an element. When this 322 . function is first invoked, this pointer will be NULL. However, 323 . having the pointer permits a hierarchy of method functions to be 324 . built each of which calls the function in the superclass. Thus 325 . each function should be written to allocate a new block of memory 326 . only if the argument is NULL. *} 327 . struct bfd_hash_entry *(*newfunc) 328 . (struct bfd_hash_entry *, struct bfd_hash_table *, const char *); 329 . {* An objalloc for this hash table. This is a struct objalloc *, 330 . but we use void * to avoid requiring the inclusion of objalloc.h. *} 331 . void *memory; 332 . {* The number of slots in the hash table. *} 333 . unsigned int size; 334 . {* The number of entries in the hash table. *} 335 . unsigned int count; 336 . {* The size of elements. *} 337 . unsigned int entsize; 338 . {* If non-zero, don't grow the hash table. *} 339 . unsigned int frozen:1; 340 .}; 341 . 342 */ 343 344 /* The default number of entries to use when creating a hash table. */ 345 #define DEFAULT_SIZE 4051 346 347 /* The following function returns a nearest prime number which is 348 greater than N, and near a power of two. Copied from libiberty. 349 Returns zero for ridiculously large N to signify an error. */ 350 351 static uint32_t 352 higher_prime_number (uint32_t n) 353 { 354 /* These are primes that are near, but slightly smaller than, a 355 power of two. */ 356 static const uint32_t primes[] = 357 { 358 UINT32_C (31), 359 UINT32_C (61), 360 UINT32_C (127), 361 UINT32_C (251), 362 UINT32_C (509), 363 UINT32_C (1021), 364 UINT32_C (2039), 365 UINT32_C (4093), 366 UINT32_C (8191), 367 UINT32_C (16381), 368 UINT32_C (32749), 369 UINT32_C (65521), 370 UINT32_C (131071), 371 UINT32_C (262139), 372 UINT32_C (524287), 373 UINT32_C (1048573), 374 UINT32_C (2097143), 375 UINT32_C (4194301), 376 UINT32_C (8388593), 377 UINT32_C (16777213), 378 UINT32_C (33554393), 379 UINT32_C (67108859), 380 UINT32_C (134217689), 381 UINT32_C (268435399), 382 UINT32_C (536870909), 383 UINT32_C (1073741789), 384 UINT32_C (2147483647), 385 UINT32_C (4294967291) 386 }; 387 388 const uint32_t *low = &primes[0]; 389 const uint32_t *high = &primes[sizeof (primes) / sizeof (primes[0])]; 390 391 while (low != high) 392 { 393 const uint32_t *mid = low + (high - low) / 2; 394 if (n >= *mid) 395 low = mid + 1; 396 else 397 high = mid; 398 } 399 400 if (n >= *low) 401 return 0; 402 403 return *low; 404 } 405 406 static unsigned int bfd_default_hash_table_size = DEFAULT_SIZE; 407 408 /* 409 FUNCTION 410 bfd_hash_table_init_n 411 412 SYNOPSIS 413 bool bfd_hash_table_init_n 414 (struct bfd_hash_table *, 415 struct bfd_hash_entry *(* {*newfunc*}) 416 (struct bfd_hash_entry *, struct bfd_hash_table *, const char *), 417 unsigned int {*entsize*}, unsigned int {*size*}); 418 419 DESCRIPTION 420 Create a new hash table, given a number of entries. 421 */ 422 423 bool 424 bfd_hash_table_init_n (struct bfd_hash_table *table, 425 struct bfd_hash_entry *(*newfunc) (struct bfd_hash_entry *, 426 struct bfd_hash_table *, 427 const char *), 428 unsigned int entsize, 429 unsigned int size) 430 { 431 unsigned long alloc; 432 433 alloc = size; 434 alloc *= sizeof (struct bfd_hash_entry *); 435 if (alloc / sizeof (struct bfd_hash_entry *) != size) 436 { 437 bfd_set_error (bfd_error_no_memory); 438 return false; 439 } 440 441 table->memory = (void *) objalloc_create (); 442 if (table->memory == NULL) 443 { 444 bfd_set_error (bfd_error_no_memory); 445 return false; 446 } 447 table->table = (struct bfd_hash_entry **) 448 objalloc_alloc ((struct objalloc *) table->memory, alloc); 449 if (table->table == NULL) 450 { 451 bfd_hash_table_free (table); 452 bfd_set_error (bfd_error_no_memory); 453 return false; 454 } 455 memset ((void *) table->table, 0, alloc); 456 table->size = size; 457 table->entsize = entsize; 458 table->count = 0; 459 table->frozen = 0; 460 table->newfunc = newfunc; 461 return true; 462 } 463 464 /* 465 FUNCTION 466 bfd_hash_table_init 467 468 SYNOPSIS 469 bool bfd_hash_table_init 470 (struct bfd_hash_table *, 471 struct bfd_hash_entry *(* {*newfunc*}) 472 (struct bfd_hash_entry *, struct bfd_hash_table *, const char *), 473 unsigned int {*entsize*}); 474 475 DESCRIPTION 476 Create a new hash table with the default number of entries. 477 */ 478 479 bool 480 bfd_hash_table_init (struct bfd_hash_table *table, 481 struct bfd_hash_entry *(*newfunc) (struct bfd_hash_entry *, 482 struct bfd_hash_table *, 483 const char *), 484 unsigned int entsize) 485 { 486 return bfd_hash_table_init_n (table, newfunc, entsize, 487 bfd_default_hash_table_size); 488 } 489 490 /* 491 FUNCTION 492 bfd_hash_table_free 493 494 SYNOPSIS 495 void bfd_hash_table_free (struct bfd_hash_table *); 496 497 DESCRIPTION 498 Free a hash table. 499 */ 500 501 void 502 bfd_hash_table_free (struct bfd_hash_table *table) 503 { 504 objalloc_free ((struct objalloc *) table->memory); 505 table->memory = NULL; 506 } 507 508 static inline unsigned long 509 bfd_hash_hash (const char *string, unsigned int *lenp) 510 { 511 const unsigned char *s; 512 unsigned long hash; 513 unsigned int len; 514 unsigned int c; 515 516 BFD_ASSERT (string != NULL); 517 hash = 0; 518 len = 0; 519 s = (const unsigned char *) string; 520 while ((c = *s++) != '\0') 521 { 522 hash += c + (c << 17); 523 hash ^= hash >> 2; 524 } 525 len = (s - (const unsigned char *) string) - 1; 526 hash += len + (len << 17); 527 hash ^= hash >> 2; 528 if (lenp != NULL) 529 *lenp = len; 530 return hash; 531 } 532 533 /* 534 FUNCTION 535 bfd_hash_lookup 536 537 SYNOPSIS 538 struct bfd_hash_entry *bfd_hash_lookup 539 (struct bfd_hash_table *, const char *, 540 bool {*create*}, bool {*copy*}); 541 542 DESCRIPTION 543 Look up a string in a hash table. 544 */ 545 546 struct bfd_hash_entry * 547 bfd_hash_lookup (struct bfd_hash_table *table, 548 const char *string, 549 bool create, 550 bool copy) 551 { 552 unsigned long hash; 553 struct bfd_hash_entry *hashp; 554 unsigned int len; 555 unsigned int _index; 556 557 hash = bfd_hash_hash (string, &len); 558 _index = hash % table->size; 559 for (hashp = table->table[_index]; 560 hashp != NULL; 561 hashp = hashp->next) 562 { 563 if (hashp->hash == hash 564 && strcmp (hashp->string, string) == 0) 565 return hashp; 566 } 567 568 if (! create) 569 return NULL; 570 571 if (copy) 572 { 573 char *new_string; 574 575 new_string = (char *) objalloc_alloc ((struct objalloc *) table->memory, 576 len + 1); 577 if (!new_string) 578 { 579 bfd_set_error (bfd_error_no_memory); 580 return NULL; 581 } 582 memcpy (new_string, string, len + 1); 583 string = new_string; 584 } 585 586 return bfd_hash_insert (table, string, hash); 587 } 588 589 /* 590 FUNCTION 591 bfd_hash_insert 592 593 SYNOPSIS 594 struct bfd_hash_entry *bfd_hash_insert 595 (struct bfd_hash_table *, 596 const char *, 597 unsigned long {*hash*}); 598 599 DESCRIPTION 600 Insert an entry in a hash table. 601 */ 602 603 struct bfd_hash_entry * 604 bfd_hash_insert (struct bfd_hash_table *table, 605 const char *string, 606 unsigned long hash) 607 { 608 struct bfd_hash_entry *hashp; 609 unsigned int _index; 610 611 hashp = (*table->newfunc) (NULL, table, string); 612 if (hashp == NULL) 613 return NULL; 614 hashp->string = string; 615 hashp->hash = hash; 616 _index = hash % table->size; 617 hashp->next = table->table[_index]; 618 table->table[_index] = hashp; 619 table->count++; 620 621 if (!table->frozen && table->count > table->size * 3 / 4) 622 { 623 unsigned long newsize = higher_prime_number (table->size); 624 struct bfd_hash_entry **newtable; 625 unsigned int hi; 626 unsigned long alloc = newsize * sizeof (struct bfd_hash_entry *); 627 628 /* If we can't find a higher prime, or we can't possibly alloc 629 that much memory, don't try to grow the table. */ 630 if (newsize == 0 || alloc / sizeof (struct bfd_hash_entry *) != newsize) 631 { 632 table->frozen = 1; 633 return hashp; 634 } 635 636 newtable = ((struct bfd_hash_entry **) 637 objalloc_alloc ((struct objalloc *) table->memory, alloc)); 638 if (newtable == NULL) 639 { 640 table->frozen = 1; 641 return hashp; 642 } 643 memset (newtable, 0, alloc); 644 645 for (hi = 0; hi < table->size; hi ++) 646 while (table->table[hi]) 647 { 648 struct bfd_hash_entry *chain = table->table[hi]; 649 struct bfd_hash_entry *chain_end = chain; 650 651 while (chain_end->next && chain_end->next->hash == chain->hash) 652 chain_end = chain_end->next; 653 654 table->table[hi] = chain_end->next; 655 _index = chain->hash % newsize; 656 chain_end->next = newtable[_index]; 657 newtable[_index] = chain; 658 } 659 table->table = newtable; 660 table->size = newsize; 661 } 662 663 return hashp; 664 } 665 666 /* 667 FUNCTION 668 bfd_hash_rename 669 670 SYNOPSIS 671 void bfd_hash_rename (struct bfd_hash_table *, 672 const char *, 673 struct bfd_hash_entry *); 674 675 DESCRIPTION 676 Rename an entry in a hash table. 677 */ 678 679 void 680 bfd_hash_rename (struct bfd_hash_table *table, 681 const char *string, 682 struct bfd_hash_entry *ent) 683 { 684 unsigned int _index; 685 struct bfd_hash_entry **pph; 686 687 _index = ent->hash % table->size; 688 for (pph = &table->table[_index]; *pph != NULL; pph = &(*pph)->next) 689 if (*pph == ent) 690 break; 691 if (*pph == NULL) 692 abort (); 693 694 *pph = ent->next; 695 ent->string = string; 696 ent->hash = bfd_hash_hash (string, NULL); 697 _index = ent->hash % table->size; 698 ent->next = table->table[_index]; 699 table->table[_index] = ent; 700 } 701 702 /* 703 FUNCTION 704 bfd_hash_replace 705 706 SYNOPSIS 707 void bfd_hash_replace (struct bfd_hash_table *, 708 struct bfd_hash_entry * {*old*}, 709 struct bfd_hash_entry * {*new*}); 710 711 DESCRIPTION 712 Replace an entry in a hash table. 713 */ 714 715 void 716 bfd_hash_replace (struct bfd_hash_table *table, 717 struct bfd_hash_entry *old, 718 struct bfd_hash_entry *nw) 719 { 720 unsigned int _index; 721 struct bfd_hash_entry **pph; 722 723 _index = old->hash % table->size; 724 for (pph = &table->table[_index]; 725 (*pph) != NULL; 726 pph = &(*pph)->next) 727 { 728 if (*pph == old) 729 { 730 *pph = nw; 731 return; 732 } 733 } 734 735 abort (); 736 } 737 738 /* 739 FUNCTION 740 bfd_hash_allocate 741 742 SYNOPSIS 743 void *bfd_hash_allocate (struct bfd_hash_table *, 744 unsigned int {*size*}); 745 746 DESCRIPTION 747 Allocate space in a hash table. 748 */ 749 750 void * 751 bfd_hash_allocate (struct bfd_hash_table *table, 752 unsigned int size) 753 { 754 void * ret; 755 756 ret = objalloc_alloc ((struct objalloc *) table->memory, size); 757 if (ret == NULL && size != 0) 758 bfd_set_error (bfd_error_no_memory); 759 return ret; 760 } 761 762 /* 763 FUNCTION 764 bfd_hash_newfunc 765 766 SYNOPSIS 767 struct bfd_hash_entry *bfd_hash_newfunc 768 (struct bfd_hash_entry *, 769 struct bfd_hash_table *, 770 const char *); 771 772 DESCRIPTION 773 Base method for creating a new hash table entry. 774 */ 775 776 struct bfd_hash_entry * 777 bfd_hash_newfunc (struct bfd_hash_entry *entry, 778 struct bfd_hash_table *table, 779 const char *string ATTRIBUTE_UNUSED) 780 { 781 if (entry == NULL) 782 entry = (struct bfd_hash_entry *) bfd_hash_allocate (table, 783 sizeof (* entry)); 784 return entry; 785 } 786 787 /* 788 FUNCTION 789 bfd_hash_traverse 790 791 SYNOPSIS 792 void bfd_hash_traverse 793 (struct bfd_hash_table *, 794 bool (*) (struct bfd_hash_entry *, void *), 795 void *); 796 797 DESCRIPTION 798 Traverse a hash table. 799 */ 800 801 void 802 bfd_hash_traverse (struct bfd_hash_table *table, 803 bool (*func) (struct bfd_hash_entry *, void *), 804 void *info) 805 { 806 unsigned int i; 807 808 table->frozen = 1; 809 for (i = 0; i < table->size; i++) 810 { 811 struct bfd_hash_entry *p; 812 813 for (p = table->table[i]; p != NULL; p = p->next) 814 if (! (*func) (p, info)) 815 goto out; 816 } 817 out: 818 table->frozen = 0; 819 } 820 821 /* 822 FUNCTION 823 bfd_hash_set_default_size 824 825 SYNOPSIS 826 unsigned int bfd_hash_set_default_size (unsigned int); 827 828 DESCRIPTION 829 Set hash table default size. 830 */ 831 832 unsigned int 833 bfd_hash_set_default_size (unsigned int hash_size) 834 { 835 /* These silly_size values result in around 1G and 32M of memory 836 being allocated for the table of pointers. Note that the number 837 of elements allocated will be almost twice the size of any power 838 of two chosen here. */ 839 unsigned int silly_size = sizeof (size_t) > 4 ? 0x4000000 : 0x400000; 840 if (hash_size > silly_size) 841 hash_size = silly_size; 842 else if (hash_size != 0) 843 hash_size--; 844 hash_size = higher_prime_number (hash_size); 845 BFD_ASSERT (hash_size != 0); 846 bfd_default_hash_table_size = hash_size; 847 return bfd_default_hash_table_size; 848 } 849 850 /* A few different object file formats (a.out, COFF, ELF) use a string 852 table. These functions support adding strings to a string table, 853 returning the byte offset, and writing out the table. 854 855 Possible improvements: 856 + look for strings matching trailing substrings of other strings 857 + better data structures? balanced trees? 858 + look at reducing memory use elsewhere -- maybe if we didn't have 859 to construct the entire symbol table at once, we could get by 860 with smaller amounts of VM? (What effect does that have on the 861 string table reductions?) */ 862 863 /* An entry in the strtab hash table. */ 864 865 struct strtab_hash_entry 866 { 867 struct bfd_hash_entry root; 868 /* Index in string table. */ 869 bfd_size_type index; 870 /* Next string in strtab. */ 871 struct strtab_hash_entry *next; 872 }; 873 874 /* The strtab hash table. */ 875 876 struct bfd_strtab_hash 877 { 878 struct bfd_hash_table table; 879 /* Size of strtab--also next available index. */ 880 bfd_size_type size; 881 /* First string in strtab. */ 882 struct strtab_hash_entry *first; 883 /* Last string in strtab. */ 884 struct strtab_hash_entry *last; 885 /* Whether to precede strings with a two or four byte length, 886 as in the XCOFF .debug section. */ 887 char length_field_size; 888 }; 889 890 891 /* Routine to create an entry in a strtab. */ 892 893 static struct bfd_hash_entry * 894 strtab_hash_newfunc (struct bfd_hash_entry *entry, 895 struct bfd_hash_table *table, 896 const char *string) 897 { 898 struct strtab_hash_entry *ret = (struct strtab_hash_entry *) entry; 899 900 /* Allocate the structure if it has not already been allocated by a 901 subclass. */ 902 if (ret == NULL) 903 ret = (struct strtab_hash_entry *) bfd_hash_allocate (table, 904 sizeof (* ret)); 905 if (ret == NULL) 906 return NULL; 907 908 /* Call the allocation method of the superclass. */ 909 ret = (struct strtab_hash_entry *) 910 bfd_hash_newfunc ((struct bfd_hash_entry *) ret, table, string); 911 912 if (ret) 913 { 914 /* Initialize the local fields. */ 915 ret->index = (bfd_size_type) -1; 916 ret->next = NULL; 917 } 918 919 return (struct bfd_hash_entry *) ret; 920 } 921 922 /* Look up an entry in an strtab. */ 923 924 #define strtab_hash_lookup(t, string, create, copy) \ 925 ((struct strtab_hash_entry *) \ 926 bfd_hash_lookup (&(t)->table, (string), (create), (copy))) 927 928 /* 929 INTERNAL_FUNCTION 930 _bfd_stringtab_init 931 932 SYNOPSIS 933 struct bfd_strtab_hash *_bfd_stringtab_init (void); 934 935 DESCRIPTION 936 Create a new strtab. 937 */ 938 939 struct bfd_strtab_hash * 940 _bfd_stringtab_init (void) 941 { 942 struct bfd_strtab_hash *table; 943 size_t amt = sizeof (* table); 944 945 table = (struct bfd_strtab_hash *) bfd_malloc (amt); 946 if (table == NULL) 947 return NULL; 948 949 if (!bfd_hash_table_init (&table->table, strtab_hash_newfunc, 950 sizeof (struct strtab_hash_entry))) 951 { 952 free (table); 953 return NULL; 954 } 955 956 table->size = 0; 957 table->first = NULL; 958 table->last = NULL; 959 table->length_field_size = 0; 960 961 return table; 962 } 963 964 /* 965 INTERNAL_FUNCTION 966 _bfd_xcoff_stringtab_init 967 968 SYNOPSIS 969 struct bfd_strtab_hash *_bfd_xcoff_stringtab_init 970 (bool {*isxcoff64*}); 971 972 DESCRIPTION 973 Create a new strtab in which the strings are output in the format 974 used in the XCOFF .debug section: a two byte length precedes each 975 string. 976 */ 977 978 struct bfd_strtab_hash * 979 _bfd_xcoff_stringtab_init (bool isxcoff64) 980 { 981 struct bfd_strtab_hash *ret; 982 983 ret = _bfd_stringtab_init (); 984 if (ret != NULL) 985 ret->length_field_size = isxcoff64 ? 4 : 2; 986 return ret; 987 } 988 989 /* 990 INTERNAL_FUNCTION 991 _bfd_stringtab_free 992 993 SYNOPSIS 994 void _bfd_stringtab_free (struct bfd_strtab_hash *); 995 996 DESCRIPTION 997 Free a strtab. 998 */ 999 1000 void 1001 _bfd_stringtab_free (struct bfd_strtab_hash *table) 1002 { 1003 bfd_hash_table_free (&table->table); 1004 free (table); 1005 } 1006 1007 /* 1008 INTERNAL_FUNCTION 1009 _bfd_stringtab_add 1010 1011 SYNOPSIS 1012 bfd_size_type _bfd_stringtab_add 1013 (struct bfd_strtab_hash *, const char *, 1014 bool {*hash*}, bool {*copy*}); 1015 1016 DESCRIPTION 1017 Get the index of a string in a strtab, adding it if it is not 1018 already present. If HASH is FALSE, we don't really use the hash 1019 table, and we don't eliminate duplicate strings. If COPY is true 1020 then store a copy of STR if creating a new entry. 1021 */ 1022 1023 bfd_size_type 1024 _bfd_stringtab_add (struct bfd_strtab_hash *tab, 1025 const char *str, 1026 bool hash, 1027 bool copy) 1028 { 1029 struct strtab_hash_entry *entry; 1030 1031 if (hash) 1032 { 1033 entry = strtab_hash_lookup (tab, str, true, copy); 1034 if (entry == NULL) 1035 return (bfd_size_type) -1; 1036 } 1037 else 1038 { 1039 entry = (struct strtab_hash_entry *) bfd_hash_allocate (&tab->table, 1040 sizeof (* entry)); 1041 if (entry == NULL) 1042 return (bfd_size_type) -1; 1043 if (! copy) 1044 entry->root.string = str; 1045 else 1046 { 1047 size_t len = strlen (str) + 1; 1048 char *n; 1049 1050 n = (char *) bfd_hash_allocate (&tab->table, len); 1051 if (n == NULL) 1052 return (bfd_size_type) -1; 1053 memcpy (n, str, len); 1054 entry->root.string = n; 1055 } 1056 entry->index = (bfd_size_type) -1; 1057 entry->next = NULL; 1058 } 1059 1060 if (entry->index == (bfd_size_type) -1) 1061 { 1062 entry->index = tab->size; 1063 tab->size += strlen (str) + 1; 1064 entry->index += tab->length_field_size; 1065 tab->size += tab->length_field_size; 1066 if (tab->first == NULL) 1067 tab->first = entry; 1068 else 1069 tab->last->next = entry; 1070 tab->last = entry; 1071 } 1072 1073 return entry->index; 1074 } 1075 1076 /* 1077 INTERNAL_FUNCTION 1078 _bfd_stringtab_size 1079 1080 SYNOPSIS 1081 bfd_size_type _bfd_stringtab_size (struct bfd_strtab_hash *); 1082 1083 DESCRIPTION 1084 Get the number of bytes in a strtab. 1085 */ 1086 1087 bfd_size_type 1088 _bfd_stringtab_size (struct bfd_strtab_hash *tab) 1089 { 1090 return tab->size; 1091 } 1092 1093 /* 1094 INTERNAL_FUNCTION 1095 _bfd_stringtab_emit 1096 1097 SYNOPSIS 1098 bool _bfd_stringtab_emit (bfd *, struct bfd_strtab_hash *); 1099 1100 DESCRIPTION 1101 Write out a strtab. ABFD must already be at the right location in 1102 the file. 1103 */ 1104 1105 bool 1106 _bfd_stringtab_emit (bfd *abfd, struct bfd_strtab_hash *tab) 1107 { 1108 struct strtab_hash_entry *entry; 1109 1110 for (entry = tab->first; entry != NULL; entry = entry->next) 1111 { 1112 const char *str; 1113 size_t len; 1114 1115 str = entry->root.string; 1116 len = strlen (str) + 1; 1117 1118 if (tab->length_field_size == 4) 1119 { 1120 bfd_byte buf[4]; 1121 1122 /* The output length includes the null byte. */ 1123 bfd_put_32 (abfd, len, buf); 1124 if (bfd_write (buf, 4, abfd) != 4) 1125 return false; 1126 } 1127 else if (tab->length_field_size == 2) 1128 { 1129 bfd_byte buf[2]; 1130 1131 /* The output length includes the null byte. */ 1132 bfd_put_16 (abfd, len, buf); 1133 if (bfd_write (buf, 2, abfd) != 2) 1134 return false; 1135 } 1136 1137 if (bfd_write (str, len, abfd) != len) 1138 return false; 1139 } 1140 1141 return true; 1142 } 1143