diff options
Diffstat (limited to 'bfd')
-rw-r--r-- | bfd/ChangeLog | 6 | ||||
-rw-r--r-- | bfd/hash.c | 25 |
2 files changed, 18 insertions, 13 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 5d3bb56..ef077c4 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,9 @@ +2020-08-14 Alan Modra <amodra@gmail.com> + + * hash.c (bfd_hash_set_default_size): Use higher_prime_number + rather than another copy of primes. Increase maximum default + size allowed. + 2020-08-13 Alan Modra <amodra@gmail.com> * config.bfd: Obsolete arm*-*-symbianelf*, and ia64*-*-*. @@ -664,19 +664,18 @@ bfd_hash_traverse (struct bfd_hash_table *table, unsigned long bfd_hash_set_default_size (unsigned long hash_size) { - /* Extend this prime list if you want more granularity of hash table size. */ - static const unsigned long hash_size_primes[] = - { - 31, 61, 127, 251, 509, 1021, 2039, 4091, 8191, 16381, 32749, 65537 - }; - unsigned int _index; - - /* Work out best prime number near the hash_size. */ - for (_index = 0; _index < ARRAY_SIZE (hash_size_primes) - 1; ++_index) - if (hash_size <= hash_size_primes[_index]) - break; - - bfd_default_hash_table_size = hash_size_primes[_index]; + /* These silly_size values result in around 1G and 32M of memory + being allocated for the table of pointers. Note that the number + of elements allocated will be almost twice the size of any power + of two chosen here. */ + unsigned long silly_size = sizeof (size_t) > 4 ? 0x4000000 : 0x400000; + if (hash_size > silly_size) + hash_size = silly_size; + else if (hash_size != 0) + hash_size--; + hash_size = higher_prime_number (hash_size); + BFD_ASSERT (hash_size != 0); + bfd_default_hash_table_size = hash_size; return bfd_default_hash_table_size; } |