1/* GCC core type declarations.
2 Copyright (C) 2002-2026 Free Software Foundation, Inc.
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
8Software Foundation; either version 3, or (at your option) any later
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
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
23<http://www.gnu.org/licenses/>. */
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
40#ifndef GTY
41#define GTY(x) /* nothing - marker for gengtype */
42#endif
43
44#ifndef USED_FOR_TARGET
45
46typedef int64_t gcov_type;
47typedef uint64_t gcov_type_unsigned;
48
49struct bitmap_obstack;
50class bitmap_head;
51typedef class bitmap_head *bitmap;
52typedef const class bitmap_head *const_bitmap;
53struct simple_bitmap_def;
54typedef struct simple_bitmap_def *sbitmap;
55typedef const struct simple_bitmap_def *const_sbitmap;
56struct rtx_def;
57typedef struct rtx_def *rtx;
58typedef const struct rtx_def *const_rtx;
59class scalar_mode;
60class scalar_int_mode;
61class scalar_float_mode;
62class complex_mode;
63class fixed_size_mode;
64template<typename> class opt_mode;
65typedef opt_mode<scalar_mode> opt_scalar_mode;
66typedef opt_mode<scalar_int_mode> opt_scalar_int_mode;
67typedef opt_mode<scalar_float_mode> opt_scalar_float_mode;
68template<typename> struct pod_mode;
69typedef pod_mode<scalar_mode> scalar_mode_pod;
70typedef pod_mode<scalar_int_mode> scalar_int_mode_pod;
71typedef pod_mode<fixed_size_mode> fixed_size_mode_pod;
72
73/* Subclasses of rtx_def, using indentation to show the class
74 hierarchy, along with the relevant invariant.
75 Where possible, keep this list in the same order as in rtl.def. */
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) */
89
90struct rtvec_def;
91typedef struct rtvec_def *rtvec;
92typedef const struct rtvec_def *const_rtvec;
93struct hwivec_def;
94typedef struct hwivec_def *hwivec;
95typedef const struct hwivec_def *const_hwivec;
96union tree_node;
97typedef union tree_node *tree;
98typedef const union tree_node *const_tree;
99struct gimple;
100typedef gimple *gimple_seq;
101struct gimple_stmt_iterator;
102class code_helper;
103enum tree_index : unsigned;
104
105/* Forward declare rtx_code, so that we can use it in target hooks without
106 needing to pull in rtl.h. */
107enum rtx_code : unsigned;
108
109/* Forward decls for leaf gimple subclasses (for individual gimple codes).
110 Keep this in the same order as the corresponding codes in gimple.def. */
111
112struct gcond;
113struct gdebug;
114struct ggoto;
115struct glabel;
116struct gswitch;
117struct gassign;
118struct gasm;
119struct gcall;
120struct gtransaction;
121struct greturn;
122struct gbind;
123struct gcatch;
124struct geh_filter;
125struct geh_mnt;
126struct geh_else;
127struct gresx;
128struct geh_dispatch;
129struct gphi;
130struct gtry;
131struct gomp_atomic_load;
132struct gomp_atomic_store;
133struct gomp_continue;
134struct gomp_critical;
135struct gomp_ordered;
136struct gomp_for;
137struct gomp_parallel;
138struct gomp_task;
139struct gomp_sections;
140struct gomp_single;
141struct gomp_target;
142struct gomp_teams;
143
144/* Forward declaration of CFI's and DWARF's types. */
145struct dw_cfi_node;
146using dw_cfi_ref = struct dw_cfi_node *;
147enum dw_cfi_oprnd_type: int;
148enum dwarf_call_frame_info: int;
149
150/* Subclasses of toplevel_node, using indentation to show the class
151 hierarchy. */
152
153struct toplevel_node;
154 struct asm_node;
155 struct symtab_node;
156 struct cgraph_node;
157 struct varpool_node;
158struct cgraph_edge;
159
160union section;
161typedef union section section;
162struct gcc_options;
163struct cl_target_option;
164struct cl_optimization;
165struct cl_option;
166struct cl_decoded_option;
167struct cl_option_handlers;
168class rich_location;
169namespace diagnostics {
170 class context;
171 class text_sink;
172} // namespace diagnostics
173class pretty_printer;
174class diagnostic_event_id_t;
175typedef const char * (*diagnostic_input_charset_callback)(const char *);
176namespace pp_markup { class element; }
177typedef pp_markup::element pp_element;
178
179template<typename T> struct array_traits;
180
181/* Provides a read-only bitmap view of a single integer bitmask or an
182 array of integer bitmasks, or of a wrapper around such bitmasks. */
183template<typename T, typename Traits = array_traits<T>,
184 bool has_constant_size = Traits::has_constant_size>
185class bitmap_view;
186
187/* Address space number for named address space support. */
188typedef unsigned char addr_space_t;
189
190/* The value of addr_space_t that represents the generic address space. */
191#define ADDR_SPACE_GENERIC 0
192#define ADDR_SPACE_GENERIC_P(AS) ((AS) == ADDR_SPACE_GENERIC)
193
194/* The major intermediate representations of GCC. */
195enum ir_type {
196 IR_GIMPLE,
197 IR_RTL_CFGRTL,
198 IR_RTL_CFGLAYOUT
199};
200
201/* Provide forward struct declaration so that we don't have to include
202 all of cpplib.h whenever a random prototype includes a pointer.
203 Note that the cpp_reader and cpp_token typedefs remain part of
204 cpplib.h. */
205
206struct cpp_reader;
207struct cpp_token;
208
209/* The thread-local storage model associated with a given VAR_DECL
210 or SYMBOL_REF. This isn't used much, but both trees and RTL refer
211 to it, so it's here. */
212enum tls_model {
213 TLS_MODEL_NONE,
214 TLS_MODEL_EMULATED,
215 TLS_MODEL_REAL,
216 TLS_MODEL_GLOBAL_DYNAMIC = TLS_MODEL_REAL,
217 TLS_MODEL_LOCAL_DYNAMIC,
218 TLS_MODEL_INITIAL_EXEC,
219 TLS_MODEL_LOCAL_EXEC
220};
221
222/* Types of trampoline implementation. */
223enum trampoline_impl {
224 TRAMPOLINE_IMPL_STACK,
225 TRAMPOLINE_IMPL_HEAP
226};
227
228/* Types of ABI for an offload compiler. */
229enum offload_abi {
230 OFFLOAD_ABI_UNSET,
231 OFFLOAD_ABI_LP64,
232 OFFLOAD_ABI_ILP32
233};
234
235/* Types of profile update methods. */
236enum profile_update {
237 PROFILE_UPDATE_SINGLE,
238 PROFILE_UPDATE_ATOMIC,
239 PROFILE_UPDATE_PREFER_ATOMIC
240};
241
242/* Type of profile reproducibility methods. */
243enum profile_reproducibility {
244 PROFILE_REPRODUCIBILITY_SERIAL,
245 PROFILE_REPRODUCIBILITY_PARALLEL_RUNS,
246 PROFILE_REPRODUCIBILITY_MULTITHREADED
247};
248
249/* Type of -fstack-protector-*. */
250enum stack_protector {
251 SPCT_FLAG_DEFAULT = 1,
252 SPCT_FLAG_ALL = 2,
253 SPCT_FLAG_STRONG = 3,
254 SPCT_FLAG_EXPLICIT = 4
255};
256
257/* Types of unwind/exception handling info that can be generated.
258 Note that a UI_TARGET (or larger) setting is considered to be
259 incompatible with -freorder-blocks-and-partition. */
260
261enum unwind_info_type
262{
263 UI_NONE,
264 UI_SJLJ,
265 UI_DWARF2,
266 UI_SEH,
267 UI_TARGET
268};
269
270/* Callgraph node profile representation. */
271enum node_frequency {
272 /* This function most likely won't be executed at all.
273 (set only when profile feedback is available or via function attribute). */
274 NODE_FREQUENCY_UNLIKELY_EXECUTED,
275 /* For functions that are known to be executed once (i.e. constructors, destructors
276 and main function. */
277 NODE_FREQUENCY_EXECUTED_ONCE,
278 /* The default value. */
279 NODE_FREQUENCY_NORMAL,
280 /* Optimize this function hard
281 (set only when profile feedback is available or via function attribute). */
282 NODE_FREQUENCY_HOT
283};
284
285/* Ways of optimizing code. */
286enum optimization_type {
287 /* Prioritize speed over size. */
288 OPTIMIZE_FOR_SPEED,
289
290 /* Only do things that are good for both size and speed. */
291 OPTIMIZE_FOR_BOTH,
292
293 /* Prioritize size over speed. */
294 OPTIMIZE_FOR_SIZE
295};
296
297/* Enumerates a padding direction. */
298enum pad_direction {
299 /* No padding is required. */
300 PAD_NONE,
301
302 /* Insert padding above the data, i.e. at higher memeory addresses
303 when dealing with memory, and at the most significant end when
304 dealing with registers. */
305 PAD_UPWARD,
306
307 /* Insert padding below the data, i.e. at lower memeory addresses
308 when dealing with memory, and at the least significant end when
309 dealing with registers. */
310 PAD_DOWNWARD
311};
312
313/* Possible initialization status of a variable. When requested
314 by the user, this information is tracked and recorded in the DWARF
315 debug information, along with the variable's location. */
316enum var_init_status
317{
318 VAR_INIT_STATUS_UNKNOWN,
319 VAR_INIT_STATUS_UNINITIALIZED,
320 VAR_INIT_STATUS_INITIALIZED
321};
322
323/* Names for the different levels of -Wstrict-overflow=N. The numeric
324 values here correspond to N. */
325enum warn_strict_overflow_code
326{
327 /* Overflow warning that should be issued with -Wall: a questionable
328 construct that is easy to avoid even when using macros. Example:
329 folding (x + CONSTANT > x) to 1. */
330 WARN_STRICT_OVERFLOW_ALL = 1,
331 /* Overflow warning about folding a comparison to a constant because
332 of undefined signed overflow, other than cases covered by
333 WARN_STRICT_OVERFLOW_ALL. Example: folding (abs (x) >= 0) to 1
334 (this is false when x == INT_MIN). */
335 WARN_STRICT_OVERFLOW_CONDITIONAL = 2,
336 /* Overflow warning about changes to comparisons other than folding
337 them to a constant. Example: folding (x + 1 > 1) to (x > 0). */
338 WARN_STRICT_OVERFLOW_COMPARISON = 3,
339 /* Overflow warnings not covered by the above cases. Example:
340 folding ((x * 10) / 5) to (x * 2). */
341 WARN_STRICT_OVERFLOW_MISC = 4,
342 /* Overflow warnings about reducing magnitude of constants in
343 comparison. Example: folding (x + 2 > y) to (x + 1 >= y). */
344 WARN_STRICT_OVERFLOW_MAGNITUDE = 5
345};
346
347/* Kind of artificial, compiler-generated lookup table. Type of the
348 second argument of TARGET_ADDR_SPACE_FOR_ARTIFICIAL_RODATA resp.
349 targetm.addr_space.for_artificial_rodata. */
350enum artificial_rodata
351{
352 /* Generated by tree-switch-conversion.cc: Lowered GIMPLE_SWITCH expressions
353 to something more efficient than a jump table. */
354 ARTIFICIAL_RODATA_CSWITCH,
355
356 /* Generated by gimple-crc-optimization.cc: CRC optimization. */
357 ARTIFICIAL_RODATA_CRC
358};
359
360/* The type of an alias set. Code currently assumes that variables of
361 this type can take the values 0 (the alias set which aliases
362 everything) and -1 (sometimes indicating that the alias set is
363 unknown, sometimes indicating a memory barrier) and -2 (indicating
364 that the alias set should be set to a unique value but has not been
365 set yet). */
366typedef int alias_set_type;
367
368class edge_def;
369typedef class edge_def *edge;
370typedef const class edge_def *const_edge;
371struct basic_block_def;
372typedef struct basic_block_def *basic_block;
373typedef const struct basic_block_def *const_basic_block;
374
375#if !defined (GENERATOR_FILE)
376# define OBSTACK_CHUNK_SIZE memory_block_pool::block_size
377# define obstack_chunk_alloc mempool_obstack_chunk_alloc
378# define obstack_chunk_free mempool_obstack_chunk_free
379#else
380# define OBSTACK_CHUNK_SIZE 0
381# define obstack_chunk_alloc xmalloc
382# define obstack_chunk_free free
383#endif
384
385#define gcc_obstack_init(OBSTACK) \
386 obstack_specify_allocation ((OBSTACK), OBSTACK_CHUNK_SIZE, 0, \
387 obstack_chunk_alloc, \
388 obstack_chunk_free)
389
390/* enum reg_class is target specific, so it should not appear in
391 target-independent code or interfaces, like the target hook declarations
392 in target.h. */
393typedef int reg_class_t;
394
395class rtl_opt_pass;
396
397namespace gcc {
398 class context;
399}
400
401typedef std::pair <tree, tree> tree_pair;
402typedef std::pair <const char *, int> string_int_pair;
403
404/* Define a name->value mapping. */
405template <typename ValueType>
406struct kv_pair
407{
408 const char *const name; /* the name of the value */
409 const ValueType value; /* the value of the name */
410};
411
412#else
413
414struct _dont_use_rtx_here_;
415struct _dont_use_rtvec_here_;
416struct _dont_use_rtx_insn_here_;
417union _dont_use_tree_here_;
418#define rtx struct _dont_use_rtx_here_ *
419#define const_rtx struct _dont_use_rtx_here_ *
420#define rtvec struct _dont_use_rtvec_here *
421#define const_rtvec struct _dont_use_rtvec_here *
422#define rtx_insn struct _dont_use_rtx_insn_here_
423#define tree union _dont_use_tree_here_ *
424#define const_tree union _dont_use_tree_here_ *
425
426typedef struct scalar_mode scalar_mode;
427typedef struct scalar_int_mode scalar_int_mode;
428typedef struct scalar_float_mode scalar_float_mode;
429typedef struct complex_mode complex_mode;
430
431#endif
432
433/* Classes of functions that compiler needs to check
434 whether they are present at the runtime or not. */
435enum function_class {
436 function_c94,
437 function_c99_misc,
438 function_c99_math_complex,
439 function_sincos,
440 function_c11_misc,
441 function_c23_misc,
442 function_c2y_misc
443};
444
445/* Enumerate visibility settings. This is deliberately ordered from most
446 to least visibility. */
447enum symbol_visibility
448{
449 VISIBILITY_DEFAULT,
450 VISIBILITY_PROTECTED,
451 VISIBILITY_HIDDEN,
452 VISIBILITY_INTERNAL
453};
454
455/* enums used by the targetm.excess_precision hook. */
456
457enum flt_eval_method
458{
459 FLT_EVAL_METHOD_UNPREDICTABLE = -1,
460 FLT_EVAL_METHOD_PROMOTE_TO_FLOAT = 0,
461 FLT_EVAL_METHOD_PROMOTE_TO_DOUBLE = 1,
462 FLT_EVAL_METHOD_PROMOTE_TO_LONG_DOUBLE = 2,
463 FLT_EVAL_METHOD_PROMOTE_TO_FLOAT16 = 16
464};
465
466enum excess_precision_type
467{
468 EXCESS_PRECISION_TYPE_IMPLICIT,
469 EXCESS_PRECISION_TYPE_STANDARD,
470 EXCESS_PRECISION_TYPE_FAST,
471 EXCESS_PRECISION_TYPE_FLOAT16
472};
473
474/* Level of size optimization. */
475
476enum optimize_size_level
477{
478 /* Do not optimize for size. */
479 OPTIMIZE_SIZE_NO,
480 /* Optimize for size but not at extreme performance costs. */
481 OPTIMIZE_SIZE_BALANCED,
482 /* Optimize for size as much as possible. */
483 OPTIMIZE_SIZE_MAX
484};
485
486/* Support for user-provided GGC and PCH markers. The first parameter
487 is a pointer to a pointer, the second either NULL if the pointer to
488 pointer points into a GC object or the actual pointer address if
489 the first argument points to a temporary and the third a cookie. */
490typedef void (*gt_pointer_operator) (void *, void *, void *);
491
492#if !defined (HAVE_UCHAR)
493typedef unsigned char uchar;
494#endif
495
496/* Most source files will require the following headers. */
497#if !defined (USED_FOR_TARGET)
498#include "insn-modes.h"
499#include "signop.h"
500#include "wide-int.h"
501#include "wide-int-print.h"
502
503/* On targets that don't need polynomial offsets, target-specific code
504 should be able to treat poly_int like a normal constant, with a
505 conversion operator going from the former to the latter. We also
506 allow this for gencondmd.cc for all targets, so that we can treat
507 machine_modes as enums without causing build failures. */
508#if (defined (IN_TARGET_CODE) \
509 && (defined (USE_ENUM_MODES) || NUM_POLY_INT_COEFFS == 1))
510#define POLY_INT_CONVERSION 1
511#else
512#define POLY_INT_CONVERSION 0
513#endif
514
515#include "poly-int.h"
516#include "poly-int-types.h"
517#include "insn-modes-inline.h"
518#include "machmode.h"
519#include "double-int.h"
520#include "align.h"
521/* Most host source files will require the following headers. */
522#if !defined (GENERATOR_FILE)
523#include "iterator-utils.h"
524#include "real.h"
525#include "fixed-value.h"
526#include "hash-table.h"
527#include "hash-set.h"
528#include "input.h"
529#include "is-a.h"
530#include "memory-block.h"
531#include "dumpfile.h"
532#endif
533#endif /* GENERATOR_FILE && !USED_FOR_TARGET */
534
535#endif /* coretypes.h */
536

source code of gcc/coretypes.h