X-Git-Url: http://git.sourceforge.jp/view?a=blobdiff_plain;f=gcc%2Ftree.h;h=decc05dc3c31c9cbab3a8237eddc3efd56a52c36;hb=3df4c876744f94bcbf51447c1cacddf3f57c15dc;hp=808897b7d703375473de333fca9a5349b87a9dd0;hpb=4dc2a232f2a7bbcb963fcf298820f65c643b99b2;p=pf3gnuchains%2Fgcc-fork.git diff --git a/gcc/tree.h b/gcc/tree.h index 808897b7d70..decc05dc3c3 100644 --- a/gcc/tree.h +++ b/gcc/tree.h @@ -27,6 +27,7 @@ along with GCC; see the file COPYING3. If not see #include "statistics.h" #include "vec.h" #include "double-int.h" +#include "alias.h" /* Codes of tree nodes */ @@ -194,6 +195,8 @@ extern const enum tree_code_class tree_code_type[]; || TREE_CODE (NODE) == OMP_ORDERED \ || TREE_CODE (NODE) == OMP_CRITICAL \ || TREE_CODE (NODE) == OMP_RETURN \ + || TREE_CODE (NODE) == OMP_ATOMIC_LOAD \ + || TREE_CODE (NODE) == OMP_ATOMIC_STORE \ || TREE_CODE (NODE) == OMP_CONTINUE) /* Number of argument-words in each kind of tree-node. */ @@ -463,6 +466,8 @@ struct gimple_stmt GTY(()) VAR_DECL or FUNCTION_DECL or IDENTIFIER_NODE ASM_VOLATILE_P in ASM_EXPR + CALL_EXPR_VA_ARG_PACK in + CALL_EXPR TYPE_CACHED_VALUES_P in ..._TYPE SAVE_EXPR_RESOLVED_P in @@ -1016,7 +1021,9 @@ extern void omp_clause_range_check_failed (const_tree, const char *, int, && (TYPE_MODE (TREE_TYPE (EXP)) \ == TYPE_MODE (TREE_TYPE (TREE_OPERAND (EXP, 0)))) \ && (TYPE_UNSIGNED (TREE_TYPE (EXP)) \ - == TYPE_UNSIGNED (TREE_TYPE (TREE_OPERAND (EXP, 0))))) \ + == TYPE_UNSIGNED (TREE_TYPE (TREE_OPERAND (EXP, 0)))) \ + && (POINTER_TYPE_P (TREE_TYPE (EXP)) \ + == POINTER_TYPE_P (TREE_TYPE (TREE_OPERAND (EXP, 0))))) \ (EXP) = TREE_OPERAND (EXP, 0) /* Like STRIP_NOPS, but don't alter the TREE_TYPE either. */ @@ -1221,6 +1228,11 @@ extern void omp_clause_range_check_failed (const_tree, const char *, int, #define SAVE_EXPR_RESOLVED_P(NODE) \ (TREE_CHECK (NODE, SAVE_EXPR)->base.public_flag) +/* Set on a CALL_EXPR if this stdarg call should be passed the argument + pack. */ +#define CALL_EXPR_VA_ARG_PACK(NODE) \ + (CALL_EXPR_CHECK(NODE)->base.public_flag) + /* In any expression, decl, or constant, nonzero means it has side effects or reevaluation of the whole expression could produce a different value. This is set if any subexpression is a function call, a side effect or a @@ -1590,8 +1602,8 @@ struct tree_constructor GTY(()) #define EXPR_HAS_LOCATION(NODE) expr_has_location ((NODE)) #define EXPR_LOCUS(NODE) expr_locus ((NODE)) #define SET_EXPR_LOCUS(NODE, FROM) set_expr_locus ((NODE), (FROM)) -#define EXPR_FILENAME(NODE) *(expr_filename ((NODE))) -#define EXPR_LINENO(NODE) *(expr_lineno ((NODE))) +#define EXPR_FILENAME(NODE) (expr_filename ((NODE))) +#define EXPR_LINENO(NODE) (expr_lineno ((NODE))) /* True if a tree is an expression or statement that can have a location. */ @@ -2310,7 +2322,7 @@ struct tree_type GTY(()) tree reference_to; union tree_type_symtab { int GTY ((tag ("0"))) address; - char * GTY ((tag ("1"))) pointer; + const char * GTY ((tag ("1"))) pointer; struct die_struct * GTY ((tag ("2"))) die; } GTY ((desc ("debug_hooks == &sdb_debug_hooks ? 1 : debug_hooks == &dwarf2_debug_hooks ? 2 : 0"), descbits ("2"))) symtab; @@ -2322,7 +2334,7 @@ struct tree_type GTY(()) tree binfo; tree context; tree canonical; - HOST_WIDE_INT alias_set; + alias_set_type alias_set; /* Points to a structure whose details depend on the language in use. */ struct lang_type *lang_specific; }; @@ -2542,7 +2554,11 @@ struct tree_memory_tag GTY(()) bitmap GTY ((skip)) aliases; + /* True if this tag has global scope. */ unsigned int is_global:1; + + /* True if this SFT is for a field in a nested structure. */ + unsigned int in_nested_struct : 1; }; #define MTAG_GLOBAL(NODE) (TREE_MEMORY_TAG_CHECK (NODE)->mtag.is_global) @@ -2562,14 +2578,17 @@ struct tree_struct_field_tag GTY(()) unsigned HOST_WIDE_INT size; /* Alias set for a DECL_NONADDRESSABLE_P field. Otherwise -1. */ - HOST_WIDE_INT alias_set; + alias_set_type alias_set; }; + #define SFT_PARENT_VAR(NODE) (STRUCT_FIELD_TAG_CHECK (NODE)->sft.parent_var) #define SFT_OFFSET(NODE) (STRUCT_FIELD_TAG_CHECK (NODE)->sft.offset) #define SFT_SIZE(NODE) (STRUCT_FIELD_TAG_CHECK (NODE)->sft.size) #define SFT_NONADDRESSABLE_P(NODE) \ (STRUCT_FIELD_TAG_CHECK (NODE)->sft.alias_set != -1) #define SFT_ALIAS_SET(NODE) (STRUCT_FIELD_TAG_CHECK (NODE)->sft.alias_set) +#define SFT_IN_NESTED_STRUCT(NODE) \ + (STRUCT_FIELD_TAG_CHECK (NODE)->sft.common.in_nested_struct) /* Memory Partition Tags (MPTs) group memory symbols under one common name for the purposes of placing memory PHI nodes. */ @@ -2646,8 +2665,7 @@ struct tree_memory_partition_tag GTY(()) (DECL_COMMON_CHECK (NODE)->decl_common.debug_expr_is_from) /* Nonzero for a given ..._DECL node means that the name of this node should - be ignored for symbolic debug purposes. Moreover, for a FUNCTION_DECL, - the body of the function should also be ignored. */ + be ignored for symbolic debug purposes. */ #define DECL_IGNORED_P(NODE) (DECL_COMMON_CHECK (NODE)->decl_common.ignored_flag) /* Nonzero for a given ..._DECL node means that this node represents an @@ -2785,7 +2803,7 @@ struct tree_decl_common GTY(()) tree attributes; tree abstract_origin; - HOST_WIDE_INT pointer_alias_set; + alias_set_type pointer_alias_set; /* Points to a structure whose details depend on the language in use. */ struct lang_decl *lang_specific; }; @@ -2913,14 +2931,6 @@ struct tree_field_decl GTY(()) struct tree_label_decl GTY(()) { struct tree_decl_with_rtl common; - /* Java's verifier has some need to store information about labels, - and was using fields that no longer exist on labels. - Once the verifier doesn't need these anymore, they should be removed. */ - tree java_field_1; - tree java_field_2; - tree java_field_3; - unsigned int java_field_4; - }; struct tree_result_decl GTY(()) @@ -3141,16 +3151,15 @@ extern void decl_fini_priority_insert (tree, priority_type); #define DECL_HAS_INIT_PRIORITY_P(NODE) \ (VAR_DECL_CHECK (NODE)->decl_with_vis.init_priority_p) -/* For a VAR_DECL or FUNCTION_DECL with DECL_HAS_INIT_PRIORITY_P set, - the initialization priority of NODE. */ +/* For a VAR_DECL or FUNCTION_DECL the initialization priority of + NODE. */ #define DECL_INIT_PRIORITY(NODE) \ (decl_init_priority_lookup (NODE)) /* Set the initialization priority for NODE to VAL. */ #define SET_DECL_INIT_PRIORITY(NODE, VAL) \ (decl_init_priority_insert (NODE, VAL)) -/* For a FUNCTION_DECL with DECL_HAS_INIT_PRIORITY_P set, the - finalization priority of NODE. */ +/* For a FUNCTION_DECL the finalization priority of NODE. */ #define DECL_FINI_PRIORITY(NODE) \ (decl_fini_priority_lookup (NODE)) /* Set the finalization priority for NODE to VAL. */ @@ -3280,6 +3289,13 @@ struct tree_decl_non_common GTY(()) #define DECL_DECLARED_INLINE_P(NODE) \ (FUNCTION_DECL_CHECK (NODE)->function_decl.declared_inline_flag) +/* Nonzero in a FUNCTION_DECL that should be always inlined by the inliner + disregarding size and cost heuristics. This is equivalent to using + the always_inline attribute without the required diagnostics if the + function cannot be inlined. */ +#define DECL_DISREGARD_INLINE_LIMITS(NODE) \ + (FUNCTION_DECL_CHECK (NODE)->function_decl.disregard_inline_limits) + /* For FUNCTION_DECL, this holds a pointer to a structure ("struct function") that describes the status of this function. */ #define DECL_STRUCT_FUNCTION(NODE) (FUNCTION_DECL_CHECK (NODE)->function_decl.f) @@ -3306,27 +3322,33 @@ struct tree_function_decl GTY(()) { struct tree_decl_non_common common; + struct function *f; + /* In a FUNCTION_DECL for which DECL_BUILT_IN holds, this is - DECL_FUNCTION_CODE. Otherwise unused. */ - enum built_in_function function_code; + DECL_FUNCTION_CODE. Otherwise unused. + ??? The bitfield needs to be able to hold all target function + codes as well. */ + ENUM_BITFIELD(built_in_function) function_code : 11; + ENUM_BITFIELD(built_in_class) built_in_class : 2; unsigned static_ctor_flag : 1; unsigned static_dtor_flag : 1; unsigned uninlinable : 1; + unsigned possibly_inlined : 1; unsigned novops_flag : 1; unsigned returns_twice_flag : 1; unsigned malloc_flag : 1; unsigned pure_flag : 1; - unsigned declared_inline_flag : 1; unsigned regdecl_flag : 1; unsigned inline_flag : 1; + unsigned no_instrument_function_entry_exit : 1; unsigned no_limit_stack : 1; - ENUM_BITFIELD(built_in_class) built_in_class : 2; + unsigned disregard_inline_limits : 1; - struct function *f; + /* 5 bits left */ }; /* For a TYPE_DECL, holds the "original" type. (TREE_TYPE has the copy.) */ @@ -4005,8 +4027,8 @@ extern bool range_in_array_bounds_p (tree); extern tree value_member (tree, tree); extern tree purpose_member (const_tree, tree); -extern int attribute_list_equal (tree, tree); -extern int attribute_list_contained (tree, tree); +extern int attribute_list_equal (const_tree, const_tree); +extern int attribute_list_contained (const_tree, const_tree); extern int tree_int_cst_equal (const_tree, const_tree); extern int tree_int_cst_lt (const_tree, const_tree); extern int tree_int_cst_compare (const_tree, const_tree); @@ -4298,9 +4320,9 @@ extern unsigned int expr_align (const_tree); extern tree expr_first (tree); extern tree expr_last (tree); extern tree expr_only (tree); -extern tree size_in_bytes (tree); +extern tree size_in_bytes (const_tree); extern HOST_WIDE_INT int_size_in_bytes (const_tree); -extern HOST_WIDE_INT max_int_size_in_bytes (tree); +extern HOST_WIDE_INT max_int_size_in_bytes (const_tree); extern tree bit_position (const_tree); extern HOST_WIDE_INT int_bit_position (const_tree); extern tree byte_position (const_tree); @@ -4598,6 +4620,65 @@ extern GTY(()) tree current_function_decl; /* Nonzero means a FUNC_BEGIN label was emitted. */ extern GTY(()) const char * current_function_func_begin_label; +/* Iterator for going through the function arguments. */ +typedef struct { + tree fntype; /* function type declaration */ + tree next; /* TREE_LIST pointing to the next argument */ +} function_args_iterator; + +/* Initialize the iterator I with arguments from function FNDECL */ + +static inline void +function_args_iter_init (function_args_iterator *i, tree fntype) +{ + i->fntype = fntype; + i->next = TYPE_ARG_TYPES (fntype); +} + +/* Return a pointer that holds the next argument if there are more arguments to + handle, otherwise return NULL. */ + +static inline tree * +function_args_iter_cond_ptr (function_args_iterator *i) +{ + return (i->next) ? &TREE_VALUE (i->next) : NULL; +} + +/* Return the next argument if there are more arguments to handle, otherwise + return NULL. */ + +static inline tree +function_args_iter_cond (function_args_iterator *i) +{ + return (i->next) ? TREE_VALUE (i->next) : NULL_TREE; +} + +/* Advance to the next argument. */ +static inline void +function_args_iter_next (function_args_iterator *i) +{ + gcc_assert (i->next != NULL_TREE); + i->next = TREE_CHAIN (i->next); +} + +/* Loop over all function arguments of FNTYPE. In each iteration, PTR is set + to point to the next tree element. ITER is an instance of + function_args_iterator used to iterate the arguments. */ +#define FOREACH_FUNCTION_ARGS_PTR(FNTYPE, PTR, ITER) \ + for (function_args_iter_init (&(ITER), (FNTYPE)); \ + (PTR = function_args_iter_cond_ptr (&(ITER))) != NULL; \ + function_args_iter_next (&(ITER))) + +/* Loop over all function arguments of FNTYPE. In each iteration, TREE is set + to the next tree element. ITER is an instance of function_args_iterator + used to iterate the arguments. */ +#define FOREACH_FUNCTION_ARGS(FNTYPE, TREE, ITER) \ + for (function_args_iter_init (&(ITER), (FNTYPE)); \ + (TREE = function_args_iter_cond (&(ITER))) != NULL_TREE; \ + function_args_iter_next (&(ITER))) + + + /* In tree.c */ extern unsigned crc32_string (unsigned, const char *); extern void clean_symbol_name (char *); @@ -4614,6 +4695,10 @@ extern bool empty_body_p (tree); extern tree call_expr_arg (tree, int); extern tree *call_expr_argp (tree, int); extern tree call_expr_arglist (tree); +extern bool stdarg_p (tree); +extern bool prototype_p (tree); +extern int function_args_count (tree); +extern bool auto_var_in_fn_p (const_tree, const_tree); /* In stmt.c */ @@ -4668,7 +4753,7 @@ extern tree fold_ignored_result (tree); extern tree fold_abs_const (tree, tree); extern tree fold_indirect_ref_1 (tree, tree); extern void fold_defer_overflow_warnings (void); -extern void fold_undefer_overflow_warnings (bool, tree, int); +extern void fold_undefer_overflow_warnings (bool, const_tree, int); extern void fold_undefer_and_ignore_overflow_warnings (void); extern bool fold_deferring_overflow_warnings_p (void); extern tree maybe_fold_offset_to_reference (tree, tree, tree); @@ -4718,7 +4803,7 @@ enum operand_equal_flag }; extern int operand_equal_p (const_tree, const_tree, unsigned int); -extern int multiple_of_p (tree, tree, tree); +extern int multiple_of_p (tree, const_tree, const_tree); extern tree omit_one_operand (tree, tree, tree); extern tree omit_two_operands (tree, tree, tree, tree); extern tree invert_truthvalue (tree); @@ -4745,7 +4830,6 @@ extern enum tree_code invert_tree_comparison (enum tree_code, bool); extern bool tree_expr_nonzero_p (tree); extern bool tree_expr_nonzero_warnv_p (tree, bool *); -extern int multiple_of_p (tree, tree, tree); /* In builtins.c */ extern tree fold_call_expr (tree, bool); @@ -4761,9 +4845,8 @@ extern tree fold_builtin_snprintf_chk (tree, tree, enum built_in_function); extern bool fold_builtin_next_arg (tree, bool); extern enum built_in_function builtin_mathfn_code (const_tree); extern tree build_function_call_expr (tree, tree); -extern tree fold_build_call_expr (tree, tree, tree, tree); extern tree fold_builtin_call_array (tree, tree, int, tree *); -extern void debug_fold_checksum (tree); +extern void debug_fold_checksum (const_tree); extern tree build_call_expr (tree, int, ...); extern tree mathfn_built_in (tree, enum built_in_function fn); extern tree strip_float_extensions (tree); @@ -4780,15 +4863,15 @@ extern tree strip_float_extensions (tree); /* In alias.c */ extern void record_component_aliases (tree); -extern HOST_WIDE_INT get_alias_set (tree); -extern int alias_sets_conflict_p (HOST_WIDE_INT, HOST_WIDE_INT); -extern int alias_sets_must_conflict_p (HOST_WIDE_INT, HOST_WIDE_INT); +extern alias_set_type get_alias_set (tree); +extern int alias_sets_conflict_p (alias_set_type, alias_set_type); +extern int alias_sets_must_conflict_p (alias_set_type, alias_set_type); extern int objects_must_conflict_p (tree, tree); /* In tree.c */ extern int really_constant_p (const_tree); extern int int_fits_type_p (const_tree, const_tree); -extern void get_type_static_bounds (tree, mpz_t, mpz_t); +extern void get_type_static_bounds (const_tree, mpz_t, mpz_t); extern bool variably_modified_type_p (tree, tree); extern int tree_log2 (const_tree); extern int tree_floor_log2 (const_tree); @@ -4806,7 +4889,7 @@ extern void expand_function_start (tree); extern void stack_protect_prologue (void); extern void stack_protect_epilogue (void); extern void recompute_tree_invariant_for_addr_expr (tree); -extern bool needs_to_live_in_memory (tree); +extern bool needs_to_live_in_memory (const_tree); extern tree reconstruct_complex_type (tree, tree); extern int real_onep (const_tree); @@ -4827,25 +4910,21 @@ extern tree find_compatible_field (tree, tree); extern location_t expr_location (const_tree); extern void set_expr_location (tree, location_t); extern bool expr_has_location (const_tree); -extern -#ifdef USE_MAPPED_LOCATION -source_location * -#else -source_locus -#endif -expr_locus (const_tree); -extern void set_expr_locus (tree, + #ifdef USE_MAPPED_LOCATION - source_location *loc +extern source_locus *expr_locus (const_tree); +extern void set_expr_locus (tree, source_location *); #else - source_locus loc +extern source_locus expr_locus (const_tree); +extern void set_expr_locus (tree, source_locus loc); #endif - ); -extern const char **expr_filename (const_tree); -extern int *expr_lineno (const_tree); +extern const char *expr_filename (const_tree); +extern int expr_lineno (const_tree); + extern tree *tree_block (tree); extern tree *generic_tree_operand (tree, int); extern tree *generic_tree_type (tree); +extern location_t *block_nonartificial_location (tree); /* In function.c */ extern void expand_main_function (void); @@ -4853,6 +4932,7 @@ extern void init_dummy_function_start (void); extern void expand_dummy_function_end (void); extern unsigned int init_function_for_compilation (void); extern void allocate_struct_function (tree); +extern void push_struct_function (tree fndecl); extern void init_function_start (tree); extern bool use_register_for_decl (const_tree); extern void generate_setjmp_warnings (void); @@ -4861,7 +4941,7 @@ extern void free_temp_slots (void); extern void pop_temp_slots (void); extern void push_temp_slots (void); extern void preserve_temp_slots (rtx); -extern int aggregate_value_p (tree, tree); +extern int aggregate_value_p (const_tree, const_tree); extern void push_function_context (void); extern void pop_function_context (void); extern void push_function_context_to (tree); @@ -4924,11 +5004,13 @@ extern int call_expr_flags (const_tree); extern int setjmp_call_p (const_tree); extern bool alloca_call_p (const_tree); -extern bool must_pass_in_stack_var_size (enum machine_mode, tree); -extern bool must_pass_in_stack_var_size_or_pad (enum machine_mode, tree); +extern bool must_pass_in_stack_var_size (enum machine_mode, const_tree); +extern bool must_pass_in_stack_var_size_or_pad (enum machine_mode, const_tree); /* In attribs.c. */ +extern const struct attribute_spec *lookup_attribute_spec (tree); + /* Process the attributes listed in ATTRIBUTES and install them in *NODE, which is either a DECL (including a TYPE_DECL) or a TYPE. If a DECL, it should be modified in place; if a TYPE, a copy should be created @@ -5030,8 +5112,20 @@ struct pointer_set_t; /* The type of a callback function for walking over tree structure. */ typedef tree (*walk_tree_fn) (tree *, int *, void *); -extern tree walk_tree (tree*, walk_tree_fn, void*, struct pointer_set_t*); -extern tree walk_tree_without_duplicates (tree*, walk_tree_fn, void*); + +/* The type of a callback function that represents a custom walk_tree. */ + +typedef tree (*walk_tree_lh) (tree *, int *, tree (*) (tree *, int *, void *), + void *, struct pointer_set_t*); + +extern tree walk_tree_1 (tree*, walk_tree_fn, void*, struct pointer_set_t*, + walk_tree_lh); +extern tree walk_tree_without_duplicates_1 (tree*, walk_tree_fn, void*, + walk_tree_lh); +#define walk_tree(a,b,c,d) \ + walk_tree_1 (a, b, c, d, NULL) +#define walk_tree_without_duplicates(a,b,c) \ + walk_tree_without_duplicates_1 (a, b, c, NULL) /* Assign the RTX to declaration. */ @@ -5133,8 +5227,8 @@ extern tree tree_mem_ref_addr (tree, tree); extern void copy_mem_ref_info (tree, tree); /* In tree-vrp.c */ -extern bool ssa_name_nonzero_p (tree); -extern bool ssa_name_nonnegative_p (tree); +extern bool ssa_name_nonzero_p (const_tree); +extern bool ssa_name_nonnegative_p (const_tree); /* In tree-object-size.c. */ extern void init_object_sizes (void);