]>
Commit | Line | Data |
---|---|---|
672a6f42 | 1 | /* Data structure definitions for a generic GCC target. |
5624e564 | 2 | Copyright (C) 2001-2015 Free Software Foundation, Inc. |
672a6f42 | 3 | |
9dcd6f09 NC |
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 | ||
672a6f42 NB |
22 | |
23 | /* This file contains a data structure that describes a GCC target. | |
17b53c33 | 24 | At present it is incomplete, but in future it should grow to |
672a6f42 NB |
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 | |
f6897b10 | 37 | "targetm" like so: |
672a6f42 | 38 | |
f6897b10 | 39 | struct gcc_target targetm = TARGET_INITIALIZER; |
672a6f42 NB |
40 | |
41 | Doing things this way allows us to bring together everything that | |
17b53c33 NB |
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. */ | |
672a6f42 | 47 | |
59587b18 JQ |
48 | #ifndef GCC_TARGET_H |
49 | #define GCC_TARGET_H | |
50 | ||
42e37616 | 51 | #include "insn-codes.h" |
06b90602 CB |
52 | #include "tm.h" |
53 | #include "hard-reg-set.h" | |
7bb1ad93 | 54 | |
b2b29377 | 55 | #if CHECKING_P |
d5cc9181 | 56 | |
84562394 | 57 | struct cumulative_args_t { void *magic; void *p; }; |
d5cc9181 | 58 | |
b2b29377 | 59 | #else /* !CHECKING_P */ |
d5cc9181 JR |
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 | |
b2b29377 | 65 | at the cost of less type-safe !CHECKING_P compilation. */ |
d5cc9181 | 66 | |
84562394 | 67 | union cumulative_args_t { void *p; }; |
d5cc9181 | 68 | |
b2b29377 | 69 | #endif /* !CHECKING_P */ |
d5cc9181 | 70 | |
e0d9d0dd | 71 | /* Types used by the record_gcc_switches() target function. */ |
84562394 | 72 | enum print_switch_type |
e0d9d0dd NC |
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. */ | |
84562394 | 79 | }; |
e0d9d0dd | 80 | |
7cbed008 JG |
81 | /* Types of memory operation understood by the "by_pieces" infrastructure. |
82 | Used by the TARGET_USE_BY_PIECES_INFRASTRUCTURE_P target hook. */ | |
83 | ||
84 | enum by_pieces_operation | |
85 | { | |
86 | CLEAR_BY_PIECES, | |
87 | MOVE_BY_PIECES, | |
88 | SET_BY_PIECES, | |
89 | STORE_BY_PIECES | |
90 | }; | |
91 | ||
e0d9d0dd NC |
92 | typedef int (* print_switch_fn_type) (print_switch_type, const char *); |
93 | ||
94 | /* An example implementation for ELF targets. Defined in varasm.c */ | |
95 | extern int elf_record_gcc_switches (print_switch_type type, const char *); | |
96 | ||
d4ebfa65 BE |
97 | /* Some places still assume that all pointer or address modes are the |
98 | standard Pmode and ptr_mode. These optimizations become invalid if | |
99 | the target actually supports multiple different modes. For now, | |
100 | we disable such optimizations on such targets, using this function. */ | |
101 | extern bool target_default_pointer_address_modes_p (void); | |
102 | ||
5a6bc9c7 JG |
103 | /* For hooks which use the MOVE_RATIO macro, this gives the legacy default |
104 | behaviour. */ | |
105 | extern unsigned int get_move_ratio (bool); | |
106 | ||
9d30f3c1 | 107 | struct stdarg_info; |
496d7bb0 | 108 | struct spec_info_def; |
ee3d2ecd | 109 | struct hard_reg_set_container; |
0136f8f0 AH |
110 | struct cgraph_node; |
111 | struct cgraph_simd_clone; | |
9d30f3c1 | 112 | |
8a99f6f9 | 113 | /* The struct used by the secondary_reload target hook. */ |
84562394 | 114 | struct secondary_reload_info |
8a99f6f9 R |
115 | { |
116 | /* icode is actually an enum insn_code, but we don't want to force every | |
117 | file that includes target.h to include optabs.h . */ | |
118 | int icode; | |
119 | int extra_cost; /* Cost for using (a) scratch register(s) to be taken | |
120 | into account by copy_cost. */ | |
121 | /* The next two members are for the use of the backward | |
122 | compatibility hook. */ | |
123 | struct secondary_reload_info *prev_sri; | |
124 | int t_icode; /* Actually an enum insn_code - see above. */ | |
84562394 | 125 | }; |
8a99f6f9 | 126 | |
b198261f MK |
127 | /* This is defined in sched-int.h . */ |
128 | struct _dep; | |
8a99f6f9 | 129 | |
67186a97 TS |
130 | /* This is defined in ddg.h . */ |
131 | struct ddg; | |
132 | ||
40ac4f73 CB |
133 | /* This is defined in cfgloop.h . */ |
134 | struct loop; | |
135 | ||
7352c013 | 136 | /* This is defined in tree-ssa-alias.h. */ |
84562394 | 137 | struct ao_ref; |
7352c013 | 138 | |
c3e7ee41 BS |
139 | /* This is defined in tree-vectorizer.h. */ |
140 | struct _stmt_vec_info; | |
141 | ||
142 | /* These are defined in tree-vect-stmts.c. */ | |
143 | extern tree stmt_vectype (struct _stmt_vec_info *); | |
144 | extern bool stmt_in_inner_loop_p (struct _stmt_vec_info *); | |
145 | ||
24b97832 ILT |
146 | /* Assembler instructions for creating various kinds of integer object. */ |
147 | ||
148 | struct asm_int_op | |
149 | { | |
150 | const char *hi; | |
151 | const char *si; | |
152 | const char *di; | |
153 | const char *ti; | |
154 | }; | |
155 | ||
35e1a5e7 IR |
156 | /* Types of costs for vectorizer cost model. */ |
157 | enum vect_cost_for_stmt | |
158 | { | |
159 | scalar_stmt, | |
160 | scalar_load, | |
161 | scalar_store, | |
162 | vector_stmt, | |
163 | vector_load, | |
164 | unaligned_load, | |
720f5239 | 165 | unaligned_store, |
35e1a5e7 IR |
166 | vector_store, |
167 | vec_to_scalar, | |
168 | scalar_to_vec, | |
169 | cond_branch_not_taken, | |
170 | cond_branch_taken, | |
8bd37302 | 171 | vec_perm, |
a21892ad BS |
172 | vec_promote_demote, |
173 | vec_construct | |
35e1a5e7 IR |
174 | }; |
175 | ||
92345349 BS |
176 | /* Separate locations for which the vectorizer cost model should |
177 | track costs. */ | |
178 | enum vect_cost_model_location { | |
179 | vect_prologue = 0, | |
180 | vect_body = 1, | |
181 | vect_epilogue = 2 | |
182 | }; | |
183 | ||
24b97832 | 184 | /* The target structure. This holds all the backend hooks. */ |
38f8b050 JR |
185 | #define DEFHOOKPOD(NAME, DOC, TYPE, INIT) TYPE NAME; |
186 | #define DEFHOOK(NAME, DOC, TYPE, PARAMS, INIT) TYPE (* NAME) PARAMS; | |
187 | #define DEFHOOK_UNDOC DEFHOOK | |
188 | #define HOOKSTRUCT(FRAGMENT) FRAGMENT | |
24b97832 | 189 | |
38f8b050 | 190 | #include "target.def" |
672a6f42 | 191 | |
f6897b10 | 192 | extern struct gcc_target targetm; |
59587b18 | 193 | |
d5cc9181 JR |
194 | #ifdef GCC_TM_H |
195 | ||
196 | #ifndef CUMULATIVE_ARGS_MAGIC | |
197 | #define CUMULATIVE_ARGS_MAGIC ((void *) &targetm.calls) | |
198 | #endif | |
199 | ||
200 | static inline CUMULATIVE_ARGS * | |
201 | get_cumulative_args (cumulative_args_t arg) | |
202 | { | |
b2b29377 | 203 | #if CHECKING_P |
d5cc9181 | 204 | gcc_assert (arg.magic == CUMULATIVE_ARGS_MAGIC); |
b2b29377 | 205 | #endif /* CHECKING_P */ |
d5cc9181 JR |
206 | return (CUMULATIVE_ARGS *) arg.p; |
207 | } | |
208 | ||
209 | static inline cumulative_args_t | |
210 | pack_cumulative_args (CUMULATIVE_ARGS *arg) | |
211 | { | |
212 | cumulative_args_t ret; | |
213 | ||
b2b29377 | 214 | #if CHECKING_P |
d5cc9181 | 215 | ret.magic = CUMULATIVE_ARGS_MAGIC; |
b2b29377 | 216 | #endif /* CHECKING_P */ |
d5cc9181 JR |
217 | ret.p = (void *) arg; |
218 | return ret; | |
219 | } | |
220 | #endif /* GCC_TM_H */ | |
221 | ||
59587b18 | 222 | #endif /* GCC_TARGET_H */ |