diff options
-rw-r--r-- | bfd/ChangeLog | 12 | ||||
-rw-r--r-- | bfd/archive.c | 69 | ||||
-rw-r--r-- | bfd/libbfd-in.h | 4 | ||||
-rw-r--r-- | bfd/libbfd.h | 4 |
4 files changed, 63 insertions, 26 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog index ec9d857..f394852 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,15 @@ +2005-03-10 Ben Elliston <bje@au.ibm.com> + + * 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. + 2005-03-08 Daniel Jacobowitz <dan@codesourcery.com> * configure.in: Bump version to 2.16.90. 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; } diff --git a/bfd/libbfd-in.h b/bfd/libbfd-in.h index 396ece3..cc65a56 100644 --- a/bfd/libbfd-in.h +++ b/bfd/libbfd-in.h @@ -23,6 +23,8 @@ You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +#include "hashtab.h" + /* Align an address upward to a boundary, expressed as a number of bytes. E.g. align to an 8-byte boundary with argument of 8. Take care never to wrap around if the address is within boundary-1 of the end of the @@ -57,7 +59,7 @@ struct bfd_in_memory struct artdata { file_ptr first_file_filepos; /* Speed up searching the armap */ - struct ar_cache *cache; + htab_t cache; bfd *archive_head; /* Only interesting in output routines */ carsym *symdefs; /* the symdef entries */ symindex symdef_count; /* how many there are */ diff --git a/bfd/libbfd.h b/bfd/libbfd.h index 8afdf89..ee6b421 100644 --- a/bfd/libbfd.h +++ b/bfd/libbfd.h @@ -28,6 +28,8 @@ You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +#include "hashtab.h" + /* Align an address upward to a boundary, expressed as a number of bytes. E.g. align to an 8-byte boundary with argument of 8. Take care never to wrap around if the address is within boundary-1 of the end of the @@ -62,7 +64,7 @@ struct bfd_in_memory struct artdata { file_ptr first_file_filepos; /* Speed up searching the armap */ - struct ar_cache *cache; + htab_t cache; bfd *archive_head; /* Only interesting in output routines */ carsym *symdefs; /* the symdef entries */ symindex symdef_count; /* how many there are */ |