This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

gas hash sizing


This amalgamates gas hash sizing with bfd hash sizing, removing the
FIXME to that effect in gas/hash.c.  I also created hash_new_sized for
gas to use some time in the future.  Many of the gas hash tables could
be sized better.

bfd/
	* 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.

Index: bfd/bfd-in.h
===================================================================
RCS file: /cvs/src/src/bfd/bfd-in.h,v
retrieving revision 1.153
diff -u -p -r1.153 bfd-in.h
--- bfd/bfd-in.h	11 Apr 2011 04:08:12 -0000	1.153
+++ bfd/bfd-in.h	20 Apr 2011 08:29:22 -0000
@@ -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: bfd/hash.c
===================================================================
RCS file: /cvs/src/src/bfd/hash.c,v
retrieving revision 1.32
diff -u -p -r1.32 hash.c
--- bfd/hash.c	8 Nov 2010 02:48:54 -0000	1.32
+++ bfd/hash.c	20 Apr 2011 08:29:53 -0000
@@ -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_t
 		       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->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
       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
Index: gas/hash.c
===================================================================
RCS file: /cvs/src/src/gas/hash.c,v
retrieving revision 1.25
diff -u -p -r1.25 hash.c
--- gas/hash.c	11 Dec 2009 13:42:09 -0000	1.25
+++ gas/hash.c	20 Apr 2011 08:29:57 -0000
@@ -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
 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: ld/ld.h
===================================================================
RCS file: /cvs/src/src/ld/ld.h,v
retrieving revision 1.49
diff -u -p -r1.49 ld.h
--- ld/ld.h	13 Jan 2011 13:34:53 -0000	1.49
+++ ld/ld.h	20 Apr 2011 08:30:06 -0000
@@ -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;

-- 
Alan Modra
Australia Development Lab, IBM


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]