* hash.c (bfd_default_hash_table_size): Make it an unsigned long.
	(bfd_hash_table_init_n): Overflow checking.
	(bfd_hash_set_default_size): Return current size.  Take unsigned long
	arg.  Add 65537 to hash_size primes.
	* bfd-in.h (bfd_hash_set_default_size): Update prototype.
	* bfd-in2.h: Regenerate.
gas/
	* hash.c (set_gas_hash_table_size): Use bfd_hash_set_default_size.
	(hash_new_sized): New function, split out from..
	(hash_new): ..here.
ld/
	* ld.h (ld_config_type <hash_table_size>): Make it an unsigned long.
This commit is contained in:
Alan Modra 2011-04-20 12:52:16 +00:00
parent 7bca32d788
commit 8ad17b3a2c
8 changed files with 48 additions and 40 deletions

View file

@ -1,3 +1,12 @@
2011-04-20 Alan Modra <amodra@gmail.com>
* hash.c (bfd_default_hash_table_size): Make it an unsigned long.
(bfd_hash_table_init_n): Overflow checking.
(bfd_hash_set_default_size): Return current size. Take unsigned long
arg. Add 65537 to hash_size primes.
* bfd-in.h (bfd_hash_set_default_size): Update prototype.
* bfd-in2.h: Regenerate.
2011-04-20 Jan Kratochvil <jan.kratochvil@redhat.com>
* elf-bfd.h (RELOC_AGAINST_DISCARDED_SECTION): Fix +1 overrun of

View file

@ -432,7 +432,7 @@ extern void bfd_hash_traverse
/* Allows the default size of a hash table to be configured. New hash
tables allocated using bfd_hash_table_init will be created with
this size. */
extern void bfd_hash_set_default_size (bfd_size_type);
extern unsigned long bfd_hash_set_default_size (unsigned long);
/* This structure is used to keep track of stabs in sections
information while linking. */

View file

@ -439,7 +439,7 @@ extern void bfd_hash_traverse
/* Allows the default size of a hash table to be configured. New hash
tables allocated using bfd_hash_table_init will be created with
this size. */
extern void bfd_hash_set_default_size (bfd_size_type);
extern unsigned long bfd_hash_set_default_size (unsigned long);
/* This structure is used to keep track of stabs in sections
information while linking. */

View file

@ -1,6 +1,6 @@
/* hash.c -- hash table routines for BFD
Copyright 1993, 1994, 1995, 1997, 1999, 2001, 2002, 2003, 2004, 2005,
2006, 2007, 2009, 2010 Free Software Foundation, Inc.
2006, 2007, 2009, 2010, 2011 Free Software Foundation, Inc.
Written by Steve Chamberlain <sac@cygnus.com>
This file is part of BFD, the Binary File Descriptor library.
@ -352,7 +352,7 @@ higher_prime_number (unsigned long n)
return *low;
}
static size_t bfd_default_hash_table_size = DEFAULT_SIZE;
static unsigned long bfd_default_hash_table_size = DEFAULT_SIZE;
/* Create a new hash table, given a number of entries. */
@ -364,9 +364,15 @@ bfd_hash_table_init_n (struct bfd_hash_table *table,
unsigned int entsize,
unsigned int size)
{
unsigned int alloc;
unsigned long alloc;
alloc = size * sizeof (struct bfd_hash_entry *);
alloc = size;
alloc *= sizeof (struct bfd_hash_entry *);
if (alloc / sizeof (struct bfd_hash_entry *) != size)
{
bfd_set_error (bfd_error_no_memory);
return FALSE;
}
table->memory = (void *) objalloc_create ();
if (table->memory == NULL)
@ -645,15 +651,15 @@ bfd_hash_traverse (struct bfd_hash_table *table,
table->frozen = 0;
}
void
bfd_hash_set_default_size (bfd_size_type hash_size)
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 bfd_size_type hash_size_primes[] =
static const unsigned long hash_size_primes[] =
{
251, 509, 1021, 2039, 4051, 8599, 16699, 32749
251, 509, 1021, 2039, 4051, 8599, 16699, 32749, 65537
};
size_t _index;
unsigned int _index;
/* Work out best prime number near the hash_size. */
for (_index = 0; _index < ARRAY_SIZE (hash_size_primes) - 1; ++_index)
@ -661,6 +667,7 @@ bfd_hash_set_default_size (bfd_size_type hash_size)
break;
bfd_default_hash_table_size = hash_size_primes[_index];
return bfd_default_hash_table_size;
}
/* A few different object file formats (a.out, COFF, ELF) use a string

View file

@ -1,3 +1,9 @@
2011-04-20 Alan Modra <amodra@gmail.com>
* hash.c (set_gas_hash_table_size): Use bfd_hash_set_default_size.
(hash_new_sized): New function, split out from..
(hash_new): ..here.
2011-04-19 Nick Clifton <nickc@redhat.com>
* config/tc-arm.c (v7m_psrs): Revert previous delta.

View file

@ -1,6 +1,6 @@
/* hash.c -- gas hash table code
Copyright 1987, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1998, 1999,
2000, 2001, 2002, 2003, 2005, 2007, 2008, 2009
2000, 2001, 2002, 2003, 2005, 2007, 2008, 2009, 2011
Free Software Foundation, Inc.
This file is part of GAS, the GNU Assembler.
@ -78,41 +78,17 @@ static unsigned long gas_hash_table_size = 65537;
void
set_gas_hash_table_size (unsigned long size)
{
gas_hash_table_size = size;
}
/* FIXME: This function should be amalgmated with bfd/hash.c:bfd_hash_set_default_size(). */
static unsigned long
get_gas_hash_table_size (void)
{
/* Extend this prime list if you want more granularity of hash table size. */
static const unsigned long hash_size_primes[] =
{
1021, 4051, 8599, 16699, 65537
};
unsigned int hindex;
/* Work out the best prime number near the hash_size.
FIXME: This could be a more sophisticated algorithm,
but is it really worth implementing it ? */
for (hindex = 0; hindex < ARRAY_SIZE (hash_size_primes) - 1; ++ hindex)
if (gas_hash_table_size <= hash_size_primes[hindex])
break;
return hash_size_primes[hindex];
gas_hash_table_size = bfd_hash_set_default_size (size);
}
/* Create a hash table. This return a control block. */
struct hash_control *
hash_new (void)
static struct hash_control *
hash_new_sized (unsigned long size)
{
unsigned long size;
unsigned long alloc;
struct hash_control *ret;
size = get_gas_hash_table_size ();
ret = (struct hash_control *) xmalloc (sizeof *ret);
obstack_begin (&ret->memory, chunksize);
alloc = size * sizeof (struct hash_entry *);
@ -132,6 +108,12 @@ hash_new (void)
return ret;
}
struct hash_control *
hash_new (void)
{
return hash_new_sized (gas_hash_table_size);
}
/* Delete a hash table, freeing all allocated memory. */
void

View file

@ -1,3 +1,7 @@
2011-04-20 Alan Modra <amodra@gmail.com>
* ld.h (ld_config_type <hash_table_size>): Make it an unsigned long.
2011-04-20 Alan Modra <amodra@gmail.com>
PR ld/12365

View file

@ -308,7 +308,7 @@ typedef struct {
bfd_size_type specified_data_size;
/* The size of the hash table to use. */
bfd_size_type hash_table_size;
unsigned long hash_table_size;
/* The maximum page size for ELF. */
bfd_vma maxpagesize;