]>
Commit | Line | Data |
---|---|---|
a767736d | 1 | /* Data structure definitions for a generic GCC target. |
fbd26352 | 2 | Copyright (C) 2001-2019 Free Software Foundation, Inc. |
a767736d | 3 | |
8c4c00c1 | 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 | ||
a767736d | 22 | |
23 | /* This file contains a data structure that describes a GCC target. | |
11ff5d0d | 24 | At present it is incomplete, but in future it should grow to |
a767736d | 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 | |
57e4bbfb | 37 | "targetm" like so: |
a767736d | 38 | |
57e4bbfb | 39 | struct gcc_target targetm = TARGET_INITIALIZER; |
a767736d | 40 | |
41 | Doing things this way allows us to bring together everything that | |
11ff5d0d | 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. */ | |
a767736d | 47 | |
bcf3c70d | 48 | #ifndef GCC_TARGET_H |
49 | #define GCC_TARGET_H | |
50 | ||
17f446a0 | 51 | #include "insn-codes.h" |
cea19dab | 52 | #include "tm.h" |
53 | #include "hard-reg-set.h" | |
7988d6e2 | 54 | |
382ecba7 | 55 | #if CHECKING_P |
39cba157 | 56 | |
b3e7c666 | 57 | struct cumulative_args_t { void *magic; void *p; }; |
39cba157 | 58 | |
382ecba7 | 59 | #else /* !CHECKING_P */ |
39cba157 | 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 | |
382ecba7 | 65 | at the cost of less type-safe !CHECKING_P compilation. */ |
39cba157 | 66 | |
b3e7c666 | 67 | union cumulative_args_t { void *p; }; |
39cba157 | 68 | |
382ecba7 | 69 | #endif /* !CHECKING_P */ |
39cba157 | 70 | |
7c6733e8 | 71 | /* Types used by the record_gcc_switches() target function. */ |
b3e7c666 | 72 | enum print_switch_type |
7c6733e8 | 73 | { |
74 | SWITCH_TYPE_PASSED, /* A switch passed on the command line. */ | |
75 | SWITCH_TYPE_ENABLED, /* An option that is currently enabled. */ | |
76 | SWITCH_TYPE_DESCRIPTIVE, /* Descriptive text, not a switch or option. */ | |
77 | SWITCH_TYPE_LINE_START, /* Please emit any necessary text at the start of a line. */ | |
78 | SWITCH_TYPE_LINE_END /* Please emit a line terminator. */ | |
b3e7c666 | 79 | }; |
7c6733e8 | 80 | |
0ec3791c | 81 | /* Types of memory operation understood by the "by_pieces" infrastructure. |
3e346f54 | 82 | Used by the TARGET_USE_BY_PIECES_INFRASTRUCTURE_P target hook and |
83 | internally by the functions in expr.c. */ | |
0ec3791c | 84 | |
85 | enum by_pieces_operation | |
86 | { | |
87 | CLEAR_BY_PIECES, | |
88 | MOVE_BY_PIECES, | |
89 | SET_BY_PIECES, | |
3e346f54 | 90 | STORE_BY_PIECES, |
91 | COMPARE_BY_PIECES | |
0ec3791c | 92 | }; |
93 | ||
3e346f54 | 94 | extern unsigned HOST_WIDE_INT by_pieces_ninsns (unsigned HOST_WIDE_INT, |
95 | unsigned int, | |
96 | unsigned int, | |
97 | by_pieces_operation); | |
98 | ||
7c6733e8 | 99 | typedef int (* print_switch_fn_type) (print_switch_type, const char *); |
100 | ||
101 | /* An example implementation for ELF targets. Defined in varasm.c */ | |
102 | extern int elf_record_gcc_switches (print_switch_type type, const char *); | |
103 | ||
98155838 | 104 | /* Some places still assume that all pointer or address modes are the |
105 | standard Pmode and ptr_mode. These optimizations become invalid if | |
106 | the target actually supports multiple different modes. For now, | |
107 | we disable such optimizations on such targets, using this function. */ | |
108 | extern bool target_default_pointer_address_modes_p (void); | |
109 | ||
67622758 | 110 | /* For hooks which use the MOVE_RATIO macro, this gives the legacy default |
67cf9b55 | 111 | behavior. */ |
67622758 | 112 | extern unsigned int get_move_ratio (bool); |
113 | ||
a6c787e5 | 114 | struct stdarg_info; |
6a1cdb4d | 115 | struct spec_info_def; |
2e851bb8 | 116 | struct hard_reg_set_container; |
d09768a4 | 117 | struct cgraph_node; |
118 | struct cgraph_simd_clone; | |
a6c787e5 | 119 | |
4d58fa46 | 120 | /* The struct used by the secondary_reload target hook. */ |
b3e7c666 | 121 | struct secondary_reload_info |
4d58fa46 | 122 | { |
123 | /* icode is actually an enum insn_code, but we don't want to force every | |
124 | file that includes target.h to include optabs.h . */ | |
125 | int icode; | |
126 | int extra_cost; /* Cost for using (a) scratch register(s) to be taken | |
127 | into account by copy_cost. */ | |
128 | /* The next two members are for the use of the backward | |
129 | compatibility hook. */ | |
130 | struct secondary_reload_info *prev_sri; | |
131 | int t_icode; /* Actually an enum insn_code - see above. */ | |
b3e7c666 | 132 | }; |
4d58fa46 | 133 | |
9997bd27 | 134 | /* This is defined in sched-int.h . */ |
135 | struct _dep; | |
4d58fa46 | 136 | |
d52fd16a | 137 | /* This is defined in ddg.h . */ |
138 | struct ddg; | |
139 | ||
9ccaa774 | 140 | /* This is defined in cfgloop.h . */ |
2e966e2a | 141 | class loop; |
9ccaa774 | 142 | |
e000adb9 | 143 | /* This is defined in ifcvt.h. */ |
144 | struct noce_if_info; | |
145 | ||
be97d4b6 | 146 | /* This is defined in tree-ssa-alias.h. */ |
2e966e2a | 147 | class ao_ref; |
be97d4b6 | 148 | |
4db2b577 | 149 | /* This is defined in tree-vectorizer.h. */ |
2e966e2a | 150 | class _stmt_vec_info; |
4db2b577 | 151 | |
152 | /* These are defined in tree-vect-stmts.c. */ | |
2e966e2a | 153 | extern tree stmt_vectype (class _stmt_vec_info *); |
154 | extern bool stmt_in_inner_loop_p (class _stmt_vec_info *); | |
4db2b577 | 155 | |
0b09525f | 156 | /* Assembler instructions for creating various kinds of integer object. */ |
157 | ||
158 | struct asm_int_op | |
159 | { | |
160 | const char *hi; | |
db879ec7 | 161 | const char *psi; |
0b09525f | 162 | const char *si; |
db879ec7 | 163 | const char *pdi; |
0b09525f | 164 | const char *di; |
db879ec7 | 165 | const char *pti; |
0b09525f | 166 | const char *ti; |
167 | }; | |
168 | ||
559093aa | 169 | /* Types of costs for vectorizer cost model. */ |
170 | enum vect_cost_for_stmt | |
171 | { | |
172 | scalar_stmt, | |
173 | scalar_load, | |
174 | scalar_store, | |
175 | vector_stmt, | |
176 | vector_load, | |
72e995da | 177 | vector_gather_load, |
559093aa | 178 | unaligned_load, |
0822b158 | 179 | unaligned_store, |
559093aa | 180 | vector_store, |
72e995da | 181 | vector_scatter_store, |
559093aa | 182 | vec_to_scalar, |
183 | scalar_to_vec, | |
184 | cond_branch_not_taken, | |
185 | cond_branch_taken, | |
5df2530b | 186 | vec_perm, |
d13adc77 | 187 | vec_promote_demote, |
188 | vec_construct | |
559093aa | 189 | }; |
190 | ||
f97dec81 | 191 | /* Separate locations for which the vectorizer cost model should |
192 | track costs. */ | |
193 | enum vect_cost_model_location { | |
194 | vect_prologue = 0, | |
195 | vect_body = 1, | |
196 | vect_epilogue = 2 | |
197 | }; | |
198 | ||
d37760c5 | 199 | class vec_perm_indices; |
282dc861 | 200 | |
3106770a | 201 | /* The type to use for lists of vector sizes. */ |
202 | typedef vec<poly_uint64> vector_sizes; | |
203 | ||
204 | /* Same, but can be used to construct local lists that are | |
205 | automatically freed. */ | |
206 | typedef auto_vec<poly_uint64, 8> auto_vector_sizes; | |
207 | ||
0b09525f | 208 | /* The target structure. This holds all the backend hooks. */ |
202d6e5f | 209 | #define DEFHOOKPOD(NAME, DOC, TYPE, INIT) TYPE NAME; |
210 | #define DEFHOOK(NAME, DOC, TYPE, PARAMS, INIT) TYPE (* NAME) PARAMS; | |
211 | #define DEFHOOK_UNDOC DEFHOOK | |
212 | #define HOOKSTRUCT(FRAGMENT) FRAGMENT | |
0b09525f | 213 | |
202d6e5f | 214 | #include "target.def" |
a767736d | 215 | |
57e4bbfb | 216 | extern struct gcc_target targetm; |
bcf3c70d | 217 | |
466432a3 | 218 | /* Return an estimate of the runtime value of X, for use in things |
219 | like cost calculations or profiling frequencies. Note that this | |
220 | function should never be used in situations where the actual | |
221 | runtime value is needed for correctness, since the function only | |
222 | provides a rough guess. */ | |
223 | ||
224 | static inline HOST_WIDE_INT | |
225 | estimated_poly_value (poly_int64 x) | |
226 | { | |
227 | if (NUM_POLY_INT_COEFFS == 1) | |
228 | return x.coeffs[0]; | |
229 | else | |
230 | return targetm.estimated_poly_value (x); | |
231 | } | |
232 | ||
39cba157 | 233 | #ifdef GCC_TM_H |
234 | ||
235 | #ifndef CUMULATIVE_ARGS_MAGIC | |
236 | #define CUMULATIVE_ARGS_MAGIC ((void *) &targetm.calls) | |
237 | #endif | |
238 | ||
239 | static inline CUMULATIVE_ARGS * | |
240 | get_cumulative_args (cumulative_args_t arg) | |
241 | { | |
382ecba7 | 242 | #if CHECKING_P |
39cba157 | 243 | gcc_assert (arg.magic == CUMULATIVE_ARGS_MAGIC); |
382ecba7 | 244 | #endif /* CHECKING_P */ |
39cba157 | 245 | return (CUMULATIVE_ARGS *) arg.p; |
246 | } | |
247 | ||
248 | static inline cumulative_args_t | |
249 | pack_cumulative_args (CUMULATIVE_ARGS *arg) | |
250 | { | |
251 | cumulative_args_t ret; | |
252 | ||
382ecba7 | 253 | #if CHECKING_P |
39cba157 | 254 | ret.magic = CUMULATIVE_ARGS_MAGIC; |
382ecba7 | 255 | #endif /* CHECKING_P */ |
39cba157 | 256 | ret.p = (void *) arg; |
257 | return ret; | |
258 | } | |
259 | #endif /* GCC_TM_H */ | |
260 | ||
bcf3c70d | 261 | #endif /* GCC_TARGET_H */ |