* bfd-in.h (bfd_hash_insert): Declare.
authorAlan Modra <amodra@gmail.com>
Wed, 19 Sep 2007 12:08:34 +0000 (12:08 +0000)
committerAlan Modra <amodra@gmail.com>
Wed, 19 Sep 2007 12:08:34 +0000 (12:08 +0000)
* bfd-in2.h: Regenerate.
* hash.c (bfd_hash_insert): New function.  Split out from..
(bfd_hash_lookup): ..here.
* merge.c (sec_merge_hash_lookup): Use bfd_hash_insert.

bfd/ChangeLog
bfd/bfd-in.h
bfd/bfd-in2.h
bfd/hash.c
bfd/merge.c

index 76d7bbb5d38fc4af3ffd37407a810635afe73ebe..279e70ef91dcac044436314e16b555b66d682069 100644 (file)
@@ -1,3 +1,12 @@
+2007-09-19  Alan Modra  <amodra@bigpond.net.au>
+           Doug Kwan  <dougkwan@google.com>
+
+       * bfd-in.h (bfd_hash_insert): Declare.
+       * bfd-in2.h: Regenerate.
+       * hash.c (bfd_hash_insert): New function.  Split out from..
+       (bfd_hash_lookup): ..here.
+       * merge.c (sec_merge_hash_lookup): Use bfd_hash_insert.
+
 2007-09-18  Alan Modra  <amodra@bigpond.net.au>
 
        * elf.c (bfd_section_from_shdr): Check bfd_alloc return.
index 2e70a7391fdf16281e3b446d688e272338a3d45a..07fdf0364973d62241bcbe2d72d2496df794db39 100644 (file)
@@ -464,6 +464,10 @@ extern struct bfd_hash_entry *bfd_hash_lookup
   (struct bfd_hash_table *, const char *, bfd_boolean create,
    bfd_boolean copy);
 
+/* Insert an entry in a hash table.  */
+extern struct bfd_hash_entry *bfd_hash_insert
+  (struct bfd_hash_table *, const char *, unsigned long);
+
 /* Replace an entry in a hash table.  */
 extern void bfd_hash_replace
   (struct bfd_hash_table *, struct bfd_hash_entry *old,
index d3228d05e4123c82cdaa8e81a5f40ad4411b55fd..09432780ae6de4860f4a0c6fde2a3731d5edc755 100644 (file)
@@ -471,6 +471,10 @@ extern struct bfd_hash_entry *bfd_hash_lookup
   (struct bfd_hash_table *, const char *, bfd_boolean create,
    bfd_boolean copy);
 
+/* Insert an entry in a hash table.  */
+extern struct bfd_hash_entry *bfd_hash_insert
+  (struct bfd_hash_table *, const char *, unsigned long);
+
 /* Replace an entry in a hash table.  */
 extern void bfd_hash_replace
   (struct bfd_hash_table *, struct bfd_hash_entry *old,
index 5edccac350ab707a5c17ea11dd0ae287d152ccd3..14fc40301508728a4a72498e57b5b895d28bf152 100644 (file)
@@ -451,9 +451,6 @@ bfd_hash_lookup (struct bfd_hash_table *table,
   if (! create)
     return NULL;
 
-  hashp = (*table->newfunc) (NULL, table, string);
-  if (hashp == NULL)
-    return NULL;
   if (copy)
     {
       char *new;
@@ -467,8 +464,26 @@ bfd_hash_lookup (struct bfd_hash_table *table,
       memcpy (new, string, len + 1);
       string = new;
     }
+
+  return bfd_hash_insert (table, string, hash);
+}
+
+/* Insert an entry in a hash table.  */
+
+struct bfd_hash_entry *
+bfd_hash_insert (struct bfd_hash_table *table,
+                const char *string,
+                unsigned long hash)
+{
+  struct bfd_hash_entry *hashp;
+  unsigned int index;
+
+  hashp = (*table->newfunc) (NULL, table, string);
+  if (hashp == NULL)
+    return NULL;
   hashp->string = string;
   hashp->hash = hash;
+  index = hash % table->size;
   hashp->next = table->table[index];
   table->table[index] = hashp;
   table->count++;
@@ -490,6 +505,11 @@ bfd_hash_lookup (struct bfd_hash_table *table,
 
       newtable = ((struct bfd_hash_entry **)
                  objalloc_alloc ((struct objalloc *) table->memory, alloc));
+      if (newtable == NULL)
+       {
+         table->frozen = 1;
+         return hashp;
+       }
       memset ((PTR) newtable, 0, alloc);
 
       for (hi = 0; hi < table->size; hi ++)
@@ -497,7 +517,6 @@ bfd_hash_lookup (struct bfd_hash_table *table,
          {
            struct bfd_hash_entry *chain = table->table[hi];
            struct bfd_hash_entry *chain_end = chain;
-           int index;
 
            while (chain_end->next && chain_end->next->hash == chain->hash)
              chain_end = chain_end->next;
index 2e805c770e3e6314c3a1065cac037fc01f37bc66..32994c3cba8c3084bf02390518e640db046fd5fc 100644 (file)
@@ -220,16 +220,11 @@ sec_merge_hash_lookup (struct sec_merge_hash *table, const char *string,
     return NULL;
 
   hashp = ((struct sec_merge_hash_entry *)
-          sec_merge_hash_newfunc (NULL, &table->table, string));
+          bfd_hash_insert (&table->table, string, hash));
   if (hashp == NULL)
     return NULL;
-  hashp->root.string = string;
-  hashp->root.hash = hash;
   hashp->len = len;
   hashp->alignment = alignment;
-  hashp->root.next = table->table.table[index];
-  table->table.table[index] = (struct bfd_hash_entry *) hashp;
-
   return hashp;
 }