]> git.ipfire.org Git - thirdparty/gcc.git/blame - libiberty/hashtab.c
Merge from pch-branch up to tag pch-commit-20020603.
[thirdparty/gcc.git] / libiberty / hashtab.c
CommitLineData
a2f945c6 1/* An expandable hash tables datatype.
4fc4e478 2 Copyright (C) 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
a2f945c6
VM
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
6de9b8ff
PDM
38#include <sys/types.h>
39
a2f945c6
VM
40#ifdef HAVE_STDLIB_H
41#include <stdlib.h>
42#endif
43
d11ec6f0
ZW
44#ifdef HAVE_STRING_H
45#include <string.h>
46#endif
47
36dd3a44
JL
48#include <stdio.h>
49
a2f945c6
VM
50#include "libiberty.h"
51#include "hashtab.h"
52
a2f945c6
VM
53/* This macro defines reserved value for empty table entry. */
54
35e9340f 55#define EMPTY_ENTRY ((PTR) 0)
a2f945c6
VM
56
57/* This macro defines reserved value for table entry which contained
58 a deleted element. */
59
35e9340f 60#define DELETED_ENTRY ((PTR) 1)
a2f945c6 61
0194e877 62static unsigned long higher_prime_number PARAMS ((unsigned long));
18a94a2f
MM
63static hashval_t hash_pointer PARAMS ((const void *));
64static int eq_pointer PARAMS ((const void *, const void *));
d50d20ec 65static int htab_expand PARAMS ((htab_t));
35e9340f 66static PTR *find_empty_slot_for_expand PARAMS ((htab_t, hashval_t));
18a94a2f
MM
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;
0194e877 73
a4c9b97e
MM
74/* The following function returns a nearest prime number which is
75 greater than N, and near a power of two. */
a2f945c6
VM
76
77static unsigned long
5194cf08
ZW
78higher_prime_number (n)
79 unsigned long n;
a2f945c6 80{
a4c9b97e
MM
81 /* These are primes that are near, but slightly smaller than, a
82 power of two. */
0be6abca 83 static const unsigned long primes[] = {
f8a0ba8c
MM
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 */
6e8afa99 114 ((unsigned long) 2147483647) + ((unsigned long) 2147483644),
a4c9b97e
MM
115 };
116
0be6abca
KG
117 const unsigned long *low = &primes[0];
118 const unsigned long *high = &primes[sizeof(primes) / sizeof(primes[0])];
a4c9b97e
MM
119
120 while (low != high)
121 {
0be6abca 122 const unsigned long *mid = low + (high - low) / 2;
a4c9b97e
MM
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;
a2f945c6
VM
137}
138
18a94a2f
MM
139/* Returns a hash code for P. */
140
4feeaae3 141static hashval_t
18a94a2f 142hash_pointer (p)
35e9340f 143 const PTR p;
18a94a2f 144{
1d2da2e1 145 return (hashval_t) ((long)p >> 3);
18a94a2f
MM
146}
147
148/* Returns non-zero if P1 and P2 are equal. */
149
4feeaae3 150static int
18a94a2f 151eq_pointer (p1, p2)
35e9340f
HPN
152 const PTR p1;
153 const PTR p2;
18a94a2f
MM
154{
155 return p1 == p2;
156}
157
a2f945c6
VM
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
e2500fed 161 created hash table, or NULL if memory allocation fails. */
a2f945c6 162
5194cf08 163htab_t
e2500fed 164htab_create_alloc (size, hash_f, eq_f, del_f, alloc_f, free_f)
a2f945c6 165 size_t size;
5194cf08
ZW
166 htab_hash hash_f;
167 htab_eq eq_f;
5dc9cffd 168 htab_del del_f;
e2500fed
GK
169 htab_alloc alloc_f;
170 htab_free free_f;
a2f945c6 171{
5194cf08 172 htab_t result;
a2f945c6
VM
173
174 size = higher_prime_number (size);
e2500fed 175 result = (htab_t) (*alloc_f) (1, sizeof (struct htab));
d50d20ec
HPN
176 if (result == NULL)
177 return NULL;
e2500fed 178 result->entries = (PTR *) (*alloc_f) (size, sizeof (PTR));
d50d20ec
HPN
179 if (result->entries == NULL)
180 {
e2500fed
GK
181 if (free_f != NULL)
182 (*free_f) (result);
d50d20ec
HPN
183 return NULL;
184 }
d50d20ec
HPN
185 result->size = size;
186 result->hash_f = hash_f;
187 result->eq_f = eq_f;
188 result->del_f = del_f;
e2500fed
GK
189 result->alloc_f = alloc_f;
190 result->free_f = free_f;
a2f945c6
VM
191 return result;
192}
193
194/* This function frees all memory allocated for given hash table.
195 Naturally the hash table must already exist. */
196
197void
5194cf08
ZW
198htab_delete (htab)
199 htab_t htab;
a2f945c6 200{
5dc9cffd 201 int i;
e38992e8 202
5dc9cffd
ZW
203 if (htab->del_f)
204 for (i = htab->size - 1; i >= 0; i--)
e38992e8
RK
205 if (htab->entries[i] != EMPTY_ENTRY
206 && htab->entries[i] != DELETED_ENTRY)
207 (*htab->del_f) (htab->entries[i]);
5dc9cffd 208
e2500fed
GK
209 if (htab->free_f != NULL)
210 {
211 (*htab->free_f) (htab->entries);
212 (*htab->free_f) (htab);
213 }
a2f945c6
VM
214}
215
216/* This function clears all entries in the given hash table. */
217
218void
5194cf08
ZW
219htab_empty (htab)
220 htab_t htab;
a2f945c6 221{
5dc9cffd 222 int i;
e38992e8 223
5dc9cffd
ZW
224 if (htab->del_f)
225 for (i = htab->size - 1; i >= 0; i--)
e38992e8
RK
226 if (htab->entries[i] != EMPTY_ENTRY
227 && htab->entries[i] != DELETED_ENTRY)
228 (*htab->del_f) (htab->entries[i]);
5dc9cffd 229
35e9340f 230 memset (htab->entries, 0, htab->size * sizeof (PTR));
a2f945c6
VM
231}
232
8c5d513f
BS
233/* Similar to htab_find_slot, but without several unwanted side effects:
234 - Does not call htab->eq_f when it finds an existing entry.
235 - Does not change the count of elements/searches/collisions in the
236 hash table.
237 This function also assumes there are no deleted entries in the table.
238 HASH is the hash value for the element to be inserted. */
e38992e8 239
35e9340f 240static PTR *
8c5d513f
BS
241find_empty_slot_for_expand (htab, hash)
242 htab_t htab;
b13eb66b 243 hashval_t hash;
8c5d513f
BS
244{
245 size_t size = htab->size;
8c5d513f 246 unsigned int index = hash % size;
4fc4e478
RH
247 PTR *slot = htab->entries + index;
248 hashval_t hash2;
249
250 if (*slot == EMPTY_ENTRY)
251 return slot;
252 else if (*slot == DELETED_ENTRY)
253 abort ();
8c5d513f 254
4fc4e478 255 hash2 = 1 + hash % (size - 2);
8c5d513f
BS
256 for (;;)
257 {
4fc4e478
RH
258 index += hash2;
259 if (index >= size)
260 index -= size;
e38992e8 261
4fc4e478 262 slot = htab->entries + index;
8c5d513f
BS
263 if (*slot == EMPTY_ENTRY)
264 return slot;
e38992e8 265 else if (*slot == DELETED_ENTRY)
8c5d513f 266 abort ();
8c5d513f
BS
267 }
268}
269
a2f945c6
VM
270/* The following function changes size of memory allocated for the
271 entries and repeatedly inserts the table elements. The occupancy
272 of the table after the call will be about 50%. Naturally the hash
273 table must already exist. Remember also that the place of the
d50d20ec
HPN
274 table entries is changed. If memory allocation failures are allowed,
275 this function will return zero, indicating that the table could not be
276 expanded. If all goes well, it will return a non-zero value. */
a2f945c6 277
d50d20ec 278static int
5194cf08
ZW
279htab_expand (htab)
280 htab_t htab;
a2f945c6 281{
35e9340f
HPN
282 PTR *oentries;
283 PTR *olimit;
284 PTR *p;
e2500fed 285 PTR *nentries;
5194cf08
ZW
286
287 oentries = htab->entries;
288 olimit = oentries + htab->size;
289
290 htab->size = higher_prime_number (htab->size * 2);
d50d20ec 291
e2500fed
GK
292 nentries = (PTR *) (*htab->alloc_f) (htab->size, sizeof (PTR *));
293 if (nentries == NULL)
294 return 0;
295 htab->entries = nentries;
5194cf08
ZW
296
297 htab->n_elements -= htab->n_deleted;
298 htab->n_deleted = 0;
299
300 p = oentries;
301 do
302 {
35e9340f 303 PTR x = *p;
e38992e8 304
5194cf08
ZW
305 if (x != EMPTY_ENTRY && x != DELETED_ENTRY)
306 {
35e9340f 307 PTR *q = find_empty_slot_for_expand (htab, (*htab->hash_f) (x));
e38992e8 308
5194cf08
ZW
309 *q = x;
310 }
e38992e8 311
5194cf08
ZW
312 p++;
313 }
314 while (p < olimit);
e38992e8 315
e2500fed
GK
316 if (htab->free_f != NULL)
317 (*htab->free_f) (oentries);
d50d20ec 318 return 1;
a2f945c6
VM
319}
320
5194cf08
ZW
321/* This function searches for a hash table entry equal to the given
322 element. It cannot be used to insert or delete an element. */
323
35e9340f 324PTR
8c5d513f 325htab_find_with_hash (htab, element, hash)
5194cf08 326 htab_t htab;
35e9340f 327 const PTR element;
b13eb66b 328 hashval_t hash;
a2f945c6 329{
b13eb66b
MM
330 unsigned int index;
331 hashval_t hash2;
5194cf08 332 size_t size;
35e9340f 333 PTR entry;
5194cf08
ZW
334
335 htab->searches++;
336 size = htab->size;
5194cf08 337 index = hash % size;
a2f945c6 338
0194e877
ZW
339 entry = htab->entries[index];
340 if (entry == EMPTY_ENTRY
341 || (entry != DELETED_ENTRY && (*htab->eq_f) (entry, element)))
342 return entry;
343
344 hash2 = 1 + hash % (size - 2);
345
5194cf08 346 for (;;)
a2f945c6 347 {
5194cf08
ZW
348 htab->collisions++;
349 index += hash2;
350 if (index >= size)
351 index -= size;
0194e877
ZW
352
353 entry = htab->entries[index];
354 if (entry == EMPTY_ENTRY
355 || (entry != DELETED_ENTRY && (*htab->eq_f) (entry, element)))
356 return entry;
a2f945c6 357 }
5194cf08
ZW
358}
359
8c5d513f
BS
360/* Like htab_find_slot_with_hash, but compute the hash value from the
361 element. */
e38992e8 362
35e9340f 363PTR
8c5d513f
BS
364htab_find (htab, element)
365 htab_t htab;
35e9340f 366 const PTR element;
8c5d513f
BS
367{
368 return htab_find_with_hash (htab, element, (*htab->hash_f) (element));
369}
370
5194cf08
ZW
371/* This function searches for a hash table slot containing an entry
372 equal to the given element. To delete an entry, call this with
373 INSERT = 0, then call htab_clear_slot on the slot returned (possibly
374 after doing some checks). To insert an entry, call this with
d50d20ec
HPN
375 INSERT = 1, then write the value you want into the returned slot.
376 When inserting an entry, NULL may be returned if memory allocation
377 fails. */
5194cf08 378
35e9340f 379PTR *
8c5d513f 380htab_find_slot_with_hash (htab, element, hash, insert)
5194cf08 381 htab_t htab;
35e9340f 382 const PTR element;
b13eb66b 383 hashval_t hash;
e38992e8 384 enum insert_option insert;
5194cf08 385{
35e9340f 386 PTR *first_deleted_slot;
b13eb66b
MM
387 unsigned int index;
388 hashval_t hash2;
5194cf08 389 size_t size;
4fc4e478 390 PTR entry;
5194cf08 391
d50d20ec
HPN
392 if (insert == INSERT && htab->size * 3 <= htab->n_elements * 4
393 && htab_expand (htab) == 0)
394 return NULL;
5194cf08
ZW
395
396 size = htab->size;
5194cf08
ZW
397 index = hash % size;
398
a2f945c6 399 htab->searches++;
5194cf08
ZW
400 first_deleted_slot = NULL;
401
4fc4e478
RH
402 entry = htab->entries[index];
403 if (entry == EMPTY_ENTRY)
404 goto empty_entry;
405 else if (entry == DELETED_ENTRY)
406 first_deleted_slot = &htab->entries[index];
407 else if ((*htab->eq_f) (entry, element))
408 return &htab->entries[index];
409
410 hash2 = 1 + hash % (size - 2);
5194cf08 411 for (;;)
a2f945c6 412 {
4fc4e478
RH
413 htab->collisions++;
414 index += hash2;
415 if (index >= size)
416 index -= size;
417
418 entry = htab->entries[index];
5194cf08 419 if (entry == EMPTY_ENTRY)
4fc4e478
RH
420 goto empty_entry;
421 else if (entry == DELETED_ENTRY)
5194cf08
ZW
422 {
423 if (!first_deleted_slot)
424 first_deleted_slot = &htab->entries[index];
425 }
4fc4e478 426 else if ((*htab->eq_f) (entry, element))
e38992e8 427 return &htab->entries[index];
a2f945c6 428 }
4fc4e478
RH
429
430 empty_entry:
431 if (insert == NO_INSERT)
432 return NULL;
433
434 htab->n_elements++;
435
436 if (first_deleted_slot)
437 {
438 *first_deleted_slot = EMPTY_ENTRY;
439 return first_deleted_slot;
440 }
441
442 return &htab->entries[index];
a2f945c6
VM
443}
444
8c5d513f
BS
445/* Like htab_find_slot_with_hash, but compute the hash value from the
446 element. */
e38992e8 447
35e9340f 448PTR *
8c5d513f
BS
449htab_find_slot (htab, element, insert)
450 htab_t htab;
35e9340f 451 const PTR element;
e38992e8 452 enum insert_option insert;
8c5d513f
BS
453{
454 return htab_find_slot_with_hash (htab, element, (*htab->hash_f) (element),
455 insert);
456}
457
5194cf08
ZW
458/* This function deletes an element with the given value from hash
459 table. If there is no matching element in the hash table, this
460 function does nothing. */
a2f945c6
VM
461
462void
5194cf08
ZW
463htab_remove_elt (htab, element)
464 htab_t htab;
35e9340f 465 PTR element;
a2f945c6 466{
35e9340f 467 PTR *slot;
a2f945c6 468
e38992e8 469 slot = htab_find_slot (htab, element, NO_INSERT);
5194cf08
ZW
470 if (*slot == EMPTY_ENTRY)
471 return;
472
5dc9cffd
ZW
473 if (htab->del_f)
474 (*htab->del_f) (*slot);
475
5194cf08
ZW
476 *slot = DELETED_ENTRY;
477 htab->n_deleted++;
a2f945c6
VM
478}
479
5194cf08
ZW
480/* This function clears a specified slot in a hash table. It is
481 useful when you've already done the lookup and don't want to do it
482 again. */
ed38f5d5
ZW
483
484void
5194cf08
ZW
485htab_clear_slot (htab, slot)
486 htab_t htab;
35e9340f 487 PTR *slot;
ed38f5d5
ZW
488{
489 if (slot < htab->entries || slot >= htab->entries + htab->size
490 || *slot == EMPTY_ENTRY || *slot == DELETED_ENTRY)
491 abort ();
e38992e8 492
5dc9cffd
ZW
493 if (htab->del_f)
494 (*htab->del_f) (*slot);
e38992e8 495
ed38f5d5 496 *slot = DELETED_ENTRY;
5194cf08 497 htab->n_deleted++;
ed38f5d5
ZW
498}
499
500/* This function scans over the entire hash table calling
501 CALLBACK for each live entry. If CALLBACK returns false,
502 the iteration stops. INFO is passed as CALLBACK's second
503 argument. */
504
505void
5194cf08
ZW
506htab_traverse (htab, callback, info)
507 htab_t htab;
508 htab_trav callback;
35e9340f 509 PTR info;
ed38f5d5 510{
35e9340f
HPN
511 PTR *slot = htab->entries;
512 PTR *limit = slot + htab->size;
e38992e8 513
5194cf08
ZW
514 do
515 {
35e9340f 516 PTR x = *slot;
e38992e8 517
5194cf08 518 if (x != EMPTY_ENTRY && x != DELETED_ENTRY)
8c5d513f 519 if (!(*callback) (slot, info))
5194cf08
ZW
520 break;
521 }
522 while (++slot < limit);
ed38f5d5
ZW
523}
524
e38992e8 525/* Return the current size of given hash table. */
a2f945c6
VM
526
527size_t
5194cf08
ZW
528htab_size (htab)
529 htab_t htab;
a2f945c6
VM
530{
531 return htab->size;
532}
533
e38992e8 534/* Return the current number of elements in given hash table. */
a2f945c6
VM
535
536size_t
5194cf08
ZW
537htab_elements (htab)
538 htab_t htab;
a2f945c6 539{
5194cf08 540 return htab->n_elements - htab->n_deleted;
a2f945c6
VM
541}
542
e38992e8
RK
543/* Return the fraction of fixed collisions during all work with given
544 hash table. */
a2f945c6 545
5194cf08
ZW
546double
547htab_collisions (htab)
548 htab_t htab;
a2f945c6 549{
e38992e8 550 if (htab->searches == 0)
5194cf08 551 return 0.0;
e38992e8
RK
552
553 return (double) htab->collisions / (double) htab->searches;
a2f945c6 554}
9e0ba685 555
0ed5305d
RH
556/* Hash P as a null-terminated string.
557
558 Copied from gcc/hashtable.c. Zack had the following to say with respect
559 to applicability, though note that unlike hashtable.c, this hash table
560 implementation re-hashes rather than chain buckets.
561
562 http://gcc.gnu.org/ml/gcc-patches/2001-08/msg01021.html
563 From: Zack Weinberg <zackw@panix.com>
564 Date: Fri, 17 Aug 2001 02:15:56 -0400
565
566 I got it by extracting all the identifiers from all the source code
567 I had lying around in mid-1999, and testing many recurrences of
568 the form "H_n = H_{n-1} * K + c_n * L + M" where K, L, M were either
569 prime numbers or the appropriate identity. This was the best one.
570 I don't remember exactly what constituted "best", except I was
571 looking at bucket-length distributions mostly.
572
573 So it should be very good at hashing identifiers, but might not be
574 as good at arbitrary strings.
575
576 I'll add that it thoroughly trounces the hash functions recommended
577 for this use at http://burtleburtle.net/bob/hash/index.html, both
578 on speed and bucket distribution. I haven't tried it against the
579 function they just started using for Perl's hashes. */
9e0ba685
RH
580
581hashval_t
582htab_hash_string (p)
583 const PTR p;
584{
585 const unsigned char *str = (const unsigned char *) p;
586 hashval_t r = 0;
587 unsigned char c;
588
589 while ((c = *str++) != 0)
590 r = r * 67 + c - 113;
591
592 return r;
593}