00001 /* Data structure definitions for a generic GCC target. 00002 Copyright (C) 2001, 2002 Free Software Foundation, Inc. 00003 00004 This program is free software; you can redistribute it and/or modify it 00005 under the terms of the GNU General Public License as published by the 00006 Free Software Foundation; either version 2, or (at your option) any 00007 later version. 00008 00009 This program is distributed in the hope that it will be useful, 00010 but WITHOUT ANY WARRANTY; without even the implied warranty of 00011 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00012 GNU General Public License for more details. 00013 00014 You should have received a copy of the GNU General Public License 00015 along with this program; if not, write to the Free Software 00016 Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 00017 00018 In other words, you are welcome to use, share and improve this program. 00019 You are forbidden to forbid anyone else to use, share and improve 00020 what you give them. Help stamp out software-hoarding! */ 00021 00022 /* This file contains a data structure that describes a GCC target. 00023 At present it is incomplete, but in future it should grow to 00024 contain most or all target machine and target O/S specific 00025 information. 00026 00027 This structure has its initializer declared in target-def.h in the 00028 form of large macro TARGET_INITIALIZER that expands to many smaller 00029 macros. 00030 00031 The smaller macros each initialize one component of the structure, 00032 and each has a default. Each target should have a file that 00033 includes target.h and target-def.h, and overrides any inappropriate 00034 defaults by undefining the relevant macro and defining a suitable 00035 replacement. That file should then contain the definition of 00036 "targetm" like so: 00037 00038 struct gcc_target targetm = TARGET_INITIALIZER; 00039 00040 Doing things this way allows us to bring together everything that 00041 defines a GCC target. By supplying a default that is appropriate 00042 to most targets, we can easily add new items without needing to 00043 edit dozens of target configuration files. It should also allow us 00044 to gradually reduce the amount of conditional compilation that is 00045 scattered throughout GCC. */ 00046 00047 struct gcc_target 00048 { 00049 /* Functions that output assembler for the target. */ 00050 struct asm_out 00051 { 00052 /* Opening and closing parentheses for asm expression grouping. */ 00053 const char *open_paren, *close_paren; 00054 00055 /* Assembler instructions for creating various kinds of integer object. */ 00056 const char *byte_op; 00057 struct asm_int_op 00058 { 00059 const char *hi; 00060 const char *si; 00061 const char *di; 00062 const char *ti; 00063 } aligned_op, unaligned_op; 00064 00065 /* Try to output the assembler code for an integer object whose 00066 value is given by X. SIZE is the size of the object in bytes and 00067 ALIGNED_P indicates whether it is aligned. Return true if 00068 successful. Only handles cases for which BYTE_OP, ALIGNED_OP 00069 and UNALIGNED_OP are NULL. */ 00070 bool (* integer) PARAMS ((rtx x, unsigned int size, int aligned_p)); 00071 00072 /* Output code that will globalize a label. */ 00073 void (* globalize_label) PARAMS ((FILE *, const char *)); 00074 00075 /* Emit an assembler directive to set visibility for the symbol 00076 associated with the tree decl. */ 00077 void (* visibility) PARAMS ((tree, int)); 00078 00079 /* Output the assembler code for entry to a function. */ 00080 void (* function_prologue) PARAMS ((FILE *, HOST_WIDE_INT)); 00081 00082 /* Output the assembler code for end of prologue. */ 00083 void (* function_end_prologue) PARAMS ((FILE *)); 00084 00085 /* Output the assembler code for start of epilogue. */ 00086 void (* function_begin_epilogue) PARAMS ((FILE *)); 00087 00088 /* Output the assembler code for function exit. */ 00089 void (* function_epilogue) PARAMS ((FILE *, HOST_WIDE_INT)); 00090 00091 /* Switch to an arbitrary section NAME with attributes as 00092 specified by FLAGS. */ 00093 void (* named_section) PARAMS ((const char *, unsigned int)); 00094 00095 /* Switch to the section that holds the exception table. */ 00096 void (* exception_section) PARAMS ((void)); 00097 00098 /* Switch to the section that holds the exception frames. */ 00099 void (* eh_frame_section) PARAMS ((void)); 00100 00101 /* Select and switch to a section for EXP. It may be a DECL or a 00102 constant for which TREE_CST_RTL is valid. RELOC is nonzero if 00103 runtime relocations must be applied; bit 1 will be set if the 00104 runtime relocations require non-local name resolution. ALIGN is 00105 the required alignment of the data. */ 00106 void (* select_section) PARAMS ((tree, int, unsigned HOST_WIDE_INT)); 00107 00108 /* Select and switch to a section for X with MODE. ALIGN is 00109 the desired alignment of the data. */ 00110 void (* select_rtx_section) PARAMS ((enum machine_mode, rtx, 00111 unsigned HOST_WIDE_INT)); 00112 00113 /* Select a unique section name for DECL. RELOC is the same as 00114 for SELECT_SECTION. */ 00115 void (* unique_section) PARAMS ((tree, int)); 00116 00117 /* Output a constructor for a symbol with a given priority. */ 00118 void (* constructor) PARAMS ((rtx, int)); 00119 00120 /* Output a destructor for a symbol with a given priority. */ 00121 void (* destructor) PARAMS ((rtx, int)); 00122 00123 /* Output the assembler code for a thunk function. THUNK_DECL is the 00124 declaration for the thunk function itself, FUNCTION is the decl for 00125 the target function. DELTA is an immediate constant offset to be 00126 added to THIS. If VCALL_OFFSET is nonzero, the word at 00127 *(*this + vcall_offset) should be added to THIS. */ 00128 void (* output_mi_thunk) PARAMS ((FILE *file, tree thunk_decl, 00129 HOST_WIDE_INT delta, 00130 HOST_WIDE_INT vcall_offset, 00131 tree function_decl)); 00132 00133 /* Determine whether output_mi_thunk would succeed. */ 00134 /* ??? Ideally, this hook would not exist, and success or failure 00135 would be returned from output_mi_thunk directly. But there's 00136 too much undo-able setup involved in invoking output_mi_thunk. 00137 Could be fixed by making output_mi_thunk emit rtl instead of 00138 text to the output file. */ 00139 bool (* can_output_mi_thunk) PARAMS ((tree thunk_decl, 00140 HOST_WIDE_INT delta, 00141 HOST_WIDE_INT vcall_offset, 00142 tree function_decl)); 00143 } asm_out; 00144 00145 /* Functions relating to instruction scheduling. */ 00146 struct sched 00147 { 00148 /* Given the current cost, COST, of an insn, INSN, calculate and 00149 return a new cost based on its relationship to DEP_INSN through 00150 the dependence LINK. The default is to make no adjustment. */ 00151 int (* adjust_cost) PARAMS ((rtx insn, rtx link, rtx def_insn, int cost)); 00152 00153 /* Adjust the priority of an insn as you see fit. Returns the new 00154 priority. */ 00155 int (* adjust_priority) PARAMS ((rtx, int)); 00156 00157 /* Function which returns the maximum number of insns that can be 00158 scheduled in the same machine cycle. This must be constant 00159 over an entire compilation. The default is 1. */ 00160 int (* issue_rate) PARAMS ((void)); 00161 00162 /* Calculate how much this insn affects how many more insns we 00163 can emit this cycle. Default is they all cost the same. */ 00164 int (* variable_issue) PARAMS ((FILE *, int, rtx, int)); 00165 00166 /* Initialize machine-dependent scheduling code. */ 00167 void (* md_init) PARAMS ((FILE *, int, int)); 00168 00169 /* Finalize machine-dependent scheduling code. */ 00170 void (* md_finish) PARAMS ((FILE *, int)); 00171 00172 /* Reorder insns in a machine-dependent fashion, in two different 00173 places. Default does nothing. */ 00174 int (* reorder) PARAMS ((FILE *, int, rtx *, int *, int)); 00175 int (* reorder2) PARAMS ((FILE *, int, rtx *, int *, int)); 00176 00177 /* The following member value is a pointer to a function returning 00178 nonzero if we should use DFA based scheduling. The default is 00179 to use the old pipeline scheduler. */ 00180 int (* use_dfa_pipeline_interface) PARAMS ((void)); 00181 /* The values of all the following members are used only for the 00182 DFA based scheduler: */ 00183 /* The values of the following four members are pointers to 00184 functions used to simplify the automaton descriptions. 00185 dfa_pre_cycle_insn and dfa_post_cycle_insn give functions 00186 returning insns which are used to change the pipeline hazard 00187 recognizer state when the new simulated processor cycle 00188 correspondingly starts and finishes. The function defined by 00189 init_dfa_pre_cycle_insn and init_dfa_post_cycle_insn are used 00190 to initialize the corresponding insns. The default values of 00191 the memebers result in not changing the automaton state when 00192 the new simulated processor cycle correspondingly starts and 00193 finishes. */ 00194 void (* init_dfa_pre_cycle_insn) PARAMS ((void)); 00195 rtx (* dfa_pre_cycle_insn) PARAMS ((void)); 00196 void (* init_dfa_post_cycle_insn) PARAMS ((void)); 00197 rtx (* dfa_post_cycle_insn) PARAMS ((void)); 00198 /* The following member value is a pointer to a function returning value 00199 which defines how many insns in queue `ready' will we try for 00200 multi-pass scheduling. if the member value is nonzero and the 00201 function returns positive value, the DFA based scheduler will make 00202 multi-pass scheduling for the first cycle. In other words, we will 00203 try to choose ready insn which permits to start maximum number of 00204 insns on the same cycle. */ 00205 int (* first_cycle_multipass_dfa_lookahead) PARAMS ((void)); 00206 /* The values of the following members are pointers to functions 00207 used to improve the first cycle multipass scheduling by 00208 inserting nop insns. dfa_scheduler_bubble gives a function 00209 returning a nop insn with given index. The indexes start with 00210 zero. The function should return NULL if there are no more nop 00211 insns with indexes greater than given index. To initialize the 00212 nop insn the function given by member 00213 init_dfa_scheduler_bubbles is used. The default values of the 00214 members result in not inserting nop insns during the multipass 00215 scheduling. */ 00216 void (* init_dfa_bubbles) PARAMS ((void)); 00217 rtx (* dfa_bubble) PARAMS ((int)); 00218 } sched; 00219 00220 /* Given two decls, merge their attributes and return the result. */ 00221 tree (* merge_decl_attributes) PARAMS ((tree, tree)); 00222 00223 /* Given two types, merge their attributes and return the result. */ 00224 tree (* merge_type_attributes) PARAMS ((tree, tree)); 00225 00226 /* Table of machine attributes and functions to handle them. 00227 Ignored if NULL. */ 00228 const struct attribute_spec *attribute_table; 00229 00230 /* Return zero if the attributes on TYPE1 and TYPE2 are incompatible, 00231 one if they are compatible and two if they are nearly compatible 00232 (which causes a warning to be generated). */ 00233 int (* comp_type_attributes) PARAMS ((tree type1, tree type2)); 00234 00235 /* Assign default attributes to the newly defined TYPE. */ 00236 void (* set_default_type_attributes) PARAMS ((tree type)); 00237 00238 /* Insert attributes on the newly created DECL. */ 00239 void (* insert_attributes) PARAMS ((tree decl, tree *attributes)); 00240 00241 /* Return true if FNDECL (which has at least one machine attribute) 00242 can be inlined despite its machine attributes, false otherwise. */ 00243 bool (* function_attribute_inlinable_p) PARAMS ((tree fndecl)); 00244 00245 /* Return true if bitfields in RECORD_TYPE should follow the 00246 Microsoft Visual C++ bitfield layout rules. */ 00247 bool (* ms_bitfield_layout_p) PARAMS ((tree record_type)); 00248 00249 /* Set up target-specific built-in functions. */ 00250 void (* init_builtins) PARAMS ((void)); 00251 00252 /* Expand a target-specific builtin. */ 00253 rtx (* expand_builtin) PARAMS ((tree exp, rtx target, rtx subtarget, 00254 enum machine_mode mode, int ignore)); 00255 00256 /* Given a decl, a section name, and whether the decl initializer 00257 has relocs, choose attributes for the section. */ 00258 /* ??? Should be merged with SELECT_SECTION and UNIQUE_SECTION. */ 00259 unsigned int (* section_type_flags) PARAMS ((tree, const char *, int)); 00260 00261 /* True if new jumps cannot be created, to replace existing ones or 00262 not, at the current point in the compilation. */ 00263 bool (* cannot_modify_jumps_p) PARAMS ((void)); 00264 00265 /* True if the constant X cannot be placed in the constant pool. */ 00266 bool (* cannot_force_const_mem) PARAMS ((rtx)); 00267 00268 /* True if EXP should be placed in a "small data" section. */ 00269 bool (* in_small_data_p) PARAMS ((tree)); 00270 00271 /* True if EXP names an object for which name resolution must resolve 00272 to the current module. */ 00273 bool (* binds_local_p) PARAMS ((tree)); 00274 00275 /* Do something target-specific to record properties of the DECL into 00276 the associated SYMBOL_REF. */ 00277 void (* encode_section_info) PARAMS ((tree, int)); 00278 00279 /* Undo the effects of encode_section_info on the symbol string. */ 00280 const char * (* strip_name_encoding) PARAMS ((const char *)); 00281 00282 /* Leave the boolean fields at the end. */ 00283 00284 /* True if arbitrary sections are supported. */ 00285 bool have_named_sections; 00286 00287 /* True if "native" constructors and destructors are supported, 00288 false if we're using collect2 for the job. */ 00289 bool have_ctors_dtors; 00290 00291 /* True if thread-local storage is supported. */ 00292 bool have_tls; 00293 00294 /* True if a small readonly data section is supported. */ 00295 bool have_srodata_section; 00296 00297 /* True if EH frame info sections should be zero-terminated. */ 00298 bool terminate_dw2_eh_frame_info; 00299 }; 00300 00301 extern struct gcc_target targetm;
1.5.6