Mercurial > hg > CbC > CbC_gcc
annotate gcc/ggc.h @ 131:84e7813d76e9
gcc-8.2
author | mir3636 |
---|---|
date | Thu, 25 Oct 2018 07:37:49 +0900 |
parents | 04ced10e8804 |
children | 1830386684a0 |
rev | line source |
---|---|
0 | 1 /* Garbage collection for the GNU compiler. |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2 |
131 | 3 Copyright (C) 1998-2018 Free Software Foundation, Inc. |
0 | 4 |
5 This file is part of GCC. | |
6 | |
7 GCC is free software; you can redistribute it and/or modify it under | |
8 the terms of the GNU General Public License as published by the Free | |
9 Software Foundation; either version 3, or (at your option) any later | |
10 version. | |
11 | |
12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY | |
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
15 for more details. | |
16 | |
17 You should have received a copy of the GNU General Public License | |
18 along with GCC; see the file COPYING3. If not see | |
19 <http://www.gnu.org/licenses/>. */ | |
20 | |
21 #ifndef GCC_GGC_H | |
22 #define GCC_GGC_H | |
23 | |
24 /* Symbols are marked with `ggc' for `gcc gc' so as not to interfere with | |
25 an external gc library that might be linked in. */ | |
26 | |
27 /* Internal functions and data structures used by the GTY | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
28 machinery, including the generated gt*.[hc] files. */ |
0 | 29 |
30 #include "gtype-desc.h" | |
31 | |
32 /* One of these applies its third parameter (with cookie in the fourth | |
33 parameter) to each pointer in the object pointed to by the first | |
34 parameter, using the second parameter. */ | |
35 typedef void (*gt_note_pointers) (void *, void *, gt_pointer_operator, | |
36 void *); | |
37 | |
38 /* One of these is called before objects are re-ordered in memory. | |
39 The first parameter is the original object, the second is the | |
40 subobject that has had its pointers reordered, the third parameter | |
41 can compute the new values of a pointer when given the cookie in | |
42 the fourth parameter. */ | |
43 typedef void (*gt_handle_reorder) (void *, void *, gt_pointer_operator, | |
44 void *); | |
45 | |
46 /* Used by the gt_pch_n_* routines. Register an object in the hash table. */ | |
111 | 47 extern int gt_pch_note_object (void *, void *, gt_note_pointers); |
0 | 48 |
49 /* Used by the gt_pch_n_* routines. Register that an object has a reorder | |
50 function. */ | |
51 extern void gt_pch_note_reorder (void *, void *, gt_handle_reorder); | |
52 | |
111 | 53 /* generated function to clear caches in gc memory. */ |
54 extern void gt_clear_caches (); | |
55 | |
0 | 56 /* Mark the object in the first parameter and anything it points to. */ |
57 typedef void (*gt_pointer_walker) (void *); | |
58 | |
59 /* Structures for the easy way to mark roots. | |
60 In an array, terminated by having base == NULL. */ | |
61 struct ggc_root_tab { | |
62 void *base; | |
63 size_t nelt; | |
64 size_t stride; | |
65 gt_pointer_walker cb; | |
66 gt_pointer_walker pchw; | |
67 }; | |
68 #define LAST_GGC_ROOT_TAB { NULL, 0, 0, NULL, NULL } | |
69 /* Pointers to arrays of ggc_root_tab, terminated by NULL. */ | |
70 extern const struct ggc_root_tab * const gt_ggc_rtab[]; | |
71 extern const struct ggc_root_tab * const gt_ggc_deletable_rtab[]; | |
72 extern const struct ggc_root_tab * const gt_pch_scalar_rtab[]; | |
73 | |
74 /* If EXPR is not NULL and previously unmarked, mark it and evaluate | |
75 to true. Otherwise evaluate to false. */ | |
76 #define ggc_test_and_set_mark(EXPR) \ | |
77 ((EXPR) != NULL && ((void *) (EXPR)) != (void *) 1 && ! ggc_set_mark (EXPR)) | |
78 | |
79 #define ggc_mark(EXPR) \ | |
80 do { \ | |
81 const void *const a__ = (EXPR); \ | |
82 if (a__ != NULL && a__ != (void *) 1) \ | |
83 ggc_set_mark (a__); \ | |
84 } while (0) | |
85 | |
86 /* Actually set the mark on a particular region of memory, but don't | |
87 follow pointers. This function is called by ggc_mark_*. It | |
88 returns zero if the object was not previously marked; nonzero if | |
89 the object was already marked, or if, for any other reason, | |
90 pointers in this data structure should not be traversed. */ | |
91 extern int ggc_set_mark (const void *); | |
92 | |
93 /* Return 1 if P has been marked, zero otherwise. | |
94 P must have been allocated by the GC allocator; it mustn't point to | |
95 static objects, stack variables, or memory allocated with malloc. */ | |
96 extern int ggc_marked_p (const void *); | |
97 | |
98 /* PCH and GGC handling for strings, mostly trivial. */ | |
99 extern void gt_pch_n_S (const void *); | |
100 extern void gt_ggc_m_S (const void *); | |
101 | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
102 /* End of GTY machinery API. */ |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
103 |
0 | 104 /* Initialize the string pool. */ |
105 extern void init_stringpool (void); | |
106 | |
107 /* Initialize the garbage collector. */ | |
108 extern void init_ggc (void); | |
109 | |
110 /* When true, identifier nodes are considered as GC roots. When | |
111 false, identifier nodes are treated like any other GC-allocated | |
112 object, and the identifier hash table is treated as a weak | |
113 hash. */ | |
114 extern bool ggc_protect_identifiers; | |
115 | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
116 /* Write out all GCed objects to F. */ |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
117 extern void gt_pch_save (FILE *f); |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
118 |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
119 |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
120 /* Allocation. */ |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
121 |
0 | 122 /* The internal primitive. */ |
111 | 123 extern void *ggc_internal_alloc (size_t, void (*)(void *), size_t, |
124 size_t CXX_MEM_STAT_INFO) | |
125 ATTRIBUTE_MALLOC; | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
126 |
111 | 127 inline void * |
128 ggc_internal_alloc (size_t s CXX_MEM_STAT_INFO) | |
129 { | |
130 return ggc_internal_alloc (s, NULL, 0, 1 PASS_MEM_STAT); | |
131 } | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
132 |
111 | 133 extern size_t ggc_round_alloc_size (size_t requested_size); |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
134 |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
135 /* Allocates cleared memory. */ |
111 | 136 extern void *ggc_internal_cleared_alloc (size_t, void (*)(void *), |
137 size_t, size_t | |
138 CXX_MEM_STAT_INFO) ATTRIBUTE_MALLOC; | |
139 | |
140 inline void * | |
141 ggc_internal_cleared_alloc (size_t s CXX_MEM_STAT_INFO) | |
142 { | |
143 return ggc_internal_cleared_alloc (s, NULL, 0, 1 PASS_MEM_STAT); | |
144 } | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
145 |
0 | 146 /* Resize a block. */ |
111 | 147 extern void *ggc_realloc (void *, size_t CXX_MEM_STAT_INFO); |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
148 |
0 | 149 /* Free a block. To be used when known for certain it's not reachable. */ |
150 extern void ggc_free (void *); | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
151 |
0 | 152 extern void dump_ggc_loc_statistics (bool); |
153 | |
111 | 154 /* Reallocator. */ |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
155 #define GGC_RESIZEVEC(T, P, N) \ |
111 | 156 ((T *) ggc_realloc ((P), (N) * sizeof (T) MEM_STAT_INFO)) |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
157 |
111 | 158 template<typename T> |
159 void | |
160 finalize (void *p) | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
161 { |
111 | 162 static_cast<T *> (p)->~T (); |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
163 } |
0 | 164 |
111 | 165 template<typename T> |
166 inline bool | |
167 need_finalization_p () | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
168 { |
111 | 169 #if GCC_VERSION >= 4003 |
170 return !__has_trivial_destructor (T); | |
171 #else | |
172 return true; | |
173 #endif | |
174 } | |
175 | |
176 template<typename T> | |
177 inline T * | |
178 ggc_alloc (ALONE_CXX_MEM_STAT_INFO) | |
179 { | |
180 if (need_finalization_p<T> ()) | |
181 return static_cast<T *> (ggc_internal_alloc (sizeof (T), finalize<T>, 0, 1 | |
182 PASS_MEM_STAT)); | |
183 else | |
184 return static_cast<T *> (ggc_internal_alloc (sizeof (T), NULL, 0, 1 | |
185 PASS_MEM_STAT)); | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
186 } |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
187 |
111 | 188 template<typename T> |
189 inline T * | |
190 ggc_cleared_alloc (ALONE_CXX_MEM_STAT_INFO) | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
191 { |
111 | 192 if (need_finalization_p<T> ()) |
193 return static_cast<T *> (ggc_internal_cleared_alloc (sizeof (T), | |
194 finalize<T>, 0, 1 | |
195 PASS_MEM_STAT)); | |
196 else | |
197 return static_cast<T *> (ggc_internal_cleared_alloc (sizeof (T), NULL, 0, 1 | |
198 PASS_MEM_STAT)); | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
199 } |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
200 |
111 | 201 template<typename T> |
202 inline T * | |
203 ggc_vec_alloc (size_t c CXX_MEM_STAT_INFO) | |
204 { | |
205 if (need_finalization_p<T> ()) | |
206 return static_cast<T *> (ggc_internal_alloc (c * sizeof (T), finalize<T>, | |
207 sizeof (T), c PASS_MEM_STAT)); | |
208 else | |
209 return static_cast<T *> (ggc_internal_alloc (c * sizeof (T), NULL, 0, 0 | |
210 PASS_MEM_STAT)); | |
211 } | |
0 | 212 |
111 | 213 template<typename T> |
214 inline T * | |
215 ggc_cleared_vec_alloc (size_t c CXX_MEM_STAT_INFO) | |
216 { | |
217 if (need_finalization_p<T> ()) | |
218 return static_cast<T *> (ggc_internal_cleared_alloc (c * sizeof (T), | |
219 finalize<T>, | |
220 sizeof (T), c | |
221 PASS_MEM_STAT)); | |
222 else | |
223 return static_cast<T *> (ggc_internal_cleared_alloc (c * sizeof (T), NULL, | |
224 0, 0 PASS_MEM_STAT)); | |
225 } | |
0 | 226 |
111 | 227 inline void * |
228 ggc_alloc_atomic (size_t s CXX_MEM_STAT_INFO) | |
229 { | |
230 return ggc_internal_alloc (s PASS_MEM_STAT); | |
231 } | |
0 | 232 |
233 /* Allocate a gc-able string, and fill it with LENGTH bytes from CONTENTS. | |
234 If LENGTH is -1, then CONTENTS is assumed to be a | |
235 null-terminated string and the memory sized accordingly. */ | |
111 | 236 extern const char *ggc_alloc_string (const char *contents, int length |
237 CXX_MEM_STAT_INFO); | |
0 | 238 |
239 /* Make a copy of S, in GC-able memory. */ | |
111 | 240 #define ggc_strdup(S) ggc_alloc_string ((S), -1 MEM_STAT_INFO) |
0 | 241 |
242 /* Invoke the collector. Garbage collection occurs only when this | |
243 function is called, not during allocations. */ | |
244 extern void ggc_collect (void); | |
245 | |
111 | 246 /* Assume that all GGC memory is reachable and grow the limits for next collection. */ |
247 extern void ggc_grow (void); | |
248 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
249 /* Register an additional root table. This can be useful for some |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
250 plugins. Does nothing if the passed pointer is NULL. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
251 extern void ggc_register_root_tab (const struct ggc_root_tab *); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
252 |
0 | 253 /* Read objects previously saved with gt_pch_save from F. */ |
254 extern void gt_pch_restore (FILE *f); | |
255 | |
256 /* Statistics. */ | |
257 | |
258 /* Print allocation statistics. */ | |
259 extern void ggc_print_statistics (void); | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
260 |
0 | 261 extern void stringpool_statistics (void); |
262 | |
263 /* Heuristics. */ | |
264 extern void init_ggc_heuristics (void); | |
265 | |
111 | 266 #define ggc_alloc_rtvec_sized(NELT) \ |
267 (rtvec_def *) ggc_internal_alloc (sizeof (struct rtvec_def) \ | |
268 + ((NELT) - 1) * sizeof (rtx)) \ | |
0 | 269 |
111 | 270 /* Memory statistics passing versions of some allocators. Too few of them to |
271 make gengtype produce them, so just define the needed ones here. */ | |
272 inline struct rtx_def * | |
273 ggc_alloc_rtx_def_stat (size_t s CXX_MEM_STAT_INFO) | |
274 { | |
275 return (struct rtx_def *) ggc_internal_alloc (s PASS_MEM_STAT); | |
276 } | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
277 |
111 | 278 inline union tree_node * |
279 ggc_alloc_tree_node_stat (size_t s CXX_MEM_STAT_INFO) | |
280 { | |
281 return (union tree_node *) ggc_internal_alloc (s PASS_MEM_STAT); | |
282 } | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
283 |
111 | 284 inline union tree_node * |
285 ggc_alloc_cleared_tree_node_stat (size_t s CXX_MEM_STAT_INFO) | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
286 { |
111 | 287 return (union tree_node *) ggc_internal_cleared_alloc (s PASS_MEM_STAT); |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
288 } |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
289 |
111 | 290 inline gimple * |
291 ggc_alloc_cleared_gimple_statement_stat (size_t s CXX_MEM_STAT_INFO) | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
292 { |
111 | 293 return (gimple *) ggc_internal_cleared_alloc (s PASS_MEM_STAT); |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
294 } |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
295 |
111 | 296 inline void |
297 gt_ggc_mx (const char *s) | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
298 { |
111 | 299 ggc_test_and_set_mark (const_cast<char *> (s)); |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
300 } |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
301 |
111 | 302 inline void |
303 gt_pch_nx (const char *) | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
304 { |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
305 } |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
306 |
111 | 307 inline void |
308 gt_ggc_mx (int) | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
309 { |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
310 } |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
311 |
111 | 312 inline void |
313 gt_pch_nx (int) | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
314 { |
111 | 315 } |
316 | |
317 inline void | |
318 gt_pch_nx (unsigned int) | |
319 { | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
320 } |
0 | 321 |
322 #endif |