]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/ada/gcc-interface/ada-tree.h
use templates instead of gengtype for typed allocation functions
[thirdparty/gcc.git] / gcc / ada / gcc-interface / ada-tree.h
CommitLineData
27becfc8 1/****************************************************************************
2 * *
3 * GNAT COMPILER COMPONENTS *
4 * *
5 * A D A - T R E E *
6 * *
7 * C Header File *
8 * *
86ac9c59 9 * Copyright (C) 1992-2014, Free Software Foundation, Inc. *
27becfc8 10 * *
11 * GNAT is free software; you can redistribute it and/or modify it under *
12 * terms of the GNU General Public License as published by the Free Soft- *
13 * ware Foundation; either version 3, or (at your option) any later ver- *
14 * sion. GNAT is distributed in the hope that it will be useful, but WITH- *
15 * OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY *
16 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License *
17 * for more details. You should have received a copy of the GNU General *
18 * Public License along with GCC; see the file COPYING3. If not see *
19 * <http://www.gnu.org/licenses/>. *
20 * *
21 * GNAT was originally developed by the GNAT team at New York University. *
22 * Extensive contributions were provided by Ada Core Technologies Inc. *
23 * *
24 ****************************************************************************/
25
0fbac54a 26/* The resulting tree type. */
fb1e4f4a 27union GTY((desc ("0"),
9b88d08d 28 chain_next ("CODE_CONTAINS_STRUCT (TREE_CODE (&%h.generic), TS_COMMON) ? ((union lang_tree_node *) TREE_CHAIN (&%h.generic)) : NULL")))
0fbac54a 29 lang_tree_node
27becfc8 30{
0fbac54a 31 union tree_node GTY((tag ("0"),
32 desc ("tree_node_structure (&%h)"))) generic;
27becfc8 33};
27becfc8 34
25a27413 35/* Ada uses the lang_decl and lang_type fields to hold a tree. */
36struct GTY(()) lang_type { tree t; };
37struct GTY(()) lang_decl { tree t; };
0fbac54a 38
39/* Macros to get and set the tree in TYPE_LANG_SPECIFIC. */
27becfc8 40#define GET_TYPE_LANG_SPECIFIC(NODE) \
41 (TYPE_LANG_SPECIFIC (NODE) ? TYPE_LANG_SPECIFIC (NODE)->t : NULL_TREE)
0fbac54a 42
02186bef 43#define SET_TYPE_LANG_SPECIFIC(NODE, X) \
44do { \
45 tree tmp = (X); \
46 if (!TYPE_LANG_SPECIFIC (NODE)) \
47 TYPE_LANG_SPECIFIC (NODE) \
25a27413 48 = ggc_alloc<struct lang_type> (); \
02186bef 49 TYPE_LANG_SPECIFIC (NODE)->t = tmp; \
9af94d3d 50} while (0)
27becfc8 51
0fbac54a 52/* Macros to get and set the tree in DECL_LANG_SPECIFIC. */
27becfc8 53#define GET_DECL_LANG_SPECIFIC(NODE) \
54 (DECL_LANG_SPECIFIC (NODE) ? DECL_LANG_SPECIFIC (NODE)->t : NULL_TREE)
27becfc8 55
02186bef 56#define SET_DECL_LANG_SPECIFIC(NODE, X) \
57do { \
58 tree tmp = (X); \
59 if (!DECL_LANG_SPECIFIC (NODE)) \
60 DECL_LANG_SPECIFIC (NODE) \
25a27413 61 = ggc_alloc<struct lang_decl> (); \
02186bef 62 DECL_LANG_SPECIFIC (NODE)->t = tmp; \
9af94d3d 63} while (0)
0fbac54a 64
65
66/* Flags added to type nodes. */
27becfc8 67
68/* For RECORD_TYPE, UNION_TYPE, and QUAL_UNION_TYPE, nonzero if this is a
69 record being used as a fat pointer (only true for RECORD_TYPE). */
a98f6bec 70#define TYPE_FAT_POINTER_P(NODE) \
27becfc8 71 TYPE_LANG_FLAG_0 (RECORD_OR_UNION_CHECK (NODE))
72
a98f6bec 73#define TYPE_IS_FAT_POINTER_P(NODE) \
74 (TREE_CODE (NODE) == RECORD_TYPE && TYPE_FAT_POINTER_P (NODE))
27becfc8 75
76/* For integral types and array types, nonzero if this is a packed array type
77 used for bit-packed types. Such types should not be extended to a larger
78 size or validated against a specified size. */
a3b35344 79#define TYPE_PACKED_ARRAY_TYPE_P(NODE) \
80 TYPE_LANG_FLAG_0 (TREE_CHECK2 (NODE, INTEGER_TYPE, ARRAY_TYPE))
27becfc8 81
82#define TYPE_IS_PACKED_ARRAY_TYPE_P(NODE) \
83 ((TREE_CODE (NODE) == INTEGER_TYPE || TREE_CODE (NODE) == ARRAY_TYPE) \
84 && TYPE_PACKED_ARRAY_TYPE_P (NODE))
85
86/* For INTEGER_TYPE, nonzero if this is a modular type with a modulus that
87 is not equal to two to the power of its mode's size. */
88#define TYPE_MODULAR_P(NODE) TYPE_LANG_FLAG_1 (INTEGER_TYPE_CHECK (NODE))
89
90/* For ARRAY_TYPE, nonzero if this type corresponds to a dimension of
91 an Ada array other than the first. */
4880a940 92#define TYPE_MULTI_ARRAY_P(NODE) TYPE_LANG_FLAG_1 (ARRAY_TYPE_CHECK (NODE))
27becfc8 93
94/* For FUNCTION_TYPE, nonzero if this denotes a function returning an
95 unconstrained array or record. */
4cd5bb61 96#define TYPE_RETURN_UNCONSTRAINED_P(NODE) \
27becfc8 97 TYPE_LANG_FLAG_1 (FUNCTION_TYPE_CHECK (NODE))
98
99/* For RECORD_TYPE, UNION_TYPE, and QUAL_UNION_TYPE, nonzero if this denotes
100 a justified modular type (will only be true for RECORD_TYPE). */
101#define TYPE_JUSTIFIED_MODULAR_P(NODE) \
102 TYPE_LANG_FLAG_1 (RECORD_OR_UNION_CHECK (NODE))
103
104/* Nonzero in an arithmetic subtype if this is a subtype not known to the
105 front-end. */
b1b2597a 106#define TYPE_EXTRA_SUBTYPE_P(NODE) TYPE_LANG_FLAG_2 (INTEGER_TYPE_CHECK (NODE))
27becfc8 107
a3b35344 108/* Nonzero for an aggregate type if this is a by-reference type. We also
109 set this on an ENUMERAL_TYPE that is dummy. */
110#define TYPE_BY_REFERENCE_P(NODE) \
111 TYPE_LANG_FLAG_2 (TREE_CHECK5 (NODE, RECORD_TYPE, UNION_TYPE, \
112 ARRAY_TYPE, UNCONSTRAINED_ARRAY_TYPE, \
113 ENUMERAL_TYPE))
114
115#define TYPE_IS_BY_REFERENCE_P(NODE) \
116 ((TREE_CODE (NODE) == RECORD_TYPE \
117 || TREE_CODE (NODE) == UNION_TYPE \
118 || TREE_CODE (NODE) == ARRAY_TYPE \
119 || TREE_CODE (NODE) == UNCONSTRAINED_ARRAY_TYPE \
120 || TREE_CODE (NODE) == ENUMERAL_TYPE) \
121 && TYPE_BY_REFERENCE_P (NODE))
122
7b4b0e11 123/* For INTEGER_TYPE, nonzero if this really represents a VAX
124 floating-point type. */
125#define TYPE_VAX_FLOATING_POINT_P(NODE) \
126 TYPE_LANG_FLAG_3 (INTEGER_TYPE_CHECK (NODE))
127
27becfc8 128/* For RECORD_TYPE, UNION_TYPE, and QUAL_UNION_TYPE, nonzero if this is the
129 type for an object whose type includes its template in addition to
130 its value (only true for RECORD_TYPE). */
131#define TYPE_CONTAINS_TEMPLATE_P(NODE) \
132 TYPE_LANG_FLAG_3 (RECORD_OR_UNION_CHECK (NODE))
133
27becfc8 134/* True if NODE is a thin pointer. */
a98f6bec 135#define TYPE_IS_THIN_POINTER_P(NODE) \
27becfc8 136 (POINTER_TYPE_P (NODE) \
137 && TREE_CODE (TREE_TYPE (NODE)) == RECORD_TYPE \
138 && TYPE_CONTAINS_TEMPLATE_P (TREE_TYPE (NODE)))
139
140/* True if TYPE is either a fat or thin pointer to an unconstrained
141 array. */
a98f6bec 142#define TYPE_IS_FAT_OR_THIN_POINTER_P(NODE) \
143 (TYPE_IS_FAT_POINTER_P (NODE) || TYPE_IS_THIN_POINTER_P (NODE))
27becfc8 144
145/* For INTEGER_TYPEs, nonzero if the type has a biased representation. */
146#define TYPE_BIASED_REPRESENTATION_P(NODE) \
147 TYPE_LANG_FLAG_4 (INTEGER_TYPE_CHECK (NODE))
148
149/* For ARRAY_TYPEs, nonzero if the array type has Convention_Fortran. */
150#define TYPE_CONVENTION_FORTRAN_P(NODE) \
151 TYPE_LANG_FLAG_4 (ARRAY_TYPE_CHECK (NODE))
152
4cd5bb61 153/* For FUNCTION_TYPEs, nonzero if the function returns by direct reference,
154 i.e. the callee returns a pointer to a memory location it has allocated
155 and the caller only needs to dereference the pointer. */
156#define TYPE_RETURN_BY_DIRECT_REF_P(NODE) \
27becfc8 157 TYPE_LANG_FLAG_4 (FUNCTION_TYPE_CHECK (NODE))
158
a3b35344 159/* For RECORD_TYPE, UNION_TYPE and ENUMERAL_TYPE, nonzero if this is a dummy
160 type, made to correspond to a private or incomplete type. */
161#define TYPE_DUMMY_P(NODE) \
162 TYPE_LANG_FLAG_4 (TREE_CHECK3 (NODE, RECORD_TYPE, UNION_TYPE, ENUMERAL_TYPE))
27becfc8 163
a3b35344 164#define TYPE_IS_DUMMY_P(NODE) \
165 ((TREE_CODE (NODE) == RECORD_TYPE \
166 || TREE_CODE (NODE) == UNION_TYPE \
167 || TREE_CODE (NODE) == ENUMERAL_TYPE) \
27becfc8 168 && TYPE_DUMMY_P (NODE))
169
27becfc8 170/* For an INTEGER_TYPE, nonzero if TYPE_ACTUAL_BOUNDS is present. */
171#define TYPE_HAS_ACTUAL_BOUNDS_P(NODE) \
172 TYPE_LANG_FLAG_5 (INTEGER_TYPE_CHECK (NODE))
173
174/* For a RECORD_TYPE, nonzero if this was made just to supply needed
175 padding or alignment. */
a98f6bec 176#define TYPE_PADDING_P(NODE) TYPE_LANG_FLAG_5 (RECORD_TYPE_CHECK (NODE))
177
178#define TYPE_IS_PADDING_P(NODE) \
179 (TREE_CODE (NODE) == RECORD_TYPE && TYPE_PADDING_P (NODE))
27becfc8 180
181/* True if TYPE can alias any other types. */
182#define TYPE_UNIVERSAL_ALIASING_P(NODE) TYPE_LANG_FLAG_6 (NODE)
183
a3b35344 184/* For an UNCONSTRAINED_ARRAY_TYPE, this is the record containing both the
91c756e6 185 template and the object.
186
187 ??? We also put this on an ENUMERAL_TYPE that is dummy. Technically,
188 this is a conflict on the minval field, but there doesn't seem to be
189 simple fix, so we'll live with this kludge for now. */
190#define TYPE_OBJECT_RECORD_TYPE(NODE) \
8f2eb9e1 191 (TYPE_MINVAL (TREE_CHECK2 ((NODE), UNCONSTRAINED_ARRAY_TYPE, ENUMERAL_TYPE)))
27becfc8 192
a9538d68 193/* For numerical types, this is the GCC lower bound of the type. The GCC
194 type system is based on the invariant that an object X of a given type
195 cannot hold at run time a value smaller than its lower bound; otherwise
196 the behavior is undefined. The optimizer takes advantage of this and
197 considers that the assertion X >= LB is always true. */
8f2eb9e1 198#define TYPE_GCC_MIN_VALUE(NODE) (TYPE_MINVAL (NUMERICAL_TYPE_CHECK (NODE)))
a9538d68 199
200/* For numerical types, this is the GCC upper bound of the type. The GCC
201 type system is based on the invariant that an object X of a given type
202 cannot hold at run time a value larger than its upper bound; otherwise
203 the behavior is undefined. The optimizer takes advantage of this and
204 considers that the assertion X <= UB is always true. */
8f2eb9e1 205#define TYPE_GCC_MAX_VALUE(NODE) (TYPE_MAXVAL (NUMERICAL_TYPE_CHECK (NODE)))
a9538d68 206
91c756e6 207/* For a FUNCTION_TYPE, if the subprogram has parameters passed by copy in/
208 copy out, this is the list of nodes used to specify the return values of
209 the out (or in out) parameters that are passed by copy in/copy out. For
210 a full description of the copy in/copy out parameter passing mechanism
211 refer to the routine gnat_to_gnu_entity. */
212#define TYPE_CI_CO_LIST(NODE) TYPE_LANG_SLOT_1 (FUNCTION_TYPE_CHECK (NODE))
213
52dd2567 214/* For a VECTOR_TYPE, this is the representative array type. */
215#define TYPE_REPRESENTATIVE_ARRAY(NODE) \
216 TYPE_LANG_SLOT_1 (VECTOR_TYPE_CHECK (NODE))
217
a9538d68 218/* For numerical types, this holds various RM-defined values. */
219#define TYPE_RM_VALUES(NODE) TYPE_LANG_SLOT_1 (NUMERICAL_TYPE_CHECK (NODE))
220
9af94d3d 221/* Macros to get and set the individual values in TYPE_RM_VALUES. */
222#define TYPE_RM_VALUE(NODE, N) \
223 (TYPE_RM_VALUES (NODE) \
224 ? TREE_VEC_ELT (TYPE_RM_VALUES (NODE), (N)) : NULL_TREE)
225
226#define SET_TYPE_RM_VALUE(NODE, N, X) \
227do { \
228 tree tmp = (X); \
229 if (!TYPE_RM_VALUES (NODE)) \
230 TYPE_RM_VALUES (NODE) = make_tree_vec (3); \
7cdef07d 231 /* ??? The field is not visited by the generic \
232 code so we need to mark it manually. */ \
354af424 233 MARK_VISITED (tmp); \
9af94d3d 234 TREE_VEC_ELT (TYPE_RM_VALUES (NODE), (N)) = tmp; \
235} while (0)
236
a9538d68 237/* For numerical types, this is the RM size of the type, aka its precision.
238 There is a discrepancy between what is called precision here (and more
239 generally throughout gigi) and what is called precision in the GCC type
240 system: in the former case it's TYPE_RM_SIZE whereas it's TYPE_PRECISION
241 in the latter case. They are not identical because of the need to support
242 invalid values.
243
244 These values can be outside the range of values allowed by the RM size
245 but they must nevertheless be valid in the GCC type system, otherwise
246 the optimizer can pretend that they simply don't exist. Therefore they
247 must be within the range of values allowed by the precision in the GCC
248 sense, hence TYPE_PRECISION be set to the Esize, not the RM size. */
9af94d3d 249#define TYPE_RM_SIZE(NODE) TYPE_RM_VALUE ((NODE), 0)
250#define SET_TYPE_RM_SIZE(NODE, X) SET_TYPE_RM_VALUE ((NODE), 0, (X))
a9538d68 251
252/* For numerical types, this is the RM lower bound of the type. There is
253 again a discrepancy between this lower bound and the GCC lower bound,
254 again because of the need to support invalid values.
255
256 These values can be outside the range of values allowed by the RM lower
257 bound but they must nevertheless be valid in the GCC type system, otherwise
258 the optimizer can pretend that they simply don't exist. Therefore they
259 must be within the range of values allowed by the lower bound in the GCC
260 sense, hence the GCC lower bound be set to that of the base type. */
9af94d3d 261#define TYPE_RM_MIN_VALUE(NODE) TYPE_RM_VALUE ((NODE), 1)
262#define SET_TYPE_RM_MIN_VALUE(NODE, X) SET_TYPE_RM_VALUE ((NODE), 1, (X))
a9538d68 263
264/* For numerical types, this is the RM upper bound of the type. There is
265 again a discrepancy between this upper bound and the GCC upper bound,
266 again because of the need to support invalid values.
267
268 These values can be outside the range of values allowed by the RM upper
269 bound but they must nevertheless be valid in the GCC type system, otherwise
270 the optimizer can pretend that they simply don't exist. Therefore they
271 must be within the range of values allowed by the upper bound in the GCC
272 sense, hence the GCC upper bound be set to that of the base type. */
9af94d3d 273#define TYPE_RM_MAX_VALUE(NODE) TYPE_RM_VALUE ((NODE), 2)
274#define SET_TYPE_RM_MAX_VALUE(NODE, X) SET_TYPE_RM_VALUE ((NODE), 2, (X))
a9538d68 275
276/* For numerical types, this is the lower bound of the type, i.e. the RM lower
277 bound for language-defined types and the GCC lower bound for others. */
278#undef TYPE_MIN_VALUE
279#define TYPE_MIN_VALUE(NODE) \
280 (TYPE_RM_MIN_VALUE (NODE) \
281 ? TYPE_RM_MIN_VALUE (NODE) : TYPE_GCC_MIN_VALUE (NODE))
282
283/* For numerical types, this is the upper bound of the type, i.e. the RM upper
284 bound for language-defined types and the GCC upper bound for others. */
285#undef TYPE_MAX_VALUE
286#define TYPE_MAX_VALUE(NODE) \
287 (TYPE_RM_MAX_VALUE (NODE) \
288 ? TYPE_RM_MAX_VALUE (NODE) : TYPE_GCC_MAX_VALUE (NODE))
153edb51 289
27becfc8 290/* For an INTEGER_TYPE with TYPE_MODULAR_P, this is the value of the
291 modulus. */
26bf1588 292#define TYPE_MODULUS(NODE) \
293 GET_TYPE_LANG_SPECIFIC (INTEGER_TYPE_CHECK (NODE))
4880a940 294#define SET_TYPE_MODULUS(NODE, X) \
27becfc8 295 SET_TYPE_LANG_SPECIFIC (INTEGER_TYPE_CHECK (NODE), X)
296
0fbac54a 297/* For an INTEGER_TYPE with TYPE_VAX_FLOATING_POINT_P, this is the
298 Digits_Value. */
299#define TYPE_DIGITS_VALUE(NODE) \
300 GET_TYPE_LANG_SPECIFIC (INTEGER_TYPE_CHECK (NODE))
301#define SET_TYPE_DIGITS_VALUE(NODE, X) \
302 SET_TYPE_LANG_SPECIFIC (INTEGER_TYPE_CHECK (NODE), X)
303
304/* For an INTEGER_TYPE that is the TYPE_DOMAIN of some ARRAY_TYPE, this is
27becfc8 305 the type corresponding to the Ada index type. */
306#define TYPE_INDEX_TYPE(NODE) \
307 GET_TYPE_LANG_SPECIFIC (INTEGER_TYPE_CHECK (NODE))
308#define SET_TYPE_INDEX_TYPE(NODE, X) \
309 SET_TYPE_LANG_SPECIFIC (INTEGER_TYPE_CHECK (NODE), X)
310
0fbac54a 311/* For an INTEGER_TYPE with TYPE_HAS_ACTUAL_BOUNDS_P or an ARRAY_TYPE, this is
312 the index type that should be used when the actual bounds are required for
313 a template. This is used in the case of packed arrays. */
314#define TYPE_ACTUAL_BOUNDS(NODE) \
315 GET_TYPE_LANG_SPECIFIC (TREE_CHECK2 (NODE, INTEGER_TYPE, ARRAY_TYPE))
316#define SET_TYPE_ACTUAL_BOUNDS(NODE, X) \
317 SET_TYPE_LANG_SPECIFIC (TREE_CHECK2 (NODE, INTEGER_TYPE, ARRAY_TYPE), X)
27becfc8 318
26bf1588 319/* For a POINTER_TYPE that points to the template type of an unconstrained
320 array type, this is the address to be used in a null fat pointer. */
321#define TYPE_NULL_BOUNDS(NODE) \
322 GET_TYPE_LANG_SPECIFIC (POINTER_TYPE_CHECK (NODE))
323#define SET_TYPE_NULL_BOUNDS(NODE, X) \
324 SET_TYPE_LANG_SPECIFIC (POINTER_TYPE_CHECK (NODE), X)
325
91c756e6 326/* For a RECORD_TYPE that is a fat pointer, this is the type for the
7b4b0e11 327 unconstrained array. Likewise for a RECORD_TYPE that is pointed
328 to by a thin pointer, if it is made for the unconstrained array
329 type itself; the field is NULL_TREE if the RECORD_TYPE is made
330 for a constrained subtype of the array type. */
4880a940 331#define TYPE_UNCONSTRAINED_ARRAY(NODE) \
27becfc8 332 GET_TYPE_LANG_SPECIFIC (RECORD_TYPE_CHECK (NODE))
4880a940 333#define SET_TYPE_UNCONSTRAINED_ARRAY(NODE, X) \
27becfc8 334 SET_TYPE_LANG_SPECIFIC (RECORD_TYPE_CHECK (NODE), X)
335
91c756e6 336/* For other RECORD_TYPEs and all UNION_TYPEs and QUAL_UNION_TYPEs, this is
337 the Ada size of the object. This differs from the GCC size in that it
338 does not include any rounding up to the alignment of the type. */
4880a940 339#define TYPE_ADA_SIZE(NODE) \
27becfc8 340 GET_TYPE_LANG_SPECIFIC (RECORD_OR_UNION_CHECK (NODE))
341#define SET_TYPE_ADA_SIZE(NODE, X) \
342 SET_TYPE_LANG_SPECIFIC (RECORD_OR_UNION_CHECK (NODE), X)
343
27becfc8 344
0fbac54a 345/* Flags added to decl nodes. */
27becfc8 346
347/* Nonzero in a FUNCTION_DECL that represents a stubbed function
348 discriminant. */
349#define DECL_STUBBED_P(NODE) DECL_LANG_FLAG_0 (FUNCTION_DECL_CHECK (NODE))
350
351/* Nonzero in a VAR_DECL if it is guaranteed to be constant after having
352 been elaborated and TREE_READONLY is not set on it. */
353#define DECL_READONLY_ONCE_ELAB(NODE) DECL_LANG_FLAG_0 (VAR_DECL_CHECK (NODE))
354
e568189f 355/* Nonzero in a CONST_DECL if its value is (essentially) the address of a
356 constant CONSTRUCTOR. */
357#define DECL_CONST_ADDRESS_P(NODE) DECL_LANG_FLAG_0 (CONST_DECL_CHECK (NODE))
358
587b5d75 359/* Nonzero in a FIELD_DECL if it is declared as aliased. */
360#define DECL_ALIASED_P(NODE) DECL_LANG_FLAG_0 (FIELD_DECL_CHECK (NODE))
361
86bfd6f3 362/* Nonzero in a TYPE_DECL if this is the declaration of a Taft amendment type
363 in the main unit, i.e. the full declaration is available. */
364#define DECL_TAFT_TYPE_P(NODE) DECL_LANG_FLAG_0 (TYPE_DECL_CHECK (NODE))
365
aacd5a58 366/* Nonzero in a DECL if it is always used by reference, i.e. an INDIRECT_REF
27becfc8 367 is needed to access the object. */
368#define DECL_BY_REF_P(NODE) DECL_LANG_FLAG_1 (NODE)
369
0b1f7790 370/* Nonzero in a DECL if it is made for a pointer that can never be null. */
371#define DECL_CAN_NEVER_BE_NULL_P(NODE) DECL_LANG_FLAG_2 (NODE)
372
1d957068 373/* Nonzero in a VAR_DECL if it is made for a loop parameter. */
374#define DECL_LOOP_PARM_P(NODE) DECL_LANG_FLAG_3 (VAR_DECL_CHECK (NODE))
375
27becfc8 376/* Nonzero in a FIELD_DECL that is a dummy built for some internal reason. */
377#define DECL_INTERNAL_P(NODE) DECL_LANG_FLAG_3 (FIELD_DECL_CHECK (NODE))
378
aacd5a58 379/* Nonzero in a PARM_DECL if it is made for an Ada array being passed to a
27becfc8 380 foreign convention subprogram. */
381#define DECL_BY_COMPONENT_PTR_P(NODE) DECL_LANG_FLAG_3 (PARM_DECL_CHECK (NODE))
382
383/* Nonzero in a FUNCTION_DECL that corresponds to an elaboration procedure. */
384#define DECL_ELABORATION_PROC_P(NODE) \
385 DECL_LANG_FLAG_3 (FUNCTION_DECL_CHECK (NODE))
386
aacd5a58 387/* Nonzero in a DECL if it is made for a pointer that points to something which
0b1f7790 388 is readonly. */
27becfc8 389#define DECL_POINTS_TO_READONLY_P(NODE) DECL_LANG_FLAG_4 (NODE)
390
27becfc8 391/* Nonzero in a PARM_DECL if we are to pass by descriptor. */
392#define DECL_BY_DESCRIPTOR_P(NODE) DECL_LANG_FLAG_5 (PARM_DECL_CHECK (NODE))
393
394/* Nonzero in a VAR_DECL if it is a pointer renaming a global object. */
395#define DECL_RENAMING_GLOBAL_P(NODE) DECL_LANG_FLAG_5 (VAR_DECL_CHECK (NODE))
396
0fbac54a 397/* In a FIELD_DECL corresponding to a discriminant, contains the
398 discriminant number. */
399#define DECL_DISCRIMINANT_NUMBER(NODE) DECL_INITIAL (FIELD_DECL_CHECK (NODE))
400
27becfc8 401/* In a CONST_DECL, points to a VAR_DECL that is allocatable to
402 memory. Used when a scalar constant is aliased or has its
403 address taken. */
404#define DECL_CONST_CORRESPONDING_VAR(NODE) \
405 GET_DECL_LANG_SPECIFIC (CONST_DECL_CHECK (NODE))
406#define SET_DECL_CONST_CORRESPONDING_VAR(NODE, X) \
407 SET_DECL_LANG_SPECIFIC (CONST_DECL_CHECK (NODE), X)
408
409/* In a FIELD_DECL, points to the FIELD_DECL that was the ultimate
410 source of the decl. */
411#define DECL_ORIGINAL_FIELD(NODE) \
412 GET_DECL_LANG_SPECIFIC (FIELD_DECL_CHECK (NODE))
413#define SET_DECL_ORIGINAL_FIELD(NODE, X) \
414 SET_DECL_LANG_SPECIFIC (FIELD_DECL_CHECK (NODE), X)
415
e568189f 416/* Set DECL_ORIGINAL_FIELD of FIELD1 to (that of) FIELD2. */
417#define SET_DECL_ORIGINAL_FIELD_TO_FIELD(FIELD1, FIELD2) \
418 SET_DECL_ORIGINAL_FIELD ((FIELD1), \
419 DECL_ORIGINAL_FIELD (FIELD2) \
420 ? DECL_ORIGINAL_FIELD (FIELD2) : (FIELD2))
421
422/* Return true if FIELD1 and FIELD2 represent the same field. */
423#define SAME_FIELD_P(FIELD1, FIELD2) \
424 ((FIELD1) == (FIELD2) \
425 || DECL_ORIGINAL_FIELD (FIELD1) == (FIELD2) \
426 || (FIELD1) == DECL_ORIGINAL_FIELD (FIELD2) \
427 || (DECL_ORIGINAL_FIELD (FIELD1) \
428 && (DECL_ORIGINAL_FIELD (FIELD1) == DECL_ORIGINAL_FIELD (FIELD2))))
429
1d957068 430/* In a VAR_DECL with the DECL_LOOP_PARM_P flag set, points to the special
431 induction variable that is built under certain circumstances, if any. */
432#define DECL_INDUCTION_VAR(NODE) \
433 GET_DECL_LANG_SPECIFIC (VAR_DECL_CHECK (NODE))
434#define SET_DECL_INDUCTION_VAR(NODE, X) \
435 SET_DECL_LANG_SPECIFIC (VAR_DECL_CHECK (NODE), X)
436
437/* In a VAR_DECL without the DECL_LOOP_PARM_P flag set and that is a renaming
438 pointer, points to the object being renamed, if any. Note that this object
439 is guaranteed to be protected against multiple evaluations. */
27becfc8 440#define DECL_RENAMED_OBJECT(NODE) \
441 GET_DECL_LANG_SPECIFIC (VAR_DECL_CHECK (NODE))
442#define SET_DECL_RENAMED_OBJECT(NODE, X) \
443 SET_DECL_LANG_SPECIFIC (VAR_DECL_CHECK (NODE), X)
444
445/* In a TYPE_DECL, points to the parallel type if any, otherwise 0. */
446#define DECL_PARALLEL_TYPE(NODE) \
447 GET_DECL_LANG_SPECIFIC (TYPE_DECL_CHECK (NODE))
448#define SET_DECL_PARALLEL_TYPE(NODE, X) \
449 SET_DECL_LANG_SPECIFIC (TYPE_DECL_CHECK (NODE), X)
450
451/* In a FUNCTION_DECL, points to the stub associated with the function
452 if any, otherwise 0. */
453#define DECL_FUNCTION_STUB(NODE) \
454 GET_DECL_LANG_SPECIFIC (FUNCTION_DECL_CHECK (NODE))
455#define SET_DECL_FUNCTION_STUB(NODE, X) \
456 SET_DECL_LANG_SPECIFIC (FUNCTION_DECL_CHECK (NODE), X)
457
a16de24a 458/* In a PARM_DECL, points to the alternate TREE_TYPE. */
459#define DECL_PARM_ALT_TYPE(NODE) \
dc3276a2 460 GET_DECL_LANG_SPECIFIC (PARM_DECL_CHECK (NODE))
a16de24a 461#define SET_DECL_PARM_ALT_TYPE(NODE, X) \
dc3276a2 462 SET_DECL_LANG_SPECIFIC (PARM_DECL_CHECK (NODE), X)
463
27becfc8 464
d949134d 465/* Flags added to ref nodes. */
466
467/* Nonzero means this node will not trap. */
468#undef TREE_THIS_NOTRAP
469#define TREE_THIS_NOTRAP(NODE) \
470 (TREE_CHECK4 (NODE, INDIRECT_REF, ARRAY_REF, UNCONSTRAINED_ARRAY_REF, \
471 ARRAY_RANGE_REF)->base.nothrow_flag)
472
473
0fbac54a 474/* Fields and macros for statements. */
4880a940 475#define IS_ADA_STMT(NODE) \
476 (STATEMENT_CLASS_P (NODE) && TREE_CODE (NODE) >= STMT_STMT)
27becfc8 477
4880a940 478#define STMT_STMT_STMT(NODE) TREE_OPERAND_CHECK_CODE (NODE, STMT_STMT, 0)
5db3067f 479
480#define LOOP_STMT_COND(NODE) TREE_OPERAND_CHECK_CODE (NODE, LOOP_STMT, 0)
481#define LOOP_STMT_UPDATE(NODE) TREE_OPERAND_CHECK_CODE (NODE, LOOP_STMT, 1)
482#define LOOP_STMT_BODY(NODE) TREE_OPERAND_CHECK_CODE (NODE, LOOP_STMT, 2)
483#define LOOP_STMT_LABEL(NODE) TREE_OPERAND_CHECK_CODE (NODE, LOOP_STMT, 3)
484
485/* A loop statement is conceptually made up of 6 sub-statements:
486
487 loop:
488 TOP_CONDITION
489 TOP_UPDATE
490 BODY
491 BOTTOM_CONDITION
492 BOTTOM_UPDATE
493 GOTO loop
494
495 However, only 4 of them can exist for a given loop, the pair of conditions
496 and the pair of updates being mutually exclusive. The default setting is
497 TOP_CONDITION and BOTTOM_UPDATE and the following couple of flags are used
498 to toggle the individual settings. */
499#define LOOP_STMT_BOTTOM_COND_P(NODE) TREE_LANG_FLAG_0 (LOOP_STMT_CHECK (NODE))
500#define LOOP_STMT_TOP_UPDATE_P(NODE) TREE_LANG_FLAG_1 (LOOP_STMT_CHECK (NODE))
501
a4f25704 502/* Optimization hints on loops. */
86ac9c59 503#define LOOP_STMT_IVDEP(NODE) TREE_LANG_FLAG_2 (LOOP_STMT_CHECK (NODE))
504#define LOOP_STMT_NO_UNROLL(NODE) TREE_LANG_FLAG_3 (LOOP_STMT_CHECK (NODE))
505#define LOOP_STMT_UNROLL(NODE) TREE_LANG_FLAG_4 (LOOP_STMT_CHECK (NODE))
506#define LOOP_STMT_NO_VECTOR(NODE) TREE_LANG_FLAG_5 (LOOP_STMT_CHECK (NODE))
507#define LOOP_STMT_VECTOR(NODE) TREE_LANG_FLAG_6 (LOOP_STMT_CHECK (NODE))
a4f25704 508
4880a940 509#define EXIT_STMT_COND(NODE) TREE_OPERAND_CHECK_CODE (NODE, EXIT_STMT, 0)
510#define EXIT_STMT_LABEL(NODE) TREE_OPERAND_CHECK_CODE (NODE, EXIT_STMT, 1)