X-Git-Url: http://git.sourceforge.jp/view?a=blobdiff_plain;ds=sidebyside;f=gcc%2Flanghooks.h;h=752ad99501f805ed318feb806ac9c562b22062e9;hb=36f8c53a64e6894aa9b3112f29a016b95696fe14;hp=ce6b7a6b1c75ccfa25fa5ec9516aed78c238464f;hpb=f0c467daaf790c59979c5f05b903e67d60f20877;p=pf3gnuchains%2Fgcc-fork.git diff --git a/gcc/langhooks.h b/gcc/langhooks.h index ce6b7a6b1c7..752ad99501f 100644 --- a/gcc/langhooks.h +++ b/gcc/langhooks.h @@ -1,11 +1,12 @@ /* The lang_hooks data structure. - Copyright 2001, 2002, 2003 Free Software Foundation, Inc. + Copyright 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 + Free Software Foundation, Inc. This file is part of GCC. GCC is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 2, or (at your option) +the Free Software Foundation; either version 3, or (at your option) any later version. GCC is distributed in the hope that it will be useful, @@ -14,9 +15,8 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 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. */ +along with GCC; see the file COPYING3. If not see +. */ #ifndef GCC_LANG_HOOKS_H #define GCC_LANG_HOOKS_H @@ -24,71 +24,34 @@ Boston, MA 02111-1307, USA. */ /* This file should be #include-d after tree.h. */ struct diagnostic_context; +struct diagnostic_info; + +struct gimplify_omp_ctx; + +struct array_descr_info; /* A print hook for print_tree (). */ typedef void (*lang_print_tree_hook) (FILE *, tree, int indent); +enum classify_record + { RECORD_IS_STRUCT, RECORD_IS_CLASS, RECORD_IS_INTERFACE }; + /* The following hooks are documented in langhooks.c. Must not be NULL. */ struct lang_hooks_for_tree_inlining { - tree (*walk_subtrees) (tree *, int *, - tree (*) (tree *, int *, void *), - void *, void *); - 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); - int (*start_inlining) (tree); - void (*end_inlining) (tree); - tree (*convert_parm_for_inlining) (tree, tree, tree, int); - int (*estimate_num_insns) (tree); + bool (*var_mod_type_p) (tree, tree); }; struct lang_hooks_for_callgraph { /* The node passed is a language-specific tree node. If its contents are relevant to use of other declarations, mark them. */ - tree (*analyze_expr) (tree *, int *, tree); - - /* Produce RTL for function passed as argument. */ - void (*expand_function) (tree); -}; + tree (*analyze_expr) (tree *, int *); -/* Lang hooks for management of language-specific data or status - when entering / leaving functions etc. */ -struct lang_hooks_for_functions -{ - /* Called when entering a function. */ - void (*init) (struct function *); - - /* Called when leaving a function. */ - void (*final) (struct function *); - - /* Called when entering a nested function. */ - void (*enter_nested) (struct function *); - - /* 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); + /* Emit thunks associated to function. */ + void (*emit_associated_thunks) (tree); }; /* The following hooks are used by tree-dump.c. */ @@ -100,7 +63,7 @@ struct lang_hooks_for_tree_dump bool (*dump_tree) (void *, tree); /* Determine type qualifiers in a language-specific way. */ - int (*type_quals) (tree); + int (*type_quals) (const_tree); }; /* Hooks related to types. */ @@ -111,6 +74,11 @@ struct lang_hooks_for_types language-specific processing is required. */ tree (*make_type) (enum tree_code); + /* Return what kind of RECORD_TYPE this is, mainly for purposes of + debug information. If not defined, record types are assumed to + be structures. */ + enum classify_record (*classify_record) (tree); + /* Given MODE and UNSIGNEDP, return a suitable type-tree with that mode. */ tree (*type_for_mode) (enum machine_mode, int); @@ -119,22 +87,14 @@ struct lang_hooks_for_types integer type with at least that precision. */ tree (*type_for_size) (unsigned, int); - /* Given an integer type T, return a type like T but unsigned. - If T is unsigned, the value is T. */ - tree (*unsigned_type) (tree); - - /* Given an integer type T, return a type like T but signed. - If T is signed, the value is T. */ - tree (*signed_type) (tree); - - /* Return a type the same as TYPE except unsigned or signed - according to UNSIGNEDP. */ - tree (*signed_or_unsigned_type) (int, tree); + /* True if the type is an instantiation of a generic type, + e.g. C++ template implicit specializations. */ + bool (*generic_p) (const_tree); /* 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 @@ -150,36 +110,46 @@ struct lang_hooks_for_types invalid use of an incomplete type. VALUE is the expression that 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); + void (*incomplete_type_error) (const_tree value, const_tree type); + + /* Called from assign_temp to return the maximum size, if there is one, + for a type. */ + tree (*max_size) (const_tree); + + /* Register language specific type size variables as potentially OpenMP + firstprivate variables. */ + void (*omp_firstprivatize_type_sizes) (struct gimplify_omp_ctx *, tree); + + /* Return TRUE if TYPE1 and TYPE2 are identical for type hashing purposes. + Called only after doing all language independent checks. + At present, this function is only called when both TYPE1 and TYPE2 are + FUNCTION_TYPEs. */ + bool (*type_hash_eq) (const_tree, const_tree); + + /* Return TRUE if TYPE uses a hidden descriptor and fills in information + for the debugger about the array bounds, strides, etc. */ + bool (*get_array_descr_info) (const_tree, struct array_descr_info *); + + /* If we requested a pointer to a vector, build up the pointers that + we stripped off while looking for the inner type. Similarly for + return values from functions. The argument TYPE is the top of the + chain, and BOTTOM is the new type which we will point to. */ + tree (*reconstruct_complex_type) (tree, 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); - /* Insert BLOCK at the end of the list of subblocks of the - current binding level. This is used when a BIND_EXPR is expanded, - 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,22 +159,65 @@ 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); + bool (*warn_unused_global) (const_tree); /* Obtain a list of globals and do final output on them at end of compilation */ void (*final_write_globals) (void); - /* Do necessary preparations before assemble_variable can proceed. */ - void (*prepare_assemble_variable) (tree); - /* True if this decl may be called via a sibcall. */ - bool (*ok_for_sibcall) (tree); + bool (*ok_for_sibcall) (const_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) (const_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); + + /* Return true if DECL in private clause needs + OMP_CLAUSE_PRIVATE_OUTER_REF on the private clause. */ + bool (*omp_private_outer_ref) (tree); + + /* Build and return code for a default constructor for DECL in + response to CLAUSE. OUTER is corresponding outer region's + variable if needed. Return NULL if nothing to be done. */ + tree (*omp_clause_default_ctor) (tree clause, tree decl, tree outer); + + /* 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); + + /* Do language specific checking on an implicitly determined clause. */ + void (*omp_finish_clause) (tree clause); }; /* Language-specific hooks. See langhooks-def.h for defaults. */ @@ -218,9 +231,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 @@ -269,74 +283,33 @@ struct lang_hooks parsers to dump debugging information during parsing. */ void (*parse_file) (int); - /* Called immediately after parsing to clear the binding stack. */ - void (*clear_binding_stack) (void); + /* Determines if it's ok for a function to have no noreturn attribute. */ + bool (*missing_noreturn_ok_p) (tree); /* Called to obtain the alias set to be used for an expression or type. Returns -1 if the language does nothing special for it. */ - HOST_WIDE_INT (*get_alias_set) (tree); - - /* Called with an expression that is to be processed as a constant. - Returns either the same expression or a language-independent - constant equivalent to its input. */ - tree (*expand_constant) (tree); + alias_set_type (*get_alias_set) (tree); /* 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 !. - - The result should be an expression of boolean type (if not an - error_mark_node). */ - tree (*truthvalue_conversion) (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 - codes that safe_from_p needs to know about. Since same_from_p will - recursively explore the TREE_OPERANDs of an expression, this hook - should not reexamine those pieces. This routine may recursively - call safe_from_p; it should always pass `0' as the TOP_P - parameter. */ - int (*safe_from_p) (rtx, tree); + rtx (*expand_expr) (tree, rtx, enum machine_mode, int, rtx *); /* Function to finish handling an incomplete decl at the end of 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. @@ -344,13 +317,6 @@ struct lang_hooks assembler does not talk about it. */ void (*set_decl_assembler_name) (tree); - /* Return nonzero if fold-const is free to use bit-field - 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 this front end does not generate a dummy BLOCK between the outermost scope of the function and the FUNCTION_DECL. See is_body_block in stmt.c, and its callers. */ @@ -360,12 +326,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,21 +344,34 @@ struct lang_hooks types in C++. */ const char *(*decl_printable_name) (tree decl, int verbosity); - /* Given a CALL_EXPR, return a function decl that is its target. */ - tree (*lang_get_callee_fndecl) (tree); + /* Computes the dwarf-2/3 name for a tree. VERBOSITY determines what + information will be printed: 0: DECL_NAME, demangled as + necessary. 1: and scope information. */ + const char *(*dwarf_name) (tree, 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); /* Called by report_error_function to print out function name. */ - void (*print_error_function) (struct diagnostic_context *, const char *); + void (*print_error_function) (struct diagnostic_context *, const char *, + struct diagnostic_info *); /* Called from expr_size to calculate the size of the value of an expression in a language-dependent way. Returns a tree for the size in bytes. A frontend can call lhd_expr_size to get the default semantics in cases that it doesn't want to handle specially. */ - tree (*expr_size) (tree); + tree (*expr_size) (const_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 @@ -403,9 +382,6 @@ struct lang_hooks const struct attribute_spec *common_attribute_table; const struct attribute_spec *format_attribute_table; - /* Function-related language hooks. */ - struct lang_hooks_for_functions function; - struct lang_hooks_for_tree_inlining tree_inlining; struct lang_hooks_for_callgraph callgraph; @@ -416,7 +392,32 @@ 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 *, gimple_seq *, gimple_seq *); + + /* 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); + + /* Do language specific processing in the builtin function DECL */ + tree (*builtin_function) (tree decl); + + /* Like builtin_function, but make sure the scope is the external scope. + This is used to delay putting in back end builtin functions until the ISA + that defines the builtin is declared via function specific target options, + which can save memory for machines like the x86_64 that have multiple + ISAs. If this points to the same function as builtin_function, the + backend must add all of the builtins at program initialization time. */ + tree (*builtin_function_ext_scope) (tree decl); + + /* 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 or *SE + if in the process TREE_CONSTANT or TREE_SIDE_EFFECTS need updating. */ + tree (*expr_to_decl) (tree expr, bool *tc, bool *se); /* Whenever you add entries here, make sure you adjust langhooks-def.h and langhooks.c accordingly. */ @@ -424,5 +425,15 @@ struct lang_hooks /* Each front end provides its own. */ extern const struct lang_hooks lang_hooks; +extern tree add_builtin_function (const char *name, tree type, + int function_code, enum built_in_class cl, + const char *library_name, + tree attrs); + +extern tree add_builtin_function_ext_scope (const char *name, tree type, + int function_code, + enum built_in_class cl, + const char *library_name, + tree attrs); #endif /* GCC_LANG_HOOKS_H */