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