]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/hash-table.c
[Ada] Update headers
[thirdparty/gcc.git] / gcc / hash-table.c
CommitLineData
0823efed 1/* A type-safe hash table template.
8d9254fc 2 Copyright (C) 2012-2020 Free Software Foundation, Inc.
0823efed
DN
3 Contributed by Lawrence Crowl <crowl@google.com>
4
5This file is part of GCC.
6
7GCC is free software; you can redistribute it and/or modify it under
8the terms of the GNU General Public License as published by the Free
9Software Foundation; either version 3, or (at your option) any later
10version.
11
12GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13WARRANTY; without even the implied warranty of MERCHANTABILITY or
14FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
15for more details.
16
17You should have received a copy of the GNU General Public License
18along with GCC; see the file COPYING3. If not see
19<http://www.gnu.org/licenses/>. */
20
21
22/* This file implements a typed hash table.
23 The implementation borrows from libiberty's hashtab. */
24
13f447a3
RB
25#ifdef GENERATOR_FILE
26#include "bconfig.h"
27#else
0823efed 28#include "config.h"
13f447a3 29#endif
0823efed
DN
30#include "system.h"
31#include "coretypes.h"
32#include "hash-table.h"
33
0823efed
DN
34/* Table of primes and multiplicative inverses.
35
36 Note that these are not minimally reduced inverses. Unlike when generating
37 code to divide by a constant, we want to be able to use the same algorithm
38 all the time. All of these inverses (are implied to) have bit 32 set.
39
40 For the record, here's the function that computed the table; it's a
41 vastly simplified version of the function of the same name from gcc. */
42
0823efed
DN
43struct prime_ent const prime_tab[] = {
44 { 7, 0x24924925, 0x9999999b, 2 },
45 { 13, 0x3b13b13c, 0x745d1747, 3 },
46 { 31, 0x08421085, 0x1a7b9612, 4 },
47 { 61, 0x0c9714fc, 0x15b1e5f8, 5 },
48 { 127, 0x02040811, 0x0624dd30, 6 },
49 { 251, 0x05197f7e, 0x073260a5, 7 },
50 { 509, 0x01824366, 0x02864fc8, 8 },
51 { 1021, 0x00c0906d, 0x014191f7, 9 },
52 { 2039, 0x0121456f, 0x0161e69e, 10 },
53 { 4093, 0x00300902, 0x00501908, 11 },
54 { 8191, 0x00080041, 0x00180241, 12 },
55 { 16381, 0x000c0091, 0x00140191, 13 },
56 { 32749, 0x002605a5, 0x002a06e6, 14 },
57 { 65521, 0x000f00e2, 0x00110122, 15 },
58 { 131071, 0x00008001, 0x00018003, 16 },
59 { 262139, 0x00014002, 0x0001c004, 17 },
60 { 524287, 0x00002001, 0x00006001, 18 },
61 { 1048573, 0x00003001, 0x00005001, 19 },
62 { 2097143, 0x00004801, 0x00005801, 20 },
63 { 4194301, 0x00000c01, 0x00001401, 21 },
64 { 8388593, 0x00001e01, 0x00002201, 22 },
65 { 16777213, 0x00000301, 0x00000501, 23 },
66 { 33554393, 0x00001381, 0x00001481, 24 },
67 { 67108859, 0x00000141, 0x000001c1, 25 },
68 { 134217689, 0x000004e1, 0x00000521, 26 },
69 { 268435399, 0x00000391, 0x000003b1, 27 },
70 { 536870909, 0x00000019, 0x00000029, 28 },
71 { 1073741789, 0x0000008d, 0x00000095, 29 },
72 { 2147483647, 0x00000003, 0x00000007, 30 },
73 /* Avoid "decimal constant so large it is unsigned" for 4294967291. */
74 { 0xfffffffb, 0x00000006, 0x00000008, 31 }
75};
76
510c9192
ML
77/* Limit number of comparisons when calling hash_table<>::verify. */
78unsigned int hash_table_sanitize_eq_limit;
79
0823efed 80/* The following function returns an index into the above table of the
c89844e5 81 nearest prime number which is at least N, and near a power of two. */
0823efed
DN
82
83unsigned int
84hash_table_higher_prime_index (unsigned long n)
85{
86 unsigned int low = 0;
c3284718 87 unsigned int high = sizeof (prime_tab) / sizeof (prime_tab[0]);
0823efed
DN
88
89 while (low != high)
90 {
91 unsigned int mid = low + (high - low) / 2;
92 if (n > prime_tab[mid].prime)
93 low = mid + 1;
94 else
95 high = mid;
96 }
97
98 /* If we've run out of primes, abort. */
6db4bc6e 99 gcc_assert (n <= prime_tab[low].prime);
0823efed
DN
100
101 return low;
102}
103
d604907d
JM
104/* Return a reference to the lazily initialized hash-table usage description.
105 This needs to be a function rather than a simple global variable so that it
106 is reliably initialized before hash table variables in other files such as
107 sem_item::m_type_hash_cache. */
108mem_alloc_description<mem_usage>&
109hash_table_usage ()
110{
111 static mem_alloc_description<mem_usage> usage;
112 return usage;
113}
2d44c7de
ML
114
115/* Support function for statistics. */
116void dump_hash_table_loc_statistics (void)
117{
ca30789c
ML
118 if (!GATHER_STATISTICS)
119 return;
120
643e0a30 121 for (unsigned i = HASH_TABLE_ORIGIN; i <= HASH_SET_ORIGIN; i++)
2d44c7de
ML
122 {
123 mem_alloc_origin origin = (mem_alloc_origin) i;
d604907d 124 hash_table_usage ().dump (origin);
2d44c7de
ML
125 }
126}
27bb6f7c
ML
127
128/* Report a hash table checking error. */
129
130ATTRIBUTE_NORETURN ATTRIBUTE_COLD
131void
132hashtab_chk_error ()
133{
134 fprintf (stderr, "hash table checking failed: "
135 "equal operator returns true for a pair "
136 "of values with a different hash value\n");
137 gcc_unreachable ();
138}