/* This file contains the definitions and documentation for the
tree codes used in GCC.
- Copyright (C) 1987, 1988, 1993, 1995, 1997, 1998, 2000, 2001, 2004, 2005
- Free Software Foundation, Inc.
+ Copyright (C) 1987, 1988, 1993, 1995, 1997, 1998, 2000, 2001, 2004, 2005,
+ 2006 Free Software Foundation, Inc.
This file is part of GCC.
For a block which represents the outermost scope of a function, it
points to the FUNCTION_DECL node.
BLOCK_VARS points to a chain of decl nodes.
- BLOCK_TYPE_TAGS points to a chain of types which have their own names.
BLOCK_CHAIN points to the next BLOCK at the same level.
BLOCK_ABSTRACT_ORIGIN points to the original (abstract) tree node which
this block is an instance of, or else is NULL to indicate that this
/* The ordering of the following codes is optimized for the checking
macros in tree.h. Changing the order will degrade the speed of the
- compiler. OFFSET_TYPE, ENUMERAL_TYPE, BOOLEAN_TYPE, CHAR_TYPE,
- INTEGER_TYPE, REAL_TYPE, POINTER_TYPE. */
+ compiler. OFFSET_TYPE, ENUMERAL_TYPE, BOOLEAN_TYPE, INTEGER_TYPE,
+ REAL_TYPE, POINTER_TYPE. */
/* An offset is a pointer relative to an object.
The TREE_TYPE field is the type of the object at the offset.
INTEGRAL_TYPE. */
DEFTREECODE (BOOLEAN_TYPE, "boolean_type", tcc_type, 0)
-/* CHAR in Java; not used in C. Looks like an INTEGRAL_TYPE. */
-DEFTREECODE (CHAR_TYPE, "char_type", tcc_type, 0)
-
/* Integer types in all languages, including char in C.
Also used for sub-ranges of other discrete types.
Has components TYPE_MIN_VALUE, TYPE_MAX_VALUE (expressions, inclusive)
and TYPE_PRECISION (number of bits used by this type).
In the case of a subrange type in Pascal, the TREE_TYPE
of this will point at the supertype (another INTEGER_TYPE,
- or an ENUMERAL_TYPE, CHAR_TYPE, or BOOLEAN_TYPE).
+ or an ENUMERAL_TYPE or BOOLEAN_TYPE).
Otherwise, the TREE_TYPE is zero. */
DEFTREECODE (INTEGER_TYPE, "integer_type", tcc_type, 0)
FUNCTION_DECLs use four special fields:
DECL_ARGUMENTS holds a chain of PARM_DECL nodes for the arguments.
- DECL_RESULT holds a RESULT_DECL node for the value of a function,
- or it is 0 for a function that returns no value.
+ DECL_RESULT holds a RESULT_DECL node for the value of a function.
+ The DECL_RTL field is 0 for a function that returns no value.
(C functions returning void have zero here.)
The TREE_TYPE field is the type in which the result is actually
returned. This is usually the same as the return type of the
DEFTREECODE (TYPE_DECL, "type_decl", tcc_declaration, 0)
DEFTREECODE (RESULT_DECL, "result_decl", tcc_declaration, 0)
+/* Memory tags used in tree-ssa to represent memory locations in
+ virtual SSA. */
+DEFTREECODE (STRUCT_FIELD_TAG, "struct_field_tag", tcc_declaration, 0)
+DEFTREECODE (NAME_MEMORY_TAG, "name_memory_tag", tcc_declaration, 0)
+DEFTREECODE (SYMBOL_MEMORY_TAG, "symbol_memory_tag", tcc_declaration, 0)
+DEFTREECODE (MEMORY_PARTITION_TAG, "memory_partition_tag", tcc_declaration, 0)
+
/* A namespace declaration. Namespaces appear in DECL_CONTEXT of other
_DECLs, providing a hierarchy of names. */
DEFTREECODE (NAMESPACE_DECL, "namespace_decl", tcc_declaration, 0)
/* Constructor: return an aggregate value made from specified components.
In C, this is used only for structure and array initializers.
- The operand is a list of component values made out of a chain of
- TREE_LIST nodes.
+ The operand is a sequence of component values made out of a VEC of
+ struct constructor_elt.
For ARRAY_TYPE:
- The TREE_PURPOSE of each node is the corresponding index.
- If the TREE_PURPOSE is a RANGE_EXPR, it is a short-hand for many nodes,
- one for each index in the range. (If the corresponding TREE_VALUE
+ The field INDEX of each constructor_elt is the corresponding index.
+ If the index is a RANGE_EXPR, it is a short-hand for many nodes,
+ one for each index in the range. (If the corresponding field VALUE
has side-effects, they are evaluated once for each element. Wrap the
value in a SAVE_EXPR if you want to evaluate side effects only once.)
For RECORD_TYPE, UNION_TYPE, or QUAL_UNION_TYPE:
- The TREE_PURPOSE of each node is a FIELD_DECL. */
-DEFTREECODE (CONSTRUCTOR, "constructor", tcc_expression, 1)
+ The field INDEX of each node is a FIELD_DECL. */
+DEFTREECODE (CONSTRUCTOR, "constructor", tcc_exceptional, 0)
/* The expression types are mostly straightforward, with the fourth argument
of DEFTREECODE saying how many operands there are.
DEFTREECODE (MODIFY_EXPR, "modify_expr", tcc_expression, 2)
/* Initialization expression. Operand 0 is the variable to initialize;
- Operand 1 is the initializer. */
+ Operand 1 is the initializer. This differs from MODIFY_EXPR in that any
+ reference to the referent of operand 0 within operand 1 is undefined. */
DEFTREECODE (INIT_EXPR, "init_expr", tcc_expression, 2)
/* For TARGET_EXPR, operand 0 is the target of an initialization,
nodes for the function. */
DEFTREECODE (BIND_EXPR, "bind_expr", tcc_expression, 3)
-/* Function call. Operand 0 is the function.
- Operand 1 is the argument list, a list of expressions
- made out of a chain of TREE_LIST nodes.
- Operand 2 is the static chain argument, or NULL. */
-DEFTREECODE (CALL_EXPR, "call_expr", tcc_expression, 3)
+/* Function call. CALL_EXPRs are represented by variably-sized expression
+ nodes. There are at least three fixed operands. Operand 0 is an
+ INTEGER_CST node containing the total operand count, the number of
+ arguments plus 3. Operand 1 is the function, while operand 2 is
+ is static chain argument, or NULL. The remaining operands are the
+ arguments to the call. */
+DEFTREECODE (CALL_EXPR, "call_expr", tcc_vl_exp, 3)
/* Specify a value to compute along with its corresponding cleanup.
Operand 0 is the cleanup expression.
Used for pointer subtraction in C. */
DEFTREECODE (EXACT_DIV_EXPR, "exact_div_expr", tcc_binary, 2)
-/* Conversion of real to fixed point: four ways to round,
- like the four ways to divide.
- CONVERT_EXPR can also be used to convert a real to an integer,
- and that is what is used in languages that do not have ways of
- specifying which of these is wanted. Maybe these are not needed. */
+/* Conversion of real to fixed point by truncation. */
DEFTREECODE (FIX_TRUNC_EXPR, "fix_trunc_expr", tcc_unary, 1)
-DEFTREECODE (FIX_CEIL_EXPR, "fix_ceil_expr", tcc_unary, 1)
-DEFTREECODE (FIX_FLOOR_EXPR, "fix_floor_expr", tcc_unary, 1)
-DEFTREECODE (FIX_ROUND_EXPR, "fix_round_expr", tcc_unary, 1)
/* Conversion of an integer to a real. */
DEFTREECODE (FLOAT_EXPR, "float_expr", tcc_unary, 1)
OFFSET (integer constant). Corresponding address is
SYMBOL + BASE + STEP * INDEX + OFFSET. Only variations and values valid on
the target are allowed.
+
+ The type of STEP, INDEX and OFFSET is sizetype. The type of BASE is
+ sizetype or a pointer type (if SYMBOL is NULL).
The sixth argument is the reference to the original memory access, which
is preserved for the purposes of the RTL alias analysis. The seventh
DEFTREECODE (TARGET_MEM_REF, "target_mem_ref", tcc_reference, 7)
+/* The ordering of the codes between OMP_PARALLEL and OMP_CRITICAL is
+ exposed to TREE_RANGE_CHECK. */
+/* OpenMP - #pragma omp parallel [clause1 ... clauseN]
+ Operand 0: OMP_PARALLEL_BODY: Code to be executed by all threads.
+ Operand 1: OMP_PARALLEL_CLAUSES: List of clauses.
+ Operand 2: OMP_PARALLEL_FN: FUNCTION_DECL used when outlining the
+ body of the parallel region. Only valid after
+ pass_lower_omp.
+ Operand 3: OMP_PARALLEL_DATA_ARG: Local variable in the parent
+ function containing data to be shared with the child
+ function. */
+
+DEFTREECODE (OMP_PARALLEL, "omp_parallel", tcc_statement, 4)
+
+/* OpenMP - #pragma omp for [clause1 ... clauseN]
+ Operand 0: OMP_FOR_BODY: Loop body.
+ Operand 1: OMP_FOR_CLAUSES: List of clauses.
+ Operand 2: OMP_FOR_INIT: Initialization code of the form
+ VAR = N1.
+ Operand 3: OMP_FOR_COND: Loop conditional expression of the form
+ VAR { <, >, <=, >= } N2.
+ Operand 4: OMP_FOR_INCR: Loop index increment of the form
+ VAR { +=, -= } INCR.
+ Operand 5: OMP_FOR_PRE_BODY: Filled by the gimplifier with things
+ from INIT, COND, and INCR that are technically part of the
+ OMP_FOR structured block, but are evaluated before the loop
+ body begins.
+
+ VAR must be a signed integer variable, which is implicitly thread
+ private. N1, N2 and INCR are required to be loop invariant integer
+ expressions that are evaluated without any synchronization.
+ The evaluation order, frequency of evaluation and side-effects are
+ unspecified by the standard. */
+DEFTREECODE (OMP_FOR, "omp_for", tcc_statement, 6)
+
+/* OpenMP - #pragma omp sections [clause1 ... clauseN]
+ Operand 0: OMP_SECTIONS_BODY: Sections body.
+ Operand 1: OMP_SECTIONS_CLAUSES: List of clauses. */
+DEFTREECODE (OMP_SECTIONS, "omp_sections", tcc_statement, 2)
+
+/* OpenMP - #pragma omp single
+ Operand 0: OMP_SINGLE_BODY: Single section body.
+ Operand 1: OMP_SINGLE_CLAUSES: List of clauses. */
+DEFTREECODE (OMP_SINGLE, "omp_single", tcc_statement, 2)
+
+/* OpenMP - #pragma omp section
+ Operand 0: OMP_SECTION_BODY: Section body. */
+DEFTREECODE (OMP_SECTION, "omp_section", tcc_statement, 1)
+
+/* OpenMP - #pragma omp master
+ Operand 0: OMP_MASTER_BODY: Master section body. */
+DEFTREECODE (OMP_MASTER, "omp_master", tcc_statement, 1)
+
+/* OpenMP - #pragma omp ordered
+ Operand 0: OMP_ORDERED_BODY: Master section body. */
+DEFTREECODE (OMP_ORDERED, "omp_ordered", tcc_statement, 1)
+
+/* OpenMP - #pragma omp critical [name]
+ Operand 0: OMP_CRITICAL_BODY: Critical section body.
+ Operand 1: OMP_CRITICAL_NAME: Identifier for critical section. */
+DEFTREECODE (OMP_CRITICAL, "omp_critical", tcc_statement, 2)
+
+/* Return from an OpenMP directive. */
+DEFTREECODE (OMP_RETURN, "omp_return", tcc_statement, 0)
+
+/* OpenMP - An intermediate tree code to mark the location of the
+ loop or sections iteration in the partially lowered code. */
+DEFTREECODE (OMP_CONTINUE, "omp_continue", tcc_statement, 0)
+
+/* OpenMP - #pragma omp atomic
+ Operand 0: The address at which the atomic operation is to be performed.
+ This address should be stabilized with save_expr.
+ Operand 1: The expression to evaluate. When the old value of the object
+ at the address is used in the expression, it should appear as if
+ build_fold_indirect_ref of the address. */
+DEFTREECODE (OMP_ATOMIC, "omp_atomic", tcc_statement, 2)
+
+/* OpenMP clauses. */
+DEFTREECODE (OMP_CLAUSE, "omp_clause", tcc_exceptional, 0)
+
/* Reduction operations.
Operations that take a vector of elements and "reduce" it to a scalar
result (e.g. summing the elements of the vector, finding the minimum over
DEFTREECODE (REDUC_MIN_EXPR, "reduc_min_expr", tcc_unary, 1)
DEFTREECODE (REDUC_PLUS_EXPR, "reduc_plus_expr", tcc_unary, 1)
-/* Whole vector lesft/right shift in bytes.
+/* Widenning dot-product.
+ The first two arguments are of type t1.
+ The third argument and the result are of type t2, such that t2 is at least
+ twice the size of t1. DOT_PROD_EXPR(arg1,arg2,arg3) is equivalent to:
+ tmp = WIDEN_MULT_EXPR(arg1, arg2);
+ arg3 = PLUS_EXPR (tmp, arg3);
+ or:
+ tmp = WIDEN_MULT_EXPR(arg1, arg2);
+ arg3 = WIDEN_SUM_EXPR (tmp, arg3); */
+DEFTREECODE (DOT_PROD_EXPR, "dot_prod_expr", tcc_expression, 3)
+
+/* Widenning summation.
+ The first argument is of type t1.
+ The second argument is of type t2, such that t2 is at least twice
+ the size of t1. The type of the entire expression is also t2.
+ WIDEN_SUM_EXPR is equivalent to first widening (promoting)
+ the first argument from type t1 to type t2, and then summing it
+ with the second argument. */
+DEFTREECODE (WIDEN_SUM_EXPR, "widen_sum_expr", tcc_binary, 2)
+
+/* Widenning multiplication.
+ The two arguments are of type t1.
+ The result is of type t2, such that t2 is at least twice
+ the size of t1. WIDEN_MULT_EXPR is equivalent to first widening (promoting)
+ the arguments from type t1 to type t2, and then multiplying them. */
+DEFTREECODE (WIDEN_MULT_EXPR, "widen_mult_expr", tcc_binary, 2)
+
+/* Whole vector left/right shift in bits.
Operand 0 is a vector to be shifted.
Operand 1 is an integer shift amount in bits. */
DEFTREECODE (VEC_LSHIFT_EXPR, "vec_lshift_expr", tcc_binary, 2)
DEFTREECODE (VEC_RSHIFT_EXPR, "vec_rshift_expr", tcc_binary, 2)
+\f
+/* GIMPLE tree codes. */
+
+/* Assignment expression. Operand 0 is the what to set; 1, the new value. */
+DEFTREECODE (GIMPLE_MODIFY_STMT, "gimple_modify_stmt", tcc_gimple_stmt, 2)
+
+/* Widening vector multiplication.
+ The two operands are vectors with N elements of size S. Multiplying the
+ elements of the two vectors will result in N products of size 2*S.
+ VEC_WIDEN_MULT_HI_EXPR computes the N/2 high products.
+ VEC_WIDEN_MULT_LO_EXPR computes the N/2 low products. */
+DEFTREECODE (VEC_WIDEN_MULT_HI_EXPR, "widen_mult_hi_expr", tcc_binary, 2)
+DEFTREECODE (VEC_WIDEN_MULT_LO_EXPR, "widen_mult_hi_expr", tcc_binary, 2)
+
+/* Unpack (extract and promote/widen) the high/low elements of the input vector
+ into the output vector. The input vector has twice as many elements
+ as the output vector, that are half the size of the elements
+ of the output vector. This is used to support type promotion. */
+DEFTREECODE (VEC_UNPACK_HI_EXPR, "vec_unpack_hi_expr", tcc_unary, 1)
+DEFTREECODE (VEC_UNPACK_LO_EXPR, "vec_unpack_lo_expr", tcc_unary, 1)
+
+/* Pack (demote/narrow and merge) the elements of the two input vectors
+ into the output vector, using modulo/saturating arithmetic.
+ The elements of the input vectors are twice the size of the elements of the
+ output vector. This is used to support type demotion. */
+DEFTREECODE (VEC_PACK_MOD_EXPR, "vec_pack_mod_expr", tcc_binary, 2)
+DEFTREECODE (VEC_PACK_SAT_EXPR, "vec_pack_sat_expr", tcc_binary, 2)
+
+/* Extract even/odd fields from vectors. */
+DEFTREECODE (VEC_EXTRACT_EVEN_EXPR, "vec_extracteven_expr", tcc_binary, 2)
+DEFTREECODE (VEC_EXTRACT_ODD_EXPR, "vec_extractodd_expr", tcc_binary, 2)
+
+/* Merge input vectors interleaving their fields. */
+DEFTREECODE (VEC_INTERLEAVE_HIGH_EXPR, "vec_interleavehigh_expr", tcc_binary, 2)
+DEFTREECODE (VEC_INTERLEAVE_LOW_EXPR, "vec_interleavelow_expr", tcc_binary, 2)
/*
Local variables: