xref: /dflybsd-src/contrib/gcc-8.0/gcc/tree.def (revision 38fd149817dfbff97799f62fcb70be98c4e32523)
1*38fd1498Szrj/* This file contains the definitions and documentation for the
2*38fd1498Szrj   tree codes used in GCC.
3*38fd1498Szrj   Copyright (C) 1987-2018 Free Software Foundation, Inc.
4*38fd1498Szrj
5*38fd1498SzrjThis file is part of GCC.
6*38fd1498Szrj
7*38fd1498SzrjGCC is free software; you can redistribute it and/or modify it under
8*38fd1498Szrjthe terms of the GNU General Public License as published by the Free
9*38fd1498SzrjSoftware Foundation; either version 3, or (at your option) any later
10*38fd1498Szrjversion.
11*38fd1498Szrj
12*38fd1498SzrjGCC is distributed in the hope that it will be useful, but WITHOUT ANY
13*38fd1498SzrjWARRANTY; without even the implied warranty of MERCHANTABILITY or
14*38fd1498SzrjFITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
15*38fd1498Szrjfor more details.
16*38fd1498Szrj
17*38fd1498SzrjYou should have received a copy of the GNU General Public License
18*38fd1498Szrjalong with GCC; see the file COPYING3.  If not see
19*38fd1498Szrj<http://www.gnu.org/licenses/>.  */
20*38fd1498Szrj
21*38fd1498Szrj
22*38fd1498Szrj/* For tcc_references, tcc_expression, tcc_comparison, tcc_unary,
23*38fd1498Szrj   tcc_binary, and tcc_statement nodes, which use struct tree_exp, the
24*38fd1498Szrj   4th element is the number of argument slots to allocate.  This
25*38fd1498Szrj   determines the size of the tree node object.  Other nodes use
26*38fd1498Szrj   different structures, and the size is determined by the tree_union
27*38fd1498Szrj   member structure; the 4th element should be zero.  Languages that
28*38fd1498Szrj   define language-specific tcc_exceptional or tcc_constant codes must
29*38fd1498Szrj   define the tree_size langhook to say how big they are.
30*38fd1498Szrj
31*38fd1498Szrj   These tree codes have been sorted so that the macros in tree.h that
32*38fd1498Szrj   check for various tree codes are optimized into range checks.  This
33*38fd1498Szrj   gives a measurable performance improvement.  When adding a new
34*38fd1498Szrj   code, consider its placement in relation to the other codes.
35*38fd1498Szrj
36*38fd1498Szrj   When adding a new tree code which might appear as GIMPLE_ASSIGN RHS
37*38fd1498Szrj   code, proper handler in chkp_compute_bounds_for_assignment may
38*38fd1498Szrj   be required.  */
39*38fd1498Szrj
40*38fd1498Szrj/* Any erroneous construct is parsed into a node of this type.
41*38fd1498Szrj   This type of node is accepted without complaint in all contexts
42*38fd1498Szrj   by later parsing activities, to avoid multiple error messages
43*38fd1498Szrj   for one error.
44*38fd1498Szrj   No fields in these nodes are used except the TREE_CODE.  */
45*38fd1498SzrjDEFTREECODE (ERROR_MARK, "error_mark", tcc_exceptional, 0)
46*38fd1498Szrj
47*38fd1498Szrj/* Used to represent a name (such as, in the DECL_NAME of a decl node).
48*38fd1498Szrj   Internally it looks like a STRING_CST node.
49*38fd1498Szrj   There is only one IDENTIFIER_NODE ever made for any particular name.
50*38fd1498Szrj   Use `get_identifier' to get it (or create it, the first time).  */
51*38fd1498SzrjDEFTREECODE (IDENTIFIER_NODE, "identifier_node", tcc_exceptional, 0)
52*38fd1498Szrj
53*38fd1498Szrj/* Has the TREE_VALUE and TREE_PURPOSE fields.  */
54*38fd1498Szrj/* These nodes are made into lists by chaining through the
55*38fd1498Szrj   TREE_CHAIN field.  The elements of the list live in the
56*38fd1498Szrj   TREE_VALUE fields, while TREE_PURPOSE fields are occasionally
57*38fd1498Szrj   used as well to get the effect of Lisp association lists.  */
58*38fd1498SzrjDEFTREECODE (TREE_LIST, "tree_list", tcc_exceptional, 0)
59*38fd1498Szrj
60*38fd1498Szrj/* These nodes contain an array of tree nodes.  */
61*38fd1498SzrjDEFTREECODE (TREE_VEC, "tree_vec", tcc_exceptional, 0)
62*38fd1498Szrj
63*38fd1498Szrj/* A symbol binding block.  These are arranged in a tree,
64*38fd1498Szrj   where the BLOCK_SUBBLOCKS field contains a chain of subblocks
65*38fd1498Szrj   chained through the BLOCK_CHAIN field.
66*38fd1498Szrj   BLOCK_SUPERCONTEXT points to the parent block.
67*38fd1498Szrj     For a block which represents the outermost scope of a function, it
68*38fd1498Szrj     points to the FUNCTION_DECL node.
69*38fd1498Szrj   BLOCK_VARS points to a chain of decl nodes.
70*38fd1498Szrj   BLOCK_CHAIN points to the next BLOCK at the same level.
71*38fd1498Szrj   BLOCK_ABSTRACT_ORIGIN points to the original (abstract) tree node which
72*38fd1498Szrj   this block is an instance of, or else is NULL to indicate that this
73*38fd1498Szrj   block is not an instance of anything else.  When non-NULL, the value
74*38fd1498Szrj   could either point to another BLOCK node or it could point to a
75*38fd1498Szrj   FUNCTION_DECL node (e.g. in the case of a block representing the
76*38fd1498Szrj   outermost scope of a particular inlining of a function).
77*38fd1498Szrj   BLOCK_ABSTRACT is nonzero if the block represents an abstract
78*38fd1498Szrj   instance of a block (i.e. one which is nested within an abstract
79*38fd1498Szrj   instance of an inline function).
80*38fd1498Szrj   TREE_ASM_WRITTEN is nonzero if the block was actually referenced
81*38fd1498Szrj   in the generated assembly.  */
82*38fd1498SzrjDEFTREECODE (BLOCK, "block", tcc_exceptional, 0)
83*38fd1498Szrj
84*38fd1498Szrj/* Each data type is represented by a tree node whose code is one of
85*38fd1498Szrj   the following:  */
86*38fd1498Szrj/* Each node that represents a data type has a component TYPE_SIZE
87*38fd1498Szrj   containing a tree that is an expression for the size in bits.
88*38fd1498Szrj   The TYPE_MODE contains the machine mode for values of this type.
89*38fd1498Szrj   The TYPE_POINTER_TO field contains a type for a pointer to this type,
90*38fd1498Szrj     or zero if no such has been created yet.
91*38fd1498Szrj   The TYPE_NEXT_VARIANT field is used to chain together types
92*38fd1498Szrj     that are variants made by type modifiers such as "const" and "volatile".
93*38fd1498Szrj   The TYPE_MAIN_VARIANT field, in any member of such a chain,
94*38fd1498Szrj     points to the start of the chain.
95*38fd1498Szrj   The TYPE_NAME field contains info on the name used in the program
96*38fd1498Szrj     for this type (for GDB symbol table output).  It is either a
97*38fd1498Szrj     TYPE_DECL node, for types that are typedefs, or an IDENTIFIER_NODE
98*38fd1498Szrj     in the case of structs, unions or enums that are known with a tag,
99*38fd1498Szrj     or zero for types that have no special name.
100*38fd1498Szrj   The TYPE_CONTEXT for any sort of type which could have a name or
101*38fd1498Szrj    which could have named members (e.g. tagged types in C/C++) will
102*38fd1498Szrj    point to the node which represents the scope of the given type, or
103*38fd1498Szrj    will be NULL_TREE if the type has "file scope".  For most types, this
104*38fd1498Szrj    will point to a BLOCK node or a FUNCTION_DECL node, but it could also
105*38fd1498Szrj    point to a FUNCTION_TYPE node (for types whose scope is limited to the
106*38fd1498Szrj    formal parameter list of some function type specification) or it
107*38fd1498Szrj    could point to a RECORD_TYPE, UNION_TYPE or QUAL_UNION_TYPE node
108*38fd1498Szrj    (for C++ "member" types).
109*38fd1498Szrj    For non-tagged-types, TYPE_CONTEXT need not be set to anything in
110*38fd1498Szrj    particular, since any type which is of some type category  (e.g.
111*38fd1498Szrj    an array type or a function type) which cannot either have a name
112*38fd1498Szrj    itself or have named members doesn't really have a "scope" per se.
113*38fd1498Szrj  The TYPE_STUB_DECL field is used as a forward-references to names for
114*38fd1498Szrj    ENUMERAL_TYPE, RECORD_TYPE, UNION_TYPE, and QUAL_UNION_TYPE nodes;
115*38fd1498Szrj    see below.  */
116*38fd1498Szrj
117*38fd1498Szrj/* The ordering of the following codes is optimized for the checking
118*38fd1498Szrj   macros in tree.h.  Changing the order will degrade the speed of the
119*38fd1498Szrj   compiler.  OFFSET_TYPE, ENUMERAL_TYPE, BOOLEAN_TYPE, INTEGER_TYPE,
120*38fd1498Szrj   REAL_TYPE, POINTER_TYPE.  */
121*38fd1498Szrj
122*38fd1498Szrj/* An offset is a pointer relative to an object.
123*38fd1498Szrj   The TREE_TYPE field is the type of the object at the offset.
124*38fd1498Szrj   The TYPE_OFFSET_BASETYPE points to the node for the type of object
125*38fd1498Szrj   that the offset is relative to.  */
126*38fd1498SzrjDEFTREECODE (OFFSET_TYPE, "offset_type", tcc_type, 0)
127*38fd1498Szrj
128*38fd1498Szrj/* C enums.  The type node looks just like an INTEGER_TYPE node.
129*38fd1498Szrj   The symbols for the values of the enum type are defined by
130*38fd1498Szrj   CONST_DECL nodes, but the type does not point to them;
131*38fd1498Szrj   however, the TYPE_VALUES is a list in which each element's TREE_PURPOSE
132*38fd1498Szrj   is a name and the TREE_VALUE is the value (an INTEGER_CST node).  */
133*38fd1498Szrj/* A forward reference `enum foo' when no enum named foo is defined yet
134*38fd1498Szrj   has zero (a null pointer) in its TYPE_SIZE.  The tag name is in
135*38fd1498Szrj   the TYPE_NAME field.  If the type is later defined, the normal
136*38fd1498Szrj   fields are filled in.
137*38fd1498Szrj   RECORD_TYPE, UNION_TYPE, and QUAL_UNION_TYPE forward refs are
138*38fd1498Szrj   treated similarly.  */
139*38fd1498SzrjDEFTREECODE (ENUMERAL_TYPE, "enumeral_type", tcc_type, 0)
140*38fd1498Szrj
141*38fd1498Szrj/* Boolean type (true or false are the only values).  Looks like an
142*38fd1498Szrj   INTEGRAL_TYPE.  */
143*38fd1498SzrjDEFTREECODE (BOOLEAN_TYPE, "boolean_type", tcc_type, 0)
144*38fd1498Szrj
145*38fd1498Szrj/* Integer types in all languages, including char in C.
146*38fd1498Szrj   Also used for sub-ranges of other discrete types.
147*38fd1498Szrj   Has components TYPE_MIN_VALUE, TYPE_MAX_VALUE (expressions, inclusive)
148*38fd1498Szrj   and TYPE_PRECISION (number of bits used by this type).
149*38fd1498Szrj   In the case of a subrange type in Pascal, the TREE_TYPE
150*38fd1498Szrj   of this will point at the supertype (another INTEGER_TYPE,
151*38fd1498Szrj   or an ENUMERAL_TYPE or BOOLEAN_TYPE).
152*38fd1498Szrj   Otherwise, the TREE_TYPE is zero.  */
153*38fd1498SzrjDEFTREECODE (INTEGER_TYPE, "integer_type", tcc_type, 0)
154*38fd1498Szrj
155*38fd1498Szrj/* C's float and double.  Different floating types are distinguished
156*38fd1498Szrj   by machine mode and by the TYPE_SIZE and the TYPE_PRECISION.  */
157*38fd1498SzrjDEFTREECODE (REAL_TYPE, "real_type", tcc_type, 0)
158*38fd1498Szrj
159*38fd1498Szrj/* The ordering of the following codes is optimized for the checking
160*38fd1498Szrj   macros in tree.h.  Changing the order will degrade the speed of the
161*38fd1498Szrj   compiler.  POINTER_TYPE, REFERENCE_TYPE.  Note that this range
162*38fd1498Szrj   overlaps the previous range of ordered types.  */
163*38fd1498Szrj
164*38fd1498Szrj/* All pointer-to-x types have code POINTER_TYPE.
165*38fd1498Szrj   The TREE_TYPE points to the node for the type pointed to.  */
166*38fd1498SzrjDEFTREECODE (POINTER_TYPE, "pointer_type", tcc_type, 0)
167*38fd1498Szrj
168*38fd1498Szrj/* A reference is like a pointer except that it is coerced
169*38fd1498Szrj   automatically to the value it points to.  Used in C++.  */
170*38fd1498SzrjDEFTREECODE (REFERENCE_TYPE, "reference_type", tcc_type, 0)
171*38fd1498Szrj
172*38fd1498Szrj/* The C++ decltype(nullptr) type.  */
173*38fd1498SzrjDEFTREECODE (NULLPTR_TYPE, "nullptr_type", tcc_type, 0)
174*38fd1498Szrj
175*38fd1498Szrj/* _Fract and _Accum types in Embedded-C.  Different fixed-point types
176*38fd1498Szrj   are distinguished by machine mode and by the TYPE_SIZE and the
177*38fd1498Szrj   TYPE_PRECISION.  */
178*38fd1498SzrjDEFTREECODE (FIXED_POINT_TYPE, "fixed_point_type", tcc_type, 0)
179*38fd1498Szrj
180*38fd1498Szrj/* The ordering of the following codes is optimized for the checking
181*38fd1498Szrj   macros in tree.h.  Changing the order will degrade the speed of the
182*38fd1498Szrj   compiler.  COMPLEX_TYPE, VECTOR_TYPE, ARRAY_TYPE.  */
183*38fd1498Szrj
184*38fd1498Szrj/* Complex number types.  The TREE_TYPE field is the data type
185*38fd1498Szrj   of the real and imaginary parts.  It must be of scalar
186*38fd1498Szrj   arithmetic type, not including pointer type.  */
187*38fd1498SzrjDEFTREECODE (COMPLEX_TYPE, "complex_type", tcc_type, 0)
188*38fd1498Szrj
189*38fd1498Szrj/* Vector types.  The TREE_TYPE field is the data type of the vector
190*38fd1498Szrj   elements.  The TYPE_PRECISION field is the number of subparts of
191*38fd1498Szrj   the vector.  */
192*38fd1498SzrjDEFTREECODE (VECTOR_TYPE, "vector_type", tcc_type, 0)
193*38fd1498Szrj
194*38fd1498Szrj/* The ordering of the following codes is optimized for the checking
195*38fd1498Szrj   macros in tree.h.  Changing the order will degrade the speed of the
196*38fd1498Szrj   compiler.  ARRAY_TYPE, RECORD_TYPE, UNION_TYPE, QUAL_UNION_TYPE.
197*38fd1498Szrj   Note that this range overlaps the previous range.  */
198*38fd1498Szrj
199*38fd1498Szrj/* Types of arrays.  Special fields:
200*38fd1498Szrj   TREE_TYPE		  Type of an array element.
201*38fd1498Szrj   TYPE_DOMAIN		  Type to index by.
202*38fd1498Szrj			    Its range of values specifies the array length.
203*38fd1498Szrj The field TYPE_POINTER_TO (TREE_TYPE (array_type)) is always nonzero
204*38fd1498Szrj and holds the type to coerce a value of that array type to in C.
205*38fd1498Szrj TYPE_STRING_FLAG indicates a string (in contrast to an array of chars)
206*38fd1498Szrj in languages (such as Chill) that make a distinction.  */
207*38fd1498Szrj/* Array types in C or Pascal */
208*38fd1498SzrjDEFTREECODE (ARRAY_TYPE, "array_type", tcc_type, 0)
209*38fd1498Szrj
210*38fd1498Szrj/* Struct in C, or record in Pascal.  */
211*38fd1498Szrj/* Special fields:
212*38fd1498Szrj   TYPE_FIELDS  chain of FIELD_DECLs for the fields of the struct,
213*38fd1498Szrj     VAR_DECLs, TYPE_DECLs and CONST_DECLs for record-scope variables,
214*38fd1498Szrj     types and enumerators and FUNCTION_DECLs for methods associated
215*38fd1498Szrj     with the type.
216*38fd1498Szrj   A few may need to be added for Pascal.  */
217*38fd1498Szrj/* See the comment above, before ENUMERAL_TYPE, for how
218*38fd1498Szrj   forward references to struct tags are handled in C.  */
219*38fd1498SzrjDEFTREECODE (RECORD_TYPE, "record_type", tcc_type, 0)
220*38fd1498Szrj
221*38fd1498Szrj/* Union in C.  Like a struct, except that the offsets of the fields
222*38fd1498Szrj   will all be zero.  */
223*38fd1498Szrj/* See the comment above, before ENUMERAL_TYPE, for how
224*38fd1498Szrj   forward references to union tags are handled in C.  */
225*38fd1498SzrjDEFTREECODE (UNION_TYPE, "union_type", tcc_type, 0)	/* C union type */
226*38fd1498Szrj
227*38fd1498Szrj/* Similar to UNION_TYPE, except that the expressions in DECL_QUALIFIER
228*38fd1498Szrj   in each FIELD_DECL determine what the union contains.  The first
229*38fd1498Szrj   field whose DECL_QUALIFIER expression is true is deemed to occupy
230*38fd1498Szrj   the union.  */
231*38fd1498SzrjDEFTREECODE (QUAL_UNION_TYPE, "qual_union_type", tcc_type, 0)
232*38fd1498Szrj
233*38fd1498Szrj/* The ordering of the following codes is optimized for the checking
234*38fd1498Szrj   macros in tree.h.  Changing the order will degrade the speed of the
235*38fd1498Szrj   compiler.  VOID_TYPE, FUNCTION_TYPE, METHOD_TYPE.  */
236*38fd1498Szrj
237*38fd1498Szrj/* The void type in C */
238*38fd1498SzrjDEFTREECODE (VOID_TYPE, "void_type", tcc_type, 0)
239*38fd1498Szrj
240*38fd1498Szrj/* Type to hold bounds for a pointer.
241*38fd1498Szrj   Has TYPE_PRECISION component to specify number of bits used
242*38fd1498Szrj   by this type.  */
243*38fd1498SzrjDEFTREECODE (POINTER_BOUNDS_TYPE, "pointer_bounds_type", tcc_type, 0)
244*38fd1498Szrj
245*38fd1498Szrj/* Type of functions.  Special fields:
246*38fd1498Szrj   TREE_TYPE		    type of value returned.
247*38fd1498Szrj   TYPE_ARG_TYPES      list of types of arguments expected.
248*38fd1498Szrj	this list is made of TREE_LIST nodes.
249*38fd1498Szrj	In this list TREE_PURPOSE can be used to indicate the default
250*38fd1498Szrj	value of parameter (used by C++ frontend).
251*38fd1498Szrj   Types of "Procedures" in languages where they are different from functions
252*38fd1498Szrj   have code FUNCTION_TYPE also, but then TREE_TYPE is zero or void type.  */
253*38fd1498SzrjDEFTREECODE (FUNCTION_TYPE, "function_type", tcc_type, 0)
254*38fd1498Szrj
255*38fd1498Szrj/* METHOD_TYPE is the type of a function which takes an extra first
256*38fd1498Szrj   argument for "self", which is not present in the declared argument list.
257*38fd1498Szrj   The TREE_TYPE is the return type of the method.  The TYPE_METHOD_BASETYPE
258*38fd1498Szrj   is the type of "self".  TYPE_ARG_TYPES is the real argument list, which
259*38fd1498Szrj   includes the hidden argument for "self".  */
260*38fd1498SzrjDEFTREECODE (METHOD_TYPE, "method_type", tcc_type, 0)
261*38fd1498Szrj
262*38fd1498Szrj/* This is a language-specific kind of type.
263*38fd1498Szrj   Its meaning is defined by the language front end.
264*38fd1498Szrj   layout_type does not know how to lay this out,
265*38fd1498Szrj   so the front-end must do so manually.  */
266*38fd1498SzrjDEFTREECODE (LANG_TYPE, "lang_type", tcc_type, 0)
267*38fd1498Szrj
268*38fd1498Szrj/* Expressions */
269*38fd1498Szrj
270*38fd1498Szrj/* First, the constants.  */
271*38fd1498Szrj
272*38fd1498SzrjDEFTREECODE (VOID_CST, "void_cst", tcc_constant, 0)
273*38fd1498Szrj
274*38fd1498Szrj/* Contents are in an array of HOST_WIDE_INTs.
275*38fd1498Szrj
276*38fd1498Szrj   We often access these constants both in their native precision and
277*38fd1498Szrj   in wider precisions (with the constant being implicitly extended
278*38fd1498Szrj   according to TYPE_SIGN).  In each case, the useful part of the array
279*38fd1498Szrj   may be as wide as the precision requires but may be shorter when all
280*38fd1498Szrj   of the upper bits are sign bits.  The length of the array when accessed
281*38fd1498Szrj   in the constant's native precision is given by TREE_INT_CST_NUNITS.
282*38fd1498Szrj   The length of the array when accessed in wider precisions is given
283*38fd1498Szrj   by TREE_INT_CST_EXT_NUNITS.  Each element can be obtained using
284*38fd1498Szrj   TREE_INT_CST_ELT.
285*38fd1498Szrj
286*38fd1498Szrj   INTEGER_CST nodes can be shared, and therefore should be considered
287*38fd1498Szrj   read only.  They should be copied before setting a flag such as
288*38fd1498Szrj   TREE_OVERFLOW.  If an INTEGER_CST has TREE_OVERFLOW already set,
289*38fd1498Szrj   it is known to be unique.  INTEGER_CST nodes are created for the
290*38fd1498Szrj   integral types, for pointer types and for vector and float types in
291*38fd1498Szrj   some circumstances.  */
292*38fd1498SzrjDEFTREECODE (INTEGER_CST, "integer_cst", tcc_constant, 0)
293*38fd1498Szrj
294*38fd1498Szrj/* Contents are given by POLY_INT_CST_COEFF.  */
295*38fd1498SzrjDEFTREECODE (POLY_INT_CST, "poly_int_cst", tcc_constant, 0)
296*38fd1498Szrj
297*38fd1498Szrj/* Contents are in TREE_REAL_CST field.  */
298*38fd1498SzrjDEFTREECODE (REAL_CST, "real_cst", tcc_constant, 0)
299*38fd1498Szrj
300*38fd1498Szrj/* Contents are in TREE_FIXED_CST field.  */
301*38fd1498SzrjDEFTREECODE (FIXED_CST, "fixed_cst", tcc_constant, 0)
302*38fd1498Szrj
303*38fd1498Szrj/* Contents are in TREE_REALPART and TREE_IMAGPART fields,
304*38fd1498Szrj   whose contents are other constant nodes.  */
305*38fd1498SzrjDEFTREECODE (COMPLEX_CST, "complex_cst", tcc_constant, 0)
306*38fd1498Szrj
307*38fd1498Szrj/* See generic.texi for details.  */
308*38fd1498SzrjDEFTREECODE (VECTOR_CST, "vector_cst", tcc_constant, 0)
309*38fd1498Szrj
310*38fd1498Szrj/* Contents are TREE_STRING_LENGTH and the actual contents of the string.  */
311*38fd1498SzrjDEFTREECODE (STRING_CST, "string_cst", tcc_constant, 0)
312*38fd1498Szrj
313*38fd1498Szrj/* Declarations.  All references to names are represented as ..._DECL
314*38fd1498Szrj   nodes.  The decls in one binding context are chained through the
315*38fd1498Szrj   TREE_CHAIN field.  Each DECL has a DECL_NAME field which contains
316*38fd1498Szrj   an IDENTIFIER_NODE.  (Some decls, most often labels, may have zero
317*38fd1498Szrj   as the DECL_NAME).  DECL_CONTEXT points to the node representing
318*38fd1498Szrj   the context in which this declaration has its scope.  For
319*38fd1498Szrj   FIELD_DECLs, this is the RECORD_TYPE, UNION_TYPE, or
320*38fd1498Szrj   QUAL_UNION_TYPE node that the field is a member of.  For VAR_DECL,
321*38fd1498Szrj   PARM_DECL, FUNCTION_DECL, LABEL_DECL, and CONST_DECL nodes, this
322*38fd1498Szrj   points to either the FUNCTION_DECL for the containing function, the
323*38fd1498Szrj   RECORD_TYPE or UNION_TYPE for the containing type, or NULL_TREE or
324*38fd1498Szrj   a TRANSLATION_UNIT_DECL if the given decl has "file scope".
325*38fd1498Szrj   DECL_ABSTRACT_ORIGIN, if non-NULL, points to the original (abstract)
326*38fd1498Szrj    ..._DECL node of which this decl is an (inlined or template expanded)
327*38fd1498Szrj    instance.
328*38fd1498Szrj   The TREE_TYPE field holds the data type of the object, when relevant.
329*38fd1498Szrj    LABEL_DECLs have no data type.  For TYPE_DECL, the TREE_TYPE field
330*38fd1498Szrj    contents are the type whose name is being declared.
331*38fd1498Szrj   The DECL_ALIGN, DECL_SIZE,
332*38fd1498Szrj    and DECL_MODE fields exist in decl nodes just as in type nodes.
333*38fd1498Szrj    They are unused in LABEL_DECL, TYPE_DECL and CONST_DECL nodes.
334*38fd1498Szrj
335*38fd1498Szrj   DECL_FIELD_BIT_OFFSET holds an integer number of bits offset for
336*38fd1498Szrj   the location.  DECL_VOFFSET holds an expression for a variable
337*38fd1498Szrj   offset; it is to be multiplied by DECL_VOFFSET_UNIT (an integer).
338*38fd1498Szrj   These fields are relevant only in FIELD_DECLs and PARM_DECLs.
339*38fd1498Szrj
340*38fd1498Szrj   DECL_INITIAL holds the value to initialize a variable to,
341*38fd1498Szrj   or the value of a constant.  For a function, it holds the body
342*38fd1498Szrj   (a node of type BLOCK representing the function's binding contour
343*38fd1498Szrj   and whose body contains the function's statements.)  For a LABEL_DECL
344*38fd1498Szrj   in C, it is a flag, nonzero if the label's definition has been seen.
345*38fd1498Szrj
346*38fd1498Szrj   PARM_DECLs use a special field:
347*38fd1498Szrj   DECL_ARG_TYPE is the type in which the argument is actually
348*38fd1498Szrj    passed, which may be different from its type within the function.
349*38fd1498Szrj
350*38fd1498Szrj   FUNCTION_DECLs use four special fields:
351*38fd1498Szrj   DECL_ARGUMENTS holds a chain of PARM_DECL nodes for the arguments.
352*38fd1498Szrj   DECL_RESULT holds a RESULT_DECL node for the value of a function.
353*38fd1498Szrj    The DECL_RTL field is 0 for a function that returns no value.
354*38fd1498Szrj    (C functions returning void have zero here.)
355*38fd1498Szrj    The TREE_TYPE field is the type in which the result is actually
356*38fd1498Szrj    returned.  This is usually the same as the return type of the
357*38fd1498Szrj    FUNCTION_DECL, but it may be a wider integer type because of
358*38fd1498Szrj    promotion.
359*38fd1498Szrj   DECL_FUNCTION_CODE is a code number that is nonzero for
360*38fd1498Szrj    built-in functions.  Its value is an enum built_in_function
361*38fd1498Szrj    that says which built-in function it is.
362*38fd1498Szrj
363*38fd1498Szrj   DECL_SOURCE_FILE holds a filename string and DECL_SOURCE_LINE
364*38fd1498Szrj   holds a line number.  In some cases these can be the location of
365*38fd1498Szrj   a reference, if no definition has been seen.
366*38fd1498Szrj
367*38fd1498Szrj   DECL_ABSTRACT is nonzero if the decl represents an abstract instance
368*38fd1498Szrj   of a decl (i.e. one which is nested within an abstract instance of a
369*38fd1498Szrj   inline function.  */
370*38fd1498Szrj
371*38fd1498SzrjDEFTREECODE (FUNCTION_DECL, "function_decl", tcc_declaration, 0)
372*38fd1498SzrjDEFTREECODE (LABEL_DECL, "label_decl", tcc_declaration, 0)
373*38fd1498Szrj/* The ordering of the following codes is optimized for the checking
374*38fd1498Szrj   macros in tree.h.  Changing the order will degrade the speed of the
375*38fd1498Szrj   compiler.  FIELD_DECL, VAR_DECL, CONST_DECL, PARM_DECL,
376*38fd1498Szrj   TYPE_DECL.  */
377*38fd1498SzrjDEFTREECODE (FIELD_DECL, "field_decl", tcc_declaration, 0)
378*38fd1498SzrjDEFTREECODE (VAR_DECL, "var_decl", tcc_declaration, 0)
379*38fd1498SzrjDEFTREECODE (CONST_DECL, "const_decl", tcc_declaration, 0)
380*38fd1498SzrjDEFTREECODE (PARM_DECL, "parm_decl", tcc_declaration, 0)
381*38fd1498SzrjDEFTREECODE (TYPE_DECL, "type_decl", tcc_declaration, 0)
382*38fd1498SzrjDEFTREECODE (RESULT_DECL, "result_decl", tcc_declaration, 0)
383*38fd1498Szrj
384*38fd1498Szrj/* A "declaration" of a debug temporary.  It should only appear in
385*38fd1498Szrj   DEBUG stmts.  */
386*38fd1498SzrjDEFTREECODE (DEBUG_EXPR_DECL, "debug_expr_decl", tcc_declaration, 0)
387*38fd1498Szrj
388*38fd1498Szrj/* A stmt that marks the beginning of a source statement.  */
389*38fd1498SzrjDEFTREECODE (DEBUG_BEGIN_STMT, "debug_begin_stmt", tcc_statement, 0)
390*38fd1498Szrj
391*38fd1498Szrj/* A namespace declaration.  Namespaces appear in DECL_CONTEXT of other
392*38fd1498Szrj   _DECLs, providing a hierarchy of names.  */
393*38fd1498SzrjDEFTREECODE (NAMESPACE_DECL, "namespace_decl", tcc_declaration, 0)
394*38fd1498Szrj
395*38fd1498Szrj/* A declaration import.
396*38fd1498Szrj   The C++ FE uses this to represent a using-directive; eg:
397*38fd1498Szrj   "using namespace foo".
398*38fd1498Szrj   But it could be used to represent any declaration import construct.
399*38fd1498Szrj   Whenever a declaration import appears in a lexical block, the BLOCK node
400*38fd1498Szrj   representing that lexical block in GIMPLE will contain an IMPORTED_DECL
401*38fd1498Szrj   node, linked via BLOCK_VARS accessor of the said BLOCK.
402*38fd1498Szrj   For a given NODE which code is IMPORTED_DECL,
403*38fd1498Szrj   IMPORTED_DECL_ASSOCIATED_DECL (NODE) accesses the imported declaration.  */
404*38fd1498SzrjDEFTREECODE (IMPORTED_DECL, "imported_decl", tcc_declaration, 0)
405*38fd1498Szrj
406*38fd1498Szrj/* A namelist declaration.
407*38fd1498Szrj   The Fortran FE uses this to represent a namelist statement, e.g.:
408*38fd1498Szrj   NAMELIST /namelist-group-name/ namelist-group-object-list.
409*38fd1498Szrj   Whenever a declaration import appears in a lexical block, the BLOCK node
410*38fd1498Szrj   representing that lexical block in GIMPLE will contain an NAMELIST_DECL
411*38fd1498Szrj   node, linked via BLOCK_VARS accessor of the said BLOCK.
412*38fd1498Szrj   For a given NODE which code is NAMELIST_DECL,
413*38fd1498Szrj   NAMELIST_DECL_ASSOCIATED_DECL (NODE) accesses the imported declaration.  */
414*38fd1498SzrjDEFTREECODE (NAMELIST_DECL, "namelist_decl", tcc_declaration, 0)
415*38fd1498Szrj
416*38fd1498Szrj/* A translation unit.  This is not technically a declaration, since it
417*38fd1498Szrj   can't be looked up, but it's close enough.  */
418*38fd1498SzrjDEFTREECODE (TRANSLATION_UNIT_DECL, "translation_unit_decl",\
419*38fd1498Szrj	     tcc_declaration, 0)
420*38fd1498Szrj
421*38fd1498Szrj/* References to storage.  */
422*38fd1498Szrj
423*38fd1498Szrj/* The ordering of the following codes is optimized for the classification
424*38fd1498Szrj   in handled_component_p.  Keep them in a consecutive group.  */
425*38fd1498Szrj
426*38fd1498Szrj/* Value is structure or union component.
427*38fd1498Szrj   Operand 0 is the structure or union (an expression).
428*38fd1498Szrj   Operand 1 is the field (a node of type FIELD_DECL).
429*38fd1498Szrj   Operand 2, if present, is the value of DECL_FIELD_OFFSET, measured
430*38fd1498Szrj   in units of DECL_OFFSET_ALIGN / BITS_PER_UNIT.  */
431*38fd1498SzrjDEFTREECODE (COMPONENT_REF, "component_ref", tcc_reference, 3)
432*38fd1498Szrj
433*38fd1498Szrj/* Reference to a group of bits within an object.  Similar to COMPONENT_REF
434*38fd1498Szrj   except the position is given explicitly rather than via a FIELD_DECL.
435*38fd1498Szrj   Operand 0 is the structure or union expression;
436*38fd1498Szrj   operand 1 is a tree giving the constant number of bits being referenced;
437*38fd1498Szrj   operand 2 is a tree giving the constant position of the first referenced bit.
438*38fd1498Szrj   The result type width has to match the number of bits referenced.
439*38fd1498Szrj   If the result type is integral, its signedness specifies how it is extended
440*38fd1498Szrj   to its mode width.  */
441*38fd1498SzrjDEFTREECODE (BIT_FIELD_REF, "bit_field_ref", tcc_reference, 3)
442*38fd1498Szrj
443*38fd1498Szrj/* Array indexing.
444*38fd1498Szrj   Operand 0 is the array; operand 1 is a (single) array index.
445*38fd1498Szrj   Operand 2, if present, is a copy of TYPE_MIN_VALUE of the index.
446*38fd1498Szrj   Operand 3, if present, is the element size, measured in units of
447*38fd1498Szrj   the alignment of the element type.  */
448*38fd1498SzrjDEFTREECODE (ARRAY_REF, "array_ref", tcc_reference, 4)
449*38fd1498Szrj
450*38fd1498Szrj/* Likewise, except that the result is a range ("slice") of the array.  The
451*38fd1498Szrj   starting index of the resulting array is taken from operand 1 and the size
452*38fd1498Szrj   of the range is taken from the type of the expression.  */
453*38fd1498SzrjDEFTREECODE (ARRAY_RANGE_REF, "array_range_ref", tcc_reference, 4)
454*38fd1498Szrj
455*38fd1498Szrj/* Used only on an operand of complex type, these return
456*38fd1498Szrj   a value of the corresponding component type.  */
457*38fd1498SzrjDEFTREECODE (REALPART_EXPR, "realpart_expr", tcc_reference, 1)
458*38fd1498SzrjDEFTREECODE (IMAGPART_EXPR, "imagpart_expr", tcc_reference, 1)
459*38fd1498Szrj
460*38fd1498Szrj/* Represents viewing something of one type as being of a second type.
461*38fd1498Szrj   This corresponds to an "Unchecked Conversion" in Ada and roughly to
462*38fd1498Szrj   the idiom *(type2 *)&X in C.  The only operand is the value to be
463*38fd1498Szrj   viewed as being of another type.  It is undefined if the type of the
464*38fd1498Szrj   input and of the expression have different sizes.
465*38fd1498Szrj
466*38fd1498Szrj   This code may also be used within the LHS of a MODIFY_EXPR, in which
467*38fd1498Szrj   case no actual data motion may occur.  TREE_ADDRESSABLE will be set in
468*38fd1498Szrj   this case and GCC must abort if it could not do the operation without
469*38fd1498Szrj   generating insns.  */
470*38fd1498SzrjDEFTREECODE (VIEW_CONVERT_EXPR, "view_convert_expr", tcc_reference, 1)
471*38fd1498Szrj
472*38fd1498Szrj/* C unary `*' or Pascal `^'.  One operand, an expression for a pointer.  */
473*38fd1498SzrjDEFTREECODE (INDIRECT_REF, "indirect_ref", tcc_reference, 1)
474*38fd1498Szrj
475*38fd1498Szrj/* Used to represent lookup in a virtual method table which is dependent on
476*38fd1498Szrj   the runtime type of an object.  Operands are:
477*38fd1498Szrj   OBJ_TYPE_REF_EXPR: An expression that evaluates the value to use.
478*38fd1498Szrj   OBJ_TYPE_REF_OBJECT: Is the object on whose behalf the lookup is
479*38fd1498Szrj   being performed.  Through this the optimizers may be able to statically
480*38fd1498Szrj   determine the dynamic type of the object.
481*38fd1498Szrj   OBJ_TYPE_REF_TOKEN: An integer index to the virtual method table.  */
482*38fd1498SzrjDEFTREECODE (OBJ_TYPE_REF, "obj_type_ref", tcc_expression, 3)
483*38fd1498Szrj
484*38fd1498Szrj/* Used to represent the brace-enclosed initializers for a structure or an
485*38fd1498Szrj   array.  It contains a sequence of component values made out of a VEC of
486*38fd1498Szrj   constructor_elt.
487*38fd1498Szrj
488*38fd1498Szrj   For RECORD_TYPE, UNION_TYPE, or QUAL_UNION_TYPE:
489*38fd1498Szrj   The field INDEX of each constructor_elt is a FIELD_DECL.
490*38fd1498Szrj
491*38fd1498Szrj   For ARRAY_TYPE:
492*38fd1498Szrj   The field INDEX of each constructor_elt is the corresponding index.
493*38fd1498Szrj   If the index is a RANGE_EXPR, it is a short-hand for many nodes,
494*38fd1498Szrj   one for each index in the range.  (If the corresponding field VALUE
495*38fd1498Szrj   has side-effects, they are evaluated once for each element.  Wrap the
496*38fd1498Szrj   value in a SAVE_EXPR if you want to evaluate side effects only once.)
497*38fd1498Szrj
498*38fd1498Szrj   Components that aren't present are cleared as per the C semantics,
499*38fd1498Szrj   unless the CONSTRUCTOR_NO_CLEARING flag is set, in which case their
500*38fd1498Szrj   value becomes undefined.  */
501*38fd1498SzrjDEFTREECODE (CONSTRUCTOR, "constructor", tcc_exceptional, 0)
502*38fd1498Szrj
503*38fd1498Szrj/* The expression types are mostly straightforward, with the fourth argument
504*38fd1498Szrj   of DEFTREECODE saying how many operands there are.
505*38fd1498Szrj   Unless otherwise specified, the operands are expressions and the
506*38fd1498Szrj   types of all the operands and the expression must all be the same.  */
507*38fd1498Szrj
508*38fd1498Szrj/* Contains two expressions to compute, one followed by the other.
509*38fd1498Szrj   the first value is ignored.  The second one's value is used.  The
510*38fd1498Szrj   type of the first expression need not agree with the other types.  */
511*38fd1498SzrjDEFTREECODE (COMPOUND_EXPR, "compound_expr", tcc_expression, 2)
512*38fd1498Szrj
513*38fd1498Szrj/* Assignment expression.  Operand 0 is the what to set; 1, the new value.  */
514*38fd1498SzrjDEFTREECODE (MODIFY_EXPR, "modify_expr", tcc_expression, 2)
515*38fd1498Szrj
516*38fd1498Szrj/* Initialization expression.  Operand 0 is the variable to initialize;
517*38fd1498Szrj   Operand 1 is the initializer.  This differs from MODIFY_EXPR in that any
518*38fd1498Szrj   reference to the referent of operand 0 within operand 1 is undefined.  */
519*38fd1498SzrjDEFTREECODE (INIT_EXPR, "init_expr", tcc_expression, 2)
520*38fd1498Szrj
521*38fd1498Szrj/* For TARGET_EXPR, operand 0 is the target of an initialization,
522*38fd1498Szrj   operand 1 is the initializer for the target, which may be void
523*38fd1498Szrj     if simply expanding it initializes the target.
524*38fd1498Szrj   operand 2 is the cleanup for this node, if any.
525*38fd1498Szrj   operand 3 is the saved initializer after this node has been
526*38fd1498Szrj   expanded once; this is so we can re-expand the tree later.  */
527*38fd1498SzrjDEFTREECODE (TARGET_EXPR, "target_expr", tcc_expression, 4)
528*38fd1498Szrj
529*38fd1498Szrj/* Conditional expression ( ... ? ... : ...  in C).
530*38fd1498Szrj   Operand 0 is the condition.
531*38fd1498Szrj   Operand 1 is the then-value.
532*38fd1498Szrj   Operand 2 is the else-value.
533*38fd1498Szrj   Operand 0 may be of any type.
534*38fd1498Szrj   Operand 1 must have the same type as the entire expression, unless
535*38fd1498Szrj   it unconditionally throws an exception, in which case it should
536*38fd1498Szrj   have VOID_TYPE.  The same constraints apply to operand 2.  The
537*38fd1498Szrj   condition in operand 0 must be of integral type.
538*38fd1498Szrj
539*38fd1498Szrj   In cfg gimple, if you do not have a selection expression, operands
540*38fd1498Szrj   1 and 2 are NULL.  The operands are then taken from the cfg edges. */
541*38fd1498SzrjDEFTREECODE (COND_EXPR, "cond_expr", tcc_expression, 3)
542*38fd1498Szrj
543*38fd1498Szrj/* Represents a vector in which every element is equal to operand 0.  */
544*38fd1498SzrjDEFTREECODE (VEC_DUPLICATE_EXPR, "vec_duplicate_expr", tcc_unary, 1)
545*38fd1498Szrj
546*38fd1498Szrj/* Vector series created from a start (base) value and a step.
547*38fd1498Szrj
548*38fd1498Szrj   A = VEC_SERIES_EXPR (B, C)
549*38fd1498Szrj
550*38fd1498Szrj   means
551*38fd1498Szrj
552*38fd1498Szrj   for (i = 0; i < N; i++)
553*38fd1498Szrj     A[i] = B + C * i;  */
554*38fd1498SzrjDEFTREECODE (VEC_SERIES_EXPR, "vec_series_expr", tcc_binary, 2)
555*38fd1498Szrj
556*38fd1498Szrj/* Vector conditional expression. It is like COND_EXPR, but with
557*38fd1498Szrj   vector operands.
558*38fd1498Szrj
559*38fd1498Szrj   A = VEC_COND_EXPR ( X < Y, B, C)
560*38fd1498Szrj
561*38fd1498Szrj   means
562*38fd1498Szrj
563*38fd1498Szrj   for (i=0; i<N; i++)
564*38fd1498Szrj     A[i] = X[i] < Y[i] ? B[i] : C[i];
565*38fd1498Szrj*/
566*38fd1498SzrjDEFTREECODE (VEC_COND_EXPR, "vec_cond_expr", tcc_expression, 3)
567*38fd1498Szrj
568*38fd1498Szrj/* Vector permutation expression.  A = VEC_PERM_EXPR<v0, v1, mask> means
569*38fd1498Szrj
570*38fd1498Szrj   N = length(mask)
571*38fd1498Szrj   foreach i in N:
572*38fd1498Szrj     M = mask[i] % (2*N)
573*38fd1498Szrj     A = M < N ? v0[M] : v1[M-N]
574*38fd1498Szrj
575*38fd1498Szrj   V0 and V1 are vectors of the same type.  MASK is an integer-typed
576*38fd1498Szrj   vector.  The number of MASK elements must be the same with the
577*38fd1498Szrj   number of elements in V0 and V1.  The size of the inner type
578*38fd1498Szrj   of the MASK and of the V0 and V1 must be the same.
579*38fd1498Szrj*/
580*38fd1498SzrjDEFTREECODE (VEC_PERM_EXPR, "vec_perm_expr", tcc_expression, 3)
581*38fd1498Szrj
582*38fd1498Szrj/* Declare local variables, including making RTL and allocating space.
583*38fd1498Szrj   BIND_EXPR_VARS is a chain of VAR_DECL nodes for the variables.
584*38fd1498Szrj   BIND_EXPR_BODY is the body, the expression to be computed using
585*38fd1498Szrj   the variables.  The value of operand 1 becomes that of the BIND_EXPR.
586*38fd1498Szrj   BIND_EXPR_BLOCK is the BLOCK that corresponds to these bindings
587*38fd1498Szrj   for debugging purposes.  If this BIND_EXPR is actually expanded,
588*38fd1498Szrj   that sets the TREE_USED flag in the BLOCK.
589*38fd1498Szrj
590*38fd1498Szrj   The BIND_EXPR is not responsible for informing parsers
591*38fd1498Szrj   about these variables.  If the body is coming from the input file,
592*38fd1498Szrj   then the code that creates the BIND_EXPR is also responsible for
593*38fd1498Szrj   informing the parser of the variables.
594*38fd1498Szrj
595*38fd1498Szrj   If the BIND_EXPR is ever expanded, its TREE_USED flag is set.
596*38fd1498Szrj   This tells the code for debugging symbol tables not to ignore the BIND_EXPR.
597*38fd1498Szrj   If the BIND_EXPR should be output for debugging but will not be expanded,
598*38fd1498Szrj   set the TREE_USED flag by hand.
599*38fd1498Szrj
600*38fd1498Szrj   In order for the BIND_EXPR to be known at all, the code that creates it
601*38fd1498Szrj   must also install it as a subblock in the tree of BLOCK
602*38fd1498Szrj   nodes for the function.  */
603*38fd1498SzrjDEFTREECODE (BIND_EXPR, "bind_expr", tcc_expression, 3)
604*38fd1498Szrj
605*38fd1498Szrj/* Function call.  CALL_EXPRs are represented by variably-sized expression
606*38fd1498Szrj   nodes.  There are at least three fixed operands.  Operand 0 is an
607*38fd1498Szrj   INTEGER_CST node containing the total operand count, the number of
608*38fd1498Szrj   arguments plus 3.  Operand 1 is the function or NULL, while operand 2 is
609*38fd1498Szrj   is static chain argument, or NULL.  The remaining operands are the
610*38fd1498Szrj   arguments to the call.  */
611*38fd1498SzrjDEFTREECODE (CALL_EXPR, "call_expr", tcc_vl_exp, 3)
612*38fd1498Szrj
613*38fd1498Szrj/* Specify a value to compute along with its corresponding cleanup.
614*38fd1498Szrj   Operand 0 is the cleanup expression.
615*38fd1498Szrj   The cleanup is executed by the first enclosing CLEANUP_POINT_EXPR,
616*38fd1498Szrj   which must exist.  This differs from TRY_CATCH_EXPR in that operand 1
617*38fd1498Szrj   is always evaluated when cleanups are run.  */
618*38fd1498SzrjDEFTREECODE (WITH_CLEANUP_EXPR, "with_cleanup_expr", tcc_expression, 1)
619*38fd1498Szrj
620*38fd1498Szrj/* Specify a cleanup point.
621*38fd1498Szrj   Operand 0 is an expression that may have cleanups.  If it does, those
622*38fd1498Szrj   cleanups are executed after the expression is expanded.
623*38fd1498Szrj
624*38fd1498Szrj   Note that if the expression is a reference to storage, it is forced out
625*38fd1498Szrj   of memory before the cleanups are run.  This is necessary to handle
626*38fd1498Szrj   cases where the cleanups modify the storage referenced; in the
627*38fd1498Szrj   expression 't.i', if 't' is a struct with an integer member 'i' and a
628*38fd1498Szrj   cleanup which modifies 'i', the value of the expression depends on
629*38fd1498Szrj   whether the cleanup is run before or after 't.i' is evaluated.  When
630*38fd1498Szrj   expand_expr is run on 't.i', it returns a MEM.  This is not good enough;
631*38fd1498Szrj   the value of 't.i' must be forced out of memory.
632*38fd1498Szrj
633*38fd1498Szrj   As a consequence, the operand of a CLEANUP_POINT_EXPR must not have
634*38fd1498Szrj   BLKmode, because it will not be forced out of memory.  */
635*38fd1498SzrjDEFTREECODE (CLEANUP_POINT_EXPR, "cleanup_point_expr", tcc_expression, 1)
636*38fd1498Szrj
637*38fd1498Szrj/* The following code is used in languages that have types where some
638*38fd1498Szrj   field in an object of the type contains a value that is used in the
639*38fd1498Szrj   computation of another field's offset or size and/or the size of the
640*38fd1498Szrj   type.  The positions and/or sizes of fields can vary from object to
641*38fd1498Szrj   object of the same type or even for one and the same object within
642*38fd1498Szrj   its scope.
643*38fd1498Szrj
644*38fd1498Szrj   Record types with discriminants in Ada or schema types in Pascal are
645*38fd1498Szrj   examples of such types.  This mechanism is also used to create "fat
646*38fd1498Szrj   pointers" for unconstrained array types in Ada; the fat pointer is a
647*38fd1498Szrj   structure one of whose fields is a pointer to the actual array type
648*38fd1498Szrj   and the other field is a pointer to a template, which is a structure
649*38fd1498Szrj   containing the bounds of the array.  The bounds in the type pointed
650*38fd1498Szrj   to by the first field in the fat pointer refer to the values in the
651*38fd1498Szrj   template.
652*38fd1498Szrj
653*38fd1498Szrj   When you wish to construct such a type you need "self-references"
654*38fd1498Szrj   that allow you to reference the object having this type from the
655*38fd1498Szrj   TYPE node, i.e. without having a variable instantiating this type.
656*38fd1498Szrj
657*38fd1498Szrj   Such a "self-references" is done using a PLACEHOLDER_EXPR.  This is
658*38fd1498Szrj   a node that will later be replaced with the object being referenced.
659*38fd1498Szrj   Its type is that of the object and selects which object to use from
660*38fd1498Szrj   a chain of references (see below).  No other slots are used in the
661*38fd1498Szrj   PLACEHOLDER_EXPR.
662*38fd1498Szrj
663*38fd1498Szrj   For example, if your type FOO is a RECORD_TYPE with a field BAR,
664*38fd1498Szrj   and you need the value of <variable>.BAR to calculate TYPE_SIZE
665*38fd1498Szrj   (FOO), just substitute <variable> above with a PLACEHOLDER_EXPR
666*38fd1498Szrj   whose TREE_TYPE is FOO.  Then construct your COMPONENT_REF with
667*38fd1498Szrj   the PLACEHOLDER_EXPR as the first operand (which has the correct
668*38fd1498Szrj   type).  Later, when the size is needed in the program, the back-end
669*38fd1498Szrj   will find this PLACEHOLDER_EXPR and generate code to calculate the
670*38fd1498Szrj   actual size at run-time.  In the following, we describe how this
671*38fd1498Szrj   calculation is done.
672*38fd1498Szrj
673*38fd1498Szrj   When we wish to evaluate a size or offset, we check whether it contains a
674*38fd1498Szrj   PLACEHOLDER_EXPR.  If it does, we call substitute_placeholder_in_expr
675*38fd1498Szrj   passing both that tree and an expression within which the object may be
676*38fd1498Szrj   found.  The latter expression is the object itself in the simple case of
677*38fd1498Szrj   an Ada record with discriminant, but it can be the array in the case of an
678*38fd1498Szrj   unconstrained array.
679*38fd1498Szrj
680*38fd1498Szrj   In the latter case, we need the fat pointer, because the bounds of
681*38fd1498Szrj   the array can only be accessed from it.  However, we rely here on the
682*38fd1498Szrj   fact that the expression for the array contains the dereference of
683*38fd1498Szrj   the fat pointer that obtained the array pointer.  */
684*38fd1498Szrj
685*38fd1498Szrj/* Denotes a record to later be substituted before evaluating this expression.
686*38fd1498Szrj   The type of this expression is used to find the record to replace it.  */
687*38fd1498SzrjDEFTREECODE (PLACEHOLDER_EXPR, "placeholder_expr", tcc_exceptional, 0)
688*38fd1498Szrj
689*38fd1498Szrj/* Simple arithmetic.  */
690*38fd1498SzrjDEFTREECODE (PLUS_EXPR, "plus_expr", tcc_binary, 2)
691*38fd1498SzrjDEFTREECODE (MINUS_EXPR, "minus_expr", tcc_binary, 2)
692*38fd1498SzrjDEFTREECODE (MULT_EXPR, "mult_expr", tcc_binary, 2)
693*38fd1498Szrj
694*38fd1498Szrj/* Pointer addition.  The first operand is always a pointer and the
695*38fd1498Szrj   second operand is an integer of type sizetype.  */
696*38fd1498SzrjDEFTREECODE (POINTER_PLUS_EXPR, "pointer_plus_expr", tcc_binary, 2)
697*38fd1498Szrj
698*38fd1498Szrj/* Pointer subtraction.  The two arguments are pointers, and the result
699*38fd1498Szrj   is a signed integer of the same precision.  Pointers are interpreted
700*38fd1498Szrj   as unsigned, the difference is computed as if in infinite signed
701*38fd1498Szrj   precision.  Behavior is undefined if the difference does not fit in
702*38fd1498Szrj   the result type.  The result does not depend on the pointer type,
703*38fd1498Szrj   it is not divided by the size of the pointed-to type.  */
704*38fd1498SzrjDEFTREECODE (POINTER_DIFF_EXPR, "pointer_diff_expr", tcc_binary, 2)
705*38fd1498Szrj
706*38fd1498Szrj/* Highpart multiplication.  For an integral type with precision B,
707*38fd1498Szrj   returns bits [2B-1, B] of the full 2*B product.  */
708*38fd1498SzrjDEFTREECODE (MULT_HIGHPART_EXPR, "mult_highpart_expr", tcc_binary, 2)
709*38fd1498Szrj
710*38fd1498Szrj/* Division for integer result that rounds the quotient toward zero.  */
711*38fd1498SzrjDEFTREECODE (TRUNC_DIV_EXPR, "trunc_div_expr", tcc_binary, 2)
712*38fd1498Szrj
713*38fd1498Szrj/* Division for integer result that rounds it toward plus infinity.  */
714*38fd1498SzrjDEFTREECODE (CEIL_DIV_EXPR, "ceil_div_expr", tcc_binary, 2)
715*38fd1498Szrj
716*38fd1498Szrj/* Division for integer result that rounds it toward minus infinity.  */
717*38fd1498SzrjDEFTREECODE (FLOOR_DIV_EXPR, "floor_div_expr", tcc_binary, 2)
718*38fd1498Szrj
719*38fd1498Szrj/* Division for integer result that rounds it toward nearest integer.  */
720*38fd1498SzrjDEFTREECODE (ROUND_DIV_EXPR, "round_div_expr", tcc_binary, 2)
721*38fd1498Szrj
722*38fd1498Szrj/* Four kinds of remainder that go with the four kinds of division:  */
723*38fd1498Szrj
724*38fd1498Szrj/* The sign of the remainder is that of the dividend.  */
725*38fd1498SzrjDEFTREECODE (TRUNC_MOD_EXPR, "trunc_mod_expr", tcc_binary, 2)
726*38fd1498Szrj
727*38fd1498Szrj/* The sign of the remainder is the opposite of that of the divisor.  */
728*38fd1498SzrjDEFTREECODE (CEIL_MOD_EXPR, "ceil_mod_expr", tcc_binary, 2)
729*38fd1498Szrj
730*38fd1498Szrj/* The sign of the remainder is that of the divisor.  */
731*38fd1498SzrjDEFTREECODE (FLOOR_MOD_EXPR, "floor_mod_expr", tcc_binary, 2)
732*38fd1498Szrj
733*38fd1498Szrj/* The sign of the remainder is not predictable.  */
734*38fd1498SzrjDEFTREECODE (ROUND_MOD_EXPR, "round_mod_expr", tcc_binary, 2)
735*38fd1498Szrj
736*38fd1498Szrj/* Division for real result.  */
737*38fd1498SzrjDEFTREECODE (RDIV_EXPR, "rdiv_expr", tcc_binary, 2)
738*38fd1498Szrj
739*38fd1498Szrj/* Division which is not supposed to need rounding.
740*38fd1498Szrj   Used for pointer subtraction in C.  */
741*38fd1498SzrjDEFTREECODE (EXACT_DIV_EXPR, "exact_div_expr", tcc_binary, 2)
742*38fd1498Szrj
743*38fd1498Szrj/* Conversion of real to fixed point by truncation.  */
744*38fd1498SzrjDEFTREECODE (FIX_TRUNC_EXPR, "fix_trunc_expr", tcc_unary, 1)
745*38fd1498Szrj
746*38fd1498Szrj/* Conversion of an integer to a real.  */
747*38fd1498SzrjDEFTREECODE (FLOAT_EXPR, "float_expr", tcc_unary, 1)
748*38fd1498Szrj
749*38fd1498Szrj/* Unary negation.  */
750*38fd1498SzrjDEFTREECODE (NEGATE_EXPR, "negate_expr", tcc_unary, 1)
751*38fd1498Szrj
752*38fd1498Szrj/* Minimum and maximum values.  When used with floating point, if both
753*38fd1498Szrj   operands are zeros, or if either operand is NaN, then it is unspecified
754*38fd1498Szrj   which of the two operands is returned as the result.  */
755*38fd1498SzrjDEFTREECODE (MIN_EXPR, "min_expr", tcc_binary, 2)
756*38fd1498SzrjDEFTREECODE (MAX_EXPR, "max_expr", tcc_binary, 2)
757*38fd1498Szrj
758*38fd1498Szrj/* Represents the absolute value of the operand.
759*38fd1498Szrj
760*38fd1498Szrj   An ABS_EXPR must have either an INTEGER_TYPE or a REAL_TYPE.  The
761*38fd1498Szrj   operand of the ABS_EXPR must have the same type.  */
762*38fd1498SzrjDEFTREECODE (ABS_EXPR, "abs_expr", tcc_unary, 1)
763*38fd1498Szrj
764*38fd1498Szrj/* Shift operations for shift and rotate.
765*38fd1498Szrj   Shift means logical shift if done on an
766*38fd1498Szrj   unsigned type, arithmetic shift if done on a signed type.
767*38fd1498Szrj   The second operand is the number of bits to
768*38fd1498Szrj   shift by; it need not be the same type as the first operand and result.
769*38fd1498Szrj   Note that the result is undefined if the second operand is larger
770*38fd1498Szrj   than or equal to the first operand's type size.
771*38fd1498Szrj
772*38fd1498Szrj   The first operand of a shift can have either an integer or a
773*38fd1498Szrj   (non-integer) fixed-point type.  We follow the ISO/IEC TR 18037:2004
774*38fd1498Szrj   semantics for the latter.
775*38fd1498Szrj
776*38fd1498Szrj   Rotates are defined for integer types only.  */
777*38fd1498SzrjDEFTREECODE (LSHIFT_EXPR, "lshift_expr", tcc_binary, 2)
778*38fd1498SzrjDEFTREECODE (RSHIFT_EXPR, "rshift_expr", tcc_binary, 2)
779*38fd1498SzrjDEFTREECODE (LROTATE_EXPR, "lrotate_expr", tcc_binary, 2)
780*38fd1498SzrjDEFTREECODE (RROTATE_EXPR, "rrotate_expr", tcc_binary, 2)
781*38fd1498Szrj
782*38fd1498Szrj/* Bitwise operations.  Operands have same mode as result.  */
783*38fd1498SzrjDEFTREECODE (BIT_IOR_EXPR, "bit_ior_expr", tcc_binary, 2)
784*38fd1498SzrjDEFTREECODE (BIT_XOR_EXPR, "bit_xor_expr", tcc_binary, 2)
785*38fd1498SzrjDEFTREECODE (BIT_AND_EXPR, "bit_and_expr", tcc_binary, 2)
786*38fd1498SzrjDEFTREECODE (BIT_NOT_EXPR, "bit_not_expr", tcc_unary, 1)
787*38fd1498Szrj
788*38fd1498Szrj/* ANDIF and ORIF allow the second operand not to be computed if the
789*38fd1498Szrj   value of the expression is determined from the first operand.  AND,
790*38fd1498Szrj   OR, and XOR always compute the second operand whether its value is
791*38fd1498Szrj   needed or not (for side effects).  The operand may have
792*38fd1498Szrj   BOOLEAN_TYPE or INTEGER_TYPE.  In either case, the argument will be
793*38fd1498Szrj   either zero or one.  For example, a TRUTH_NOT_EXPR will never have
794*38fd1498Szrj   an INTEGER_TYPE VAR_DECL as its argument; instead, a NE_EXPR will be
795*38fd1498Szrj   used to compare the VAR_DECL to zero, thereby obtaining a node with
796*38fd1498Szrj   value zero or one.  */
797*38fd1498SzrjDEFTREECODE (TRUTH_ANDIF_EXPR, "truth_andif_expr", tcc_expression, 2)
798*38fd1498SzrjDEFTREECODE (TRUTH_ORIF_EXPR, "truth_orif_expr", tcc_expression, 2)
799*38fd1498SzrjDEFTREECODE (TRUTH_AND_EXPR, "truth_and_expr", tcc_expression, 2)
800*38fd1498SzrjDEFTREECODE (TRUTH_OR_EXPR, "truth_or_expr", tcc_expression, 2)
801*38fd1498SzrjDEFTREECODE (TRUTH_XOR_EXPR, "truth_xor_expr", tcc_expression, 2)
802*38fd1498SzrjDEFTREECODE (TRUTH_NOT_EXPR, "truth_not_expr", tcc_expression, 1)
803*38fd1498Szrj
804*38fd1498Szrj/* Relational operators.
805*38fd1498Szrj   `EQ_EXPR' and `NE_EXPR' are allowed for any types.
806*38fd1498Szrj   The others are allowed only for integer (or pointer or enumeral)
807*38fd1498Szrj   or real types.
808*38fd1498Szrj   In all cases the operands will have the same type,
809*38fd1498Szrj   and the value is either the type used by the language for booleans
810*38fd1498Szrj   or an integer vector type of the same size and with the same number
811*38fd1498Szrj   of elements as the comparison operands.  True for a vector of
812*38fd1498Szrj   comparison results has all bits set while false is equal to zero.  */
813*38fd1498SzrjDEFTREECODE (LT_EXPR, "lt_expr", tcc_comparison, 2)
814*38fd1498SzrjDEFTREECODE (LE_EXPR, "le_expr", tcc_comparison, 2)
815*38fd1498SzrjDEFTREECODE (GT_EXPR, "gt_expr", tcc_comparison, 2)
816*38fd1498SzrjDEFTREECODE (GE_EXPR, "ge_expr", tcc_comparison, 2)
817*38fd1498SzrjDEFTREECODE (EQ_EXPR, "eq_expr", tcc_comparison, 2)
818*38fd1498SzrjDEFTREECODE (NE_EXPR, "ne_expr", tcc_comparison, 2)
819*38fd1498Szrj
820*38fd1498Szrj/* Additional relational operators for floating point unordered.  */
821*38fd1498SzrjDEFTREECODE (UNORDERED_EXPR, "unordered_expr", tcc_comparison, 2)
822*38fd1498SzrjDEFTREECODE (ORDERED_EXPR, "ordered_expr", tcc_comparison, 2)
823*38fd1498Szrj
824*38fd1498Szrj/* These are equivalent to unordered or ...  */
825*38fd1498SzrjDEFTREECODE (UNLT_EXPR, "unlt_expr", tcc_comparison, 2)
826*38fd1498SzrjDEFTREECODE (UNLE_EXPR, "unle_expr", tcc_comparison, 2)
827*38fd1498SzrjDEFTREECODE (UNGT_EXPR, "ungt_expr", tcc_comparison, 2)
828*38fd1498SzrjDEFTREECODE (UNGE_EXPR, "unge_expr", tcc_comparison, 2)
829*38fd1498SzrjDEFTREECODE (UNEQ_EXPR, "uneq_expr", tcc_comparison, 2)
830*38fd1498Szrj
831*38fd1498Szrj/* This is the reverse of uneq_expr.  */
832*38fd1498SzrjDEFTREECODE (LTGT_EXPR, "ltgt_expr", tcc_comparison, 2)
833*38fd1498Szrj
834*38fd1498SzrjDEFTREECODE (RANGE_EXPR, "range_expr", tcc_binary, 2)
835*38fd1498Szrj
836*38fd1498Szrj/* Represents a re-association barrier for floating point expressions
837*38fd1498Szrj   like explicit parenthesis in fortran.  */
838*38fd1498SzrjDEFTREECODE (PAREN_EXPR, "paren_expr", tcc_unary, 1)
839*38fd1498Szrj
840*38fd1498Szrj/* Represents a conversion of type of a value.
841*38fd1498Szrj   All conversions, including implicit ones, must be
842*38fd1498Szrj   represented by CONVERT_EXPR or NOP_EXPR nodes.  */
843*38fd1498SzrjDEFTREECODE (CONVERT_EXPR, "convert_expr", tcc_unary, 1)
844*38fd1498Szrj
845*38fd1498Szrj/* Conversion of a pointer value to a pointer to a different
846*38fd1498Szrj   address space.  */
847*38fd1498SzrjDEFTREECODE (ADDR_SPACE_CONVERT_EXPR, "addr_space_convert_expr", tcc_unary, 1)
848*38fd1498Szrj
849*38fd1498Szrj/* Conversion of a fixed-point value to an integer, a real, or a fixed-point
850*38fd1498Szrj   value.  Or conversion of a fixed-point value from an integer, a real, or
851*38fd1498Szrj   a fixed-point value.  */
852*38fd1498SzrjDEFTREECODE (FIXED_CONVERT_EXPR, "fixed_convert_expr", tcc_unary, 1)
853*38fd1498Szrj
854*38fd1498Szrj/* Represents a conversion expected to require no code to be generated.  */
855*38fd1498SzrjDEFTREECODE (NOP_EXPR, "nop_expr", tcc_unary, 1)
856*38fd1498Szrj
857*38fd1498Szrj/* Value is same as argument, but guaranteed not an lvalue.  */
858*38fd1498SzrjDEFTREECODE (NON_LVALUE_EXPR, "non_lvalue_expr", tcc_unary, 1)
859*38fd1498Szrj
860*38fd1498Szrj/* A COMPOUND_LITERAL_EXPR represents a literal that is placed in a DECL.  The
861*38fd1498Szrj   COMPOUND_LITERAL_EXPR_DECL_EXPR is the a DECL_EXPR containing the decl
862*38fd1498Szrj   for the anonymous object represented by the COMPOUND_LITERAL;
863*38fd1498Szrj   the DECL_INITIAL of that decl is the CONSTRUCTOR that initializes
864*38fd1498Szrj   the compound literal.  */
865*38fd1498SzrjDEFTREECODE (COMPOUND_LITERAL_EXPR, "compound_literal_expr", tcc_expression, 1)
866*38fd1498Szrj
867*38fd1498Szrj/* Represents something we computed once and will use multiple times.
868*38fd1498Szrj   First operand is that expression.  After it is evaluated once, it
869*38fd1498Szrj   will be replaced by the temporary variable that holds the value.  */
870*38fd1498SzrjDEFTREECODE (SAVE_EXPR, "save_expr", tcc_expression, 1)
871*38fd1498Szrj
872*38fd1498Szrj/* & in C.  Value is the address at which the operand's value resides.
873*38fd1498Szrj   Operand may have any mode.  Result mode is Pmode.  */
874*38fd1498SzrjDEFTREECODE (ADDR_EXPR, "addr_expr", tcc_expression, 1)
875*38fd1498Szrj
876*38fd1498Szrj/* Operand0 is a function constant; result is part N of a function
877*38fd1498Szrj   descriptor of type ptr_mode.  */
878*38fd1498SzrjDEFTREECODE (FDESC_EXPR, "fdesc_expr", tcc_expression, 2)
879*38fd1498Szrj
880*38fd1498Szrj/* Given a container value, a replacement value and a bit position within
881*38fd1498Szrj   the container, produce the value that results from replacing the part of
882*38fd1498Szrj   the container starting at the bit position with the replacement value.
883*38fd1498Szrj   Operand 0 is a tree for the container value of integral or vector type;
884*38fd1498Szrj   Operand 1 is a tree for the replacement value of another integral or
885*38fd1498Szrj   the vector element type;
886*38fd1498Szrj   Operand 2 is a tree giving the constant bit position;
887*38fd1498Szrj   The number of bits replaced is given by the precision of the type of the
888*38fd1498Szrj   replacement value if it is integral or by its size if it is non-integral.
889*38fd1498Szrj   ???  The reason to make the size of the replacement implicit is to avoid
890*38fd1498Szrj   introducing a quaternary operation.
891*38fd1498Szrj   The replaced bits shall be fully inside the container.  If the container
892*38fd1498Szrj   is of vector type, then these bits shall be aligned with its elements.  */
893*38fd1498SzrjDEFTREECODE (BIT_INSERT_EXPR, "bit_insert_expr", tcc_expression, 3)
894*38fd1498Szrj
895*38fd1498Szrj/* Given two real or integer operands of the same type,
896*38fd1498Szrj   returns a complex value of the corresponding complex type.  */
897*38fd1498SzrjDEFTREECODE (COMPLEX_EXPR, "complex_expr", tcc_binary, 2)
898*38fd1498Szrj
899*38fd1498Szrj/* Complex conjugate of operand.  Used only on complex types.  */
900*38fd1498SzrjDEFTREECODE (CONJ_EXPR, "conj_expr", tcc_unary, 1)
901*38fd1498Szrj
902*38fd1498Szrj/* Nodes for ++ and -- in C.
903*38fd1498Szrj   The second arg is how much to increment or decrement by.
904*38fd1498Szrj   For a pointer, it would be the size of the object pointed to.  */
905*38fd1498SzrjDEFTREECODE (PREDECREMENT_EXPR, "predecrement_expr", tcc_expression, 2)
906*38fd1498SzrjDEFTREECODE (PREINCREMENT_EXPR, "preincrement_expr", tcc_expression, 2)
907*38fd1498SzrjDEFTREECODE (POSTDECREMENT_EXPR, "postdecrement_expr", tcc_expression, 2)
908*38fd1498SzrjDEFTREECODE (POSTINCREMENT_EXPR, "postincrement_expr", tcc_expression, 2)
909*38fd1498Szrj
910*38fd1498Szrj/* Used to implement `va_arg'.  */
911*38fd1498SzrjDEFTREECODE (VA_ARG_EXPR, "va_arg_expr", tcc_expression, 1)
912*38fd1498Szrj
913*38fd1498Szrj/* Evaluate operand 0.  If and only if an exception is thrown during
914*38fd1498Szrj   the evaluation of operand 0, evaluate operand 1.
915*38fd1498Szrj
916*38fd1498Szrj   This differs from TRY_FINALLY_EXPR in that operand 1 is not evaluated
917*38fd1498Szrj   on a normal or jump exit, only on an exception.  */
918*38fd1498SzrjDEFTREECODE (TRY_CATCH_EXPR, "try_catch_expr", tcc_statement, 2)
919*38fd1498Szrj
920*38fd1498Szrj/* Evaluate the first operand.
921*38fd1498Szrj   The second operand is a cleanup expression which is evaluated
922*38fd1498Szrj   on any exit (normal, exception, or jump out) from this expression.  */
923*38fd1498SzrjDEFTREECODE (TRY_FINALLY_EXPR, "try_finally", tcc_statement, 2)
924*38fd1498Szrj
925*38fd1498Szrj/* These types of expressions have no useful value,
926*38fd1498Szrj   and always have side effects.  */
927*38fd1498Szrj
928*38fd1498Szrj/* Used to represent a local declaration. The operand is DECL_EXPR_DECL.  */
929*38fd1498SzrjDEFTREECODE (DECL_EXPR, "decl_expr", tcc_statement, 1)
930*38fd1498Szrj
931*38fd1498Szrj/* A label definition, encapsulated as a statement.
932*38fd1498Szrj   Operand 0 is the LABEL_DECL node for the label that appears here.
933*38fd1498Szrj   The type should be void and the value should be ignored.  */
934*38fd1498SzrjDEFTREECODE (LABEL_EXPR, "label_expr", tcc_statement, 1)
935*38fd1498Szrj
936*38fd1498Szrj/* GOTO.  Operand 0 is a LABEL_DECL node or an expression.
937*38fd1498Szrj   The type should be void and the value should be ignored.  */
938*38fd1498SzrjDEFTREECODE (GOTO_EXPR, "goto_expr", tcc_statement, 1)
939*38fd1498Szrj
940*38fd1498Szrj/* RETURN.  Evaluates operand 0, then returns from the current function.
941*38fd1498Szrj   Presumably that operand is an assignment that stores into the
942*38fd1498Szrj   RESULT_DECL that hold the value to be returned.
943*38fd1498Szrj   The operand may be null.
944*38fd1498Szrj   The type should be void and the value should be ignored.  */
945*38fd1498SzrjDEFTREECODE (RETURN_EXPR, "return_expr", tcc_statement, 1)
946*38fd1498Szrj
947*38fd1498Szrj/* Exit the inner most loop conditionally.  Operand 0 is the condition.
948*38fd1498Szrj   The type should be void and the value should be ignored.  */
949*38fd1498SzrjDEFTREECODE (EXIT_EXPR, "exit_expr", tcc_statement, 1)
950*38fd1498Szrj
951*38fd1498Szrj/* A loop.  Operand 0 is the body of the loop.
952*38fd1498Szrj   It must contain an EXIT_EXPR or is an infinite loop.
953*38fd1498Szrj   The type should be void and the value should be ignored.  */
954*38fd1498SzrjDEFTREECODE (LOOP_EXPR, "loop_expr", tcc_statement, 1)
955*38fd1498Szrj
956*38fd1498Szrj/* Switch expression.
957*38fd1498Szrj
958*38fd1498Szrj   TREE_TYPE is the original type of the condition, before any
959*38fd1498Szrj   language required type conversions.  It may be NULL, in which case
960*38fd1498Szrj   the original type and final types are assumed to be the same.
961*38fd1498Szrj
962*38fd1498Szrj   Operand 0 is the expression used to perform the branch,
963*38fd1498Szrj   Operand 1 is the body of the switch, which probably contains
964*38fd1498Szrj     CASE_LABEL_EXPRs.  It may also be NULL, in which case operand 2
965*38fd1498Szrj     must not be NULL.  */
966*38fd1498SzrjDEFTREECODE (SWITCH_EXPR, "switch_expr", tcc_statement, 2)
967*38fd1498Szrj
968*38fd1498Szrj/* Used to represent a case label.
969*38fd1498Szrj
970*38fd1498Szrj   Operand 0 is CASE_LOW.  It may be NULL_TREE, in which case the label
971*38fd1498Szrj     is a 'default' label.
972*38fd1498Szrj   Operand 1 is CASE_HIGH.  If it is NULL_TREE, the label is a simple
973*38fd1498Szrj     (one-value) case label.  If it is non-NULL_TREE, the case is a range.
974*38fd1498Szrj   Operand 2 is CASE_LABEL, which is is the corresponding LABEL_DECL.
975*38fd1498Szrj   Operand 3 is CASE_CHAIN.  This operand is only used in tree-cfg.c to
976*38fd1498Szrj     speed up the lookup of case labels which use a particular edge in
977*38fd1498Szrj     the control flow graph.  */
978*38fd1498SzrjDEFTREECODE (CASE_LABEL_EXPR, "case_label_expr", tcc_statement, 4)
979*38fd1498Szrj
980*38fd1498Szrj/* Used to represent an inline assembly statement.  ASM_STRING returns a
981*38fd1498Szrj   STRING_CST for the instruction (e.g., "mov x, y"). ASM_OUTPUTS,
982*38fd1498Szrj   ASM_INPUTS, and ASM_CLOBBERS represent the outputs, inputs, and clobbers
983*38fd1498Szrj   for the statement.  ASM_LABELS, if present, indicates various destinations
984*38fd1498Szrj   for the asm; labels cannot be combined with outputs.  */
985*38fd1498SzrjDEFTREECODE (ASM_EXPR, "asm_expr", tcc_statement, 5)
986*38fd1498Szrj
987*38fd1498Szrj/* Variable references for SSA analysis.  New SSA names are created every
988*38fd1498Szrj   time a variable is assigned a new value.  The SSA builder uses SSA_NAME
989*38fd1498Szrj   nodes to implement SSA versioning.  */
990*38fd1498SzrjDEFTREECODE (SSA_NAME, "ssa_name", tcc_exceptional, 0)
991*38fd1498Szrj
992*38fd1498Szrj/* Used to represent a typed exception handler.  CATCH_TYPES is the type (or
993*38fd1498Szrj   list of types) handled, and CATCH_BODY is the code for the handler.  */
994*38fd1498SzrjDEFTREECODE (CATCH_EXPR, "catch_expr", tcc_statement, 2)
995*38fd1498Szrj
996*38fd1498Szrj/* Used to represent an exception specification.  EH_FILTER_TYPES is a list
997*38fd1498Szrj   of allowed types, and EH_FILTER_FAILURE is an expression to evaluate on
998*38fd1498Szrj   failure.  */
999*38fd1498SzrjDEFTREECODE (EH_FILTER_EXPR, "eh_filter_expr", tcc_statement, 2)
1000*38fd1498Szrj
1001*38fd1498Szrj/* Node used for describing a property that is known at compile
1002*38fd1498Szrj   time.  */
1003*38fd1498SzrjDEFTREECODE (SCEV_KNOWN, "scev_known", tcc_expression, 0)
1004*38fd1498Szrj
1005*38fd1498Szrj/* Node used for describing a property that is not known at compile
1006*38fd1498Szrj   time.  */
1007*38fd1498SzrjDEFTREECODE (SCEV_NOT_KNOWN, "scev_not_known", tcc_expression, 0)
1008*38fd1498Szrj
1009*38fd1498Szrj/* Polynomial chains of recurrences.
1010*38fd1498Szrj   cr = {CHREC_LEFT (cr), +, CHREC_RIGHT (cr)}_CHREC_VARIABLE (cr).  */
1011*38fd1498SzrjDEFTREECODE (POLYNOMIAL_CHREC, "polynomial_chrec", tcc_expression, 2)
1012*38fd1498Szrj
1013*38fd1498Szrj/* Used to chain children of container statements together.
1014*38fd1498Szrj   Use the interface in tree-iterator.h to access this node.  */
1015*38fd1498SzrjDEFTREECODE (STATEMENT_LIST, "statement_list", tcc_exceptional, 0)
1016*38fd1498Szrj
1017*38fd1498Szrj/* Predicate assertion.  Artificial expression generated by the optimizers
1018*38fd1498Szrj   to keep track of predicate values.  This expression may only appear on
1019*38fd1498Szrj   the RHS of assignments.
1020*38fd1498Szrj
1021*38fd1498Szrj   Given X = ASSERT_EXPR <Y, EXPR>, the optimizers can infer
1022*38fd1498Szrj   two things:
1023*38fd1498Szrj
1024*38fd1498Szrj   	1- X is a copy of Y.
1025*38fd1498Szrj	2- EXPR is a conditional expression and is known to be true.
1026*38fd1498Szrj
1027*38fd1498Szrj   Valid and to be expected forms of conditional expressions are
1028*38fd1498Szrj   valid GIMPLE conditional expressions (as defined by is_gimple_condexpr)
1029*38fd1498Szrj   and conditional expressions with the first operand being a
1030*38fd1498Szrj   PLUS_EXPR with a variable possibly wrapped in a NOP_EXPR first
1031*38fd1498Szrj   operand and an integer constant second operand.
1032*38fd1498Szrj
1033*38fd1498Szrj   The type of the expression is the same as Y.  */
1034*38fd1498SzrjDEFTREECODE (ASSERT_EXPR, "assert_expr", tcc_expression, 2)
1035*38fd1498Szrj
1036*38fd1498Szrj/* Base class information. Holds information about a class as a
1037*38fd1498Szrj   baseclass of itself or another class.  */
1038*38fd1498SzrjDEFTREECODE (TREE_BINFO, "tree_binfo", tcc_exceptional, 0)
1039*38fd1498Szrj
1040*38fd1498Szrj/* Records the size for an expression of variable size type.  This is
1041*38fd1498Szrj   for use in contexts in which we are accessing the entire object,
1042*38fd1498Szrj   such as for a function call, or block copy.
1043*38fd1498Szrj   Operand 0 is the real expression.
1044*38fd1498Szrj   Operand 1 is the size of the type in the expression.  */
1045*38fd1498SzrjDEFTREECODE (WITH_SIZE_EXPR, "with_size_expr", tcc_expression, 2)
1046*38fd1498Szrj
1047*38fd1498Szrj/* Extract elements from two input vectors Operand 0 and Operand 1
1048*38fd1498Szrj   size VS, according to the offset OFF defined by Operand 2 as
1049*38fd1498Szrj   follows:
1050*38fd1498Szrj   If OFF > 0, the last VS - OFF elements of vector OP0 are concatenated to
1051*38fd1498Szrj   the first OFF elements of the vector OP1.
1052*38fd1498Szrj   If OFF == 0, then the returned vector is OP1.
1053*38fd1498Szrj   On different targets OFF may take different forms; It can be an address, in
1054*38fd1498Szrj   which case its low log2(VS)-1 bits define the offset, or it can be a mask
1055*38fd1498Szrj   generated by the builtin targetm.vectorize.mask_for_load_builtin_decl.  */
1056*38fd1498SzrjDEFTREECODE (REALIGN_LOAD_EXPR, "realign_load", tcc_expression, 3)
1057*38fd1498Szrj
1058*38fd1498Szrj/* Low-level memory addressing.  Operands are BASE (address of static or
1059*38fd1498Szrj   global variable or register), OFFSET (integer constant),
1060*38fd1498Szrj   INDEX (register), STEP (integer constant), INDEX2 (register),
1061*38fd1498Szrj   The corresponding address is BASE + STEP * INDEX + INDEX2 + OFFSET.
1062*38fd1498Szrj   Only variations and values valid on the target are allowed.
1063*38fd1498Szrj
1064*38fd1498Szrj   The type of STEP, INDEX and INDEX2 is sizetype.
1065*38fd1498Szrj
1066*38fd1498Szrj   The type of BASE is a pointer type.  If BASE is not an address of
1067*38fd1498Szrj   a static or global variable INDEX2 will be NULL.
1068*38fd1498Szrj
1069*38fd1498Szrj   The type of OFFSET is a pointer type and determines TBAA the same as
1070*38fd1498Szrj   the constant offset operand in MEM_REF.  */
1071*38fd1498Szrj
1072*38fd1498SzrjDEFTREECODE (TARGET_MEM_REF, "target_mem_ref", tcc_reference, 5)
1073*38fd1498Szrj
1074*38fd1498Szrj/* Memory addressing.  Operands are a pointer and a tree constant integer
1075*38fd1498Szrj   byte offset of the pointer type that when dereferenced yields the
1076*38fd1498Szrj   type of the base object the pointer points into and which is used for
1077*38fd1498Szrj   TBAA purposes.
1078*38fd1498Szrj   The type of the MEM_REF is the type the bytes at the memory location
1079*38fd1498Szrj   are interpreted as.
1080*38fd1498Szrj   MEM_REF <p, c> is equivalent to ((typeof(c))p)->x... where x... is a
1081*38fd1498Szrj   chain of component references offsetting p by c.  */
1082*38fd1498SzrjDEFTREECODE (MEM_REF, "mem_ref", tcc_reference, 2)
1083*38fd1498Szrj
1084*38fd1498Szrj/* OpenACC and OpenMP.  As it is exposed in TREE_RANGE_CHECK invocations, do
1085*38fd1498Szrj   not change the ordering of these codes.  */
1086*38fd1498Szrj
1087*38fd1498Szrj/* OpenACC - #pragma acc parallel [clause1 ... clauseN]
1088*38fd1498Szrj   Operand 0: OMP_BODY: Code to be executed in parallel.
1089*38fd1498Szrj   Operand 1: OMP_CLAUSES: List of clauses.  */
1090*38fd1498Szrj
1091*38fd1498SzrjDEFTREECODE (OACC_PARALLEL, "oacc_parallel", tcc_statement, 2)
1092*38fd1498Szrj
1093*38fd1498Szrj/* OpenACC - #pragma acc kernels [clause1 ... clauseN]
1094*38fd1498Szrj   Operand 0: OMP_BODY: Sequence of kernels.
1095*38fd1498Szrj   Operand 1: OMP_CLAUSES: List of clauses.  */
1096*38fd1498Szrj
1097*38fd1498SzrjDEFTREECODE (OACC_KERNELS, "oacc_kernels", tcc_statement, 2)
1098*38fd1498Szrj
1099*38fd1498Szrj/* OpenACC - #pragma acc data [clause1 ... clauseN]
1100*38fd1498Szrj   Operand 0: OACC_DATA_BODY: Data construct body.
1101*38fd1498Szrj   Operand 1: OACC_DATA_CLAUSES: List of clauses.  */
1102*38fd1498Szrj
1103*38fd1498SzrjDEFTREECODE (OACC_DATA, "oacc_data", tcc_statement, 2)
1104*38fd1498Szrj
1105*38fd1498Szrj/* OpenACC - #pragma acc host_data [clause1 ... clauseN]
1106*38fd1498Szrj   Operand 0: OACC_HOST_DATA_BODY: Host_data construct body.
1107*38fd1498Szrj   Operand 1: OACC_HOST_DATA_CLAUSES: List of clauses.  */
1108*38fd1498Szrj
1109*38fd1498SzrjDEFTREECODE (OACC_HOST_DATA, "oacc_host_data", tcc_statement, 2)
1110*38fd1498Szrj
1111*38fd1498Szrj/* OpenMP - #pragma omp parallel [clause1 ... clauseN]
1112*38fd1498Szrj   Operand 0: OMP_PARALLEL_BODY: Code to be executed by all threads.
1113*38fd1498Szrj   Operand 1: OMP_PARALLEL_CLAUSES: List of clauses.  */
1114*38fd1498Szrj
1115*38fd1498SzrjDEFTREECODE (OMP_PARALLEL, "omp_parallel", tcc_statement, 2)
1116*38fd1498Szrj
1117*38fd1498Szrj/* OpenMP - #pragma omp task [clause1 ... clauseN]
1118*38fd1498Szrj   Operand 0: OMP_TASK_BODY: Code to be executed by all threads.
1119*38fd1498Szrj   Operand 1: OMP_TASK_CLAUSES: List of clauses.  */
1120*38fd1498Szrj
1121*38fd1498SzrjDEFTREECODE (OMP_TASK, "omp_task", tcc_statement, 2)
1122*38fd1498Szrj
1123*38fd1498Szrj/* OpenMP - #pragma omp for [clause1 ... clauseN]
1124*38fd1498Szrj   Operand 0: OMP_FOR_BODY: Loop body.
1125*38fd1498Szrj   Operand 1: OMP_FOR_CLAUSES: List of clauses.
1126*38fd1498Szrj   Operand 2: OMP_FOR_INIT: Initialization code of the form
1127*38fd1498Szrj                             	VAR = N1.
1128*38fd1498Szrj   Operand 3: OMP_FOR_COND: Loop conditional expression of the form
1129*38fd1498Szrj                             	VAR { <, >, <=, >= } N2.
1130*38fd1498Szrj   Operand 4: OMP_FOR_INCR: Loop index increment of the form
1131*38fd1498Szrj			     	VAR { +=, -= } INCR.
1132*38fd1498Szrj   Operand 5: OMP_FOR_PRE_BODY: Filled by the gimplifier with things
1133*38fd1498Szrj	from INIT, COND, and INCR that are technically part of the
1134*38fd1498Szrj	OMP_FOR structured block, but are evaluated before the loop
1135*38fd1498Szrj	body begins.
1136*38fd1498Szrj   Operand 6: OMP_FOR_ORIG_DECLS: If non-NULL, list of DECLs initialized
1137*38fd1498Szrj	in OMP_FOR_INIT.  In some cases, like C++ iterators, the original
1138*38fd1498Szrj	DECL init has been lost in gimplification and now contains a
1139*38fd1498Szrj	temporary (D.nnnn).  This list contains the original DECLs in
1140*38fd1498Szrj	the source.
1141*38fd1498Szrj
1142*38fd1498Szrj   VAR must be an integer or pointer variable, which is implicitly thread
1143*38fd1498Szrj   private.  N1, N2 and INCR are required to be loop invariant integer
1144*38fd1498Szrj   expressions that are evaluated without any synchronization.
1145*38fd1498Szrj   The evaluation order, frequency of evaluation and side-effects are
1146*38fd1498Szrj   unspecified by the standards.  */
1147*38fd1498SzrjDEFTREECODE (OMP_FOR, "omp_for", tcc_statement, 7)
1148*38fd1498Szrj
1149*38fd1498Szrj/* OpenMP - #pragma omp simd [clause1 ... clauseN]
1150*38fd1498Szrj   Operands like for OMP_FOR.  */
1151*38fd1498SzrjDEFTREECODE (OMP_SIMD, "omp_simd", tcc_statement, 7)
1152*38fd1498Szrj
1153*38fd1498Szrj/* OpenMP - #pragma omp distribute [clause1 ... clauseN]
1154*38fd1498Szrj   Operands like for OMP_FOR.  */
1155*38fd1498SzrjDEFTREECODE (OMP_DISTRIBUTE, "omp_distribute", tcc_statement, 7)
1156*38fd1498Szrj
1157*38fd1498Szrj/* OpenMP - #pragma omp taskloop [clause1 ... clauseN]
1158*38fd1498Szrj   Operands like for OMP_FOR.  */
1159*38fd1498SzrjDEFTREECODE (OMP_TASKLOOP, "omp_taskloop", tcc_statement, 7)
1160*38fd1498Szrj
1161*38fd1498Szrj/* OpenMP - #pragma acc loop [clause1 ... clauseN]
1162*38fd1498Szrj   Operands like for OMP_FOR.  */
1163*38fd1498SzrjDEFTREECODE (OACC_LOOP, "oacc_loop", tcc_statement, 7)
1164*38fd1498Szrj
1165*38fd1498Szrj/* OpenMP - #pragma omp teams [clause1 ... clauseN]
1166*38fd1498Szrj   Operand 0: OMP_TEAMS_BODY: Teams body.
1167*38fd1498Szrj   Operand 1: OMP_TEAMS_CLAUSES: List of clauses.  */
1168*38fd1498SzrjDEFTREECODE (OMP_TEAMS, "omp_teams", tcc_statement, 2)
1169*38fd1498Szrj
1170*38fd1498Szrj/* OpenMP - #pragma omp target data [clause1 ... clauseN]
1171*38fd1498Szrj   Operand 0: OMP_TARGET_DATA_BODY: Target data construct body.
1172*38fd1498Szrj   Operand 1: OMP_TARGET_DATA_CLAUSES: List of clauses.  */
1173*38fd1498SzrjDEFTREECODE (OMP_TARGET_DATA, "omp_target_data", tcc_statement, 2)
1174*38fd1498Szrj
1175*38fd1498Szrj/* OpenMP - #pragma omp target [clause1 ... clauseN]
1176*38fd1498Szrj   Operand 0: OMP_TARGET_BODY: Target construct body.
1177*38fd1498Szrj   Operand 1: OMP_TARGET_CLAUSES: List of clauses.  */
1178*38fd1498SzrjDEFTREECODE (OMP_TARGET, "omp_target", tcc_statement, 2)
1179*38fd1498Szrj
1180*38fd1498Szrj/* OpenMP - #pragma omp sections [clause1 ... clauseN]
1181*38fd1498Szrj   Operand 0: OMP_SECTIONS_BODY: Sections body.
1182*38fd1498Szrj   Operand 1: OMP_SECTIONS_CLAUSES: List of clauses.  */
1183*38fd1498SzrjDEFTREECODE (OMP_SECTIONS, "omp_sections", tcc_statement, 2)
1184*38fd1498Szrj
1185*38fd1498Szrj/* OpenMP - #pragma omp ordered
1186*38fd1498Szrj   Operand 0: OMP_ORDERED_BODY: Master section body.
1187*38fd1498Szrj   Operand 1: OMP_ORDERED_CLAUSES: List of clauses.  */
1188*38fd1498SzrjDEFTREECODE (OMP_ORDERED, "omp_ordered", tcc_statement, 2)
1189*38fd1498Szrj
1190*38fd1498Szrj/* OpenMP - #pragma omp critical [name]
1191*38fd1498Szrj   Operand 0: OMP_CRITICAL_BODY: Critical section body.
1192*38fd1498Szrj   Operand 1: OMP_CRITICAL_CLAUSES: List of clauses.
1193*38fd1498Szrj   Operand 2: OMP_CRITICAL_NAME: Identifier for critical section.  */
1194*38fd1498SzrjDEFTREECODE (OMP_CRITICAL, "omp_critical", tcc_statement, 3)
1195*38fd1498Szrj
1196*38fd1498Szrj/* OpenMP - #pragma omp single
1197*38fd1498Szrj   Operand 0: OMP_SINGLE_BODY: Single section body.
1198*38fd1498Szrj   Operand 1: OMP_SINGLE_CLAUSES: List of clauses.  */
1199*38fd1498SzrjDEFTREECODE (OMP_SINGLE, "omp_single", tcc_statement, 2)
1200*38fd1498Szrj
1201*38fd1498Szrj/* OpenMP - #pragma omp section
1202*38fd1498Szrj   Operand 0: OMP_SECTION_BODY: Section body.  */
1203*38fd1498SzrjDEFTREECODE (OMP_SECTION, "omp_section", tcc_statement, 1)
1204*38fd1498Szrj
1205*38fd1498Szrj/* OpenMP - #pragma omp master
1206*38fd1498Szrj   Operand 0: OMP_MASTER_BODY: Master section body.  */
1207*38fd1498SzrjDEFTREECODE (OMP_MASTER, "omp_master", tcc_statement, 1)
1208*38fd1498Szrj
1209*38fd1498Szrj/* OpenMP - #pragma omp taskgroup
1210*38fd1498Szrj   Operand 0: OMP_TASKGROUP_BODY: Taskgroup body.  */
1211*38fd1498SzrjDEFTREECODE (OMP_TASKGROUP, "omp_taskgroup", tcc_statement, 1)
1212*38fd1498Szrj
1213*38fd1498Szrj/* OpenACC - #pragma acc cache (variable1 ... variableN)
1214*38fd1498Szrj   Operand 0: OACC_CACHE_CLAUSES: List of variables (transformed into
1215*38fd1498Szrj	OMP_CLAUSE__CACHE_ clauses).  */
1216*38fd1498SzrjDEFTREECODE (OACC_CACHE, "oacc_cache", tcc_statement, 1)
1217*38fd1498Szrj
1218*38fd1498Szrj/* OpenACC - #pragma acc declare [clause1 ... clauseN]
1219*38fd1498Szrj   Operand 0: OACC_DECLARE_CLAUSES: List of clauses.  */
1220*38fd1498SzrjDEFTREECODE (OACC_DECLARE, "oacc_declare", tcc_statement, 1)
1221*38fd1498Szrj
1222*38fd1498Szrj/* OpenACC - #pragma acc enter data [clause1 ... clauseN]
1223*38fd1498Szrj   Operand 0: OACC_ENTER_DATA_CLAUSES: List of clauses.  */
1224*38fd1498SzrjDEFTREECODE (OACC_ENTER_DATA, "oacc_enter_data", tcc_statement, 1)
1225*38fd1498Szrj
1226*38fd1498Szrj/* OpenACC - #pragma acc exit data [clause1 ... clauseN]
1227*38fd1498Szrj   Operand 0: OACC_EXIT_DATA_CLAUSES: List of clauses.  */
1228*38fd1498SzrjDEFTREECODE (OACC_EXIT_DATA, "oacc_exit_data", tcc_statement, 1)
1229*38fd1498Szrj
1230*38fd1498Szrj/* OpenACC - #pragma acc update [clause1 ... clauseN]
1231*38fd1498Szrj   Operand 0: OACC_UPDATE_CLAUSES: List of clauses.  */
1232*38fd1498SzrjDEFTREECODE (OACC_UPDATE, "oacc_update", tcc_statement, 1)
1233*38fd1498Szrj
1234*38fd1498Szrj/* OpenMP - #pragma omp target update [clause1 ... clauseN]
1235*38fd1498Szrj   Operand 0: OMP_TARGET_UPDATE_CLAUSES: List of clauses.  */
1236*38fd1498SzrjDEFTREECODE (OMP_TARGET_UPDATE, "omp_target_update", tcc_statement, 1)
1237*38fd1498Szrj
1238*38fd1498Szrj/* OpenMP - #pragma omp target enter data [clause1 ... clauseN]
1239*38fd1498Szrj   Operand 0: OMP_TARGET_ENTER_DATA_CLAUSES: List of clauses.  */
1240*38fd1498SzrjDEFTREECODE (OMP_TARGET_ENTER_DATA, "omp_target_enter_data", tcc_statement, 1)
1241*38fd1498Szrj
1242*38fd1498Szrj/* OpenMP - #pragma omp target exit data [clause1 ... clauseN]
1243*38fd1498Szrj   Operand 0: OMP_TARGET_EXIT_DATA_CLAUSES: List of clauses.  */
1244*38fd1498SzrjDEFTREECODE (OMP_TARGET_EXIT_DATA, "omp_target_exit_data", tcc_statement, 1)
1245*38fd1498Szrj
1246*38fd1498Szrj/* OMP_ATOMIC through OMP_ATOMIC_CAPTURE_NEW must be consecutive,
1247*38fd1498Szrj   or OMP_ATOMIC_SEQ_CST needs adjusting.  */
1248*38fd1498Szrj
1249*38fd1498Szrj/* OpenMP - #pragma omp atomic
1250*38fd1498Szrj   Operand 0: The address at which the atomic operation is to be performed.
1251*38fd1498Szrj	This address should be stabilized with save_expr.
1252*38fd1498Szrj   Operand 1: The expression to evaluate.  When the old value of the object
1253*38fd1498Szrj	at the address is used in the expression, it should appear as if
1254*38fd1498Szrj	build_fold_indirect_ref of the address.  */
1255*38fd1498SzrjDEFTREECODE (OMP_ATOMIC, "omp_atomic", tcc_statement, 2)
1256*38fd1498Szrj
1257*38fd1498Szrj/* OpenMP - #pragma omp atomic read
1258*38fd1498Szrj   Operand 0: The address at which the atomic operation is to be performed.
1259*38fd1498Szrj	This address should be stabilized with save_expr.  */
1260*38fd1498SzrjDEFTREECODE (OMP_ATOMIC_READ, "omp_atomic_read", tcc_statement, 1)
1261*38fd1498Szrj
1262*38fd1498Szrj/* OpenMP - #pragma omp atomic capture
1263*38fd1498Szrj   Operand 0: The address at which the atomic operation is to be performed.
1264*38fd1498Szrj	This address should be stabilized with save_expr.
1265*38fd1498Szrj   Operand 1: The expression to evaluate.  When the old value of the object
1266*38fd1498Szrj	at the address is used in the expression, it should appear as if
1267*38fd1498Szrj	build_fold_indirect_ref of the address.
1268*38fd1498Szrj   OMP_ATOMIC_CAPTURE_OLD returns the old memory content,
1269*38fd1498Szrj   OMP_ATOMIC_CAPTURE_NEW the new value.  */
1270*38fd1498SzrjDEFTREECODE (OMP_ATOMIC_CAPTURE_OLD, "omp_atomic_capture_old", tcc_statement, 2)
1271*38fd1498SzrjDEFTREECODE (OMP_ATOMIC_CAPTURE_NEW, "omp_atomic_capture_new", tcc_statement, 2)
1272*38fd1498Szrj
1273*38fd1498Szrj/* OpenMP clauses.  */
1274*38fd1498SzrjDEFTREECODE (OMP_CLAUSE, "omp_clause", tcc_exceptional, 0)
1275*38fd1498Szrj
1276*38fd1498Szrj/* TRANSACTION_EXPR tree code.
1277*38fd1498Szrj   Operand 0: BODY: contains body of the transaction.  */
1278*38fd1498SzrjDEFTREECODE (TRANSACTION_EXPR, "transaction_expr", tcc_expression, 1)
1279*38fd1498Szrj
1280*38fd1498Szrj/* Widening dot-product.
1281*38fd1498Szrj   The first two arguments are of type t1.
1282*38fd1498Szrj   The third argument and the result are of type t2, such that t2 is at least
1283*38fd1498Szrj   twice the size of t1. DOT_PROD_EXPR(arg1,arg2,arg3) is equivalent to:
1284*38fd1498Szrj   	tmp = WIDEN_MULT_EXPR(arg1, arg2);
1285*38fd1498Szrj   	arg3 = PLUS_EXPR (tmp, arg3);
1286*38fd1498Szrj   or:
1287*38fd1498Szrj	tmp = WIDEN_MULT_EXPR(arg1, arg2);
1288*38fd1498Szrj        arg3 = WIDEN_SUM_EXPR (tmp, arg3);		 */
1289*38fd1498SzrjDEFTREECODE (DOT_PROD_EXPR, "dot_prod_expr", tcc_expression, 3)
1290*38fd1498Szrj
1291*38fd1498Szrj/* Widening summation.
1292*38fd1498Szrj   The first argument is of type t1.
1293*38fd1498Szrj   The second argument is of type t2, such that t2 is at least twice
1294*38fd1498Szrj   the size of t1. The type of the entire expression is also t2.
1295*38fd1498Szrj   WIDEN_SUM_EXPR is equivalent to first widening (promoting)
1296*38fd1498Szrj   the first argument from type t1 to type t2, and then summing it
1297*38fd1498Szrj   with the second argument.  */
1298*38fd1498SzrjDEFTREECODE (WIDEN_SUM_EXPR, "widen_sum_expr", tcc_binary, 2)
1299*38fd1498Szrj
1300*38fd1498Szrj/* Widening sad (sum of absolute differences).
1301*38fd1498Szrj   The first two arguments are of type t1 which should be integer.
1302*38fd1498Szrj   The third argument and the result are of type t2, such that t2 is at least
1303*38fd1498Szrj   twice the size of t1.  Like DOT_PROD_EXPR, SAD_EXPR (arg1,arg2,arg3) is
1304*38fd1498Szrj   equivalent to (note we don't have WIDEN_MINUS_EXPR now, but we assume its
1305*38fd1498Szrj   behavior is similar to WIDEN_SUM_EXPR):
1306*38fd1498Szrj       tmp = WIDEN_MINUS_EXPR (arg1, arg2)
1307*38fd1498Szrj       tmp2 = ABS_EXPR (tmp)
1308*38fd1498Szrj       arg3 = PLUS_EXPR (tmp2, arg3)
1309*38fd1498Szrj  or:
1310*38fd1498Szrj       tmp = WIDEN_MINUS_EXPR (arg1, arg2)
1311*38fd1498Szrj       tmp2 = ABS_EXPR (tmp)
1312*38fd1498Szrj       arg3 = WIDEN_SUM_EXPR (tmp2, arg3)
1313*38fd1498Szrj */
1314*38fd1498SzrjDEFTREECODE (SAD_EXPR, "sad_expr", tcc_expression, 3)
1315*38fd1498Szrj
1316*38fd1498Szrj/* Widening multiplication.
1317*38fd1498Szrj   The two arguments are of type t1.
1318*38fd1498Szrj   The result is of type t2, such that t2 is at least twice
1319*38fd1498Szrj   the size of t1. WIDEN_MULT_EXPR is equivalent to first widening (promoting)
1320*38fd1498Szrj   the arguments from type t1 to type t2, and then multiplying them.  */
1321*38fd1498SzrjDEFTREECODE (WIDEN_MULT_EXPR, "widen_mult_expr", tcc_binary, 2)
1322*38fd1498Szrj
1323*38fd1498Szrj/* Widening multiply-accumulate.
1324*38fd1498Szrj   The first two arguments are of type t1.
1325*38fd1498Szrj   The third argument and the result are of type t2, such as t2 is at least
1326*38fd1498Szrj   twice the size of t1.  t1 and t2 must be integral or fixed-point types.
1327*38fd1498Szrj   The expression is equivalent to a WIDEN_MULT_EXPR operation
1328*38fd1498Szrj   of the first two operands followed by an add or subtract of the third
1329*38fd1498Szrj   operand.  */
1330*38fd1498SzrjDEFTREECODE (WIDEN_MULT_PLUS_EXPR, "widen_mult_plus_expr", tcc_expression, 3)
1331*38fd1498Szrj/* This is like the above, except in the final expression the multiply result
1332*38fd1498Szrj   is subtracted from t3.  */
1333*38fd1498SzrjDEFTREECODE (WIDEN_MULT_MINUS_EXPR, "widen_mult_minus_expr", tcc_expression, 3)
1334*38fd1498Szrj
1335*38fd1498Szrj/* Widening shift left.
1336*38fd1498Szrj   The first operand is of type t1.
1337*38fd1498Szrj   The second operand is the number of bits to shift by; it need not be the
1338*38fd1498Szrj   same type as the first operand and result.
1339*38fd1498Szrj   Note that the result is undefined if the second operand is larger
1340*38fd1498Szrj   than or equal to the first operand's type size.
1341*38fd1498Szrj   The type of the entire expression is t2, such that t2 is at least twice
1342*38fd1498Szrj   the size of t1.
1343*38fd1498Szrj   WIDEN_LSHIFT_EXPR is equivalent to first widening (promoting)
1344*38fd1498Szrj   the first argument from type t1 to type t2, and then shifting it
1345*38fd1498Szrj   by the second argument.  */
1346*38fd1498SzrjDEFTREECODE (WIDEN_LSHIFT_EXPR, "widen_lshift_expr", tcc_binary, 2)
1347*38fd1498Szrj
1348*38fd1498Szrj/* Fused multiply-add.
1349*38fd1498Szrj   All operands and the result are of the same type.  No intermediate
1350*38fd1498Szrj   rounding is performed after multiplying operand one with operand two
1351*38fd1498Szrj   before adding operand three.  */
1352*38fd1498SzrjDEFTREECODE (FMA_EXPR, "fma_expr", tcc_expression, 3)
1353*38fd1498Szrj
1354*38fd1498Szrj/* Widening vector multiplication.
1355*38fd1498Szrj   The two operands are vectors with N elements of size S. Multiplying the
1356*38fd1498Szrj   elements of the two vectors will result in N products of size 2*S.
1357*38fd1498Szrj   VEC_WIDEN_MULT_HI_EXPR computes the N/2 high products.
1358*38fd1498Szrj   VEC_WIDEN_MULT_LO_EXPR computes the N/2 low products.  */
1359*38fd1498SzrjDEFTREECODE (VEC_WIDEN_MULT_HI_EXPR, "widen_mult_hi_expr", tcc_binary, 2)
1360*38fd1498SzrjDEFTREECODE (VEC_WIDEN_MULT_LO_EXPR, "widen_mult_lo_expr", tcc_binary, 2)
1361*38fd1498Szrj
1362*38fd1498Szrj/* Similarly, but return the even or odd N/2 products.  */
1363*38fd1498SzrjDEFTREECODE (VEC_WIDEN_MULT_EVEN_EXPR, "widen_mult_even_expr", tcc_binary, 2)
1364*38fd1498SzrjDEFTREECODE (VEC_WIDEN_MULT_ODD_EXPR, "widen_mult_odd_expr", tcc_binary, 2)
1365*38fd1498Szrj
1366*38fd1498Szrj/* Unpack (extract and promote/widen) the high/low elements of the input
1367*38fd1498Szrj   vector into the output vector.  The input vector has twice as many
1368*38fd1498Szrj   elements as the output vector, that are half the size of the elements
1369*38fd1498Szrj   of the output vector.  This is used to support type promotion. */
1370*38fd1498SzrjDEFTREECODE (VEC_UNPACK_HI_EXPR, "vec_unpack_hi_expr", tcc_unary, 1)
1371*38fd1498SzrjDEFTREECODE (VEC_UNPACK_LO_EXPR, "vec_unpack_lo_expr", tcc_unary, 1)
1372*38fd1498Szrj
1373*38fd1498Szrj/* Unpack (extract) the high/low elements of the input vector, convert
1374*38fd1498Szrj   fixed point values to floating point and widen elements into the
1375*38fd1498Szrj   output vector.  The input vector has twice as many elements as the output
1376*38fd1498Szrj   vector, that are half the size of the elements of the output vector.  */
1377*38fd1498SzrjDEFTREECODE (VEC_UNPACK_FLOAT_HI_EXPR, "vec_unpack_float_hi_expr", tcc_unary, 1)
1378*38fd1498SzrjDEFTREECODE (VEC_UNPACK_FLOAT_LO_EXPR, "vec_unpack_float_lo_expr", tcc_unary, 1)
1379*38fd1498Szrj
1380*38fd1498Szrj/* Pack (demote/narrow and merge) the elements of the two input vectors
1381*38fd1498Szrj   into the output vector using truncation/saturation.
1382*38fd1498Szrj   The elements of the input vectors are twice the size of the elements of the
1383*38fd1498Szrj   output vector.  This is used to support type demotion.  */
1384*38fd1498SzrjDEFTREECODE (VEC_PACK_TRUNC_EXPR, "vec_pack_trunc_expr", tcc_binary, 2)
1385*38fd1498SzrjDEFTREECODE (VEC_PACK_SAT_EXPR, "vec_pack_sat_expr", tcc_binary, 2)
1386*38fd1498Szrj
1387*38fd1498Szrj/* Convert floating point values of the two input vectors to integer
1388*38fd1498Szrj   and pack (narrow and merge) the elements into the output vector. The
1389*38fd1498Szrj   elements of the input vector are twice the size of the elements of
1390*38fd1498Szrj   the output vector.  */
1391*38fd1498SzrjDEFTREECODE (VEC_PACK_FIX_TRUNC_EXPR, "vec_pack_fix_trunc_expr", tcc_binary, 2)
1392*38fd1498Szrj
1393*38fd1498Szrj/* Widening vector shift left in bits.
1394*38fd1498Szrj   Operand 0 is a vector to be shifted with N elements of size S.
1395*38fd1498Szrj   Operand 1 is an integer shift amount in bits.
1396*38fd1498Szrj   The result of the operation is N elements of size 2*S.
1397*38fd1498Szrj   VEC_WIDEN_LSHIFT_HI_EXPR computes the N/2 high results.
1398*38fd1498Szrj   VEC_WIDEN_LSHIFT_LO_EXPR computes the N/2 low results.
1399*38fd1498Szrj */
1400*38fd1498SzrjDEFTREECODE (VEC_WIDEN_LSHIFT_HI_EXPR, "widen_lshift_hi_expr", tcc_binary, 2)
1401*38fd1498SzrjDEFTREECODE (VEC_WIDEN_LSHIFT_LO_EXPR, "widen_lshift_lo_expr", tcc_binary, 2)
1402*38fd1498Szrj
1403*38fd1498Szrj/* PREDICT_EXPR.  Specify hint for branch prediction.  The
1404*38fd1498Szrj   PREDICT_EXPR_PREDICTOR specify predictor and PREDICT_EXPR_OUTCOME the
1405*38fd1498Szrj   outcome (0 for not taken and 1 for taken).  Once the profile is guessed
1406*38fd1498Szrj   all conditional branches leading to execution paths executing the
1407*38fd1498Szrj   PREDICT_EXPR will get predicted by the specified predictor.  */
1408*38fd1498SzrjDEFTREECODE (PREDICT_EXPR, "predict_expr", tcc_expression, 1)
1409*38fd1498Szrj
1410*38fd1498Szrj/* OPTIMIZATION_NODE.  Node to store the optimization options.  */
1411*38fd1498SzrjDEFTREECODE (OPTIMIZATION_NODE, "optimization_node", tcc_exceptional, 0)
1412*38fd1498Szrj
1413*38fd1498Szrj/* TARGET_OPTION_NODE.  Node to store the target specific options.  */
1414*38fd1498SzrjDEFTREECODE (TARGET_OPTION_NODE, "target_option_node", tcc_exceptional, 0)
1415*38fd1498Szrj
1416*38fd1498Szrj/* ANNOTATE_EXPR.
1417*38fd1498Szrj   Operand 0 is the expression to be annotated.
1418*38fd1498Szrj   Operand 1 is the annotation kind.
1419*38fd1498Szrj   Operand 2 is additional data.  */
1420*38fd1498SzrjDEFTREECODE (ANNOTATE_EXPR, "annotate_expr", tcc_expression, 3)
1421*38fd1498Szrj
1422*38fd1498Szrj/*
1423*38fd1498SzrjLocal variables:
1424*38fd1498Szrjmode:c
1425*38fd1498SzrjEnd:
1426*38fd1498Szrj*/
1427