aboutsummaryrefslogtreecommitdiff
path: root/bfd/archive.c
diff options
context:
space:
mode:
authorBen Elliston <bje@au.ibm.com>2005-03-10 00:29:35 +0000
committerBen Elliston <bje@au.ibm.com>2005-03-10 00:29:35 +0000
commit109f70961993d87c90fab4a7ba8de115759f5999 (patch)
treec927aa47c0d6c2ae341c57728c2786564580a08a /bfd/archive.c
parent71892b490cef7947cea80667ef03562721fd9b15 (diff)
downloadgdb-109f70961993d87c90fab4a7ba8de115759f5999.zip
gdb-109f70961993d87c90fab4a7ba8de115759f5999.tar.gz
gdb-109f70961993d87c90fab4a7ba8de115759f5999.tar.bz2
* archive.c: Include hashtab.h.
(struct ar_cache): Rename `arelt' to `arbfd' and remove `next'. (_bfd_look_for_bfd_in_cache): Reimplement using htab_find. (hash_file_ptr): New function. (eq_file_ptr): Likewise. (_bfd_add_bfd_to_archive_cache): Reimplement using a hash table. * libbfd-in.h: Include hashtab.h. (struct artdata): Change `cache' member type to htab_t. * libbfd.h: Rebuild.
Diffstat (limited to 'bfd/archive.c')
-rw-r--r--bfd/archive.c69
1 files changed, 45 insertions, 24 deletions
diff --git a/bfd/archive.c b/bfd/archive.c
index f8bf76a..2fedd29 100644
--- a/bfd/archive.c
+++ b/bfd/archive.c
@@ -133,6 +133,7 @@ DESCRIPTION
#include "aout/ar.h"
#include "aout/ranlib.h"
#include "safe-ctype.h"
+#include "hashtab.h"
#ifndef errno
extern int errno;
@@ -146,8 +147,7 @@ extern int errno;
to the front of the contents! */
struct ar_cache {
file_ptr ptr;
- bfd *arelt;
- struct ar_cache *next;
+ bfd *arbfd;
};
#define ar_padchar(abfd) ((abfd)->xvec->ar_pad_char)
@@ -247,14 +247,36 @@ bfd_set_archive_head (bfd *output_archive, bfd *new_head)
bfd *
_bfd_look_for_bfd_in_cache (bfd *arch_bfd, file_ptr filepos)
{
- struct ar_cache *current;
+ struct ar_cache m;
+ m.ptr = filepos;
- for (current = bfd_ardata (arch_bfd)->cache; current != NULL;
- current = current->next)
- if (current->ptr == filepos)
- return current->arelt;
+ htab_t hash_table = bfd_ardata (arch_bfd)->cache;
+ if (hash_table)
+ {
+ struct ar_cache *entry = (struct ar_cache *) htab_find (hash_table, &m);
+ if (!entry)
+ return NULL;
+ else
+ return entry->arbfd;
+ }
+ else
+ return NULL;
+}
- return NULL;
+static hashval_t
+hash_file_ptr (const PTR p)
+{
+ return (hashval_t) (((struct ar_cache *) p)->ptr);
+}
+
+/* Returns non-zero if P1 and P2 are equal. */
+
+static int
+eq_file_ptr (const PTR p1, const PTR p2)
+{
+ struct ar_cache *arc1 = (struct ar_cache *) p1;
+ struct ar_cache *arc2 = (struct ar_cache *) p2;
+ return arc1->ptr == arc2->ptr;
}
/* Kind of stupid to call cons for each one, but we don't do too many. */
@@ -262,26 +284,25 @@ _bfd_look_for_bfd_in_cache (bfd *arch_bfd, file_ptr filepos)
bfd_boolean
_bfd_add_bfd_to_archive_cache (bfd *arch_bfd, file_ptr filepos, bfd *new_elt)
{
- bfd_size_type amt = sizeof (struct ar_cache);
-
- struct ar_cache *new_cache = bfd_zalloc (arch_bfd, amt);
- if (new_cache == NULL)
- return FALSE;
+ struct ar_cache *cache;
+ htab_t hash_table = bfd_ardata (arch_bfd)->cache;
- new_cache->ptr = filepos;
- new_cache->arelt = new_elt;
- new_cache->next = NULL;
- if (bfd_ardata (arch_bfd)->cache == NULL)
- bfd_ardata (arch_bfd)->cache = new_cache;
- else
+ /* If the hash table hasn't been created, create it. */
+ if (hash_table == NULL)
{
- struct ar_cache *current = bfd_ardata (arch_bfd)->cache;
-
- while (current->next != NULL)
- current = current->next;
- current->next = new_cache;
+ hash_table = htab_create_alloc (16, hash_file_ptr, eq_file_ptr,
+ NULL, calloc, free);
+ if (hash_table == NULL)
+ return FALSE;
+ bfd_ardata (arch_bfd)->cache = hash_table;
}
+ /* Insert new_elt into the hash table by filepos. */
+ cache = bfd_zalloc (arch_bfd, sizeof (struct ar_cache));
+ cache->ptr = filepos;
+ cache->arbfd = new_elt;
+ *htab_find_slot (hash_table, (const void *) cache, INSERT) = cache;
+
return TRUE;
}