X-Git-Url: http://git.sourceforge.jp/view?a=blobdiff_plain;f=gcc%2Flanghooks.h;h=eb6aaaff12ed332b13b127931f023662e212207a;hb=1e8e992020adfba209ef30b3c369e2ca6282d837;hp=cb5941ff3eb37766e6a2fa3f2cd10762b8c6bcb3;hpb=264f4f303ddd1a389442ef4246898591953a2976;p=pf3gnuchains%2Fgcc-fork.git diff --git a/gcc/langhooks.h b/gcc/langhooks.h index cb5941ff3eb..eb6aaaff12e 100644 --- a/gcc/langhooks.h +++ b/gcc/langhooks.h @@ -1,5 +1,5 @@ /* The lang_hooks data structure. - Copyright 2001, 2002, 2003 Free Software Foundation, Inc. + Copyright 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. This file is part of GCC. @@ -15,8 +15,8 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GCC; see the file COPYING. If not, write to -the Free Software Foundation, 59 Temple Place - Suite 330, -Boston, MA 02111-1307, USA. */ +the Free Software Foundation, 51 Franklin Street, Fifth Floor, +Boston, MA 02110-1301, USA. */ #ifndef GCC_LANG_HOOKS_H #define GCC_LANG_HOOKS_H @@ -25,6 +25,8 @@ Boston, MA 02111-1307, USA. */ struct diagnostic_context; +struct gimplify_omp_ctx; + /* A print hook for print_tree (). */ typedef void (*lang_print_tree_hook) (FILE *, tree, int indent); @@ -35,20 +37,16 @@ struct lang_hooks_for_tree_inlining { tree (*walk_subtrees) (tree *, int *, tree (*) (tree *, int *, void *), - void *, void *); + void *, struct pointer_set_t*); int (*cannot_inline_tree_fn) (tree *); int (*disregard_inline_limits) (tree); tree (*add_pending_fn_decls) (void *, tree); - int (*tree_chain_matters_p) (tree); int (*auto_var_in_fn_p) (tree, tree); - tree (*copy_res_decl_for_inlining) (tree, tree, tree, - void *, int *, tree); int (*anon_aggr_type_p) (tree); - bool (*var_mod_type_p) (tree); + bool (*var_mod_type_p) (tree, tree); int (*start_inlining) (tree); void (*end_inlining) (tree); - tree (*convert_parm_for_inlining) (tree, tree, tree); - int (*estimate_num_insns) (tree); + tree (*convert_parm_for_inlining) (tree, tree, tree, int); }; struct lang_hooks_for_callgraph @@ -76,19 +74,9 @@ struct lang_hooks_for_functions /* Called when leaving a nested function. */ void (*leave_nested) (struct function *); -}; - -/* Lang hooks for rtl code generation. */ -struct lang_hooks_for_rtl_expansion -{ - /* Called after expand_function_start, but before expanding the body. */ - void (*start) (void); - - /* Called to expand each statement. */ - void (*stmt) (tree); - /* Called after expanding the body but before expand_function_end. */ - void (*end) (void); + /* Determines if it's ok for a function to have no noreturn attribute. */ + bool (*missing_noreturn_ok_p) (tree); }; /* The following hooks are used by tree-dump.c. */ @@ -134,7 +122,7 @@ struct lang_hooks_for_types /* Given a type, apply default promotions to unnamed function arguments and return the new type. Return the same type if no change. Required by any language that supports variadic - arguments. The default hook aborts. */ + arguments. The default hook dies. */ tree (*type_promotes_to) (tree); /* Register TYPE as a builtin type with the indicated NAME. The @@ -151,23 +139,25 @@ struct lang_hooks_for_types was used (or 0 if that isn't known) and TYPE is the type that was invalid. */ void (*incomplete_type_error) (tree value, tree type); + + /* Called from assign_temp to return the maximum size, if there is one, + for a type. */ + tree (*max_size) (tree); + + /* Register language specific type size variables as potentially OpenMP + firstprivate variables. */ + void (*omp_firstprivatize_type_sizes) (struct gimplify_omp_ctx *, tree); + + /* Nonzero if types that are identical are to be hashed so that only + one copy is kept. If a language requires unique types for each + user-specified type, such as Ada, this should be set to TRUE. */ + bool hash_types; }; /* Language hooks related to decls and the symbol table. */ struct lang_hooks_for_decls { - /* Enter a new lexical scope. Argument is always zero when called - from outside the front end. */ - void (*pushlevel) (int); - - /* Exit a lexical scope and return a BINDING for that scope. - Takes three arguments: - KEEP -- nonzero if there were declarations in this scope. - REVERSE -- reverse the order of decls before returning them. - FUNCTIONBODY -- nonzero if this level is the body of a function. */ - tree (*poplevel) (int, int, int); - /* Returns nonzero if we are in the global binding level. Ada returns -1 for an undocumented reason used in stor-layout.c. */ int (*global_bindings_p) (void); @@ -177,9 +167,6 @@ struct lang_hooks_for_decls to handle the BLOCK node inside the BIND_EXPR. */ void (*insert_block) (tree); - /* Set the BLOCK node for the current scope level. */ - void (*set_block) (tree); - /* Function to add a decl to the current scope level. Takes one argument, a decl to add. Returns that decl, or, if the same symbol is already declared, may return a different decl for that @@ -189,9 +176,6 @@ struct lang_hooks_for_decls /* Returns the chain of decls so far in the current scope level. */ tree (*getdecls) (void); - /* Returns a chain of TYPE_DECLs for built-in types. */ - tree (*builtin_type_decls) (void); - /* Returns true when we should warn for an unused global DECL. We will already have checked that it has static binding. */ bool (*warn_unused_global) (tree); @@ -205,6 +189,47 @@ struct lang_hooks_for_decls /* True if this decl may be called via a sibcall. */ bool (*ok_for_sibcall) (tree); + + /* Return the COMDAT group into which this DECL should be placed. + It is known that the DECL belongs in *some* COMDAT group when + this hook is called. The return value will be used immediately, + but not explicitly deallocated, so implementations should not use + xmalloc to allocate the string returned. (Typically, the return + value will be the string already stored in an + IDENTIFIER_NODE.) */ + const char * (*comdat_group) (tree); + + /* True if OpenMP should privatize what this DECL points to rather + than the DECL itself. */ + bool (*omp_privatize_by_reference) (tree); + + /* Return sharing kind if OpenMP sharing attribute of DECL is + predetermined, OMP_CLAUSE_DEFAULT_UNSPECIFIED otherwise. */ + enum omp_clause_default_kind (*omp_predetermined_sharing) (tree); + + /* Return true if DECL's DECL_VALUE_EXPR (if any) should be + disregarded in OpenMP construct, because it is going to be + remapped during OpenMP lowering. SHARED is true if DECL + is going to be shared, false if it is going to be privatized. */ + bool (*omp_disregard_value_expr) (tree, bool); + + /* Return true if DECL that is shared iff SHARED is true should + be put into OMP_CLAUSE_PRIVATE_DEBUG. */ + bool (*omp_private_debug_clause) (tree, bool); + + /* Build and return code for a default constructor for DECL in + response to CLAUSE. Return NULL if nothing to be done. */ + tree (*omp_clause_default_ctor) (tree clause, tree decl); + + /* Build and return code for a copy constructor from SRC to DST. */ + tree (*omp_clause_copy_ctor) (tree clause, tree dst, tree src); + + /* Similarly, except use an assignment operator instead. */ + tree (*omp_clause_assign_op) (tree clause, tree dst, tree src); + + /* Build and return code destructing DECL. Return NULL if nothing + to be done. */ + tree (*omp_clause_dtor) (tree clause, tree decl); }; /* Language-specific hooks. See langhooks-def.h for defaults. */ @@ -218,9 +243,10 @@ struct lang_hooks identifier nodes long enough for the language-specific slots. */ size_t identifier_size; - /* Determines the size of any language-specific 'x' or 'c' nodes. - Since it is called from make_node, the only information available - is the tree code. Expected to abort on unrecognized codes. */ + /* Determines the size of any language-specific tcc_constant or + tcc_exceptional nodes. Since it is called from make_node, the + only information available is the tree code. Expected to die + on unrecognized codes. */ size_t (*tree_size) (enum tree_code); /* The first callback made to the front end, for simple @@ -283,20 +309,11 @@ struct lang_hooks /* Called by expand_expr for language-specific tree codes. Fourth argument is actually an enum expand_modifier. */ - rtx (*expand_expr) (tree, rtx, enum machine_mode, int); - - /* Prepare expr to be an argument of a TRUTH_NOT_EXPR or other logical - operation. - - This preparation consists of taking the ordinary representation - of an expression expr and producing a valid tree boolean - expression describing whether expr is nonzero. We could simply - always do build_binary_op (NE_EXPR, expr, integer_zero_node, 1), - but we optimize comparisons, &&, ||, and !. + rtx (*expand_expr) (tree, rtx, enum machine_mode, int, rtx *); - The result should be an expression of boolean type (if not an - error_mark_node). */ - tree (*truthvalue_conversion) (tree); + /* Called by expand_expr to generate the definition of a decl. Returns + 1 if handled, 0 otherwise. */ + int (*expand_decl) (tree); /* Hook called by safe_from_p for language-specific tree codes. It is up to the language front-end to install a hook if it has any such @@ -311,32 +328,18 @@ struct lang_hooks compilation. Default hook is does nothing. */ void (*finish_incomplete_decl) (tree); - /* Function used by unsafe_for_reeval. A non-negative number is - returned directly from unsafe_for_reeval, a negative number falls - through. The default hook returns a negative number. */ - int (*unsafe_for_reeval) (tree); - /* Mark EXP saying that we need to be able to take the address of it; it should not be allocated in a register. Return true if successful. */ bool (*mark_addressable) (tree); /* Hook called by staticp for language-specific tree codes. */ - int (*staticp) (tree); + tree (*staticp) (tree); /* Replace the DECL_LANG_SPECIFIC data, which may be NULL, of the DECL_NODE with a newly GC-allocated copy. */ void (*dup_lang_specific_decl) (tree); - /* Called before its argument, an UNSAVE_EXPR, is to be - unsaved. Modify it in-place so that all the evaluate only once - things are cleared out. */ - tree (*unsave_expr_now) (tree); - - /* Called by expand_expr to build and return the cleanup-expression - for the passed TARGET_EXPR. Return NULL if there is none. */ - tree (*maybe_build_cleanup) (tree); - /* Set the DECL_ASSEMBLER_NAME for a node. If it is the sort of thing that the assembler should talk about, set DECL_ASSEMBLER_NAME to an appropriate IDENTIFIER_NODE. @@ -348,8 +351,9 @@ struct lang_hooks optimizations, for instance in fold_truthop(). */ bool (*can_use_bit_fields_p) (void); - /* Nonzero if TYPE_READONLY and TREE_READONLY should always be honored. */ - bool honor_readonly; + /* Nonzero if operations on types narrower than their mode should + have their results reduced to the precision of the type. */ + bool reduce_bit_field_operations; /* Nonzero if this front end does not generate a dummy BLOCK between the outermost scope of the function and the FUNCTION_DECL. See @@ -360,12 +364,12 @@ struct lang_hooks this hook. It should output to stderr. */ void (*print_statistics) (void); - /* Called by print_tree when there is a tree of class 'x' that it - doesn't know how to display. */ + /* Called by print_tree when there is a tree of class tcc_exceptional + that it doesn't know how to display. */ lang_print_tree_hook print_xnode; - /* Called to print language-dependent parts of a class 'd', class - 't', and IDENTIFIER_NODE nodes. */ + /* Called to print language-dependent parts of tcc_decl, tcc_type, + and IDENTIFIER_NODE nodes. */ lang_print_tree_hook print_decl; lang_print_tree_hook print_type; lang_print_tree_hook print_identifier; @@ -378,6 +382,11 @@ struct lang_hooks types in C++. */ const char *(*decl_printable_name) (tree decl, int verbosity); + /* This compares two types for equivalence ("compatible" in C-based languages). + This routine should only return 1 if it is sure. It should not be used + in contexts where erroneously returning 0 causes problems. */ + int (*types_compatible_p) (tree x, tree y); + /* Given a CALL_EXPR, return a function decl that is its target. */ tree (*lang_get_callee_fndecl) (tree); @@ -390,9 +399,14 @@ struct lang_hooks semantics in cases that it doesn't want to handle specially. */ tree (*expr_size) (tree); - /* Called from uninitialized_vars_warning to find out if a variable is - uninitialized based on DECL_INITIAL. */ - bool (*decl_uninit) (tree); + /* Convert a character from the host's to the target's character + set. The character should be in what C calls the "basic source + character set" (roughly, the set of characters defined by plain + old ASCII). The default is to return the character unchanged, + which is correct in most circumstances. Note that both argument + and result should be sign-extended under -fsigned-char, + zero-extended under -fno-signed-char. */ + HOST_WIDE_INT (*to_target_charset) (HOST_WIDE_INT); /* Pointers to machine-independent attribute tables, for front ends using attribs.c. If one is NULL, it is ignored. Respectively, a @@ -416,7 +430,34 @@ struct lang_hooks struct lang_hooks_for_types types; - struct lang_hooks_for_rtl_expansion rtl_expand; + /* Perform language-specific gimplification on the argument. Returns an + enum gimplify_status, though we can't see that type here. */ + int (*gimplify_expr) (tree *, tree *, tree *); + + /* Fold an OBJ_TYPE_REF expression to the address of a function. + KNOWN_TYPE carries the true type of the OBJ_TYPE_REF_OBJECT. */ + tree (*fold_obj_type_ref) (tree, tree); + + /* Return a definition for a builtin function named NAME and whose data type + is TYPE. TYPE should be a function type with argument types. + FUNCTION_CODE tells later passes how to compile calls to this function. + See tree.h for its possible values. + + If LIBRARY_NAME is nonzero, use that for DECL_ASSEMBLER_NAME, + the name to be called if we can't opencode the function. If + ATTRS is nonzero, use that for the function's attribute list. */ + tree (*builtin_function) (const char *name, tree type, int function_code, + enum built_in_class bt_class, + const char *library_name, tree attrs); + + /* Used to set up the tree_contains_structure array for a frontend. */ + void (*init_ts) (void); + + /* Called by recompute_tree_invariant_for_addr_expr to go from EXPR + to a contained expression or DECL, possibly updating *TC, *TI or + *SE if in the process TREE_CONSTANT, TREE_INVARIANT or + TREE_SIDE_EFFECTS need updating. */ + tree (*expr_to_decl) (tree expr, bool *tc, bool *ti, bool *se); /* Whenever you add entries here, make sure you adjust langhooks-def.h and langhooks.c accordingly. */