xref: /netbsd-src/external/gpl3/gcc.old/dist/gcc/hash-table.c (revision 8feb0f0b7eaff0608f8350bbfa3098827b4bb91b)
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