bfd/
authorAlan Modra <amodra@gmail.com>
Wed, 20 Apr 2011 12:52:16 +0000 (12:52 +0000)
committerAlan Modra <amodra@gmail.com>
Wed, 20 Apr 2011 12:52:16 +0000 (12:52 +0000)
* 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.

bfd/ChangeLog
bfd/bfd-in.h
bfd/bfd-in2.h
bfd/hash.c
gas/ChangeLog
gas/hash.c
ld/ChangeLog
ld/ld.h

index fec3d20..4c9d8c2 100644 (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
index 5f0f4b5..d536897 100644 (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.  */
index 2c795b6..76836b1 100644 (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.  */
index e2fa3a9..7147b71 100644 (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;
 }
 \f
-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;
 }
 \f
 /* A few different object file formats (a.out, COFF, ELF) use a string
index 0cc109a..6a21ff3 100644 (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.
index 6fc8543..a58c948 100644 (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
index 31acf59..ce511ac 100644 (file)
@@ -1,5 +1,9 @@
 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
        * ldfile.c (ldfile_try_open_bfd): Move code creating and switching
        to plugin IR BFD..
diff --git a/ld/ld.h b/ld/ld.h
index 564cb73..9391923 100644 (file)
--- a/ld/ld.h
+++ b/ld/ld.h
@@ -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;