1 | /* Garbage collection for the GNU compiler. |
---|---|
2 | |
3 | Copyright (C) 1998-2024 Free Software Foundation, Inc. |
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 |
28 | machinery, including the generated gt*.[hc] files. */ |
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. */ |
47 | extern int gt_pch_note_object (void *, void *, gt_note_pointers, |
48 | size_t length_override = (size_t)-1); |
49 | |
50 | /* Used by the gt_pch_p_* routines. Register address of a callback |
51 | pointer. */ |
52 | extern void gt_pch_note_callback (void *, void *); |
53 | |
54 | /* Used by the gt_pch_n_* routines. Register that an object has a reorder |
55 | function. */ |
56 | extern void gt_pch_note_reorder (void *, void *, gt_handle_reorder); |
57 | |
58 | /* generated function to clear caches in gc memory. */ |
59 | extern void gt_clear_caches (); |
60 | |
61 | /* Mark the object in the first parameter and anything it points to. */ |
62 | typedef void (*gt_pointer_walker) (void *); |
63 | |
64 | /* Structures for the easy way to mark roots. |
65 | In an array, terminated by having base == NULL. */ |
66 | struct ggc_root_tab { |
67 | void *base; |
68 | size_t nelt; |
69 | size_t stride; |
70 | gt_pointer_walker cb; |
71 | gt_pointer_walker pchw; |
72 | }; |
73 | #define LAST_GGC_ROOT_TAB { NULL, 0, 0, NULL, NULL } |
74 | /* Pointers to arrays of ggc_root_tab, terminated by NULL. */ |
75 | extern const struct ggc_root_tab * const gt_ggc_rtab[]; |
76 | extern const struct ggc_root_tab * const gt_ggc_deletable_rtab[]; |
77 | extern const struct ggc_root_tab * const gt_pch_scalar_rtab[]; |
78 | |
79 | /* If EXPR is not NULL and previously unmarked, mark it and evaluate |
80 | to true. Otherwise evaluate to false. */ |
81 | #define ggc_test_and_set_mark(EXPR) \ |
82 | ((EXPR) != NULL && ((void *) (EXPR)) != (void *) 1 && ! ggc_set_mark (EXPR)) |
83 | |
84 | #define ggc_mark(EXPR) \ |
85 | do { \ |
86 | const void *const a__ = (EXPR); \ |
87 | if (a__ != NULL && a__ != (void *) 1) \ |
88 | ggc_set_mark (a__); \ |
89 | } while (0) |
90 | |
91 | /* Actually set the mark on a particular region of memory, but don't |
92 | follow pointers. This function is called by ggc_mark_*. It |
93 | returns false if the object was not previously marked; true if |
94 | the object was already marked, or if, for any other reason, |
95 | pointers in this data structure should not be traversed. */ |
96 | extern bool ggc_set_mark (const void *); |
97 | |
98 | /* Return true if P has been marked, zero otherwise. |
99 | P must have been allocated by the GC allocator; it mustn't point to |
100 | static objects, stack variables, or memory allocated with malloc. */ |
101 | extern bool ggc_marked_p (const void *); |
102 | |
103 | /* PCH and GGC handling for strings, mostly trivial. */ |
104 | extern void gt_pch_n_S (const void *); |
105 | extern void gt_pch_n_S2 (const void *, size_t); |
106 | extern void gt_ggc_m_S (const void *); |
107 | |
108 | /* End of GTY machinery API. */ |
109 | |
110 | /* Initialize the string pool. */ |
111 | extern void init_stringpool (void); |
112 | |
113 | /* Initialize the garbage collector. */ |
114 | extern void init_ggc (void); |
115 | |
116 | /* When true, identifier nodes are considered as GC roots. When |
117 | false, identifier nodes are treated like any other GC-allocated |
118 | object, and the identifier hash table is treated as a weak |
119 | hash. */ |
120 | extern bool ggc_protect_identifiers; |
121 | |
122 | /* Write out all GCed objects to F. */ |
123 | extern void gt_pch_save (FILE *f); |
124 | |
125 | |
126 | /* Allocation. */ |
127 | |
128 | /* The internal primitive. */ |
129 | extern void *ggc_internal_alloc (size_t, void (*)(void *), size_t, |
130 | size_t CXX_MEM_STAT_INFO) |
131 | ATTRIBUTE_MALLOC; |
132 | |
133 | inline void * |
134 | ggc_internal_alloc (size_t s CXX_MEM_STAT_INFO) |
135 | { |
136 | return ggc_internal_alloc (s, NULL, 0, 1 PASS_MEM_STAT); |
137 | } |
138 | |
139 | extern size_t ggc_round_alloc_size (size_t requested_size); |
140 | |
141 | /* Allocates cleared memory. */ |
142 | extern void *ggc_internal_cleared_alloc (size_t, void (*)(void *), |
143 | size_t, size_t |
144 | CXX_MEM_STAT_INFO) ATTRIBUTE_MALLOC; |
145 | |
146 | inline void * |
147 | ggc_internal_cleared_alloc (size_t s CXX_MEM_STAT_INFO) |
148 | { |
149 | return ggc_internal_cleared_alloc (s, NULL, 0, 1 PASS_MEM_STAT); |
150 | } |
151 | |
152 | /* Resize a block. */ |
153 | extern void *ggc_realloc (void *, size_t CXX_MEM_STAT_INFO); |
154 | |
155 | /* Free a block. To be used when known for certain it's not reachable. */ |
156 | extern void ggc_free (void *); |
157 | |
158 | extern void dump_ggc_loc_statistics (); |
159 | |
160 | /* Reallocator. */ |
161 | #define GGC_RESIZEVEC(T, P, N) \ |
162 | ((T *) ggc_realloc ((P), (N) * sizeof (T) MEM_STAT_INFO)) |
163 | |
164 | template<typename T> |
165 | void |
166 | finalize (void *p) |
167 | { |
168 | static_cast<T *> (p)->~T (); |
169 | } |
170 | |
171 | template<typename T> |
172 | inline bool |
173 | need_finalization_p () |
174 | { |
175 | #if GCC_VERSION >= 4003 |
176 | return !__has_trivial_destructor (T); |
177 | #else |
178 | return true; |
179 | #endif |
180 | } |
181 | |
182 | template<typename T> |
183 | inline T * |
184 | ggc_alloc (ALONE_CXX_MEM_STAT_INFO) |
185 | { |
186 | if (need_finalization_p<T> ()) |
187 | return static_cast<T *> (ggc_internal_alloc (sizeof (T), finalize<T>, 0, 1 |
188 | PASS_MEM_STAT)); |
189 | else |
190 | return static_cast<T *> (ggc_internal_alloc (sizeof (T), NULL, 0, 1 |
191 | PASS_MEM_STAT)); |
192 | } |
193 | |
194 | /* GGC allocation function that does not call finalizer for type |
195 | that have need_finalization_p equal to true. User is responsible |
196 | for calling of the destructor. */ |
197 | |
198 | template<typename T> |
199 | inline T * |
200 | ggc_alloc_no_dtor (ALONE_CXX_MEM_STAT_INFO) |
201 | { |
202 | return static_cast<T *> (ggc_internal_alloc (sizeof (T), NULL, 0, 1 |
203 | PASS_MEM_STAT)); |
204 | } |
205 | |
206 | template<typename T> |
207 | inline T * |
208 | ggc_cleared_alloc (ALONE_CXX_MEM_STAT_INFO) |
209 | { |
210 | if (need_finalization_p<T> ()) |
211 | return static_cast<T *> (ggc_internal_cleared_alloc (sizeof (T), |
212 | finalize<T>, 0, 1 |
213 | PASS_MEM_STAT)); |
214 | else |
215 | return static_cast<T *> (ggc_internal_cleared_alloc (sizeof (T), NULL, 0, 1 |
216 | PASS_MEM_STAT)); |
217 | } |
218 | |
219 | template<typename T> |
220 | inline T * |
221 | ggc_vec_alloc (size_t c CXX_MEM_STAT_INFO) |
222 | { |
223 | if (need_finalization_p<T> ()) |
224 | return static_cast<T *> (ggc_internal_alloc (c * sizeof (T), finalize<T>, |
225 | sizeof (T), c PASS_MEM_STAT)); |
226 | else |
227 | return static_cast<T *> (ggc_internal_alloc (c * sizeof (T), NULL, 0, 0 |
228 | PASS_MEM_STAT)); |
229 | } |
230 | |
231 | template<typename T> |
232 | inline T * |
233 | ggc_cleared_vec_alloc (size_t c CXX_MEM_STAT_INFO) |
234 | { |
235 | if (need_finalization_p<T> ()) |
236 | return static_cast<T *> (ggc_internal_cleared_alloc (c * sizeof (T), |
237 | finalize<T>, |
238 | sizeof (T), c |
239 | PASS_MEM_STAT)); |
240 | else |
241 | return static_cast<T *> (ggc_internal_cleared_alloc (c * sizeof (T), NULL, |
242 | 0, 0 PASS_MEM_STAT)); |
243 | } |
244 | |
245 | inline void * |
246 | ggc_alloc_atomic (size_t s CXX_MEM_STAT_INFO) |
247 | { |
248 | return ggc_internal_alloc (s PASS_MEM_STAT); |
249 | } |
250 | |
251 | /* Call destructor and free the garbage collected memory. */ |
252 | |
253 | template <typename T> |
254 | inline void |
255 | ggc_delete (T *ptr) |
256 | { |
257 | ptr->~T (); |
258 | ggc_free (ptr); |
259 | } |
260 | |
261 | /* Allocate a gc-able string, and fill it with LENGTH bytes from CONTENTS. |
262 | If LENGTH is -1, then CONTENTS is assumed to be a |
263 | null-terminated string and the memory sized accordingly. */ |
264 | extern const char *ggc_alloc_string (const char *contents, int length |
265 | CXX_MEM_STAT_INFO); |
266 | |
267 | /* Make a copy of S, in GC-able memory. */ |
268 | #define ggc_strdup(S) ggc_alloc_string ((S), -1 MEM_STAT_INFO) |
269 | |
270 | /* Invoke the collector. Garbage collection occurs only when this |
271 | function is called, not during allocations. */ |
272 | enum ggc_collect { |
273 | GGC_COLLECT_HEURISTIC, |
274 | GGC_COLLECT_FORCE |
275 | }; |
276 | extern void ggc_collect (enum ggc_collect mode = GGC_COLLECT_HEURISTIC); |
277 | |
278 | /* Return unused memory pages to the system. */ |
279 | extern void ggc_trim (void); |
280 | |
281 | /* Assume that all GGC memory is reachable and grow the limits for next collection. */ |
282 | extern void ggc_grow (void); |
283 | |
284 | /* Register an additional root table. This can be useful for some |
285 | plugins. Does nothing if the passed pointer is NULL. */ |
286 | extern void ggc_register_root_tab (const struct ggc_root_tab *); |
287 | |
288 | /* Read objects previously saved with gt_pch_save from F. */ |
289 | extern void gt_pch_restore (FILE *f); |
290 | |
291 | /* Statistics. */ |
292 | |
293 | /* Print allocation statistics. */ |
294 | extern void ggc_print_statistics (void); |
295 | |
296 | extern void stringpool_statistics (void); |
297 | |
298 | /* Heuristics. */ |
299 | extern void init_ggc_heuristics (void); |
300 | |
301 | /* Report current heap memory use to stderr. */ |
302 | extern void report_heap_memory_use (void); |
303 | |
304 | #define ggc_alloc_rtvec_sized(NELT) \ |
305 | (rtvec_def *) ggc_internal_alloc (sizeof (struct rtvec_def) \ |
306 | + ((NELT) - 1) * sizeof (rtx)) \ |
307 | |
308 | /* Memory statistics passing versions of some allocators. Too few of them to |
309 | make gengtype produce them, so just define the needed ones here. */ |
310 | inline struct rtx_def * |
311 | ggc_alloc_rtx_def_stat (size_t s CXX_MEM_STAT_INFO) |
312 | { |
313 | return (struct rtx_def *) ggc_internal_alloc (s PASS_MEM_STAT); |
314 | } |
315 | |
316 | inline union tree_node * |
317 | ggc_alloc_tree_node_stat (size_t s CXX_MEM_STAT_INFO) |
318 | { |
319 | return (union tree_node *) ggc_internal_alloc (s PASS_MEM_STAT); |
320 | } |
321 | |
322 | inline union tree_node * |
323 | ggc_alloc_cleared_tree_node_stat (size_t s CXX_MEM_STAT_INFO) |
324 | { |
325 | return (union tree_node *) ggc_internal_cleared_alloc (s PASS_MEM_STAT); |
326 | } |
327 | |
328 | inline gimple * |
329 | ggc_alloc_cleared_gimple_statement_stat (size_t s CXX_MEM_STAT_INFO) |
330 | { |
331 | return (gimple *) ggc_internal_cleared_alloc (s PASS_MEM_STAT); |
332 | } |
333 | |
334 | inline void |
335 | gt_ggc_mx (const char *s) |
336 | { |
337 | ggc_test_and_set_mark (const_cast<char *> (s)); |
338 | } |
339 | |
340 | inline void |
341 | gt_pch_nx (const char *) |
342 | { |
343 | } |
344 | |
345 | inline void gt_pch_nx (bool) { } |
346 | inline void gt_pch_nx (char) { } |
347 | inline void gt_pch_nx (signed char) { } |
348 | inline void gt_pch_nx (unsigned char) { } |
349 | inline void gt_pch_nx (short) { } |
350 | inline void gt_pch_nx (unsigned short) { } |
351 | inline void gt_pch_nx (int) { } |
352 | inline void gt_pch_nx (unsigned int) { } |
353 | inline void gt_pch_nx (long int) { } |
354 | inline void gt_pch_nx (unsigned long int) { } |
355 | inline void gt_pch_nx (long long int) { } |
356 | inline void gt_pch_nx (unsigned long long int) { } |
357 | |
358 | inline void gt_ggc_mx (bool) { } |
359 | inline void gt_ggc_mx (char) { } |
360 | inline void gt_ggc_mx (signed char) { } |
361 | inline void gt_ggc_mx (unsigned char) { } |
362 | inline void gt_ggc_mx (short) { } |
363 | inline void gt_ggc_mx (unsigned short) { } |
364 | inline void gt_ggc_mx (int) { } |
365 | inline void gt_ggc_mx (unsigned int) { } |
366 | inline void gt_ggc_mx (long int) { } |
367 | inline void gt_ggc_mx (unsigned long int) { } |
368 | inline void gt_ggc_mx (long long int) { } |
369 | inline void gt_ggc_mx (unsigned long long int) { } |
370 | |
371 | extern void ggc_common_finalize (); |
372 | |
373 | #endif |
374 |
Definitions
- ggc_root_tab
- ggc_internal_alloc
- ggc_internal_cleared_alloc
- finalize
- need_finalization_p
- ggc_alloc
- ggc_alloc_no_dtor
- ggc_cleared_alloc
- ggc_vec_alloc
- ggc_cleared_vec_alloc
- ggc_alloc_atomic
- ggc_delete
- ggc_collect
- ggc_alloc_rtx_def_stat
- ggc_alloc_tree_node_stat
- ggc_alloc_cleared_tree_node_stat
- ggc_alloc_cleared_gimple_statement_stat
- gt_ggc_mx
- gt_pch_nx
- gt_pch_nx
- gt_pch_nx
- gt_pch_nx
- gt_pch_nx
- gt_pch_nx
- gt_pch_nx
- gt_pch_nx
- gt_pch_nx
- gt_pch_nx
- gt_pch_nx
- gt_pch_nx
- gt_pch_nx
- gt_ggc_mx
- gt_ggc_mx
- gt_ggc_mx
- gt_ggc_mx
- gt_ggc_mx
- gt_ggc_mx
- gt_ggc_mx
- gt_ggc_mx
- gt_ggc_mx
- gt_ggc_mx
- gt_ggc_mx
Update your C++ knowledge – Modern C++11/14/17 Training
Find out more