annotate gcc/hash-table.c @ 158:494b0b89df80 default tip

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