]> gcc.gnu.org Git - gcc.git/blame - gcc/target.h
builtins.def: Add ctype builtins.
[gcc.git] / gcc / target.h
CommitLineData
672a6f42 1/* Data structure definitions for a generic GCC target.
d9221e01 2 Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
672a6f42
NB
3
4This program is free software; you can redistribute it and/or modify it
5under the terms of the GNU General Public License as published by the
6Free Software Foundation; either version 2, or (at your option) any
7later version.
8
9This program is distributed in the hope that it will be useful,
10but WITHOUT ANY WARRANTY; without even the implied warranty of
11MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12GNU General Public License for more details.
13
14You should have received a copy of the GNU General Public License
15along with this program; if not, write to the Free Software
16Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
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/* This file contains a data structure that describes a GCC target.
17b53c33 23 At present it is incomplete, but in future it should grow to
672a6f42
NB
24 contain most or all target machine and target O/S specific
25 information.
26
27 This structure has its initializer declared in target-def.h in the
28 form of large macro TARGET_INITIALIZER that expands to many smaller
29 macros.
30
31 The smaller macros each initialize one component of the structure,
32 and each has a default. Each target should have a file that
33 includes target.h and target-def.h, and overrides any inappropriate
34 defaults by undefining the relevant macro and defining a suitable
35 replacement. That file should then contain the definition of
f6897b10 36 "targetm" like so:
672a6f42 37
f6897b10 38 struct gcc_target targetm = TARGET_INITIALIZER;
672a6f42
NB
39
40 Doing things this way allows us to bring together everything that
17b53c33
NB
41 defines a GCC target. By supplying a default that is appropriate
42 to most targets, we can easily add new items without needing to
43 edit dozens of target configuration files. It should also allow us
44 to gradually reduce the amount of conditional compilation that is
45 scattered throughout GCC. */
672a6f42 46
7bb1ad93
GK
47#include "tm.h"
48
672a6f42
NB
49struct gcc_target
50{
08c148a8
NB
51 /* Functions that output assembler for the target. */
52 struct asm_out
53 {
17b53c33
NB
54 /* Opening and closing parentheses for asm expression grouping. */
55 const char *open_paren, *close_paren;
56
301d03af
RS
57 /* Assembler instructions for creating various kinds of integer object. */
58 const char *byte_op;
59 struct asm_int_op
60 {
61 const char *hi;
62 const char *si;
63 const char *di;
64 const char *ti;
65 } aligned_op, unaligned_op;
66
67 /* Try to output the assembler code for an integer object whose
68 value is given by X. SIZE is the size of the object in bytes and
69 ALIGNED_P indicates whether it is aligned. Return true if
70 successful. Only handles cases for which BYTE_OP, ALIGNED_OP
71 and UNALIGNED_OP are NULL. */
46c5ad27 72 bool (* integer) (rtx x, unsigned int size, int aligned_p);
301d03af 73
5eb99654 74 /* Output code that will globalize a label. */
46c5ad27 75 void (* globalize_label) (FILE *, const char *);
5eb99654 76
4746cf84
MA
77 /* Output code that will emit a label for unwind info, if this
78 target requires such labels. Second argument is the decl the
79 unwind info is associated with, third is is a boolean: true if
80 this is only a placeholder for an omitted FDE. */
81 void (* unwind_label ) (FILE *, tree, int);
82
4977bab6 83 /* Output an internal label. */
46c5ad27 84 void (* internal_label) (FILE *, const char *, unsigned long);
4977bab6 85
93638d7a
AM
86 /* Emit an assembler directive to set visibility for the symbol
87 associated with the tree decl. */
46c5ad27 88 void (* visibility) (tree, int);
93638d7a 89
08c148a8 90 /* Output the assembler code for entry to a function. */
46c5ad27 91 void (* function_prologue) (FILE *, HOST_WIDE_INT);
08c148a8 92
b4c25db2 93 /* Output the assembler code for end of prologue. */
46c5ad27 94 void (* function_end_prologue) (FILE *);
b4c25db2
NB
95
96 /* Output the assembler code for start of epilogue. */
46c5ad27 97 void (* function_begin_epilogue) (FILE *);
b4c25db2 98
08c148a8 99 /* Output the assembler code for function exit. */
46c5ad27 100 void (* function_epilogue) (FILE *, HOST_WIDE_INT);
7c262518 101
715bdd29
RH
102 /* Switch to an arbitrary section NAME with attributes as
103 specified by FLAGS. */
46c5ad27 104 void (* named_section) (const char *, unsigned int);
2cc07db4 105
07c9d2eb 106 /* Switch to the section that holds the exception table. */
46c5ad27 107 void (* exception_section) (void);
07c9d2eb
SS
108
109 /* Switch to the section that holds the exception frames. */
46c5ad27 110 void (* eh_frame_section) (void);
07c9d2eb 111
ae46c4e0 112 /* Select and switch to a section for EXP. It may be a DECL or a
0864034e
ZW
113 constant. RELOC is nonzero if runtime relocations must be applied;
114 bit 1 will be set if the runtime relocations require non-local
115 name resolution. ALIGN is the required alignment of the data. */
46c5ad27 116 void (* select_section) (tree, int, unsigned HOST_WIDE_INT);
ae46c4e0 117
b64a1b53
RH
118 /* Select and switch to a section for X with MODE. ALIGN is
119 the desired alignment of the data. */
46c5ad27
AJ
120 void (* select_rtx_section) (enum machine_mode, rtx,
121 unsigned HOST_WIDE_INT);
b64a1b53 122
ae46c4e0
RH
123 /* Select a unique section name for DECL. RELOC is the same as
124 for SELECT_SECTION. */
46c5ad27 125 void (* unique_section) (tree, int);
ae46c4e0 126
2cc07db4 127 /* Output a constructor for a symbol with a given priority. */
46c5ad27 128 void (* constructor) (rtx, int);
2cc07db4
RH
129
130 /* Output a destructor for a symbol with a given priority. */
46c5ad27 131 void (* destructor) (rtx, int);
483ab821 132
3961e8fe
RH
133 /* Output the assembler code for a thunk function. THUNK_DECL is the
134 declaration for the thunk function itself, FUNCTION is the decl for
135 the target function. DELTA is an immediate constant offset to be
476c5eb6 136 added to THIS. If VCALL_OFFSET is nonzero, the word at
3961e8fe 137 *(*this + vcall_offset) should be added to THIS. */
46c5ad27
AJ
138 void (* output_mi_thunk) (FILE *file, tree thunk_decl,
139 HOST_WIDE_INT delta, HOST_WIDE_INT vcall_offset,
140 tree function_decl);
3961e8fe
RH
141
142 /* Determine whether output_mi_thunk would succeed. */
143 /* ??? Ideally, this hook would not exist, and success or failure
144 would be returned from output_mi_thunk directly. But there's
145 too much undo-able setup involved in invoking output_mi_thunk.
146 Could be fixed by making output_mi_thunk emit rtl instead of
147 text to the output file. */
46c5ad27
AJ
148 bool (* can_output_mi_thunk) (tree thunk_decl, HOST_WIDE_INT delta,
149 HOST_WIDE_INT vcall_offset,
150 tree function_decl);
a5fe455b 151
1bc7c5b6
ZW
152 /* Output any boilerplate text needed at the beginning of a
153 translation unit. */
46c5ad27 154 void (*file_start) (void);
1bc7c5b6
ZW
155
156 /* Output any boilerplate text needed at the end of a
157 translation unit. */
46c5ad27 158 void (*file_end) (void);
6773a41c
RO
159
160 /* Output an assembler pseudo-op to declare a library function name
161 external. */
162 void (*external_libcall) (rtx);
08c148a8
NB
163 } asm_out;
164
c237e94a
ZW
165 /* Functions relating to instruction scheduling. */
166 struct sched
167 {
168 /* Given the current cost, COST, of an insn, INSN, calculate and
169 return a new cost based on its relationship to DEP_INSN through
170 the dependence LINK. The default is to make no adjustment. */
46c5ad27 171 int (* adjust_cost) (rtx insn, rtx link, rtx def_insn, int cost);
c237e94a
ZW
172
173 /* Adjust the priority of an insn as you see fit. Returns the new
174 priority. */
46c5ad27 175 int (* adjust_priority) (rtx, int);
c237e94a
ZW
176
177 /* Function which returns the maximum number of insns that can be
178 scheduled in the same machine cycle. This must be constant
179 over an entire compilation. The default is 1. */
46c5ad27 180 int (* issue_rate) (void);
c237e94a
ZW
181
182 /* Calculate how much this insn affects how many more insns we
183 can emit this cycle. Default is they all cost the same. */
46c5ad27 184 int (* variable_issue) (FILE *, int, rtx, int);
41077ce4 185
c237e94a 186 /* Initialize machine-dependent scheduling code. */
46c5ad27 187 void (* md_init) (FILE *, int, int);
c237e94a
ZW
188
189 /* Finalize machine-dependent scheduling code. */
46c5ad27 190 void (* md_finish) (FILE *, int);
c237e94a 191
58565a33
SKG
192 /* Initialize machine-dependent function while scheduling code. */
193 void (* md_init_global) (FILE *, int, int);
194
195 /* Finalize machine-dependent function wide scheduling code. */
196 void (* md_finish_global) (FILE *, int);
197
c237e94a
ZW
198 /* Reorder insns in a machine-dependent fashion, in two different
199 places. Default does nothing. */
46c5ad27
AJ
200 int (* reorder) (FILE *, int, rtx *, int *, int);
201 int (* reorder2) (FILE *, int, rtx *, int *, int);
c237e94a 202
30028c85
VM
203 /* The following member value is a pointer to a function called
204 after evaluation forward dependencies of insns in chain given
205 by two parameter values (head and tail correspondingly). */
46c5ad27 206 void (* dependencies_evaluation_hook) (rtx, rtx);
30028c85 207
fae15c93
VM
208 /* The following member value is a pointer to a function returning
209 nonzero if we should use DFA based scheduling. The default is
210 to use the old pipeline scheduler. */
46c5ad27 211 int (* use_dfa_pipeline_interface) (void);
fae15c93
VM
212 /* The values of all the following members are used only for the
213 DFA based scheduler: */
214 /* The values of the following four members are pointers to
215 functions used to simplify the automaton descriptions.
216 dfa_pre_cycle_insn and dfa_post_cycle_insn give functions
217 returning insns which are used to change the pipeline hazard
218 recognizer state when the new simulated processor cycle
219 correspondingly starts and finishes. The function defined by
220 init_dfa_pre_cycle_insn and init_dfa_post_cycle_insn are used
221 to initialize the corresponding insns. The default values of
d91edf86 222 the members result in not changing the automaton state when
fae15c93
VM
223 the new simulated processor cycle correspondingly starts and
224 finishes. */
46c5ad27
AJ
225 void (* init_dfa_pre_cycle_insn) (void);
226 rtx (* dfa_pre_cycle_insn) (void);
227 void (* init_dfa_post_cycle_insn) (void);
228 rtx (* dfa_post_cycle_insn) (void);
fae15c93
VM
229 /* The following member value is a pointer to a function returning value
230 which defines how many insns in queue `ready' will we try for
231 multi-pass scheduling. if the member value is nonzero and the
232 function returns positive value, the DFA based scheduler will make
233 multi-pass scheduling for the first cycle. In other words, we will
234 try to choose ready insn which permits to start maximum number of
235 insns on the same cycle. */
46c5ad27 236 int (* first_cycle_multipass_dfa_lookahead) (void);
30028c85
VM
237 /* The following member value is pointer to a function controlling
238 what insns from the ready insn queue will be considered for the
239 multipass insn scheduling. If the hook returns zero for insn
240 passed as the parameter, the insn will be not chosen to be
241 issued. */
46c5ad27 242 int (* first_cycle_multipass_dfa_lookahead_guard) (rtx);
30028c85
VM
243 /* The following member value is pointer to a function called by
244 the insn scheduler before issuing insn passed as the third
245 parameter on given cycle. If the hook returns nonzero, the
246 insn is not issued on given processors cycle. Instead of that,
247 the processor cycle is advanced. If the value passed through
248 the last parameter is zero, the insn ready queue is not sorted
249 on the new cycle start as usually. The first parameter passes
250 file for debugging output. The second one passes the scheduler
251 verbose level of the debugging output. The forth and the fifth
252 parameter values are correspondingly processor cycle on which
253 the previous insn has been issued and the current processor
254 cycle. */
46c5ad27 255 int (* dfa_new_cycle) (FILE *, int, rtx, int, int, int *);
fae15c93
VM
256 /* The values of the following members are pointers to functions
257 used to improve the first cycle multipass scheduling by
258 inserting nop insns. dfa_scheduler_bubble gives a function
259 returning a nop insn with given index. The indexes start with
260 zero. The function should return NULL if there are no more nop
261 insns with indexes greater than given index. To initialize the
262 nop insn the function given by member
263 init_dfa_scheduler_bubbles is used. The default values of the
264 members result in not inserting nop insns during the multipass
265 scheduling. */
46c5ad27
AJ
266 void (* init_dfa_bubbles) (void);
267 rtx (* dfa_bubble) (int);
569fa502
DN
268 /* The following member value is a pointer to a function called
269 by the insn scheduler. It should return true if there exists a
270 dependence which is considered costly by the target, between
271 the insn passed as the first parameter, and the insn passed as
272 the second parameter. The third parameter is the INSN_DEPEND
273 link that represents the dependence between the two insns. The
274 fourth argument is the cost of the dependence as estimated by
275 the scheduler. The last argument is the distance in cycles
276 between the already scheduled insn (first parameter) and the
80fcc7bc
SB
277 the second insn (second parameter). */
278 bool (* is_costly_dependence) (rtx, rtx, rtx, int, int);
c237e94a
ZW
279 } sched;
280
672a6f42 281 /* Given two decls, merge their attributes and return the result. */
46c5ad27 282 tree (* merge_decl_attributes) (tree, tree);
672a6f42
NB
283
284 /* Given two types, merge their attributes and return the result. */
46c5ad27 285 tree (* merge_type_attributes) (tree, tree);
672a6f42 286
349ae713
NB
287 /* Table of machine attributes and functions to handle them.
288 Ignored if NULL. */
91d231cb 289 const struct attribute_spec *attribute_table;
8d8e52be
JM
290
291 /* Return zero if the attributes on TYPE1 and TYPE2 are incompatible,
292 one if they are compatible and two if they are nearly compatible
293 (which causes a warning to be generated). */
46c5ad27 294 int (* comp_type_attributes) (tree type1, tree type2);
8d8e52be
JM
295
296 /* Assign default attributes to the newly defined TYPE. */
46c5ad27 297 void (* set_default_type_attributes) (tree type);
12a68f1f
JM
298
299 /* Insert attributes on the newly created DECL. */
46c5ad27 300 void (* insert_attributes) (tree decl, tree *attributes);
f6155fda 301
91d231cb
JM
302 /* Return true if FNDECL (which has at least one machine attribute)
303 can be inlined despite its machine attributes, false otherwise. */
46c5ad27 304 bool (* function_attribute_inlinable_p) (tree fndecl);
91d231cb 305
f913c102
AO
306 /* Return true if bitfields in RECORD_TYPE should follow the
307 Microsoft Visual C++ bitfield layout rules. */
46c5ad27 308 bool (* ms_bitfield_layout_p) (tree record_type);
f913c102 309
f6155fda 310 /* Set up target-specific built-in functions. */
46c5ad27 311 void (* init_builtins) (void);
f6155fda
SS
312
313 /* Expand a target-specific builtin. */
46c5ad27
AJ
314 rtx (* expand_builtin) (tree exp, rtx target, rtx subtarget,
315 enum machine_mode mode, int ignore);
7c262518 316
f18eca82
ZL
317 /* For a vendor-specific fundamental TYPE, return a pointer to
318 a statically-allocated string containing the C++ mangling for
319 TYPE. In all other cases, return NULL. */
320 const char * (* mangle_fundamental_type) (tree type);
321
c15c90bb
ZW
322 /* Make any adjustments to libfunc names needed for this target. */
323 void (* init_libfuncs) (void);
324
7c262518
RH
325 /* Given a decl, a section name, and whether the decl initializer
326 has relocs, choose attributes for the section. */
327 /* ??? Should be merged with SELECT_SECTION and UNIQUE_SECTION. */
46c5ad27 328 unsigned int (* section_type_flags) (tree, const char *, int);
7c262518 329
e4ec2cac
AO
330 /* True if new jumps cannot be created, to replace existing ones or
331 not, at the current point in the compilation. */
46c5ad27 332 bool (* cannot_modify_jumps_p) (void);
ae46c4e0 333
a3424f5c
RH
334 /* Return a register class for which branch target register
335 optimizations should be applied. */
46c5ad27 336 int (* branch_target_register_class) (void);
a3424f5c
RH
337
338 /* Return true if branch target register optimizations should include
339 callee-saved registers that are not already live during the current
340 function. AFTER_PE_GEN is true if prologues and epilogues have
341 already been generated. */
46c5ad27 342 bool (* branch_target_register_callee_saved) (bool after_pe_gen);
fe3ad572 343
3a04ff64 344 /* True if the constant X cannot be placed in the constant pool. */
46c5ad27 345 bool (* cannot_force_const_mem) (rtx);
3a04ff64 346
0b077eac 347 /* True if the insn X cannot be duplicated. */
46c5ad27 348 bool (* cannot_copy_insn_p) (rtx);
0b077eac 349
7daebb7a 350 /* Given an address RTX, undo the effects of LEGITIMIZE_ADDRESS. */
46c5ad27 351 rtx (* delegitimize_address) (rtx);
7daebb7a 352
4977bab6
ZW
353 /* True if it is OK to do sibling call optimization for the specified
354 call expression EXP. DECL will be the called function, or NULL if
355 this is an indirect call. */
46c5ad27
AJ
356 bool (*function_ok_for_sibcall) (tree decl, tree exp);
357
ae46c4e0 358 /* True if EXP should be placed in a "small data" section. */
46c5ad27 359 bool (* in_small_data_p) (tree);
fb49053f 360
47754fd5
RH
361 /* True if EXP names an object for which name resolution must resolve
362 to the current module. */
46c5ad27 363 bool (* binds_local_p) (tree);
47754fd5 364
fb49053f
RH
365 /* Do something target-specific to record properties of the DECL into
366 the associated SYMBOL_REF. */
46c5ad27 367 void (* encode_section_info) (tree, rtx, int);
772c5265
RH
368
369 /* Undo the effects of encode_section_info on the symbol string. */
46c5ad27 370 const char * (* strip_name_encoding) (const char *);
47754fd5 371
3c50106f 372 /* True if MODE is valid for a pointer in __attribute__((mode("MODE"))). */
46c5ad27 373 bool (* valid_pointer_mode) (enum machine_mode mode);
3c50106f 374
c8e4f0e9 375 /* True if a vector is opaque. */
46c5ad27 376 bool (* vector_opaque_p) (tree);
62e1dfcf 377
3c50106f
RH
378 /* Compute a (partial) cost for rtx X. Return true if the complete
379 cost has been computed, and false if subexpressions should be
380 scanned. In either case, *TOTAL contains the cost result. */
381 /* Note that CODE and OUTER_CODE ought to be RTX_CODE, but that's
382 not necessarily defined at this point. */
46c5ad27 383 bool (* rtx_costs) (rtx x, int code, int outer_code, int *total);
3c50106f 384
dcefdf67
RH
385 /* Compute the cost of X, used as an address. Never called with
386 invalid addresses. */
46c5ad27 387 int (* address_cost) (rtx x);
dcefdf67 388
96714395
AH
389 /* Given a register, this hook should return a parallel of registers
390 to represent where to find the register pieces. Define this hook
391 if the register and its mode are represented in Dwarf in
392 non-contiguous locations, or if the register should be
393 represented in more than one register in Dwarf. Otherwise, this
394 hook should return NULL_RTX. */
46c5ad27 395 rtx (* dwarf_register_span) (rtx);
96714395 396
e129d93a
ILT
397 /* Fetch the fixed register(s) which hold condition codes, for
398 targets where it makes sense to look for duplicate assignments to
399 the condition codes. This should return true if there is such a
400 register, false otherwise. The arguments should be set to the
401 fixed register numbers. Up to two condition code registers are
402 supported. If there is only one for this target, the int pointed
403 at by the second argument should be set to -1. */
404 bool (* fixed_condition_code_regs) (unsigned int *, unsigned int *);
405
406 /* If two condition code modes are compatible, return a condition
407 code mode which is compatible with both, such that a comparison
408 done in the returned mode will work for both of the original
409 modes. If the condition code modes are not compatible, return
410 VOIDmode. */
411 enum machine_mode (* cc_modes_compatible) (enum machine_mode,
412 enum machine_mode);
413
18dbd950
RS
414 /* Do machine-dependent code transformations. Called just before
415 delayed-branch scheduling. */
46c5ad27 416 void (* machine_dependent_reorg) (void);
18dbd950 417
c35d187f
RH
418 /* Create the __builtin_va_list type. */
419 tree (* build_builtin_va_list) (void);
420
7bb1ad93
GK
421 /* Validity-checking routines for PCH files, target-specific.
422 get_pch_validity returns a pointer to the data to be stored,
423 and stores the size in its argument. pch_valid_p gets the same
424 information back and returns NULL if the PCH is valid,
425 or an error message if not.
426 */
427 void * (* get_pch_validity) (size_t *);
428 const char * (* pch_valid_p) (const void *, size_t);
429
a841ab8b 430 /* True if the compiler should give an enum type only as many
221ee7c9
KH
431 bytes as it takes to represent the range of possible values of
432 that type. */
433 bool (* default_short_enums) (void);
434
d6da68b9 435 /* This target hook returns an rtx that is used to store the address
a841ab8b 436 of the current frame into the built-in setjmp buffer. */
d6da68b9
KH
437 rtx (* builtin_setjmp_frame_value) (void);
438
67dfe110
KH
439 /* This target hook should add STRING_CST trees for any hard regs
440 the port wishes to automatically clobber for all asms. */
441 tree (* md_asm_clobbers) (tree);
442
42ba5130
RH
443 /* Functions relating to calls - argument passing, returns, etc. */
444 struct calls {
445 bool (*promote_function_args) (tree fntype);
446 bool (*promote_function_return) (tree fntype);
447 bool (*promote_prototypes) (tree fntype);
448 rtx (*struct_value_rtx) (tree fndecl, int incoming);
449 bool (*return_in_memory) (tree type, tree fndecl);
450 bool (*return_in_msb) (tree type);
451 rtx (*expand_builtin_saveregs) (void);
452 /* Returns pretend_argument_size. */
453 void (*setup_incoming_varargs) (CUMULATIVE_ARGS *ca, enum machine_mode mode,
454 tree type, int *pretend_arg_size,
455 int second_time);
456 bool (*strict_argument_naming) (CUMULATIVE_ARGS *ca);
457 /* Returns true if we should use
458 targetm.calls.setup_incoming_varargs() and/or
459 targetm.calls.strict_argument_naming(). */
460 bool (*pretend_outgoing_varargs_named) (CUMULATIVE_ARGS *ca);
461
462 /* Given a complex type T, return true if a parameter of type T
463 should be passed as two scalars. */
464 bool (* split_complex_arg) (tree type);
465 } calls;
466
47754fd5
RH
467 /* Leave the boolean fields at the end. */
468
469 /* True if arbitrary sections are supported. */
470 bool have_named_sections;
471
472 /* True if "native" constructors and destructors are supported,
473 false if we're using collect2 for the job. */
474 bool have_ctors_dtors;
3d78f2e9
RH
475
476 /* True if thread-local storage is supported. */
477 bool have_tls;
275b6d80
DE
478
479 /* True if a small readonly data section is supported. */
480 bool have_srodata_section;
7606e68f
SS
481
482 /* True if EH frame info sections should be zero-terminated. */
483 bool terminate_dw2_eh_frame_info;
1bc7c5b6
ZW
484
485 /* True if #NO_APP should be emitted at the beginning of
486 assembly output. */
487 bool file_start_app_off;
488
489 /* True if output_file_directive should be called for main_input_filename
490 at the beginning of assembly output. */
491 bool file_start_file_directive;
61f71b34 492
42ba5130 493 /* Leave the boolean fields at the end. */
672a6f42
NB
494};
495
f6897b10 496extern struct gcc_target targetm;
This page took 1.144007 seconds and 5 git commands to generate.