1/* GCC core type declarations.
2 Copyright (C) 2002-2023 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;
103
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
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;
134struct gomp_ordered;
135struct gomp_for;
136struct gomp_parallel;
137struct gomp_task;
138struct gomp_sections;
139struct gomp_single;
140struct gomp_target;
141struct gomp_teams;
142
143/* Subclasses of symtab_node, using indentation to show the class
144 hierarchy. */
145
146struct symtab_node;
147 struct cgraph_node;
148 struct varpool_node;
149struct cgraph_edge;
150
151union section;
152typedef union section section;
153struct gcc_options;
154struct cl_target_option;
155struct cl_optimization;
156struct cl_option;
157struct cl_decoded_option;
158struct cl_option_handlers;
159class diagnostic_context;
160class pretty_printer;
161class diagnostic_event_id_t;
162typedef const char * (*diagnostic_input_charset_callback)(const char *);
163
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
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
179/* The major intermediate representations of GCC. */
180enum ir_type {
181 IR_GIMPLE,
182 IR_RTL_CFGRTL,
183 IR_RTL_CFGLAYOUT
184};
185
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.
188 Note that the cpp_reader and cpp_token typedefs remain part of
189 cpplib.h. */
190
191struct cpp_reader;
192struct cpp_token;
193
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 {
198 TLS_MODEL_NONE,
199 TLS_MODEL_EMULATED,
200 TLS_MODEL_REAL,
201 TLS_MODEL_GLOBAL_DYNAMIC = TLS_MODEL_REAL,
202 TLS_MODEL_LOCAL_DYNAMIC,
203 TLS_MODEL_INITIAL_EXEC,
204 TLS_MODEL_LOCAL_EXEC
205};
206
207/* Types of trampoline implementation. */
208enum trampoline_impl {
209 TRAMPOLINE_IMPL_STACK,
210 TRAMPOLINE_IMPL_HEAP
211};
212
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
220/* Types of profile update methods. */
221enum profile_update {
222 PROFILE_UPDATE_SINGLE,
223 PROFILE_UPDATE_ATOMIC,
224 PROFILE_UPDATE_PREFER_ATOMIC
225};
226
227/* Type of profile reproducibility methods. */
228enum profile_reproducibility {
229 PROFILE_REPRODUCIBILITY_SERIAL,
230 PROFILE_REPRODUCIBILITY_PARALLEL_RUNS,
231 PROFILE_REPRODUCIBILITY_MULTITHREADED
232};
233
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
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. */
245
246enum unwind_info_type
247{
248 UI_NONE,
249 UI_SJLJ,
250 UI_DWARF2,
251 UI_SEH,
252 UI_TARGET
253};
254
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
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
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
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
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
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;
339
340class edge_def;
341typedef class edge_def *edge;
342typedef const class edge_def *const_edge;
343struct basic_block_def;
344typedef struct basic_block_def *basic_block;
345typedef const struct basic_block_def *const_basic_block;
346
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
357#define gcc_obstack_init(OBSTACK) \
358 obstack_specify_allocation ((OBSTACK), OBSTACK_CHUNK_SIZE, 0, \
359 obstack_chunk_alloc, \
360 obstack_chunk_free)
361
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
367class rtl_opt_pass;
368
369namespace gcc {
370 class context;
371}
372
373typedef std::pair <tree, tree> tree_pair;
374typedef std::pair <const char *, int> string_int_pair;
375
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
384#else
385
386struct _dont_use_rtx_here_;
387struct _dont_use_rtvec_here_;
388struct _dont_use_rtx_insn_here_;
389union _dont_use_tree_here_;
390#define rtx struct _dont_use_rtx_here_ *
391#define const_rtx struct _dont_use_rtx_here_ *
392#define rtvec struct _dont_use_rtvec_here *
393#define const_rtvec struct _dont_use_rtvec_here *
394#define rtx_insn struct _dont_use_rtx_insn_here_
395#define tree union _dont_use_tree_here_ *
396#define const_tree union _dont_use_tree_here_ *
397
398typedef struct scalar_mode scalar_mode;
399typedef struct scalar_int_mode scalar_int_mode;
400typedef struct scalar_float_mode scalar_float_mode;
401typedef struct complex_mode complex_mode;
402
403#endif
404
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,
411 function_sincos,
412 function_c11_misc,
413 function_c23_misc
414};
415
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
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,
441 EXCESS_PRECISION_TYPE_FAST,
442 EXCESS_PRECISION_TYPE_FLOAT16
443};
444
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
457/* Support for user-provided GGC and PCH markers. The first parameter
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 *);
462
463#if !defined (HAVE_UCHAR)
464typedef unsigned char uchar;
465#endif
466
467/* Most source files will require the following headers. */
468#if !defined (USED_FOR_TARGET)
469#include "insn-modes.h"
470#include "signop.h"
471#include "wide-int.h"
472#include "wide-int-print.h"
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
477 allow this for gencondmd.cc for all targets, so that we can treat
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"
488#include "insn-modes-inline.h"
489#include "machmode.h"
490#include "double-int.h"
491#include "align.h"
492/* Most host source files will require the following headers. */
493#if !defined (GENERATOR_FILE)
494#include "iterator-utils.h"
495#include "real.h"
496#include "fixed-value.h"
497#include "hash-table.h"
498#include "hash-set.h"
499#include "input.h"
500#include "is-a.h"
501#include "memory-block.h"
502#include "dumpfile.h"
503#endif
504#endif /* GENERATOR_FILE && !USED_FOR_TARGET */
505
506#endif /* coretypes.h */
507

source code of gcc/coretypes.h