From 19bddbe95c156a4883213a57d4437b75318b6875 Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Fri, 14 Aug 2020 17:45:13 +0930 Subject: Allow larger bfd_default_hash_table_size * hash.c (bfd_hash_set_default_size): Use higher_prime_number rather than another copy of primes. Increase maximum default size allowed. --- bfd/hash.c | 25 ++++++++++++------------- 1 file changed, 12 insertions(+), 13 deletions(-) (limited to 'bfd/hash.c') diff --git a/bfd/hash.c b/bfd/hash.c index 56d18ac..ba6ff92 100644 --- a/bfd/hash.c +++ b/bfd/hash.c @@ -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; } -- cgit v1.1