* config.bfd (targ64_selvecs): New.
[deliverable/binutils-gdb.git] / libiberty / hashtab.c
CommitLineData
e2eaf477 1/* An expandable hash tables datatype.
b1e51b3c 2 Copyright (C) 1999, 2000, 2001 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. */
83 static unsigned long primes[] = {
b1e51b3c
DD
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 */
06b0287c 115 ((unsigned long) 2147483647) + ((unsigned long) 2147483644),
5ca0f83d
DD
116 };
117
118 unsigned long* low = &primes[0];
119 unsigned long* high = &primes[sizeof(primes) / sizeof(primes[0])];
120
121 while (low != high)
122 {
123 unsigned long* mid = low + (high - low) / 2;
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;
e2eaf477
ILT
138}
139
eb383413
L
140/* Returns a hash code for P. */
141
142static hashval_t
143hash_pointer (p)
e0f3df8f 144 const PTR p;
eb383413
L
145{
146 return (hashval_t) ((long)p >> 3);
147}
148
149/* Returns non-zero if P1 and P2 are equal. */
150
151static int
152eq_pointer (p1, p2)
e0f3df8f
HPN
153 const PTR p1;
154 const PTR p2;
eb383413
L
155{
156 return p1 == p2;
157}
158
e2eaf477
ILT
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
99a4c1bd 162 created hash table. Memory allocation must not fail. */
e2eaf477 163
b4fe2683
JM
164htab_t
165htab_create (size, hash_f, eq_f, del_f)
e2eaf477 166 size_t size;
b4fe2683
JM
167 htab_hash hash_f;
168 htab_eq eq_f;
169 htab_del del_f;
e2eaf477 170{
b4fe2683 171 htab_t result;
e2eaf477
ILT
172
173 size = higher_prime_number (size);
b4fe2683 174 result = (htab_t) xcalloc (1, sizeof (struct htab));
e0f3df8f 175 result->entries = (PTR *) xcalloc (size, sizeof (PTR));
e2eaf477 176 result->size = size;
b4fe2683
JM
177 result->hash_f = hash_f;
178 result->eq_f = eq_f;
179 result->del_f = del_f;
99a4c1bd
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;
e2eaf477
ILT
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
b4fe2683
JM
222htab_delete (htab)
223 htab_t htab;
e2eaf477 224{
b4fe2683 225 int i;
eb383413 226
b4fe2683
JM
227 if (htab->del_f)
228 for (i = htab->size - 1; i >= 0; i--)
eb383413
L
229 if (htab->entries[i] != EMPTY_ENTRY
230 && htab->entries[i] != DELETED_ENTRY)
231 (*htab->del_f) (htab->entries[i]);
b4fe2683 232
e2eaf477
ILT
233 free (htab->entries);
234 free (htab);
235}
236
237/* This function clears all entries in the given hash table. */
238
239void
b4fe2683
JM
240htab_empty (htab)
241 htab_t htab;
242{
243 int i;
eb383413 244
b4fe2683
JM
245 if (htab->del_f)
246 for (i = htab->size - 1; i >= 0; i--)
eb383413
L
247 if (htab->entries[i] != EMPTY_ENTRY
248 && htab->entries[i] != DELETED_ENTRY)
249 (*htab->del_f) (htab->entries[i]);
b4fe2683 250
e0f3df8f 251 memset (htab->entries, 0, htab->size * sizeof (PTR));
b4fe2683
JM
252}
253
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. */
eb383413 260
e0f3df8f 261static PTR *
b4fe2683
JM
262find_empty_slot_for_expand (htab, hash)
263 htab_t htab;
eb383413 264 hashval_t hash;
e2eaf477 265{
b4fe2683 266 size_t size = htab->size;
eb383413 267 hashval_t hash2 = 1 + hash % (size - 2);
b4fe2683
JM
268 unsigned int index = hash % size;
269
270 for (;;)
271 {
e0f3df8f 272 PTR *slot = htab->entries + index;
eb383413 273
b4fe2683
JM
274 if (*slot == EMPTY_ENTRY)
275 return slot;
eb383413 276 else if (*slot == DELETED_ENTRY)
b4fe2683
JM
277 abort ();
278
279 index += hash2;
280 if (index >= size)
281 index -= size;
282 }
e2eaf477
ILT
283}
284
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
99a4c1bd
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. */
e2eaf477 292
99a4c1bd 293static int
b4fe2683
JM
294htab_expand (htab)
295 htab_t htab;
e2eaf477 296{
e0f3df8f
HPN
297 PTR *oentries;
298 PTR *olimit;
299 PTR *p;
b4fe2683
JM
300
301 oentries = htab->entries;
302 olimit = oentries + htab->size;
303
304 htab->size = higher_prime_number (htab->size * 2);
99a4c1bd
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 *));
b4fe2683
JM
315
316 htab->n_elements -= htab->n_deleted;
317 htab->n_deleted = 0;
318
319 p = oentries;
320 do
321 {
e0f3df8f 322 PTR x = *p;
eb383413 323
b4fe2683
JM
324 if (x != EMPTY_ENTRY && x != DELETED_ENTRY)
325 {
e0f3df8f 326 PTR *q = find_empty_slot_for_expand (htab, (*htab->hash_f) (x));
eb383413 327
b4fe2683
JM
328 *q = x;
329 }
eb383413 330
b4fe2683
JM
331 p++;
332 }
333 while (p < olimit);
eb383413 334
b4fe2683 335 free (oentries);
99a4c1bd 336 return 1;
e2eaf477
ILT
337}
338
b4fe2683
JM
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
e0f3df8f 342PTR
b4fe2683
JM
343htab_find_with_hash (htab, element, hash)
344 htab_t htab;
e0f3df8f 345 const PTR element;
eb383413 346 hashval_t hash;
e2eaf477 347{
eb383413
L
348 unsigned int index;
349 hashval_t hash2;
b4fe2683 350 size_t size;
e0f3df8f 351 PTR entry;
e2eaf477 352
b4fe2683
JM
353 htab->searches++;
354 size = htab->size;
b4fe2683
JM
355 index = hash % size;
356
eb383413
L
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
b4fe2683 364 for (;;)
e2eaf477 365 {
b4fe2683
JM
366 htab->collisions++;
367 index += hash2;
368 if (index >= size)
369 index -= size;
eb383413
L
370
371 entry = htab->entries[index];
372 if (entry == EMPTY_ENTRY
373 || (entry != DELETED_ENTRY && (*htab->eq_f) (entry, element)))
374 return entry;
e2eaf477 375 }
b4fe2683
JM
376}
377
378/* Like htab_find_slot_with_hash, but compute the hash value from the
379 element. */
eb383413 380
e0f3df8f 381PTR
b4fe2683
JM
382htab_find (htab, element)
383 htab_t htab;
e0f3df8f 384 const PTR element;
b4fe2683
JM
385{
386 return htab_find_with_hash (htab, element, (*htab->hash_f) (element));
387}
388
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
99a4c1bd
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. */
b4fe2683 396
e0f3df8f 397PTR *
b4fe2683
JM
398htab_find_slot_with_hash (htab, element, hash, insert)
399 htab_t htab;
e0f3df8f 400 const PTR element;
eb383413
L
401 hashval_t hash;
402 enum insert_option insert;
b4fe2683 403{
e0f3df8f 404 PTR *first_deleted_slot;
eb383413
L
405 unsigned int index;
406 hashval_t hash2;
b4fe2683
JM
407 size_t size;
408
99a4c1bd
HPN
409 if (insert == INSERT && htab->size * 3 <= htab->n_elements * 4
410 && htab_expand (htab) == 0)
411 return NULL;
b4fe2683
JM
412
413 size = htab->size;
414 hash2 = 1 + hash % (size - 2);
415 index = hash % size;
416
e2eaf477 417 htab->searches++;
b4fe2683
JM
418 first_deleted_slot = NULL;
419
420 for (;;)
e2eaf477 421 {
e0f3df8f 422 PTR entry = htab->entries[index];
b4fe2683
JM
423 if (entry == EMPTY_ENTRY)
424 {
eb383413 425 if (insert == NO_INSERT)
b4fe2683
JM
426 return NULL;
427
428 htab->n_elements++;
429
430 if (first_deleted_slot)
e2eaf477 431 {
b4fe2683
JM
432 *first_deleted_slot = EMPTY_ENTRY;
433 return first_deleted_slot;
e2eaf477 434 }
b4fe2683
JM
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 }
eb383413
L
444 else if ((*htab->eq_f) (entry, element))
445 return &htab->entries[index];
b4fe2683
JM
446
447 htab->collisions++;
448 index += hash2;
449 if (index >= size)
450 index -= size;
e2eaf477 451 }
e2eaf477
ILT
452}
453
b4fe2683
JM
454/* Like htab_find_slot_with_hash, but compute the hash value from the
455 element. */
eb383413 456
e0f3df8f 457PTR *
b4fe2683
JM
458htab_find_slot (htab, element, insert)
459 htab_t htab;
e0f3df8f 460 const PTR element;
eb383413 461 enum insert_option insert;
b4fe2683
JM
462{
463 return htab_find_slot_with_hash (htab, element, (*htab->hash_f) (element),
464 insert);
465}
466
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. */
e2eaf477
ILT
470
471void
b4fe2683
JM
472htab_remove_elt (htab, element)
473 htab_t htab;
e0f3df8f 474 PTR element;
e2eaf477 475{
e0f3df8f 476 PTR *slot;
b4fe2683 477
eb383413 478 slot = htab_find_slot (htab, element, NO_INSERT);
b4fe2683
JM
479 if (*slot == EMPTY_ENTRY)
480 return;
481
482 if (htab->del_f)
483 (*htab->del_f) (*slot);
e2eaf477 484
b4fe2683
JM
485 *slot = DELETED_ENTRY;
486 htab->n_deleted++;
e2eaf477
ILT
487}
488
b4fe2683
JM
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. */
e2eaf477
ILT
492
493void
b4fe2683
JM
494htab_clear_slot (htab, slot)
495 htab_t htab;
e0f3df8f 496 PTR *slot;
e2eaf477
ILT
497{
498 if (slot < htab->entries || slot >= htab->entries + htab->size
499 || *slot == EMPTY_ENTRY || *slot == DELETED_ENTRY)
500 abort ();
eb383413 501
b4fe2683
JM
502 if (htab->del_f)
503 (*htab->del_f) (*slot);
eb383413 504
e2eaf477 505 *slot = DELETED_ENTRY;
b4fe2683 506 htab->n_deleted++;
e2eaf477
ILT
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
b4fe2683
JM
515htab_traverse (htab, callback, info)
516 htab_t htab;
517 htab_trav callback;
e0f3df8f 518 PTR info;
e2eaf477 519{
e0f3df8f
HPN
520 PTR *slot = htab->entries;
521 PTR *limit = slot + htab->size;
eb383413 522
b4fe2683
JM
523 do
524 {
e0f3df8f 525 PTR x = *slot;
eb383413 526
b4fe2683
JM
527 if (x != EMPTY_ENTRY && x != DELETED_ENTRY)
528 if (!(*callback) (slot, info))
529 break;
530 }
531 while (++slot < limit);
e2eaf477
ILT
532}
533
eb383413 534/* Return the current size of given hash table. */
e2eaf477
ILT
535
536size_t
b4fe2683
JM
537htab_size (htab)
538 htab_t htab;
e2eaf477
ILT
539{
540 return htab->size;
541}
542
eb383413 543/* Return the current number of elements in given hash table. */
e2eaf477
ILT
544
545size_t
b4fe2683
JM
546htab_elements (htab)
547 htab_t htab;
e2eaf477 548{
b4fe2683 549 return htab->n_elements - htab->n_deleted;
e2eaf477
ILT
550}
551
eb383413
L
552/* Return the fraction of fixed collisions during all work with given
553 hash table. */
e2eaf477 554
b4fe2683
JM
555double
556htab_collisions (htab)
557 htab_t htab;
e2eaf477 558{
eb383413 559 if (htab->searches == 0)
b4fe2683 560 return 0.0;
eb383413
L
561
562 return (double) htab->collisions / (double) htab->searches;
e2eaf477 563}
This page took 0.094111 seconds and 4 git commands to generate.