merge from gcc
[deliverable/binutils-gdb.git] / libiberty / hashtab.c
CommitLineData
e2eaf477 1/* An expandable hash tables datatype.
b1c933fc 2 Copyright (C) 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
e2eaf477
ILT
3 Contributed by Vladimir Makarov (vmakarov@cygnus.com).
4
5This file is part of the libiberty library.
6Libiberty is free software; you can redistribute it and/or
7modify it under the terms of the GNU Library General Public
8License as published by the Free Software Foundation; either
9version 2 of the License, or (at your option) any later version.
10
11Libiberty is distributed in the hope that it will be useful,
12but WITHOUT ANY WARRANTY; without even the implied warranty of
13MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14Library General Public License for more details.
15
16You should have received a copy of the GNU Library General Public
17License along with libiberty; see the file COPYING.LIB. If
18not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19Boston, MA 02111-1307, USA. */
20
21/* This package implements basic hash table functionality. It is possible
22 to search for an entry, create an entry and destroy an entry.
23
24 Elements in the table are generic pointers.
25
26 The size of the table is not fixed; if the occupancy of the table
27 grows too high the hash table will be expanded.
28
29 The abstract data implementation is based on generalized Algorithm D
30 from Knuth's book "The art of computer programming". Hash table is
31 expanded by creation of new hash table and transferring elements from
32 the old table to the new table. */
33
34#ifdef HAVE_CONFIG_H
35#include "config.h"
36#endif
37
38#include <sys/types.h>
39
40#ifdef HAVE_STDLIB_H
41#include <stdlib.h>
42#endif
43
5c82d20a
ZW
44#ifdef HAVE_STRING_H
45#include <string.h>
46#endif
47
e2eaf477
ILT
48#include <stdio.h>
49
50#include "libiberty.h"
51#include "hashtab.h"
52
e2eaf477
ILT
53/* This macro defines reserved value for empty table entry. */
54
e0f3df8f 55#define EMPTY_ENTRY ((PTR) 0)
e2eaf477
ILT
56
57/* This macro defines reserved value for table entry which contained
58 a deleted element. */
59
e0f3df8f 60#define DELETED_ENTRY ((PTR) 1)
e2eaf477 61
eb383413
L
62static unsigned long higher_prime_number PARAMS ((unsigned long));
63static hashval_t hash_pointer PARAMS ((const void *));
64static int eq_pointer PARAMS ((const void *, const void *));
99a4c1bd 65static int htab_expand PARAMS ((htab_t));
e0f3df8f 66static PTR *find_empty_slot_for_expand PARAMS ((htab_t, hashval_t));
eb383413
L
67
68/* At some point, we could make these be NULL, and modify the
69 hash-table routines to handle NULL specially; that would avoid
70 function-call overhead for the common case of hashing pointers. */
71htab_hash htab_hash_pointer = hash_pointer;
72htab_eq htab_eq_pointer = eq_pointer;
73
5ca0f83d
DD
74/* The following function returns a nearest prime number which is
75 greater than N, and near a power of two. */
e2eaf477
ILT
76
77static unsigned long
b4fe2683
JM
78higher_prime_number (n)
79 unsigned long n;
e2eaf477 80{
5ca0f83d
DD
81 /* These are primes that are near, but slightly smaller than, a
82 power of two. */
e6450fe5 83 static const unsigned long primes[] = {
b1e51b3c
DD
84 (unsigned long) 7,
85 (unsigned long) 13,
86 (unsigned long) 31,
87 (unsigned long) 61,
88 (unsigned long) 127,
89 (unsigned long) 251,
90 (unsigned long) 509,
91 (unsigned long) 1021,
92 (unsigned long) 2039,
93 (unsigned long) 4093,
94 (unsigned long) 8191,
95 (unsigned long) 16381,
96 (unsigned long) 32749,
97 (unsigned long) 65521,
98 (unsigned long) 131071,
99 (unsigned long) 262139,
100 (unsigned long) 524287,
101 (unsigned long) 1048573,
102 (unsigned long) 2097143,
103 (unsigned long) 4194301,
104 (unsigned long) 8388593,
105 (unsigned long) 16777213,
106 (unsigned long) 33554393,
107 (unsigned long) 67108859,
108 (unsigned long) 134217689,
109 (unsigned long) 268435399,
110 (unsigned long) 536870909,
111 (unsigned long) 1073741789,
112 (unsigned long) 2147483647,
113 /* 4294967291L */
06b0287c 114 ((unsigned long) 2147483647) + ((unsigned long) 2147483644),
5ca0f83d
DD
115 };
116
e6450fe5
DD
117 const unsigned long *low = &primes[0];
118 const unsigned long *high = &primes[sizeof(primes) / sizeof(primes[0])];
5ca0f83d
DD
119
120 while (low != high)
121 {
e6450fe5 122 const unsigned long *mid = low + (high - low) / 2;
5ca0f83d
DD
123 if (n > *mid)
124 low = mid + 1;
125 else
126 high = mid;
127 }
128
129 /* If we've run out of primes, abort. */
130 if (n > *low)
131 {
132 fprintf (stderr, "Cannot find prime bigger than %lu\n", n);
133 abort ();
134 }
135
136 return *low;
e2eaf477
ILT
137}
138
eb383413
L
139/* Returns a hash code for P. */
140
141static hashval_t
142hash_pointer (p)
e0f3df8f 143 const PTR p;
eb383413
L
144{
145 return (hashval_t) ((long)p >> 3);
146}
147
148/* Returns non-zero if P1 and P2 are equal. */
149
150static int
151eq_pointer (p1, p2)
e0f3df8f
HPN
152 const PTR p1;
153 const PTR p2;
eb383413
L
154{
155 return p1 == p2;
156}
157
e2eaf477
ILT
158/* This function creates table with length slightly longer than given
159 source length. Created hash table is initiated as empty (all the
160 hash table entries are EMPTY_ENTRY). The function returns the
18893690 161 created hash table, or NULL if memory allocation fails. */
e2eaf477 162
b4fe2683 163htab_t
18893690 164htab_create_alloc (size, hash_f, eq_f, del_f, alloc_f, free_f)
e2eaf477 165 size_t size;
b4fe2683
JM
166 htab_hash hash_f;
167 htab_eq eq_f;
168 htab_del del_f;
18893690
DD
169 htab_alloc alloc_f;
170 htab_free free_f;
e2eaf477 171{
b4fe2683 172 htab_t result;
e2eaf477
ILT
173
174 size = higher_prime_number (size);
18893690
DD
175 result = (htab_t) (*alloc_f) (1, sizeof (struct htab));
176 if (result == NULL)
177 return NULL;
178 result->entries = (PTR *) (*alloc_f) (size, sizeof (PTR));
179 if (result->entries == NULL)
180 {
181 if (free_f != NULL)
182 (*free_f) (result);
183 return NULL;
184 }
e2eaf477 185 result->size = size;
b4fe2683
JM
186 result->hash_f = hash_f;
187 result->eq_f = eq_f;
188 result->del_f = del_f;
18893690
DD
189 result->alloc_f = alloc_f;
190 result->free_f = free_f;
99a4c1bd
HPN
191 return result;
192}
193
18893690 194/* These functions exist solely for backward compatibility. */
99a4c1bd 195
18893690 196#undef htab_create
99a4c1bd 197htab_t
18893690 198htab_create (size, hash_f, eq_f, del_f)
99a4c1bd
HPN
199 size_t size;
200 htab_hash hash_f;
201 htab_eq eq_f;
202 htab_del del_f;
203{
18893690
DD
204 return htab_create_alloc (size, hash_f, eq_f, del_f, xcalloc, free);
205}
99a4c1bd 206
18893690
DD
207htab_t
208htab_try_create (size, hash_f, eq_f, del_f)
209 size_t size;
210 htab_hash hash_f;
211 htab_eq eq_f;
212 htab_del del_f;
213{
214 return htab_create_alloc (size, hash_f, eq_f, del_f, calloc, free);
e2eaf477
ILT
215}
216
217/* This function frees all memory allocated for given hash table.
218 Naturally the hash table must already exist. */
219
220void
b4fe2683
JM
221htab_delete (htab)
222 htab_t htab;
e2eaf477 223{
b4fe2683 224 int i;
eb383413 225
b4fe2683
JM
226 if (htab->del_f)
227 for (i = htab->size - 1; i >= 0; i--)
eb383413
L
228 if (htab->entries[i] != EMPTY_ENTRY
229 && htab->entries[i] != DELETED_ENTRY)
230 (*htab->del_f) (htab->entries[i]);
b4fe2683 231
18893690
DD
232 if (htab->free_f != NULL)
233 {
234 (*htab->free_f) (htab->entries);
235 (*htab->free_f) (htab);
236 }
e2eaf477
ILT
237}
238
239/* This function clears all entries in the given hash table. */
240
241void
b4fe2683
JM
242htab_empty (htab)
243 htab_t htab;
244{
245 int i;
eb383413 246
b4fe2683
JM
247 if (htab->del_f)
248 for (i = htab->size - 1; i >= 0; i--)
eb383413
L
249 if (htab->entries[i] != EMPTY_ENTRY
250 && htab->entries[i] != DELETED_ENTRY)
251 (*htab->del_f) (htab->entries[i]);
b4fe2683 252
e0f3df8f 253 memset (htab->entries, 0, htab->size * sizeof (PTR));
b4fe2683
JM
254}
255
256/* Similar to htab_find_slot, but without several unwanted side effects:
257 - Does not call htab->eq_f when it finds an existing entry.
258 - Does not change the count of elements/searches/collisions in the
259 hash table.
260 This function also assumes there are no deleted entries in the table.
261 HASH is the hash value for the element to be inserted. */
eb383413 262
e0f3df8f 263static PTR *
b4fe2683
JM
264find_empty_slot_for_expand (htab, hash)
265 htab_t htab;
eb383413 266 hashval_t hash;
e2eaf477 267{
b4fe2683 268 size_t size = htab->size;
b4fe2683 269 unsigned int index = hash % size;
b1c933fc
RH
270 PTR *slot = htab->entries + index;
271 hashval_t hash2;
272
273 if (*slot == EMPTY_ENTRY)
274 return slot;
275 else if (*slot == DELETED_ENTRY)
276 abort ();
b4fe2683 277
b1c933fc 278 hash2 = 1 + hash % (size - 2);
b4fe2683
JM
279 for (;;)
280 {
b1c933fc
RH
281 index += hash2;
282 if (index >= size)
283 index -= size;
eb383413 284
b1c933fc 285 slot = htab->entries + index;
b4fe2683
JM
286 if (*slot == EMPTY_ENTRY)
287 return slot;
eb383413 288 else if (*slot == DELETED_ENTRY)
b4fe2683 289 abort ();
b4fe2683 290 }
e2eaf477
ILT
291}
292
293/* The following function changes size of memory allocated for the
294 entries and repeatedly inserts the table elements. The occupancy
295 of the table after the call will be about 50%. Naturally the hash
296 table must already exist. Remember also that the place of the
99a4c1bd
HPN
297 table entries is changed. If memory allocation failures are allowed,
298 this function will return zero, indicating that the table could not be
299 expanded. If all goes well, it will return a non-zero value. */
e2eaf477 300
99a4c1bd 301static int
b4fe2683
JM
302htab_expand (htab)
303 htab_t htab;
e2eaf477 304{
e0f3df8f
HPN
305 PTR *oentries;
306 PTR *olimit;
307 PTR *p;
18893690 308 PTR *nentries;
eed2b28c 309 size_t nsize;
b4fe2683
JM
310
311 oentries = htab->entries;
312 olimit = oentries + htab->size;
313
eed2b28c 314 nsize = higher_prime_number (htab->size * 2);
99a4c1bd 315
eed2b28c 316 nentries = (PTR *) (*htab->alloc_f) (nsize, sizeof (PTR));
18893690
DD
317 if (nentries == NULL)
318 return 0;
319 htab->entries = nentries;
eed2b28c 320 htab->size = nsize;
b4fe2683
JM
321
322 htab->n_elements -= htab->n_deleted;
323 htab->n_deleted = 0;
324
325 p = oentries;
326 do
327 {
e0f3df8f 328 PTR x = *p;
eb383413 329
b4fe2683
JM
330 if (x != EMPTY_ENTRY && x != DELETED_ENTRY)
331 {
e0f3df8f 332 PTR *q = find_empty_slot_for_expand (htab, (*htab->hash_f) (x));
eb383413 333
b4fe2683
JM
334 *q = x;
335 }
eb383413 336
b4fe2683
JM
337 p++;
338 }
339 while (p < olimit);
eb383413 340
18893690
DD
341 if (htab->free_f != NULL)
342 (*htab->free_f) (oentries);
99a4c1bd 343 return 1;
e2eaf477
ILT
344}
345
b4fe2683
JM
346/* This function searches for a hash table entry equal to the given
347 element. It cannot be used to insert or delete an element. */
348
e0f3df8f 349PTR
b4fe2683
JM
350htab_find_with_hash (htab, element, hash)
351 htab_t htab;
e0f3df8f 352 const PTR element;
eb383413 353 hashval_t hash;
e2eaf477 354{
eb383413
L
355 unsigned int index;
356 hashval_t hash2;
b4fe2683 357 size_t size;
e0f3df8f 358 PTR entry;
e2eaf477 359
b4fe2683
JM
360 htab->searches++;
361 size = htab->size;
b4fe2683
JM
362 index = hash % size;
363
eb383413
L
364 entry = htab->entries[index];
365 if (entry == EMPTY_ENTRY
366 || (entry != DELETED_ENTRY && (*htab->eq_f) (entry, element)))
367 return entry;
368
369 hash2 = 1 + hash % (size - 2);
370
b4fe2683 371 for (;;)
e2eaf477 372 {
b4fe2683
JM
373 htab->collisions++;
374 index += hash2;
375 if (index >= size)
376 index -= size;
eb383413
L
377
378 entry = htab->entries[index];
379 if (entry == EMPTY_ENTRY
380 || (entry != DELETED_ENTRY && (*htab->eq_f) (entry, element)))
381 return entry;
e2eaf477 382 }
b4fe2683
JM
383}
384
385/* Like htab_find_slot_with_hash, but compute the hash value from the
386 element. */
eb383413 387
e0f3df8f 388PTR
b4fe2683
JM
389htab_find (htab, element)
390 htab_t htab;
e0f3df8f 391 const PTR element;
b4fe2683
JM
392{
393 return htab_find_with_hash (htab, element, (*htab->hash_f) (element));
394}
395
396/* This function searches for a hash table slot containing an entry
397 equal to the given element. To delete an entry, call this with
398 INSERT = 0, then call htab_clear_slot on the slot returned (possibly
399 after doing some checks). To insert an entry, call this with
99a4c1bd
HPN
400 INSERT = 1, then write the value you want into the returned slot.
401 When inserting an entry, NULL may be returned if memory allocation
402 fails. */
b4fe2683 403
e0f3df8f 404PTR *
b4fe2683
JM
405htab_find_slot_with_hash (htab, element, hash, insert)
406 htab_t htab;
e0f3df8f 407 const PTR element;
eb383413
L
408 hashval_t hash;
409 enum insert_option insert;
b4fe2683 410{
e0f3df8f 411 PTR *first_deleted_slot;
eb383413
L
412 unsigned int index;
413 hashval_t hash2;
b4fe2683 414 size_t size;
b1c933fc 415 PTR entry;
b4fe2683 416
99a4c1bd
HPN
417 if (insert == INSERT && htab->size * 3 <= htab->n_elements * 4
418 && htab_expand (htab) == 0)
419 return NULL;
b4fe2683
JM
420
421 size = htab->size;
b4fe2683
JM
422 index = hash % size;
423
e2eaf477 424 htab->searches++;
b4fe2683
JM
425 first_deleted_slot = NULL;
426
b1c933fc
RH
427 entry = htab->entries[index];
428 if (entry == EMPTY_ENTRY)
429 goto empty_entry;
430 else if (entry == DELETED_ENTRY)
431 first_deleted_slot = &htab->entries[index];
432 else if ((*htab->eq_f) (entry, element))
433 return &htab->entries[index];
434
435 hash2 = 1 + hash % (size - 2);
b4fe2683 436 for (;;)
e2eaf477 437 {
b1c933fc
RH
438 htab->collisions++;
439 index += hash2;
440 if (index >= size)
441 index -= size;
442
443 entry = htab->entries[index];
b4fe2683 444 if (entry == EMPTY_ENTRY)
b1c933fc
RH
445 goto empty_entry;
446 else if (entry == DELETED_ENTRY)
b4fe2683
JM
447 {
448 if (!first_deleted_slot)
449 first_deleted_slot = &htab->entries[index];
450 }
b1c933fc 451 else if ((*htab->eq_f) (entry, element))
eb383413 452 return &htab->entries[index];
e2eaf477 453 }
b1c933fc
RH
454
455 empty_entry:
456 if (insert == NO_INSERT)
457 return NULL;
458
459 htab->n_elements++;
460
461 if (first_deleted_slot)
462 {
463 *first_deleted_slot = EMPTY_ENTRY;
464 return first_deleted_slot;
465 }
466
467 return &htab->entries[index];
e2eaf477
ILT
468}
469
b4fe2683
JM
470/* Like htab_find_slot_with_hash, but compute the hash value from the
471 element. */
eb383413 472
e0f3df8f 473PTR *
b4fe2683
JM
474htab_find_slot (htab, element, insert)
475 htab_t htab;
e0f3df8f 476 const PTR element;
eb383413 477 enum insert_option insert;
b4fe2683
JM
478{
479 return htab_find_slot_with_hash (htab, element, (*htab->hash_f) (element),
480 insert);
481}
482
483/* This function deletes an element with the given value from hash
484 table. If there is no matching element in the hash table, this
485 function does nothing. */
e2eaf477
ILT
486
487void
b4fe2683
JM
488htab_remove_elt (htab, element)
489 htab_t htab;
e0f3df8f 490 PTR element;
e2eaf477 491{
e0f3df8f 492 PTR *slot;
b4fe2683 493
eb383413 494 slot = htab_find_slot (htab, element, NO_INSERT);
b4fe2683
JM
495 if (*slot == EMPTY_ENTRY)
496 return;
497
498 if (htab->del_f)
499 (*htab->del_f) (*slot);
e2eaf477 500
b4fe2683
JM
501 *slot = DELETED_ENTRY;
502 htab->n_deleted++;
e2eaf477
ILT
503}
504
b4fe2683
JM
505/* This function clears a specified slot in a hash table. It is
506 useful when you've already done the lookup and don't want to do it
507 again. */
e2eaf477
ILT
508
509void
b4fe2683
JM
510htab_clear_slot (htab, slot)
511 htab_t htab;
e0f3df8f 512 PTR *slot;
e2eaf477
ILT
513{
514 if (slot < htab->entries || slot >= htab->entries + htab->size
515 || *slot == EMPTY_ENTRY || *slot == DELETED_ENTRY)
516 abort ();
eb383413 517
b4fe2683
JM
518 if (htab->del_f)
519 (*htab->del_f) (*slot);
eb383413 520
e2eaf477 521 *slot = DELETED_ENTRY;
b4fe2683 522 htab->n_deleted++;
e2eaf477
ILT
523}
524
525/* This function scans over the entire hash table calling
526 CALLBACK for each live entry. If CALLBACK returns false,
527 the iteration stops. INFO is passed as CALLBACK's second
528 argument. */
529
530void
b4fe2683
JM
531htab_traverse (htab, callback, info)
532 htab_t htab;
533 htab_trav callback;
e0f3df8f 534 PTR info;
e2eaf477 535{
e0f3df8f
HPN
536 PTR *slot = htab->entries;
537 PTR *limit = slot + htab->size;
eb383413 538
b4fe2683
JM
539 do
540 {
e0f3df8f 541 PTR x = *slot;
eb383413 542
b4fe2683
JM
543 if (x != EMPTY_ENTRY && x != DELETED_ENTRY)
544 if (!(*callback) (slot, info))
545 break;
546 }
547 while (++slot < limit);
e2eaf477
ILT
548}
549
eb383413 550/* Return the current size of given hash table. */
e2eaf477
ILT
551
552size_t
b4fe2683
JM
553htab_size (htab)
554 htab_t htab;
e2eaf477
ILT
555{
556 return htab->size;
557}
558
eb383413 559/* Return the current number of elements in given hash table. */
e2eaf477
ILT
560
561size_t
b4fe2683
JM
562htab_elements (htab)
563 htab_t htab;
e2eaf477 564{
b4fe2683 565 return htab->n_elements - htab->n_deleted;
e2eaf477
ILT
566}
567
eb383413
L
568/* Return the fraction of fixed collisions during all work with given
569 hash table. */
e2eaf477 570
b4fe2683
JM
571double
572htab_collisions (htab)
573 htab_t htab;
e2eaf477 574{
eb383413 575 if (htab->searches == 0)
b4fe2683 576 return 0.0;
eb383413
L
577
578 return (double) htab->collisions / (double) htab->searches;
e2eaf477 579}
8fc34799 580
68a41de7
DD
581/* Hash P as a null-terminated string.
582
583 Copied from gcc/hashtable.c. Zack had the following to say with respect
584 to applicability, though note that unlike hashtable.c, this hash table
585 implementation re-hashes rather than chain buckets.
586
587 http://gcc.gnu.org/ml/gcc-patches/2001-08/msg01021.html
588 From: Zack Weinberg <zackw@panix.com>
589 Date: Fri, 17 Aug 2001 02:15:56 -0400
590
591 I got it by extracting all the identifiers from all the source code
592 I had lying around in mid-1999, and testing many recurrences of
593 the form "H_n = H_{n-1} * K + c_n * L + M" where K, L, M were either
594 prime numbers or the appropriate identity. This was the best one.
595 I don't remember exactly what constituted "best", except I was
596 looking at bucket-length distributions mostly.
597
598 So it should be very good at hashing identifiers, but might not be
599 as good at arbitrary strings.
600
601 I'll add that it thoroughly trounces the hash functions recommended
602 for this use at http://burtleburtle.net/bob/hash/index.html, both
603 on speed and bucket distribution. I haven't tried it against the
604 function they just started using for Perl's hashes. */
8fc34799
DD
605
606hashval_t
607htab_hash_string (p)
608 const PTR p;
609{
610 const unsigned char *str = (const unsigned char *) p;
611 hashval_t r = 0;
612 unsigned char c;
613
614 while ((c = *str++) != 0)
615 r = r * 67 + c - 113;
616
617 return r;
618}
This page took 0.164623 seconds and 4 git commands to generate.