11debfc3dSmrg /* A type-safe hash table template.
2*8feb0f0bSmrg Copyright (C) 2012-2020 Free Software Foundation, Inc.
31debfc3dSmrg Contributed by Lawrence Crowl <crowl@google.com>
41debfc3dSmrg
51debfc3dSmrg This file is part of GCC.
61debfc3dSmrg
71debfc3dSmrg GCC is free software; you can redistribute it and/or modify it under
81debfc3dSmrg the terms of the GNU General Public License as published by the Free
91debfc3dSmrg Software Foundation; either version 3, or (at your option) any later
101debfc3dSmrg version.
111debfc3dSmrg
121debfc3dSmrg GCC is distributed in the hope that it will be useful, but WITHOUT ANY
131debfc3dSmrg WARRANTY; without even the implied warranty of MERCHANTABILITY or
141debfc3dSmrg FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
151debfc3dSmrg for more details.
161debfc3dSmrg
171debfc3dSmrg You should have received a copy of the GNU General Public License
181debfc3dSmrg along with GCC; see the file COPYING3. If not see
191debfc3dSmrg <http://www.gnu.org/licenses/>. */
201debfc3dSmrg
211debfc3dSmrg
221debfc3dSmrg /* This file implements a typed hash table.
231debfc3dSmrg The implementation borrows from libiberty's hashtab. */
241debfc3dSmrg
251debfc3dSmrg #ifdef GENERATOR_FILE
261debfc3dSmrg #include "bconfig.h"
271debfc3dSmrg #else
281debfc3dSmrg #include "config.h"
291debfc3dSmrg #endif
301debfc3dSmrg #include "system.h"
311debfc3dSmrg #include "coretypes.h"
321debfc3dSmrg #include "hash-table.h"
331debfc3dSmrg
341debfc3dSmrg /* Table of primes and multiplicative inverses.
351debfc3dSmrg
361debfc3dSmrg Note that these are not minimally reduced inverses. Unlike when generating
371debfc3dSmrg code to divide by a constant, we want to be able to use the same algorithm
381debfc3dSmrg all the time. All of these inverses (are implied to) have bit 32 set.
391debfc3dSmrg
401debfc3dSmrg For the record, here's the function that computed the table; it's a
411debfc3dSmrg vastly simplified version of the function of the same name from gcc. */
421debfc3dSmrg
431debfc3dSmrg struct prime_ent const prime_tab[] = {
441debfc3dSmrg { 7, 0x24924925, 0x9999999b, 2 },
451debfc3dSmrg { 13, 0x3b13b13c, 0x745d1747, 3 },
461debfc3dSmrg { 31, 0x08421085, 0x1a7b9612, 4 },
471debfc3dSmrg { 61, 0x0c9714fc, 0x15b1e5f8, 5 },
481debfc3dSmrg { 127, 0x02040811, 0x0624dd30, 6 },
491debfc3dSmrg { 251, 0x05197f7e, 0x073260a5, 7 },
501debfc3dSmrg { 509, 0x01824366, 0x02864fc8, 8 },
511debfc3dSmrg { 1021, 0x00c0906d, 0x014191f7, 9 },
521debfc3dSmrg { 2039, 0x0121456f, 0x0161e69e, 10 },
531debfc3dSmrg { 4093, 0x00300902, 0x00501908, 11 },
541debfc3dSmrg { 8191, 0x00080041, 0x00180241, 12 },
551debfc3dSmrg { 16381, 0x000c0091, 0x00140191, 13 },
561debfc3dSmrg { 32749, 0x002605a5, 0x002a06e6, 14 },
571debfc3dSmrg { 65521, 0x000f00e2, 0x00110122, 15 },
581debfc3dSmrg { 131071, 0x00008001, 0x00018003, 16 },
591debfc3dSmrg { 262139, 0x00014002, 0x0001c004, 17 },
601debfc3dSmrg { 524287, 0x00002001, 0x00006001, 18 },
611debfc3dSmrg { 1048573, 0x00003001, 0x00005001, 19 },
621debfc3dSmrg { 2097143, 0x00004801, 0x00005801, 20 },
631debfc3dSmrg { 4194301, 0x00000c01, 0x00001401, 21 },
641debfc3dSmrg { 8388593, 0x00001e01, 0x00002201, 22 },
651debfc3dSmrg { 16777213, 0x00000301, 0x00000501, 23 },
661debfc3dSmrg { 33554393, 0x00001381, 0x00001481, 24 },
671debfc3dSmrg { 67108859, 0x00000141, 0x000001c1, 25 },
681debfc3dSmrg { 134217689, 0x000004e1, 0x00000521, 26 },
691debfc3dSmrg { 268435399, 0x00000391, 0x000003b1, 27 },
701debfc3dSmrg { 536870909, 0x00000019, 0x00000029, 28 },
711debfc3dSmrg { 1073741789, 0x0000008d, 0x00000095, 29 },
721debfc3dSmrg { 2147483647, 0x00000003, 0x00000007, 30 },
731debfc3dSmrg /* Avoid "decimal constant so large it is unsigned" for 4294967291. */
741debfc3dSmrg { 0xfffffffb, 0x00000006, 0x00000008, 31 }
751debfc3dSmrg };
761debfc3dSmrg
77*8feb0f0bSmrg /* Limit number of comparisons when calling hash_table<>::verify. */
78*8feb0f0bSmrg unsigned int hash_table_sanitize_eq_limit;
79*8feb0f0bSmrg
801debfc3dSmrg /* The following function returns an index into the above table of the
81*8feb0f0bSmrg nearest prime number which is at least N, and near a power of two. */
821debfc3dSmrg
831debfc3dSmrg unsigned int
hash_table_higher_prime_index(unsigned long n)841debfc3dSmrg hash_table_higher_prime_index (unsigned long n)
851debfc3dSmrg {
861debfc3dSmrg unsigned int low = 0;
871debfc3dSmrg unsigned int high = sizeof (prime_tab) / sizeof (prime_tab[0]);
881debfc3dSmrg
891debfc3dSmrg while (low != high)
901debfc3dSmrg {
911debfc3dSmrg unsigned int mid = low + (high - low) / 2;
921debfc3dSmrg if (n > prime_tab[mid].prime)
931debfc3dSmrg low = mid + 1;
941debfc3dSmrg else
951debfc3dSmrg high = mid;
961debfc3dSmrg }
971debfc3dSmrg
981debfc3dSmrg /* If we've run out of primes, abort. */
991debfc3dSmrg gcc_assert (n <= prime_tab[low].prime);
1001debfc3dSmrg
1011debfc3dSmrg return low;
1021debfc3dSmrg }
1031debfc3dSmrg
104c0a68be4Smrg /* Return a reference to the lazily initialized hash-table usage description.
105c0a68be4Smrg This needs to be a function rather than a simple global variable so that it
106c0a68be4Smrg is reliably initialized before hash table variables in other files such as
107c0a68be4Smrg sem_item::m_type_hash_cache. */
108c0a68be4Smrg mem_alloc_description<mem_usage>&
hash_table_usage()109c0a68be4Smrg hash_table_usage ()
110c0a68be4Smrg {
111c0a68be4Smrg static mem_alloc_description<mem_usage> usage;
112c0a68be4Smrg return usage;
113c0a68be4Smrg }
1141debfc3dSmrg
1151debfc3dSmrg /* Support function for statistics. */
dump_hash_table_loc_statistics(void)1161debfc3dSmrg void dump_hash_table_loc_statistics (void)
1171debfc3dSmrg {
1181debfc3dSmrg if (!GATHER_STATISTICS)
1191debfc3dSmrg return;
1201debfc3dSmrg
1211debfc3dSmrg for (unsigned i = HASH_TABLE_ORIGIN; i <= HASH_SET_ORIGIN; i++)
1221debfc3dSmrg {
1231debfc3dSmrg mem_alloc_origin origin = (mem_alloc_origin) i;
124c0a68be4Smrg hash_table_usage ().dump (origin);
1251debfc3dSmrg }
1261debfc3dSmrg }
127*8feb0f0bSmrg
128*8feb0f0bSmrg /* Report a hash table checking error. */
129*8feb0f0bSmrg
130*8feb0f0bSmrg ATTRIBUTE_NORETURN ATTRIBUTE_COLD
131*8feb0f0bSmrg void
hashtab_chk_error()132*8feb0f0bSmrg hashtab_chk_error ()
133*8feb0f0bSmrg {
134*8feb0f0bSmrg fprintf (stderr, "hash table checking failed: "
135*8feb0f0bSmrg "equal operator returns true for a pair "
136*8feb0f0bSmrg "of values with a different hash value\n");
137*8feb0f0bSmrg gcc_unreachable ();
138*8feb0f0bSmrg }
139