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