]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/coretypes.h
c: Refer more consistently to C23 not C2X
[thirdparty/gcc.git] / gcc / coretypes.h
CommitLineData
4977bab6 1/* GCC core type declarations.
aeee4812 2 Copyright (C) 2002-2023 Free Software Foundation, Inc.
4977bab6
ZW
3
4This file is part of GCC.
5
6GCC is free software; you can redistribute it and/or modify it under
7the terms of the GNU General Public License as published by the Free
9dcd6f09 8Software Foundation; either version 3, or (at your option) any later
4977bab6
ZW
9version.
10
11GCC is distributed in the hope that it will be useful, but WITHOUT ANY
12WARRANTY; without even the implied warranty of MERCHANTABILITY or
13FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14for more details.
15
748086b7
JJ
16Under Section 7 of GPL version 3, you are granted additional
17permissions described in the GCC Runtime Library Exception, version
183.1, as published by the Free Software Foundation.
19
20You should have received a copy of the GNU General Public License and
21a copy of the GCC Runtime Library Exception along with this program;
22see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
9dcd6f09 23<http://www.gnu.org/licenses/>. */
4977bab6
ZW
24
25/* Provide forward declarations of core types which are referred to by
26 most of the compiler. This allows header files to use these types
27 (e.g. in function prototypes) without concern for whether the full
28 definitions are visible. Some other declarations that need to be
29 universally visible are here, too.
30
31 In the context of tconfig.h, most of these have special definitions
32 which prevent them from being used except in further type
33 declarations. This is a kludge; the right thing is to avoid
34 including the "tm.h" header set in the context of tconfig.h, but
35 we're not there yet. */
36
37#ifndef GCC_CORETYPES_H
38#define GCC_CORETYPES_H
39
d1b38208 40#ifndef GTY
4977bab6 41#define GTY(x) /* nothing - marker for gengtype */
d1b38208 42#endif
4977bab6
ZW
43
44#ifndef USED_FOR_TARGET
45
a9243bfc
RB
46typedef int64_t gcov_type;
47typedef uint64_t gcov_type_unsigned;
4484a35a 48
54994253 49struct bitmap_obstack;
99b1c316
MS
50class bitmap_head;
51typedef class bitmap_head *bitmap;
52typedef const class bitmap_head *const_bitmap;
7a8cba34
SB
53struct simple_bitmap_def;
54typedef struct simple_bitmap_def *sbitmap;
55typedef const struct simple_bitmap_def *const_sbitmap;
4977bab6
ZW
56struct rtx_def;
57typedef struct rtx_def *rtx;
a57193e8 58typedef const struct rtx_def *const_rtx;
d21cefc2 59class scalar_mode;
501623d4 60class scalar_int_mode;
e386a52f 61class scalar_float_mode;
a97390bf 62class complex_mode;
b660eccf 63class fixed_size_mode;
490d0f6c 64template<typename> class opt_mode;
16d22000 65typedef opt_mode<scalar_mode> opt_scalar_mode;
501623d4 66typedef opt_mode<scalar_int_mode> opt_scalar_int_mode;
857c7b46 67typedef opt_mode<scalar_float_mode> opt_scalar_float_mode;
99b1c316 68template<typename> struct pod_mode;
382615c6 69typedef pod_mode<scalar_mode> scalar_mode_pod;
bf862c53 70typedef pod_mode<scalar_int_mode> scalar_int_mode_pod;
b660eccf 71typedef pod_mode<fixed_size_mode> fixed_size_mode_pod;
15f8d3ab
DM
72
73/* Subclasses of rtx_def, using indentation to show the class
6f983e60 74 hierarchy, along with the relevant invariant.
15f8d3ab 75 Where possible, keep this list in the same order as in rtl.def. */
99b1c316
MS
76struct rtx_def;
77 struct rtx_expr_list; /* GET_CODE (X) == EXPR_LIST */
78 struct rtx_insn_list; /* GET_CODE (X) == INSN_LIST */
79 struct rtx_sequence; /* GET_CODE (X) == SEQUENCE */
80 struct rtx_insn;
81 struct rtx_debug_insn; /* DEBUG_INSN_P (X) */
82 struct rtx_nonjump_insn; /* NONJUMP_INSN_P (X) */
83 struct rtx_jump_insn; /* JUMP_P (X) */
84 struct rtx_call_insn; /* CALL_P (X) */
85 struct rtx_jump_table_data; /* JUMP_TABLE_DATA_P (X) */
86 struct rtx_barrier; /* BARRIER_P (X) */
87 struct rtx_code_label; /* LABEL_P (X) */
88 struct rtx_note; /* NOTE_P (X) */
15f8d3ab 89
4977bab6
ZW
90struct rtvec_def;
91typedef struct rtvec_def *rtvec;
a57193e8 92typedef const struct rtvec_def *const_rtvec;
807e902e
KZ
93struct hwivec_def;
94typedef struct hwivec_def *hwivec;
95typedef const struct hwivec_def *const_hwivec;
4977bab6
ZW
96union tree_node;
97typedef union tree_node *tree;
7eba871a 98typedef const union tree_node *const_tree;
355fe088
TS
99struct gimple;
100typedef gimple *gimple_seq;
84562394 101struct gimple_stmt_iterator;
165b1f6a 102class code_helper;
538dd0b7 103
3e086a12
RE
104/* Forward declare rtx_code, so that we can use it in target hooks without
105 needing to pull in rtl.h. */
106enum rtx_code : unsigned;
107
538dd0b7
DM
108/* Forward decls for leaf gimple subclasses (for individual gimple codes).
109 Keep this in the same order as the corresponding codes in gimple.def. */
110
111struct gcond;
112struct gdebug;
113struct ggoto;
114struct glabel;
115struct gswitch;
116struct gassign;
117struct gasm;
118struct gcall;
119struct gtransaction;
120struct greturn;
121struct gbind;
122struct gcatch;
123struct geh_filter;
124struct geh_mnt;
125struct geh_else;
126struct gresx;
127struct geh_dispatch;
128struct gphi;
129struct gtry;
130struct gomp_atomic_load;
131struct gomp_atomic_store;
132struct gomp_continue;
133struct gomp_critical;
d9a6bd32 134struct gomp_ordered;
538dd0b7
DM
135struct gomp_for;
136struct gomp_parallel;
137struct gomp_task;
138struct gomp_sections;
139struct gomp_single;
140struct gomp_target;
141struct gomp_teams;
142
4df3629e
DM
143/* Subclasses of symtab_node, using indentation to show the class
144 hierarchy. */
145
99b1c316 146struct symtab_node;
4df3629e 147 struct cgraph_node;
99b1c316 148 struct varpool_node;
ff6686d2 149struct cgraph_edge;
4df3629e 150
d6b5193b
RS
151union section;
152typedef union section section;
46625112 153struct gcc_options;
ab442df7
MM
154struct cl_target_option;
155struct cl_optimization;
7a9bf9a4
JM
156struct cl_option;
157struct cl_decoded_option;
5f20c657 158struct cl_option_handlers;
8200cd97 159class diagnostic_context;
99b1c316 160class pretty_printer;
4bc1899b 161class diagnostic_event_id_t;
3ac6b5cf 162typedef const char * (*diagnostic_input_charset_callback)(const char *);
4977bab6 163
148909bc
RS
164template<typename T> struct array_traits;
165
166/* Provides a read-only bitmap view of a single integer bitmask or an
167 array of integer bitmasks, or of a wrapper around such bitmasks. */
168template<typename T, typename Traits = array_traits<T>,
169 bool has_constant_size = Traits::has_constant_size>
170class bitmap_view;
171
09e881c9
BE
172/* Address space number for named address space support. */
173typedef unsigned char addr_space_t;
174
175/* The value of addr_space_t that represents the generic address space. */
176#define ADDR_SPACE_GENERIC 0
177#define ADDR_SPACE_GENERIC_P(AS) ((AS) == ADDR_SPACE_GENERIC)
178
52bca999
SB
179/* The major intermediate representations of GCC. */
180enum ir_type {
181 IR_GIMPLE,
182 IR_RTL_CFGRTL,
183 IR_RTL_CFGLAYOUT
184};
185
e150159c
SS
186/* Provide forward struct declaration so that we don't have to include
187 all of cpplib.h whenever a random prototype includes a pointer.
5950c3c9
BE
188 Note that the cpp_reader and cpp_token typedefs remain part of
189 cpplib.h. */
e150159c
SS
190
191struct cpp_reader;
5950c3c9 192struct cpp_token;
e150159c 193
61b60ed0
ZW
194/* The thread-local storage model associated with a given VAR_DECL
195 or SYMBOL_REF. This isn't used much, but both trees and RTL refer
196 to it, so it's here. */
197enum tls_model {
c2f7fa15 198 TLS_MODEL_NONE,
feb60f03
NS
199 TLS_MODEL_EMULATED,
200 TLS_MODEL_REAL,
201 TLS_MODEL_GLOBAL_DYNAMIC = TLS_MODEL_REAL,
61b60ed0
ZW
202 TLS_MODEL_LOCAL_DYNAMIC,
203 TLS_MODEL_INITIAL_EXEC,
204 TLS_MODEL_LOCAL_EXEC
205};
206
28d8c680
AB
207/* Types of trampoline implementation. */
208enum trampoline_impl {
209 TRAMPOLINE_IMPL_STACK,
210 TRAMPOLINE_IMPL_HEAP
211};
212
c713ddc0
BS
213/* Types of ABI for an offload compiler. */
214enum offload_abi {
215 OFFLOAD_ABI_UNSET,
216 OFFLOAD_ABI_LP64,
217 OFFLOAD_ABI_ILP32
218};
219
22063dbc
ML
220/* Types of profile update methods. */
221enum profile_update {
222 PROFILE_UPDATE_SINGLE,
4d209853
ML
223 PROFILE_UPDATE_ATOMIC,
224 PROFILE_UPDATE_PREFER_ATOMIC
22063dbc
ML
225};
226
ea0b1252
ML
227/* Type of profile reproducibility methods. */
228enum profile_reproducibility {
229 PROFILE_REPRODUCIBILITY_SERIAL,
230 PROFILE_REPRODUCIBILITY_PARALLEL_RUNS,
231 PROFILE_REPRODUCIBILITY_MULTITHREADED
232};
233
5a99796b
ML
234/* Type of -fstack-protector-*. */
235enum stack_protector {
236 SPCT_FLAG_DEFAULT = 1,
237 SPCT_FLAG_ALL = 2,
238 SPCT_FLAG_STRONG = 3,
239 SPCT_FLAG_EXPLICIT = 4
240};
241
8234b0dc
EB
242/* Types of unwind/exception handling info that can be generated.
243 Note that a UI_TARGET (or larger) setting is considered to be
244 incompatible with -freorder-blocks-and-partition. */
6ba74c2d
RH
245
246enum unwind_info_type
247{
248 UI_NONE,
249 UI_SJLJ,
250 UI_DWARF2,
8234b0dc
EB
251 UI_SEH,
252 UI_TARGET
6ba74c2d
RH
253};
254
f16d3f39
JH
255/* Callgraph node profile representation. */
256enum node_frequency {
257 /* This function most likely won't be executed at all.
258 (set only when profile feedback is available or via function attribute). */
259 NODE_FREQUENCY_UNLIKELY_EXECUTED,
260 /* For functions that are known to be executed once (i.e. constructors, destructors
261 and main function. */
262 NODE_FREQUENCY_EXECUTED_ONCE,
263 /* The default value. */
264 NODE_FREQUENCY_NORMAL,
265 /* Optimize this function hard
266 (set only when profile feedback is available or via function attribute). */
267 NODE_FREQUENCY_HOT
268};
269
d95ab70a
RS
270/* Ways of optimizing code. */
271enum optimization_type {
272 /* Prioritize speed over size. */
273 OPTIMIZE_FOR_SPEED,
274
275 /* Only do things that are good for both size and speed. */
276 OPTIMIZE_FOR_BOTH,
277
278 /* Prioritize size over speed. */
279 OPTIMIZE_FOR_SIZE
280};
281
76b0cbf8
RS
282/* Enumerates a padding direction. */
283enum pad_direction {
284 /* No padding is required. */
285 PAD_NONE,
286
287 /* Insert padding above the data, i.e. at higher memeory addresses
288 when dealing with memory, and at the most significant end when
289 dealing with registers. */
290 PAD_UPWARD,
291
292 /* Insert padding below the data, i.e. at lower memeory addresses
293 when dealing with memory, and at the least significant end when
294 dealing with registers. */
295 PAD_DOWNWARD
296};
297
647a1567
RH
298/* Possible initialization status of a variable. When requested
299 by the user, this information is tracked and recorded in the DWARF
300 debug information, along with the variable's location. */
301enum var_init_status
302{
303 VAR_INIT_STATUS_UNKNOWN,
304 VAR_INIT_STATUS_UNINITIALIZED,
305 VAR_INIT_STATUS_INITIALIZED
306};
307
a8b85ce9
MG
308/* Names for the different levels of -Wstrict-overflow=N. The numeric
309 values here correspond to N. */
310enum warn_strict_overflow_code
311{
312 /* Overflow warning that should be issued with -Wall: a questionable
313 construct that is easy to avoid even when using macros. Example:
314 folding (x + CONSTANT > x) to 1. */
315 WARN_STRICT_OVERFLOW_ALL = 1,
316 /* Overflow warning about folding a comparison to a constant because
317 of undefined signed overflow, other than cases covered by
318 WARN_STRICT_OVERFLOW_ALL. Example: folding (abs (x) >= 0) to 1
319 (this is false when x == INT_MIN). */
320 WARN_STRICT_OVERFLOW_CONDITIONAL = 2,
321 /* Overflow warning about changes to comparisons other than folding
322 them to a constant. Example: folding (x + 1 > 1) to (x > 0). */
323 WARN_STRICT_OVERFLOW_COMPARISON = 3,
324 /* Overflow warnings not covered by the above cases. Example:
325 folding ((x * 10) / 5) to (x * 2). */
326 WARN_STRICT_OVERFLOW_MISC = 4,
327 /* Overflow warnings about reducing magnitude of constants in
328 comparison. Example: folding (x + 2 > y) to (x + 1 >= y). */
329 WARN_STRICT_OVERFLOW_MAGNITUDE = 5
330};
331
eee33510
AM
332/* The type of an alias set. Code currently assumes that variables of
333 this type can take the values 0 (the alias set which aliases
334 everything) and -1 (sometimes indicating that the alias set is
335 unknown, sometimes indicating a memory barrier) and -2 (indicating
336 that the alias set should be set to a unique value but has not been
337 set yet). */
338typedef int alias_set_type;
f16d3f39 339
99b1c316
MS
340class edge_def;
341typedef class edge_def *edge;
342typedef const class edge_def *const_edge;
a3710436
JH
343struct basic_block_def;
344typedef struct basic_block_def *basic_block;
345typedef const struct basic_block_def *const_basic_block;
10692477 346
fcb87c50
MM
347#if !defined (GENERATOR_FILE)
348# define OBSTACK_CHUNK_SIZE memory_block_pool::block_size
349# define obstack_chunk_alloc mempool_obstack_chunk_alloc
350# define obstack_chunk_free mempool_obstack_chunk_free
351#else
352# define OBSTACK_CHUNK_SIZE 0
353# define obstack_chunk_alloc xmalloc
354# define obstack_chunk_free free
355#endif
356
19a9ba64
AM
357#define gcc_obstack_init(OBSTACK) \
358 obstack_specify_allocation ((OBSTACK), OBSTACK_CHUNK_SIZE, 0, \
359 obstack_chunk_alloc, \
360 obstack_chunk_free)
10692477 361
a87cf97e
JR
362/* enum reg_class is target specific, so it should not appear in
363 target-independent code or interfaces, like the target hook declarations
364 in target.h. */
365typedef int reg_class_t;
366
05555c4a
DM
367class rtl_opt_pass;
368
369namespace gcc {
370 class context;
371}
372
ab23f5d9 373typedef std::pair <tree, tree> tree_pair;
ac2cfa6c 374typedef std::pair <const char *, int> string_int_pair;
ab23f5d9 375
4a4412b9
DM
376/* Define a name->value mapping. */
377template <typename ValueType>
378struct kv_pair
379{
380 const char *const name; /* the name of the value */
381 const ValueType value; /* the value of the name */
382};
383
4977bab6
ZW
384#else
385
386struct _dont_use_rtx_here_;
387struct _dont_use_rtvec_here_;
f3955ea3 388struct _dont_use_rtx_insn_here_;
4977bab6
ZW
389union _dont_use_tree_here_;
390#define rtx struct _dont_use_rtx_here_ *
a57193e8 391#define const_rtx struct _dont_use_rtx_here_ *
4977bab6 392#define rtvec struct _dont_use_rtvec_here *
a57193e8 393#define const_rtvec struct _dont_use_rtvec_here *
f3955ea3 394#define rtx_insn struct _dont_use_rtx_insn_here_
4977bab6 395#define tree union _dont_use_tree_here_ *
a57193e8 396#define const_tree union _dont_use_tree_here_ *
4977bab6 397
d21cefc2 398typedef struct scalar_mode scalar_mode;
501623d4 399typedef struct scalar_int_mode scalar_int_mode;
e386a52f 400typedef struct scalar_float_mode scalar_float_mode;
a97390bf 401typedef struct complex_mode complex_mode;
e386a52f 402
4977bab6
ZW
403#endif
404
d33d9e47
AI
405/* Classes of functions that compiler needs to check
406 whether they are present at the runtime or not. */
407enum function_class {
408 function_c94,
409 function_c99_misc,
410 function_c99_math_complex,
22869a37 411 function_sincos,
0fa00483 412 function_c11_misc,
094a609c 413 function_c23_misc
d33d9e47
AI
414};
415
2eff1470
AM
416/* Enumerate visibility settings. This is deliberately ordered from most
417 to least visibility. */
418enum symbol_visibility
419{
420 VISIBILITY_DEFAULT,
421 VISIBILITY_PROTECTED,
422 VISIBILITY_HIDDEN,
423 VISIBILITY_INTERNAL
424};
425
42e02b20
JG
426/* enums used by the targetm.excess_precision hook. */
427
428enum flt_eval_method
429{
430 FLT_EVAL_METHOD_UNPREDICTABLE = -1,
431 FLT_EVAL_METHOD_PROMOTE_TO_FLOAT = 0,
432 FLT_EVAL_METHOD_PROMOTE_TO_DOUBLE = 1,
433 FLT_EVAL_METHOD_PROMOTE_TO_LONG_DOUBLE = 2,
434 FLT_EVAL_METHOD_PROMOTE_TO_FLOAT16 = 16
435};
436
437enum excess_precision_type
438{
439 EXCESS_PRECISION_TYPE_IMPLICIT,
440 EXCESS_PRECISION_TYPE_STANDARD,
f19a3270 441 EXCESS_PRECISION_TYPE_FAST,
442 EXCESS_PRECISION_TYPE_FLOAT16
42e02b20
JG
443};
444
f20a6c57
JH
445/* Level of size optimization. */
446
447enum optimize_size_level
448{
449 /* Do not optimize for size. */
450 OPTIMIZE_SIZE_NO,
451 /* Optimize for size but not at extreme performance costs. */
452 OPTIMIZE_SIZE_BALANCED,
453 /* Optimize for size as much as possible. */
454 OPTIMIZE_SIZE_MAX
455};
456
0823efed 457/* Support for user-provided GGC and PCH markers. The first parameter
747380f4
JJ
458 is a pointer to a pointer, the second either NULL if the pointer to
459 pointer points into a GC object or the actual pointer address if
460 the first argument points to a temporary and the third a cookie. */
461typedef void (*gt_pointer_operator) (void *, void *, void *);
0823efed 462
9771b263
DN
463#if !defined (HAVE_UCHAR)
464typedef unsigned char uchar;
465#endif
4977bab6 466
b0e84cf7
RS
467/* Most source files will require the following headers. */
468#if !defined (USED_FOR_TARGET)
469#include "insn-modes.h"
ecb9f223
AM
470#include "signop.h"
471#include "wide-int.h"
b0e84cf7 472#include "wide-int-print.h"
e535b963
RS
473
474/* On targets that don't need polynomial offsets, target-specific code
475 should be able to treat poly_int like a normal constant, with a
476 conversion operator going from the former to the latter. We also
e53b6e56 477 allow this for gencondmd.cc for all targets, so that we can treat
e535b963
RS
478 machine_modes as enums without causing build failures. */
479#if (defined (IN_TARGET_CODE) \
480 && (defined (USE_ENUM_MODES) || NUM_POLY_INT_COEFFS == 1))
481#define POLY_INT_CONVERSION 1
482#else
483#define POLY_INT_CONVERSION 0
484#endif
485
486#include "poly-int.h"
487#include "poly-int-types.h"
b0e84cf7
RS
488#include "insn-modes-inline.h"
489#include "machmode.h"
ecb9f223 490#include "double-int.h"
e6de5335 491#include "align.h"
b0e84cf7
RS
492/* Most host source files will require the following headers. */
493#if !defined (GENERATOR_FILE)
1751a78e 494#include "iterator-utils.h"
ecb9f223
AM
495#include "real.h"
496#include "fixed-value.h"
13fdf2e2
AM
497#include "hash-table.h"
498#include "hash-set.h"
abb226c9
AM
499#include "input.h"
500#include "is-a.h"
fcb87c50 501#include "memory-block.h"
1a817418 502#include "dumpfile.h"
b0e84cf7 503#endif
13fdf2e2 504#endif /* GENERATOR_FILE && !USED_FOR_TARGET */
ecb9f223 505
9771b263 506#endif /* coretypes.h */