]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/ggc.h
PR testsuite/92016 - Excess errors in Wstringop-overflow-17.c
[thirdparty/gcc.git] / gcc / ggc.h
CommitLineData
05513b45 1/* Garbage collection for the GNU compiler.
740cd0be 2
fbd26352 3 Copyright (C) 1998-2019 Free Software Foundation, Inc.
05513b45 4
f12b58b3 5This file is part of GCC.
02e7a332 6
f12b58b3 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
8c4c00c1 9Software Foundation; either version 3, or (at your option) any later
f12b58b3 10version.
02e7a332 11
f12b58b3 12GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13WARRANTY; without even the implied warranty of MERCHANTABILITY or
02e7a332 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
8c4c00c1 18along with GCC; see the file COPYING3. If not see
19<http://www.gnu.org/licenses/>. */
05513b45 20
860251be 21#ifndef GCC_GGC_H
22#define GCC_GGC_H
23
05513b45 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
573aba85 27/* Internal functions and data structures used by the GTY
ba72912a 28 machinery, including the generated gt*.[hc] files. */
573aba85 29
573aba85 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. */
6ec1f4e0 35typedef void (*gt_note_pointers) (void *, void *, gt_pointer_operator,
36 void *);
573aba85 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. */
6ec1f4e0 43typedef void (*gt_handle_reorder) (void *, void *, gt_pointer_operator,
44 void *);
573aba85 45
46/* Used by the gt_pch_n_* routines. Register an object in the hash table. */
5cc13354 47extern int gt_pch_note_object (void *, void *, gt_note_pointers);
573aba85 48
6ec1f4e0 49/* Used by the gt_pch_n_* routines. Register that an object has a reorder
573aba85 50 function. */
6ec1f4e0 51extern void gt_pch_note_reorder (void *, void *, gt_handle_reorder);
573aba85 52
f863a586 53/* generated function to clear caches in gc memory. */
54extern void gt_clear_caches ();
55
573aba85 56/* Mark the object in the first parameter and anything it points to. */
6ec1f4e0 57typedef void (*gt_pointer_walker) (void *);
1f3233d1 58
3cfec666 59/* Structures for the easy way to mark roots.
e9efa031 60 In an array, terminated by having base == NULL. */
1f3233d1 61struct ggc_root_tab {
62 void *base;
63 size_t nelt;
64 size_t stride;
573aba85 65 gt_pointer_walker cb;
66 gt_pointer_walker pchw;
1f3233d1 67};
573aba85 68#define LAST_GGC_ROOT_TAB { NULL, 0, 0, NULL, NULL }
1f3233d1 69/* Pointers to arrays of ggc_root_tab, terminated by NULL. */
70extern const struct ggc_root_tab * const gt_ggc_rtab[];
71extern const struct ggc_root_tab * const gt_ggc_deletable_rtab[];
573aba85 72extern const struct ggc_root_tab * const gt_pch_scalar_rtab[];
1f3233d1 73
f7cb0e39 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) \
1f3233d1 77 ((EXPR) != NULL && ((void *) (EXPR)) != (void *) 1 && ! ggc_set_mark (EXPR))
f7cb0e39 78
71661611 79#define ggc_mark(EXPR) \
80 do { \
182b8a5c 81 const void *const a__ = (EXPR); \
1f3233d1 82 if (a__ != NULL && a__ != (void *) 1) \
71661611 83 ggc_set_mark (a__); \
84 } while (0)
85
573aba85 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
7ef5b942 88 returns zero if the object was not previously marked; nonzero if
573aba85 89 the object was already marked, or if, for any other reason,
90 pointers in this data structure should not be traversed. */
6ec1f4e0 91extern int ggc_set_mark (const void *);
573aba85 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. */
6ec1f4e0 96extern int ggc_marked_p (const void *);
573aba85 97
573aba85 98/* PCH and GGC handling for strings, mostly trivial. */
6ec1f4e0 99extern void gt_pch_n_S (const void *);
dfecde36 100extern void gt_ggc_m_S (const void *);
573aba85 101
ba72912a 102/* End of GTY machinery API. */
573aba85 103
ba72912a 104/* Initialize the string pool. */
105extern void init_stringpool (void);
106
a7dce381 107/* Initialize the garbage collector. */
6ec1f4e0 108extern void init_ggc (void);
05513b45 109
dfecde36 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. */
114extern bool ggc_protect_identifiers;
115
ba72912a 116/* Write out all GCed objects to F. */
117extern void gt_pch_save (FILE *f);
118
119\f
120/* Allocation. */
121
71661611 122/* The internal primitive. */
92f06184 123extern void *ggc_internal_alloc (size_t, void (*)(void *), size_t,
124 size_t CXX_MEM_STAT_INFO)
125 ATTRIBUTE_MALLOC;
126
b275f68e 127inline void *
128ggc_internal_alloc (size_t s CXX_MEM_STAT_INFO)
92f06184 129{
130 return ggc_internal_alloc (s, NULL, 0, 1 PASS_MEM_STAT);
131}
ba72912a 132
1ae3520e 133extern size_t ggc_round_alloc_size (size_t requested_size);
134
ba72912a 135/* Allocates cleared memory. */
92f06184 136extern void *ggc_internal_cleared_alloc (size_t, void (*)(void *),
137 size_t, size_t
138 CXX_MEM_STAT_INFO) ATTRIBUTE_MALLOC;
139
b275f68e 140inline void *
92f06184 141ggc_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}
ba72912a 145
1f3233d1 146/* Resize a block. */
881f903e 147extern void *ggc_realloc (void *, size_t CXX_MEM_STAT_INFO);
ba72912a 148
c4e03242 149/* Free a block. To be used when known for certain it's not reachable. */
150extern void ggc_free (void *);
48e1416a 151
51949610 152extern void dump_ggc_loc_statistics (bool);
71661611 153
881f903e 154/* Reallocator. */
ba72912a 155#define GGC_RESIZEVEC(T, P, N) \
881f903e 156 ((T *) ggc_realloc ((P), (N) * sizeof (T) MEM_STAT_INFO))
ba72912a 157
92f06184 158template<typename T>
159void
160finalize (void *p)
161{
162 static_cast<T *> (p)->~T ();
163}
164
165template<typename T>
b275f68e 166inline bool
92f06184 167need_finalization_p ()
168{
169#if GCC_VERSION >= 4003
170 return !__has_trivial_destructor (T);
171#else
172 return true;
173#endif
174}
175
25a27413 176template<typename T>
b275f68e 177inline T *
25a27413 178ggc_alloc (ALONE_CXX_MEM_STAT_INFO)
ba72912a 179{
92f06184 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));
ba72912a 186}
187
25a27413 188template<typename T>
b275f68e 189inline T *
25a27413 190ggc_cleared_alloc (ALONE_CXX_MEM_STAT_INFO)
191{
92f06184 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));
25a27413 199}
200
201template<typename T>
b275f68e 202inline T *
25a27413 203ggc_vec_alloc (size_t c CXX_MEM_STAT_INFO)
204{
92f06184 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
25a27413 210 PASS_MEM_STAT));
211}
212
213template<typename T>
b275f68e 214inline T *
25a27413 215ggc_cleared_vec_alloc (size_t c CXX_MEM_STAT_INFO)
ba72912a 216{
92f06184 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
25a27413 221 PASS_MEM_STAT));
92f06184 222 else
223 return static_cast<T *> (ggc_internal_cleared_alloc (c * sizeof (T), NULL,
224 0, 0 PASS_MEM_STAT));
ba72912a 225}
226
b275f68e 227inline void *
881f903e 228ggc_alloc_atomic (size_t s CXX_MEM_STAT_INFO)
ba72912a 229{
881f903e 230 return ggc_internal_alloc (s PASS_MEM_STAT);
ba72912a 231}
232
44acf429 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. */
881f903e 236extern const char *ggc_alloc_string (const char *contents, int length
237 CXX_MEM_STAT_INFO);
05513b45 238
a4e59c31 239/* Make a copy of S, in GC-able memory. */
881f903e 240#define ggc_strdup(S) ggc_alloc_string ((S), -1 MEM_STAT_INFO)
a4e59c31 241
3915b59e 242/* Invoke the collector. Garbage collection occurs only when this
243 function is called, not during allocations. */
6ec1f4e0 244extern void ggc_collect (void);
05513b45 245
474507cc 246/* Return unused memory pages to the system. */
247extern void ggc_trim (void);
248
4f78e0a8 249/* Assume that all GGC memory is reachable and grow the limits for next collection. */
250extern void ggc_grow (void);
251
740cd0be 252/* Register an additional root table. This can be useful for some
86b63696 253 plugins. Does nothing if the passed pointer is NULL. */
740cd0be 254extern void ggc_register_root_tab (const struct ggc_root_tab *);
255
573aba85 256/* Read objects previously saved with gt_pch_save from F. */
6ec1f4e0 257extern void gt_pch_restore (FILE *f);
573aba85 258\f
4e00b6fd 259/* Statistics. */
260
74647769 261/* Print allocation statistics. */
6ec1f4e0 262extern void ggc_print_statistics (void);
ba72912a 263
6ec1f4e0 264extern void stringpool_statistics (void);
7d83df95 265
266/* Heuristics. */
6ec1f4e0 267extern void init_ggc_heuristics (void);
860251be 268
5cc13354 269#define ggc_alloc_rtvec_sized(NELT) \
25a27413 270 (rtvec_def *) ggc_internal_alloc (sizeof (struct rtvec_def) \
5cc13354 271 + ((NELT) - 1) * sizeof (rtx)) \
1bb42c87 272
ba72912a 273/* Memory statistics passing versions of some allocators. Too few of them to
274 make gengtype produce them, so just define the needed ones here. */
b275f68e 275inline struct rtx_def *
881f903e 276ggc_alloc_rtx_def_stat (size_t s CXX_MEM_STAT_INFO)
ba72912a 277{
881f903e 278 return (struct rtx_def *) ggc_internal_alloc (s PASS_MEM_STAT);
ba72912a 279}
280
b275f68e 281inline union tree_node *
881f903e 282ggc_alloc_tree_node_stat (size_t s CXX_MEM_STAT_INFO)
ba72912a 283{
881f903e 284 return (union tree_node *) ggc_internal_alloc (s PASS_MEM_STAT);
ba72912a 285}
286
b275f68e 287inline union tree_node *
881f903e 288ggc_alloc_cleared_tree_node_stat (size_t s CXX_MEM_STAT_INFO)
ba72912a 289{
881f903e 290 return (union tree_node *) ggc_internal_cleared_alloc (s PASS_MEM_STAT);
ba72912a 291}
292
b275f68e 293inline gimple *
881f903e 294ggc_alloc_cleared_gimple_statement_stat (size_t s CXX_MEM_STAT_INFO)
ba72912a 295{
42acab1c 296 return (gimple *) ggc_internal_cleared_alloc (s PASS_MEM_STAT);
ba72912a 297}
298
b275f68e 299inline void
8f359205 300gt_ggc_mx (const char *s)
301{
302 ggc_test_and_set_mark (const_cast<char *> (s));
303}
304
b275f68e 305inline void
8f359205 306gt_pch_nx (const char *)
307{
308}
309
b275f68e 310inline void
8f359205 311gt_ggc_mx (int)
312{
313}
314
b275f68e 315inline void
8f359205 316gt_pch_nx (int)
317{
318}
319
b275f68e 320inline void
2ef51f0e 321gt_pch_nx (unsigned int)
322{
323}
324
860251be 325#endif