Mercurial > hg > CbC > CbC_gcc
annotate gcc/target.h @ 138:fc828634a951
merge
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Thu, 08 Nov 2018 14:17:14 +0900 |
parents | 84e7813d76e9 |
children | 1830386684a0 |
rev | line source |
---|---|
0 | 1 /* Data structure definitions for a generic GCC target. |
131 | 2 Copyright (C) 2001-2018 Free Software Foundation, Inc. |
0 | 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 | |
111 | 51 #include "insn-codes.h" |
0 | 52 #include "tm.h" |
111 | 53 #include "hard-reg-set.h" |
54 | |
55 #if CHECKING_P | |
56 | |
57 struct 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 | |
67 union cumulative_args_t { void *p; }; | |
68 | |
69 #endif /* !CHECKING_P */ | |
0 | 70 |
71 /* Types used by the record_gcc_switches() target function. */ | |
111 | 72 enum print_switch_type |
0 | 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. */ | |
111 | 79 }; |
80 | |
81 /* Types of memory operation understood by the "by_pieces" infrastructure. | |
82 Used by the TARGET_USE_BY_PIECES_INFRASTRUCTURE_P target hook and | |
83 internally by the functions in expr.c. */ | |
84 | |
85 enum by_pieces_operation | |
86 { | |
87 CLEAR_BY_PIECES, | |
88 MOVE_BY_PIECES, | |
89 SET_BY_PIECES, | |
90 STORE_BY_PIECES, | |
91 COMPARE_BY_PIECES | |
92 }; | |
93 | |
94 extern unsigned HOST_WIDE_INT by_pieces_ninsns (unsigned HOST_WIDE_INT, | |
95 unsigned int, | |
96 unsigned int, | |
97 by_pieces_operation); | |
0 | 98 |
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 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
104 /* Some places still assume that all pointer or address modes are the |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
105 standard Pmode and ptr_mode. These optimizations become invalid if |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
106 the target actually supports multiple different modes. For now, |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
107 we disable such optimizations on such targets, using this function. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
108 extern bool target_default_pointer_address_modes_p (void); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
109 |
111 | 110 /* For hooks which use the MOVE_RATIO macro, this gives the legacy default |
111 behavior. */ | |
112 extern unsigned int get_move_ratio (bool); | |
113 | |
0 | 114 struct stdarg_info; |
115 struct spec_info_def; | |
111 | 116 struct hard_reg_set_container; |
117 struct cgraph_node; | |
118 struct cgraph_simd_clone; | |
0 | 119 |
120 /* The struct used by the secondary_reload target hook. */ | |
111 | 121 struct secondary_reload_info |
0 | 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. */ | |
111 | 132 }; |
0 | 133 |
134 /* This is defined in sched-int.h . */ | |
135 struct _dep; | |
136 | |
137 /* This is defined in ddg.h . */ | |
138 struct ddg; | |
139 | |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
140 /* This is defined in cfgloop.h . */ |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
141 struct loop; |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
142 |
111 | 143 /* This is defined in ifcvt.h. */ |
144 struct noce_if_info; | |
145 | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
146 /* This is defined in tree-ssa-alias.h. */ |
111 | 147 struct ao_ref; |
148 | |
149 /* This is defined in tree-vectorizer.h. */ | |
150 struct _stmt_vec_info; | |
151 | |
152 /* These are defined in tree-vect-stmts.c. */ | |
153 extern tree stmt_vectype (struct _stmt_vec_info *); | |
154 extern bool stmt_in_inner_loop_p (struct _stmt_vec_info *); | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
155 |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
156 /* Assembler instructions for creating various kinds of integer object. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
157 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
158 struct asm_int_op |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
159 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
160 const char *hi; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
161 const char *si; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
162 const char *di; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
163 const char *ti; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
164 }; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
165 |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
166 /* Types of costs for vectorizer cost model. */ |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
167 enum vect_cost_for_stmt |
0 | 168 { |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
169 scalar_stmt, |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
170 scalar_load, |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
171 scalar_store, |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
172 vector_stmt, |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
173 vector_load, |
111 | 174 vector_gather_load, |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
175 unaligned_load, |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
176 unaligned_store, |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
177 vector_store, |
111 | 178 vector_scatter_store, |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
179 vec_to_scalar, |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
180 scalar_to_vec, |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
181 cond_branch_not_taken, |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
182 cond_branch_taken, |
111 | 183 vec_perm, |
184 vec_promote_demote, | |
185 vec_construct | |
0 | 186 }; |
187 | |
111 | 188 /* Separate locations for which the vectorizer cost model should |
189 track costs. */ | |
190 enum vect_cost_model_location { | |
191 vect_prologue = 0, | |
192 vect_body = 1, | |
193 vect_epilogue = 2 | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
194 }; |
0 | 195 |
131 | 196 class vec_perm_indices; |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
197 |
131 | 198 /* The type to use for lists of vector sizes. */ |
199 typedef vec<poly_uint64> vector_sizes; | |
200 | |
201 /* Same, but can be used to construct local lists that are | |
111 | 202 automatically freed. */ |
131 | 203 typedef auto_vec<poly_uint64, 8> auto_vector_sizes; |
0 | 204 |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
205 /* The target structure. This holds all the backend hooks. */ |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
206 #define DEFHOOKPOD(NAME, DOC, TYPE, INIT) TYPE NAME; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
207 #define DEFHOOK(NAME, DOC, TYPE, PARAMS, INIT) TYPE (* NAME) PARAMS; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
208 #define DEFHOOK_UNDOC DEFHOOK |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
209 #define HOOKSTRUCT(FRAGMENT) FRAGMENT |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
210 |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
211 #include "target.def" |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
212 |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
213 extern struct gcc_target targetm; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
214 |
131 | 215 /* Return an estimate of the runtime value of X, for use in things |
216 like cost calculations or profiling frequencies. Note that this | |
217 function should never be used in situations where the actual | |
218 runtime value is needed for correctness, since the function only | |
219 provides a rough guess. */ | |
220 | |
221 static inline HOST_WIDE_INT | |
222 estimated_poly_value (poly_int64 x) | |
223 { | |
224 if (NUM_POLY_INT_COEFFS == 1) | |
225 return x.coeffs[0]; | |
226 else | |
227 return targetm.estimated_poly_value (x); | |
228 } | |
229 | |
111 | 230 #ifdef GCC_TM_H |
231 | |
232 #ifndef CUMULATIVE_ARGS_MAGIC | |
233 #define CUMULATIVE_ARGS_MAGIC ((void *) &targetm.calls) | |
234 #endif | |
235 | |
236 static inline CUMULATIVE_ARGS * | |
237 get_cumulative_args (cumulative_args_t arg) | |
238 { | |
239 #if CHECKING_P | |
240 gcc_assert (arg.magic == CUMULATIVE_ARGS_MAGIC); | |
241 #endif /* CHECKING_P */ | |
242 return (CUMULATIVE_ARGS *) arg.p; | |
243 } | |
244 | |
245 static inline cumulative_args_t | |
246 pack_cumulative_args (CUMULATIVE_ARGS *arg) | |
247 { | |
248 cumulative_args_t ret; | |
249 | |
250 #if CHECKING_P | |
251 ret.magic = CUMULATIVE_ARGS_MAGIC; | |
252 #endif /* CHECKING_P */ | |
253 ret.p = (void *) arg; | |
254 return ret; | |
255 } | |
256 #endif /* GCC_TM_H */ | |
0 | 257 |
258 #endif /* GCC_TARGET_H */ |