00001 /* Data structure definitions for a generic GCC target. 00002 Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007 00003 Free Software Foundation, Inc. 00004 00005 This program is free software; you can redistribute it and/or modify it 00006 under the terms of the GNU General Public License as published by the 00007 Free Software Foundation; either version 2, or (at your option) any 00008 later version. 00009 00010 This program is distributed in the hope that it will be useful, 00011 but WITHOUT ANY WARRANTY; without even the implied warranty of 00012 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00013 GNU General Public License for more details. 00014 00015 You should have received a copy of the GNU General Public License 00016 along with this program; if not, write to the Free Software 00017 Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. 00018 00019 In other words, you are welcome to use, share and improve this program. 00020 You are forbidden to forbid anyone else to use, share and improve 00021 what you give them. Help stamp out software-hoarding! */ 00022 00023 /* This file contains a data structure that describes a GCC target. 00024 At present it is incomplete, but in future it should grow to 00025 contain most or all target machine and target O/S specific 00026 information. 00027 00028 This structure has its initializer declared in target-def.h in the 00029 form of large macro TARGET_INITIALIZER that expands to many smaller 00030 macros. 00031 00032 The smaller macros each initialize one component of the structure, 00033 and each has a default. Each target should have a file that 00034 includes target.h and target-def.h, and overrides any inappropriate 00035 defaults by undefining the relevant macro and defining a suitable 00036 replacement. That file should then contain the definition of 00037 "targetm" like so: 00038 00039 struct gcc_target targetm = TARGET_INITIALIZER; 00040 00041 Doing things this way allows us to bring together everything that 00042 defines a GCC target. By supplying a default that is appropriate 00043 to most targets, we can easily add new items without needing to 00044 edit dozens of target configuration files. It should also allow us 00045 to gradually reduce the amount of conditional compilation that is 00046 scattered throughout GCC. */ 00047 00048 #ifndef GCC_TARGET_H 00049 #define GCC_TARGET_H 00050 00051 #include "tm.h" 00052 #include "insn-modes.h" 00053 00054 struct stdarg_info; 00055 struct spec_info_def; 00056 00057 /* The struct used by the secondary_reload target hook. */ 00058 typedef struct secondary_reload_info 00059 { 00060 /* icode is actually an enum insn_code, but we don't want to force every 00061 file that includes target.h to include optabs.h . */ 00062 int icode; 00063 int extra_cost; /* Cost for using (a) scratch register(s) to be taken 00064 into account by copy_cost. */ 00065 /* The next two members are for the use of the backward 00066 compatibility hook. */ 00067 struct secondary_reload_info *prev_sri; 00068 int t_icode; /* Actually an enum insn_code - see above. */ 00069 } secondary_reload_info; 00070 00071 00072 struct gcc_target 00073 { 00074 /* Functions that output assembler for the target. */ 00075 struct asm_out 00076 { 00077 /* Opening and closing parentheses for asm expression grouping. */ 00078 const char *open_paren, *close_paren; 00079 00080 /* Assembler instructions for creating various kinds of integer object. */ 00081 const char *byte_op; 00082 struct asm_int_op 00083 { 00084 const char *hi; 00085 const char *si; 00086 const char *di; 00087 const char *ti; 00088 } aligned_op, unaligned_op; 00089 00090 /* Try to output the assembler code for an integer object whose 00091 value is given by X. SIZE is the size of the object in bytes and 00092 ALIGNED_P indicates whether it is aligned. Return true if 00093 successful. Only handles cases for which BYTE_OP, ALIGNED_OP 00094 and UNALIGNED_OP are NULL. */ 00095 bool (* integer) (rtx x, unsigned int size, int aligned_p); 00096 00097 /* Output code that will globalize a label. */ 00098 void (* globalize_label) (FILE *, const char *); 00099 00100 /* Output code that will emit a label for unwind info, if this 00101 target requires such labels. Second argument is the decl the 00102 unwind info is associated with, third is a boolean: true if 00103 this is for exception handling, fourth is a boolean: true if 00104 this is only a placeholder for an omitted FDE. */ 00105 void (* unwind_label) (FILE *, tree, int, int); 00106 00107 /* Output code that will emit a label to divide up the exception 00108 table. */ 00109 void (* except_table_label) (FILE *); 00110 00111 /* Emit any directives required to unwind this instruction. */ 00112 void (* unwind_emit) (FILE *, rtx); 00113 00114 /* Output an internal label. */ 00115 void (* internal_label) (FILE *, const char *, unsigned long); 00116 00117 /* Emit a ttype table reference to a typeinfo object. */ 00118 bool (* ttype) (rtx); 00119 00120 /* Emit an assembler directive to set visibility for the symbol 00121 associated with the tree decl. */ 00122 void (* visibility) (tree, int); 00123 00124 /* Output the assembler code for entry to a function. */ 00125 void (* function_prologue) (FILE *, HOST_WIDE_INT); 00126 00127 /* Output the assembler code for end of prologue. */ 00128 void (* function_end_prologue) (FILE *); 00129 00130 /* Output the assembler code for start of epilogue. */ 00131 void (* function_begin_epilogue) (FILE *); 00132 00133 /* Output the assembler code for function exit. */ 00134 void (* function_epilogue) (FILE *, HOST_WIDE_INT); 00135 00136 /* Initialize target-specific sections. */ 00137 void (* init_sections) (void); 00138 00139 /* Tell assembler to change to section NAME with attributes FLAGS. 00140 If DECL is non-NULL, it is the VAR_DECL or FUNCTION_DECL with 00141 which this section is associated. */ 00142 void (* named_section) (const char *name, unsigned int flags, tree decl); 00143 00144 /* Return a mask describing how relocations should be treated when 00145 selecting sections. Bit 1 should be set if global relocations 00146 should be placed in a read-write section; bit 0 should be set if 00147 local relocations should be placed in a read-write section. */ 00148 int (*reloc_rw_mask) (void); 00149 00150 /* Return a section for EXP. It may be a DECL or a constant. RELOC 00151 is nonzero if runtime relocations must be applied; bit 1 will be 00152 set if the runtime relocations require non-local name resolution. 00153 ALIGN is the required alignment of the data. */ 00154 section *(* select_section) (tree, int, unsigned HOST_WIDE_INT); 00155 00156 /* Return a section for X. MODE is X's mode and ALIGN is its 00157 alignment in bits. */ 00158 section *(* select_rtx_section) (enum machine_mode, rtx, 00159 unsigned HOST_WIDE_INT); 00160 00161 /* Select a unique section name for DECL. RELOC is the same as 00162 for SELECT_SECTION. */ 00163 void (* unique_section) (tree, int); 00164 00165 /* Return the readonly data section associated with function DECL. */ 00166 section *(* function_rodata_section) (tree); 00167 00168 /* Output a constructor for a symbol with a given priority. */ 00169 void (* constructor) (rtx, int); 00170 00171 /* Output a destructor for a symbol with a given priority. */ 00172 void (* destructor) (rtx, int); 00173 00174 /* Output the assembler code for a thunk function. THUNK_DECL is the 00175 declaration for the thunk function itself, FUNCTION is the decl for 00176 the target function. DELTA is an immediate constant offset to be 00177 added to THIS. If VCALL_OFFSET is nonzero, the word at 00178 *(*this + vcall_offset) should be added to THIS. */ 00179 void (* output_mi_thunk) (FILE *file, tree thunk_decl, 00180 HOST_WIDE_INT delta, HOST_WIDE_INT vcall_offset, 00181 tree function_decl); 00182 00183 /* Determine whether output_mi_thunk would succeed. */ 00184 /* ??? Ideally, this hook would not exist, and success or failure 00185 would be returned from output_mi_thunk directly. But there's 00186 too much undo-able setup involved in invoking output_mi_thunk. 00187 Could be fixed by making output_mi_thunk emit rtl instead of 00188 text to the output file. */ 00189 bool (* can_output_mi_thunk) (tree thunk_decl, HOST_WIDE_INT delta, 00190 HOST_WIDE_INT vcall_offset, 00191 tree function_decl); 00192 00193 /* Output any boilerplate text needed at the beginning of a 00194 translation unit. */ 00195 void (*file_start) (void); 00196 00197 /* Output any boilerplate text needed at the end of a 00198 translation unit. */ 00199 void (*file_end) (void); 00200 00201 /* Output an assembler pseudo-op to declare a library function name 00202 external. */ 00203 void (*external_libcall) (rtx); 00204 00205 /* Output an assembler directive to mark decl live. This instructs 00206 linker to not dead code strip this symbol. */ 00207 void (*mark_decl_preserved) (const char *); 00208 00209 /* Output the definition of a section anchor. */ 00210 void (*output_anchor) (rtx); 00211 00212 /* Output a DTP-relative reference to a TLS symbol. */ 00213 void (*output_dwarf_dtprel) (FILE *file, int size, rtx x); 00214 00215 } asm_out; 00216 00217 /* Functions relating to instruction scheduling. */ 00218 struct sched 00219 { 00220 /* Given the current cost, COST, of an insn, INSN, calculate and 00221 return a new cost based on its relationship to DEP_INSN through 00222 the dependence LINK. The default is to make no adjustment. */ 00223 int (* adjust_cost) (rtx insn, rtx link, rtx def_insn, int cost); 00224 00225 /* Adjust the priority of an insn as you see fit. Returns the new 00226 priority. */ 00227 int (* adjust_priority) (rtx, int); 00228 00229 /* Function which returns the maximum number of insns that can be 00230 scheduled in the same machine cycle. This must be constant 00231 over an entire compilation. The default is 1. */ 00232 int (* issue_rate) (void); 00233 00234 /* Calculate how much this insn affects how many more insns we 00235 can emit this cycle. Default is they all cost the same. */ 00236 int (* variable_issue) (FILE *, int, rtx, int); 00237 00238 /* Initialize machine-dependent scheduling code. */ 00239 void (* md_init) (FILE *, int, int); 00240 00241 /* Finalize machine-dependent scheduling code. */ 00242 void (* md_finish) (FILE *, int); 00243 00244 /* Initialize machine-dependent function while scheduling code. */ 00245 void (* md_init_global) (FILE *, int, int); 00246 00247 /* Finalize machine-dependent function wide scheduling code. */ 00248 void (* md_finish_global) (FILE *, int); 00249 00250 /* Reorder insns in a machine-dependent fashion, in two different 00251 places. Default does nothing. */ 00252 int (* reorder) (FILE *, int, rtx *, int *, int); 00253 int (* reorder2) (FILE *, int, rtx *, int *, int); 00254 00255 /* The following member value is a pointer to a function called 00256 after evaluation forward dependencies of insns in chain given 00257 by two parameter values (head and tail correspondingly). */ 00258 void (* dependencies_evaluation_hook) (rtx, rtx); 00259 00260 /* The values of the following four members are pointers to 00261 functions used to simplify the automaton descriptions. 00262 dfa_pre_cycle_insn and dfa_post_cycle_insn give functions 00263 returning insns which are used to change the pipeline hazard 00264 recognizer state when the new simulated processor cycle 00265 correspondingly starts and finishes. The function defined by 00266 init_dfa_pre_cycle_insn and init_dfa_post_cycle_insn are used 00267 to initialize the corresponding insns. The default values of 00268 the members result in not changing the automaton state when 00269 the new simulated processor cycle correspondingly starts and 00270 finishes. */ 00271 void (* init_dfa_pre_cycle_insn) (void); 00272 rtx (* dfa_pre_cycle_insn) (void); 00273 void (* init_dfa_post_cycle_insn) (void); 00274 rtx (* dfa_post_cycle_insn) (void); 00275 00276 /* The following member value is a pointer to a function returning value 00277 which defines how many insns in queue `ready' will we try for 00278 multi-pass scheduling. If the member value is nonzero and the 00279 function returns positive value, the DFA based scheduler will make 00280 multi-pass scheduling for the first cycle. In other words, we will 00281 try to choose ready insn which permits to start maximum number of 00282 insns on the same cycle. */ 00283 int (* first_cycle_multipass_dfa_lookahead) (void); 00284 00285 /* The following member value is pointer to a function controlling 00286 what insns from the ready insn queue will be considered for the 00287 multipass insn scheduling. If the hook returns zero for insn 00288 passed as the parameter, the insn will be not chosen to be 00289 issued. */ 00290 int (* first_cycle_multipass_dfa_lookahead_guard) (rtx); 00291 00292 /* The following member value is pointer to a function called by 00293 the insn scheduler before issuing insn passed as the third 00294 parameter on given cycle. If the hook returns nonzero, the 00295 insn is not issued on given processors cycle. Instead of that, 00296 the processor cycle is advanced. If the value passed through 00297 the last parameter is zero, the insn ready queue is not sorted 00298 on the new cycle start as usually. The first parameter passes 00299 file for debugging output. The second one passes the scheduler 00300 verbose level of the debugging output. The forth and the fifth 00301 parameter values are correspondingly processor cycle on which 00302 the previous insn has been issued and the current processor 00303 cycle. */ 00304 int (* dfa_new_cycle) (FILE *, int, rtx, int, int, int *); 00305 00306 /* The following member value is a pointer to a function called 00307 by the insn scheduler. It should return true if there exists a 00308 dependence which is considered costly by the target, between 00309 the insn passed as the first parameter, and the insn passed as 00310 the second parameter. The third parameter is the INSN_DEPEND 00311 link that represents the dependence between the two insns. The 00312 fourth argument is the cost of the dependence as estimated by 00313 the scheduler. The last argument is the distance in cycles 00314 between the already scheduled insn (first parameter) and the 00315 the second insn (second parameter). */ 00316 bool (* is_costly_dependence) (rtx, rtx, rtx, int, int); 00317 00318 /* Given the current cost, COST, of an insn, INSN, calculate and 00319 return a new cost based on its relationship to DEP_INSN through the 00320 dependence of type DEP_TYPE. The default is to make no adjustment. */ 00321 int (* adjust_cost_2) (rtx insn, int, rtx def_insn, int cost); 00322 00323 /* The following member value is a pointer to a function called 00324 by the insn scheduler. This hook is called to notify the backend 00325 that new instructions were emitted. */ 00326 void (* h_i_d_extended) (void); 00327 00328 /* The following member value is a pointer to a function called 00329 by the insn scheduler. 00330 The first parameter is an instruction, the second parameter is the type 00331 of the requested speculation, and the third parameter is a pointer to the 00332 speculative pattern of the corresponding type (set if return value == 1). 00333 It should return 00334 -1, if there is no pattern, that will satisfy the requested speculation 00335 type, 00336 0, if current pattern satisfies the requested speculation type, 00337 1, if pattern of the instruction should be changed to the newly 00338 generated one. */ 00339 int (* speculate_insn) (rtx, int, rtx *); 00340 00341 /* The following member value is a pointer to a function called 00342 by the insn scheduler. It should return true if the check instruction 00343 corresponding to the instruction passed as the parameter needs a 00344 recovery block. */ 00345 bool (* needs_block_p) (rtx); 00346 00347 /* The following member value is a pointer to a function called 00348 by the insn scheduler. It should return a pattern for the check 00349 instruction. 00350 The first parameter is a speculative instruction, the second parameter 00351 is the label of the corresponding recovery block (or null, if it is a 00352 simple check). If the mutation of the check is requested (e.g. from 00353 ld.c to chk.a), the third parameter is true - in this case the first 00354 parameter is the previous check. */ 00355 rtx (* gen_check) (rtx, rtx, bool); 00356 00357 /* The following member value is a pointer to a function controlling 00358 what insns from the ready insn queue will be considered for the 00359 multipass insn scheduling. If the hook returns zero for the insn 00360 passed as the parameter, the insn will not be chosen to be 00361 issued. This hook is used to discard speculative instructions, 00362 that stand at the first position of the ready list. */ 00363 bool (* first_cycle_multipass_dfa_lookahead_guard_spec) (rtx); 00364 00365 /* The following member value is a pointer to a function that provides 00366 information about the speculation capabilities of the target. 00367 The parameter is a pointer to spec_info variable. */ 00368 void (* set_sched_flags) (struct spec_info_def *); 00369 } sched; 00370 00371 /* Functions relating to vectorization. */ 00372 struct vectorize 00373 { 00374 /* The following member value is a pointer to a function called 00375 by the vectorizer, and return the decl of the target builtin 00376 function. */ 00377 tree (* builtin_mask_for_load) (void); 00378 } vectorize; 00379 00380 /* The initial value of target_flags. */ 00381 int default_target_flags; 00382 00383 /* Handle target switch CODE (an OPT_* value). ARG is the argument 00384 passed to the switch; it is NULL if no argument was. VALUE is the 00385 value of ARG if CODE specifies a UInteger option, otherwise it is 00386 1 if the positive form of the switch was used and 0 if the negative 00387 form was. Return true if the switch was valid. */ 00388 bool (* handle_option) (size_t code, const char *arg, int value); 00389 00390 /* Return machine mode for filter value. */ 00391 enum machine_mode (* eh_return_filter_mode) (void); 00392 00393 /* Given two decls, merge their attributes and return the result. */ 00394 tree (* merge_decl_attributes) (tree, tree); 00395 00396 /* Given two types, merge their attributes and return the result. */ 00397 tree (* merge_type_attributes) (tree, tree); 00398 00399 /* Table of machine attributes and functions to handle them. 00400 Ignored if NULL. */ 00401 const struct attribute_spec *attribute_table; 00402 00403 /* Return zero if the attributes on TYPE1 and TYPE2 are incompatible, 00404 one if they are compatible and two if they are nearly compatible 00405 (which causes a warning to be generated). */ 00406 int (* comp_type_attributes) (tree type1, tree type2); 00407 00408 /* Assign default attributes to the newly defined TYPE. */ 00409 void (* set_default_type_attributes) (tree type); 00410 00411 /* Insert attributes on the newly created DECL. */ 00412 void (* insert_attributes) (tree decl, tree *attributes); 00413 00414 /* Return true if FNDECL (which has at least one machine attribute) 00415 can be inlined despite its machine attributes, false otherwise. */ 00416 bool (* function_attribute_inlinable_p) (tree fndecl); 00417 00418 /* Return true if bitfields in RECORD_TYPE should follow the 00419 Microsoft Visual C++ bitfield layout rules. */ 00420 bool (* ms_bitfield_layout_p) (tree record_type); 00421 00422 /* True if the target supports decimal floating point. */ 00423 bool (* decimal_float_supported_p) (void); 00424 00425 /* Return true if anonymous bitfields affect structure alignment. */ 00426 bool (* align_anon_bitfield) (void); 00427 00428 /* Return true if volatile bitfields should use the narrowest type possible. 00429 Return false if they should use the container type. */ 00430 bool (* narrow_volatile_bitfield) (void); 00431 00432 /* Set up target-specific built-in functions. */ 00433 void (* init_builtins) (void); 00434 00435 /* Expand a target-specific builtin. */ 00436 rtx (* expand_builtin) (tree exp, rtx target, rtx subtarget, 00437 enum machine_mode mode, int ignore); 00438 00439 /* Select a replacement for a target-specific builtin. This is done 00440 *before* regular type checking, and so allows the target to implement 00441 a crude form of function overloading. The result is a complete 00442 expression that implements the operation. */ 00443 tree (*resolve_overloaded_builtin) (tree decl, tree params); 00444 00445 /* Fold a target-specific builtin. */ 00446 tree (* fold_builtin) (tree fndecl, tree arglist, bool ignore); 00447 00448 /* For a vendor-specific fundamental TYPE, return a pointer to 00449 a statically-allocated string containing the C++ mangling for 00450 TYPE. In all other cases, return NULL. */ 00451 const char * (* mangle_fundamental_type) (tree type); 00452 00453 /* Make any adjustments to libfunc names needed for this target. */ 00454 void (* init_libfuncs) (void); 00455 00456 /* Given a decl, a section name, and whether the decl initializer 00457 has relocs, choose attributes for the section. */ 00458 /* ??? Should be merged with SELECT_SECTION and UNIQUE_SECTION. */ 00459 unsigned int (* section_type_flags) (tree, const char *, int); 00460 00461 /* True if new jumps cannot be created, to replace existing ones or 00462 not, at the current point in the compilation. */ 00463 bool (* cannot_modify_jumps_p) (void); 00464 00465 /* Return a register class for which branch target register 00466 optimizations should be applied. */ 00467 int (* branch_target_register_class) (void); 00468 00469 /* Return true if branch target register optimizations should include 00470 callee-saved registers that are not already live during the current 00471 function. AFTER_PE_GEN is true if prologues and epilogues have 00472 already been generated. */ 00473 bool (* branch_target_register_callee_saved) (bool after_pe_gen); 00474 00475 /* True if the constant X cannot be placed in the constant pool. */ 00476 bool (* cannot_force_const_mem) (rtx); 00477 00478 /* True if the insn X cannot be duplicated. */ 00479 bool (* cannot_copy_insn_p) (rtx); 00480 00481 /* True if X is considered to be commutative. */ 00482 bool (* commutative_p) (rtx, int); 00483 00484 /* Given an address RTX, undo the effects of LEGITIMIZE_ADDRESS. */ 00485 rtx (* delegitimize_address) (rtx); 00486 00487 /* True if the given constant can be put into an object_block. */ 00488 bool (* use_blocks_for_constant_p) (enum machine_mode, rtx); 00489 00490 /* The minimum and maximum byte offsets for anchored addresses. */ 00491 HOST_WIDE_INT min_anchor_offset; 00492 HOST_WIDE_INT max_anchor_offset; 00493 00494 /* True if section anchors can be used to access the given symbol. */ 00495 bool (* use_anchors_for_symbol_p) (rtx); 00496 00497 /* True if it is OK to do sibling call optimization for the specified 00498 call expression EXP. DECL will be the called function, or NULL if 00499 this is an indirect call. */ 00500 bool (*function_ok_for_sibcall) (tree decl, tree exp); 00501 00502 /* True if EXP should be placed in a "small data" section. */ 00503 bool (* in_small_data_p) (tree); 00504 00505 /* True if EXP names an object for which name resolution must resolve 00506 to the current module. */ 00507 bool (* binds_local_p) (tree); 00508 00509 /* Do something target-specific to record properties of the DECL into 00510 the associated SYMBOL_REF. */ 00511 void (* encode_section_info) (tree, rtx, int); 00512 00513 /* Undo the effects of encode_section_info on the symbol string. */ 00514 const char * (* strip_name_encoding) (const char *); 00515 00516 /* If shift optabs for MODE are known to always truncate the shift count, 00517 return the mask that they apply. Return 0 otherwise. */ 00518 unsigned HOST_WIDE_INT (* shift_truncation_mask) (enum machine_mode mode); 00519 00520 /* Return the number of divisions in the given MODE that should be present, 00521 so that it is profitable to turn the division into a multiplication by 00522 the reciprocal. */ 00523 unsigned int (* min_divisions_for_recip_mul) (enum machine_mode mode); 00524 00525 /* If the representation of integral MODE is such that values are 00526 always sign-extended to a wider mode MODE_REP then return 00527 SIGN_EXTEND. Return UNKNOWN otherwise. */ 00528 /* Note that the return type ought to be RTX_CODE, but that's not 00529 necessarily defined at this point. */ 00530 int (* mode_rep_extended) (enum machine_mode mode, 00531 enum machine_mode mode_rep); 00532 00533 /* True if MODE is valid for a pointer in __attribute__((mode("MODE"))). */ 00534 bool (* valid_pointer_mode) (enum machine_mode mode); 00535 00536 /* True if MODE is valid for the target. By "valid", we mean able to 00537 be manipulated in non-trivial ways. In particular, this means all 00538 the arithmetic is supported. */ 00539 bool (* scalar_mode_supported_p) (enum machine_mode mode); 00540 00541 /* Similarly for vector modes. "Supported" here is less strict. At 00542 least some operations are supported; need to check optabs or builtins 00543 for further details. */ 00544 bool (* vector_mode_supported_p) (enum machine_mode mode); 00545 00546 /* True if a vector is opaque. */ 00547 bool (* vector_opaque_p) (tree); 00548 00549 /* Compute a (partial) cost for rtx X. Return true if the complete 00550 cost has been computed, and false if subexpressions should be 00551 scanned. In either case, *TOTAL contains the cost result. */ 00552 /* Note that CODE and OUTER_CODE ought to be RTX_CODE, but that's 00553 not necessarily defined at this point. */ 00554 bool (* rtx_costs) (rtx x, int code, int outer_code, int *total); 00555 00556 /* Compute the cost of X, used as an address. Never called with 00557 invalid addresses. */ 00558 int (* address_cost) (rtx x); 00559 00560 /* Return where to allocate pseudo for a given hard register initial 00561 value. */ 00562 rtx (* allocate_initial_value) (rtx x); 00563 00564 /* Given a register, this hook should return a parallel of registers 00565 to represent where to find the register pieces. Define this hook 00566 if the register and its mode are represented in Dwarf in 00567 non-contiguous locations, or if the register should be 00568 represented in more than one register in Dwarf. Otherwise, this 00569 hook should return NULL_RTX. */ 00570 rtx (* dwarf_register_span) (rtx); 00571 00572 /* Fetch the fixed register(s) which hold condition codes, for 00573 targets where it makes sense to look for duplicate assignments to 00574 the condition codes. This should return true if there is such a 00575 register, false otherwise. The arguments should be set to the 00576 fixed register numbers. Up to two condition code registers are 00577 supported. If there is only one for this target, the int pointed 00578 at by the second argument should be set to -1. */ 00579 bool (* fixed_condition_code_regs) (unsigned int *, unsigned int *); 00580 00581 /* If two condition code modes are compatible, return a condition 00582 code mode which is compatible with both, such that a comparison 00583 done in the returned mode will work for both of the original 00584 modes. If the condition code modes are not compatible, return 00585 VOIDmode. */ 00586 enum machine_mode (* cc_modes_compatible) (enum machine_mode, 00587 enum machine_mode); 00588 00589 /* Do machine-dependent code transformations. Called just before 00590 delayed-branch scheduling. */ 00591 void (* machine_dependent_reorg) (void); 00592 00593 /* Create the __builtin_va_list type. */ 00594 tree (* build_builtin_va_list) (void); 00595 00596 /* Gimplifies a VA_ARG_EXPR. */ 00597 tree (* gimplify_va_arg_expr) (tree valist, tree type, tree *pre_p, 00598 tree *post_p); 00599 00600 /* Validity-checking routines for PCH files, target-specific. 00601 get_pch_validity returns a pointer to the data to be stored, 00602 and stores the size in its argument. pch_valid_p gets the same 00603 information back and returns NULL if the PCH is valid, 00604 or an error message if not. 00605 */ 00606 void * (* get_pch_validity) (size_t *); 00607 const char * (* pch_valid_p) (const void *, size_t); 00608 00609 /* If nonnull, this function checks whether a PCH file with the 00610 given set of target flags can be used. It returns NULL if so, 00611 otherwise it returns an error message. */ 00612 const char *(*check_pch_target_flags) (int); 00613 00614 /* True if the compiler should give an enum type only as many 00615 bytes as it takes to represent the range of possible values of 00616 that type. */ 00617 bool (* default_short_enums) (void); 00618 00619 /* This target hook returns an rtx that is used to store the address 00620 of the current frame into the built-in setjmp buffer. */ 00621 rtx (* builtin_setjmp_frame_value) (void); 00622 00623 /* This target hook should add STRING_CST trees for any hard regs 00624 the port wishes to automatically clobber for an asm. */ 00625 tree (* md_asm_clobbers) (tree, tree, tree); 00626 00627 /* This target hook allows the backend to specify a calling convention 00628 in the debug information. This function actually returns an 00629 enum dwarf_calling_convention, but because of forward declarations 00630 and not wanting to include dwarf2.h everywhere target.h is included 00631 the function is being declared as an int. */ 00632 int (* dwarf_calling_convention) (tree); 00633 00634 /* This target hook allows the backend to emit frame-related insns that 00635 contain UNSPECs or UNSPEC_VOLATILEs. The call frame debugging info 00636 engine will invoke it on insns of the form 00637 (set (reg) (unspec [...] UNSPEC_INDEX)) 00638 and 00639 (set (reg) (unspec_volatile [...] UNSPECV_INDEX)) 00640 to let the backend emit the call frame instructions. */ 00641 void (* dwarf_handle_frame_unspec) (const char *, rtx, int); 00642 00643 /* Perform architecture specific checking of statements gimplified 00644 from VA_ARG_EXPR. LHS is left hand side of MODIFY_EXPR, RHS 00645 is right hand side. Returns true if the statements doesn't need 00646 to be checked for va_list references. */ 00647 bool (* stdarg_optimize_hook) (struct stdarg_info *ai, tree lhs, tree rhs); 00648 00649 /* This target hook allows the operating system to override the DECL 00650 that represents the external variable that contains the stack 00651 protection guard variable. The type of this DECL is ptr_type_node. */ 00652 tree (* stack_protect_guard) (void); 00653 00654 /* This target hook allows the operating system to override the CALL_EXPR 00655 that is invoked when a check vs the guard variable fails. */ 00656 tree (* stack_protect_fail) (void); 00657 00658 /* Returns NULL if target supports the insn within a doloop block, 00659 otherwise it returns an error message. */ 00660 const char * (*invalid_within_doloop) (rtx); 00661 00662 /* DECL is a variable or function with __attribute__((dllimport)) 00663 specified. Use this hook if the target needs to add extra validation 00664 checks to handle_dll_attribute (). */ 00665 bool (* valid_dllimport_attribute_p) (tree decl); 00666 00667 /* Functions relating to calls - argument passing, returns, etc. */ 00668 struct calls { 00669 bool (*promote_function_args) (tree fntype); 00670 bool (*promote_function_return) (tree fntype); 00671 bool (*promote_prototypes) (tree fntype); 00672 rtx (*struct_value_rtx) (tree fndecl, int incoming); 00673 bool (*return_in_memory) (tree type, tree fndecl); 00674 bool (*return_in_msb) (tree type); 00675 00676 /* Return true if a parameter must be passed by reference. TYPE may 00677 be null if this is a libcall. CA may be null if this query is 00678 from __builtin_va_arg. */ 00679 bool (*pass_by_reference) (CUMULATIVE_ARGS *ca, enum machine_mode mode, 00680 tree type, bool named_arg); 00681 00682 rtx (*expand_builtin_saveregs) (void); 00683 /* Returns pretend_argument_size. */ 00684 void (*setup_incoming_varargs) (CUMULATIVE_ARGS *ca, enum machine_mode mode, 00685 tree type, int *pretend_arg_size, 00686 int second_time); 00687 bool (*strict_argument_naming) (CUMULATIVE_ARGS *ca); 00688 /* Returns true if we should use 00689 targetm.calls.setup_incoming_varargs() and/or 00690 targetm.calls.strict_argument_naming(). */ 00691 bool (*pretend_outgoing_varargs_named) (CUMULATIVE_ARGS *ca); 00692 00693 /* Given a complex type T, return true if a parameter of type T 00694 should be passed as two scalars. */ 00695 bool (* split_complex_arg) (tree type); 00696 00697 /* Return true if type T, mode MODE, may not be passed in registers, 00698 but must be passed on the stack. */ 00699 /* ??? This predicate should be applied strictly after pass-by-reference. 00700 Need audit to verify that this is the case. */ 00701 bool (* must_pass_in_stack) (enum machine_mode mode, tree t); 00702 00703 /* Return true if type TYPE, mode MODE, which is passed by reference, 00704 should have the object copy generated by the callee rather than 00705 the caller. It is never called for TYPE requiring constructors. */ 00706 bool (* callee_copies) (CUMULATIVE_ARGS *ca, enum machine_mode mode, 00707 tree type, bool named); 00708 00709 /* Return zero for arguments passed entirely on the stack or entirely 00710 in registers. If passed in both, return the number of bytes passed 00711 in registers; the balance is therefore passed on the stack. */ 00712 int (* arg_partial_bytes) (CUMULATIVE_ARGS *ca, enum machine_mode mode, 00713 tree type, bool named); 00714 00715 /* Return the diagnostic message string if function without a prototype 00716 is not allowed for this 'val' argument; NULL otherwise. */ 00717 const char *(*invalid_arg_for_unprototyped_fn) (tree typelist, 00718 tree funcdecl, tree val); 00719 00720 /* Return an rtx for the return value location of the function 00721 specified by FN_DECL_OR_TYPE with a return type of RET_TYPE. */ 00722 rtx (*function_value) (tree ret_type, tree fn_decl_or_type, 00723 bool outgoing); 00724 00725 /* Return an rtx for the argument pointer incoming to the 00726 current function. */ 00727 rtx (*internal_arg_pointer) (void); 00728 } calls; 00729 00730 /* Return the diagnostic message string if conversion from FROMTYPE 00731 to TOTYPE is not allowed, NULL otherwise. */ 00732 const char *(*invalid_conversion) (tree fromtype, tree totype); 00733 00734 /* Return the diagnostic message string if the unary operation OP is 00735 not permitted on TYPE, NULL otherwise. */ 00736 const char *(*invalid_unary_op) (int op, tree type); 00737 00738 /* Return the diagnostic message string if the binary operation OP 00739 is not permitted on TYPE1 and TYPE2, NULL otherwise. */ 00740 const char *(*invalid_binary_op) (int op, tree type1, tree type2); 00741 00742 /* Return the class for a secondary reload, and fill in extra information. */ 00743 enum reg_class (*secondary_reload) (bool, rtx, enum reg_class, 00744 enum machine_mode, 00745 struct secondary_reload_info *); 00746 00747 /* Functions specific to the C++ frontend. */ 00748 struct cxx { 00749 /* Return the integer type used for guard variables. */ 00750 tree (*guard_type) (void); 00751 /* Return true if only the low bit of the guard should be tested. */ 00752 bool (*guard_mask_bit) (void); 00753 /* Returns the size of the array cookie for an array of type. */ 00754 tree (*get_cookie_size) (tree); 00755 /* Returns true if the element size should be stored in the 00756 array cookie. */ 00757 bool (*cookie_has_size) (void); 00758 /* Allows backends to perform additional processing when 00759 deciding if a class should be exported or imported. */ 00760 int (*import_export_class) (tree, int); 00761 /* Returns true if constructors and destructors return "this". */ 00762 bool (*cdtor_returns_this) (void); 00763 /* Returns true if the key method for a class can be an inline 00764 function, so long as it is not declared inline in the class 00765 itself. Returning true is the behavior required by the Itanium 00766 C++ ABI. */ 00767 bool (*key_method_may_be_inline) (void); 00768 /* DECL is a virtual table, virtual table table, typeinfo object, 00769 or other similar implicit class data object that will be 00770 emitted with external linkage in this translation unit. No ELF 00771 visibility has been explicitly specified. If the target needs 00772 to specify a visibility other than that of the containing class, 00773 use this hook to set DECL_VISIBILITY and 00774 DECL_VISIBILITY_SPECIFIED. */ 00775 void (*determine_class_data_visibility) (tree decl); 00776 /* Returns true (the default) if virtual tables and other 00777 similar implicit class data objects are always COMDAT if they 00778 have external linkage. If this hook returns false, then 00779 class data for classes whose virtual table will be emitted in 00780 only one translation unit will not be COMDAT. */ 00781 bool (*class_data_always_comdat) (void); 00782 /* Returns true if __aeabi_atexit should be used to register static 00783 destructors. */ 00784 bool (*use_aeabi_atexit) (void); 00785 /* TYPE is a C++ class (i.e., RECORD_TYPE or UNION_TYPE) that 00786 has just been defined. Use this hook to make adjustments to the 00787 class (eg, tweak visibility or perform any other required 00788 target modifications). */ 00789 void (*adjust_class_at_definition) (tree type); 00790 } cxx; 00791 00792 /* For targets that need to mark extra registers as live on entry to 00793 the function, they should define this target hook and set their 00794 bits in the bitmap passed in. */ 00795 void (*live_on_entry) (bitmap); 00796 00797 /* True if unwinding tables should be generated by default. */ 00798 bool unwind_tables_default; 00799 00800 /* Leave the boolean fields at the end. */ 00801 00802 /* True if arbitrary sections are supported. */ 00803 bool have_named_sections; 00804 00805 /* True if we can create zeroed data by switching to a BSS section 00806 and then using ASM_OUTPUT_SKIP to allocate the space. */ 00807 bool have_switchable_bss_sections; 00808 00809 /* True if "native" constructors and destructors are supported, 00810 false if we're using collect2 for the job. */ 00811 bool have_ctors_dtors; 00812 00813 /* True if thread-local storage is supported. */ 00814 bool have_tls; 00815 00816 /* True if a small readonly data section is supported. */ 00817 bool have_srodata_section; 00818 00819 /* True if EH frame info sections should be zero-terminated. */ 00820 bool terminate_dw2_eh_frame_info; 00821 00822 /* True if #NO_APP should be emitted at the beginning of 00823 assembly output. */ 00824 bool file_start_app_off; 00825 00826 /* True if output_file_directive should be called for main_input_filename 00827 at the beginning of assembly output. */ 00828 bool file_start_file_directive; 00829 00830 /* True if #pragma redefine_extname is to be supported. */ 00831 bool handle_pragma_redefine_extname; 00832 00833 /* True if #pragma extern_prefix is to be supported. */ 00834 bool handle_pragma_extern_prefix; 00835 00836 /* True if the target is allowed to reorder memory accesses unless 00837 synchronization is explicitly requested. */ 00838 bool relaxed_ordering; 00839 00840 /* Returns true if we should generate exception tables for use with the 00841 ARM EABI. The effects the encoding of function exception specifications. 00842 */ 00843 bool arm_eabi_unwinder; 00844 00845 /* Leave the boolean fields at the end. */ 00846 }; 00847 00848 extern struct gcc_target targetm; 00849 00850 #endif /* GCC_TARGET_H */
1.5.6