GCC Middle and Back End API Reference
target.h
Go to the documentation of this file.
1/* Data structure definitions for a generic GCC target.
2 Copyright (C) 2001-2026 Free Software Foundation, Inc.
3
4 This program is free software; you can redistribute it and/or modify it
5 under the terms of the GNU General Public License as published by the
6 Free Software Foundation; either version 3, or (at your option) any
7 later version.
8
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
13
14 You should have received a copy of the GNU General Public License
15 along with this program; see the file COPYING3. If not see
16 <http://www.gnu.org/licenses/>.
17
18 In other words, you are welcome to use, share and improve this program.
19 You are forbidden to forbid anyone else to use, share and improve
20 what you give them. Help stamp out software-hoarding! */
21
22
23/* This file contains a data structure that describes a GCC target.
24 At present it is incomplete, but in future it should grow to
25 contain most or all target machine and target O/S specific
26 information.
27
28 This structure has its initializer declared in target-def.h in the
29 form of large macro TARGET_INITIALIZER that expands to many smaller
30 macros.
31
32 The smaller macros each initialize one component of the structure,
33 and each has a default. Each target should have a file that
34 includes target.h and target-def.h, and overrides any inappropriate
35 defaults by undefining the relevant macro and defining a suitable
36 replacement. That file should then contain the definition of
37 "targetm" like so:
38
39 struct gcc_target targetm = TARGET_INITIALIZER;
40
41 Doing things this way allows us to bring together everything that
42 defines a GCC target. By supplying a default that is appropriate
43 to most targets, we can easily add new items without needing to
44 edit dozens of target configuration files. It should also allow us
45 to gradually reduce the amount of conditional compilation that is
46 scattered throughout GCC. */
47
48#ifndef GCC_TARGET_H
49#define GCC_TARGET_H
50
51#include "insn-codes.h"
52#include "tm.h"
53#include "hard-reg-set.h"
54
55#if CHECKING_P
56
57struct cumulative_args_t { void *magic; void *p; };
58
59#else /* !CHECKING_P */
60
61/* When using a GCC build compiler, we could use
62 __attribute__((transparent_union)) to get cumulative_args_t function
63 arguments passed like scalars where the ABI would mandate a less
64 efficient way of argument passing otherwise. However, that would come
65 at the cost of less type-safe !CHECKING_P compilation. */
66
67union cumulative_args_t { void *p; };
68
69#endif /* !CHECKING_P */
70
71/* Values for bitint_info::extended below. */
72
74
75/* Target properties of _BitInt(N) type. _BitInt(N) is to be represented
76 as series of abi_limb_mode CEIL (N, GET_MODE_PRECISION (abi_limb_mode))
77 limbs, ordered from least significant to most significant if !big_endian,
78 otherwise from most significant to least significant. If extended is
79 bitint_ext_undef, the bits above or equal to N are undefined when stored in
80 a register or memory, if extended is bitint_ext_full, they are zero or sign
81 extended depending on if it is unsigned _BitInt(N) or
82 _BitInt(N) / signed _BitInt(N), if extended is bitint_ext_partial, then bits
83 above or equal to N and below
84 M = CEIL (N, GET_MODE_PRECISION (limb_mode)) * GET_MODE_PRECISION (limb_mode)
85 are zero or sign extended as specified above and bits above or equal to M
86 are undefined.
87 limb_mode is either the same as abi_limb_mode, or some narrower mode
88 in which _BitInt lowering should actually perform operations in and
89 what libgcc _BitInt helpers should use.
90 E.g. abi_limb_mode could be TImode which is something some processor
91 specific ABI would specify to use, but it would be desirable to handle
92 it as an array of DImode instead for efficiency.
93 Note, abi_limb_mode can be different from limb_mode only if big_endian
94 matches WORDS_BIG_ENDIAN. */
95
101
102/* Types of memory operation understood by the "by_pieces" infrastructure.
103 Used by the TARGET_USE_BY_PIECES_INFRASTRUCTURE_P target hook and
104 internally by the functions in expr.cc. */
105
114
115extern unsigned HOST_WIDE_INT by_pieces_ninsns (unsigned HOST_WIDE_INT,
116 unsigned int,
117 unsigned int,
119
120/* An example implementation for ELF targets. Defined in varasm.cc */
121extern void elf_record_gcc_switches (const char *);
122
123/* Some places still assume that all pointer or address modes are the
124 standard Pmode and ptr_mode. These optimizations become invalid if
125 the target actually supports multiple different modes. For now,
126 we disable such optimizations on such targets, using this function. */
128
129/* For hooks which use the MOVE_RATIO macro, this gives the legacy default
130 behavior. */
131extern unsigned int get_move_ratio (bool);
132
133struct stdarg_info;
134struct spec_info_def;
136struct cgraph_node;
137struct cgraph_simd_clone;
138
139/* The struct used by the secondary_reload target hook. */
141{
142 /* icode is actually an enum insn_code, but we don't want to force every
143 file that includes target.h to include optabs.h . */
144 int icode;
145 int extra_cost; /* Cost for using (a) scratch register(s) to be taken
146 into account by copy_cost. */
147 /* The next two members are for the use of the backward
148 compatibility hook. */
150 int t_icode; /* Actually an enum insn_code - see above. */
151};
152
153/* This is defined in sched-int.h . */
154struct _dep;
155
156/* This is defined in ddg.h . */
157struct ddg;
158
159/* This is defined in cfgloop.h . */
160class loop;
161
162/* This is defined in ifcvt.h. */
163struct noce_if_info;
164
165/* This is defined in tree-ssa-alias.h. */
166class ao_ref;
167
168/* This is defined in tree-vectorizer.h. */
169class _stmt_vec_info;
170
171/* This is defined in calls.h. */
173
174/* This is defined in function-abi.h. */
176
177/* This is defined in avoid-store-forwarding.h. */
178struct store_fwd_info;
179
180/* These are defined in tree-vect-stmts.cc. */
181extern bool stmt_in_inner_loop_p (class vec_info *, class _stmt_vec_info *);
182
183/* Assembler instructions for creating various kinds of integer object. */
184
186{
187 const char *hi;
188 const char *psi;
189 const char *si;
190 const char *pdi;
191 const char *di;
192 const char *pti;
193 const char *ti;
194};
195
196/* Types of costs for vectorizer cost model. */
217
218/* Separate locations for which the vectorizer cost model should
219 track costs. */
225
226class vec_perm_indices;
227
228/* The type to use for lists of vector sizes. */
230
231/* Same, but can be used to construct local lists that are
232 automatically freed. */
234
235/* First argument of targetm.omp.device_kind_arch_isa. */
241
242/* Flags returned by TARGET_VECTORIZE_AUTOVECTORIZE_VECTOR_MODES:
243
244 VECT_COMPARE_COSTS
245 Tells the loop vectorizer to try all the provided modes and
246 pick the one with the lowest cost. By default the vectorizer
247 will choose the first mode that works. */
248const unsigned int VECT_COMPARE_COSTS = 1U << 0;
249
250/* The contexts in which the use of a type T can be checked by
251 TARGET_VERIFY_TYPE_CONTEXT. */
253 /* Directly measuring the size of T. */
255
256 /* Directly measuring the alignment of T. */
258
259 /* Creating objects of type T with static storage duration. */
261
262 /* Creating objects of type T with thread-local storage duration. */
264
265 /* Creating a field of type T. */
267
268 /* Creating an array with elements of type T. */
270
271 /* Adding to or subtracting from a pointer to T, or computing the
272 difference between two pointers when one of them is a pointer to T. */
274
275 /* Dynamically allocating objects of type T. */
277
278 /* Dynamically deallocating objects of type T. */
280
281 /* Throwing or catching an object of type T. */
283
284 /* Capturing objects of type T by value in a closure. */
286
287 /* Objects of type T appearing in OpenMP map clause. */
289
290 /* Objects of type T appearing in OpenMP target region
291 without explicit map. */
293
294 /* Objects of type T appearing in OpenMP private clause. */
296
297 /* Objects of type T appearing in OpenMP firstprivate clause. */
299
300 /* Objects of type T appearing in OpenMP device clauses. */
302
303};
304
311
313{
316};
317
323
325
326extern bool verify_type_context (location_t, type_context_kind, const_tree,
327 bool = false);
328
329/* The target structure. This holds all the backend hooks. */
330#define DEFHOOKPOD(NAME, DOC, TYPE, INIT) TYPE NAME;
331#define DEFHOOK(NAME, DOC, TYPE, PARAMS, INIT) TYPE (* NAME) PARAMS;
332#define DEFHOOK_UNDOC DEFHOOK
333#define HOOKSTRUCT(FRAGMENT) FRAGMENT
334
335#include "target.def"
336
337extern struct gcc_target targetm;
338
339/* Return an estimate of the runtime value of X, for use in things
340 like cost calculations or profiling frequencies. Note that this
341 function should never be used in situations where the actual
342 runtime value is needed for correctness, since the function only
343 provides a rough guess. */
344
345inline HOST_WIDE_INT
348{
349 if (NUM_POLY_INT_COEFFS == 1)
350 return x.coeffs[0];
351 else
352 return targetm.estimated_poly_value (x, kind);
353}
354
355/* Return true when MODE can be used to copy GET_MODE_BITSIZE bits
356 unchanged. */
357
358inline bool
359mode_can_transfer_bits (machine_mode mode)
360{
361 if (mode == BLKmode)
362 return true;
363 if (maybe_ne (GET_MODE_BITSIZE (mode),
365 return false;
366 if (targetm.mode_can_transfer_bits)
367 return targetm.mode_can_transfer_bits (mode);
368 return true;
369}
370
371/* Return true if OpenMP context types. */
372
373inline bool
375{
376 switch (context)
377 {
378 case TCTX_OMP_MAP:
380 case TCTX_OMP_PRIVATE:
383 return true;
384 default:
385 return false;
386 }
387}
388
389#ifdef GCC_TM_H
390
391#ifndef CUMULATIVE_ARGS_MAGIC
392#define CUMULATIVE_ARGS_MAGIC ((void *) &targetm.calls)
393#endif
394
395inline CUMULATIVE_ARGS *
396get_cumulative_args (cumulative_args_t arg)
397{
398#if CHECKING_P
399 gcc_assert (arg.magic == CUMULATIVE_ARGS_MAGIC);
400#endif /* CHECKING_P */
401 return (CUMULATIVE_ARGS *) arg.p;
402}
403
405pack_cumulative_args (CUMULATIVE_ARGS *arg)
406{
408
409#if CHECKING_P
410 ret.magic = CUMULATIVE_ARGS_MAGIC;
411#endif /* CHECKING_P */
412 ret.p = (void *) arg;
413 return ret;
414}
415#endif /* GCC_TM_H */
416
417#endif /* GCC_TARGET_H */
Definition tree-vectorizer.h:1502
Definition tree-ssa-alias.h:77
Definition vec.h:1667
Definition calls.h:35
Definition cfgloop.h:120
C coeffs[N]
Definition poly-int.h:433
Definition function-abi.h:35
Definition tree-vectorizer.h:613
Definition vec-perm-indices.h:51
const union tree_node * const_tree
Definition coretypes.h:98
union tree_node * tree
Definition coretypes.h:97
#define NUM_POLY_INT_COEFFS
Definition genmodes.cc:859
#define GET_MODE_UNIT_PRECISION(MODE)
Definition machmode.h:760
ALWAYS_INLINE poly_uint16 GET_MODE_BITSIZE(machine_mode mode)
Definition machmode.h:683
ALWAYS_INLINE poly_uint16 GET_MODE_NUNITS(machine_mode mode)
Definition machmode.h:769
poly_int< NUM_POLY_INT_COEFFS, HOST_WIDE_INT > poly_int64
Definition poly-int-types.h:24
Definition target.h:186
const char * pdi
Definition target.h:190
const char * pti
Definition target.h:192
const char * psi
Definition target.h:188
const char * hi
Definition target.h:187
const char * di
Definition target.h:191
const char * si
Definition target.h:189
const char * ti
Definition target.h:193
Definition target.h:96
machine_mode limb_mode
Definition target.h:97
bool big_endian
Definition target.h:98
enum bitint_ext extended
Definition target.h:99
machine_mode abi_limb_mode
Definition target.h:97
Definition cgraph.h:920
Definition cgraph.h:826
Definition ddg.h:108
Definition hard-reg-set.h:136
Definition ifcvt.h:66
Definition target.h:141
int icode
Definition target.h:144
int extra_cost
Definition target.h:145
struct secondary_reload_info * prev_sri
Definition target.h:149
int t_icode
Definition target.h:150
Definition tree-stdarg.h:25
Definition avoid-store-forwarding.h:25
Definition vec.h:450
#define gcc_assert(EXPR)
Definition system.h:817
auto_vec< machine_mode, 8 > auto_vector_modes
Definition target.h:233
bool verify_type_context(location_t, type_context_kind, const_tree, bool=false)
Definition tree.cc:15287
unsigned int get_move_ratio(bool)
Definition targhooks.cc:2160
vec< machine_mode > vector_modes
Definition target.h:229
unsigned HOST_WIDE_INT by_pieces_ninsns(unsigned HOST_WIDE_INT, unsigned int, unsigned int, by_pieces_operation)
Definition expr.cc:1122
spill_cost_type
Definition target.h:313
@ RESTORE
Definition target.h:315
@ SAVE
Definition target.h:314
by_pieces_operation
Definition target.h:107
@ SET_BY_PIECES
Definition target.h:110
@ MOVE_BY_PIECES
Definition target.h:109
@ COMPARE_BY_PIECES
Definition target.h:112
@ CLEAR_BY_PIECES
Definition target.h:108
@ STORE_BY_PIECES
Definition target.h:111
bool stmt_in_inner_loop_p(class vec_info *, class _stmt_vec_info *)
Definition tree-vect-stmts.cc:71
bool target_default_pointer_address_modes_p(void)
Definition targhooks.cc:1732
poly_value_estimate_kind
Definition target.h:306
@ POLY_VALUE_LIKELY
Definition target.h:309
@ POLY_VALUE_MAX
Definition target.h:308
@ POLY_VALUE_MIN
Definition target.h:307
const unsigned int VECT_COMPARE_COSTS
Definition target.h:248
HOST_WIDE_INT estimated_poly_value(poly_int64 x, poly_value_estimate_kind kind=POLY_VALUE_LIKELY)
Definition target.h:346
bitint_ext
Definition target.h:73
@ bitint_ext_undef
Definition target.h:73
@ bitint_ext_partial
Definition target.h:73
@ bitint_ext_full
Definition target.h:73
type_context_kind
Definition target.h:252
@ TCTX_EXCEPTIONS
Definition target.h:282
@ TCTX_OMP_DEVICE_ADDR
Definition target.h:301
@ TCTX_THREAD_STORAGE
Definition target.h:263
@ TCTX_STATIC_STORAGE
Definition target.h:260
@ TCTX_SIZEOF
Definition target.h:254
@ TCTX_OMP_MAP_IMP_REF
Definition target.h:292
@ TCTX_POINTER_ARITH
Definition target.h:273
@ TCTX_ARRAY_ELEMENT
Definition target.h:269
@ TCTX_FIELD
Definition target.h:266
@ TCTX_OMP_MAP
Definition target.h:288
@ TCTX_ALLOCATION
Definition target.h:276
@ TCTX_CAPTURE_BY_COPY
Definition target.h:285
@ TCTX_OMP_PRIVATE
Definition target.h:295
@ TCTX_ALIGNOF
Definition target.h:257
@ TCTX_DEALLOCATION
Definition target.h:279
@ TCTX_OMP_FIRSTPRIVATE
Definition target.h:298
bool omp_type_context(type_context_kind context)
Definition target.h:374
void(* emit_support_tinfos_callback)(tree)
Definition target.h:324
void elf_record_gcc_switches(const char *)
Definition varasm.cc:8603
struct gcc_target targetm
vect_cost_model_location
Definition target.h:220
@ vect_body
Definition target.h:222
@ vect_prologue
Definition target.h:221
@ vect_epilogue
Definition target.h:223
vect_cost_for_stmt
Definition target.h:198
@ scalar_stmt
Definition target.h:199
@ vector_stmt
Definition target.h:202
@ vec_perm
Definition target.h:213
@ scalar_to_vec
Definition target.h:210
@ vec_construct
Definition target.h:215
@ vector_store
Definition target.h:207
@ unaligned_load
Definition target.h:205
@ cond_branch_taken
Definition target.h:212
@ scalar_load
Definition target.h:200
@ vec_to_scalar
Definition target.h:209
@ vector_gather_load
Definition target.h:204
@ scalar_store
Definition target.h:201
@ vec_promote_demote
Definition target.h:214
@ vector_load
Definition target.h:203
@ cond_branch_not_taken
Definition target.h:211
@ unaligned_store
Definition target.h:206
@ vector_scatter_store
Definition target.h:208
frame_cost_type
Definition target.h:319
@ DEALLOCATION
Definition target.h:321
@ ALLOCATION
Definition target.h:320
bool mode_can_transfer_bits(machine_mode mode)
Definition target.h:359
omp_device_kind_arch_isa
Definition target.h:236
@ omp_device_isa
Definition target.h:239
@ omp_device_arch
Definition target.h:238
@ omp_device_kind
Definition target.h:237
Definition target.h:67
void * p
Definition target.h:67