X-Git-Url: http://git.sourceforge.jp/view?a=blobdiff_plain;f=gcc%2Ftree.h;h=36deb0d51e58a0cc84fad8dc7baf7b5f65df7f3a;hb=f96d34f19f87467b4ca672d423857405c2913bc6;hp=775d28162d95f17866587f2ae8470dfc20a3f471;hpb=5afe38fe4c359548ac69898c28c2511a6f341d96;p=pf3gnuchains%2Fgcc-fork.git diff --git a/gcc/tree.h b/gcc/tree.h index 775d28162d9..36deb0d51e5 100644 --- a/gcc/tree.h +++ b/gcc/tree.h @@ -1,6 +1,6 @@ /* Front-end tree definitions for GNU compiler. Copyright (C) 1989, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, - 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 + 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc. This file is part of GCC. @@ -105,14 +105,6 @@ extern const enum tree_code_class tree_code_type[]; #define DECL_P(CODE)\ (TREE_CODE_CLASS (TREE_CODE (CODE)) == tcc_declaration) -/* Nonzero if CODE represents a memory tag. */ - -#define MTAG_P(CODE) \ - (TREE_CODE (CODE) == NAME_MEMORY_TAG \ - || TREE_CODE (CODE) == SYMBOL_MEMORY_TAG \ - || TREE_CODE (CODE) == MEMORY_PARTITION_TAG) - - /* Nonzero if DECL represents a VAR_DECL or FUNCTION_DECL. */ #define VAR_OR_FUNCTION_DECL_P(DECL)\ @@ -191,6 +183,22 @@ DEF_VEC_P(tree); DEF_VEC_ALLOC_P(tree,gc); DEF_VEC_ALLOC_P(tree,heap); +/* We have to be able to tell cgraph about the needed-ness of the target + of an alias. This requires that the decl have been defined. Aliases + that precede their definition have to be queued for later processing. */ + +typedef struct GTY(()) alias_pair +{ + tree decl; + tree target; +} alias_pair; + +/* Define gc'd vector type. */ +DEF_VEC_O(alias_pair); +DEF_VEC_ALLOC_O(alias_pair,gc); + +extern GTY(()) VEC(alias_pair,gc) * alias_pairs; + /* Classify which part of the compiler has defined a given builtin function. Note that we assume below that this is no more than two bits. */ @@ -350,8 +358,7 @@ enum omp_clause_code fields. */ union tree_ann_d; -struct tree_base GTY(()) -{ +struct GTY(()) tree_base { ENUM_BITFIELD(tree_code) code : 16; unsigned side_effects_flag : 1; @@ -371,8 +378,8 @@ struct tree_base GTY(()) unsigned protected_flag : 1; unsigned deprecated_flag : 1; unsigned saturating_flag : 1; - unsigned default_def_flag : 1; + unsigned default_def_flag : 1; unsigned lang_flag_0 : 1; unsigned lang_flag_1 : 1; unsigned lang_flag_2 : 1; @@ -380,15 +387,22 @@ struct tree_base GTY(()) unsigned lang_flag_4 : 1; unsigned lang_flag_5 : 1; unsigned lang_flag_6 : 1; + unsigned visited : 1; + unsigned packed_flag : 1; + unsigned user_align : 1; + + unsigned spare : 13; - unsigned spare : 23; + /* This field is only used with type nodes; the only reason it is present + in tree_base instead of tree_type is to save space. The size of the + field must be large enough to hold addr_space_t values. */ + unsigned address_space : 8; union tree_ann_d *ann; }; -struct tree_common GTY(()) -{ +struct GTY(()) tree_common { struct tree_base base; tree chain; tree type; @@ -435,9 +449,6 @@ struct tree_common GTY(()) ASM_INPUT_P in ASM_EXPR - EH_FILTER_MUST_NOT_THROW in - EH_FILTER_EXPR - TYPE_REF_CAN_ALIAS_ALL in POINTER_TYPE, REFERENCE_TYPE @@ -485,9 +496,6 @@ struct tree_common GTY(()) CALL_EXPR_RETURN_SLOT_OPT in CALL_EXPR - DECL_BY_REFERENCE in - PARM_DECL, RESULT_DECL - OMP_SECTION_LAST in OMP_SECTION @@ -587,6 +595,7 @@ struct tree_common GTY(()) TREE_DEPRECATED in all decls + all types IDENTIFIER_TRANSPARENT_ALIAS in IDENTIFIER_NODE @@ -612,6 +621,9 @@ struct tree_common GTY(()) default_def_flag: + TYPE_VECTOR_OPAQUE in + VECTOR_TYPE + SSA_NAME_IS_DEFAULT_DEF in SSA_NAME */ @@ -933,7 +945,6 @@ extern void omp_clause_range_check_failed (const_tree, const char *, int, #define TYPE_CHECK(T) TREE_CLASS_CHECK (T, tcc_type) #define DECL_MINIMAL_CHECK(T) CONTAINS_STRUCT_CHECK (T, TS_DECL_MINIMAL) -#define TREE_MEMORY_TAG_CHECK(T) CONTAINS_STRUCT_CHECK (T, TS_MEMORY_TAG) #define DECL_COMMON_CHECK(T) CONTAINS_STRUCT_CHECK (T, TS_DECL_COMMON) #define DECL_WRTL_CHECK(T) CONTAINS_STRUCT_CHECK (T, TS_DECL_WRTL) #define DECL_WITH_VIS_CHECK(T) CONTAINS_STRUCT_CHECK (T, TS_DECL_WITH_VIS) @@ -974,30 +985,17 @@ extern void omp_clause_range_check_failed (const_tree, const char *, int, case NOP_EXPR: \ case CONVERT_EXPR -/* Given an expression as a tree, strip any NON_LVALUE_EXPRs and NOP_EXPRs - that don't change the machine mode. */ +/* Given an expression as a tree, strip any conversion that generates + no instruction. Accepts both tree and const_tree arguments since + we are not modifying the tree itself. */ -#define STRIP_NOPS(EXP) \ - while ((CONVERT_EXPR_P (EXP) \ - || TREE_CODE (EXP) == NON_LVALUE_EXPR) \ - && TREE_OPERAND (EXP, 0) != error_mark_node \ - && (TYPE_MODE (TREE_TYPE (EXP)) \ - == TYPE_MODE (TREE_TYPE (TREE_OPERAND (EXP, 0))))) \ - (EXP) = TREE_OPERAND (EXP, 0) +#define STRIP_NOPS(EXP) \ + (EXP) = tree_strip_nop_conversions (CONST_CAST_TREE (EXP)) /* Like STRIP_NOPS, but don't let the signedness change either. */ #define STRIP_SIGN_NOPS(EXP) \ - while ((CONVERT_EXPR_P (EXP) \ - || TREE_CODE (EXP) == NON_LVALUE_EXPR) \ - && TREE_OPERAND (EXP, 0) != error_mark_node \ - && (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)))) \ - && (POINTER_TYPE_P (TREE_TYPE (EXP)) \ - == POINTER_TYPE_P (TREE_TYPE (TREE_OPERAND (EXP, 0))))) \ - (EXP) = TREE_OPERAND (EXP, 0) + (EXP) = tree_strip_sign_nop_conversions (CONST_CAST_TREE (EXP)) /* Like STRIP_NOPS, but don't alter the TREE_TYPE either. */ @@ -1012,9 +1010,8 @@ extern void omp_clause_range_check_failed (const_tree, const char *, int, /* Remove unnecessary type conversions according to tree_ssa_useless_type_conversion. */ -#define STRIP_USELESS_TYPE_CONVERSION(EXP) \ - while (tree_ssa_useless_type_conversion (EXP)) \ - EXP = TREE_OPERAND (EXP, 0) +#define STRIP_USELESS_TYPE_CONVERSION(EXP) \ + (EXP) = tree_ssa_strip_useless_type_conversions (EXP) /* Nonzero if TYPE represents an integral type. Note that we do not include COMPLEX types here. Keep these checks in ascending code @@ -1070,12 +1067,17 @@ extern void omp_clause_range_check_failed (const_tree, const char *, int, (SCALAR_FLOAT_TYPE_P (TYPE) \ && DECIMAL_FLOAT_MODE_P (TYPE_MODE (TYPE))) +/* Nonzero if TYPE is a record or union type. */ +#define RECORD_OR_UNION_TYPE_P(TYPE) \ + (TREE_CODE (TYPE) == RECORD_TYPE \ + || TREE_CODE (TYPE) == UNION_TYPE \ + || TREE_CODE (TYPE) == QUAL_UNION_TYPE) + /* Nonzero if TYPE represents an aggregate (multi-component) type. Keep these checks in ascending code order. */ #define AGGREGATE_TYPE_P(TYPE) \ - (TREE_CODE (TYPE) == ARRAY_TYPE || TREE_CODE (TYPE) == RECORD_TYPE \ - || TREE_CODE (TYPE) == UNION_TYPE || TREE_CODE (TYPE) == QUAL_UNION_TYPE) + (TREE_CODE (TYPE) == ARRAY_TYPE || RECORD_OR_UNION_TYPE_P (TYPE)) /* Nonzero if TYPE represents a pointer or reference type. (It should be renamed to INDIRECT_TYPE_P.) Keep these checks in @@ -1130,7 +1132,9 @@ extern void omp_clause_range_check_failed (const_tree, const char *, int, (CASE_LABEL_EXPR_CHECK (NODE)->base.addressable_flag) #define PREDICT_EXPR_OUTCOME(NODE) \ - (PREDICT_EXPR_CHECK(NODE)->base.addressable_flag) + ((enum prediction) (PREDICT_EXPR_CHECK(NODE)->base.addressable_flag)) +#define SET_PREDICT_EXPR_OUTCOME(NODE, OUTCOME) \ + (PREDICT_EXPR_CHECK(NODE)->base.addressable_flag = (int) OUTCOME) #define PREDICT_EXPR_PREDICTOR(NODE) \ ((enum br_predictor)tree_low_cst (TREE_OPERAND (PREDICT_EXPR_CHECK (NODE), 0), 0)) @@ -1186,18 +1190,15 @@ extern void omp_clause_range_check_failed (const_tree, const char *, int, #define TREE_OVERFLOW(NODE) (CST_CHECK (NODE)->base.public_flag) -/* ??? This is an obsolete synonym for TREE_OVERFLOW. */ -#define TREE_CONSTANT_OVERFLOW(NODE) TREE_OVERFLOW(NODE) - /* TREE_OVERFLOW can only be true for EXPR of CONSTANT_CLASS_P. */ #define TREE_OVERFLOW_P(EXPR) \ (CONSTANT_CLASS_P (EXPR) && TREE_OVERFLOW (EXPR)) /* In a VAR_DECL, FUNCTION_DECL, NAMESPACE_DECL or TYPE_DECL, - nonzero means name is to be accessible from outside this module. + nonzero means name is to be accessible from outside this translation unit. In an IDENTIFIER_NODE, nonzero means an external declaration - accessible from outside this module was previously seen + accessible from outside this translation unit was previously seen for this name in an inner scope. */ #define TREE_PUBLIC(NODE) ((NODE)->base.public_flag) @@ -1281,7 +1282,7 @@ extern void omp_clause_range_check_failed (const_tree, const char *, int, This is interesting in an inline function, since it might not need to be compiled separately. Nonzero in a RECORD_TYPE, UNION_TYPE, QUAL_UNION_TYPE or ENUMERAL_TYPE - if the sdb debugging info for the type has been written. + if the debugging info for the type has been written. In a BLOCK node, nonzero if reorder_blocks has already seen this block. In an SSA_NAME node, nonzero if the SSA_NAME occurs in an abnormal PHI node. */ @@ -1303,9 +1304,21 @@ extern void omp_clause_range_check_failed (const_tree, const char *, int, #define CALL_EXPR_RETURN_SLOT_OPT(NODE) \ (CALL_EXPR_CHECK (NODE)->base.private_flag) -/* In a RESULT_DECL or PARM_DECL, means that it is passed by invisible - reference (and the TREE_TYPE is a pointer to the true type). */ -#define DECL_BY_REFERENCE(NODE) (DECL_COMMON_CHECK (NODE)->base.private_flag) +/* In a RESULT_DECL, PARM_DECL and VAR_DECL, means that it is + passed by invisible reference (and the TREE_TYPE is a pointer to the true + type). */ +#define DECL_BY_REFERENCE(NODE) \ + (TREE_CHECK3 (NODE, VAR_DECL, PARM_DECL, \ + RESULT_DECL)->decl_common.decl_by_reference_flag) + +/* In a RESULT_DECL, PARM_DECL and VAR_DECL, means that this decl + can be used as restricted tag to disambiguate against other restrict + pointers. Used by fortran to capture something like non-addressability + (which it isn't really because the middle-end does take addresses of + such variables). */ +#define DECL_RESTRICTED_P(NODE) \ + (TREE_CHECK3 (NODE, VAR_DECL, PARM_DECL, \ + RESULT_DECL)->decl_common.decl_restricted_flag) /* In a CALL_EXPR, means that the call is the jump from a thunk to the thunked-to function. */ @@ -1324,8 +1337,7 @@ extern void omp_clause_range_check_failed (const_tree, const char *, int, /* Used in classes in C++. */ #define TREE_PRIVATE(NODE) ((NODE)->base.private_flag) -/* Used in classes in C++. - In a BLOCK node, this is BLOCK_HANDLER_BLOCK. */ +/* Used in classes in C++. */ #define TREE_PROTECTED(NODE) ((NODE)->base.protected_flag) /* Nonzero in a _DECL if the use of the name is defined as a @@ -1372,8 +1384,7 @@ extern void omp_clause_range_check_failed (const_tree, const char *, int, == (unsigned HOST_WIDE_INT) TREE_INT_CST_HIGH (B)) \ && TREE_INT_CST_LOW (A) < TREE_INT_CST_LOW (B))) -struct tree_int_cst GTY(()) -{ +struct GTY(()) tree_int_cst { struct tree_common common; double_int int_cst; }; @@ -1386,8 +1397,7 @@ struct real_value; #define TREE_REAL_CST_PTR(NODE) (REAL_CST_CHECK (NODE)->real_cst.real_cst_ptr) #define TREE_REAL_CST(NODE) (*TREE_REAL_CST_PTR (NODE)) -struct tree_real_cst GTY(()) -{ +struct GTY(()) tree_real_cst { struct tree_common common; struct real_value * real_cst_ptr; }; @@ -1398,8 +1408,7 @@ struct fixed_value; #define TREE_FIXED_CST_PTR(NODE) (FIXED_CST_CHECK (NODE)->fixed_cst.fixed_cst_ptr) #define TREE_FIXED_CST(NODE) (*TREE_FIXED_CST_PTR (NODE)) -struct tree_fixed_cst GTY(()) -{ +struct GTY(()) tree_fixed_cst { struct tree_common common; struct fixed_value * fixed_cst_ptr; }; @@ -1409,8 +1418,7 @@ struct tree_fixed_cst GTY(()) #define TREE_STRING_POINTER(NODE) \ ((const char *)(STRING_CST_CHECK (NODE)->string.str)) -struct tree_string GTY(()) -{ +struct GTY(()) tree_string { struct tree_common common; int length; char str[1]; @@ -1420,8 +1428,7 @@ struct tree_string GTY(()) #define TREE_REALPART(NODE) (COMPLEX_CST_CHECK (NODE)->complex.real) #define TREE_IMAGPART(NODE) (COMPLEX_CST_CHECK (NODE)->complex.imag) -struct tree_complex GTY(()) -{ +struct GTY(()) tree_complex { struct tree_common common; tree real; tree imag; @@ -1430,8 +1437,7 @@ struct tree_complex GTY(()) /* In a VECTOR_CST node. */ #define TREE_VECTOR_CST_ELTS(NODE) (VECTOR_CST_CHECK (NODE)->vector.elements) -struct tree_vector GTY(()) -{ +struct GTY(()) tree_vector { struct tree_common common; tree elements; }; @@ -1454,8 +1460,7 @@ struct tree_vector GTY(()) ((tree) ((char *) (NODE) - sizeof (struct tree_common))) #define GCC_IDENT_TO_HT_IDENT(NODE) (&((struct tree_identifier *) (NODE))->id) -struct tree_identifier GTY(()) -{ +struct GTY(()) tree_identifier { struct tree_common common; struct ht_identifier id; }; @@ -1464,8 +1469,7 @@ struct tree_identifier GTY(()) #define TREE_PURPOSE(NODE) (TREE_LIST_CHECK (NODE)->list.purpose) #define TREE_VALUE(NODE) (TREE_LIST_CHECK (NODE)->list.value) -struct tree_list GTY(()) -{ +struct GTY(()) tree_list { struct tree_common common; tree purpose; tree value; @@ -1478,8 +1482,7 @@ struct tree_list GTY(()) #define TREE_VEC_ELT(NODE,I) TREE_VEC_ELT_CHECK (NODE, I) -struct tree_vec GTY(()) -{ +struct GTY(()) tree_vec { struct tree_common common; int length; tree GTY ((length ("TREE_VEC_LENGTH ((tree)&%h)"))) a[1]; @@ -1520,12 +1523,16 @@ struct tree_vec GTY(()) _ce___->value = VALUE; \ } while (0) +/* True if NODE, a FIELD_DECL, is to be processed as a bitfield for + constructor output purposes. */ +#define CONSTRUCTOR_BITFIELD_P(NODE) \ + (DECL_BIT_FIELD (FIELD_DECL_CHECK (NODE)) && DECL_MODE (NODE) != BLKmode) + /* A single element of a CONSTRUCTOR. VALUE holds the actual value of the element. INDEX can optionally design the position of VALUE: in arrays, it is the index where VALUE has to be placed; in structures, it is the FIELD_DECL of the member. */ -typedef struct constructor_elt_d GTY(()) -{ +typedef struct GTY(()) constructor_elt_d { tree index; tree value; } constructor_elt; @@ -1533,8 +1540,7 @@ typedef struct constructor_elt_d GTY(()) DEF_VEC_O(constructor_elt); DEF_VEC_ALLOC_O(constructor_elt,gc); -struct tree_constructor GTY(()) -{ +struct GTY(()) tree_constructor { struct tree_common common; VEC(constructor_elt,gc) *elts; }; @@ -1558,6 +1564,9 @@ struct tree_constructor GTY(()) #define VL_EXP_OPERAND_LENGTH(NODE) \ ((int)TREE_INT_CST_LOW (VL_EXP_CHECK (NODE)->exp.operands[0])) +/* Nonzero if is_gimple_debug() may possibly hold. */ +#define MAY_HAVE_DEBUG_STMTS (flag_var_tracking_assignments) + /* In a LOOP_EXPR node. */ #define LOOP_EXPR_BODY(NODE) TREE_OPERAND_CHECK_CODE (NODE, LOOP_EXPR, 0) @@ -1567,16 +1576,14 @@ struct tree_constructor GTY(()) #define EXPR_LOCATION(NODE) (EXPR_P ((NODE)) ? (NODE)->exp.locus : UNKNOWN_LOCATION) #define SET_EXPR_LOCATION(NODE, LOCUS) EXPR_CHECK ((NODE))->exp.locus = (LOCUS) #define EXPR_HAS_LOCATION(NODE) (EXPR_LOCATION (NODE) != UNKNOWN_LOCATION) -#define EXPR_LOCUS(NODE) (EXPR_P (NODE) \ - ? CONST_CAST (source_location *, &(NODE)->exp.locus) \ - : (source_location *) NULL) -#define SET_EXPR_LOCUS(NODE, FROM) set_expr_locus ((NODE), (FROM)) #define EXPR_FILENAME(NODE) LOCATION_FILE (EXPR_CHECK ((NODE))->exp.locus) #define EXPR_LINENO(NODE) LOCATION_LINE (EXPR_CHECK (NODE)->exp.locus) /* True if a tree is an expression or statement that can have a location. */ -#define CAN_HAVE_LOCATION_P(NODE) (EXPR_P (NODE)) +#define CAN_HAVE_LOCATION_P(NODE) ((NODE) && EXPR_P (NODE)) + +extern void protected_set_expr_location (tree, location_t); /* In a TARGET_EXPR node. */ #define TARGET_EXPR_SLOT(NODE) TREE_OPERAND_CHECK_CODE (NODE, TARGET_EXPR, 0) @@ -1589,6 +1596,12 @@ struct tree_constructor GTY(()) #define EXIT_EXPR_COND(NODE) TREE_OPERAND (EXIT_EXPR_CHECK (NODE), 0) +/* COMPOUND_LITERAL_EXPR accessors. */ +#define COMPOUND_LITERAL_EXPR_DECL_EXPR(NODE) \ + TREE_OPERAND (COMPOUND_LITERAL_EXPR_CHECK (NODE), 0) +#define COMPOUND_LITERAL_EXPR_DECL(NODE) \ + DECL_EXPR_DECL (COMPOUND_LITERAL_EXPR_DECL_EXPR (NODE)) + /* SWITCH_EXPR accessors. These give access to the condition, body and original condition type (before any compiler conversions) of the switch statement, respectively. */ @@ -1609,7 +1622,6 @@ struct tree_constructor GTY(()) #define TMR_STEP(NODE) (TREE_OPERAND (TARGET_MEM_REF_CHECK (NODE), 3)) #define TMR_OFFSET(NODE) (TREE_OPERAND (TARGET_MEM_REF_CHECK (NODE), 4)) #define TMR_ORIGINAL(NODE) (TREE_OPERAND (TARGET_MEM_REF_CHECK (NODE), 5)) -#define TMR_TAG(NODE) (TREE_OPERAND (TARGET_MEM_REF_CHECK (NODE), 6)) /* The operands of a BIND_EXPR. */ #define BIND_EXPR_VARS(NODE) (TREE_OPERAND (BIND_EXPR_CHECK (NODE), 0)) @@ -1628,6 +1640,7 @@ struct tree_constructor GTY(()) #define ASM_OUTPUTS(NODE) TREE_OPERAND (ASM_EXPR_CHECK (NODE), 1) #define ASM_INPUTS(NODE) TREE_OPERAND (ASM_EXPR_CHECK (NODE), 2) #define ASM_CLOBBERS(NODE) TREE_OPERAND (ASM_EXPR_CHECK (NODE), 3) +#define ASM_LABELS(NODE) TREE_OPERAND (ASM_EXPR_CHECK (NODE), 4) /* Nonzero if we want to create an ASM_INPUT instead of an ASM_OPERAND with no operands. */ #define ASM_INPUT_P(NODE) (ASM_EXPR_CHECK (NODE)->base.static_flag) @@ -1658,14 +1671,6 @@ struct tree_constructor GTY(()) /* EH_FILTER_EXPR accessors. */ #define EH_FILTER_TYPES(NODE) TREE_OPERAND (EH_FILTER_EXPR_CHECK (NODE), 0) #define EH_FILTER_FAILURE(NODE) TREE_OPERAND (EH_FILTER_EXPR_CHECK (NODE), 1) -#define EH_FILTER_MUST_NOT_THROW(NODE) \ - (EH_FILTER_EXPR_CHECK (NODE)->base.static_flag) - -/* CHANGE_DYNAMIC_TYPE_EXPR accessors. */ -#define CHANGE_DYNAMIC_TYPE_NEW_TYPE(NODE) \ - TREE_OPERAND (CHANGE_DYNAMIC_TYPE_EXPR_CHECK (NODE), 0) -#define CHANGE_DYNAMIC_TYPE_LOCATION(NODE) \ - TREE_OPERAND (CHANGE_DYNAMIC_TYPE_EXPR_CHECK (NODE), 1) /* OBJ_TYPE_REF accessors. */ #define OBJ_TYPE_REF_EXPR(NODE) TREE_OPERAND (OBJ_TYPE_REF_CHECK (NODE), 0) @@ -1737,6 +1742,9 @@ struct tree_constructor GTY(()) OMP_CLAUSE_OPERAND (OMP_CLAUSE_RANGE_CHECK (OMP_CLAUSE_CHECK (NODE), \ OMP_CLAUSE_PRIVATE, \ OMP_CLAUSE_COPYPRIVATE), 0) +#define OMP_CLAUSE_HAS_LOCATION(NODE) \ + ((OMP_CLAUSE_CHECK (NODE))->omp_clause.locus != UNKNOWN_LOCATION) +#define OMP_CLAUSE_LOCATION(NODE) (OMP_CLAUSE_CHECK (NODE))->omp_clause.locus /* True on an OMP_SECTION statement that was the last lexical member. This status is meaningful in the implementation of lastprivate. */ @@ -1821,8 +1829,7 @@ enum omp_clause_default_kind #define OMP_CLAUSE_DEFAULT_KIND(NODE) \ (OMP_CLAUSE_SUBCODE_CHECK (NODE, OMP_CLAUSE_DEFAULT)->omp_clause.subcode.default_kind) -struct tree_exp GTY(()) -{ +struct GTY(()) tree_exp { struct tree_common common; location_t locus; tree block; @@ -1868,10 +1875,6 @@ struct tree_exp GTY(()) #define SSA_NAME_PTR_INFO(N) \ SSA_NAME_CHECK (N)->ssa_name.ptr_info -/* Get the value of this SSA_NAME, if available. */ -#define SSA_NAME_VALUE(N) \ - SSA_NAME_CHECK (N)->ssa_name.value_handle - #ifndef _TREE_FLOW_H struct ptr_info_def; #endif @@ -1880,8 +1883,7 @@ struct ptr_info_def; /* Immediate use linking structure. This structure is used for maintaining a doubly linked list of uses of an SSA_NAME. */ -typedef struct ssa_use_operand_d GTY(()) -{ +typedef struct GTY(()) ssa_use_operand_d { struct ssa_use_operand_d* GTY((skip(""))) prev; struct ssa_use_operand_d* GTY((skip(""))) next; /* Immediate uses for a given SSA name are maintained as a cyclic @@ -1896,8 +1898,7 @@ typedef struct ssa_use_operand_d GTY(()) /* Return the immediate_use information for an SSA_NAME. */ #define SSA_NAME_IMM_USE_NODE(NODE) SSA_NAME_CHECK (NODE)->ssa_name.imm_uses -struct tree_ssa_name GTY(()) -{ +struct GTY(()) tree_ssa_name { struct tree_common common; /* _DECL wrapped by this SSA name. */ @@ -1912,23 +1913,16 @@ struct tree_ssa_name GTY(()) /* Pointer attributes used for alias analysis. */ struct ptr_info_def *ptr_info; - /* Value for SSA name used by various passes. - - Right now only invariants are allowed to persist beyond a pass in - this field; in the future we will allow VALUE_HANDLEs to persist - as well. */ - tree value_handle; - /* Immediate uses list for this SSA_NAME. */ struct ssa_use_operand_d imm_uses; }; -struct phi_arg_d GTY(()) -{ +struct GTY(()) phi_arg_d { /* imm_use MUST be the first element in struct because we do some pointer arithmetic with it. See phi_arg_index_from_use. */ struct ssa_use_operand_d imm_use; tree def; + location_t locus; }; @@ -1944,9 +1938,9 @@ struct phi_arg_d GTY(()) #define OMP_CLAUSE_OPERAND(NODE, I) \ OMP_CLAUSE_ELT_CHECK (NODE, I) -struct tree_omp_clause GTY(()) -{ +struct GTY(()) tree_omp_clause { struct tree_common common; + location_t locus; enum omp_clause_code code; union omp_clause_subcode { enum omp_clause_default_kind default_kind; @@ -1967,6 +1961,9 @@ struct varray_head_tag; /* In a BLOCK node. */ #define BLOCK_VARS(NODE) (BLOCK_CHECK (NODE)->block.vars) +#define BLOCK_NONLOCALIZED_VARS(NODE) (BLOCK_CHECK (NODE)->block.nonlocalized_vars) +#define BLOCK_NUM_NONLOCALIZED_VARS(NODE) VEC_length (tree, BLOCK_NONLOCALIZED_VARS (NODE)) +#define BLOCK_NONLOCALIZED_VAR(NODE,N) VEC_index (tree, BLOCK_NONLOCALIZED_VARS (NODE), N) #define BLOCK_SUBBLOCKS(NODE) (BLOCK_CHECK (NODE)->block.subblocks) #define BLOCK_SUPERCONTEXT(NODE) (BLOCK_CHECK (NODE)->block.supercontext) /* Note: when changing this, make sure to find the places @@ -1975,11 +1972,6 @@ struct varray_head_tag; #define BLOCK_ABSTRACT_ORIGIN(NODE) (BLOCK_CHECK (NODE)->block.abstract_origin) #define BLOCK_ABSTRACT(NODE) (BLOCK_CHECK (NODE)->block.abstract_flag) -/* Nonzero means that this block is prepared to handle exceptions - listed in the BLOCK_VARS slot. */ -#define BLOCK_HANDLER_BLOCK(NODE) \ - (BLOCK_CHECK (NODE)->block.handler_block_flag) - /* An index number for this block. These values are not guaranteed to be unique across functions -- whether or not they are depends on the debugging output format in use. */ @@ -2016,17 +2008,17 @@ struct varray_head_tag; #define BLOCK_SOURCE_LOCATION(NODE) (BLOCK_CHECK (NODE)->block.locus) -struct tree_block GTY(()) -{ +struct GTY(()) tree_block { struct tree_common common; - unsigned handler_block_flag : 1; unsigned abstract_flag : 1; - unsigned block_num : 30; + unsigned block_num : 31; location_t locus; tree vars; + VEC(tree,gc) *nonlocalized_vars; + tree subblocks; tree supercontext; tree abstract_origin; @@ -2048,7 +2040,6 @@ struct tree_block GTY(()) #define TYPE_UID(NODE) (TYPE_CHECK (NODE)->type.uid) #define TYPE_SIZE(NODE) (TYPE_CHECK (NODE)->type.size) #define TYPE_SIZE_UNIT(NODE) (TYPE_CHECK (NODE)->type.size_unit) -#define TYPE_MODE(NODE) (TYPE_CHECK (NODE)->type.mode) #define TYPE_VALUES(NODE) (ENUMERAL_TYPE_CHECK (NODE)->type.values) #define TYPE_DOMAIN(NODE) (ARRAY_TYPE_CHECK (NODE)->type.values) #define TYPE_FIELDS(NODE) (RECORD_OR_UNION_CHECK (NODE)->type.values) @@ -2075,6 +2066,16 @@ struct tree_block GTY(()) #define TYPE_NEXT_VARIANT(NODE) (TYPE_CHECK (NODE)->type.next_variant) #define TYPE_MAIN_VARIANT(NODE) (TYPE_CHECK (NODE)->type.main_variant) #define TYPE_CONTEXT(NODE) (TYPE_CHECK (NODE)->type.context) +#define TYPE_MAXVAL(NODE) (TYPE_CHECK (NODE)->type.maxval) +#define TYPE_MINVAL(NODE) (TYPE_CHECK (NODE)->type.minval) + +/* Vector types need to check target flags to determine type. */ +extern enum machine_mode vector_type_mode (const_tree); +#define TYPE_MODE(NODE) \ + (TREE_CODE (TYPE_CHECK (NODE)) == VECTOR_TYPE \ + ? vector_type_mode (NODE) : (NODE)->type.mode) +#define SET_TYPE_MODE(NODE, MODE) \ + (TYPE_CHECK (NODE)->type.mode = (MODE)) /* The "canonical" type for this type node, which can be used to compare the type for equality with another type. If two types are @@ -2133,7 +2134,7 @@ struct tree_block GTY(()) /* 1 if the alignment for this type was requested by "aligned" attribute, 0 if it is the default for this type. */ -#define TYPE_USER_ALIGN(NODE) (TYPE_CHECK (NODE)->type.user_align) +#define TYPE_USER_ALIGN(NODE) (TYPE_CHECK (NODE)->common.base.user_align) /* The alignment for NODE, in bytes. */ #define TYPE_ALIGN_UNIT(NODE) (TYPE_ALIGN (NODE) / BITS_PER_UNIT) @@ -2173,6 +2174,9 @@ struct tree_block GTY(()) the term. */ #define TYPE_RESTRICT(NODE) (TYPE_CHECK (NODE)->type.restrict_flag) +/* The address space the type is in. */ +#define TYPE_ADDR_SPACE(NODE) (TYPE_CHECK (NODE)->base.address_space) + /* There is a TYPE_QUAL value for each type qualifier. They can be combined by bitwise-or to form the complete set of qualifiers for a type. */ @@ -2182,10 +2186,29 @@ struct tree_block GTY(()) #define TYPE_QUAL_VOLATILE 0x2 #define TYPE_QUAL_RESTRICT 0x4 +/* Encode/decode the named memory support as part of the qualifier. If more + than 8 qualifiers are added, these macros need to be adjusted. */ +#define ENCODE_QUAL_ADDR_SPACE(NUM) ((NUM & 0xFF) << 8) +#define DECODE_QUAL_ADDR_SPACE(X) (((X) >> 8) & 0xFF) + +/* Return all qualifiers except for the address space qualifiers. */ +#define CLEAR_QUAL_ADDR_SPACE(X) ((X) & ~0xFF00) + +/* Only keep the address space out of the qualifiers and discard the other + qualifiers. */ +#define KEEP_QUAL_ADDR_SPACE(X) ((X) & 0xFF00) + /* The set of type qualifiers for this type. */ #define TYPE_QUALS(NODE) \ ((TYPE_READONLY (NODE) * TYPE_QUAL_CONST) \ | (TYPE_VOLATILE (NODE) * TYPE_QUAL_VOLATILE) \ + | (TYPE_RESTRICT (NODE) * TYPE_QUAL_RESTRICT) \ + | (ENCODE_QUAL_ADDR_SPACE (TYPE_ADDR_SPACE (NODE)))) + +/* The same as TYPE_QUALS without the address space qualifications. */ +#define TYPE_QUALS_NO_ADDR_SPACE(NODE) \ + ((TYPE_READONLY (NODE) * TYPE_QUAL_CONST) \ + | (TYPE_VOLATILE (NODE) * TYPE_QUAL_VOLATILE) \ | (TYPE_RESTRICT (NODE) * TYPE_QUAL_RESTRICT)) /* These flags are available for each language front end to use internally. */ @@ -2221,6 +2244,11 @@ struct tree_block GTY(()) #define SET_TYPE_VECTOR_SUBPARTS(VECTOR_TYPE, X) \ (VECTOR_TYPE_CHECK (VECTOR_TYPE)->type.precision = exact_log2 (X)) +/* Nonzero in a VECTOR_TYPE if the frontends should not emit warnings + about missing conversions to other vector types of the same size. */ +#define TYPE_VECTOR_OPAQUE(NODE) \ + (VECTOR_TYPE_CHECK (NODE)->base.default_def_flag) + /* Indicates that objects of this type must be initialized by calling a function when they are created. */ #define TYPE_NEEDS_CONSTRUCTING(NODE) \ @@ -2239,7 +2267,7 @@ struct tree_block GTY(()) /* Indicated that objects of this type should be laid out in as compact a way as possible. */ -#define TYPE_PACKED(NODE) (TYPE_CHECK (NODE)->type.packed_flag) +#define TYPE_PACKED(NODE) (TYPE_CHECK (NODE)->common.base.packed_flag) /* Used by type_contains_placeholder_p to avoid recomputation. Values are: 0 (unknown), 1 (false), 2 (true). Never access @@ -2249,8 +2277,7 @@ struct tree_block GTY(()) struct die_struct; -struct tree_type GTY(()) -{ +struct GTY(()) tree_type { struct tree_common common; tree values; tree size; @@ -2258,17 +2285,16 @@ struct tree_type GTY(()) tree attributes; unsigned int uid; - unsigned int precision : 9; - ENUM_BITFIELD(machine_mode) mode : 7; - - unsigned string_flag : 1; + unsigned int precision : 10; unsigned no_force_blk_flag : 1; unsigned needs_constructing_flag : 1; unsigned transparent_union_flag : 1; - unsigned packed_flag : 1; unsigned restrict_flag : 1; unsigned contains_placeholder_bits : 2; + ENUM_BITFIELD(machine_mode) mode : 8; + + unsigned string_flag : 1; unsigned lang_flag_0 : 1; unsigned lang_flag_1 : 1; unsigned lang_flag_2 : 1; @@ -2276,9 +2302,9 @@ struct tree_type GTY(()) unsigned lang_flag_4 : 1; unsigned lang_flag_5 : 1; unsigned lang_flag_6 : 1; - unsigned user_align : 1; unsigned int align; + alias_set_type alias_set; tree pointer_to; tree reference_to; union tree_type_symtab { @@ -2295,7 +2321,6 @@ struct tree_type GTY(()) tree binfo; tree context; tree canonical; - alias_set_type alias_set; /* Points to a structure whose details depend on the language in use. */ struct lang_type *lang_specific; }; @@ -2403,8 +2428,7 @@ struct tree_type GTY(()) #define BINFO_INHERITANCE_CHAIN(NODE) \ (TREE_BINFO_CHECK(NODE)->binfo.inheritance) -struct tree_binfo GTY (()) -{ +struct GTY (()) tree_binfo { struct tree_common common; tree offset; @@ -2428,12 +2452,10 @@ struct tree_binfo GTY (()) (TREE_CODE (DECL) == VAR_DECL \ || TREE_CODE (DECL) == PARM_DECL \ || TREE_CODE (DECL) == RESULT_DECL \ - || MTAG_P (DECL) \ || (TREE_CODE (DECL) == SSA_NAME \ && (TREE_CODE (SSA_NAME_VAR (DECL)) == VAR_DECL \ || TREE_CODE (SSA_NAME_VAR (DECL)) == PARM_DECL \ - || TREE_CODE (SSA_NAME_VAR (DECL)) == RESULT_DECL \ - || MTAG_P (SSA_NAME_VAR (DECL))))) + || TREE_CODE (SSA_NAME_VAR (DECL)) == RESULT_DECL))) @@ -2460,6 +2482,10 @@ struct function; /* Every ..._DECL node gets a unique number. */ #define DECL_UID(NODE) (DECL_MINIMAL_CHECK (NODE)->decl_minimal.uid) +/* DEBUG_EXPR_DECLs get negative UID numbers, to catch erroneous + uses. */ +#define DEBUG_TEMP_UID(NODE) (-DECL_UID (TREE_CHECK ((NODE), DEBUG_EXPR_DECL))) + /* These two fields describe where in the source code the declaration was. If the declaration appears in several places (as for a C function that is declared first and then defined later), this @@ -2472,15 +2498,14 @@ struct function; /* For FIELD_DECLs, this is the RECORD_TYPE, UNION_TYPE, or QUAL_UNION_TYPE node that the field is a member of. For VAR_DECL, - PARM_DECL, FUNCTION_DECL, LABEL_DECL, and CONST_DECL nodes, this - points to either the FUNCTION_DECL for the containing function, - the RECORD_TYPE or UNION_TYPE for the containing type, or + PARM_DECL, FUNCTION_DECL, LABEL_DECL, RESULT_DECL, and CONST_DECL + nodes, this points to either the FUNCTION_DECL for the containing + function, the RECORD_TYPE or UNION_TYPE for the containing type, or NULL_TREE or a TRANSLATION_UNIT_DECL if the given decl has "file scope". */ #define DECL_CONTEXT(NODE) (DECL_MINIMAL_CHECK (NODE)->decl_minimal.context) #define DECL_FIELD_CONTEXT(NODE) (FIELD_DECL_CHECK (NODE)->decl_minimal.context) -struct tree_decl_minimal GTY(()) -{ +struct GTY(()) tree_decl_minimal { struct tree_common common; location_t locus; unsigned int uid; @@ -2488,55 +2513,13 @@ struct tree_decl_minimal GTY(()) tree context; }; -/* When computing aliasing information, we represent the memory pointed-to - by pointers with artificial variables called "memory tags" (MT). There - are two kinds of tags, namely symbol and name: - - Symbol tags (SMT) are used in flow-insensitive alias analysis, they - represent all the pointed-to locations and variables pointed-to by - the same pointer symbol. Usually, this set is computed using - type-based analysis (i.e., alias set classes), but this may not - always be the case. - - Name tags (NMT) are used in flow-sensitive points-to alias - analysis, they represent the variables and memory locations - pointed-to by a specific SSA_NAME pointer. - - In general, given a pointer P with a symbol tag SMT, the alias set - of SMT should be the union of all the alias sets of the NMTs of - every SSA_NAME for P. */ -struct tree_memory_tag GTY(()) -{ - struct tree_decl_minimal common; - - bitmap GTY ((skip)) aliases; - - /* True if this tag has global scope. */ - unsigned int is_global : 1; -}; - -#define MTAG_GLOBAL(NODE) (TREE_MEMORY_TAG_CHECK (NODE)->mtag.is_global) -#define MTAG_ALIASES(NODE) (TREE_MEMORY_TAG_CHECK (NODE)->mtag.aliases) - -/* Memory Partition Tags (MPTs) group memory symbols under one - common name for the purposes of placing memory PHI nodes. */ - -struct tree_memory_partition_tag GTY(()) -{ - struct tree_memory_tag common; - - /* Set of symbols grouped under this MPT. */ - bitmap symbols; -}; - -#define MPT_SYMBOLS(NODE) (MEMORY_PARTITION_TAG_CHECK (NODE)->mpt.symbols) - /* For any sort of a ..._DECL node, this points to the original (abstract) - decl node which this decl is an instance of, or else it is NULL indicating - that this decl is not an instance of some other decl. For example, - in a nested declaration of an inline function, this points back to the - definition. */ + decl node which this decl is an inlined/cloned instance of, or else it + is NULL indicating that this decl is not an instance of some other decl. + + The C front-end also uses this in a nested declaration of an inline + function, to point back to the definition. */ #define DECL_ABSTRACT_ORIGIN(NODE) (DECL_COMMON_CHECK (NODE)->decl_common.abstract_origin) /* Like DECL_ABSTRACT_ORIGIN, but returns NODE if there's no abstract @@ -2557,7 +2540,7 @@ struct tree_memory_partition_tag GTY(()) /* For a FUNCTION_DECL, holds the tree of BINDINGs. For a TRANSLATION_UNIT_DECL, holds the namespace's BLOCK. For a VAR_DECL, holds the initial value. - For a PARM_DECL, not used--default + For a PARM_DECL, used for DECL_ARG_TYPE--default values for parameters are encoded in the type of the function, not in the PARM_DECL slot. For a FIELD_DECL, this is used for enumeration values and the C @@ -2577,7 +2560,7 @@ struct tree_memory_partition_tag GTY(()) #define DECL_ALIGN_UNIT(NODE) (DECL_ALIGN (NODE) / BITS_PER_UNIT) /* Set if the alignment of this DECL has been set by the user, for example with an 'aligned' attribute. */ -#define DECL_USER_ALIGN(NODE) (DECL_COMMON_CHECK (NODE)->decl_common.user_align) +#define DECL_USER_ALIGN(NODE) (DECL_COMMON_CHECK (NODE)->common.base.user_align) /* Holds the machine mode corresponding to the declaration of a variable or field. Always equal to TYPE_MODE (TREE_TYPE (decl)) except for a FIELD_DECL. */ @@ -2592,8 +2575,12 @@ struct tree_memory_partition_tag GTY(()) #define DECL_DEBUG_EXPR_IS_FROM(NODE) \ (DECL_COMMON_CHECK (NODE)->decl_common.debug_expr_is_from) +#define DECL_FUNCTION_PERSONALITY(NODE) \ + (FUNCTION_DECL_CHECK (NODE)->function_decl.personality) + /* Nonzero for a given ..._DECL node means that the name of this node should - be ignored for symbolic debug purposes. */ + be ignored for symbolic debug purposes. Moreover, for a FUNCTION_DECL, + the body of the function should also be ignored. */ #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 @@ -2614,7 +2601,7 @@ struct tree_memory_partition_tag GTY(()) example, for a FUNCTION_DECL, DECL_SAVED_TREE may be non-NULL and DECL_EXTERNAL may be true simultaneously; that can be the case for a C99 "extern inline" function. */ -#define DECL_EXTERNAL(NODE) (DECL_COMMON_CHECK (NODE)->decl_common.decl_flag_2) +#define DECL_EXTERNAL(NODE) (DECL_COMMON_CHECK (NODE)->decl_common.decl_flag_1) /* Nonzero in a ..._DECL means this variable is ref'd from a nested function. For VAR_DECL nodes, PARM_DECL nodes, and FUNCTION_DECL nodes. @@ -2642,16 +2629,7 @@ struct tree_memory_partition_tag GTY(()) #define DECL_LANG_FLAG_5(NODE) (DECL_COMMON_CHECK (NODE)->decl_common.lang_flag_5) #define DECL_LANG_FLAG_6(NODE) (DECL_COMMON_CHECK (NODE)->decl_common.lang_flag_6) #define DECL_LANG_FLAG_7(NODE) (DECL_COMMON_CHECK (NODE)->decl_common.lang_flag_7) - -/* Used to indicate an alias set for the memory pointed to by this - particular FIELD_DECL, PARM_DECL, or VAR_DECL, which must have - pointer (or reference) type. */ -#define DECL_POINTER_ALIAS_SET(NODE) \ - (DECL_COMMON_CHECK (NODE)->decl_common.pointer_alias_set) - -/* Nonzero if an alias set has been assigned to this declaration. */ -#define DECL_POINTER_ALIAS_SET_KNOWN_P(NODE) \ - (DECL_POINTER_ALIAS_SET (NODE) != - 1) +#define DECL_LANG_FLAG_8(NODE) (DECL_COMMON_CHECK (NODE)->decl_common.lang_flag_8) /* Nonzero for a decl which is at file scope. */ #define DECL_FILE_SCOPE_P(EXP) \ @@ -2672,13 +2650,7 @@ struct tree_memory_partition_tag GTY(()) #define DECL_GIMPLE_REG_P(DECL) \ DECL_COMMON_CHECK (DECL)->decl_common.gimple_reg_flag -/* For a DECL with pointer type, this is set if Type Based Alias - Analysis should not be applied to this DECL. */ -#define DECL_NO_TBAA_P(DECL) \ - DECL_COMMON_CHECK (DECL)->decl_common.no_tbaa_flag - -struct tree_decl_common GTY(()) -{ +struct GTY(()) tree_decl_common { struct tree_decl_minimal common; tree size; @@ -2689,7 +2661,6 @@ struct tree_decl_common GTY(()) unsigned ignored_flag : 1; unsigned abstract_flag : 1; unsigned artificial_flag : 1; - unsigned user_align : 1; unsigned preserve_flag: 1; unsigned debug_expr_is_from : 1; @@ -2701,37 +2672,42 @@ struct tree_decl_common GTY(()) unsigned lang_flag_5 : 1; unsigned lang_flag_6 : 1; unsigned lang_flag_7 : 1; + unsigned lang_flag_8 : 1; /* In LABEL_DECL, this is DECL_ERROR_ISSUED. In VAR_DECL and PARM_DECL, this is DECL_REGISTER. */ unsigned decl_flag_0 : 1; - /* In FIELD_DECL, this is DECL_PACKED. */ - unsigned decl_flag_1 : 1; /* In FIELD_DECL, this is DECL_BIT_FIELD In VAR_DECL and FUNCTION_DECL, this is DECL_EXTERNAL. - In TYPE_DECL, this is TYPE_DECL_SUPRESS_DEBUG. */ - unsigned decl_flag_2 : 1; + In TYPE_DECL, this is TYPE_DECL_SUPPRESS_DEBUG. */ + unsigned decl_flag_1 : 1; /* In FIELD_DECL, this is DECL_NONADDRESSABLE_P - In VAR_DECL and PARM_DECL, this is DECL_HAS_VALUE_EXPR. */ - unsigned decl_flag_3 : 1; + In VAR_DECL and PARM_DECL, this is DECL_HAS_VALUE_EXPR_P. */ + unsigned decl_flag_2 : 1; /* Logically, these two would go in a theoretical base shared by var and parm decl. */ unsigned gimple_reg_flag : 1; - /* In a DECL with pointer type, set if no TBAA should be done. */ - unsigned no_tbaa_flag : 1; - /* Padding so that 'align' can be on a 32-bit boundary. */ + /* In VAR_DECL, PARM_DECL and RESULT_DECL, this is DECL_BY_REFERENCE. */ + unsigned decl_by_reference_flag : 1; + /* In VAR_DECL, PARM_DECL and RESULT_DECL, this is DECL_RESTRICTED_P. */ + unsigned decl_restricted_flag : 1; + + /* Padding so that 'off_align' can be on a 32-bit boundary. */ unsigned decl_common_unused : 2; - unsigned int align : 24; /* DECL_OFFSET_ALIGN, used only for FIELD_DECLs. */ unsigned int off_align : 8; + /* 24-bits unused. */ + + /* DECL_ALIGN. It should have the same size as TYPE_ALIGN. */ + unsigned int align; + tree size_unit; tree initial; tree attributes; tree abstract_origin; - alias_set_type pointer_alias_set; /* Points to a structure whose details depend on the language in use. */ struct lang_decl *lang_specific; }; @@ -2744,7 +2720,7 @@ extern void decl_value_expr_insert (tree, tree); decl itself. This should only be used for debugging; once this field has been set, the decl itself may not legitimately appear in the function. */ #define DECL_HAS_VALUE_EXPR_P(NODE) \ - (TREE_CHECK2 (NODE, VAR_DECL, PARM_DECL)->decl_common.decl_flag_3) + (TREE_CHECK2 (NODE, VAR_DECL, PARM_DECL)->decl_common.decl_flag_2) #define DECL_VALUE_EXPR(NODE) \ (decl_value_expr_lookup (DECL_WRTL_CHECK (NODE))) #define SET_DECL_VALUE_EXPR(NODE, VAL) \ @@ -2778,8 +2754,7 @@ extern void decl_value_expr_insert (tree, tree); /* In VAR_DECL and PARM_DECL nodes, nonzero means declared `register'. */ #define DECL_REGISTER(NODE) (DECL_WRTL_CHECK (NODE)->decl_common.decl_flag_0) -struct tree_decl_with_rtl GTY(()) -{ +struct GTY(()) tree_decl_with_rtl { struct tree_decl_common common; rtx rtl; }; @@ -2823,11 +2798,11 @@ struct tree_decl_with_rtl GTY(()) #define DECL_FCONTEXT(NODE) (FIELD_DECL_CHECK (NODE)->field_decl.fcontext) /* In a FIELD_DECL, indicates this field should be bit-packed. */ -#define DECL_PACKED(NODE) (FIELD_DECL_CHECK (NODE)->decl_common.decl_flag_1) +#define DECL_PACKED(NODE) (FIELD_DECL_CHECK (NODE)->common.base.packed_flag) /* Nonzero in a FIELD_DECL means it is a bit field, and must be accessed specially. */ -#define DECL_BIT_FIELD(NODE) (FIELD_DECL_CHECK (NODE)->decl_common.decl_flag_2) +#define DECL_BIT_FIELD(NODE) (FIELD_DECL_CHECK (NODE)->decl_common.decl_flag_1) /* Used in a FIELD_DECL to indicate that we cannot form the address of this component. This makes it possible for Type-Based Alias Analysis @@ -2845,10 +2820,9 @@ struct tree_decl_with_rtl GTY(()) accesses to s.i must not be given the alias set of the type of 'i' (int) but instead directly that of the type of 's' (struct S). */ #define DECL_NONADDRESSABLE_P(NODE) \ - (FIELD_DECL_CHECK (NODE)->decl_common.decl_flag_3) + (FIELD_DECL_CHECK (NODE)->decl_common.decl_flag_2) -struct tree_field_decl GTY(()) -{ +struct GTY(()) tree_field_decl { struct tree_decl_common common; tree offset; @@ -2856,31 +2830,35 @@ struct tree_field_decl GTY(()) tree qualifier; tree bit_offset; tree fcontext; - }; /* A numeric unique identifier for a LABEL_DECL. The UID allocation is dense, unique within any one function, and may be used to index arrays. If the value is -1, then no UID has been assigned. */ #define LABEL_DECL_UID(NODE) \ - (LABEL_DECL_CHECK (NODE)->decl_common.pointer_alias_set) + (LABEL_DECL_CHECK (NODE)->label_decl.label_decl_uid) + +/* In a LABEL_DECL, the EH region number for which the label is the + post_landing_pad. */ +#define EH_LANDING_PAD_NR(NODE) \ + (LABEL_DECL_CHECK (NODE)->label_decl.eh_landing_pad_nr) /* In LABEL_DECL nodes, nonzero means that an error message about jumping into such a binding contour has been printed for this label. */ -#define DECL_ERROR_ISSUED(NODE) (LABEL_DECL_CHECK (NODE)->decl_common.decl_flag_0) +#define DECL_ERROR_ISSUED(NODE) \ + (LABEL_DECL_CHECK (NODE)->decl_common.decl_flag_0) -struct tree_label_decl GTY(()) -{ +struct GTY(()) tree_label_decl { struct tree_decl_with_rtl common; + int label_decl_uid; + int eh_landing_pad_nr; }; -struct tree_result_decl GTY(()) -{ +struct GTY(()) tree_result_decl { struct tree_decl_with_rtl common; }; -struct tree_const_decl GTY(()) -{ +struct GTY(()) tree_const_decl { struct tree_decl_with_rtl common; }; @@ -2892,8 +2870,7 @@ struct tree_const_decl GTY(()) where the data was actually passed. */ #define DECL_INCOMING_RTL(NODE) (PARM_DECL_CHECK (NODE)->parm_decl.incoming_rtl) -struct tree_parm_decl GTY(()) -{ +struct GTY(()) tree_parm_decl { struct tree_decl_with_rtl common; rtx incoming_rtl; }; @@ -2916,29 +2893,9 @@ struct tree_parm_decl GTY(()) /* Used to indicate that this DECL has weak linkage. */ #define DECL_WEAK(NODE) (DECL_WITH_VIS_CHECK (NODE)->decl_with_vis.weak_flag) -/* Internal to the gimplifier. Indicates that the value is a formal - temporary controlled by the gimplifier. */ -#define DECL_GIMPLE_FORMAL_TEMP_P(DECL) \ - DECL_WITH_VIS_CHECK (DECL)->decl_with_vis.gimple_formal_temp - /* Used to indicate that the DECL is a dllimport. */ #define DECL_DLLIMPORT_P(NODE) (DECL_WITH_VIS_CHECK (NODE)->decl_with_vis.dllimport_flag) -/* DECL_BASED_ON_RESTRICT_P records whether a VAR_DECL is a temporary - based on a variable with a restrict qualified type. If it is, - DECL_RESTRICT_BASE returns the restrict qualified variable on which - it is based. */ - -#define DECL_BASED_ON_RESTRICT_P(NODE) \ - (VAR_DECL_CHECK (NODE)->decl_with_vis.based_on_restrict_p) -#define DECL_GET_RESTRICT_BASE(NODE) \ - (decl_restrict_base_lookup (VAR_DECL_CHECK (NODE))) -#define SET_DECL_RESTRICT_BASE(NODE, VAL) \ - (decl_restrict_base_insert (VAR_DECL_CHECK (NODE), (VAL))) - -extern tree decl_restrict_base_lookup (tree); -extern void decl_restrict_base_insert (tree, tree); - /* Used in a DECL to indicate that, even if it TREE_PUBLIC, it need not be put out unless it is needed in this translation unit. Entities like this are shared across translation units (like weak @@ -2950,6 +2907,8 @@ extern void decl_restrict_base_insert (tree, tree); something which is DECL_COMDAT. */ #define DECL_COMDAT(NODE) (DECL_WITH_VIS_CHECK (NODE)->decl_with_vis.comdat_flag) +#define DECL_COMDAT_GROUP(NODE) (DECL_WITH_VIS_CHECK (NODE)->decl_with_vis.comdat_group) + /* A replaceable function is one which may be replaced at link-time with an entirely different definition, provided that the replacement has the same type. For example, functions declared @@ -3018,39 +2977,36 @@ extern void decl_restrict_base_insert (tree, tree); /* Used in TREE_PUBLIC decls to indicate that copies of this DECL in multiple translation units should be merged. */ -#define DECL_ONE_ONLY(NODE) (DECL_WITH_VIS_CHECK (NODE)->decl_with_vis.one_only) +#define DECL_ONE_ONLY(NODE) (DECL_COMDAT_GROUP (NODE) != NULL_TREE) -struct tree_decl_with_vis GTY(()) -{ +struct GTY(()) tree_decl_with_vis { struct tree_decl_with_rtl common; tree assembler_name; tree section_name; + tree comdat_group; /* Belong to VAR_DECL exclusively. */ - unsigned defer_output:1; - unsigned hard_register:1; - unsigned thread_local:1; - unsigned common_flag:1; + unsigned defer_output : 1; + unsigned hard_register : 1; + unsigned thread_local : 1; + unsigned common_flag : 1; unsigned in_text_section : 1; - unsigned gimple_formal_temp : 1; unsigned dllimport_flag : 1; - unsigned based_on_restrict_p : 1; /* Used by C++. Might become a generic decl flag. */ unsigned shadowed_for_var_p : 1; - /* Don't belong to VAR_DECL exclusively. */ - unsigned weak_flag:1; + unsigned weak_flag : 1; + unsigned seen_in_bind_expr : 1; unsigned comdat_flag : 1; ENUM_BITFIELD(symbol_visibility) visibility : 2; unsigned visibility_specified : 1; - /* Belong to FUNCTION_DECL exclusively. */ - unsigned one_only : 1; - unsigned init_priority_p:1; - /* Belongs to VAR_DECL exclusively. */ ENUM_BITFIELD(tls_model) tls_model : 3; - /* 12 unused bits. */ + + /* Belong to FUNCTION_DECL exclusively. */ + unsigned init_priority_p : 1; + /* 15 unused bits. */ }; /* In a VAR_DECL that's static, @@ -3126,8 +3082,7 @@ extern void decl_fini_priority_insert (tree, priority_type); #define DECL_THREAD_LOCAL_P(NODE) \ (VAR_DECL_CHECK (NODE)->decl_with_vis.tls_model >= TLS_MODEL_REAL) -struct tree_var_decl GTY(()) -{ +struct GTY(()) tree_var_decl { struct tree_decl_with_vis common; }; @@ -3146,9 +3101,8 @@ struct tree_var_decl GTY(()) C++ also uses this field in namespaces, hence the DECL_NON_COMMON_CHECK. */ #define DECL_VINDEX(NODE) (DECL_NON_COMMON_CHECK (NODE)->decl_non_common.vindex) -struct tree_decl_non_common GTY(()) - -{ +struct GTY(()) + tree_decl_non_common { struct tree_decl_with_vis common; /* C++ uses this in namespaces. */ tree saved_tree; @@ -3222,9 +3176,8 @@ struct tree_decl_non_common GTY(()) #define DECL_NO_LIMIT_STACK(NODE) \ (FUNCTION_DECL_CHECK (NODE)->function_decl.no_limit_stack) -/* In a FUNCTION_DECL with a nonzero DECL_CONTEXT, indicates that a - static chain is not needed. */ -#define DECL_NO_STATIC_CHAIN(NODE) \ +/* In a FUNCTION_DECL indicates that a static chain is needed. */ +#define DECL_STATIC_CHAIN(NODE) \ (FUNCTION_DECL_CHECK (NODE)->function_decl.regdecl_flag) /* Nonzero for a decl that cgraph has decided should be inlined into @@ -3233,17 +3186,17 @@ struct tree_decl_non_common GTY(()) #define DECL_POSSIBLY_INLINED(DECL) \ FUNCTION_DECL_CHECK (DECL)->function_decl.possibly_inlined -/* Nonzero in a FUNCTION_DECL means this function can be substituted - where it is called. */ -#define DECL_INLINE(NODE) (FUNCTION_DECL_CHECK (NODE)->function_decl.inline_flag) - /* Nonzero in a FUNCTION_DECL means that this function was declared inline, such as via the `inline' keyword in C/C++. This flag controls the linkage - semantics of 'inline'; whether or not the function is inlined is - controlled by DECL_INLINE. */ + semantics of 'inline' */ #define DECL_DECLARED_INLINE_P(NODE) \ (FUNCTION_DECL_CHECK (NODE)->function_decl.declared_inline_flag) +/* Nonzero in a FUNCTION_DECL means this function should not get + -Winline warnings. */ +#define DECL_NO_INLINE_WARNING_P(NODE) \ + (FUNCTION_DECL_CHECK (NODE)->function_decl.no_inline_warning_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 @@ -3283,12 +3236,14 @@ struct tree_decl_non_common GTY(()) FUNCTION_DECL from non_common, or inherit non_common from FUNCTION_DECL, which seemed a bit strange. */ -struct tree_function_decl GTY(()) -{ +struct GTY(()) tree_function_decl { struct tree_decl_non_common common; struct function *f; + /* The personality function. Used for stack unwinding. */ + tree personality; + /* Function specific options that are used by this function. */ tree function_specific_target; /* target options */ tree function_specific_optimization; /* optimization options */ @@ -3312,7 +3267,7 @@ struct tree_function_decl GTY(()) unsigned declared_inline_flag : 1; unsigned regdecl_flag : 1; - unsigned inline_flag : 1; + unsigned no_inline_warning_flag : 1; unsigned no_instrument_function_entry_exit : 1; unsigned no_limit_stack : 1; unsigned disregard_inline_limits : 1; @@ -3330,10 +3285,14 @@ struct tree_function_decl GTY(()) into stabs. Instead it will generate cross reference ('x') of names. This uses the same flag as DECL_EXTERNAL. */ #define TYPE_DECL_SUPPRESS_DEBUG(NODE) \ - (TYPE_DECL_CHECK (NODE)->decl_common.decl_flag_2) + (TYPE_DECL_CHECK (NODE)->decl_common.decl_flag_1) -struct tree_type_decl GTY(()) -{ +/* Getter of the imported declaration associated to the + IMPORTED_DECL node. */ +#define IMPORTED_DECL_ASSOCIATED_DECL(NODE) \ +(DECL_INITIAL (IMPORTED_DECL_CHECK (NODE))) + +struct GTY(()) tree_type_decl { struct tree_decl_non_common common; }; @@ -3349,17 +3308,15 @@ struct tree_type_decl GTY(()) #define STATEMENT_LIST_TAIL(NODE) \ (STATEMENT_LIST_CHECK (NODE)->stmt_list.tail) -struct tree_statement_list_node - GTY ((chain_next ("%h.next"), chain_prev ("%h.prev"))) -{ +struct GTY ((chain_next ("%h.next"), chain_prev ("%h.prev"))) tree_statement_list_node + { struct tree_statement_list_node *prev; struct tree_statement_list_node *next; tree stmt; }; -struct tree_statement_list - GTY(()) -{ +struct GTY(()) tree_statement_list + { struct tree_common common; struct tree_statement_list_node *head; struct tree_statement_list_node *tail; @@ -3368,8 +3325,7 @@ struct tree_statement_list /* Optimization options used by a function. */ -struct tree_optimization_option GTY(()) -{ +struct GTY(()) tree_optimization_option { struct tree_common common; /* The optimization options used by the user. */ @@ -3384,8 +3340,7 @@ extern tree build_optimization_node (void); /* Target options used by a function. */ -struct tree_target_option GTY(()) -{ +struct GTY(()) tree_target_option { struct tree_common common; /* The optimization options used by the user. */ @@ -3403,9 +3358,8 @@ extern tree build_target_option_node (void); It may be any of the structures declared above for various types of node. */ -union tree_node GTY ((ptr_alias (union lang_tree_node), - desc ("tree_node_structure (&%h)"))) -{ +union GTY ((ptr_alias (union lang_tree_node), + desc ("tree_node_structure (&%h)"))) tree_node { struct tree_base GTY ((tag ("TS_BASE"))) base; struct tree_common GTY ((tag ("TS_COMMON"))) common; struct tree_int_cst GTY ((tag ("TS_INT_CST"))) int_cst; @@ -3437,9 +3391,7 @@ union tree_node GTY ((ptr_alias (union lang_tree_node), struct tree_binfo GTY ((tag ("TS_BINFO"))) binfo; struct tree_statement_list GTY ((tag ("TS_STATEMENT_LIST"))) stmt_list; struct tree_constructor GTY ((tag ("TS_CONSTRUCTOR"))) constructor; - struct tree_memory_tag GTY ((tag ("TS_MEMORY_TAG"))) mtag; struct tree_omp_clause GTY ((tag ("TS_OMP_CLAUSE"))) omp_clause; - struct tree_memory_partition_tag GTY ((tag ("TS_MEMORY_PARTITION_TAG"))) mpt; struct tree_optimization_option GTY ((tag ("TS_OPTIMIZATION"))) optimization; struct tree_target_option GTY ((tag ("TS_TARGET_OPTION"))) target_option; }; @@ -3591,11 +3543,9 @@ enum tree_index TI_OPTIMIZATION_DEFAULT, TI_OPTIMIZATION_CURRENT, - TI_OPTIMIZATION_COLD, - TI_OPTIMIZATION_HOT, TI_TARGET_OPTION_DEFAULT, TI_TARGET_OPTION_CURRENT, - TI_CURRENT_OPTION_PRAGMA, + TI_CURRENT_TARGET_PRAGMA, TI_CURRENT_OPTIMIZE_PRAGMA, TI_MAX @@ -3765,12 +3715,10 @@ extern GTY(()) tree global_trees[TI_MAX]; #define main_identifier_node global_trees[TI_MAIN_IDENTIFIER] #define MAIN_NAME_P(NODE) (IDENTIFIER_NODE_CHECK (NODE) == main_identifier_node) -/* Optimization options (OPTIMIZATION_NODE) to use for default, current, cold, - and hot functions. */ +/* Optimization options (OPTIMIZATION_NODE) to use for default and current + functions. */ #define optimization_default_node global_trees[TI_OPTIMIZATION_DEFAULT] #define optimization_current_node global_trees[TI_OPTIMIZATION_CURRENT] -#define optimization_cold_node global_trees[TI_OPTIMIZATION_COLD] -#define optimization_hot_node global_trees[TI_OPTIMIZATION_HOT] /* Default/current target options (TARGET_OPTION_NODE). */ #define target_option_default_node global_trees[TI_TARGET_OPTION_DEFAULT] @@ -3778,7 +3726,7 @@ extern GTY(()) tree global_trees[TI_MAX]; /* Default tree list option(), optimize() pragmas to be linked into the attribute list. */ -#define current_option_pragma global_trees[TI_CURRENT_OPTION_PRAGMA] +#define current_target_pragma global_trees[TI_CURRENT_TARGET_PRAGMA] #define current_optimize_pragma global_trees[TI_CURRENT_OPTIMIZE_PRAGMA] /* An enumeration of the standard C integer types. These must be @@ -3920,6 +3868,7 @@ extern tree maybe_get_identifier (const char *); extern tree build_nt (enum tree_code, ...); extern tree build_nt_call_list (tree, tree); +extern tree build_nt_call_vec (tree, VEC(tree,gc) *); extern tree build0_stat (enum tree_code, tree MEM_STAT_DECL); #define build0(c,t) build0_stat (c,t MEM_STAT_INFO) @@ -3935,10 +3884,14 @@ extern tree build4_stat (enum tree_code, tree, tree, tree, tree, extern tree build5_stat (enum tree_code, tree, tree, tree, tree, tree, tree MEM_STAT_DECL); #define build5(c,t1,t2,t3,t4,t5,t6) build5_stat (c,t1,t2,t3,t4,t5,t6 MEM_STAT_INFO) -extern tree build7_stat (enum tree_code, tree, tree, tree, tree, tree, - tree, tree, tree MEM_STAT_DECL); -#define build7(c,t1,t2,t3,t4,t5,t6,t7,t8) \ - build7_stat (c,t1,t2,t3,t4,t5,t6,t7,t8 MEM_STAT_INFO) +extern tree build6_stat (enum tree_code, tree, tree, tree, tree, tree, + tree, tree MEM_STAT_DECL); +#define build6(c,t1,t2,t3,t4,t5,t6,t7) \ + build6_stat (c,t1,t2,t3,t4,t5,t6,t7 MEM_STAT_INFO) + +extern tree build_var_debug_value_stat (tree, tree MEM_STAT_DECL); +#define build_var_debug_value(t1,t2) \ + build_var_debug_value_stat (t1,t2 MEM_STAT_INFO) extern tree build_int_cst (tree, HOST_WIDE_INT); extern tree build_int_cst_type (tree, HOST_WIDE_INT); @@ -3957,12 +3910,15 @@ extern tree build_one_cst (tree); extern tree build_string (int, const char *); extern tree build_tree_list_stat (tree, tree MEM_STAT_DECL); #define build_tree_list(t,q) build_tree_list_stat(t,q MEM_STAT_INFO) -extern tree build_decl_stat (enum tree_code, tree, tree MEM_STAT_DECL); +extern tree build_tree_list_vec_stat (const VEC(tree,gc) * MEM_STAT_DECL); +#define build_tree_list_vec(v) build_tree_list_vec_stat (v MEM_STAT_INFO) +extern tree build_decl_stat (location_t, enum tree_code, + tree, tree MEM_STAT_DECL); extern tree build_fn_decl (const char *, tree); -#define build_decl(c,t,q) build_decl_stat (c,t,q MEM_STAT_INFO) +#define build_decl(l,c,t,q) build_decl_stat (l,c,t,q MEM_STAT_INFO) extern tree build_block (tree, tree, tree, tree); -extern tree build_empty_stmt (void); -extern tree build_omp_clause (enum omp_clause_code); +extern tree build_empty_stmt (location_t); +extern tree build_omp_clause (location_t, enum omp_clause_code); extern tree build_vl_exp_stat (enum tree_code, int MEM_STAT_DECL); #define build_vl_exp(c,n) build_vl_exp_stat (c,n MEM_STAT_INFO) @@ -3970,7 +3926,10 @@ extern tree build_vl_exp_stat (enum tree_code, int MEM_STAT_DECL); extern tree build_call_list (tree, tree, tree); extern tree build_call_nary (tree, tree, int, ...); extern tree build_call_valist (tree, tree, int, va_list); -extern tree build_call_array (tree, tree, int, tree*); +#define build_call_array(T1,T2,N,T3)\ + build_call_array_loc (UNKNOWN_LOCATION, T1, T2, N, T3) +extern tree build_call_array_loc (location_t, tree, tree, int, const tree *); +extern tree build_call_vec (tree, tree, VEC(tree,gc) *); /* Construct various nodes representing data types. */ @@ -3988,6 +3947,7 @@ extern tree build_reference_type_for_mode (tree, enum machine_mode, bool); extern tree build_reference_type (tree); extern tree build_vector_type_for_mode (tree, enum machine_mode); extern tree build_vector_type (tree innertype, int nunits); +extern tree build_opaque_vector_type (tree innertype, int nunits); extern tree build_type_no_quals (tree); extern tree build_index_type (tree); extern tree build_index_2_type (tree, tree); @@ -4001,13 +3961,13 @@ extern tree build_method_type_directly (tree, tree, tree); extern tree build_method_type (tree, tree); extern tree build_offset_type (tree, tree); extern tree build_complex_type (tree); -extern tree build_resx (int); extern tree array_type_nelts (const_tree); extern bool in_array_bounds_p (tree); extern bool range_in_array_bounds_p (tree); extern tree value_member (tree, tree); extern tree purpose_member (const_tree, tree); +extern tree chain_index (int, tree); extern int attribute_list_equal (const_tree, const_tree); extern int attribute_list_contained (const_tree, const_tree); @@ -4019,10 +3979,12 @@ extern HOST_WIDE_INT tree_low_cst (const_tree, int); extern int tree_int_cst_msb (const_tree); extern int tree_int_cst_sgn (const_tree); extern int tree_int_cst_sign_bit (const_tree); +extern unsigned int tree_int_cst_min_precision (tree, bool); extern bool tree_expr_nonnegative_p (tree); extern bool tree_expr_nonnegative_warnv_p (tree, bool *); extern bool may_negate_without_overflow_p (const_tree); extern tree strip_array_types (tree); +extern tree excess_precision_type (tree); /* Construct various nodes representing fract or accum data types. */ @@ -4069,6 +4031,7 @@ extern tree make_tree (tree, rtx); extern tree build_type_attribute_variant (tree, tree); extern tree build_decl_attribute_variant (tree, tree); +extern tree build_type_attribute_qual_variant (tree, tree, int); /* Structure describing an attribute and a function to handle it. */ struct attribute_spec @@ -4294,16 +4257,17 @@ extern enum machine_mode mode_for_size_tree (const_tree, enum mode_class, int); /* Return an expr equal to X but certainly not valid as an lvalue. */ -extern tree non_lvalue (tree); +#define non_lvalue(T) non_lvalue_loc (UNKNOWN_LOCATION, T) +extern tree non_lvalue_loc (location_t, tree); extern tree convert (tree, tree); 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 (const_tree); extern HOST_WIDE_INT int_size_in_bytes (const_tree); extern HOST_WIDE_INT max_int_size_in_bytes (const_tree); +extern tree tree_expr_size (const_tree); extern tree bit_position (const_tree); extern HOST_WIDE_INT int_bit_position (const_tree); extern tree byte_position (const_tree); @@ -4328,19 +4292,26 @@ extern GTY(()) tree sizetype_tab[(int) TYPE_KIND_LAST]; #define sbitsizetype sizetype_tab[(int) SBITSIZETYPE] extern tree size_int_kind (HOST_WIDE_INT, enum size_type_kind); -extern tree size_binop (enum tree_code, tree, tree); -extern tree size_diffop (tree, tree); +#define size_binop(CODE,T1,T2)\ + size_binop_loc (UNKNOWN_LOCATION, CODE, T1, T2) +extern tree size_binop_loc (location_t, enum tree_code, tree, tree); +#define size_diffop(T1,T2)\ + size_diffop_loc (UNKNOWN_LOCATION, T1, T2) +extern tree size_diffop_loc (location_t, tree, tree); #define size_int(L) size_int_kind (L, SIZETYPE) #define ssize_int(L) size_int_kind (L, SSIZETYPE) #define bitsize_int(L) size_int_kind (L, BITSIZETYPE) #define sbitsize_int(L) size_int_kind (L, SBITSIZETYPE) -extern tree round_up (tree, int); -extern tree round_down (tree, int); +#define round_up(T,N) round_up_loc (UNKNOWN_LOCATION, T, N) +extern tree round_up_loc (location_t, tree, int); +#define round_down(T,N) round_down_loc (UNKNOWN_LOCATION, T, N) +extern tree round_down_loc (location_t, tree, int); extern tree get_pending_sizes (void); extern void put_pending_size (tree); extern void put_pending_sizes (tree); +extern void finalize_size_functions (void); /* Type for sizes of data-type. */ @@ -4391,6 +4362,10 @@ extern bool initializer_zerop (const_tree); extern tree ctor_to_list (tree); +/* Given a CONSTRUCTOR CTOR, return the element values as a vector. */ + +extern VEC(tree,gc) *ctor_to_vec (tree); + /* Examine CTOR to discover: * how many scalar fields are set to nonzero values, and place it in *P_NZ_ELTS; @@ -4478,10 +4453,30 @@ extern bool contains_placeholder_p (const_tree); extern bool type_contains_placeholder_p (tree); +/* Given a tree EXP, find all occurences of references to fields + in a PLACEHOLDER_EXPR and place them in vector REFS without + duplicates. Also record VAR_DECLs and CONST_DECLs. Note that + we assume here that EXP contains only arithmetic expressions + or CALL_EXPRs with PLACEHOLDER_EXPRs occurring only in their + argument list. */ + +extern void find_placeholder_in_expr (tree, VEC (tree, heap) **); + +/* This macro calls the above function but short-circuits the common + case of a constant to save time and also checks for NULL. */ + +#define FIND_PLACEHOLDER_IN_EXPR(EXP, V) \ +do { \ + if((EXP) && !TREE_CONSTANT (EXP)) \ + find_placeholder_in_expr (EXP, V); \ +} while (0) + /* Given a tree EXP, a FIELD_DECL F, and a replacement value R, return a tree with all occurrences of references to F in a - PLACEHOLDER_EXPR replaced by R. Note that we assume here that EXP - contains only arithmetic expressions. */ + PLACEHOLDER_EXPR replaced by R. Also handle VAR_DECLs and + CONST_DECLs. Note that we assume here that EXP contains only + arithmetic expressions or CALL_EXPRs with PLACEHOLDER_EXPRs + occurring only in their argument list. */ extern tree substitute_in_expr (tree, tree, tree); @@ -4539,7 +4534,24 @@ extern tree get_narrower (tree, int *); /* Return true if T is an expression that get_inner_reference handles. */ -extern int handled_component_p (const_tree); +static inline bool +handled_component_p (const_tree t) +{ + switch (TREE_CODE (t)) + { + case BIT_FIELD_REF: + case COMPONENT_REF: + case ARRAY_REF: + case ARRAY_RANGE_REF: + case VIEW_CONVERT_EXPR: + case REALPART_EXPR: + case IMAGPART_EXPR: + return true; + + default: + return false; + } +} /* Given an expression EXP that is a handled_component_p, look for the ultimate containing object, which is returned and specify @@ -4549,24 +4561,24 @@ extern tree get_inner_reference (tree, HOST_WIDE_INT *, HOST_WIDE_INT *, tree *, enum machine_mode *, int *, int *, bool); -/* Given an expression EXP that may be a COMPONENT_REF or an ARRAY_REF, - look for whether EXP or any nested component-refs within EXP is marked - as PACKED. */ +/* Given an expression EXP that may be a COMPONENT_REF, an ARRAY_REF or an + ARRAY_RANGE_REF, look for whether EXP or any nested component-refs within + EXP is marked as PACKED. */ extern bool contains_packed_reference (const_tree exp); /* Return a tree of sizetype representing the size, in bytes, of the element - of EXP, an ARRAY_REF. */ + of EXP, an ARRAY_REF or an ARRAY_RANGE_REF. */ extern tree array_ref_element_size (tree); /* Return a tree representing the lower bound of the array mentioned in - EXP, an ARRAY_REF. */ + EXP, an ARRAY_REF or an ARRAY_RANGE_REF. */ extern tree array_ref_low_bound (tree); /* Return a tree representing the upper bound of the array mentioned in - EXP, an ARRAY_REF. */ + EXP, an ARRAY_REF or an ARRAY_RANGE_REF. */ extern tree array_ref_up_bound (tree); @@ -4646,6 +4658,14 @@ function_args_iter_next (function_args_iterator *i) i->next = TREE_CHAIN (i->next); } +/* We set BLOCK_SOURCE_LOCATION only to inlined function entry points. */ + +static inline bool +inlined_function_outer_scope_p (const_tree block) +{ + return BLOCK_SOURCE_LOCATION (block) != UNKNOWN_LOCATION; +} + /* 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. */ @@ -4669,7 +4689,6 @@ extern unsigned crc32_string (unsigned, const char *); extern void clean_symbol_name (char *); extern tree get_file_function_name (const char *); extern tree get_callee_fndecl (const_tree); -extern void change_decl_assembler_name (tree, tree); extern int type_num_arguments (const_tree); extern bool associative_tree_code (enum tree_code); extern bool commutative_tree_code (enum tree_code); @@ -4679,12 +4698,19 @@ extern int operand_equal_for_phi_arg_p (const_tree, const_tree); extern tree call_expr_arg (tree, int); extern tree *call_expr_argp (tree, int); extern tree call_expr_arglist (tree); -extern tree create_artificial_label (void); +extern tree create_artificial_label (location_t); extern const char *get_name (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); +extern unsigned int int_or_pointer_precision (const_tree); +extern tree build_low_bits_mask (tree, unsigned); +extern tree tree_strip_nop_conversions (tree); +extern tree tree_strip_sign_nop_conversions (tree); +extern tree lhd_gcc_personality (void); + +/* In cgraph.c */ +extern void change_decl_assembler_name (tree, tree); /* In gimplify.c */ extern tree unshare_expr (tree); @@ -4699,7 +4725,6 @@ extern void expand_goto (tree); extern rtx expand_stack_save (void); extern void expand_stack_restore (tree); extern void expand_return (tree); -extern int is_body_block (const_tree); /* In tree-eh.c */ extern void using_eh_for_cleanups (void); @@ -4721,33 +4746,57 @@ extern tree native_interpret_expr (tree, const unsigned char *, int); subexpressions are not changed. */ extern tree fold (tree); -extern tree fold_unary (enum tree_code, tree, tree); -extern tree fold_binary (enum tree_code, tree, tree, tree); -extern tree fold_ternary (enum tree_code, tree, tree, tree, tree); -extern tree fold_build1_stat (enum tree_code, tree, tree MEM_STAT_DECL); -#define fold_build1(c,t1,t2) fold_build1_stat (c, t1, t2 MEM_STAT_INFO) -extern tree fold_build2_stat (enum tree_code, tree, tree, tree MEM_STAT_DECL); -#define fold_build2(c,t1,t2,t3) fold_build2_stat (c, t1, t2, t3 MEM_STAT_INFO) -extern tree fold_build3_stat (enum tree_code, tree, tree, tree, tree MEM_STAT_DECL); -#define fold_build3(c,t1,t2,t3,t4) fold_build3_stat (c, t1, t2, t3, t4 MEM_STAT_INFO) -extern tree fold_build1_initializer (enum tree_code, tree, tree); -extern tree fold_build2_initializer (enum tree_code, tree, tree, tree); -extern tree fold_build3_initializer (enum tree_code, tree, tree, tree, tree); -extern tree fold_build_call_array (tree, tree, int, tree *); -extern tree fold_build_call_array_initializer (tree, tree, int, tree *); +#define fold_unary(CODE,T1,T2)\ + fold_unary_loc (UNKNOWN_LOCATION, CODE, T1, T2) +extern tree fold_unary_loc (location_t, enum tree_code, tree, tree); +#define fold_unary_ignore_overflow(CODE,T1,T2)\ + fold_unary_ignore_overflow_loc (UNKNOWN_LOCATION, CODE, T1, T2) +extern tree fold_unary_ignore_overflow_loc (location_t, enum tree_code, tree, tree); +#define fold_binary(CODE,T1,T2,T3)\ + fold_binary_loc (UNKNOWN_LOCATION, CODE, T1, T2, T3) +extern tree fold_binary_loc (location_t, enum tree_code, tree, tree, tree); +#define fold_ternary(CODE,T1,T2,T3,T4)\ + fold_ternary_loc (UNKNOWN_LOCATION, CODE, T1, T2, T3, T4) +extern tree fold_ternary_loc (location_t, enum tree_code, tree, tree, tree, tree); +#define fold_build1(c,t1,t2)\ + fold_build1_stat_loc (UNKNOWN_LOCATION, c, t1, t2 MEM_STAT_INFO) +#define fold_build1_loc(l,c,t1,t2)\ + fold_build1_stat_loc (l, c, t1, t2 MEM_STAT_INFO) +extern tree fold_build1_stat_loc (location_t, enum tree_code, tree, + tree MEM_STAT_DECL); +#define fold_build2(c,t1,t2,t3)\ + fold_build2_stat_loc (UNKNOWN_LOCATION, c, t1, t2, t3 MEM_STAT_INFO) +#define fold_build2_loc(l,c,t1,t2,t3)\ + fold_build2_stat_loc (l, c, t1, t2, t3 MEM_STAT_INFO) +extern tree fold_build2_stat_loc (location_t, enum tree_code, tree, tree, + tree MEM_STAT_DECL); +#define fold_build3(c,t1,t2,t3,t4)\ + fold_build3_stat_loc (UNKNOWN_LOCATION, c, t1, t2, t3, t4 MEM_STAT_INFO) +#define fold_build3_loc(l,c,t1,t2,t3,t4)\ + fold_build3_stat_loc (l, c, t1, t2, t3, t4 MEM_STAT_INFO) +extern tree fold_build3_stat_loc (location_t, enum tree_code, tree, tree, tree, + tree MEM_STAT_DECL); +extern tree fold_build1_initializer_loc (location_t, enum tree_code, tree, tree); +extern tree fold_build2_initializer_loc (location_t, enum tree_code, tree, tree, tree); +extern tree fold_build3_initializer_loc (location_t, enum tree_code, tree, tree, tree, tree); +#define fold_build_call_array(T1,T2,N,T4)\ + fold_build_call_array_loc (UNKNOWN_LOCATION, T1, T2, N, T4) +extern tree fold_build_call_array_loc (location_t, tree, tree, int, tree *); +#define fold_build_call_array_initializer(T1,T2,N,T4)\ + fold_build_call_array_initializer_loc (UNKNOWN_LOCATION, T1, T2, N, T4) +extern tree fold_build_call_array_initializer_loc (location_t, tree, tree, int, tree *); extern bool fold_convertible_p (const_tree, const_tree); -extern tree fold_convert (tree, tree); -extern tree fold_single_bit_test (enum tree_code, tree, tree, tree); +#define fold_convert(T1,T2)\ + fold_convert_loc(UNKNOWN_LOCATION, T1, T2) +extern tree fold_convert_loc (location_t, tree, tree); +extern tree fold_single_bit_test (location_t, enum tree_code, tree, tree, tree); extern tree fold_ignored_result (tree); extern tree fold_abs_const (tree, tree); -extern tree fold_indirect_ref_1 (tree, tree); +extern tree fold_indirect_ref_1 (location_t, tree, tree); extern void fold_defer_overflow_warnings (void); extern void fold_undefer_overflow_warnings (bool, const_gimple, 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); -extern tree maybe_fold_offset_to_address (tree, tree, tree); -extern tree maybe_fold_stmt_addition (tree, tree, tree); extern tree force_fit_type_double (tree, unsigned HOST_WIDE_INT, HOST_WIDE_INT, int, bool); @@ -4795,22 +4844,36 @@ enum operand_equal_flag extern int operand_equal_p (const_tree, const_tree, unsigned int); 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); -extern tree fold_truth_not_expr (tree); +#define omit_one_operand(T1,T2,T3)\ + omit_one_operand_loc (UNKNOWN_LOCATION, T1, T2, T3) +extern tree omit_one_operand_loc (location_t, tree, tree, tree); +#define omit_two_operands(T1,T2,T3,T4)\ + omit_two_operands_loc (UNKNOWN_LOCATION, T1, T2, T3, T4) +extern tree omit_two_operands_loc (location_t, tree, tree, tree, tree); +#define invert_truthvalue(T)\ + invert_truthvalue_loc(UNKNOWN_LOCATION, T) +extern tree invert_truthvalue_loc (location_t, tree); +extern tree fold_truth_not_expr (location_t, tree); extern tree fold_unary_to_constant (enum tree_code, tree, tree); extern tree fold_binary_to_constant (enum tree_code, tree, tree, tree); extern tree fold_read_from_constant_string (tree); extern tree int_const_binop (enum tree_code, const_tree, const_tree, int); -extern tree build_fold_addr_expr (tree); +#define build_fold_addr_expr(T)\ + build_fold_addr_expr_loc (UNKNOWN_LOCATION, (T)) +extern tree build_fold_addr_expr_loc (location_t, tree); +#define build_fold_addr_expr_with_type(T,TYPE)\ + build_fold_addr_expr_with_type_loc (UNKNOWN_LOCATION, (T), TYPE) +extern tree build_fold_addr_expr_with_type_loc (location_t, tree, tree); extern tree fold_build_cleanup_point_expr (tree type, tree expr); extern tree fold_strip_sign_ops (tree); -extern tree build_fold_addr_expr_with_type (tree, tree); -extern tree build_fold_indirect_ref (tree); -extern tree fold_indirect_ref (tree); +#define build_fold_indirect_ref(T)\ + build_fold_indirect_ref_loc (UNKNOWN_LOCATION, T) +extern tree build_fold_indirect_ref_loc (location_t, tree); +#define fold_indirect_ref(T)\ + fold_indirect_ref_loc (UNKNOWN_LOCATION, T) +extern tree fold_indirect_ref_loc (location_t, tree); extern tree constant_boolean_node (int, tree); -extern tree build_low_bits_mask (tree, unsigned); +extern tree div_if_zero_remainder (enum tree_code, const_tree, const_tree); extern bool tree_swap_operands_p (const_tree, const_tree, bool); extern enum tree_code swap_tree_comparison (enum tree_code); @@ -4823,7 +4886,6 @@ extern bool tree_unary_nonzero_warnv_p (enum tree_code, tree, tree, bool *); extern bool tree_binary_nonzero_warnv_p (enum tree_code, tree, tree, tree op1, bool *); extern bool tree_single_nonzero_warnv_p (tree, bool *); -extern bool tree_expr_nonzero_warnv_p (tree, bool *); extern bool tree_unary_nonnegative_warnv_p (enum tree_code, tree, tree, bool *); extern bool tree_binary_nonnegative_warnv_p (enum tree_code, tree, tree, tree, bool *); @@ -4834,35 +4896,58 @@ extern bool tree_call_nonnegative_warnv_p (tree, tree, tree, tree, bool *); extern bool tree_expr_nonzero_warnv_p (tree, bool *); extern bool fold_real_zero_addition_p (const_tree, const_tree, int); +extern tree combine_comparisons (location_t, enum tree_code, enum tree_code, + enum tree_code, tree, tree, tree); +extern void debug_fold_checksum (const_tree); + +/* Return nonzero if CODE is a tree code that represents a truth value. */ +static inline bool +truth_value_p (enum tree_code code) +{ + return (TREE_CODE_CLASS (code) == tcc_comparison + || code == TRUTH_AND_EXPR || code == TRUTH_ANDIF_EXPR + || code == TRUTH_OR_EXPR || code == TRUTH_ORIF_EXPR + || code == TRUTH_XOR_EXPR || code == TRUTH_NOT_EXPR); +} + /* In builtins.c */ -extern tree fold_call_expr (tree, bool); -extern tree fold_builtin_fputs (tree, tree, bool, bool, tree); -extern tree fold_builtin_strcpy (tree, tree, tree, tree); -extern tree fold_builtin_strncpy (tree, tree, tree, tree, tree); -extern tree fold_builtin_memory_chk (tree, tree, tree, tree, tree, tree, bool, +extern tree fold_call_expr (location_t, tree, bool); +extern tree fold_builtin_fputs (location_t, tree, tree, bool, bool, tree); +extern tree fold_builtin_strcpy (location_t, tree, tree, tree, tree); +extern tree fold_builtin_strncpy (location_t, tree, tree, tree, tree, tree); +extern tree fold_builtin_memory_chk (location_t, tree, tree, tree, tree, tree, tree, bool, enum built_in_function); -extern tree fold_builtin_stxcpy_chk (tree, tree, tree, tree, tree, bool, +extern tree fold_builtin_stxcpy_chk (location_t, tree, tree, tree, tree, tree, bool, enum built_in_function); -extern tree fold_builtin_strncpy_chk (tree, tree, tree, tree, tree); -extern tree fold_builtin_snprintf_chk (tree, tree, enum built_in_function); +extern tree fold_builtin_strncpy_chk (location_t, tree, tree, tree, tree, tree); +extern tree fold_builtin_snprintf_chk (location_t, 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_builtin_call_array (tree, tree, int, tree *); -extern void debug_fold_checksum (const_tree); -extern tree build_call_expr (tree, int, ...); +extern tree build_function_call_expr (location_t, tree, tree); +extern tree fold_builtin_call_array (location_t, tree, tree, int, tree *); +#define build_call_expr(...)\ + build_call_expr_loc (UNKNOWN_LOCATION, __VA_ARGS__) +extern tree build_call_expr_loc (location_t, tree, int, ...); extern tree mathfn_built_in (tree, enum built_in_function fn); -extern tree strip_float_extensions (tree); extern tree c_strlen (tree, int); extern tree std_gimplify_va_arg_expr (tree, tree, gimple_seq *, gimple_seq *); extern tree build_va_arg_indirect_ref (tree); extern tree build_string_literal (int, const char *); extern bool validate_arglist (const_tree, ...); extern rtx builtin_memset_read_str (void *, HOST_WIDE_INT, enum machine_mode); +extern bool can_trust_pointer_alignment (void); extern int get_pointer_alignment (tree, unsigned int); +extern bool is_builtin_name (const char *); +extern bool is_builtin_fn (tree); +extern int get_object_alignment (tree, unsigned int, unsigned int); extern tree fold_call_stmt (gimple, bool); extern tree gimple_fold_builtin_snprintf_chk (gimple, tree, enum built_in_function); +extern tree make_range (tree, int *, tree *, tree *, bool *); +extern tree build_range_check (location_t, tree, tree, int, tree, tree); +extern bool merge_ranges (int *, tree *, tree *, int, tree, tree, int, + tree, tree); +extern void set_builtin_user_assembler_name (tree decl, const char *asmspec); /* In convert.c */ extern tree strip_float_extensions (tree); @@ -4882,7 +4967,9 @@ extern int simple_cst_equal (const_tree, const_tree); extern hashval_t iterative_hash_expr (const_tree, hashval_t); extern hashval_t iterative_hash_exprs_commutative (const_tree, const_tree, hashval_t); +extern hashval_t iterative_hash_host_wide_int (HOST_WIDE_INT, hashval_t); extern hashval_t iterative_hash_hashval_t (hashval_t, hashval_t); +extern hashval_t iterative_hash_host_wide_int (HOST_WIDE_INT, hashval_t); extern int compare_tree_int (const_tree, unsigned HOST_WIDE_INT); extern int type_list_equal (const_tree, const_tree); extern int chain_member (const_tree, const_tree); @@ -4890,10 +4977,6 @@ extern tree type_hash_lookup (unsigned int, tree); extern void type_hash_add (unsigned int, tree); extern int simple_cst_list_equal (const_tree, const_tree); extern void dump_tree_statistics (void); -extern void expand_function_end (void); -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 (const_tree); extern tree reconstruct_complex_type (tree, tree); @@ -4907,19 +4990,28 @@ extern void build_common_tree_nodes_2 (int); extern void build_common_builtin_nodes (void); extern tree build_nonstandard_integer_type (unsigned HOST_WIDE_INT, int); extern tree build_range_type (tree, tree, tree); +extern bool subrange_type_for_debug_p (const_tree, tree *, tree *); extern HOST_WIDE_INT int_cst_value (const_tree); -extern tree build_addr (tree, tree); +extern HOST_WIDEST_INT widest_int_cst_value (const_tree); extern bool fields_compatible_p (const_tree, const_tree); extern tree find_compatible_field (tree, tree); -extern void set_expr_locus (tree, source_location *); - extern tree *tree_block (tree); extern location_t *block_nonartificial_location (tree); +extern location_t tree_nonartificial_location (tree); + +extern tree block_ultimate_origin (const_tree); + +/* In tree-nested.c */ +extern tree build_addr (tree, tree); /* In function.c */ extern void expand_main_function (void); +extern void expand_function_end (void); +extern void expand_function_start (tree); +extern void stack_protect_prologue (void); +extern void stack_protect_epilogue (void); extern void init_dummy_function_start (void); extern void expand_dummy_function_end (void); extern unsigned int init_function_for_compilation (void); @@ -5025,7 +5117,7 @@ extern unsigned int update_alignment_for_field (record_layout_info, tree, unsigned int); /* varasm.c */ extern void make_decl_rtl (tree); -extern void make_decl_one_only (tree); +extern void make_decl_one_only (tree, tree); extern int supports_one_only (void); extern void resolve_unique_section (tree, int, int); extern void mark_referenced (tree); @@ -5036,6 +5128,7 @@ extern void process_pending_assemble_externals (void); extern void finish_aliases_1 (void); extern void finish_aliases_2 (void); extern tree emutls_decl (tree); +extern void remove_unreachable_alias_pairs (void); /* In stmt.c */ extern void expand_computed_goto (tree); @@ -5043,22 +5136,22 @@ extern bool parse_output_constraint (const char **, int, int, int, bool *, bool *, bool *); extern bool parse_input_constraint (const char **, int, int, int, int, const char * const *, bool *, bool *); -extern void expand_asm_expr (tree); -extern tree resolve_asm_operand_names (tree, tree, tree); -extern void expand_case (tree); +extern void expand_asm_stmt (gimple); +extern tree resolve_asm_operand_names (tree, tree, tree, tree); +extern void expand_case (gimple); extern void expand_decl (tree); -extern void expand_anon_union_decl (tree, tree, tree); #ifdef HARD_CONST /* Silly ifdef to avoid having all includers depend on hard-reg-set.h. */ extern tree tree_overlaps_hard_reg_set (tree, HARD_REG_SET *); #endif +/* In dwarf2out.c */ /* Interface of the DWARF2 unwind info support. */ /* Generate a new label for the CFI info to refer to. */ -extern char *dwarf2out_cfi_label (void); +extern char *dwarf2out_cfi_label (bool); /* Entry point to update the canonical frame address (CFA). */ @@ -5113,6 +5206,7 @@ extern tree walk_tree_without_duplicates_1 (tree*, walk_tree_fn, void*, #define walk_tree_without_duplicates(a,b,c) \ walk_tree_without_duplicates_1 (a, b, c, NULL) +/* In emit-rtl.c */ /* Assign the RTX to declaration. */ extern void set_decl_rtl (tree, rtx); @@ -5151,27 +5245,27 @@ extern int tree_node_sizes[]; restricted to creating gimple expressions. */ extern bool in_gimple_form; -/* In tree-gimple.c. */ +/* In gimple.c. */ extern tree get_base_address (tree t); +extern void mark_addressable (tree); /* In tree-vectorizer.c. */ extern void vect_set_verbosity_level (const char *); /* In tree.c. */ -struct tree_map_base GTY(()) -{ +struct GTY(()) tree_map_base { tree from; }; extern int tree_map_base_eq (const void *, const void *); extern unsigned int tree_map_base_hash (const void *); extern int tree_map_base_marked_p (const void *); +extern bool list_equal_p (const_tree, const_tree); /* Map from a tree to another tree. */ -struct tree_map GTY(()) -{ +struct GTY(()) tree_map { struct tree_map_base base; unsigned int hash; tree to; @@ -5183,8 +5277,7 @@ extern unsigned int tree_map_hash (const void *); /* Map from a tree to an int. */ -struct tree_int_map GTY(()) -{ +struct GTY(()) tree_int_map { struct tree_map_base base; unsigned int to; }; @@ -5195,8 +5288,7 @@ struct tree_int_map GTY(()) /* Map from a tree to initialization/finalization priorities. */ -struct tree_priority_map GTY(()) -{ +struct GTY(()) tree_priority_map { struct tree_map_base base; priority_type init; priority_type fini; @@ -5206,12 +5298,20 @@ struct tree_priority_map GTY(()) #define tree_priority_map_hash tree_map_base_hash #define tree_priority_map_marked_p tree_map_base_marked_p +/* In tree-ssa.c */ + +tree target_for_debug_bind (tree); + +/* In tree-ssa-ccp.c */ +extern tree maybe_fold_offset_to_reference (location_t, tree, tree, tree); +extern tree maybe_fold_offset_to_address (location_t, tree, tree, tree); +extern tree maybe_fold_stmt_addition (location_t, tree, tree, tree); + /* In tree-ssa-address.c. */ 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 (const_tree); extern bool ssa_name_nonnegative_p (const_tree); /* In tree-object-size.c. */ @@ -5221,11 +5321,15 @@ extern unsigned HOST_WIDE_INT compute_builtin_object_size (tree, int); /* In expr.c. */ extern unsigned HOST_WIDE_INT highest_pow2_factor (const_tree); +extern tree build_personality_function (const char *); /* In tree-inline.c. */ void init_inline_once (void); +/* In ipa-reference.c. Used for parsing attributes of asm code. */ +extern GTY(()) tree memory_identifier_string; + /* Compute the number of operands in an expression node NODE. For tcc_vl_exp nodes like CALL_EXPRs, this is stored in the node itself, otherwise it is looked up from the node's code. */ @@ -5243,15 +5347,13 @@ tree_operand_length (const_tree node) defined by this point. */ /* Structure containing iterator state. */ -typedef struct call_expr_arg_iterator_d GTY (()) -{ +typedef struct GTY (()) call_expr_arg_iterator_d { tree t; /* the call_expr */ int n; /* argument count */ int i; /* next argument index */ } call_expr_arg_iterator; -typedef struct const_call_expr_arg_iterator_d GTY (()) -{ +typedef struct GTY (()) const_call_expr_arg_iterator_d { const_tree t; /* the call_expr */ int n; /* argument count */ int i; /* next argument index */ @@ -5341,4 +5443,11 @@ more_const_call_expr_args_p (const const_call_expr_arg_iterator *iter) for ((arg) = first_const_call_expr_arg ((call), &(iter)); (arg); \ (arg) = next_const_call_expr_arg (&(iter))) +/* Return true if tree node T is a language-specific node. */ +static inline bool +is_lang_specific (tree t) +{ + return TREE_CODE (t) == LANG_TYPE || TREE_CODE (t) >= NUM_TREE_CODES; +} + #endif /* GCC_TREE_H */