00001 /* 00002 * Copyright (C) 2007. QLogic Corporation. All Rights Reserved. 00003 */ 00004 /* The lang_hooks data structure. 00005 Copyright 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc. 00006 00007 This file is part of GCC. 00008 00009 GCC is free software; you can redistribute it and/or modify 00010 it under the terms of the GNU General Public License as published by 00011 the Free Software Foundation; either version 2, or (at your option) 00012 any later version. 00013 00014 GCC is distributed in the hope that it will be useful, 00015 but WITHOUT ANY WARRANTY; without even the implied warranty of 00016 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00017 GNU General Public License for more details. 00018 00019 You should have received a copy of the GNU General Public License 00020 along with GCC; see the file COPYING. If not, write to 00021 the Free Software Foundation, 51 Franklin Street, Fifth Floor, 00022 Boston, MA 02110-1301, USA. */ 00023 00024 #ifndef GCC_LANG_HOOKS_H 00025 #define GCC_LANG_HOOKS_H 00026 00027 /* This file should be #include-d after tree.h. */ 00028 00029 struct diagnostic_context; 00030 00031 struct gimplify_omp_ctx; 00032 00033 /* A print hook for print_tree (). */ 00034 typedef void (*lang_print_tree_hook) (FILE *, tree, int indent); 00035 00036 /* The following hooks are documented in langhooks.c. Must not be 00037 NULL. */ 00038 00039 struct lang_hooks_for_tree_inlining 00040 { 00041 tree (*walk_subtrees) (tree *, int *, 00042 tree (*) (tree *, int *, void *), 00043 void *, struct pointer_set_t*); 00044 int (*cannot_inline_tree_fn) (tree *); 00045 int (*disregard_inline_limits) (tree); 00046 tree (*add_pending_fn_decls) (void *, tree); 00047 int (*auto_var_in_fn_p) (tree, tree); 00048 int (*anon_aggr_type_p) (tree); 00049 bool (*var_mod_type_p) (tree, tree); 00050 int (*start_inlining) (tree); 00051 void (*end_inlining) (tree); 00052 tree (*convert_parm_for_inlining) (tree, tree, tree, int); 00053 }; 00054 00055 struct lang_hooks_for_callgraph 00056 { 00057 /* The node passed is a language-specific tree node. If its contents 00058 are relevant to use of other declarations, mark them. */ 00059 tree (*analyze_expr) (tree *, int *, tree); 00060 00061 /* Produce RTL for function passed as argument. */ 00062 void (*expand_function) (tree); 00063 }; 00064 00065 /* Lang hooks for management of language-specific data or status 00066 when entering / leaving functions etc. */ 00067 struct lang_hooks_for_functions 00068 { 00069 /* Called when entering a function. */ 00070 void (*init) (struct function *); 00071 00072 /* Called when leaving a function. */ 00073 void (*final) (struct function *); 00074 00075 /* Called when entering a nested function. */ 00076 void (*enter_nested) (struct function *); 00077 00078 /* Called when leaving a nested function. */ 00079 void (*leave_nested) (struct function *); 00080 00081 /* Determines if it's ok for a function to have no noreturn attribute. */ 00082 bool (*missing_noreturn_ok_p) (tree); 00083 }; 00084 00085 /* The following hooks are used by tree-dump.c. */ 00086 00087 struct lang_hooks_for_tree_dump 00088 { 00089 /* Dump language-specific parts of tree nodes. Returns nonzero if it 00090 does not want the usual dumping of the second argument. */ 00091 bool (*dump_tree) (void *, tree); 00092 00093 /* Determine type qualifiers in a language-specific way. */ 00094 int (*type_quals) (tree); 00095 }; 00096 00097 /* Hooks related to types. */ 00098 00099 struct lang_hooks_for_types 00100 { 00101 /* Return a new type (with the indicated CODE), doing whatever 00102 language-specific processing is required. */ 00103 tree (*make_type) (enum tree_code); 00104 00105 /* Given MODE and UNSIGNEDP, return a suitable type-tree with that 00106 mode. */ 00107 tree (*type_for_mode) (enum machine_mode, int); 00108 00109 /* Given PRECISION and UNSIGNEDP, return a suitable type-tree for an 00110 integer type with at least that precision. */ 00111 tree (*type_for_size) (unsigned, int); 00112 00113 /* Given an integer type T, return a type like T but unsigned. 00114 If T is unsigned, the value is T. */ 00115 tree (*unsigned_type) (tree); 00116 00117 /* Given an integer type T, return a type like T but signed. 00118 If T is signed, the value is T. */ 00119 tree (*signed_type) (tree); 00120 00121 /* Return a type the same as TYPE except unsigned or signed 00122 according to UNSIGNEDP. */ 00123 tree (*signed_or_unsigned_type) (int, tree); 00124 00125 /* Given a type, apply default promotions to unnamed function 00126 arguments and return the new type. Return the same type if no 00127 change. Required by any language that supports variadic 00128 arguments. The default hook dies. */ 00129 tree (*type_promotes_to) (tree); 00130 00131 /* Register TYPE as a builtin type with the indicated NAME. The 00132 TYPE is placed in the outermost lexical scope. The semantics 00133 should be analogous to: 00134 00135 typedef TYPE NAME; 00136 00137 in C. The default hook ignores the declaration. */ 00138 void (*register_builtin_type) (tree, const char *); 00139 00140 /* This routine is called in tree.c to print an error message for 00141 invalid use of an incomplete type. VALUE is the expression that 00142 was used (or 0 if that isn't known) and TYPE is the type that was 00143 invalid. */ 00144 void (*incomplete_type_error) (tree value, tree type); 00145 00146 /* Called from assign_temp to return the maximum size, if there is one, 00147 for a type. */ 00148 tree (*max_size) (tree); 00149 00150 /* Register language specific type size variables as potentially OpenMP 00151 firstprivate variables. */ 00152 void (*omp_firstprivatize_type_sizes) (struct gimplify_omp_ctx *, tree); 00153 00154 /* Nonzero if types that are identical are to be hashed so that only 00155 one copy is kept. If a language requires unique types for each 00156 user-specified type, such as Ada, this should be set to TRUE. */ 00157 bool hash_types; 00158 }; 00159 00160 /* Language hooks related to decls and the symbol table. */ 00161 00162 struct lang_hooks_for_decls 00163 { 00164 /* Returns nonzero if we are in the global binding level. Ada 00165 returns -1 for an undocumented reason used in stor-layout.c. */ 00166 int (*global_bindings_p) (void); 00167 00168 /* Insert BLOCK at the end of the list of subblocks of the 00169 current binding level. This is used when a BIND_EXPR is expanded, 00170 to handle the BLOCK node inside the BIND_EXPR. */ 00171 void (*insert_block) (tree); 00172 00173 /* Function to add a decl to the current scope level. Takes one 00174 argument, a decl to add. Returns that decl, or, if the same 00175 symbol is already declared, may return a different decl for that 00176 name. */ 00177 tree (*pushdecl) (tree); 00178 00179 /* Returns the chain of decls so far in the current scope level. */ 00180 tree (*getdecls) (void); 00181 00182 /* Returns true when we should warn for an unused global DECL. 00183 We will already have checked that it has static binding. */ 00184 bool (*warn_unused_global) (tree); 00185 00186 /* Obtain a list of globals and do final output on them at end 00187 of compilation */ 00188 void (*final_write_globals) (void); 00189 00190 /* Do necessary preparations before assemble_variable can proceed. */ 00191 void (*prepare_assemble_variable) (tree); 00192 00193 /* True if this decl may be called via a sibcall. */ 00194 bool (*ok_for_sibcall) (tree); 00195 00196 /* Return the COMDAT group into which this DECL should be placed. 00197 It is known that the DECL belongs in *some* COMDAT group when 00198 this hook is called. The return value will be used immediately, 00199 but not explicitly deallocated, so implementations should not use 00200 xmalloc to allocate the string returned. (Typically, the return 00201 value will be the string already stored in an 00202 IDENTIFIER_NODE.) */ 00203 const char * (*comdat_group) (tree); 00204 00205 /* True if OpenMP should privatize what this DECL points to rather 00206 than the DECL itself. */ 00207 bool (*omp_privatize_by_reference) (tree); 00208 00209 /* Return sharing kind if OpenMP sharing attribute of DECL is 00210 predetermined, OMP_CLAUSE_DEFAULT_UNSPECIFIED otherwise. */ 00211 enum omp_clause_default_kind (*omp_predetermined_sharing) (tree); 00212 00213 /* Return true if DECL's DECL_VALUE_EXPR (if any) should be 00214 disregarded in OpenMP construct, because it is going to be 00215 remapped during OpenMP lowering. SHARED is true if DECL 00216 is going to be shared, false if it is going to be privatized. */ 00217 bool (*omp_disregard_value_expr) (tree, bool); 00218 00219 /* Return true if DECL that is shared iff SHARED is true should 00220 be put into OMP_CLAUSE_PRIVATE_DEBUG. */ 00221 bool (*omp_private_debug_clause) (tree, bool); 00222 00223 /* Build and return code for a default constructor for DECL in 00224 response to CLAUSE. Return NULL if nothing to be done. */ 00225 tree (*omp_clause_default_ctor) (tree clause, tree decl); 00226 00227 /* Build and return code for a copy constructor from SRC to DST. */ 00228 tree (*omp_clause_copy_ctor) (tree clause, tree dst, tree src); 00229 00230 /* Similarly, except use an assignment operator instead. */ 00231 tree (*omp_clause_assign_op) (tree clause, tree dst, tree src); 00232 00233 /* Build and return code destructing DECL. Return NULL if nothing 00234 to be done. */ 00235 tree (*omp_clause_dtor) (tree clause, tree decl); 00236 }; 00237 00238 /* Language-specific hooks. See langhooks-def.h for defaults. */ 00239 00240 struct lang_hooks 00241 { 00242 /* String identifying the front end. e.g. "GNU C++". */ 00243 const char *name; 00244 00245 /* sizeof (struct lang_identifier), so make_node () creates 00246 identifier nodes long enough for the language-specific slots. */ 00247 size_t identifier_size; 00248 00249 /* Determines the size of any language-specific tcc_constant or 00250 tcc_exceptional nodes. Since it is called from make_node, the 00251 only information available is the tree code. Expected to die 00252 on unrecognized codes. */ 00253 size_t (*tree_size) (enum tree_code); 00254 00255 /* The first callback made to the front end, for simple 00256 initialization needed before any calls to handle_option. Return 00257 the language mask to filter the switch array with. */ 00258 unsigned int (*init_options) (unsigned int argc, const char **argv); 00259 00260 /* Callback used to perform language-specific initialization for the 00261 global diagnostic context structure. */ 00262 void (*initialize_diagnostics) (struct diagnostic_context *); 00263 00264 /* Handle the switch CODE, which has real type enum opt_code from 00265 options.h. If the switch takes an argument, it is passed in ARG 00266 which points to permanent storage. The handler is responsible for 00267 checking whether ARG is NULL, which indicates that no argument 00268 was in fact supplied. For -f and -W switches, VALUE is 1 or 0 00269 for the positive and negative forms respectively. 00270 00271 Return 1 if the switch is valid, 0 if invalid, and -1 if it's 00272 valid and should not be treated as language-independent too. */ 00273 int (*handle_option) (size_t code, const char *arg, int value); 00274 00275 /* Return false to use the default complaint about a missing 00276 argument, otherwise output a complaint and return true. */ 00277 bool (*missing_argument) (const char *opt, size_t code); 00278 00279 /* Called when all command line options have been parsed to allow 00280 further processing and initialization 00281 00282 Should return true to indicate that a compiler back-end is 00283 not required, such as with the -E option. 00284 00285 If errorcount is nonzero after this call the compiler exits 00286 immediately and the finish hook is not called. */ 00287 bool (*post_options) (const char **); 00288 00289 /* Called after post_options to initialize the front end. Return 00290 false to indicate that no further compilation be performed, in 00291 which case the finish hook is called immediately. */ 00292 bool (*init) (void); 00293 00294 /* Called at the end of compilation, as a finalizer. */ 00295 void (*finish) (void); 00296 00297 /* Parses the entire file. The argument is nonzero to cause bison 00298 parsers to dump debugging information during parsing. */ 00299 void (*parse_file) (int); 00300 00301 /* Called immediately after parsing to clear the binding stack. */ 00302 void (*clear_binding_stack) (void); 00303 00304 /* Called to obtain the alias set to be used for an expression or type. 00305 Returns -1 if the language does nothing special for it. */ 00306 HOST_WIDE_INT (*get_alias_set) (tree); 00307 00308 /* Called with an expression that is to be processed as a constant. 00309 Returns either the same expression or a language-independent 00310 constant equivalent to its input. */ 00311 tree (*expand_constant) (tree); 00312 00313 /* Called by expand_expr for language-specific tree codes. 00314 Fourth argument is actually an enum expand_modifier. */ 00315 rtx (*expand_expr) (tree, rtx, enum machine_mode, int, rtx *); 00316 00317 /* Called by expand_expr to generate the definition of a decl. Returns 00318 1 if handled, 0 otherwise. */ 00319 int (*expand_decl) (tree); 00320 00321 /* Hook called by safe_from_p for language-specific tree codes. It is 00322 up to the language front-end to install a hook if it has any such 00323 codes that safe_from_p needs to know about. Since same_from_p will 00324 recursively explore the TREE_OPERANDs of an expression, this hook 00325 should not reexamine those pieces. This routine may recursively 00326 call safe_from_p; it should always pass `0' as the TOP_P 00327 parameter. */ 00328 int (*safe_from_p) (rtx, tree); 00329 00330 /* Function to finish handling an incomplete decl at the end of 00331 compilation. Default hook is does nothing. */ 00332 void (*finish_incomplete_decl) (tree); 00333 00334 /* Mark EXP saying that we need to be able to take the address of 00335 it; it should not be allocated in a register. Return true if 00336 successful. */ 00337 bool (*mark_addressable) (tree); 00338 00339 /* Hook called by staticp for language-specific tree codes. */ 00340 tree (*staticp) (tree); 00341 00342 /* Replace the DECL_LANG_SPECIFIC data, which may be NULL, of the 00343 DECL_NODE with a newly GC-allocated copy. */ 00344 void (*dup_lang_specific_decl) (tree); 00345 00346 /* Set the DECL_ASSEMBLER_NAME for a node. If it is the sort of 00347 thing that the assembler should talk about, set 00348 DECL_ASSEMBLER_NAME to an appropriate IDENTIFIER_NODE. 00349 Otherwise, set it to the ERROR_MARK_NODE to ensure that the 00350 assembler does not talk about it. */ 00351 void (*set_decl_assembler_name) (tree); 00352 00353 /* Return nonzero if fold-const is free to use bit-field 00354 optimizations, for instance in fold_truthop(). */ 00355 bool (*can_use_bit_fields_p) (void); 00356 00357 /* Nonzero if operations on types narrower than their mode should 00358 have their results reduced to the precision of the type. */ 00359 bool reduce_bit_field_operations; 00360 00361 /* Nonzero if this front end does not generate a dummy BLOCK between 00362 the outermost scope of the function and the FUNCTION_DECL. See 00363 is_body_block in stmt.c, and its callers. */ 00364 bool no_body_blocks; 00365 00366 /* The front end can add its own statistics to -fmem-report with 00367 this hook. It should output to stderr. */ 00368 void (*print_statistics) (void); 00369 00370 /* Called by print_tree when there is a tree of class tcc_exceptional 00371 that it doesn't know how to display. */ 00372 lang_print_tree_hook print_xnode; 00373 00374 /* Called to print language-dependent parts of tcc_decl, tcc_type, 00375 and IDENTIFIER_NODE nodes. */ 00376 lang_print_tree_hook print_decl; 00377 lang_print_tree_hook print_type; 00378 lang_print_tree_hook print_identifier; 00379 00380 /* Computes the name to use to print a declaration. DECL is the 00381 non-NULL declaration in question. VERBOSITY determines what 00382 information will be printed: 0: DECL_NAME, demangled as 00383 necessary. 1: and scope information. 2: and any other 00384 information that might be interesting, such as function parameter 00385 types in C++. */ 00386 const char *(*decl_printable_name) (tree decl, int verbosity); 00387 00388 /* Computes the dwarf-2/3 name for a tree. VERBOSITY determines what 00389 information will be printed: 0: DECL_NAME, demangled as 00390 necessary. 1: and scope information. */ 00391 const char *(*dwarf_name) (tree, int verbosity); 00392 00393 /* This compares two types for equivalence ("compatible" in C-based languages). 00394 This routine should only return 1 if it is sure. It should not be used 00395 in contexts where erroneously returning 0 causes problems. */ 00396 int (*types_compatible_p) (tree x, tree y); 00397 00398 /* Given a CALL_EXPR, return a function decl that is its target. */ 00399 tree (*lang_get_callee_fndecl) (tree); 00400 00401 /* Called by report_error_function to print out function name. */ 00402 void (*print_error_function) (struct diagnostic_context *, const char *); 00403 00404 /* Called from expr_size to calculate the size of the value of an 00405 expression in a language-dependent way. Returns a tree for the size 00406 in bytes. A frontend can call lhd_expr_size to get the default 00407 semantics in cases that it doesn't want to handle specially. */ 00408 tree (*expr_size) (tree); 00409 00410 /* Convert a character from the host's to the target's character 00411 set. The character should be in what C calls the "basic source 00412 character set" (roughly, the set of characters defined by plain 00413 old ASCII). The default is to return the character unchanged, 00414 which is correct in most circumstances. Note that both argument 00415 and result should be sign-extended under -fsigned-char, 00416 zero-extended under -fno-signed-char. */ 00417 HOST_WIDE_INT (*to_target_charset) (HOST_WIDE_INT); 00418 00419 /* Pointers to machine-independent attribute tables, for front ends 00420 using attribs.c. If one is NULL, it is ignored. Respectively, a 00421 table of attributes specific to the language, a table of 00422 attributes common to two or more languages (to allow easy 00423 sharing), and a table of attributes for checking formats. */ 00424 const struct attribute_spec *attribute_table; 00425 const struct attribute_spec *common_attribute_table; 00426 const struct attribute_spec *format_attribute_table; 00427 00428 /* Function-related language hooks. */ 00429 struct lang_hooks_for_functions function; 00430 00431 struct lang_hooks_for_tree_inlining tree_inlining; 00432 00433 struct lang_hooks_for_callgraph callgraph; 00434 00435 struct lang_hooks_for_tree_dump tree_dump; 00436 00437 struct lang_hooks_for_decls decls; 00438 00439 struct lang_hooks_for_types types; 00440 00441 /* Perform language-specific gimplification on the argument. Returns an 00442 enum gimplify_status, though we can't see that type here. */ 00443 int (*gimplify_expr) (tree *, tree *, tree *); 00444 00445 /* Fold an OBJ_TYPE_REF expression to the address of a function. 00446 KNOWN_TYPE carries the true type of the OBJ_TYPE_REF_OBJECT. */ 00447 tree (*fold_obj_type_ref) (tree, tree); 00448 00449 /* Return a definition for a builtin function named NAME and whose data type 00450 is TYPE. TYPE should be a function type with argument types. 00451 FUNCTION_CODE tells later passes how to compile calls to this function. 00452 See tree.h for its possible values. 00453 00454 If LIBRARY_NAME is nonzero, use that for DECL_ASSEMBLER_NAME, 00455 the name to be called if we can't opencode the function. If 00456 ATTRS is nonzero, use that for the function's attribute list. */ 00457 tree (*builtin_function) (const char *name, tree type, int function_code, 00458 enum built_in_class bt_class, 00459 const char *library_name, tree attrs); 00460 00461 /* Used to set up the tree_contains_structure array for a frontend. */ 00462 void (*init_ts) (void); 00463 00464 /* Called by recompute_tree_invariant_for_addr_expr to go from EXPR 00465 to a contained expression or DECL, possibly updating *TC, *TI or 00466 *SE if in the process TREE_CONSTANT, TREE_INVARIANT or 00467 TREE_SIDE_EFFECTS need updating. */ 00468 tree (*expr_to_decl) (tree expr, bool *tc, bool *ti, bool *se); 00469 00470 #ifdef KEY 00471 tree (*cplus_expand_constant) (tree cst); 00472 tree (*mangle_decl) (const tree decl); 00473 void (*cp_genericize) (tree fn); 00474 tree (*simplify_aggr_init_exprs_r) (tree *t, int *i, void *p); 00475 #endif 00476 00477 /* Whenever you add entries here, make sure you adjust langhooks-def.h 00478 and langhooks.c accordingly. */ 00479 }; 00480 00481 /* Each front end provides its own. */ 00482 extern const struct lang_hooks lang_hooks; 00483 00484 #endif /* GCC_LANG_HOOKS_H */
1.5.6