]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/tree.h
* expr.h: Remove prototypes of functions defined in builtins.c.
[thirdparty/gcc.git] / gcc / tree.h
CommitLineData
0aca815c 1/* Definitions for the ubiquitous 'tree' type for GNU compilers.
3aea1f79 2 Copyright (C) 1989-2014 Free Software Foundation, Inc.
d72a838e 3
f12b58b3 4This file is part of GCC.
d72a838e 5
f12b58b3 6GCC is free software; you can redistribute it and/or modify it under
7the terms of the GNU General Public License as published by the Free
8c4c00c1 8Software Foundation; either version 3, or (at your option) any later
f12b58b3 9version.
d72a838e 10
f12b58b3 11GCC is distributed in the hope that it will be useful, but WITHOUT ANY
12WARRANTY; without even the implied warranty of MERCHANTABILITY or
13FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14for more details.
d72a838e 15
16You should have received a copy of the GNU General Public License
8c4c00c1 17along with GCC; see the file COPYING3. If not see
18<http://www.gnu.org/licenses/>. */
d72a838e 19
b229f760 20#ifndef GCC_TREE_H
21#define GCC_TREE_H
22
96423453 23#include "tree-core.h"
796b6678 24#include "wide-int.h"
5ded8c6f 25
9ed99284 26/* These includes are required here because they provide declarations
27 used by inline functions in this file.
28
29 FIXME - Move these users elsewhere? */
30#include "fold-const.h"
31
9b88d08d 32/* Macros for initializing `tree_contains_struct'. */
33#define MARK_TS_BASE(C) \
34 do { \
35 tree_contains_struct[C][TS_BASE] = 1; \
36 } while (0)
37
38#define MARK_TS_TYPED(C) \
39 do { \
40 MARK_TS_BASE (C); \
41 tree_contains_struct[C][TS_TYPED] = 1; \
42 } while (0)
43
44#define MARK_TS_COMMON(C) \
45 do { \
46 MARK_TS_TYPED (C); \
47 tree_contains_struct[C][TS_COMMON] = 1; \
48 } while (0)
49
8f2eb9e1 50#define MARK_TS_TYPE_COMMON(C) \
51 do { \
52 MARK_TS_COMMON (C); \
53 tree_contains_struct[C][TS_TYPE_COMMON] = 1; \
54 } while (0)
55
56#define MARK_TS_TYPE_WITH_LANG_SPECIFIC(C) \
57 do { \
58 MARK_TS_TYPE_COMMON (C); \
59 tree_contains_struct[C][TS_TYPE_WITH_LANG_SPECIFIC] = 1; \
60 } while (0)
61
9b88d08d 62#define MARK_TS_DECL_MINIMAL(C) \
63 do { \
64 MARK_TS_COMMON (C); \
65 tree_contains_struct[C][TS_DECL_MINIMAL] = 1; \
66 } while (0)
67
68#define MARK_TS_DECL_COMMON(C) \
69 do { \
70 MARK_TS_DECL_MINIMAL (C); \
71 tree_contains_struct[C][TS_DECL_COMMON] = 1; \
72 } while (0)
73
74#define MARK_TS_DECL_WRTL(C) \
75 do { \
76 MARK_TS_DECL_COMMON (C); \
77 tree_contains_struct[C][TS_DECL_WRTL] = 1; \
78 } while (0)
79
80#define MARK_TS_DECL_WITH_VIS(C) \
81 do { \
82 MARK_TS_DECL_WRTL (C); \
83 tree_contains_struct[C][TS_DECL_WITH_VIS] = 1; \
84 } while (0)
85
86#define MARK_TS_DECL_NON_COMMON(C) \
87 do { \
88 MARK_TS_DECL_WITH_VIS (C); \
89 tree_contains_struct[C][TS_DECL_NON_COMMON] = 1; \
90 } while (0)
91
ce45a448 92
93/* Returns the string representing CLASS. */
94
95#define TREE_CODE_CLASS_STRING(CLASS)\
96 tree_code_class_strings[(int) (CLASS)]
d72a838e 97
b4dae43c 98#define TREE_CODE_CLASS(CODE) tree_code_type[(int) (CODE)]
d72a838e 99
8abb6daa 100/* Nonzero if NODE represents an exceptional code. */
ce45a448 101
8abb6daa 102#define EXCEPTIONAL_CLASS_P(NODE)\
103 (TREE_CODE_CLASS (TREE_CODE (NODE)) == tcc_exceptional)
ce45a448 104
8abb6daa 105/* Nonzero if NODE represents a constant. */
ce45a448 106
8abb6daa 107#define CONSTANT_CLASS_P(NODE)\
108 (TREE_CODE_CLASS (TREE_CODE (NODE)) == tcc_constant)
ce45a448 109
8abb6daa 110/* Nonzero if NODE represents a type. */
ce45a448 111
8abb6daa 112#define TYPE_P(NODE)\
113 (TREE_CODE_CLASS (TREE_CODE (NODE)) == tcc_type)
ce45a448 114
8abb6daa 115/* Nonzero if NODE represents a declaration. */
ce45a448 116
8abb6daa 117#define DECL_P(NODE)\
118 (TREE_CODE_CLASS (TREE_CODE (NODE)) == tcc_declaration)
ce45a448 119
80a58eb0 120/* True if NODE designates a variable declaration. */
121#define VAR_P(NODE) \
122 (TREE_CODE (NODE) == VAR_DECL)
123
5ded8c6f 124/* Nonzero if DECL represents a VAR_DECL or FUNCTION_DECL. */
125
126#define VAR_OR_FUNCTION_DECL_P(DECL)\
127 (TREE_CODE (DECL) == VAR_DECL || TREE_CODE (DECL) == FUNCTION_DECL)
128
8abb6daa 129/* Nonzero if NODE represents a INDIRECT_REF. Keep these checks in
9843a47d 130 ascending code order. */
5ded8c6f 131
8abb6daa 132#define INDIRECT_REF_P(NODE)\
133 (TREE_CODE (NODE) == INDIRECT_REF)
2a448a75 134
8abb6daa 135/* Nonzero if NODE represents a reference. */
ce45a448 136
8abb6daa 137#define REFERENCE_CLASS_P(NODE)\
138 (TREE_CODE_CLASS (TREE_CODE (NODE)) == tcc_reference)
ce45a448 139
8abb6daa 140/* Nonzero if NODE represents a comparison. */
ce45a448 141
8abb6daa 142#define COMPARISON_CLASS_P(NODE)\
143 (TREE_CODE_CLASS (TREE_CODE (NODE)) == tcc_comparison)
ce45a448 144
8abb6daa 145/* Nonzero if NODE represents a unary arithmetic expression. */
ce45a448 146
8abb6daa 147#define UNARY_CLASS_P(NODE)\
148 (TREE_CODE_CLASS (TREE_CODE (NODE)) == tcc_unary)
ce45a448 149
8abb6daa 150/* Nonzero if NODE represents a binary arithmetic expression. */
ce45a448 151
8abb6daa 152#define BINARY_CLASS_P(NODE)\
153 (TREE_CODE_CLASS (TREE_CODE (NODE)) == tcc_binary)
ce45a448 154
8abb6daa 155/* Nonzero if NODE represents a statement expression. */
ce45a448 156
8abb6daa 157#define STATEMENT_CLASS_P(NODE)\
158 (TREE_CODE_CLASS (TREE_CODE (NODE)) == tcc_statement)
ce45a448 159
8abb6daa 160/* Nonzero if NODE represents a function call-like expression with a
c2f47e15 161 variable-length operand vector. */
162
8abb6daa 163#define VL_EXP_CLASS_P(NODE)\
164 (TREE_CODE_CLASS (TREE_CODE (NODE)) == tcc_vl_exp)
c2f47e15 165
8abb6daa 166/* Nonzero if NODE represents any other expression. */
ce45a448 167
8abb6daa 168#define EXPRESSION_CLASS_P(NODE)\
169 (TREE_CODE_CLASS (TREE_CODE (NODE)) == tcc_expression)
ce45a448 170
8abb6daa 171/* Returns nonzero iff NODE represents a type or declaration. */
ce45a448 172
8abb6daa 173#define IS_TYPE_OR_DECL_P(NODE)\
174 (TYPE_P (NODE) || DECL_P (NODE))
66d12a6c 175
f712a0dc 176/* Returns nonzero iff CLASS is the tree-code class of an
14ac2afb 177 expression. */
178
ce45a448 179#define IS_EXPR_CODE_CLASS(CLASS)\
fbbb2067 180 ((CLASS) >= tcc_reference && (CLASS) <= tcc_expression)
b5e4e1dc 181
182/* Returns nonzero iff NODE is an expression of some kind. */
183
184#define EXPR_P(NODE) IS_EXPR_CODE_CLASS (TREE_CODE_CLASS (TREE_CODE (NODE)))
14ac2afb 185
f3c6d29a 186#define TREE_CODE_LENGTH(CODE) tree_code_length[(int) (CODE)]
d72a838e 187
df94cd3b 188
852da3c3 189/* Helper macros for math builtins. */
190
191#define BUILTIN_EXP10_P(FN) \
192 ((FN) == BUILT_IN_EXP10 || (FN) == BUILT_IN_EXP10F || (FN) == BUILT_IN_EXP10L \
193 || (FN) == BUILT_IN_POW10 || (FN) == BUILT_IN_POW10F || (FN) == BUILT_IN_POW10L)
194
195#define BUILTIN_EXPONENT_P(FN) (BUILTIN_EXP10_P (FN) \
196 || (FN) == BUILT_IN_EXP || (FN) == BUILT_IN_EXPF || (FN) == BUILT_IN_EXPL \
197 || (FN) == BUILT_IN_EXP2 || (FN) == BUILT_IN_EXP2F || (FN) == BUILT_IN_EXP2L)
198
199#define BUILTIN_SQRT_P(FN) \
200 ((FN) == BUILT_IN_SQRT || (FN) == BUILT_IN_SQRTF || (FN) == BUILT_IN_SQRTL)
201
202#define BUILTIN_CBRT_P(FN) \
203 ((FN) == BUILT_IN_CBRT || (FN) == BUILT_IN_CBRTF || (FN) == BUILT_IN_CBRTL)
204
205#define BUILTIN_ROOT_P(FN) (BUILTIN_SQRT_P (FN) || BUILTIN_CBRT_P (FN))
206
4f35b1fc 207#define CASE_FLT_FN(FN) case FN: case FN##F: case FN##L
e84da7c1 208#define CASE_FLT_FN_REENT(FN) case FN##_R: case FN##F_R: case FN##L_R
64b5be08 209#define CASE_INT_FN(FN) case FN: case FN##L: case FN##LL: case FN##IMAX
716fc477 210
e913b5cd 211#define NULL_TREE (tree) NULL
212
d72a838e 213/* Define accessors for the fields that all tree nodes have
214 (though some fields are not used for all kinds of nodes). */
215
216/* The tree-code says what kind of node it is.
217 Codes are defined in tree.def. */
35cc02b5 218#define TREE_CODE(NODE) ((enum tree_code) (NODE)->base.code)
219#define TREE_SET_CODE(NODE, VALUE) ((NODE)->base.code = (VALUE))
d72a838e 220
3e207e38 221/* When checking is enabled, errors will be generated if a tree node
1fa3a8f6 222 is accessed incorrectly. The macros die with a fatal error. */
0c4e40c5 223#if defined ENABLE_TREE_CHECKING && (GCC_VERSION >= 2007)
3e207e38 224
2b15d2ba 225#define TREE_CHECK(T, CODE) \
226(tree_check ((T), __FILE__, __LINE__, __FUNCTION__, (CODE)))
227
228#define TREE_NOT_CHECK(T, CODE) \
229(tree_not_check ((T), __FILE__, __LINE__, __FUNCTION__, (CODE)))
230
231#define TREE_CHECK2(T, CODE1, CODE2) \
232(tree_check2 ((T), __FILE__, __LINE__, __FUNCTION__, (CODE1), (CODE2)))
233
234#define TREE_NOT_CHECK2(T, CODE1, CODE2) \
235(tree_not_check2 ((T), __FILE__, __LINE__, __FUNCTION__, (CODE1), (CODE2)))
236
237#define TREE_CHECK3(T, CODE1, CODE2, CODE3) \
238(tree_check3 ((T), __FILE__, __LINE__, __FUNCTION__, (CODE1), (CODE2), (CODE3)))
239
240#define TREE_NOT_CHECK3(T, CODE1, CODE2, CODE3) \
241(tree_not_check3 ((T), __FILE__, __LINE__, __FUNCTION__, \
242 (CODE1), (CODE2), (CODE3)))
243
244#define TREE_CHECK4(T, CODE1, CODE2, CODE3, CODE4) \
245(tree_check4 ((T), __FILE__, __LINE__, __FUNCTION__, \
246 (CODE1), (CODE2), (CODE3), (CODE4)))
247
248#define TREE_NOT_CHECK4(T, CODE1, CODE2, CODE3, CODE4) \
249(tree_not_check4 ((T), __FILE__, __LINE__, __FUNCTION__, \
250 (CODE1), (CODE2), (CODE3), (CODE4)))
251
252#define TREE_CHECK5(T, CODE1, CODE2, CODE3, CODE4, CODE5) \
253(tree_check5 ((T), __FILE__, __LINE__, __FUNCTION__, \
254 (CODE1), (CODE2), (CODE3), (CODE4), (CODE5)))
255
256#define TREE_NOT_CHECK5(T, CODE1, CODE2, CODE3, CODE4, CODE5) \
257(tree_not_check5 ((T), __FILE__, __LINE__, __FUNCTION__, \
258 (CODE1), (CODE2), (CODE3), (CODE4), (CODE5)))
259
260#define CONTAINS_STRUCT_CHECK(T, STRUCT) \
261(contains_struct_check ((T), (STRUCT), __FILE__, __LINE__, __FUNCTION__))
262
263#define TREE_CLASS_CHECK(T, CLASS) \
264(tree_class_check ((T), (CLASS), __FILE__, __LINE__, __FUNCTION__))
265
266#define TREE_RANGE_CHECK(T, CODE1, CODE2) \
267(tree_range_check ((T), (CODE1), (CODE2), __FILE__, __LINE__, __FUNCTION__))
268
269#define OMP_CLAUSE_SUBCODE_CHECK(T, CODE) \
270(omp_clause_subcode_check ((T), (CODE), __FILE__, __LINE__, __FUNCTION__))
271
272#define OMP_CLAUSE_RANGE_CHECK(T, CODE1, CODE2) \
273(omp_clause_range_check ((T), (CODE1), (CODE2), \
274 __FILE__, __LINE__, __FUNCTION__))
55d6e7cd 275
a4070a91 276/* These checks have to be special cased. */
2b15d2ba 277#define EXPR_CHECK(T) \
278(expr_check ((T), __FILE__, __LINE__, __FUNCTION__))
66d12a6c 279
280/* These checks have to be special cased. */
2b15d2ba 281#define NON_TYPE_CHECK(T) \
282(non_type_check ((T), __FILE__, __LINE__, __FUNCTION__))
283
e913b5cd 284#define TREE_INT_CST_ELT_CHECK(T, I) \
285(*tree_int_cst_elt_check ((T), (I), __FILE__, __LINE__, __FUNCTION__))
286
2b15d2ba 287#define TREE_VEC_ELT_CHECK(T, I) \
288(*(CONST_CAST2 (tree *, typeof (T)*, \
289 tree_vec_elt_check ((T), (I), __FILE__, __LINE__, __FUNCTION__))))
290
291#define OMP_CLAUSE_ELT_CHECK(T, I) \
292(*(omp_clause_elt_check ((T), (I), __FILE__, __LINE__, __FUNCTION__)))
55d6e7cd 293
2fcde217 294/* Special checks for TREE_OPERANDs. */
2b15d2ba 295#define TREE_OPERAND_CHECK(T, I) \
296(*(CONST_CAST2 (tree*, typeof (T)*, \
297 tree_operand_check ((T), (I), __FILE__, __LINE__, __FUNCTION__))))
298
299#define TREE_OPERAND_CHECK_CODE(T, CODE, I) \
300(*(tree_operand_check_code ((T), (CODE), (I), \
301 __FILE__, __LINE__, __FUNCTION__)))
2fcde217 302
35cc02b5 303/* Nodes are chained together for many purposes.
304 Types are chained together to record them for being output to the debugger
305 (see the function `chain_type').
306 Decls in the same scope are chained together to record the contents
307 of the scope.
308 Statement nodes for successive statements used to be chained together.
309 Often lists of things are represented by TREE_LIST nodes that
310 are chained together. */
311
2b15d2ba 312#define TREE_CHAIN(NODE) \
313(CONTAINS_STRUCT_CHECK (NODE, TS_COMMON)->common.chain)
35cc02b5 314
315/* In all nodes that are expressions, this is the data type of the expression.
316 In POINTER_TYPE nodes, this is the type that the pointer points to.
317 In ARRAY_TYPE nodes, this is the type of the elements.
318 In VECTOR_TYPE nodes, this is the type of the elements. */
2b15d2ba 319#define TREE_TYPE(NODE) \
320(CONTAINS_STRUCT_CHECK (NODE, TS_TYPED)->typed.type)
35cc02b5 321
aae87fc3 322extern void tree_contains_struct_check_failed (const_tree,
7bd4091f 323 const enum tree_node_structure_enum,
5ded8c6f 324 const char *, int, const char *)
325 ATTRIBUTE_NORETURN;
326
aae87fc3 327extern void tree_check_failed (const_tree, const char *, int, const char *,
36066e37 328 ...) ATTRIBUTE_NORETURN;
aae87fc3 329extern void tree_not_check_failed (const_tree, const char *, int, const char *,
36066e37 330 ...) ATTRIBUTE_NORETURN;
aae87fc3 331extern void tree_class_check_failed (const_tree, const enum tree_code_class,
60b8c5b3 332 const char *, int, const char *)
a4070a91 333 ATTRIBUTE_NORETURN;
aae87fc3 334extern void tree_range_check_failed (const_tree, const char *, int,
1e8e9920 335 const char *, enum tree_code,
cded957c 336 enum tree_code)
337 ATTRIBUTE_NORETURN;
aae87fc3 338extern void tree_not_class_check_failed (const_tree,
59db13d3 339 const enum tree_code_class,
340 const char *, int, const char *)
341 ATTRIBUTE_NORETURN;
e913b5cd 342extern void tree_int_cst_elt_check_failed (int, int, const char *,
343 int, const char *)
344 ATTRIBUTE_NORETURN;
60b8c5b3 345extern void tree_vec_elt_check_failed (int, int, const char *,
346 int, const char *)
66bc87db 347 ATTRIBUTE_NORETURN;
4ee9c684 348extern void phi_node_elt_check_failed (int, int, const char *,
349 int, const char *)
350 ATTRIBUTE_NORETURN;
aae87fc3 351extern void tree_operand_check_failed (int, const_tree,
60b8c5b3 352 const char *, int, const char *)
2fcde217 353 ATTRIBUTE_NORETURN;
aae87fc3 354extern void omp_clause_check_failed (const_tree, const char *, int,
55d6e7cd 355 const char *, enum omp_clause_code)
356 ATTRIBUTE_NORETURN;
720082dc 357extern void omp_clause_operand_check_failed (int, const_tree, const char *,
55d6e7cd 358 int, const char *)
359 ATTRIBUTE_NORETURN;
aae87fc3 360extern void omp_clause_range_check_failed (const_tree, const char *, int,
55d6e7cd 361 const char *, enum omp_clause_code,
362 enum omp_clause_code)
363 ATTRIBUTE_NORETURN;
60b8c5b3 364
0c4e40c5 365#else /* not ENABLE_TREE_CHECKING, or not gcc */
3e207e38 366
5ded8c6f 367#define CONTAINS_STRUCT_CHECK(T, ENUM) (T)
82bb2115 368#define TREE_CHECK(T, CODE) (T)
36066e37 369#define TREE_NOT_CHECK(T, CODE) (T)
82bb2115 370#define TREE_CHECK2(T, CODE1, CODE2) (T)
36066e37 371#define TREE_NOT_CHECK2(T, CODE1, CODE2) (T)
82bb2115 372#define TREE_CHECK3(T, CODE1, CODE2, CODE3) (T)
36066e37 373#define TREE_NOT_CHECK3(T, CODE1, CODE2, CODE3) (T)
b24423db 374#define TREE_CHECK4(T, CODE1, CODE2, CODE3, CODE4) (T)
36066e37 375#define TREE_NOT_CHECK4(T, CODE1, CODE2, CODE3, CODE4) (T)
82bb2115 376#define TREE_CHECK5(T, CODE1, CODE2, CODE3, CODE4, CODE5) (T)
36066e37 377#define TREE_NOT_CHECK5(T, CODE1, CODE2, CODE3, CODE4, CODE5) (T)
82bb2115 378#define TREE_CLASS_CHECK(T, CODE) (T)
1e8e9920 379#define TREE_RANGE_CHECK(T, CODE1, CODE2) (T)
82bb2115 380#define EXPR_CHECK(T) (T)
66d12a6c 381#define NON_TYPE_CHECK(T) (T)
e913b5cd 382#define TREE_INT_CST_ELT_CHECK(T, I) ((T)->int_cst.val[I])
82bb2115 383#define TREE_VEC_ELT_CHECK(T, I) ((T)->vec.a[I])
384#define TREE_OPERAND_CHECK(T, I) ((T)->exp.operands[I])
385#define TREE_OPERAND_CHECK_CODE(T, CODE, I) ((T)->exp.operands[I])
55d6e7cd 386#define OMP_CLAUSE_ELT_CHECK(T, i) ((T)->omp_clause.ops[i])
387#define OMP_CLAUSE_RANGE_CHECK(T, CODE1, CODE2) (T)
07d32e01 388#define OMP_CLAUSE_SUBCODE_CHECK(T, CODE) (T)
a4070a91 389
35cc02b5 390#define TREE_CHAIN(NODE) ((NODE)->common.chain)
1646aa85 391#define TREE_TYPE(NODE) ((NODE)->typed.type)
35cc02b5 392
a4070a91 393#endif
394
5169661d 395#define TREE_BLOCK(NODE) (tree_block (NODE))
396#define TREE_SET_BLOCK(T, B) (tree_set_block ((T), (B)))
4ee9c684 397
a4070a91 398#include "tree-check.h"
399
ce45a448 400#define TYPE_CHECK(T) TREE_CLASS_CHECK (T, tcc_type)
5ded8c6f 401#define DECL_MINIMAL_CHECK(T) CONTAINS_STRUCT_CHECK (T, TS_DECL_MINIMAL)
402#define DECL_COMMON_CHECK(T) CONTAINS_STRUCT_CHECK (T, TS_DECL_COMMON)
403#define DECL_WRTL_CHECK(T) CONTAINS_STRUCT_CHECK (T, TS_DECL_WRTL)
404#define DECL_WITH_VIS_CHECK(T) CONTAINS_STRUCT_CHECK (T, TS_DECL_WITH_VIS)
405#define DECL_NON_COMMON_CHECK(T) CONTAINS_STRUCT_CHECK (T, TS_DECL_NON_COMMON)
ce45a448 406#define CST_CHECK(T) TREE_CLASS_CHECK (T, tcc_constant)
407#define STMT_CHECK(T) TREE_CLASS_CHECK (T, tcc_statement)
c2f47e15 408#define VL_EXP_CHECK(T) TREE_CLASS_CHECK (T, tcc_vl_exp)
82bb2115 409#define FUNC_OR_METHOD_CHECK(T) TREE_CHECK2 (T, FUNCTION_TYPE, METHOD_TYPE)
b24423db 410#define PTR_OR_REF_CHECK(T) TREE_CHECK2 (T, POINTER_TYPE, REFERENCE_TYPE)
82bb2115 411
3cb98335 412#define RECORD_OR_UNION_CHECK(T) \
82bb2115 413 TREE_CHECK3 (T, RECORD_TYPE, UNION_TYPE, QUAL_UNION_TYPE)
3cb98335 414#define NOT_RECORD_OR_UNION_CHECK(T) \
415 TREE_NOT_CHECK3 (T, RECORD_TYPE, UNION_TYPE, QUAL_UNION_TYPE)
491e04ef 416
82bb2115 417#define NUMERICAL_TYPE_CHECK(T) \
06f0b99c 418 TREE_CHECK5 (T, INTEGER_TYPE, ENUMERAL_TYPE, BOOLEAN_TYPE, REAL_TYPE, \
419 FIXED_POINT_TYPE)
3e207e38 420
3609f4f0 421/* Here is how primitive or already-canonicalized types' hash codes
422 are made. */
908e5f41 423#define TYPE_HASH(TYPE) (TYPE_UID (TYPE))
424
425/* A simple hash function for an arbitrary tree node. This must not be
426 used in hash tables which are saved to a PCH. */
427#define TREE_HASH(NODE) ((size_t) (NODE) & 0777777)
3609f4f0 428
75a70cf9 429/* Tests if CODE is a conversion expr (NOP_EXPR or CONVERT_EXPR). */
d9659041 430#define CONVERT_EXPR_CODE_P(CODE) \
75a70cf9 431 ((CODE) == NOP_EXPR || (CODE) == CONVERT_EXPR)
72dd6141 432
75a70cf9 433/* Similarly, but accept an expressions instead of a tree code. */
d9659041 434#define CONVERT_EXPR_P(EXP) CONVERT_EXPR_CODE_P (TREE_CODE (EXP))
72dd6141 435
436/* Generate case for NOP_EXPR, CONVERT_EXPR. */
437
438#define CASE_CONVERT \
439 case NOP_EXPR: \
440 case CONVERT_EXPR
441
98112881 442/* Given an expression as a tree, strip any conversion that generates
443 no instruction. Accepts both tree and const_tree arguments since
444 we are not modifying the tree itself. */
d72a838e 445
98112881 446#define STRIP_NOPS(EXP) \
447 (EXP) = tree_strip_nop_conversions (CONST_CAST_TREE (EXP))
f2bfbd07 448
155b05dc 449/* Like STRIP_NOPS, but don't let the signedness change either. */
450
451#define STRIP_SIGN_NOPS(EXP) \
98112881 452 (EXP) = tree_strip_sign_nop_conversions (CONST_CAST_TREE (EXP))
155b05dc 453
f2bfbd07 454/* Like STRIP_NOPS, but don't alter the TREE_TYPE either. */
455
456#define STRIP_TYPE_NOPS(EXP) \
72dd6141 457 while ((CONVERT_EXPR_P (EXP) \
f2bfbd07 458 || TREE_CODE (EXP) == NON_LVALUE_EXPR) \
bdcbc557 459 && TREE_OPERAND (EXP, 0) != error_mark_node \
f2bfbd07 460 && (TREE_TYPE (EXP) \
461 == TREE_TYPE (TREE_OPERAND (EXP, 0)))) \
7ec74242 462 (EXP) = TREE_OPERAND (EXP, 0)
ffcb8a96 463
4ee9c684 464/* Remove unnecessary type conversions according to
465 tree_ssa_useless_type_conversion. */
466
98112881 467#define STRIP_USELESS_TYPE_CONVERSION(EXP) \
468 (EXP) = tree_ssa_strip_useless_type_conversions (EXP)
4ee9c684 469
8ee286c8 470/* Nonzero if TYPE represents a vector type. */
471
472#define VECTOR_TYPE_P(TYPE) (TREE_CODE (TYPE) == VECTOR_TYPE)
473
ffcb8a96 474/* Nonzero if TYPE represents an integral type. Note that we do not
9843a47d 475 include COMPLEX types here. Keep these checks in ascending code
f7f07c95 476 order. */
ffcb8a96 477
478#define INTEGRAL_TYPE_P(TYPE) \
9843a47d 479 (TREE_CODE (TYPE) == ENUMERAL_TYPE \
480 || TREE_CODE (TYPE) == BOOLEAN_TYPE \
9843a47d 481 || TREE_CODE (TYPE) == INTEGER_TYPE)
ffcb8a96 482
06f0b99c 483/* Nonzero if TYPE represents a non-saturating fixed-point type. */
484
485#define NON_SAT_FIXED_POINT_TYPE_P(TYPE) \
486 (TREE_CODE (TYPE) == FIXED_POINT_TYPE && !TYPE_SATURATING (TYPE))
487
488/* Nonzero if TYPE represents a saturating fixed-point type. */
489
490#define SAT_FIXED_POINT_TYPE_P(TYPE) \
491 (TREE_CODE (TYPE) == FIXED_POINT_TYPE && TYPE_SATURATING (TYPE))
492
493/* Nonzero if TYPE represents a fixed-point type. */
494
495#define FIXED_POINT_TYPE_P(TYPE) (TREE_CODE (TYPE) == FIXED_POINT_TYPE)
496
4b69983d 497/* Nonzero if TYPE represents a scalar floating-point type. */
498
499#define SCALAR_FLOAT_TYPE_P(TYPE) (TREE_CODE (TYPE) == REAL_TYPE)
500
501/* Nonzero if TYPE represents a complex floating-point type. */
502
503#define COMPLEX_FLOAT_TYPE_P(TYPE) \
504 (TREE_CODE (TYPE) == COMPLEX_TYPE \
505 && TREE_CODE (TREE_TYPE (TYPE)) == REAL_TYPE)
506
b423d9f7 507/* Nonzero if TYPE represents a vector integer type. */
508
8ee286c8 509#define VECTOR_INTEGER_TYPE_P(TYPE) \
510 (VECTOR_TYPE_P (TYPE) \
511 && TREE_CODE (TREE_TYPE (TYPE)) == INTEGER_TYPE)
b423d9f7 512
513
4c779744 514/* Nonzero if TYPE represents a vector floating-point type. */
515
516#define VECTOR_FLOAT_TYPE_P(TYPE) \
8ee286c8 517 (VECTOR_TYPE_P (TYPE) \
4c779744 518 && TREE_CODE (TREE_TYPE (TYPE)) == REAL_TYPE)
519
ffcb8a96 520/* Nonzero if TYPE represents a floating-point type, including complex
9843a47d 521 and vector floating-point types. The vector and complex check does
522 not use the previous two macros to enable early folding. */
ffcb8a96 523
9843a47d 524#define FLOAT_TYPE_P(TYPE) \
525 (SCALAR_FLOAT_TYPE_P (TYPE) \
526 || ((TREE_CODE (TYPE) == COMPLEX_TYPE \
8ee286c8 527 || VECTOR_TYPE_P (TYPE)) \
9843a47d 528 && SCALAR_FLOAT_TYPE_P (TREE_TYPE (TYPE))))
68db3216 529
e5d0ba06 530/* Nonzero if TYPE represents a decimal floating-point type. */
531#define DECIMAL_FLOAT_TYPE_P(TYPE) \
532 (SCALAR_FLOAT_TYPE_P (TYPE) \
533 && DECIMAL_FLOAT_MODE_P (TYPE_MODE (TYPE)))
534
969443c4 535/* Nonzero if TYPE is a record or union type. */
536#define RECORD_OR_UNION_TYPE_P(TYPE) \
537 (TREE_CODE (TYPE) == RECORD_TYPE \
538 || TREE_CODE (TYPE) == UNION_TYPE \
539 || TREE_CODE (TYPE) == QUAL_UNION_TYPE)
540
9843a47d 541/* Nonzero if TYPE represents an aggregate (multi-component) type.
542 Keep these checks in ascending code order. */
68db3216 543
544#define AGGREGATE_TYPE_P(TYPE) \
969443c4 545 (TREE_CODE (TYPE) == ARRAY_TYPE || RECORD_OR_UNION_TYPE_P (TYPE))
e57949ab 546
1c15359d 547/* Nonzero if TYPE represents a pointer or reference type.
9843a47d 548 (It should be renamed to INDIRECT_TYPE_P.) Keep these checks in
549 ascending code order. */
e57949ab 550
551#define POINTER_TYPE_P(TYPE) \
552 (TREE_CODE (TYPE) == POINTER_TYPE || TREE_CODE (TYPE) == REFERENCE_TYPE)
1071e86e 553
08fc5390 554/* Nonzero if TYPE represents a pointer to function. */
555#define FUNCTION_POINTER_TYPE_P(TYPE) \
556 (POINTER_TYPE_P (TYPE) && TREE_CODE (TREE_TYPE (TYPE)) == FUNCTION_TYPE)
557
4b72716d 558/* Nonzero if this type is a complete type. */
559#define COMPLETE_TYPE_P(NODE) (TYPE_SIZE (NODE) != NULL_TREE)
560
5c803577 561/* Nonzero if this type is the (possibly qualified) void type. */
c92b3a11 562#define VOID_TYPE_P(NODE) (TREE_CODE (NODE) == VOID_TYPE)
5c803577 563
4b72716d 564/* Nonzero if this type is complete or is cv void. */
565#define COMPLETE_OR_VOID_TYPE_P(NODE) \
56ba46a4 566 (COMPLETE_TYPE_P (NODE) || VOID_TYPE_P (NODE))
4b72716d 567
568/* Nonzero if this type is complete or is an array with unspecified bound. */
569#define COMPLETE_OR_UNBOUND_ARRAY_TYPE_P(NODE) \
7ec74242 570 (COMPLETE_TYPE_P (TREE_CODE (NODE) == ARRAY_TYPE ? TREE_TYPE (NODE) : (NODE)))
4b72716d 571
d72a838e 572/* Define many boolean fields that all tree nodes have. */
573
a353dfef 574/* In VAR_DECL, PARM_DECL and RESULT_DECL nodes, nonzero means address
575 of this is needed. So it cannot be in a register.
2c91799f 576 In a FUNCTION_DECL it has no meaning.
6c34d0c2 577 In LABEL_DECL nodes, it means a goto for this label has been seen
d72a838e 578 from a place outside all binding contours that restore stack levels.
f7b5f694 579 In an artificial SSA_NAME that points to a stack partition with at least
580 two variables, it means that at least one variable has TREE_ADDRESSABLE.
4cd5bb61 581 In ..._TYPE nodes, it means that objects of this type must be fully
582 addressable. This means that pieces of this object cannot go into
583 register parameters, for example. If this a function type, this
584 means that the value must be returned in memory.
f7b5f694 585 In CONSTRUCTOR nodes, it means object constructed must be in memory.
d72a838e 586 In IDENTIFIER_NODEs, this means that some extern decl for this name
f7b5f694 587 had its address taken. That matters for inline functions.
588 In a STMT_EXPR, it means we want the result of the enclosed expression. */
35cc02b5 589#define TREE_ADDRESSABLE(NODE) ((NODE)->base.addressable_flag)
d72a838e 590
6070c035 591/* Set on a CALL_EXPR if the call is in a tail position, ie. just before the
592 exit of a function. Calls for which this is true are candidates for tail
593 call optimizations. */
35cc02b5 594#define CALL_EXPR_TAILCALL(NODE) \
9af5ce0c 595 (CALL_EXPR_CHECK (NODE)->base.addressable_flag)
4ee9c684 596
359d87c6 597/* Used as a temporary field on a CASE_LABEL_EXPR to indicate that the
598 CASE_LOW operand has been processed. */
599#define CASE_LOW_SEEN(NODE) \
35cc02b5 600 (CASE_LABEL_EXPR_CHECK (NODE)->base.addressable_flag)
359d87c6 601
4a1849e3 602#define PREDICT_EXPR_OUTCOME(NODE) \
9af5ce0c 603 ((enum prediction) (PREDICT_EXPR_CHECK (NODE)->base.addressable_flag))
b9c74b4d 604#define SET_PREDICT_EXPR_OUTCOME(NODE, OUTCOME) \
9af5ce0c 605 (PREDICT_EXPR_CHECK (NODE)->base.addressable_flag = (int) OUTCOME)
4a1849e3 606#define PREDICT_EXPR_PREDICTOR(NODE) \
e913b5cd 607 ((enum br_predictor)tree_to_shwi (TREE_OPERAND (PREDICT_EXPR_CHECK (NODE), 0)))
4a1849e3 608
d72a838e 609/* In a VAR_DECL, nonzero means allocate static storage.
bc3a4bfd 610 In a FUNCTION_DECL, nonzero if function has been defined.
eba15a75 611 In a CONSTRUCTOR, nonzero means allocate static storage. */
35cc02b5 612#define TREE_STATIC(NODE) ((NODE)->base.static_flag)
d72a838e 613
eba15a75 614/* In an ADDR_EXPR, nonzero means do not use a trampoline. */
615#define TREE_NO_TRAMPOLINE(NODE) (ADDR_EXPR_CHECK (NODE)->base.static_flag)
616
0bc060a4 617/* In a TARGET_EXPR or WITH_CLEANUP_EXPR, means that the pertinent cleanup
dddab69e 618 should only be executed if an exception is thrown, not on normal exit
619 of its scope. */
35cc02b5 620#define CLEANUP_EH_ONLY(NODE) ((NODE)->base.static_flag)
a9bc793b 621
0bc060a4 622/* In a TRY_CATCH_EXPR, means that the handler should be considered a
623 separate cleanup in honor_protect_cleanup_actions. */
624#define TRY_CATCH_IS_CLEANUP(NODE) \
625 (TRY_CATCH_EXPR_CHECK (NODE)->base.static_flag)
626
359d87c6 627/* Used as a temporary field on a CASE_LABEL_EXPR to indicate that the
628 CASE_HIGH operand has been processed. */
629#define CASE_HIGH_SEEN(NODE) \
35cc02b5 630 (CASE_LABEL_EXPR_CHECK (NODE)->base.static_flag)
359d87c6 631
7765d0db 632/* Used to mark scoped enums. */
633#define ENUM_IS_SCOPED(NODE) (ENUMERAL_TYPE_CHECK (NODE)->base.static_flag)
28d5335f 634
aa290616 635/* Determines whether an ENUMERAL_TYPE has defined the list of constants. */
636#define ENUM_IS_OPAQUE(NODE) (ENUMERAL_TYPE_CHECK (NODE)->base.private_flag)
637
4ee9c684 638/* In an expr node (usually a conversion) this means the node was made
55c151dc 639 implicitly and should not lead to any sort of warning. In a decl node,
640 warnings concerning the decl should be suppressed. This is used at
641 least for used-before-set warnings, and it set after one warning is
642 emitted. */
35cc02b5 643#define TREE_NO_WARNING(NODE) ((NODE)->base.nowarning_flag)
d72a838e 644
5bf971ee 645/* Used to indicate that this TYPE represents a compiler-generated entity. */
646#define TYPE_ARTIFICIAL(NODE) (TYPE_CHECK (NODE)->base.nowarning_flag)
647
2cf6f20a 648/* In an IDENTIFIER_NODE, this means that assemble_name was called with
649 this string as an argument. */
56ba46a4 650#define TREE_SYMBOL_REFERENCED(NODE) \
35cc02b5 651 (IDENTIFIER_NODE_CHECK (NODE)->base.static_flag)
2cf6f20a 652
b24423db 653/* Nonzero in a pointer or reference type means the data pointed to
654 by this type can alias anything. */
655#define TYPE_REF_CAN_ALIAS_ALL(NODE) \
35cc02b5 656 (PTR_OR_REF_CHECK (NODE)->base.static_flag)
b24423db 657
886cfd4f 658/* In an INTEGER_CST, REAL_CST, COMPLEX_CST, or VECTOR_CST, this means
acfce21e 659 there was an overflow in folding. */
b24423db 660
35cc02b5 661#define TREE_OVERFLOW(NODE) (CST_CHECK (NODE)->base.public_flag)
7eec364c 662
f170d67f 663/* TREE_OVERFLOW can only be true for EXPR of CONSTANT_CLASS_P. */
664
665#define TREE_OVERFLOW_P(EXPR) \
666 (CONSTANT_CLASS_P (EXPR) && TREE_OVERFLOW (EXPR))
667
4a2849cb 668/* In a VAR_DECL, FUNCTION_DECL, NAMESPACE_DECL or TYPE_DECL,
807bf718 669 nonzero means name is to be accessible from outside this translation unit.
1e5bfc66 670 In an IDENTIFIER_NODE, nonzero means an external declaration
807bf718 671 accessible from outside this translation unit was previously seen
d72a838e 672 for this name in an inner scope. */
35cc02b5 673#define TREE_PUBLIC(NODE) ((NODE)->base.public_flag)
d72a838e 674
00b76131 675/* In a _TYPE, indicates whether TYPE_CACHED_VALUES contains a vector
676 of cached values, or is something else. */
9af5ce0c 677#define TYPE_CACHED_VALUES_P(NODE) (TYPE_CHECK (NODE)->base.public_flag)
0c8fe10f 678
679/* In a SAVE_EXPR, indicates that the original expression has already
680 been substituted with a VAR_DECL that contains the value. */
681#define SAVE_EXPR_RESOLVED_P(NODE) \
eba15a75 682 (SAVE_EXPR_CHECK (NODE)->base.public_flag)
00b76131 683
48dc2227 684/* Set on a CALL_EXPR if this stdarg call should be passed the argument
685 pack. */
686#define CALL_EXPR_VA_ARG_PACK(NODE) \
9af5ce0c 687 (CALL_EXPR_CHECK (NODE)->base.public_flag)
48dc2227 688
66d12a6c 689/* In any expression, decl, or constant, nonzero means it has side effects or
690 reevaluation of the whole expression could produce a different value.
691 This is set if any subexpression is a function call, a side effect or a
692 reference to a volatile variable. In a ..._DECL, this is set only if the
693 declaration said `volatile'. This will never be set for a constant. */
694#define TREE_SIDE_EFFECTS(NODE) \
35cc02b5 695 (NON_TYPE_CHECK (NODE)->base.side_effects_flag)
d72a838e 696
4ee9c684 697/* In a LABEL_DECL, nonzero means this label had its address taken
698 and therefore can never be deleted and is a jump target for
699 computed gotos. */
eba15a75 700#define FORCED_LABEL(NODE) (LABEL_DECL_CHECK (NODE)->base.side_effects_flag)
4ee9c684 701
d72a838e 702/* Nonzero means this expression is volatile in the C sense:
703 its address should be of type `volatile WHATEVER *'.
704 In other words, the declared item is volatile qualified.
705 This is used in _DECL nodes and _REF nodes.
bcde7378 706 On a FUNCTION_DECL node, this means the function does not
707 return normally. This is the same effect as setting
708 the attribute noreturn on the function in C.
d72a838e 709
710 In a ..._TYPE node, means this type is volatile-qualified.
711 But use TYPE_VOLATILE instead of this macro when the node is a type,
712 because eventually we may make that a different bit.
713
714 If this bit is set in an expression, so is TREE_SIDE_EFFECTS. */
35cc02b5 715#define TREE_THIS_VOLATILE(NODE) ((NODE)->base.volatile_flag)
d72a838e 716
010d0641 717/* Nonzero means this node will not trap. In an INDIRECT_REF, means
718 accessing the memory pointed to won't generate a trap. However,
719 this only applies to an object when used appropriately: it doesn't
5d9de213 720 mean that writing a READONLY mem won't trap.
491e04ef 721
7d23383d 722 In ARRAY_REF and ARRAY_RANGE_REF means that we know that the index
723 (or slice of the array) always belongs to the range of the array.
724 I.e. that the access will not trap, provided that the access to
725 the base to the array will not trap. */
b93508c0 726#define TREE_THIS_NOTRAP(NODE) \
727 (TREE_CHECK5 (NODE, INDIRECT_REF, MEM_REF, TARGET_MEM_REF, ARRAY_REF, \
728 ARRAY_RANGE_REF)->base.nothrow_flag)
010d0641 729
d72a838e 730/* In a VAR_DECL, PARM_DECL or FIELD_DECL, or any kind of ..._REF node,
48e1416a 731 nonzero means it may not be the lhs of an assignment.
9c2a0c05 732 Nonzero in a FUNCTION_DECL means this function should be treated
733 as "const" function (can only read its arguments). */
35cc02b5 734#define TREE_READONLY(NODE) (NON_TYPE_CHECK (NODE)->base.readonly_flag)
d72a838e 735
66d12a6c 736/* Value of expression is constant. Always on in all ..._CST nodes. May
737 also appear in an expression or decl where the value is constant. */
35cc02b5 738#define TREE_CONSTANT(NODE) (NON_TYPE_CHECK (NODE)->base.constant_flag)
d72a838e 739
bc97b18f 740/* Nonzero if NODE, a type, has had its sizes gimplified. */
35cc02b5 741#define TYPE_SIZES_GIMPLIFIED(NODE) \
742 (TYPE_CHECK (NODE)->base.constant_flag)
bc97b18f 743
86ae60fd 744/* In a decl (most significantly a FIELD_DECL), means an unsigned field. */
35cc02b5 745#define DECL_UNSIGNED(NODE) \
87d8f7b6 746 (DECL_COMMON_CHECK (NODE)->base.u.bits.unsigned_flag)
86ae60fd 747
78a8ed03 748/* In integral and pointer types, means an unsigned type. */
87d8f7b6 749#define TYPE_UNSIGNED(NODE) (TYPE_CHECK (NODE)->base.u.bits.unsigned_flag)
78a8ed03 750
e913b5cd 751/* Same as TYPE_UNSIGNED but converted to SIGNOP. */
3a54beaf 752#define TYPE_SIGN(NODE) ((signop) TYPE_UNSIGNED (NODE))
e913b5cd 753
0aca815c 754/* True if overflow wraps around for the given integral type. That
755 is, TYPE_MAX + 1 == TYPE_MIN. */
756#define TYPE_OVERFLOW_WRAPS(TYPE) \
757 (TYPE_UNSIGNED (TYPE) || flag_wrapv)
758
759/* True if overflow is undefined for the given integral type. We may
760 optimize on the assumption that values in the type never overflow.
761
762 IMPORTANT NOTE: Any optimization based on TYPE_OVERFLOW_UNDEFINED
763 must issue a warning based on warn_strict_overflow. In some cases
764 it will be appropriate to issue the warning immediately, and in
765 other cases it will be appropriate to simply set a flag and let the
766 caller decide whether a warning is appropriate or not. */
767#define TYPE_OVERFLOW_UNDEFINED(TYPE) \
768 (!TYPE_UNSIGNED (TYPE) && !flag_wrapv && !flag_trapv && flag_strict_overflow)
769
770/* True if overflow for the given integral type should issue a
771 trap. */
772#define TYPE_OVERFLOW_TRAPS(TYPE) \
773 (!TYPE_UNSIGNED (TYPE) && flag_trapv)
774
775/* True if pointer types have undefined overflow. */
776#define POINTER_TYPE_OVERFLOW_UNDEFINED (flag_strict_overflow)
777
9238c28d 778/* Nonzero in a VAR_DECL or STRING_CST means assembler code has been written.
d72a838e 779 Nonzero in a FUNCTION_DECL means that the function has been compiled.
780 This is interesting in an inline function, since it might not need
781 to be compiled separately.
bace6acf 782 Nonzero in a RECORD_TYPE, UNION_TYPE, QUAL_UNION_TYPE, ENUMERAL_TYPE
783 or TYPE_DECL if the debugging info for the type has been written.
491e04ef 784 In a BLOCK node, nonzero if reorder_blocks has already seen this block.
4ee9c684 785 In an SSA_NAME node, nonzero if the SSA_NAME occurs in an abnormal
786 PHI node. */
35cc02b5 787#define TREE_ASM_WRITTEN(NODE) ((NODE)->base.asm_written_flag)
d72a838e 788
789/* Nonzero in a _DECL if the name is used in its scope.
790 Nonzero in an expr node means inhibit warning if value is unused.
791 In IDENTIFIER_NODEs, this means that some extern decl for this name
7bd4091f 792 was used.
7c0a8197 793 In a BLOCK, this means that the block contains variables that are used. */
35cc02b5 794#define TREE_USED(NODE) ((NODE)->base.used_flag)
d72a838e 795
b93508c0 796/* In a FUNCTION_DECL, nonzero means a call to the function cannot
797 throw an exception. In a CALL_EXPR, nonzero means the call cannot
798 throw. We can't easily check the node type here as the C++
799 frontend also uses this flag (for AGGR_INIT_EXPR). */
8cf61389 800#define TREE_NOTHROW(NODE) ((NODE)->base.nothrow_flag)
a9d9ab08 801
ea523851 802/* In a CALL_EXPR, means that it's safe to use the target of the call
803 expansion as the return slot for a call that returns in memory. */
eba15a75 804#define CALL_EXPR_RETURN_SLOT_OPT(NODE) \
805 (CALL_EXPR_CHECK (NODE)->base.private_flag)
805e22b2 806
d037099f 807/* Cilk keywords accessors. */
808#define CILK_SPAWN_FN(NODE) TREE_OPERAND (CILK_SPAWN_STMT_CHECK (NODE), 0)
809
7ac958de 810/* In a RESULT_DECL, PARM_DECL and VAR_DECL, means that it is
1095d222 811 passed by invisible reference (and the TREE_TYPE is a pointer to the true
812 type). */
7ac958de 813#define DECL_BY_REFERENCE(NODE) \
814 (TREE_CHECK3 (NODE, VAR_DECL, PARM_DECL, \
815 RESULT_DECL)->decl_common.decl_by_reference_flag)
dddcebdc 816
96cd09d2 817/* In VAR_DECL and PARM_DECL, set when the decl has been used except for
818 being set. */
abc6c64f 819#define DECL_READ_P(NODE) \
820 (TREE_CHECK2 (NODE, VAR_DECL, PARM_DECL)->decl_common.decl_read_flag)
821
96cd09d2 822/* In VAR_DECL or RESULT_DECL, set when significant code movement precludes
823 attempting to share the stack slot with some other variable. */
c7c68014 824#define DECL_NONSHAREABLE(NODE) \
825 (TREE_CHECK2 (NODE, VAR_DECL, \
826 RESULT_DECL)->decl_common.decl_nonshareable_flag)
827
eaa112a0 828/* In a CALL_EXPR, means that the call is the jump from a thunk to the
829 thunked-to function. */
eba15a75 830#define CALL_FROM_THUNK_P(NODE) (CALL_EXPR_CHECK (NODE)->base.protected_flag)
eaa112a0 831
990495a7 832/* In a CALL_EXPR, if the function being called is BUILT_IN_ALLOCA, means that
833 it has been built for the declaration of a variable-sized object. */
a882d754 834#define CALL_ALLOCA_FOR_VAR_P(NODE) \
835 (CALL_EXPR_CHECK (NODE)->base.protected_flag)
990495a7 836
a9d9ab08 837/* In a type, nonzero means that all objects of the type are guaranteed by the
838 language or front-end to be properly aligned, so we can indicate that a MEM
839 of this type is aligned at least to the alignment of the type, even if it
840 doesn't appear that it is. We see this, for example, in object-oriented
841 languages where a tag field may show this is an object of a more-aligned
4ee9c684 842 variant of the more generic type.
843
844 In an SSA_NAME node, nonzero if the SSA_NAME node is on the SSA_NAME
845 freelist. */
35cc02b5 846#define TYPE_ALIGN_OK(NODE) (TYPE_CHECK (NODE)->base.nothrow_flag)
d72a838e 847
bc3a4bfd 848/* Used in classes in C++. */
35cc02b5 849#define TREE_PRIVATE(NODE) ((NODE)->base.private_flag)
cee43f7e 850/* Used in classes in C++. */
35cc02b5 851#define TREE_PROTECTED(NODE) ((NODE)->base.protected_flag)
d72a838e 852
678b5e9b 853/* True if reference type NODE is a C++ rvalue reference. */
854#define TYPE_REF_IS_RVALUE(NODE) \
855 (REFERENCE_TYPE_CHECK (NODE)->base.private_flag)
856
f4a30bd7 857/* Nonzero in a _DECL if the use of the name is defined as a
88da234d 858 deprecated feature by __attribute__((deprecated)). */
f4a30bd7 859#define TREE_DEPRECATED(NODE) \
35cc02b5 860 ((NODE)->base.deprecated_flag)
f4a30bd7 861
862/* Nonzero in an IDENTIFIER_NODE if the name is a local alias, whose
863 uses are to be substituted for uses of the TREE_CHAINed identifier. */
864#define IDENTIFIER_TRANSPARENT_ALIAS(NODE) \
35cc02b5 865 (IDENTIFIER_NODE_CHECK (NODE)->base.deprecated_flag)
88da234d 866
06f0b99c 867/* In fixed-point types, means a saturating type. */
87d8f7b6 868#define TYPE_SATURATING(NODE) (TYPE_CHECK (NODE)->base.u.bits.saturating_flag)
06f0b99c 869
bc3a4bfd 870/* These flags are available for each language front end to use internally. */
87d8f7b6 871#define TREE_LANG_FLAG_0(NODE) \
9af5ce0c 872 (TREE_NOT_CHECK2 (NODE, TREE_VEC, SSA_NAME)->base.u.bits.lang_flag_0)
87d8f7b6 873#define TREE_LANG_FLAG_1(NODE) \
9af5ce0c 874 (TREE_NOT_CHECK2 (NODE, TREE_VEC, SSA_NAME)->base.u.bits.lang_flag_1)
87d8f7b6 875#define TREE_LANG_FLAG_2(NODE) \
9af5ce0c 876 (TREE_NOT_CHECK2 (NODE, TREE_VEC, SSA_NAME)->base.u.bits.lang_flag_2)
87d8f7b6 877#define TREE_LANG_FLAG_3(NODE) \
9af5ce0c 878 (TREE_NOT_CHECK2 (NODE, TREE_VEC, SSA_NAME)->base.u.bits.lang_flag_3)
87d8f7b6 879#define TREE_LANG_FLAG_4(NODE) \
9af5ce0c 880 (TREE_NOT_CHECK2 (NODE, TREE_VEC, SSA_NAME)->base.u.bits.lang_flag_4)
87d8f7b6 881#define TREE_LANG_FLAG_5(NODE) \
9af5ce0c 882 (TREE_NOT_CHECK2 (NODE, TREE_VEC, SSA_NAME)->base.u.bits.lang_flag_5)
87d8f7b6 883#define TREE_LANG_FLAG_6(NODE) \
9af5ce0c 884 (TREE_NOT_CHECK2 (NODE, TREE_VEC, SSA_NAME)->base.u.bits.lang_flag_6)
9ed99284 885
d72a838e 886/* Define additional fields and accessors for nodes representing constants. */
887
271e739a 888#define TREE_INT_CST_NUNITS(NODE) \
889 (INTEGER_CST_CHECK (NODE)->base.u.int_length.unextended)
890#define TREE_INT_CST_EXT_NUNITS(NODE) \
891 (INTEGER_CST_CHECK (NODE)->base.u.int_length.extended)
01583702 892#define TREE_INT_CST_OFFSET_NUNITS(NODE) \
893 (INTEGER_CST_CHECK (NODE)->base.u.int_length.offset)
e913b5cd 894#define TREE_INT_CST_ELT(NODE, I) TREE_INT_CST_ELT_CHECK (NODE, I)
f9ae6f95 895#define TREE_INT_CST_LOW(NODE) \
896 ((unsigned HOST_WIDE_INT) TREE_INT_CST_ELT (NODE, 0))
60b8c5b3 897
ef258422 898#define TREE_REAL_CST_PTR(NODE) (REAL_CST_CHECK (NODE)->real_cst.real_cst_ptr)
899#define TREE_REAL_CST(NODE) (*TREE_REAL_CST_PTR (NODE))
d72a838e 900
eb65426a 901#define TREE_FIXED_CST_PTR(NODE) \
902 (FIXED_CST_CHECK (NODE)->fixed_cst.fixed_cst_ptr)
06f0b99c 903#define TREE_FIXED_CST(NODE) (*TREE_FIXED_CST_PTR (NODE))
904
d72a838e 905/* In a STRING_CST */
21f01152 906/* In C terms, this is sizeof, not strlen. */
3e207e38 907#define TREE_STRING_LENGTH(NODE) (STRING_CST_CHECK (NODE)->string.length)
7d95f6a3 908#define TREE_STRING_POINTER(NODE) \
909 ((const char *)(STRING_CST_CHECK (NODE)->string.str))
d72a838e 910
d72a838e 911/* In a COMPLEX_CST node. */
3e207e38 912#define TREE_REALPART(NODE) (COMPLEX_CST_CHECK (NODE)->complex.real)
913#define TREE_IMAGPART(NODE) (COMPLEX_CST_CHECK (NODE)->complex.imag)
d72a838e 914
886cfd4f 915/* In a VECTOR_CST node. */
dbe954dc 916#define VECTOR_CST_NELTS(NODE) (TYPE_VECTOR_SUBPARTS (TREE_TYPE (NODE)))
fadf62f4 917#define VECTOR_CST_ELTS(NODE) (VECTOR_CST_CHECK (NODE)->vector.elts)
918#define VECTOR_CST_ELT(NODE,IDX) (VECTOR_CST_CHECK (NODE)->vector.elts[IDX])
886cfd4f 919
d72a838e 920/* Define fields and accessors for some special-purpose tree nodes. */
921
0d086e18 922#define IDENTIFIER_LENGTH(NODE) \
56ba46a4 923 (IDENTIFIER_NODE_CHECK (NODE)->identifier.id.len)
0d086e18 924#define IDENTIFIER_POINTER(NODE) \
76c6f48d 925 ((const char *) IDENTIFIER_NODE_CHECK (NODE)->identifier.id.str)
af694375 926#define IDENTIFIER_HASH_VALUE(NODE) \
927 (IDENTIFIER_NODE_CHECK (NODE)->identifier.id.hash_value)
0d086e18 928
929/* Translate a hash table identifier pointer to a tree_identifier
930 pointer, and vice versa. */
931
932#define HT_IDENT_TO_GCC_IDENT(NODE) \
fc9c9e87 933 ((tree) ((char *) (NODE) - sizeof (struct tree_common)))
56ba46a4 934#define GCC_IDENT_TO_HT_IDENT(NODE) (&((struct tree_identifier *) (NODE))->id)
d72a838e 935
d72a838e 936/* In a TREE_LIST node. */
3e207e38 937#define TREE_PURPOSE(NODE) (TREE_LIST_CHECK (NODE)->list.purpose)
938#define TREE_VALUE(NODE) (TREE_LIST_CHECK (NODE)->list.value)
d72a838e 939
d72a838e 940/* In a TREE_VEC node. */
87d8f7b6 941#define TREE_VEC_LENGTH(NODE) (TREE_VEC_CHECK (NODE)->base.u.length)
56ba46a4 942#define TREE_VEC_END(NODE) \
87d8f7b6 943 ((void) TREE_VEC_CHECK (NODE), &((NODE)->vec.a[(NODE)->vec.base.u.length]))
d72a838e 944
66bc87db 945#define TREE_VEC_ELT(NODE,I) TREE_VEC_ELT_CHECK (NODE, I)
946
c75b4594 947/* In a CONSTRUCTOR node. */
948#define CONSTRUCTOR_ELTS(NODE) (CONSTRUCTOR_CHECK (NODE)->constructor.elts)
f82f1250 949#define CONSTRUCTOR_ELT(NODE,IDX) \
f1f41a6c 950 (&(*CONSTRUCTOR_ELTS (NODE))[IDX])
eb65426a 951#define CONSTRUCTOR_NELTS(NODE) \
f1f41a6c 952 (vec_safe_length (CONSTRUCTOR_ELTS (NODE)))
4c163af5 953#define CONSTRUCTOR_NO_CLEARING(NODE) \
954 (CONSTRUCTOR_CHECK (NODE)->base.public_flag)
c75b4594 955
956/* Iterate through the vector V of CONSTRUCTOR_ELT elements, yielding the
957 value of each element (stored within VAL). IX must be a scratch variable
958 of unsigned integer type. */
959#define FOR_EACH_CONSTRUCTOR_VALUE(V, IX, VAL) \
f1f41a6c 960 for (IX = 0; (IX >= vec_safe_length (V)) \
c75b4594 961 ? false \
f1f41a6c 962 : ((VAL = (*(V))[IX].value), \
c75b4594 963 true); \
964 (IX)++)
965
966/* Iterate through the vector V of CONSTRUCTOR_ELT elements, yielding both
967 the value of each element (stored within VAL) and its index (stored
968 within INDEX). IX must be a scratch variable of unsigned integer type. */
969#define FOR_EACH_CONSTRUCTOR_ELT(V, IX, INDEX, VAL) \
f1f41a6c 970 for (IX = 0; (IX >= vec_safe_length (V)) \
c75b4594 971 ? false \
f1f41a6c 972 : (((void) (VAL = (*V)[IX].value)), \
973 (INDEX = (*V)[IX].index), \
4081d362 974 true); \
c75b4594 975 (IX)++)
976
977/* Append a new constructor element to V, with the specified INDEX and VAL. */
978#define CONSTRUCTOR_APPEND_ELT(V, INDEX, VALUE) \
979 do { \
e82e4eb5 980 constructor_elt _ce___ = {INDEX, VALUE}; \
f1f41a6c 981 vec_safe_push ((V), _ce___); \
c75b4594 982 } while (0)
983
34a6a65d 984/* True if NODE, a FIELD_DECL, is to be processed as a bitfield for
985 constructor output purposes. */
986#define CONSTRUCTOR_BITFIELD_P(NODE) \
987 (DECL_BIT_FIELD (FIELD_DECL_CHECK (NODE)) && DECL_MODE (NODE) != BLKmode)
988
3c25489e 989/* True if NODE is a clobber right hand side, an expression of indeterminate
990 value that clobbers the LHS in a copy instruction. We use a volatile
991 empty CONSTRUCTOR for this, as it matches most of the necessary semantic.
992 In particular the volatile flag causes us to not prematurely remove
993 such clobber instructions. */
994#define TREE_CLOBBER_P(NODE) \
995 (TREE_CODE (NODE) == CONSTRUCTOR && TREE_THIS_VOLATILE (NODE))
996
d72a838e 997/* Define fields and accessors for some nodes that represent expressions. */
998
365db11e 999/* Nonzero if NODE is an empty statement (NOP_EXPR <0>). */
4ee9c684 1000#define IS_EMPTY_STMT(NODE) (TREE_CODE (NODE) == NOP_EXPR \
1001 && VOID_TYPE_P (TREE_TYPE (NODE)) \
1002 && integer_zerop (TREE_OPERAND (NODE, 0)))
1003
f20853dd 1004/* In ordinary expression nodes. */
c2f47e15 1005#define TREE_OPERAND_LENGTH(NODE) tree_operand_length (NODE)
2fcde217 1006#define TREE_OPERAND(NODE, I) TREE_OPERAND_CHECK (NODE, I)
f20853dd 1007
c2f47e15 1008/* In a tcc_vl_exp node, operand 0 is an INT_CST node holding the operand
1009 length. Its value includes the length operand itself; that is,
1010 the minimum valid length is 1.
1011 Note that we have to bypass the use of TREE_OPERAND to access
1012 that field to avoid infinite recursion in expanding the macros. */
1013#define VL_EXP_OPERAND_LENGTH(NODE) \
f9ae6f95 1014 ((int)TREE_INT_CST_LOW (VL_EXP_CHECK (NODE)->exp.operands[0]))
c2f47e15 1015
9845d120 1016/* Nonzero if is_gimple_debug() may possibly hold. */
1017#define MAY_HAVE_DEBUG_STMTS (flag_var_tracking_assignments)
1018
b50fb4a3 1019/* In a LOOP_EXPR node. */
2fcde217 1020#define LOOP_EXPR_BODY(NODE) TREE_OPERAND_CHECK_CODE (NODE, LOOP_EXPR, 0)
b50fb4a3 1021
fdfe4b3f 1022/* The source location of this expression. Non-tree_exp nodes such as
1023 decls and constants can be shared among multiple locations, so
1024 return nothing. */
eb65426a 1025#define EXPR_LOCATION(NODE) \
de9d5a8c 1026 (CAN_HAVE_LOCATION_P ((NODE)) ? (NODE)->exp.locus : UNKNOWN_LOCATION)
75a70cf9 1027#define SET_EXPR_LOCATION(NODE, LOCUS) EXPR_CHECK ((NODE))->exp.locus = (LOCUS)
8e7408e3 1028#define EXPR_HAS_LOCATION(NODE) (LOCATION_LOCUS (EXPR_LOCATION (NODE)) \
1029 != UNKNOWN_LOCATION)
5daea214 1030/* The location to be used in a diagnostic about this expression. Do not
1031 use this macro if the location will be assigned to other expressions. */
b0e7825e 1032#define EXPR_LOC_OR_LOC(NODE, LOCUS) (EXPR_HAS_LOCATION (NODE) \
1033 ? (NODE)->exp.locus : (LOCUS))
75a70cf9 1034#define EXPR_FILENAME(NODE) LOCATION_FILE (EXPR_CHECK ((NODE))->exp.locus)
1035#define EXPR_LINENO(NODE) LOCATION_LINE (EXPR_CHECK (NODE)->exp.locus)
35cc02b5 1036
1037/* True if a tree is an expression or statement that can have a
1038 location. */
e60a6f7b 1039#define CAN_HAVE_LOCATION_P(NODE) ((NODE) && EXPR_P (NODE))
dae7d8ad 1040
dda49785 1041extern void protected_set_expr_location (tree, location_t);
1042
7ebc28e0 1043/* In a TARGET_EXPR node. */
2fcde217 1044#define TARGET_EXPR_SLOT(NODE) TREE_OPERAND_CHECK_CODE (NODE, TARGET_EXPR, 0)
1045#define TARGET_EXPR_INITIAL(NODE) TREE_OPERAND_CHECK_CODE (NODE, TARGET_EXPR, 1)
1046#define TARGET_EXPR_CLEANUP(NODE) TREE_OPERAND_CHECK_CODE (NODE, TARGET_EXPR, 2)
7ebc28e0 1047
7dd37241 1048/* DECL_EXPR accessor. This gives access to the DECL associated with
1049 the given declaration statement. */
1050#define DECL_EXPR_DECL(NODE) TREE_OPERAND (DECL_EXPR_CHECK (NODE), 0)
1051
4ee9c684 1052#define EXIT_EXPR_COND(NODE) TREE_OPERAND (EXIT_EXPR_CHECK (NODE), 0)
1053
862f468c 1054/* COMPOUND_LITERAL_EXPR accessors. */
1055#define COMPOUND_LITERAL_EXPR_DECL_EXPR(NODE) \
1056 TREE_OPERAND (COMPOUND_LITERAL_EXPR_CHECK (NODE), 0)
1057#define COMPOUND_LITERAL_EXPR_DECL(NODE) \
1058 DECL_EXPR_DECL (COMPOUND_LITERAL_EXPR_DECL_EXPR (NODE))
1059
4ee9c684 1060/* SWITCH_EXPR accessors. These give access to the condition, body and
1061 original condition type (before any compiler conversions)
1062 of the switch statement, respectively. */
ffc8e524 1063#define SWITCH_COND(NODE) TREE_OPERAND (SWITCH_EXPR_CHECK (NODE), 0)
1064#define SWITCH_BODY(NODE) TREE_OPERAND (SWITCH_EXPR_CHECK (NODE), 1)
1065#define SWITCH_LABELS(NODE) TREE_OPERAND (SWITCH_EXPR_CHECK (NODE), 2)
4ee9c684 1066
eaae3b75 1067/* CASE_LABEL_EXPR accessors. These give access to the high and low values
4ee9c684 1068 of a case label, respectively. */
ffc8e524 1069#define CASE_LOW(NODE) TREE_OPERAND (CASE_LABEL_EXPR_CHECK (NODE), 0)
1070#define CASE_HIGH(NODE) TREE_OPERAND (CASE_LABEL_EXPR_CHECK (NODE), 1)
1071#define CASE_LABEL(NODE) TREE_OPERAND (CASE_LABEL_EXPR_CHECK (NODE), 2)
315119c9 1072#define CASE_CHAIN(NODE) TREE_OPERAND (CASE_LABEL_EXPR_CHECK (NODE), 3)
4ee9c684 1073
28daba6f 1074/* The operands of a TARGET_MEM_REF. Operands 0 and 1 have to match
1075 corresponding MEM_REF operands. */
1076#define TMR_BASE(NODE) (TREE_OPERAND (TARGET_MEM_REF_CHECK (NODE), 0))
1077#define TMR_OFFSET(NODE) (TREE_OPERAND (TARGET_MEM_REF_CHECK (NODE), 1))
aed164c3 1078#define TMR_INDEX(NODE) (TREE_OPERAND (TARGET_MEM_REF_CHECK (NODE), 2))
1079#define TMR_STEP(NODE) (TREE_OPERAND (TARGET_MEM_REF_CHECK (NODE), 3))
28daba6f 1080#define TMR_INDEX2(NODE) (TREE_OPERAND (TARGET_MEM_REF_CHECK (NODE), 4))
aed164c3 1081
4ee9c684 1082/* The operands of a BIND_EXPR. */
1083#define BIND_EXPR_VARS(NODE) (TREE_OPERAND (BIND_EXPR_CHECK (NODE), 0))
1084#define BIND_EXPR_BODY(NODE) (TREE_OPERAND (BIND_EXPR_CHECK (NODE), 1))
1085#define BIND_EXPR_BLOCK(NODE) (TREE_OPERAND (BIND_EXPR_CHECK (NODE), 2))
1086
1087/* GOTO_EXPR accessor. This gives access to the label associated with
1088 a goto statement. */
1089#define GOTO_DESTINATION(NODE) TREE_OPERAND ((NODE), 0)
1090
226c2452 1091/* ASM_EXPR accessors. ASM_STRING returns a STRING_CST for the
4ee9c684 1092 instruction (e.g., "mov x, y"). ASM_OUTPUTS, ASM_INPUTS, and
1093 ASM_CLOBBERS represent the outputs, inputs, and clobbers for the
1094 statement. */
ffc8e524 1095#define ASM_STRING(NODE) TREE_OPERAND (ASM_EXPR_CHECK (NODE), 0)
1096#define ASM_OUTPUTS(NODE) TREE_OPERAND (ASM_EXPR_CHECK (NODE), 1)
1097#define ASM_INPUTS(NODE) TREE_OPERAND (ASM_EXPR_CHECK (NODE), 2)
1098#define ASM_CLOBBERS(NODE) TREE_OPERAND (ASM_EXPR_CHECK (NODE), 3)
78f55ca8 1099#define ASM_LABELS(NODE) TREE_OPERAND (ASM_EXPR_CHECK (NODE), 4)
4ee9c684 1100/* Nonzero if we want to create an ASM_INPUT instead of an
1101 ASM_OPERAND with no operands. */
eba15a75 1102#define ASM_INPUT_P(NODE) (ASM_EXPR_CHECK (NODE)->base.static_flag)
1103#define ASM_VOLATILE_P(NODE) (ASM_EXPR_CHECK (NODE)->base.public_flag)
4ee9c684 1104
1105/* COND_EXPR accessors. */
1106#define COND_EXPR_COND(NODE) (TREE_OPERAND (COND_EXPR_CHECK (NODE), 0))
1107#define COND_EXPR_THEN(NODE) (TREE_OPERAND (COND_EXPR_CHECK (NODE), 1))
1108#define COND_EXPR_ELSE(NODE) (TREE_OPERAND (COND_EXPR_CHECK (NODE), 2))
1109
17519ba0 1110/* Accessors for the chains of recurrences. */
1111#define CHREC_VAR(NODE) TREE_OPERAND (POLYNOMIAL_CHREC_CHECK (NODE), 0)
1112#define CHREC_LEFT(NODE) TREE_OPERAND (POLYNOMIAL_CHREC_CHECK (NODE), 1)
1113#define CHREC_RIGHT(NODE) TREE_OPERAND (POLYNOMIAL_CHREC_CHECK (NODE), 2)
f9ae6f95 1114#define CHREC_VARIABLE(NODE) TREE_INT_CST_LOW (CHREC_VAR (NODE))
17519ba0 1115
4ee9c684 1116/* LABEL_EXPR accessor. This gives access to the label associated with
1117 the given label expression. */
1118#define LABEL_EXPR_LABEL(NODE) TREE_OPERAND (LABEL_EXPR_CHECK (NODE), 0)
1119
4ee9c684 1120/* CATCH_EXPR accessors. */
1121#define CATCH_TYPES(NODE) TREE_OPERAND (CATCH_EXPR_CHECK (NODE), 0)
1122#define CATCH_BODY(NODE) TREE_OPERAND (CATCH_EXPR_CHECK (NODE), 1)
1123
1124/* EH_FILTER_EXPR accessors. */
1125#define EH_FILTER_TYPES(NODE) TREE_OPERAND (EH_FILTER_EXPR_CHECK (NODE), 0)
1126#define EH_FILTER_FAILURE(NODE) TREE_OPERAND (EH_FILTER_EXPR_CHECK (NODE), 1)
4ee9c684 1127
215e2f1d 1128/* OBJ_TYPE_REF accessors. */
1129#define OBJ_TYPE_REF_EXPR(NODE) TREE_OPERAND (OBJ_TYPE_REF_CHECK (NODE), 0)
1130#define OBJ_TYPE_REF_OBJECT(NODE) TREE_OPERAND (OBJ_TYPE_REF_CHECK (NODE), 1)
1131#define OBJ_TYPE_REF_TOKEN(NODE) TREE_OPERAND (OBJ_TYPE_REF_CHECK (NODE), 2)
1132
88dbf20f 1133/* ASSERT_EXPR accessors. */
1134#define ASSERT_EXPR_VAR(NODE) TREE_OPERAND (ASSERT_EXPR_CHECK (NODE), 0)
1135#define ASSERT_EXPR_COND(NODE) TREE_OPERAND (ASSERT_EXPR_CHECK (NODE), 1)
1136
c2f47e15 1137/* CALL_EXPR accessors.
1138 */
1139#define CALL_EXPR_FN(NODE) TREE_OPERAND (CALL_EXPR_CHECK (NODE), 1)
1140#define CALL_EXPR_STATIC_CHAIN(NODE) TREE_OPERAND (CALL_EXPR_CHECK (NODE), 2)
c2f47e15 1141#define CALL_EXPR_ARG(NODE, I) TREE_OPERAND (CALL_EXPR_CHECK (NODE), (I) + 3)
9af5ce0c 1142#define call_expr_nargs(NODE) (VL_EXP_OPERAND_LENGTH (NODE) - 3)
c2f47e15 1143
1144/* CALL_EXPR_ARGP returns a pointer to the argument vector for NODE.
1145 We can't use &CALL_EXPR_ARG (NODE, 0) because that will complain if
1146 the argument count is zero when checking is enabled. Instead, do
1147 the pointer arithmetic to advance past the 3 fixed operands in a
1148 CALL_EXPR. That produces a valid pointer to just past the end of the
1149 operand array, even if it's not valid to dereference it. */
1150#define CALL_EXPR_ARGP(NODE) \
1151 (&(TREE_OPERAND (CALL_EXPR_CHECK (NODE), 0)) + 3)
1152
4c0315d0 1153/* TM directives and accessors. */
1154#define TRANSACTION_EXPR_BODY(NODE) \
1155 TREE_OPERAND (TRANSACTION_EXPR_CHECK (NODE), 0)
1156#define TRANSACTION_EXPR_OUTER(NODE) \
1157 (TRANSACTION_EXPR_CHECK (NODE)->base.static_flag)
1158#define TRANSACTION_EXPR_RELAXED(NODE) \
1159 (TRANSACTION_EXPR_CHECK (NODE)->base.public_flag)
1160
1e8e9920 1161/* OpenMP directive and clause accessors. */
1162
1163#define OMP_BODY(NODE) \
1164 TREE_OPERAND (TREE_RANGE_CHECK (NODE, OMP_PARALLEL, OMP_CRITICAL), 0)
1165#define OMP_CLAUSES(NODE) \
1166 TREE_OPERAND (TREE_RANGE_CHECK (NODE, OMP_PARALLEL, OMP_SINGLE), 1)
1167
1168#define OMP_PARALLEL_BODY(NODE) TREE_OPERAND (OMP_PARALLEL_CHECK (NODE), 0)
1169#define OMP_PARALLEL_CLAUSES(NODE) TREE_OPERAND (OMP_PARALLEL_CHECK (NODE), 1)
1170
fd6481cf 1171#define OMP_TASK_BODY(NODE) TREE_OPERAND (OMP_TASK_CHECK (NODE), 0)
1172#define OMP_TASK_CLAUSES(NODE) TREE_OPERAND (OMP_TASK_CHECK (NODE), 1)
fd6481cf 1173
1174#define OMP_TASKREG_CHECK(NODE) TREE_RANGE_CHECK (NODE, OMP_PARALLEL, OMP_TASK)
1175#define OMP_TASKREG_BODY(NODE) TREE_OPERAND (OMP_TASKREG_CHECK (NODE), 0)
1176#define OMP_TASKREG_CLAUSES(NODE) TREE_OPERAND (OMP_TASKREG_CHECK (NODE), 1)
fd6481cf 1177
bc7bff74 1178#define OMP_LOOP_CHECK(NODE) TREE_RANGE_CHECK (NODE, OMP_FOR, OMP_DISTRIBUTE)
1179#define OMP_FOR_BODY(NODE) TREE_OPERAND (OMP_LOOP_CHECK (NODE), 0)
1180#define OMP_FOR_CLAUSES(NODE) TREE_OPERAND (OMP_LOOP_CHECK (NODE), 1)
1181#define OMP_FOR_INIT(NODE) TREE_OPERAND (OMP_LOOP_CHECK (NODE), 2)
1182#define OMP_FOR_COND(NODE) TREE_OPERAND (OMP_LOOP_CHECK (NODE), 3)
1183#define OMP_FOR_INCR(NODE) TREE_OPERAND (OMP_LOOP_CHECK (NODE), 4)
1184#define OMP_FOR_PRE_BODY(NODE) TREE_OPERAND (OMP_LOOP_CHECK (NODE), 5)
1e8e9920 1185
1186#define OMP_SECTIONS_BODY(NODE) TREE_OPERAND (OMP_SECTIONS_CHECK (NODE), 0)
1187#define OMP_SECTIONS_CLAUSES(NODE) TREE_OPERAND (OMP_SECTIONS_CHECK (NODE), 1)
1188
1189#define OMP_SECTION_BODY(NODE) TREE_OPERAND (OMP_SECTION_CHECK (NODE), 0)
1190
1191#define OMP_SINGLE_BODY(NODE) TREE_OPERAND (OMP_SINGLE_CHECK (NODE), 0)
1192#define OMP_SINGLE_CLAUSES(NODE) TREE_OPERAND (OMP_SINGLE_CHECK (NODE), 1)
1193
1194#define OMP_MASTER_BODY(NODE) TREE_OPERAND (OMP_MASTER_CHECK (NODE), 0)
1195
bc7bff74 1196#define OMP_TASKGROUP_BODY(NODE) TREE_OPERAND (OMP_TASKGROUP_CHECK (NODE), 0)
1197
1e8e9920 1198#define OMP_ORDERED_BODY(NODE) TREE_OPERAND (OMP_ORDERED_CHECK (NODE), 0)
1199
1200#define OMP_CRITICAL_BODY(NODE) TREE_OPERAND (OMP_CRITICAL_CHECK (NODE), 0)
1201#define OMP_CRITICAL_NAME(NODE) TREE_OPERAND (OMP_CRITICAL_CHECK (NODE), 1)
1202
bc7bff74 1203#define OMP_TEAMS_BODY(NODE) TREE_OPERAND (OMP_TEAMS_CHECK (NODE), 0)
1204#define OMP_TEAMS_CLAUSES(NODE) TREE_OPERAND (OMP_TEAMS_CHECK (NODE), 1)
1205
1206#define OMP_TARGET_DATA_BODY(NODE) \
1207 TREE_OPERAND (OMP_TARGET_DATA_CHECK (NODE), 0)
1208#define OMP_TARGET_DATA_CLAUSES(NODE)\
1209 TREE_OPERAND (OMP_TARGET_DATA_CHECK (NODE), 1)
1210
1211#define OMP_TARGET_BODY(NODE) TREE_OPERAND (OMP_TARGET_CHECK (NODE), 0)
1212#define OMP_TARGET_CLAUSES(NODE) TREE_OPERAND (OMP_TARGET_CHECK (NODE), 1)
1213
1214#define OMP_TARGET_UPDATE_CLAUSES(NODE)\
1215 TREE_OPERAND (OMP_TARGET_UPDATE_CHECK (NODE), 0)
1216
1217#define OMP_CLAUSE_SIZE(NODE) \
1218 OMP_CLAUSE_OPERAND (OMP_CLAUSE_RANGE_CHECK (OMP_CLAUSE_CHECK (NODE), \
1219 OMP_CLAUSE_FROM, \
1220 OMP_CLAUSE_MAP), 1)
1221
55d6e7cd 1222#define OMP_CLAUSE_CHAIN(NODE) TREE_CHAIN (OMP_CLAUSE_CHECK (NODE))
1223#define OMP_CLAUSE_DECL(NODE) \
1224 OMP_CLAUSE_OPERAND (OMP_CLAUSE_RANGE_CHECK (OMP_CLAUSE_CHECK (NODE), \
1225 OMP_CLAUSE_PRIVATE, \
bc7bff74 1226 OMP_CLAUSE__LOOPTEMP_), 0)
e60a6f7b 1227#define OMP_CLAUSE_HAS_LOCATION(NODE) \
8e7408e3 1228 (LOCATION_LOCUS ((OMP_CLAUSE_CHECK (NODE))->omp_clause.locus) \
1229 != UNKNOWN_LOCATION)
e60a6f7b 1230#define OMP_CLAUSE_LOCATION(NODE) (OMP_CLAUSE_CHECK (NODE))->omp_clause.locus
1e8e9920 1231
61e47ac8 1232/* True on an OMP_SECTION statement that was the last lexical member.
1233 This status is meaningful in the implementation of lastprivate. */
1234#define OMP_SECTION_LAST(NODE) \
eba15a75 1235 (OMP_SECTION_CHECK (NODE)->base.private_flag)
61e47ac8 1236
87f7c31e 1237/* True on an OMP_PARALLEL statement if it represents an explicit
1238 combined parallel work-sharing constructs. */
1239#define OMP_PARALLEL_COMBINED(NODE) \
eba15a75 1240 (OMP_PARALLEL_CHECK (NODE)->base.private_flag)
87f7c31e 1241
bc7bff74 1242/* True if OMP_ATOMIC* is supposed to be sequentially consistent
1243 as opposed to relaxed. */
1244#define OMP_ATOMIC_SEQ_CST(NODE) \
1245 (TREE_RANGE_CHECK (NODE, OMP_ATOMIC, \
1246 OMP_ATOMIC_CAPTURE_NEW)->base.private_flag)
1247
1e8e9920 1248/* True on a PRIVATE clause if its decl is kept around for debugging
1249 information only and its DECL_VALUE_EXPR is supposed to point
1250 to what it has been remapped to. */
1251#define OMP_CLAUSE_PRIVATE_DEBUG(NODE) \
eba15a75 1252 (OMP_CLAUSE_SUBCODE_CHECK (NODE, OMP_CLAUSE_PRIVATE)->base.public_flag)
1e8e9920 1253
fd6481cf 1254/* True on a PRIVATE clause if ctor needs access to outer region's
1255 variable. */
1256#define OMP_CLAUSE_PRIVATE_OUTER_REF(NODE) \
1257 TREE_PRIVATE (OMP_CLAUSE_SUBCODE_CHECK (NODE, OMP_CLAUSE_PRIVATE))
1258
1e8e9920 1259/* True on a LASTPRIVATE clause if a FIRSTPRIVATE clause for the same
1260 decl is present in the chain. */
1261#define OMP_CLAUSE_LASTPRIVATE_FIRSTPRIVATE(NODE) \
eba15a75 1262 (OMP_CLAUSE_SUBCODE_CHECK (NODE, OMP_CLAUSE_LASTPRIVATE)->base.public_flag)
fd6481cf 1263#define OMP_CLAUSE_LASTPRIVATE_STMT(NODE) \
1264 OMP_CLAUSE_OPERAND (OMP_CLAUSE_SUBCODE_CHECK (NODE, \
1265 OMP_CLAUSE_LASTPRIVATE),\
1266 1)
75a70cf9 1267#define OMP_CLAUSE_LASTPRIVATE_GIMPLE_SEQ(NODE) \
1268 (OMP_CLAUSE_CHECK (NODE))->omp_clause.gimple_reduction_init
1e8e9920 1269
2169f33b 1270#define OMP_CLAUSE_FINAL_EXPR(NODE) \
1271 OMP_CLAUSE_OPERAND (OMP_CLAUSE_SUBCODE_CHECK (NODE, OMP_CLAUSE_FINAL), 0)
1e8e9920 1272#define OMP_CLAUSE_IF_EXPR(NODE) \
55d6e7cd 1273 OMP_CLAUSE_OPERAND (OMP_CLAUSE_SUBCODE_CHECK (NODE, OMP_CLAUSE_IF), 0)
1e8e9920 1274#define OMP_CLAUSE_NUM_THREADS_EXPR(NODE) \
55d6e7cd 1275 OMP_CLAUSE_OPERAND (OMP_CLAUSE_SUBCODE_CHECK (NODE, OMP_CLAUSE_NUM_THREADS),0)
1e8e9920 1276#define OMP_CLAUSE_SCHEDULE_CHUNK_EXPR(NODE) \
55d6e7cd 1277 OMP_CLAUSE_OPERAND (OMP_CLAUSE_SUBCODE_CHECK (NODE, OMP_CLAUSE_SCHEDULE), 0)
1e8e9920 1278
bc7bff74 1279#define OMP_CLAUSE_DEPEND_KIND(NODE) \
1280 (OMP_CLAUSE_SUBCODE_CHECK (NODE, OMP_CLAUSE_DEPEND)->omp_clause.subcode.depend_kind)
1281
1282#define OMP_CLAUSE_MAP_KIND(NODE) \
1283 (OMP_CLAUSE_SUBCODE_CHECK (NODE, OMP_CLAUSE_MAP)->omp_clause.subcode.map_kind)
1284
1285/* Nonzero if this map clause is for array (rather than pointer) based array
1286 section with zero bias. Both the non-decl OMP_CLAUSE_MAP and
1287 correspoidng OMP_CLAUSE_MAP_POINTER clause are marked with this flag. */
1288#define OMP_CLAUSE_MAP_ZERO_BIAS_ARRAY_SECTION(NODE) \
1289 (OMP_CLAUSE_SUBCODE_CHECK (NODE, OMP_CLAUSE_MAP)->base.public_flag)
1290
1291#define OMP_CLAUSE_PROC_BIND_KIND(NODE) \
1292 (OMP_CLAUSE_SUBCODE_CHECK (NODE, OMP_CLAUSE_PROC_BIND)->omp_clause.subcode.proc_bind_kind)
1293
fd6481cf 1294#define OMP_CLAUSE_COLLAPSE_EXPR(NODE) \
1295 OMP_CLAUSE_OPERAND (OMP_CLAUSE_SUBCODE_CHECK (NODE, OMP_CLAUSE_COLLAPSE), 0)
1296#define OMP_CLAUSE_COLLAPSE_ITERVAR(NODE) \
1297 OMP_CLAUSE_OPERAND (OMP_CLAUSE_SUBCODE_CHECK (NODE, OMP_CLAUSE_COLLAPSE), 1)
1298#define OMP_CLAUSE_COLLAPSE_COUNT(NODE) \
1299 OMP_CLAUSE_OPERAND (OMP_CLAUSE_SUBCODE_CHECK (NODE, OMP_CLAUSE_COLLAPSE), 2)
1300
1e8e9920 1301#define OMP_CLAUSE_REDUCTION_CODE(NODE) \
55d6e7cd 1302 (OMP_CLAUSE_SUBCODE_CHECK (NODE, OMP_CLAUSE_REDUCTION)->omp_clause.subcode.reduction_code)
1e8e9920 1303#define OMP_CLAUSE_REDUCTION_INIT(NODE) \
55d6e7cd 1304 OMP_CLAUSE_OPERAND (OMP_CLAUSE_SUBCODE_CHECK (NODE, OMP_CLAUSE_REDUCTION), 1)
1e8e9920 1305#define OMP_CLAUSE_REDUCTION_MERGE(NODE) \
55d6e7cd 1306 OMP_CLAUSE_OPERAND (OMP_CLAUSE_SUBCODE_CHECK (NODE, OMP_CLAUSE_REDUCTION), 2)
75a70cf9 1307#define OMP_CLAUSE_REDUCTION_GIMPLE_INIT(NODE) \
1308 (OMP_CLAUSE_CHECK (NODE))->omp_clause.gimple_reduction_init
1309#define OMP_CLAUSE_REDUCTION_GIMPLE_MERGE(NODE) \
1310 (OMP_CLAUSE_CHECK (NODE))->omp_clause.gimple_reduction_merge
1e8e9920 1311#define OMP_CLAUSE_REDUCTION_PLACEHOLDER(NODE) \
55d6e7cd 1312 OMP_CLAUSE_OPERAND (OMP_CLAUSE_SUBCODE_CHECK (NODE, OMP_CLAUSE_REDUCTION), 3)
1e8e9920 1313
bc7bff74 1314/* True if a REDUCTION clause may reference the original list item (omp_orig)
1315 in its OMP_CLAUSE_REDUCTION_{,GIMPLE_}INIT. */
1316#define OMP_CLAUSE_REDUCTION_OMP_ORIG_REF(NODE) \
1317 (OMP_CLAUSE_SUBCODE_CHECK (NODE, OMP_CLAUSE_REDUCTION)->base.public_flag)
1318
3d483a94 1319/* True if a LINEAR clause doesn't need copy in. True for iterator vars which
1320 are always initialized inside of the loop construct, false otherwise. */
1321#define OMP_CLAUSE_LINEAR_NO_COPYIN(NODE) \
1322 (OMP_CLAUSE_SUBCODE_CHECK (NODE, OMP_CLAUSE_LINEAR)->base.public_flag)
1323
1324/* True if a LINEAR clause doesn't need copy out. True for iterator vars which
1325 are declared inside of the simd construct. */
1326#define OMP_CLAUSE_LINEAR_NO_COPYOUT(NODE) \
1327 TREE_PRIVATE (OMP_CLAUSE_SUBCODE_CHECK (NODE, OMP_CLAUSE_LINEAR))
1328
d09768a4 1329/* True if a LINEAR clause has a stride that is variable. */
1330#define OMP_CLAUSE_LINEAR_VARIABLE_STRIDE(NODE) \
1331 TREE_PROTECTED (OMP_CLAUSE_SUBCODE_CHECK (NODE, OMP_CLAUSE_LINEAR))
1332
3d483a94 1333#define OMP_CLAUSE_LINEAR_STEP(NODE) \
1334 OMP_CLAUSE_OPERAND (OMP_CLAUSE_SUBCODE_CHECK (NODE, OMP_CLAUSE_LINEAR), 1)
1335
15b28553 1336#define OMP_CLAUSE_LINEAR_STMT(NODE) \
1337 OMP_CLAUSE_OPERAND (OMP_CLAUSE_SUBCODE_CHECK (NODE, OMP_CLAUSE_LINEAR), 2)
1338
2b536a17 1339#define OMP_CLAUSE_LINEAR_GIMPLE_SEQ(NODE) \
1340 (OMP_CLAUSE_CHECK (NODE))->omp_clause.gimple_reduction_init
1341
bc7bff74 1342#define OMP_CLAUSE_ALIGNED_ALIGNMENT(NODE) \
1343 OMP_CLAUSE_OPERAND (OMP_CLAUSE_SUBCODE_CHECK (NODE, OMP_CLAUSE_ALIGNED), 1)
1344
1345#define OMP_CLAUSE_NUM_TEAMS_EXPR(NODE) \
1346 OMP_CLAUSE_OPERAND (OMP_CLAUSE_SUBCODE_CHECK (NODE, OMP_CLAUSE_NUM_TEAMS), 0)
1347
1348#define OMP_CLAUSE_THREAD_LIMIT_EXPR(NODE) \
1349 OMP_CLAUSE_OPERAND (OMP_CLAUSE_SUBCODE_CHECK (NODE, \
1350 OMP_CLAUSE_THREAD_LIMIT), 0)
1351
1352#define OMP_CLAUSE_DEVICE_ID(NODE) \
1353 OMP_CLAUSE_OPERAND (OMP_CLAUSE_SUBCODE_CHECK (NODE, OMP_CLAUSE_DEVICE), 0)
1354
1355#define OMP_CLAUSE_DIST_SCHEDULE_CHUNK_EXPR(NODE) \
1356 OMP_CLAUSE_OPERAND (OMP_CLAUSE_SUBCODE_CHECK (NODE, \
1357 OMP_CLAUSE_DIST_SCHEDULE), 0)
1358
3d483a94 1359#define OMP_CLAUSE_SAFELEN_EXPR(NODE) \
1360 OMP_CLAUSE_OPERAND (OMP_CLAUSE_SUBCODE_CHECK (NODE, OMP_CLAUSE_SAFELEN), 0)
1361
bc7bff74 1362#define OMP_CLAUSE_SIMDLEN_EXPR(NODE) \
1363 OMP_CLAUSE_OPERAND (OMP_CLAUSE_SUBCODE_CHECK (NODE, OMP_CLAUSE_SIMDLEN), 0)
1364
3d483a94 1365#define OMP_CLAUSE__SIMDUID__DECL(NODE) \
1366 OMP_CLAUSE_OPERAND (OMP_CLAUSE_SUBCODE_CHECK (NODE, OMP_CLAUSE__SIMDUID_), 0)
1e8e9920 1367
1368#define OMP_CLAUSE_SCHEDULE_KIND(NODE) \
55d6e7cd 1369 (OMP_CLAUSE_SUBCODE_CHECK (NODE, OMP_CLAUSE_SCHEDULE)->omp_clause.subcode.schedule_kind)
1e8e9920 1370
1e8e9920 1371#define OMP_CLAUSE_DEFAULT_KIND(NODE) \
55d6e7cd 1372 (OMP_CLAUSE_SUBCODE_CHECK (NODE, OMP_CLAUSE_DEFAULT)->omp_clause.subcode.default_kind)
1e8e9920 1373
4ee9c684 1374/* SSA_NAME accessors. */
1375
ec11736b 1376/* Returns the IDENTIFIER_NODE giving the SSA name a name or NULL_TREE
1377 if there is no name associated with it. */
1378#define SSA_NAME_IDENTIFIER(NODE) \
1379 (SSA_NAME_CHECK (NODE)->ssa_name.var != NULL_TREE \
1380 ? (TREE_CODE ((NODE)->ssa_name.var) == IDENTIFIER_NODE \
1381 ? (NODE)->ssa_name.var \
1382 : DECL_NAME ((NODE)->ssa_name.var)) \
1383 : NULL_TREE)
1384
1385/* Returns the variable being referenced. This can be NULL_TREE for
1386 temporaries not associated with any user variable.
1387 Once released, this is the only field that can be relied upon. */
1388#define SSA_NAME_VAR(NODE) \
1389 (SSA_NAME_CHECK (NODE)->ssa_name.var == NULL_TREE \
1390 || TREE_CODE ((NODE)->ssa_name.var) == IDENTIFIER_NODE \
1391 ? NULL_TREE : (NODE)->ssa_name.var)
1392
1393#define SET_SSA_NAME_VAR_OR_IDENTIFIER(NODE,VAR) \
1394 do { SSA_NAME_CHECK (NODE)->ssa_name.var = (VAR); } while (0)
4ee9c684 1395
75a70cf9 1396/* Returns the statement which defines this SSA name. */
1397#define SSA_NAME_DEF_STMT(NODE) SSA_NAME_CHECK (NODE)->ssa_name.def_stmt
4ee9c684 1398
1399/* Returns the SSA version number of this SSA name. Note that in
1400 tree SSA, version numbers are not per variable and may be recycled. */
87d8f7b6 1401#define SSA_NAME_VERSION(NODE) SSA_NAME_CHECK (NODE)->base.u.version
4ee9c684 1402
1403/* Nonzero if this SSA name occurs in an abnormal PHI. SSA_NAMES are
1404 never output, so we can safely use the ASM_WRITTEN_FLAG for this
1405 status bit. */
1406#define SSA_NAME_OCCURS_IN_ABNORMAL_PHI(NODE) \
35cc02b5 1407 SSA_NAME_CHECK (NODE)->base.asm_written_flag
4ee9c684 1408
786d45db 1409/* Nonzero if this SSA_NAME expression is currently on the free list of
4ee9c684 1410 SSA_NAMES. Using NOTHROW_FLAG seems reasonably safe since throwing
1411 has no meaning for an SSA_NAME. */
1412#define SSA_NAME_IN_FREE_LIST(NODE) \
35cc02b5 1413 SSA_NAME_CHECK (NODE)->base.nothrow_flag
4ee9c684 1414
de6ed584 1415/* Nonzero if this SSA_NAME is the default definition for the
1416 underlying symbol. A default SSA name is created for symbol S if
1417 the very first reference to S in the function is a read operation.
1418 Default definitions are always created by an empty statement and
1419 belong to no basic block. */
eb65426a 1420#define SSA_NAME_IS_DEFAULT_DEF(NODE) \
83901169 1421 SSA_NAME_CHECK (NODE)->base.default_def_flag
de6ed584 1422
786d45db 1423/* Attributes for SSA_NAMEs for pointer-type variables. */
1424#define SSA_NAME_PTR_INFO(N) \
3c59e4a7 1425 SSA_NAME_CHECK (N)->ssa_name.info.ptr_info
1426
0c20fe49 1427/* True if SSA_NAME_RANGE_INFO describes an anti-range. */
1428#define SSA_NAME_ANTI_RANGE_P(N) \
1429 SSA_NAME_CHECK (N)->base.static_flag
1430
1431/* The type of range described by SSA_NAME_RANGE_INFO. */
1432#define SSA_NAME_RANGE_TYPE(N) \
1433 (SSA_NAME_ANTI_RANGE_P (N) ? VR_ANTI_RANGE : VR_RANGE)
1434
3c59e4a7 1435/* Value range info attributes for SSA_NAMEs of non pointer-type variables. */
1436#define SSA_NAME_RANGE_INFO(N) \
1437 SSA_NAME_CHECK (N)->ssa_name.info.range_info
786d45db 1438
22aa74c4 1439/* Return the immediate_use information for an SSA_NAME. */
1440#define SSA_NAME_IMM_USE_NODE(NODE) SSA_NAME_CHECK (NODE)->ssa_name.imm_uses
1441
55d6e7cd 1442#define OMP_CLAUSE_CODE(NODE) \
1443 (OMP_CLAUSE_CHECK (NODE))->omp_clause.code
1444
1445#define OMP_CLAUSE_SET_CODE(NODE, CODE) \
1446 ((OMP_CLAUSE_CHECK (NODE))->omp_clause.code = (CODE))
1447
55d6e7cd 1448#define OMP_CLAUSE_OPERAND(NODE, I) \
1449 OMP_CLAUSE_ELT_CHECK (NODE, I)
1450
d72a838e 1451/* In a BLOCK node. */
3e207e38 1452#define BLOCK_VARS(NODE) (BLOCK_CHECK (NODE)->block.vars)
eb65426a 1453#define BLOCK_NONLOCALIZED_VARS(NODE) \
1454 (BLOCK_CHECK (NODE)->block.nonlocalized_vars)
1455#define BLOCK_NUM_NONLOCALIZED_VARS(NODE) \
f1f41a6c 1456 vec_safe_length (BLOCK_NONLOCALIZED_VARS (NODE))
1457#define BLOCK_NONLOCALIZED_VAR(NODE,N) (*BLOCK_NONLOCALIZED_VARS (NODE))[N]
3e207e38 1458#define BLOCK_SUBBLOCKS(NODE) (BLOCK_CHECK (NODE)->block.subblocks)
1459#define BLOCK_SUPERCONTEXT(NODE) (BLOCK_CHECK (NODE)->block.supercontext)
027fc6ef 1460#define BLOCK_CHAIN(NODE) (BLOCK_CHECK (NODE)->block.chain)
3e207e38 1461#define BLOCK_ABSTRACT_ORIGIN(NODE) (BLOCK_CHECK (NODE)->block.abstract_origin)
1462#define BLOCK_ABSTRACT(NODE) (BLOCK_CHECK (NODE)->block.abstract_flag)
d72a838e 1463
665611e7 1464/* True if BLOCK has the same ranges as its BLOCK_SUPERCONTEXT. */
87d8f7b6 1465#define BLOCK_SAME_RANGE(NODE) (BLOCK_CHECK (NODE)->base.u.bits.nameless_flag)
665611e7 1466
5846cb0f 1467/* An index number for this block. These values are not guaranteed to
1468 be unique across functions -- whether or not they are depends on
1469 the debugging output format in use. */
1470#define BLOCK_NUMBER(NODE) (BLOCK_CHECK (NODE)->block.block_num)
1471
a36145ca 1472/* If block reordering splits a lexical block into discontiguous
1473 address ranges, we'll make a copy of the original block.
1474
1475 Note that this is logically distinct from BLOCK_ABSTRACT_ORIGIN.
1476 In that case, we have one source block that has been replicated
1477 (through inlining or unrolling) into many logical blocks, and that
1478 these logical blocks have different physical variables in them.
1479
1480 In this case, we have one logical block split into several
1481 non-contiguous address ranges. Most debug formats can't actually
1482 represent this idea directly, so we fake it by creating multiple
1483 logical blocks with the same variables in them. However, for those
1484 that do support non-contiguous regions, these allow the original
1485 logical block to be reconstructed, along with the set of address
1486 ranges.
1487
1488 One of the logical block fragments is arbitrarily chosen to be
1489 the ORIGIN. The other fragments will point to the origin via
1490 BLOCK_FRAGMENT_ORIGIN; the origin itself will have this pointer
6c34d0c2 1491 be null. The list of fragments will be chained through
a36145ca 1492 BLOCK_FRAGMENT_CHAIN from the origin. */
1493
56ba46a4 1494#define BLOCK_FRAGMENT_ORIGIN(NODE) (BLOCK_CHECK (NODE)->block.fragment_origin)
1495#define BLOCK_FRAGMENT_CHAIN(NODE) (BLOCK_CHECK (NODE)->block.fragment_chain)
a36145ca 1496
44276901 1497/* For an inlined function, this gives the location where it was called
1498 from. This is only set in the top level block, which corresponds to the
1499 inlined function scope. This is used in the debug output routines. */
1500
1501#define BLOCK_SOURCE_LOCATION(NODE) (BLOCK_CHECK (NODE)->block.locus)
1502
d72a838e 1503/* Define fields and accessors for nodes representing data types. */
1504
1505/* See tree.def for documentation of the use of these fields.
82bb2115 1506 Look at the documentation of the various ..._TYPE tree codes.
1507
3927afe0 1508 Note that the type.values, type.minval, and type.maxval fields are
82bb2115 1509 overloaded and used for different macros in different kinds of types.
1510 Each macro must check to ensure the tree node is of the proper kind of
1511 type. Note also that some of the front-ends also overload these fields,
1512 so they must be checked as well. */
d72a838e 1513
8f2eb9e1 1514#define TYPE_UID(NODE) (TYPE_CHECK (NODE)->type_common.uid)
1515#define TYPE_SIZE(NODE) (TYPE_CHECK (NODE)->type_common.size)
1516#define TYPE_SIZE_UNIT(NODE) (TYPE_CHECK (NODE)->type_common.size_unit)
1517#define TYPE_POINTER_TO(NODE) (TYPE_CHECK (NODE)->type_common.pointer_to)
1518#define TYPE_REFERENCE_TO(NODE) (TYPE_CHECK (NODE)->type_common.reference_to)
1519#define TYPE_PRECISION(NODE) (TYPE_CHECK (NODE)->type_common.precision)
1520#define TYPE_NAME(NODE) (TYPE_CHECK (NODE)->type_common.name)
1521#define TYPE_NEXT_VARIANT(NODE) (TYPE_CHECK (NODE)->type_common.next_variant)
1522#define TYPE_MAIN_VARIANT(NODE) (TYPE_CHECK (NODE)->type_common.main_variant)
1523#define TYPE_CONTEXT(NODE) (TYPE_CHECK (NODE)->type_common.context)
6753bca0 1524
342ad2d6 1525#define TYPE_MODE(NODE) \
8ee286c8 1526 (VECTOR_TYPE_P (TYPE_CHECK (NODE)) \
8f2eb9e1 1527 ? vector_type_mode (NODE) : (NODE)->type_common.mode)
342ad2d6 1528#define SET_TYPE_MODE(NODE, MODE) \
8f2eb9e1 1529 (TYPE_CHECK (NODE)->type_common.mode = (MODE))
342ad2d6 1530
09eb10ed 1531/* The "canonical" type for this type node, which is used by frontends to
1532 compare the type for equality with another type. If two types are
6753bca0 1533 equal (based on the semantics of the language), then they will have
48e1416a 1534 equivalent TYPE_CANONICAL entries.
6753bca0 1535
09eb10ed 1536 As a special case, if TYPE_CANONICAL is NULL_TREE, and thus
1537 TYPE_STRUCTURAL_EQUALITY_P is true, then it cannot
1538 be used for comparison against other types. Instead, the type is
6753bca0 1539 said to require structural equality checks, described in
09eb10ed 1540 TYPE_STRUCTURAL_EQUALITY_P.
1541
1542 For unqualified aggregate and function types the middle-end relies on
1543 TYPE_CANONICAL to tell whether two variables can be assigned
1544 to each other without a conversion. The middle-end also makes sure
1545 to assign the same alias-sets to the type partition with equal
1546 TYPE_CANONICAL of their unqualified variants. */
8f2eb9e1 1547#define TYPE_CANONICAL(NODE) (TYPE_CHECK (NODE)->type_common.canonical)
6753bca0 1548/* Indicates that the type node requires structural equality
09eb10ed 1549 checks. The compiler will need to look at the composition of the
6753bca0 1550 type to determine whether it is equal to another type, rather than
09eb10ed 1551 just comparing canonical type pointers. For instance, we would need
6753bca0 1552 to look at the return and parameter types of a FUNCTION_TYPE
09eb10ed 1553 node. */
6753bca0 1554#define TYPE_STRUCTURAL_EQUALITY_P(NODE) (TYPE_CANONICAL (NODE) == NULL_TREE)
1555/* Sets the TYPE_CANONICAL field to NULL_TREE, indicating that the
09eb10ed 1556 type node requires structural equality. */
6753bca0 1557#define SET_TYPE_STRUCTURAL_EQUALITY(NODE) (TYPE_CANONICAL (NODE) = NULL_TREE)
09eb10ed 1558
06f0b99c 1559#define TYPE_IBIT(NODE) (GET_MODE_IBIT (TYPE_MODE (NODE)))
1560#define TYPE_FBIT(NODE) (GET_MODE_FBIT (TYPE_MODE (NODE)))
d72a838e 1561
b5ba9f3a 1562/* The (language-specific) typed-based alias set for this type.
1563 Objects whose TYPE_ALIAS_SETs are different cannot alias each
1564 other. If the TYPE_ALIAS_SET is -1, no alias set has yet been
1565 assigned to this type. If the TYPE_ALIAS_SET is 0, objects of this
1566 type can alias objects of any type. */
8f2eb9e1 1567#define TYPE_ALIAS_SET(NODE) (TYPE_CHECK (NODE)->type_common.alias_set)
b5ba9f3a 1568
1569/* Nonzero iff the typed-based alias set for this type has been
1570 calculated. */
8f2eb9e1 1571#define TYPE_ALIAS_SET_KNOWN_P(NODE) \
1572 (TYPE_CHECK (NODE)->type_common.alias_set != -1)
b5ba9f3a 1573
a12eeaaf 1574/* A TREE_LIST of IDENTIFIER nodes of the attributes that apply
1575 to this type. */
8f2eb9e1 1576#define TYPE_ATTRIBUTES(NODE) (TYPE_CHECK (NODE)->type_common.attributes)
a12eeaaf 1577
c3b0175e 1578/* The alignment necessary for objects of this type.
1579 The value is an int, measured in bits. */
8f2eb9e1 1580#define TYPE_ALIGN(NODE) (TYPE_CHECK (NODE)->type_common.align)
c3b0175e 1581
aca14577 1582/* 1 if the alignment for this type was requested by "aligned" attribute,
1583 0 if it is the default for this type. */
87d8f7b6 1584#define TYPE_USER_ALIGN(NODE) (TYPE_CHECK (NODE)->base.u.bits.user_align)
aca14577 1585
89e923d8 1586/* The alignment for NODE, in bytes. */
56ba46a4 1587#define TYPE_ALIGN_UNIT(NODE) (TYPE_ALIGN (NODE) / BITS_PER_UNIT)
89e923d8 1588
13fad59c 1589/* If your language allows you to declare types, and you want debug info
1590 for them, then you need to generate corresponding TYPE_DECL nodes.
1591 These "stub" TYPE_DECL nodes have no name, and simply point at the
1592 type node. You then set the TYPE_STUB_DECL field of the type node
1593 to point back at the TYPE_DECL node. This allows the debug routines
1594 to know that the two nodes represent the same type, so that we only
88b5b080 1595 get one debug info record for them. */
742529a2 1596#define TYPE_STUB_DECL(NODE) (TREE_CHAIN (TYPE_CHECK (NODE)))
d72a838e 1597
96cd09d2 1598/* In a RECORD_TYPE, UNION_TYPE, QUAL_UNION_TYPE or ARRAY_TYPE, it means
1599 the type has BLKmode only because it lacks the alignment required for
7dd9d898 1600 its size. */
8f2eb9e1 1601#define TYPE_NO_FORCE_BLK(NODE) \
1602 (TYPE_CHECK (NODE)->type_common.no_force_blk_flag)
d72a838e 1603
1604/* Nonzero in a type considered volatile as a whole. */
35cc02b5 1605#define TYPE_VOLATILE(NODE) (TYPE_CHECK (NODE)->base.volatile_flag)
d72a838e 1606
b560fabd 1607/* Nonzero in a type considered atomic as a whole. */
1608#define TYPE_ATOMIC(NODE) (TYPE_CHECK (NODE)->base.u.bits.atomic_flag)
1609
d72a838e 1610/* Means this type is const-qualified. */
35cc02b5 1611#define TYPE_READONLY(NODE) (TYPE_CHECK (NODE)->base.readonly_flag)
d72a838e 1612
a5b1863e 1613/* If nonzero, this type is `restrict'-qualified, in the C sense of
1614 the term. */
8f2eb9e1 1615#define TYPE_RESTRICT(NODE) (TYPE_CHECK (NODE)->type_common.restrict_flag)
a5b1863e 1616
84bfaaeb 1617/* If nonzero, type's name shouldn't be emitted into debug info. */
87d8f7b6 1618#define TYPE_NAMELESS(NODE) (TYPE_CHECK (NODE)->base.u.bits.nameless_flag)
84bfaaeb 1619
bd1a81f7 1620/* The address space the type is in. */
87d8f7b6 1621#define TYPE_ADDR_SPACE(NODE) (TYPE_CHECK (NODE)->base.u.bits.address_space)
bd1a81f7 1622
bd1a81f7 1623/* Encode/decode the named memory support as part of the qualifier. If more
1624 than 8 qualifiers are added, these macros need to be adjusted. */
1625#define ENCODE_QUAL_ADDR_SPACE(NUM) ((NUM & 0xFF) << 8)
1626#define DECODE_QUAL_ADDR_SPACE(X) (((X) >> 8) & 0xFF)
1627
1628/* Return all qualifiers except for the address space qualifiers. */
1629#define CLEAR_QUAL_ADDR_SPACE(X) ((X) & ~0xFF00)
1630
1631/* Only keep the address space out of the qualifiers and discard the other
1632 qualifiers. */
1633#define KEEP_QUAL_ADDR_SPACE(X) ((X) & 0xFF00)
1634
a5b1863e 1635/* The set of type qualifiers for this type. */
716fc477 1636#define TYPE_QUALS(NODE) \
3637bb87 1637 ((int) ((TYPE_READONLY (NODE) * TYPE_QUAL_CONST) \
1638 | (TYPE_VOLATILE (NODE) * TYPE_QUAL_VOLATILE) \
b560fabd 1639 | (TYPE_ATOMIC (NODE) * TYPE_QUAL_ATOMIC) \
3637bb87 1640 | (TYPE_RESTRICT (NODE) * TYPE_QUAL_RESTRICT) \
1641 | (ENCODE_QUAL_ADDR_SPACE (TYPE_ADDR_SPACE (NODE)))))
bd1a81f7 1642
1643/* The same as TYPE_QUALS without the address space qualifications. */
1644#define TYPE_QUALS_NO_ADDR_SPACE(NODE) \
b560fabd 1645 ((int) ((TYPE_READONLY (NODE) * TYPE_QUAL_CONST) \
1646 | (TYPE_VOLATILE (NODE) * TYPE_QUAL_VOLATILE) \
1647 | (TYPE_ATOMIC (NODE) * TYPE_QUAL_ATOMIC) \
1648 | (TYPE_RESTRICT (NODE) * TYPE_QUAL_RESTRICT)))
1649
1650/* The same as TYPE_QUALS without the address space and atomic
1651 qualifications. */
1652#define TYPE_QUALS_NO_ADDR_SPACE_NO_ATOMIC(NODE) \
3637bb87 1653 ((int) ((TYPE_READONLY (NODE) * TYPE_QUAL_CONST) \
1654 | (TYPE_VOLATILE (NODE) * TYPE_QUAL_VOLATILE) \
1655 | (TYPE_RESTRICT (NODE) * TYPE_QUAL_RESTRICT)))
a5b1863e 1656
bc3a4bfd 1657/* These flags are available for each language front end to use internally. */
8f2eb9e1 1658#define TYPE_LANG_FLAG_0(NODE) (TYPE_CHECK (NODE)->type_common.lang_flag_0)
1659#define TYPE_LANG_FLAG_1(NODE) (TYPE_CHECK (NODE)->type_common.lang_flag_1)
1660#define TYPE_LANG_FLAG_2(NODE) (TYPE_CHECK (NODE)->type_common.lang_flag_2)
1661#define TYPE_LANG_FLAG_3(NODE) (TYPE_CHECK (NODE)->type_common.lang_flag_3)
1662#define TYPE_LANG_FLAG_4(NODE) (TYPE_CHECK (NODE)->type_common.lang_flag_4)
1663#define TYPE_LANG_FLAG_5(NODE) (TYPE_CHECK (NODE)->type_common.lang_flag_5)
1664#define TYPE_LANG_FLAG_6(NODE) (TYPE_CHECK (NODE)->type_common.lang_flag_6)
d72a838e 1665
4ee9c684 1666/* Used to keep track of visited nodes in tree traversals. This is set to
1667 0 by copy_node and make_node. */
35cc02b5 1668#define TREE_VISITED(NODE) ((NODE)->base.visited)
4ee9c684 1669
b759e947 1670/* If set in an ARRAY_TYPE, indicates a string type (for languages
1671 that distinguish string from array of char).
e026e576 1672 If set in a INTEGER_TYPE, indicates a character type. */
8f2eb9e1 1673#define TYPE_STRING_FLAG(NODE) (TYPE_CHECK (NODE)->type_common.string_flag)
255218ff 1674
8a95ab85 1675/* For a VECTOR_TYPE, this is the number of sub-parts of the vector. */
56ba46a4 1676#define TYPE_VECTOR_SUBPARTS(VECTOR_TYPE) \
99d38b9e 1677 (((unsigned HOST_WIDE_INT) 1) \
8f2eb9e1 1678 << VECTOR_TYPE_CHECK (VECTOR_TYPE)->type_common.precision)
99d38b9e 1679
1680/* Set precision to n when we have 2^n sub-parts of the vector. */
1681#define SET_TYPE_VECTOR_SUBPARTS(VECTOR_TYPE, X) \
8f2eb9e1 1682 (VECTOR_TYPE_CHECK (VECTOR_TYPE)->type_common.precision = exact_log2 (X))
8a95ab85 1683
8b50765f 1684/* Nonzero in a VECTOR_TYPE if the frontends should not emit warnings
1685 about missing conversions to other vector types of the same size. */
8d125f7d 1686#define TYPE_VECTOR_OPAQUE(NODE) \
e0213ecc 1687 (VECTOR_TYPE_CHECK (NODE)->base.default_def_flag)
8d125f7d 1688
fcdd3ab3 1689/* Indicates that objects of this type must be initialized by calling a
be98dac3 1690 function when they are created. */
851dfbff 1691#define TYPE_NEEDS_CONSTRUCTING(NODE) \
8f2eb9e1 1692 (TYPE_CHECK (NODE)->type_common.needs_constructing_flag)
be98dac3 1693
8df5a43d 1694/* Indicates that a UNION_TYPE object should be passed the same way that
1695 the first union alternative would be passed, or that a RECORD_TYPE
1696 object should be passed the same way that the first (and only) member
1697 would be passed. */
1698#define TYPE_TRANSPARENT_AGGR(NODE) \
8f2eb9e1 1699 (RECORD_OR_UNION_CHECK (NODE)->type_common.transparent_aggr_flag)
851dfbff 1700
c67bf066 1701/* For an ARRAY_TYPE, indicates that it is not permitted to take the
1702 address of a component of the type. This is the counterpart of
1703 DECL_NONADDRESSABLE_P for arrays, see the definition of this flag. */
851dfbff 1704#define TYPE_NONALIASED_COMPONENT(NODE) \
8f2eb9e1 1705 (ARRAY_TYPE_CHECK (NODE)->type_common.transparent_aggr_flag)
fa602b3f 1706
ad87de1e 1707/* Indicated that objects of this type should be laid out in as
1a8ea5c4 1708 compact a way as possible. */
87d8f7b6 1709#define TYPE_PACKED(NODE) (TYPE_CHECK (NODE)->base.u.bits.packed_flag)
1a8ea5c4 1710
2bd342e5 1711/* Used by type_contains_placeholder_p to avoid recomputation.
1712 Values are: 0 (unknown), 1 (false), 2 (true). Never access
1713 this field directly. */
1714#define TYPE_CONTAINS_PLACEHOLDER_INTERNAL(NODE) \
8f2eb9e1 1715 (TYPE_CHECK (NODE)->type_common.contains_placeholder_bits)
2bd342e5 1716
585bb356 1717/* Nonzero if RECORD_TYPE represents a final derivation of class. */
1718#define TYPE_FINAL_P(NODE) \
1719 (RECORD_OR_UNION_CHECK (NODE)->base.default_def_flag)
1720
929d2a90 1721/* The debug output functions use the symtab union field to store
1722 information specific to the debugging format. The different debug
1723 output hooks store different types in the union field. These three
1724 macros are used to access different fields in the union. The debug
1725 hooks are responsible for consistently using only a specific
1726 macro. */
1727
1728/* Symtab field as an integer. Used by stabs generator in dbxout.c to
1729 hold the type's number in the generated stabs. */
8f2eb9e1 1730#define TYPE_SYMTAB_ADDRESS(NODE) \
1731 (TYPE_CHECK (NODE)->type_common.symtab.address)
929d2a90 1732
1733/* Symtab field as a string. Used by COFF generator in sdbout.c to
1734 hold struct/union type tag names. */
8f2eb9e1 1735#define TYPE_SYMTAB_POINTER(NODE) \
1736 (TYPE_CHECK (NODE)->type_common.symtab.pointer)
929d2a90 1737
1738/* Symtab field as a pointer to a DWARF DIE. Used by DWARF generator
1739 in dwarf2out.c to point to the DIE generated for the type. */
8f2eb9e1 1740#define TYPE_SYMTAB_DIE(NODE) \
1741 (TYPE_CHECK (NODE)->type_common.symtab.die)
929d2a90 1742
1743/* The garbage collector needs to know the interpretation of the
1744 symtab field. These constants represent the different types in the
1745 union. */
1746
1747#define TYPE_SYMTAB_IS_ADDRESS (0)
1748#define TYPE_SYMTAB_IS_POINTER (1)
1749#define TYPE_SYMTAB_IS_DIE (2)
1750
8f2eb9e1 1751#define TYPE_LANG_SPECIFIC(NODE) \
1752 (TYPE_CHECK (NODE)->type_with_lang_specific.lang_specific)
1753
8f2eb9e1 1754#define TYPE_VALUES(NODE) (ENUMERAL_TYPE_CHECK (NODE)->type_non_common.values)
1755#define TYPE_DOMAIN(NODE) (ARRAY_TYPE_CHECK (NODE)->type_non_common.values)
1756#define TYPE_FIELDS(NODE) \
1757 (RECORD_OR_UNION_CHECK (NODE)->type_non_common.values)
9af5ce0c 1758#define TYPE_CACHED_VALUES(NODE) (TYPE_CHECK (NODE)->type_non_common.values)
8f2eb9e1 1759#define TYPE_ARG_TYPES(NODE) \
1760 (FUNC_OR_METHOD_CHECK (NODE)->type_non_common.values)
9af5ce0c 1761#define TYPE_VALUES_RAW(NODE) (TYPE_CHECK (NODE)->type_non_common.values)
8f2eb9e1 1762
1763#define TYPE_METHODS(NODE) \
1764 (RECORD_OR_UNION_CHECK (NODE)->type_non_common.maxval)
1765#define TYPE_VFIELD(NODE) \
1766 (RECORD_OR_UNION_CHECK (NODE)->type_non_common.minval)
1767#define TYPE_METHOD_BASETYPE(NODE) \
1768 (FUNC_OR_METHOD_CHECK (NODE)->type_non_common.maxval)
1769#define TYPE_OFFSET_BASETYPE(NODE) \
1770 (OFFSET_TYPE_CHECK (NODE)->type_non_common.maxval)
1771#define TYPE_MAXVAL(NODE) (TYPE_CHECK (NODE)->type_non_common.maxval)
1772#define TYPE_MINVAL(NODE) (TYPE_CHECK (NODE)->type_non_common.minval)
1773#define TYPE_NEXT_PTR_TO(NODE) \
1774 (POINTER_TYPE_CHECK (NODE)->type_non_common.minval)
1775#define TYPE_NEXT_REF_TO(NODE) \
1776 (REFERENCE_TYPE_CHECK (NODE)->type_non_common.minval)
1777#define TYPE_MIN_VALUE(NODE) \
1778 (NUMERICAL_TYPE_CHECK (NODE)->type_non_common.minval)
1779#define TYPE_MAX_VALUE(NODE) \
1780 (NUMERICAL_TYPE_CHECK (NODE)->type_non_common.maxval)
1781
1782/* If non-NULL, this is an upper bound of the size (in bytes) of an
1783 object of the given ARRAY_TYPE_NON_COMMON. This allows temporaries to be
1784 allocated. */
1785#define TYPE_ARRAY_MAX_SIZE(ARRAY_TYPE) \
1786 (ARRAY_TYPE_CHECK (ARRAY_TYPE)->type_non_common.maxval)
1787
1788/* For record and union types, information about this type, as a base type
1789 for itself. */
9af5ce0c 1790#define TYPE_BINFO(NODE) (RECORD_OR_UNION_CHECK (NODE)->type_non_common.binfo)
8f2eb9e1 1791
1792/* For non record and union types, used in a language-dependent way. */
1793#define TYPE_LANG_SLOT_1(NODE) \
9af5ce0c 1794 (NOT_RECORD_OR_UNION_CHECK (NODE)->type_non_common.binfo)
8f2eb9e1 1795
d72a838e 1796/* Define accessor macros for information about type inheritance
1797 and basetypes.
1798
1799 A "basetype" means a particular usage of a data type for inheritance
1800 in another type. Each such basetype usage has its own "binfo"
1801 object to describe it. The binfo object is a TREE_VEC node.
1802
1803 Inheritance is represented by the binfo nodes allocated for a
1804 given type. For example, given types C and D, such that D is
1805 inherited by C, 3 binfo nodes will be allocated: one for describing
1806 the binfo properties of C, similarly one for D, and one for
1807 describing the binfo properties of D as a base type for C.
1808 Thus, given a pointer to class C, one can get a pointer to the binfo
1809 of D acting as a basetype for C by looking at C's binfo's basetypes. */
1810
57c28194 1811/* BINFO specific flags. */
1812
1813/* Nonzero means that the derivation chain is via a `virtual' declaration. */
35cc02b5 1814#define BINFO_VIRTUAL_P(NODE) (TREE_BINFO_CHECK (NODE)->base.static_flag)
57c28194 1815
1816/* Flags for language dependent use. */
9af5ce0c 1817#define BINFO_MARKED(NODE) TREE_LANG_FLAG_0 (TREE_BINFO_CHECK (NODE))
1818#define BINFO_FLAG_1(NODE) TREE_LANG_FLAG_1 (TREE_BINFO_CHECK (NODE))
1819#define BINFO_FLAG_2(NODE) TREE_LANG_FLAG_2 (TREE_BINFO_CHECK (NODE))
1820#define BINFO_FLAG_3(NODE) TREE_LANG_FLAG_3 (TREE_BINFO_CHECK (NODE))
1821#define BINFO_FLAG_4(NODE) TREE_LANG_FLAG_4 (TREE_BINFO_CHECK (NODE))
1822#define BINFO_FLAG_5(NODE) TREE_LANG_FLAG_5 (TREE_BINFO_CHECK (NODE))
1823#define BINFO_FLAG_6(NODE) TREE_LANG_FLAG_6 (TREE_BINFO_CHECK (NODE))
57c28194 1824
d72a838e 1825/* The actual data type node being inherited in this basetype. */
9af5ce0c 1826#define BINFO_TYPE(NODE) TREE_TYPE (TREE_BINFO_CHECK (NODE))
d72a838e 1827
1828/* The offset where this basetype appears in its containing type.
1829 BINFO_OFFSET slot holds the offset (in bytes)
1830 from the base of the complete object to the base of the part of the
1831 object that is allocated on behalf of this `type'.
1832 This is always 0 except when there is multiple inheritance. */
6c34d0c2 1833
9af5ce0c 1834#define BINFO_OFFSET(NODE) (TREE_BINFO_CHECK (NODE)->binfo.offset)
d6c9423f 1835#define BINFO_OFFSET_ZEROP(NODE) (integer_zerop (BINFO_OFFSET (NODE)))
d72a838e 1836
1837/* The virtual function table belonging to this basetype. Virtual
1838 function tables provide a mechanism for run-time method dispatching.
1839 The entries of a virtual function table are language-dependent. */
1840
9af5ce0c 1841#define BINFO_VTABLE(NODE) (TREE_BINFO_CHECK (NODE)->binfo.vtable)
d72a838e 1842
1843/* The virtual functions in the virtual function table. This is
1844 a TREE_LIST that is used as an initial approximation for building
1845 a virtual function table for this basetype. */
9af5ce0c 1846#define BINFO_VIRTUALS(NODE) (TREE_BINFO_CHECK (NODE)->binfo.virtuals)
d72a838e 1847
6ed1e0f8 1848/* A vector of binfos for the direct basetypes inherited by this
1849 basetype.
d72a838e 1850
6ed1e0f8 1851 If this basetype describes type D as inherited in C, and if the
1852 basetypes of D are E and F, then this vector contains binfos for
f6cc6a08 1853 inheritance of E and F by C. */
9af5ce0c 1854#define BINFO_BASE_BINFOS(NODE) (&TREE_BINFO_CHECK (NODE)->binfo.base_binfos)
d72a838e 1855
824507ab 1856/* The number of basetypes for NODE. */
f1f41a6c 1857#define BINFO_N_BASE_BINFOS(NODE) (BINFO_BASE_BINFOS (NODE)->length ())
824507ab 1858
2cfde4f3 1859/* Accessor macro to get to the Nth base binfo of this binfo. */
f6cc6a08 1860#define BINFO_BASE_BINFO(NODE,N) \
f1f41a6c 1861 ((*BINFO_BASE_BINFOS (NODE))[(N)])
f6cc6a08 1862#define BINFO_BASE_ITERATE(NODE,N,B) \
f1f41a6c 1863 (BINFO_BASE_BINFOS (NODE)->iterate ((N), &(B)))
f6cc6a08 1864#define BINFO_BASE_APPEND(NODE,T) \
f1f41a6c 1865 (BINFO_BASE_BINFOS (NODE)->quick_push ((T)))
d6c9423f 1866
809d9739 1867/* For a BINFO record describing a virtual base class, i.e., one where
1868 TREE_VIA_VIRTUAL is set, this field assists in locating the virtual
4b922c0c 1869 base. The actual contents are language-dependent. In the C++
1870 front-end this field is an INTEGER_CST giving an offset into the
1871 vtable where the offset to the virtual base can be found. */
9af5ce0c 1872#define BINFO_VPTR_FIELD(NODE) (TREE_BINFO_CHECK (NODE)->binfo.vptr_field)
44882314 1873
95f3173a 1874/* Indicates the accesses this binfo has to its bases. The values are
1875 access_public_node, access_protected_node or access_private_node.
1876 If this array is not present, public access is implied. */
9af5ce0c 1877#define BINFO_BASE_ACCESSES(NODE) \
1878 (TREE_BINFO_CHECK (NODE)->binfo.base_accesses)
db77fe17 1879
1880#define BINFO_BASE_ACCESS(NODE,N) \
f1f41a6c 1881 (*BINFO_BASE_ACCESSES (NODE))[(N)]
db77fe17 1882#define BINFO_BASE_ACCESS_APPEND(NODE,T) \
f1f41a6c 1883 BINFO_BASE_ACCESSES (NODE)->quick_push ((T))
95f3173a 1884
f6cc6a08 1885/* The index in the VTT where this subobject's sub-VTT can be found.
1886 NULL_TREE if there is no sub-VTT. */
9af5ce0c 1887#define BINFO_SUBVTT_INDEX(NODE) (TREE_BINFO_CHECK (NODE)->binfo.vtt_subvtt)
95f3173a 1888
f6cc6a08 1889/* The index in the VTT where the vptr for this subobject can be
1890 found. NULL_TREE if there is no secondary vptr in the VTT. */
9af5ce0c 1891#define BINFO_VPTR_INDEX(NODE) (TREE_BINFO_CHECK (NODE)->binfo.vtt_vptr)
f6cc6a08 1892
2cfde4f3 1893/* The BINFO_INHERITANCE_CHAIN points at the binfo for the base
1894 inheriting this base for non-virtual bases. For virtual bases it
eea75c62 1895 points either to the binfo for which this is a primary binfo, or to
1896 the binfo of the most derived type. */
3cb98335 1897#define BINFO_INHERITANCE_CHAIN(NODE) \
9af5ce0c 1898 (TREE_BINFO_CHECK (NODE)->binfo.inheritance)
3cb98335 1899
f6cc6a08 1900
d72a838e 1901/* Define fields and accessors for nodes representing declared names. */
1902
2f4ec87c 1903/* Nonzero if DECL represents an SSA name or a variable that can possibly
1904 have an associated SSA name. */
437f5d6b 1905#define SSA_VAR_P(DECL) \
1906 (TREE_CODE (DECL) == VAR_DECL \
1907 || TREE_CODE (DECL) == PARM_DECL \
1908 || TREE_CODE (DECL) == RESULT_DECL \
2f4ec87c 1909 || TREE_CODE (DECL) == SSA_NAME)
56ba46a4 1910
56ba46a4 1911
1767a056 1912#define DECL_CHAIN(NODE) (TREE_CHAIN (DECL_MINIMAL_CHECK (NODE)))
7e64c604 1913
5ded8c6f 1914/* This is the name of the object as written by the user.
1915 It is an IDENTIFIER_NODE. */
1916#define DECL_NAME(NODE) (DECL_MINIMAL_CHECK (NODE)->decl_minimal.name)
56ba46a4 1917
48dcce25 1918/* The IDENTIFIER_NODE associated with the TYPE_NAME field. */
1919#define TYPE_IDENTIFIER(NODE) \
1920 (TYPE_NAME (NODE) && DECL_P (TYPE_NAME (NODE)) \
1921 ? DECL_NAME (TYPE_NAME (NODE)) : TYPE_NAME (NODE))
1922
5ded8c6f 1923/* Every ..._DECL node gets a unique number. */
1924#define DECL_UID(NODE) (DECL_MINIMAL_CHECK (NODE)->decl_minimal.uid)
7e64c604 1925
688ff29b 1926/* DEBUG_EXPR_DECLs get negative UID numbers, to catch erroneous
1927 uses. */
1928#define DEBUG_TEMP_UID(NODE) (-DECL_UID (TREE_CHECK ((NODE), DEBUG_EXPR_DECL)))
1929
1a981e1a 1930/* Every ..._DECL node gets a unique number that stays the same even
1931 when the decl is copied by the inliner once it is set. */
eb65426a 1932#define DECL_PT_UID(NODE) \
1933 (DECL_COMMON_CHECK (NODE)->decl_common.pt_uid == -1u \
1934 ? (NODE)->decl_minimal.uid : (NODE)->decl_common.pt_uid)
1a981e1a 1935/* Initialize the ..._DECL node pt-uid to the decls uid. */
eb65426a 1936#define SET_DECL_PT_UID(NODE, UID) \
1937 (DECL_COMMON_CHECK (NODE)->decl_common.pt_uid = (UID))
1a981e1a 1938/* Whether the ..._DECL node pt-uid has been initialized and thus needs to
1939 be preserved when copyin the decl. */
eb65426a 1940#define DECL_PT_UID_SET_P(NODE) \
1941 (DECL_COMMON_CHECK (NODE)->decl_common.pt_uid != -1u)
1a981e1a 1942
5ded8c6f 1943/* These two fields describe where in the source code the declaration
1944 was. If the declaration appears in several places (as for a C
1945 function that is declared first and then defined later), this
1946 information should refer to the definition. */
eb65426a 1947#define DECL_SOURCE_LOCATION(NODE) \
1948 (DECL_MINIMAL_CHECK (NODE)->decl_minimal.locus)
5ded8c6f 1949#define DECL_SOURCE_FILE(NODE) LOCATION_FILE (DECL_SOURCE_LOCATION (NODE))
1950#define DECL_SOURCE_LINE(NODE) LOCATION_LINE (DECL_SOURCE_LOCATION (NODE))
cff9d209 1951#define DECL_SOURCE_COLUMN(NODE) LOCATION_COLUMN (DECL_SOURCE_LOCATION (NODE))
2f90489d 1952/* This accessor returns TRUE if the decl it operates on was created
1953 by a front-end or back-end rather than by user code. In this case
1954 builtin-ness is indicated by source location. */
5ded8c6f 1955#define DECL_IS_BUILTIN(DECL) \
567510a2 1956 (LOCATION_LOCUS (DECL_SOURCE_LOCATION (DECL)) <= BUILTINS_LOCATION)
56ba46a4 1957
40109983 1958/* For FIELD_DECLs, this is the RECORD_TYPE, UNION_TYPE, or
1959 QUAL_UNION_TYPE node that the field is a member of. For VAR_DECL,
34e5cced 1960 PARM_DECL, FUNCTION_DECL, LABEL_DECL, RESULT_DECL, and CONST_DECL
1961 nodes, this points to either the FUNCTION_DECL for the containing
1962 function, the RECORD_TYPE or UNION_TYPE for the containing type, or
40109983 1963 NULL_TREE or a TRANSLATION_UNIT_DECL if the given decl has "file
22bf03ad 1964 scope". In particular, for VAR_DECLs which are virtual table pointers
1965 (they have DECL_VIRTUAL set), we use DECL_CONTEXT to determine the type
1966 they belong to. */
5ded8c6f 1967#define DECL_CONTEXT(NODE) (DECL_MINIMAL_CHECK (NODE)->decl_minimal.context)
eb65426a 1968#define DECL_FIELD_CONTEXT(NODE) \
1969 (FIELD_DECL_CHECK (NODE)->decl_minimal.context)
84bfaaeb 1970
1971/* If nonzero, decl's name shouldn't be emitted into debug info. */
87d8f7b6 1972#define DECL_NAMELESS(NODE) (DECL_MINIMAL_CHECK (NODE)->base.u.bits.nameless_flag)
84bfaaeb 1973
5ded8c6f 1974/* For any sort of a ..._DECL node, this points to the original (abstract)
16e43d96 1975 decl node which this decl is an inlined/cloned instance of, or else it
1976 is NULL indicating that this decl is not an instance of some other decl.
1977
1978 The C front-end also uses this in a nested declaration of an inline
1979 function, to point back to the definition. */
eb65426a 1980#define DECL_ABSTRACT_ORIGIN(NODE) \
1981 (DECL_COMMON_CHECK (NODE)->decl_common.abstract_origin)
5ded8c6f 1982
1983/* Like DECL_ABSTRACT_ORIGIN, but returns NODE if there's no abstract
1984 origin. This is useful when setting the DECL_ABSTRACT_ORIGIN. */
1985#define DECL_ORIGIN(NODE) \
1986 (DECL_ABSTRACT_ORIGIN (NODE) ? DECL_ABSTRACT_ORIGIN (NODE) : (NODE))
1987
1988/* Nonzero for any sort of ..._DECL node means this decl node represents an
1989 inline instance of some original (abstract) decl from an inline function;
1990 suppress any warnings about shadowing some other variable. FUNCTION_DECL
1991 nodes can also have their abstract origin set to themselves. */
eb65426a 1992#define DECL_FROM_INLINE(NODE) \
1993 (DECL_ABSTRACT_ORIGIN (NODE) != NULL_TREE \
1994 && DECL_ABSTRACT_ORIGIN (NODE) != (NODE))
5ded8c6f 1995
e3c541f0 1996/* In a DECL this is the field where attributes are stored. */
eb65426a 1997#define DECL_ATTRIBUTES(NODE) \
1998 (DECL_COMMON_CHECK (NODE)->decl_common.attributes)
5ded8c6f 1999
d72a838e 2000/* For a FUNCTION_DECL, holds the tree of BINDINGs.
40109983 2001 For a TRANSLATION_UNIT_DECL, holds the namespace's BLOCK.
d72a838e 2002 For a VAR_DECL, holds the initial value.
4682b6fe 2003 For a PARM_DECL, used for DECL_ARG_TYPE--default
d72a838e 2004 values for parameters are encoded in the type of the function,
66d12a6c 2005 not in the PARM_DECL slot.
5ded8c6f 2006 For a FIELD_DECL, this is used for enumeration values and the C
7bd4091f 2007 frontend uses it for temporarily storing bitwidth of bitfields.
66d12a6c 2008
2009 ??? Need to figure out some way to check this isn't a PARM_DECL. */
5ded8c6f 2010#define DECL_INITIAL(NODE) (DECL_COMMON_CHECK (NODE)->decl_common.initial)
2011
b278476e 2012/* Holds the size of the datum, in bits, as a tree expression.
d72a838e 2013 Need not be constant. */
5ded8c6f 2014#define DECL_SIZE(NODE) (DECL_COMMON_CHECK (NODE)->decl_common.size)
b278476e 2015/* Likewise for the size in bytes. */
5ded8c6f 2016#define DECL_SIZE_UNIT(NODE) (DECL_COMMON_CHECK (NODE)->decl_common.size_unit)
c6713de4 2017/* Holds the alignment required for the datum, in bits. */
097b5c8b 2018#define DECL_ALIGN(NODE) (DECL_COMMON_CHECK (NODE)->decl_common.align)
c6713de4 2019/* The alignment of NODE, in bytes. */
2020#define DECL_ALIGN_UNIT(NODE) (DECL_ALIGN (NODE) / BITS_PER_UNIT)
6c96b31e 2021/* Set if the alignment of this DECL has been set by the user, for
2022 example with an 'aligned' attribute. */
eb65426a 2023#define DECL_USER_ALIGN(NODE) \
87d8f7b6 2024 (DECL_COMMON_CHECK (NODE)->base.u.bits.user_align)
8fd3ce0b 2025/* Holds the machine mode corresponding to the declaration of a variable or
2026 field. Always equal to TYPE_MODE (TREE_TYPE (decl)) except for a
2027 FIELD_DECL. */
5ded8c6f 2028#define DECL_MODE(NODE) (DECL_COMMON_CHECK (NODE)->decl_common.mode)
56ba46a4 2029
fc0cc704 2030/* For FUNCTION_DECL, if it is built-in, this identifies which built-in
2031 operation it is. Note, however, that this field is overloaded, with
2032 DECL_BUILT_IN_CLASS as the discriminant, so the latter must always be
2033 checked before any access to the former. */
097b5c8b 2034#define DECL_FUNCTION_CODE(NODE) \
2035 (FUNCTION_DECL_CHECK (NODE)->function_decl.function_code)
d72a838e 2036
58d82cd0 2037#define DECL_FUNCTION_PERSONALITY(NODE) \
2038 (FUNCTION_DECL_CHECK (NODE)->function_decl.personality)
2039
5d4990a0 2040/* Nonzero for a given ..._DECL node means that the name of this node should
28fa603b 2041 be ignored for symbolic debug purposes. For a TYPE_DECL, this means that
2042 the associated type should be ignored. For a FUNCTION_DECL, the body of
2043 the function should also be ignored. */
eb65426a 2044#define DECL_IGNORED_P(NODE) \
2045 (DECL_COMMON_CHECK (NODE)->decl_common.ignored_flag)
d72a838e 2046
f7a75810 2047/* Nonzero for a given ..._DECL node means that this node represents an
2048 "abstract instance" of the given declaration (e.g. in the original
2049 declaration of an inline function). When generating symbolic debugging
c3418f42 2050 information, we mustn't try to generate any address information for nodes
f7a75810 2051 marked as "abstract instances" because we don't actually generate
2052 any code or allocate any data space for such instances. */
eb65426a 2053#define DECL_ABSTRACT(NODE) \
2054 (DECL_COMMON_CHECK (NODE)->decl_common.abstract_flag)
f7a772a7 2055
9ed1ded5 2056/* Language-specific decl information. */
eb65426a 2057#define DECL_LANG_SPECIFIC(NODE) \
2058 (DECL_COMMON_CHECK (NODE)->decl_common.lang_specific)
d72a838e 2059
5ded8c6f 2060/* In a VAR_DECL or FUNCTION_DECL, nonzero means external reference:
65661e93 2061 do not allocate storage, and refer to a definition elsewhere. Note that
2062 this does not necessarily imply the entity represented by NODE
2063 has no program source-level definition in this translation unit. For
2064 example, for a FUNCTION_DECL, DECL_SAVED_TREE may be non-NULL and
2065 DECL_EXTERNAL may be true simultaneously; that can be the case for
2066 a C99 "extern inline" function. */
33a0b99d 2067#define DECL_EXTERNAL(NODE) (DECL_COMMON_CHECK (NODE)->decl_common.decl_flag_1)
d72a838e 2068
d72a838e 2069/* Nonzero in a ..._DECL means this variable is ref'd from a nested function.
2070 For VAR_DECL nodes, PARM_DECL nodes, and FUNCTION_DECL nodes.
2071
2072 For LABEL_DECL nodes, nonzero if nonlocal gotos to the label are permitted.
2073
2074 Also set in some languages for variables, etc., outside the normal
2075 lexical scope, such as class instance variables. */
eb65426a 2076#define DECL_NONLOCAL(NODE) \
2077 (DECL_COMMON_CHECK (NODE)->decl_common.nonlocal_flag)
d72a838e 2078
5ded8c6f 2079/* Used in VAR_DECLs to indicate that the variable is a vtable.
2080 Used in FIELD_DECLs for vtable pointers.
2081 Used in FUNCTION_DECLs to indicate that the function is virtual. */
eb65426a 2082#define DECL_VIRTUAL_P(NODE) \
2083 (DECL_COMMON_CHECK (NODE)->decl_common.virtual_flag)
d72a838e 2084
5ded8c6f 2085/* Used to indicate that this DECL represents a compiler-generated entity. */
eb65426a 2086#define DECL_ARTIFICIAL(NODE) \
2087 (DECL_COMMON_CHECK (NODE)->decl_common.artificial_flag)
e2b04249 2088
5ded8c6f 2089/* Additional flags for language-specific uses. */
eb65426a 2090#define DECL_LANG_FLAG_0(NODE) \
2091 (DECL_COMMON_CHECK (NODE)->decl_common.lang_flag_0)
2092#define DECL_LANG_FLAG_1(NODE) \
2093 (DECL_COMMON_CHECK (NODE)->decl_common.lang_flag_1)
2094#define DECL_LANG_FLAG_2(NODE) \
2095 (DECL_COMMON_CHECK (NODE)->decl_common.lang_flag_2)
2096#define DECL_LANG_FLAG_3(NODE) \
2097 (DECL_COMMON_CHECK (NODE)->decl_common.lang_flag_3)
2098#define DECL_LANG_FLAG_4(NODE) \
2099 (DECL_COMMON_CHECK (NODE)->decl_common.lang_flag_4)
2100#define DECL_LANG_FLAG_5(NODE) \
2101 (DECL_COMMON_CHECK (NODE)->decl_common.lang_flag_5)
2102#define DECL_LANG_FLAG_6(NODE) \
2103 (DECL_COMMON_CHECK (NODE)->decl_common.lang_flag_6)
2104#define DECL_LANG_FLAG_7(NODE) \
2105 (DECL_COMMON_CHECK (NODE)->decl_common.lang_flag_7)
2106#define DECL_LANG_FLAG_8(NODE) \
2107 (DECL_COMMON_CHECK (NODE)->decl_common.lang_flag_8)
60f65a0a 2108
2108f7c0 2109/* Nonzero for a scope which is equal to file scope. */
2110#define SCOPE_FILE_SCOPE_P(EXP) \
2111 (! (EXP) || TREE_CODE (EXP) == TRANSLATION_UNIT_DECL)
5ded8c6f 2112/* Nonzero for a decl which is at file scope. */
2108f7c0 2113#define DECL_FILE_SCOPE_P(EXP) SCOPE_FILE_SCOPE_P (DECL_CONTEXT (EXP))
2114/* Nonzero for a type which is at file scope. */
2115#define TYPE_FILE_SCOPE_P(EXP) SCOPE_FILE_SCOPE_P (TYPE_CONTEXT (EXP))
b212f378 2116
5ded8c6f 2117/* Nonzero for a decl that is decorated using attribute used.
b636e057 2118 This indicates to compiler tools that this decl needs to be preserved. */
5ded8c6f 2119#define DECL_PRESERVE_P(DECL) \
2120 DECL_COMMON_CHECK (DECL)->decl_common.preserve_flag
7bd4091f 2121
8ea8de24 2122/* For function local variables of COMPLEX and VECTOR types,
2123 indicates that the variable is not aliased, and that all
2124 modifications to the variable have been adjusted so that
2125 they are killing assignments. Thus the variable may now
2126 be treated as a GIMPLE register, and use real instead of
2127 virtual ops in SSA form. */
2128#define DECL_GIMPLE_REG_P(DECL) \
5ded8c6f 2129 DECL_COMMON_CHECK (DECL)->decl_common.gimple_reg_flag
8f80e66d 2130
75fa4f82 2131extern tree decl_value_expr_lookup (tree);
2132extern void decl_value_expr_insert (tree, tree);
2133
afcf285e 2134/* In a VAR_DECL or PARM_DECL, the location at which the value may be found,
2135 if transformations have made this more complicated than evaluating the
2136 decl itself. This should only be used for debugging; once this field has
2137 been set, the decl itself may not legitimately appear in the function. */
75fa4f82 2138#define DECL_HAS_VALUE_EXPR_P(NODE) \
4d5b4e6a 2139 (TREE_CHECK3 (NODE, VAR_DECL, PARM_DECL, RESULT_DECL) \
2140 ->decl_common.decl_flag_2)
afcf285e 2141#define DECL_VALUE_EXPR(NODE) \
7bd4091f 2142 (decl_value_expr_lookup (DECL_WRTL_CHECK (NODE)))
eb65426a 2143#define SET_DECL_VALUE_EXPR(NODE, VAL) \
5ded8c6f 2144 (decl_value_expr_insert (DECL_WRTL_CHECK (NODE), VAL))
afcf285e 2145
5ded8c6f 2146/* Holds the RTL expression for the value of a variable or function.
2147 This value can be evaluated lazily for functions, variables with
2148 static storage duration, and labels. */
2149#define DECL_RTL(NODE) \
2150 (DECL_WRTL_CHECK (NODE)->decl_with_rtl.rtl \
2151 ? (NODE)->decl_with_rtl.rtl \
2152 : (make_decl_rtl (NODE), (NODE)->decl_with_rtl.rtl))
7259f3f8 2153
5ded8c6f 2154/* Set the DECL_RTL for NODE to RTL. */
2155#define SET_DECL_RTL(NODE, RTL) set_decl_rtl (NODE, RTL)
26d1c5ff 2156
5ded8c6f 2157/* Returns nonzero if NODE is a tree node that can contain RTL. */
2158#define HAS_RTL_P(NODE) (CODE_CONTAINS_STRUCT (TREE_CODE (NODE), TS_DECL_WRTL))
2159
2160/* Returns nonzero if the DECL_RTL for NODE has already been set. */
eb65426a 2161#define DECL_RTL_SET_P(NODE) \
2162 (HAS_RTL_P (NODE) && DECL_WRTL_CHECK (NODE)->decl_with_rtl.rtl != NULL)
5ded8c6f 2163
2164/* Copy the RTL from NODE1 to NODE2. If the RTL was not set for
2165 NODE1, it will not be set for NODE2; this is a lazy copy. */
2166#define COPY_DECL_RTL(NODE1, NODE2) \
eb65426a 2167 (DECL_WRTL_CHECK (NODE2)->decl_with_rtl.rtl \
2168 = DECL_WRTL_CHECK (NODE1)->decl_with_rtl.rtl)
5ded8c6f 2169
2170/* The DECL_RTL for NODE, if it is set, or NULL, if it is not set. */
2171#define DECL_RTL_IF_SET(NODE) (DECL_RTL_SET_P (NODE) ? DECL_RTL (NODE) : NULL)
2172
72fdb379 2173#if (GCC_VERSION >= 2007)
2174#define DECL_RTL_KNOWN_SET(decl) __extension__ \
2175({ tree const __d = (decl); \
2176 gcc_checking_assert (DECL_RTL_SET_P (__d)); \
2177 /* Dereference it so the compiler knows it can't be NULL even \
2178 without assertion checking. */ \
2179 &*DECL_RTL_IF_SET (__d); })
2180#else
2181#define DECL_RTL_KNOWN_SET(decl) (&*DECL_RTL_IF_SET (decl))
2182#endif
2183
5ded8c6f 2184/* In VAR_DECL and PARM_DECL nodes, nonzero means declared `register'. */
2185#define DECL_REGISTER(NODE) (DECL_WRTL_CHECK (NODE)->decl_common.decl_flag_0)
2186
5ded8c6f 2187/* In a FIELD_DECL, this is the field position, counting in bytes, of the
9f35f9b2 2188 DECL_OFFSET_ALIGN-bit-sized word containing the bit closest to the beginning
2189 of the structure. */
5ded8c6f 2190#define DECL_FIELD_OFFSET(NODE) (FIELD_DECL_CHECK (NODE)->field_decl.offset)
2191
2192/* In a FIELD_DECL, this is the offset, in bits, of the first bit of the
9f35f9b2 2193 field from DECL_FIELD_OFFSET. This field may be nonzero even for fields
2194 that are not bit fields (since DECL_OFFSET_ALIGN may be larger than the
2195 natural alignment of the field's type). */
eb65426a 2196#define DECL_FIELD_BIT_OFFSET(NODE) \
2197 (FIELD_DECL_CHECK (NODE)->field_decl.bit_offset)
5ded8c6f 2198
2199/* In a FIELD_DECL, this indicates whether the field was a bit-field and
2200 if so, the type that was originally specified for it.
2201 TREE_TYPE may have been modified (in finish_struct). */
eb65426a 2202#define DECL_BIT_FIELD_TYPE(NODE) \
2203 (FIELD_DECL_CHECK (NODE)->field_decl.bit_field_type)
5ded8c6f 2204
8d8a34f9 2205/* In a FIELD_DECL of a RECORD_TYPE, this is a pointer to the storage
2206 representative FIELD_DECL. */
2207#define DECL_BIT_FIELD_REPRESENTATIVE(NODE) \
2208 (FIELD_DECL_CHECK (NODE)->field_decl.qualifier)
2209
5ded8c6f 2210/* For a FIELD_DECL in a QUAL_UNION_TYPE, records the expression, which
2211 if nonzero, indicates that the field occupies the type. */
2212#define DECL_QUALIFIER(NODE) (FIELD_DECL_CHECK (NODE)->field_decl.qualifier)
2213
2214/* For FIELD_DECLs, off_align holds the number of low-order bits of
2215 DECL_FIELD_OFFSET which are known to be always zero.
2216 DECL_OFFSET_ALIGN thus returns the alignment that DECL_FIELD_OFFSET
2217 has. */
2218#define DECL_OFFSET_ALIGN(NODE) \
097b5c8b 2219 (((unsigned HOST_WIDE_INT)1) << FIELD_DECL_CHECK (NODE)->decl_common.off_align)
5ded8c6f 2220
2221/* Specify that DECL_ALIGN(NODE) is a multiple of X. */
2222#define SET_DECL_OFFSET_ALIGN(NODE, X) \
7e8d812e 2223 (FIELD_DECL_CHECK (NODE)->decl_common.off_align = ffs_hwi (X) - 1)
5ded8c6f 2224
2225/* For FIELD_DECLS, DECL_FCONTEXT is the *first* baseclass in
2226 which this FIELD_DECL is defined. This information is needed when
2227 writing debugging information about vfield and vbase decls for C++. */
2228#define DECL_FCONTEXT(NODE) (FIELD_DECL_CHECK (NODE)->field_decl.fcontext)
2229
2230/* In a FIELD_DECL, indicates this field should be bit-packed. */
87d8f7b6 2231#define DECL_PACKED(NODE) (FIELD_DECL_CHECK (NODE)->base.u.bits.packed_flag)
26dfc457 2232
d72a838e 2233/* Nonzero in a FIELD_DECL means it is a bit field, and must be accessed
2234 specially. */
33a0b99d 2235#define DECL_BIT_FIELD(NODE) (FIELD_DECL_CHECK (NODE)->decl_common.decl_flag_1)
56ba46a4 2236
5ded8c6f 2237/* Used in a FIELD_DECL to indicate that we cannot form the address of
c67bf066 2238 this component. This makes it possible for Type-Based Alias Analysis
2239 to disambiguate accesses to this field with indirect accesses using
2240 the field's type:
2241
2242 struct S { int i; } s;
2243 int *p;
2244
2245 If the flag is set on 'i', TBAA computes that s.i and *p never conflict.
2246
2247 From the implementation's viewpoint, the alias set of the type of the
2248 field 'i' (int) will not be recorded as a subset of that of the type of
2249 's' (struct S) in record_component_aliases. The counterpart is that
2250 accesses to s.i must not be given the alias set of the type of 'i'
2251 (int) but instead directly that of the type of 's' (struct S). */
5ded8c6f 2252#define DECL_NONADDRESSABLE_P(NODE) \
33a0b99d 2253 (FIELD_DECL_CHECK (NODE)->decl_common.decl_flag_2)
8305149e 2254
5ded8c6f 2255/* A numeric unique identifier for a LABEL_DECL. The UID allocation is
2256 dense, unique within any one function, and may be used to index arrays.
2257 If the value is -1, then no UID has been assigned. */
2258#define LABEL_DECL_UID(NODE) \
313b1a2e 2259 (LABEL_DECL_CHECK (NODE)->label_decl.label_decl_uid)
56ba46a4 2260
e38def9c 2261/* In a LABEL_DECL, the EH region number for which the label is the
2262 post_landing_pad. */
2263#define EH_LANDING_PAD_NR(NODE) \
2264 (LABEL_DECL_CHECK (NODE)->label_decl.eh_landing_pad_nr)
2265
5ded8c6f 2266/* For a PARM_DECL, records the data type used to pass the argument,
2267 which may be different from the type seen in the program. */
2268#define DECL_ARG_TYPE(NODE) (PARM_DECL_CHECK (NODE)->decl_common.initial)
2269
2270/* For PARM_DECL, holds an RTL for the stack slot or register
2271 where the data was actually passed. */
eb65426a 2272#define DECL_INCOMING_RTL(NODE) \
2273 (PARM_DECL_CHECK (NODE)->parm_decl.incoming_rtl)
2682e5d6 2274
5ded8c6f 2275/* Nonzero for a given ..._DECL node means that no warnings should be
2276 generated just because this node is unused. */
2277#define DECL_IN_SYSTEM_HEADER(NODE) \
bdbc474b 2278 (in_system_header_at (DECL_SOURCE_LOCATION (NODE)))
5ded8c6f 2279
eb65426a 2280/* Used to indicate that the linkage status of this DECL is not yet known,
2281 so it should not be output now. */
2282#define DECL_DEFER_OUTPUT(NODE) \
2283 (DECL_WITH_VIS_CHECK (NODE)->decl_with_vis.defer_output)
2284
2285/* In a VAR_DECL that's static,
2286 nonzero if the space is in the text section. */
2287#define DECL_IN_TEXT_SECTION(NODE) \
2288 (VAR_DECL_CHECK (NODE)->decl_with_vis.in_text_section)
2289
ecba073f 2290/* In a VAR_DECL that's static,
2291 nonzero if it belongs to the global constant pool. */
2292#define DECL_IN_CONSTANT_POOL(NODE) \
2293 (VAR_DECL_CHECK (NODE)->decl_with_vis.in_constant_pool)
2294
eb65426a 2295/* Nonzero for a given ..._DECL node means that this node should be
2296 put in .common, if possible. If a DECL_INITIAL is given, and it
2297 is not error_mark_node, then the decl cannot be put in .common. */
2298#define DECL_COMMON(NODE) \
2299 (DECL_WITH_VIS_CHECK (NODE)->decl_with_vis.common_flag)
2300
2301/* In a VAR_DECL, nonzero if the decl is a register variable with
2302 an explicit asm specification. */
2303#define DECL_HARD_REGISTER(NODE) \
2304 (VAR_DECL_CHECK (NODE)->decl_with_vis.hard_register)
2305
5ded8c6f 2306 /* Used to indicate that this DECL has weak linkage. */
2307#define DECL_WEAK(NODE) (DECL_WITH_VIS_CHECK (NODE)->decl_with_vis.weak_flag)
2308
6c1e551f 2309/* Used to indicate that the DECL is a dllimport. */
eb65426a 2310#define DECL_DLLIMPORT_P(NODE) \
2311 (DECL_WITH_VIS_CHECK (NODE)->decl_with_vis.dllimport_flag)
9a0ce7db 2312
d1d06be2 2313/* Used in a DECL to indicate that, even if it TREE_PUBLIC, it need
2314 not be put out unless it is needed in this translation unit.
2315 Entities like this are shared across translation units (like weak
2316 entities), but are guaranteed to be generated by any translation
2317 unit that needs them, and therefore need not be put out anywhere
2318 where they are not needed. DECL_COMDAT is just a hint to the
2319 back-end; it is up to front-ends which set this flag to ensure
2320 that there will never be any harm, other than bloat, in putting out
2321 something which is DECL_COMDAT. */
eb65426a 2322#define DECL_COMDAT(NODE) \
2323 (DECL_WITH_VIS_CHECK (NODE)->decl_with_vis.comdat_flag)
d1d06be2 2324
eb65426a 2325#define DECL_COMDAT_GROUP(NODE) \
8c016392 2326 decl_comdat_group (NODE)
eb65426a 2327
2328/* Used in TREE_PUBLIC decls to indicate that copies of this DECL in
2329 multiple translation units should be merged. */
b395f451 2330#define DECL_ONE_ONLY(NODE) (DECL_COMDAT_GROUP (NODE) != NULL_TREE \
2331 && (TREE_PUBLIC (NODE) || DECL_EXTERNAL (NODE)))
ecd88073 2332
5ded8c6f 2333/* The name of the object as the assembler will see it (but before any
2334 translations made by ASM_OUTPUT_LABELREF). Often this is the same
2335 as DECL_NAME. It is an IDENTIFIER_NODE. */
2336#define DECL_ASSEMBLER_NAME(NODE) decl_assembler_name (NODE)
abd28cef 2337
7bd4091f 2338/* Return true if NODE is a NODE that can contain a DECL_ASSEMBLER_NAME.
5ded8c6f 2339 This is true of all DECL nodes except FIELD_DECL. */
2340#define HAS_DECL_ASSEMBLER_NAME_P(NODE) \
2341 (CODE_CONTAINS_STRUCT (TREE_CODE (NODE), TS_DECL_WITH_VIS))
8f8ac140 2342
5ded8c6f 2343/* Returns nonzero if the DECL_ASSEMBLER_NAME for NODE has been set. If zero,
2344 the NODE might still have a DECL_ASSEMBLER_NAME -- it just hasn't been set
2345 yet. */
2346#define DECL_ASSEMBLER_NAME_SET_P(NODE) \
eb65426a 2347 (HAS_DECL_ASSEMBLER_NAME_P (NODE) \
2348 && DECL_WITH_VIS_CHECK (NODE)->decl_with_vis.assembler_name != NULL_TREE)
d72a838e 2349
5ded8c6f 2350/* Set the DECL_ASSEMBLER_NAME for NODE to NAME. */
2351#define SET_DECL_ASSEMBLER_NAME(NODE, NAME) \
2352 (DECL_WITH_VIS_CHECK (NODE)->decl_with_vis.assembler_name = (NAME))
c6f5e832 2353
5ded8c6f 2354/* Copy the DECL_ASSEMBLER_NAME from DECL1 to DECL2. Note that if DECL1's
2355 DECL_ASSEMBLER_NAME has not yet been set, using this macro will not cause
2356 the DECL_ASSEMBLER_NAME of either DECL to be set. In other words, the
2357 semantics of using this macro, are different than saying:
851dfbff 2358
5ded8c6f 2359 SET_DECL_ASSEMBLER_NAME(DECL2, DECL_ASSEMBLER_NAME (DECL1))
a5b1863e 2360
5ded8c6f 2361 which will try to set the DECL_ASSEMBLER_NAME for DECL1. */
4ee9c684 2362
5ded8c6f 2363#define COPY_DECL_ASSEMBLER_NAME(DECL1, DECL2) \
2364 (DECL_ASSEMBLER_NAME_SET_P (DECL1) \
2365 ? (void) SET_DECL_ASSEMBLER_NAME (DECL2, \
2366 DECL_ASSEMBLER_NAME (DECL1)) \
2367 : (void) 0)
4ee9c684 2368
5ded8c6f 2369/* Records the section name in a section attribute. Used to pass
2370 the name from decl_attributes to make_function_rtl and make_decl_rtl. */
eb65426a 2371#define DECL_SECTION_NAME(NODE) \
2372 (DECL_WITH_VIS_CHECK (NODE)->decl_with_vis.section_name)
2373
2374/* Nonzero in a decl means that the gimplifier has seen (or placed)
2375 this variable in a BIND_EXPR. */
2376#define DECL_SEEN_IN_BIND_EXPR_P(NODE) \
2377 (DECL_WITH_VIS_CHECK (NODE)->decl_with_vis.seen_in_bind_expr)
a5b1863e 2378
5ded8c6f 2379/* Value of the decls's visibility attribute */
eb65426a 2380#define DECL_VISIBILITY(NODE) \
2381 (DECL_WITH_VIS_CHECK (NODE)->decl_with_vis.visibility)
5ded8c6f 2382
2383/* Nonzero means that the decl had its visibility specified rather than
2384 being inferred. */
eb65426a 2385#define DECL_VISIBILITY_SPECIFIED(NODE) \
2386 (DECL_WITH_VIS_CHECK (NODE)->decl_with_vis.visibility_specified)
5ded8c6f 2387
eb65426a 2388/* In a VAR_DECL, the model to use if the data should be allocated from
2389 thread-local storage. */
2390#define DECL_TLS_MODEL(NODE) (VAR_DECL_CHECK (NODE)->decl_with_vis.tls_model)
2391
2392/* In a VAR_DECL, nonzero if the data should be allocated from
2393 thread-local storage. */
2394#define DECL_THREAD_LOCAL_P(NODE) \
2395 (VAR_DECL_CHECK (NODE)->decl_with_vis.tls_model >= TLS_MODEL_REAL)
2396
2397/* In a non-local VAR_DECL with static storage duration, true if the
2398 variable has an initialization priority. If false, the variable
2399 will be initialized at the DEFAULT_INIT_PRIORITY. */
2400#define DECL_HAS_INIT_PRIORITY_P(NODE) \
2401 (VAR_DECL_CHECK (NODE)->decl_with_vis.init_priority_p)
5ded8c6f 2402
3b73548b 2403/* Specify whether the section name was set by user or by
2404 compiler via -ffunction-sections. */
2405#define DECL_HAS_IMPLICIT_SECTION_NAME_P(NODE) \
2406 (DECL_WITH_VIS_CHECK (NODE)->decl_with_vis.implicit_section_name_p)
2407
5ded8c6f 2408extern tree decl_debug_expr_lookup (tree);
2409extern void decl_debug_expr_insert (tree, tree);
96423453 2410
8e966116 2411/* For VAR_DECL, this is set to an expression that it was split from. */
2412#define DECL_HAS_DEBUG_EXPR_P(NODE) \
2413 (VAR_DECL_CHECK (NODE)->decl_common.debug_expr_is_from)
5ded8c6f 2414#define DECL_DEBUG_EXPR(NODE) \
2415 (decl_debug_expr_lookup (VAR_DECL_CHECK (NODE)))
2416
2417#define SET_DECL_DEBUG_EXPR(NODE, VAL) \
2418 (decl_debug_expr_insert (VAR_DECL_CHECK (NODE), VAL))
2419
9af7fd5b 2420extern priority_type decl_init_priority_lookup (tree);
2421extern priority_type decl_fini_priority_lookup (tree);
2422extern void decl_init_priority_insert (tree, priority_type);
2423extern void decl_fini_priority_insert (tree, priority_type);
5ded8c6f 2424
2c56f72e 2425/* For a VAR_DECL or FUNCTION_DECL the initialization priority of
48e1416a 2426 NODE. */
5ded8c6f 2427#define DECL_INIT_PRIORITY(NODE) \
9af7fd5b 2428 (decl_init_priority_lookup (NODE))
2429/* Set the initialization priority for NODE to VAL. */
5ded8c6f 2430#define SET_DECL_INIT_PRIORITY(NODE, VAL) \
9af7fd5b 2431 (decl_init_priority_insert (NODE, VAL))
2432
2c56f72e 2433/* For a FUNCTION_DECL the finalization priority of NODE. */
9af7fd5b 2434#define DECL_FINI_PRIORITY(NODE) \
2435 (decl_fini_priority_lookup (NODE))
2436/* Set the finalization priority for NODE to VAL. */
2437#define SET_DECL_FINI_PRIORITY(NODE, VAL) \
2438 (decl_fini_priority_insert (NODE, VAL))
2439
2440/* The initialization priority for entities for which no explicit
2441 initialization priority has been specified. */
2442#define DEFAULT_INIT_PRIORITY 65535
2443
2444/* The maximum allowed initialization priority. */
2445#define MAX_INIT_PRIORITY 65535
2446
2447/* The largest priority value reserved for use by system runtime
2448 libraries. */
2449#define MAX_RESERVED_INIT_PRIORITY 100
5ded8c6f 2450
05c14132 2451/* In a VAR_DECL, nonzero if this is a global variable for VOPs. */
5084b2e4 2452#define VAR_DECL_IS_VIRTUAL_OPERAND(NODE) \
87d8f7b6 2453 (VAR_DECL_CHECK (NODE)->base.u.bits.saturating_flag)
5084b2e4 2454
05c14132 2455/* In a VAR_DECL, nonzero if this is a non-local frame structure. */
2456#define DECL_NONLOCAL_FRAME(NODE) \
2457 (VAR_DECL_CHECK (NODE)->base.default_def_flag)
2458
e7e44439 2459/* In a VAR_DECL, nonzero if this variable is not aliased by any pointer. */
2460#define DECL_NONALIASED(NODE) \
2461 (VAR_DECL_CHECK (NODE)->base.nothrow_flag)
2462
5ded8c6f 2463/* This field is used to reference anything in decl.result and is meant only
2464 for use by the garbage collector. */
eb65426a 2465#define DECL_RESULT_FLD(NODE) \
2466 (DECL_NON_COMMON_CHECK (NODE)->decl_non_common.result)
5ded8c6f 2467
2468/* The DECL_VINDEX is used for FUNCTION_DECLS in two different ways.
2469 Before the struct containing the FUNCTION_DECL is laid out,
2470 DECL_VINDEX may point to a FUNCTION_DECL in a base class which
2471 is the FUNCTION_DECL which this FUNCTION_DECL will replace as a virtual
2472 function. When the class is laid out, this pointer is changed
2473 to an INTEGER_CST node which is suitable for use as an index
7bd4091f 2474 into the virtual function table.
5ded8c6f 2475 C++ also uses this field in namespaces, hence the DECL_NON_COMMON_CHECK. */
eb65426a 2476#define DECL_VINDEX(NODE) \
2477 (DECL_NON_COMMON_CHECK (NODE)->decl_non_common.vindex)
5ded8c6f 2478
5ded8c6f 2479/* In FUNCTION_DECL, holds the decl for the return value. */
2480#define DECL_RESULT(NODE) (FUNCTION_DECL_CHECK (NODE)->decl_non_common.result)
2481
2482/* In a FUNCTION_DECL, nonzero if the function cannot be inlined. */
eb65426a 2483#define DECL_UNINLINABLE(NODE) \
2484 (FUNCTION_DECL_CHECK (NODE)->function_decl.uninlinable)
5ded8c6f 2485
2486/* In a FUNCTION_DECL, the saved representation of the body of the
2487 entire function. */
eb65426a 2488#define DECL_SAVED_TREE(NODE) \
2489 (FUNCTION_DECL_CHECK (NODE)->decl_non_common.saved_tree)
5ded8c6f 2490
2491/* Nonzero in a FUNCTION_DECL means this function should be treated
2492 as if it were a malloc, meaning it returns a pointer that is
2493 not an alias. */
eb65426a 2494#define DECL_IS_MALLOC(NODE) \
2495 (FUNCTION_DECL_CHECK (NODE)->function_decl.malloc_flag)
5ded8c6f 2496
68d6de5b 2497/* Nonzero in a FUNCTION_DECL means this function should be treated as
2498 C++ operator new, meaning that it returns a pointer for which we
2499 should not use type based aliasing. */
2500#define DECL_IS_OPERATOR_NEW(NODE) \
2501 (FUNCTION_DECL_CHECK (NODE)->function_decl.operator_new_flag)
2502
5ded8c6f 2503/* Nonzero in a FUNCTION_DECL means this function may return more
2504 than once. */
2505#define DECL_IS_RETURNS_TWICE(NODE) \
2506 (FUNCTION_DECL_CHECK (NODE)->function_decl.returns_twice_flag)
2507
2508/* Nonzero in a FUNCTION_DECL means this function should be treated
2509 as "pure" function (like const function, but may read global memory). */
9c2a0c05 2510#define DECL_PURE_P(NODE) (FUNCTION_DECL_CHECK (NODE)->function_decl.pure_flag)
2511
2512/* Nonzero only if one of TREE_READONLY or DECL_PURE_P is nonzero AND
2513 the const or pure function may not terminate. When this is nonzero
2514 for a const or pure function, it can be dealt with by cse passes
2515 but cannot be removed by dce passes since you are not allowed to
2516 change an infinite looping program into one that terminates without
2517 error. */
2518#define DECL_LOOPING_CONST_OR_PURE_P(NODE) \
2519 (FUNCTION_DECL_CHECK (NODE)->function_decl.looping_const_or_pure_flag)
5ded8c6f 2520
2521/* Nonzero in a FUNCTION_DECL means this function should be treated
2522 as "novops" function (function that does not read global memory,
2523 but may have arbitrary side effects). */
eb65426a 2524#define DECL_IS_NOVOPS(NODE) \
2525 (FUNCTION_DECL_CHECK (NODE)->function_decl.novops_flag)
5ded8c6f 2526
2527/* Used in FUNCTION_DECLs to indicate that they should be run automatically
2528 at the beginning or end of execution. */
2529#define DECL_STATIC_CONSTRUCTOR(NODE) \
2530 (FUNCTION_DECL_CHECK (NODE)->function_decl.static_ctor_flag)
2531
2532#define DECL_STATIC_DESTRUCTOR(NODE) \
2533(FUNCTION_DECL_CHECK (NODE)->function_decl.static_dtor_flag)
2534
2535/* Used in FUNCTION_DECLs to indicate that function entry and exit should
2536 be instrumented with calls to support routines. */
2537#define DECL_NO_INSTRUMENT_FUNCTION_ENTRY_EXIT(NODE) \
2538 (FUNCTION_DECL_CHECK (NODE)->function_decl.no_instrument_function_entry_exit)
2539
2540/* Used in FUNCTION_DECLs to indicate that limit-stack-* should be
2541 disabled in this function. */
2542#define DECL_NO_LIMIT_STACK(NODE) \
2543 (FUNCTION_DECL_CHECK (NODE)->function_decl.no_limit_stack)
2544
3bb63aeb 2545/* In a FUNCTION_DECL indicates that a static chain is needed. */
2546#define DECL_STATIC_CHAIN(NODE) \
5ded8c6f 2547 (FUNCTION_DECL_CHECK (NODE)->function_decl.regdecl_flag)
3a2bf8d3 2548
e1232ce2 2549/* Nonzero for a decl that cgraph has decided should be inlined into
2550 at least one call site. It is not meaningful to look at this
2551 directly; always use cgraph_function_possibly_inlined_p. */
2552#define DECL_POSSIBLY_INLINED(DECL) \
5ded8c6f 2553 FUNCTION_DECL_CHECK (DECL)->function_decl.possibly_inlined
e1232ce2 2554
5ded8c6f 2555/* Nonzero in a FUNCTION_DECL means that this function was declared inline,
2556 such as via the `inline' keyword in C/C++. This flag controls the linkage
73b5e722 2557 semantics of 'inline' */
5ded8c6f 2558#define DECL_DECLARED_INLINE_P(NODE) \
2559 (FUNCTION_DECL_CHECK (NODE)->function_decl.declared_inline_flag)
d471893d 2560
73b5e722 2561/* Nonzero in a FUNCTION_DECL means this function should not get
2562 -Winline warnings. */
2563#define DECL_NO_INLINE_WARNING_P(NODE) \
2564 (FUNCTION_DECL_CHECK (NODE)->function_decl.no_inline_warning_flag)
2565
4c0315d0 2566/* Nonzero if a FUNCTION_CODE is a TM load/store. */
2567#define BUILTIN_TM_LOAD_STORE_P(FN) \
2568 ((FN) >= BUILT_IN_TM_STORE_1 && (FN) <= BUILT_IN_TM_LOAD_RFW_LDOUBLE)
2569
2570/* Nonzero if a FUNCTION_CODE is a TM load. */
2571#define BUILTIN_TM_LOAD_P(FN) \
2572 ((FN) >= BUILT_IN_TM_LOAD_1 && (FN) <= BUILT_IN_TM_LOAD_RFW_LDOUBLE)
2573
2574/* Nonzero if a FUNCTION_CODE is a TM store. */
2575#define BUILTIN_TM_STORE_P(FN) \
2576 ((FN) >= BUILT_IN_TM_STORE_1 && (FN) <= BUILT_IN_TM_STORE_WAW_LDOUBLE)
2577
2578#define CASE_BUILT_IN_TM_LOAD(FN) \
2579 case BUILT_IN_TM_LOAD_##FN: \
2580 case BUILT_IN_TM_LOAD_RAR_##FN: \
2581 case BUILT_IN_TM_LOAD_RAW_##FN: \
2582 case BUILT_IN_TM_LOAD_RFW_##FN
2583
2584#define CASE_BUILT_IN_TM_STORE(FN) \
2585 case BUILT_IN_TM_STORE_##FN: \
2586 case BUILT_IN_TM_STORE_WAR_##FN: \
2587 case BUILT_IN_TM_STORE_WAW_##FN
2588
ebb7d626 2589/* Nonzero in a FUNCTION_DECL that should be always inlined by the inliner
2590 disregarding size and cost heuristics. This is equivalent to using
2591 the always_inline attribute without the required diagnostics if the
2592 function cannot be inlined. */
2593#define DECL_DISREGARD_INLINE_LIMITS(NODE) \
2594 (FUNCTION_DECL_CHECK (NODE)->function_decl.disregard_inline_limits)
2595
f1f41a6c 2596extern vec<tree, va_gc> **decl_debug_args_lookup (tree);
2597extern vec<tree, va_gc> **decl_debug_args_insert (tree);
841424cc 2598
2599/* Nonzero if a FUNCTION_DECL has DEBUG arguments attached to it. */
2600#define DECL_HAS_DEBUG_ARGS_P(NODE) \
2601 (FUNCTION_DECL_CHECK (NODE)->function_decl.has_debug_args_flag)
2602
5ded8c6f 2603/* For FUNCTION_DECL, this holds a pointer to a structure ("struct function")
2604 that describes the status of this function. */
eb65426a 2605#define DECL_STRUCT_FUNCTION(NODE) \
2606 (FUNCTION_DECL_CHECK (NODE)->function_decl.f)
50c96bdc 2607
2f90489d 2608/* In a FUNCTION_DECL, nonzero means a built in function of a
2609 standard library or more generally a built in function that is
2610 recognized by optimizers and expanders.
2611
2612 Note that it is different from the DECL_IS_BUILTIN accessor. For
7e766783 2613 instance, user declared prototypes of C library functions are not
2f90489d 2614 DECL_IS_BUILTIN but may be DECL_BUILT_IN. */
5ded8c6f 2615#define DECL_BUILT_IN(NODE) (DECL_BUILT_IN_CLASS (NODE) != NOT_BUILT_IN)
9c40570a 2616
5ded8c6f 2617/* For a builtin function, identify which part of the compiler defined it. */
2618#define DECL_BUILT_IN_CLASS(NODE) \
2619 (FUNCTION_DECL_CHECK (NODE)->function_decl.built_in_class)
1b53eb20 2620
5ded8c6f 2621/* In FUNCTION_DECL, a chain of ..._DECL nodes.
2622 VAR_DECL and PARM_DECL reserve the arguments slot for language-specific
2623 uses. */
eb65426a 2624#define DECL_ARGUMENTS(NODE) \
2625 (FUNCTION_DECL_CHECK (NODE)->decl_non_common.arguments)
2626#define DECL_ARGUMENT_FLD(NODE) \
2627 (DECL_NON_COMMON_CHECK (NODE)->decl_non_common.arguments)
d72a838e 2628
46f8e3b0 2629/* In FUNCTION_DECL, the function specific target options to use when compiling
2630 this function. */
2631#define DECL_FUNCTION_SPECIFIC_TARGET(NODE) \
2632 (FUNCTION_DECL_CHECK (NODE)->function_decl.function_specific_target)
2633
2634/* In FUNCTION_DECL, the function specific optimization options to use when
2635 compiling this function. */
2636#define DECL_FUNCTION_SPECIFIC_OPTIMIZATION(NODE) \
2637 (FUNCTION_DECL_CHECK (NODE)->function_decl.function_specific_optimization)
2638
cc8ef84f 2639/* In FUNCTION_DECL, this is set if this function has other versions generated
2640 using "target" attributes. The default version is the one which does not
2641 have any "target" attribute set. */
2642#define DECL_FUNCTION_VERSIONED(NODE)\
2643 (FUNCTION_DECL_CHECK (NODE)->function_decl.versioned_function)
2644
fc3dabd5 2645/* In FUNCTION_DECL, this is set if this function is a C++ constructor.
2646 Devirtualization machinery uses this knowledge for determing type of the
2647 object constructed. Also we assume that constructor address is not
2648 important. */
2649#define DECL_CXX_CONSTRUCTOR_P(NODE)\
2650 (FUNCTION_DECL_CHECK (NODE)->decl_with_vis.cxx_constructor)
2651
2652/* In FUNCTION_DECL, this is set if this function is a C++ destructor.
2653 Devirtualization machinery uses this to track types in destruction. */
2654#define DECL_CXX_DESTRUCTOR_P(NODE)\
2655 (FUNCTION_DECL_CHECK (NODE)->decl_with_vis.cxx_destructor)
2656
585bb356 2657/* In FUNCTION_DECL that represent an virtual method this is set when
2658 the method is final. */
2659#define DECL_FINAL_P(NODE)\
2660 (FUNCTION_DECL_CHECK (NODE)->decl_with_vis.final)
2661
23bdc9ca 2662/* The source language of the translation-unit. */
2663#define TRANSLATION_UNIT_LANGUAGE(NODE) \
2664 (TRANSLATION_UNIT_DECL_CHECK (NODE)->translation_unit_decl.language)
2665
2666/* TRANSLATION_UNIT_DECL inherits from DECL_MINIMAL. */
2667
5ded8c6f 2668/* For a TYPE_DECL, holds the "original" type. (TREE_TYPE has the copy.) */
eb65426a 2669#define DECL_ORIGINAL_TYPE(NODE) \
2670 (TYPE_DECL_CHECK (NODE)->decl_non_common.result)
1b53eb20 2671
5ded8c6f 2672/* In a TYPE_DECL nonzero means the detail info about this type is not dumped
2673 into stabs. Instead it will generate cross reference ('x') of names.
2674 This uses the same flag as DECL_EXTERNAL. */
2675#define TYPE_DECL_SUPPRESS_DEBUG(NODE) \
33a0b99d 2676 (TYPE_DECL_CHECK (NODE)->decl_common.decl_flag_1)
4ee9c684 2677
5d8a39b7 2678/* Getter of the imported declaration associated to the
2679 IMPORTED_DECL node. */
2680#define IMPORTED_DECL_ASSOCIATED_DECL(NODE) \
2681(DECL_INITIAL (IMPORTED_DECL_CHECK (NODE)))
2682
c40a5c1b 2683/* Getter of the symbol declaration associated with the
2684 NAMELIST_DECL node. */
2685#define NAMELIST_DECL_ASSOCIATED_DECL(NODE) \
2686 (DECL_INITIAL (NODE))
2687
4ee9c684 2688/* A STATEMENT_LIST chains statements together in GENERIC and GIMPLE.
2689 To reduce overhead, the nodes containing the statements are not trees.
2690 This avoids the overhead of tree_common on all linked list elements.
2691
2692 Use the interface in tree-iterator.h to access this node. */
2693
2694#define STATEMENT_LIST_HEAD(NODE) \
2695 (STATEMENT_LIST_CHECK (NODE)->stmt_list.head)
2696#define STATEMENT_LIST_TAIL(NODE) \
2697 (STATEMENT_LIST_CHECK (NODE)->stmt_list.tail)
2698
46f8e3b0 2699#define TREE_OPTIMIZATION(NODE) \
2700 (&OPTIMIZATION_NODE_CHECK (NODE)->optimization.opts)
2701
08c7d04b 2702#define TREE_OPTIMIZATION_OPTABS(NODE) \
9d3fa937 2703 (OPTIMIZATION_NODE_CHECK (NODE)->optimization.optabs)
2704
2705#define TREE_OPTIMIZATION_BASE_OPTABS(NODE) \
2706 (OPTIMIZATION_NODE_CHECK (NODE)->optimization.base_optabs)
08c7d04b 2707
55310327 2708/* Return a tree node that encapsulates the optimization options in OPTS. */
2709extern tree build_optimization_node (struct gcc_options *opts);
46f8e3b0 2710
46f8e3b0 2711#define TREE_TARGET_OPTION(NODE) \
2712 (&TARGET_OPTION_NODE_CHECK (NODE)->target_option.opts)
2713
6e5c480b 2714#define TREE_TARGET_GLOBALS(NODE) \
2715 (TARGET_OPTION_NODE_CHECK (NODE)->target_option.globals)
2716
55310327 2717/* Return a tree node that encapsulates the target options in OPTS. */
2718extern tree build_target_option_node (struct gcc_options *opts);
46f8e3b0 2719
6e5c480b 2720extern void prepare_target_option_nodes_for_pch (void);
2721
2b15d2ba 2722#if defined ENABLE_TREE_CHECKING && (GCC_VERSION >= 2007)
2723
2724inline tree
2725tree_check (tree __t, const char *__f, int __l, const char *__g, tree_code __c)
2726{
2727 if (TREE_CODE (__t) != __c)
2728 tree_check_failed (__t, __f, __l, __g, __c, 0);
2729 return __t;
2730}
2731
2732inline tree
2733tree_not_check (tree __t, const char *__f, int __l, const char *__g,
2734 enum tree_code __c)
2735{
2736 if (TREE_CODE (__t) == __c)
2737 tree_not_check_failed (__t, __f, __l, __g, __c, 0);
2738 return __t;
2739}
2740
2741inline tree
2742tree_check2 (tree __t, const char *__f, int __l, const char *__g,
2743 enum tree_code __c1, enum tree_code __c2)
2744{
2745 if (TREE_CODE (__t) != __c1
2746 && TREE_CODE (__t) != __c2)
2747 tree_check_failed (__t, __f, __l, __g, __c1, __c2, 0);
2748 return __t;
2749}
2750
2751inline tree
2752tree_not_check2 (tree __t, const char *__f, int __l, const char *__g,
2753 enum tree_code __c1, enum tree_code __c2)
2754{
2755 if (TREE_CODE (__t) == __c1
2756 || TREE_CODE (__t) == __c2)
2757 tree_not_check_failed (__t, __f, __l, __g, __c1, __c2, 0);
2758 return __t;
2759}
2760
2761inline tree
2762tree_check3 (tree __t, const char *__f, int __l, const char *__g,
2763 enum tree_code __c1, enum tree_code __c2, enum tree_code __c3)
2764{
2765 if (TREE_CODE (__t) != __c1
2766 && TREE_CODE (__t) != __c2
2767 && TREE_CODE (__t) != __c3)
2768 tree_check_failed (__t, __f, __l, __g, __c1, __c2, __c3, 0);
2769 return __t;
2770}
2771
2772inline tree
2773tree_not_check3 (tree __t, const char *__f, int __l, const char *__g,
2774 enum tree_code __c1, enum tree_code __c2, enum tree_code __c3)
2775{
2776 if (TREE_CODE (__t) == __c1
2777 || TREE_CODE (__t) == __c2
2778 || TREE_CODE (__t) == __c3)
2779 tree_not_check_failed (__t, __f, __l, __g, __c1, __c2, __c3, 0);
2780 return __t;
2781}
2782
2783inline tree
2784tree_check4 (tree __t, const char *__f, int __l, const char *__g,
2785 enum tree_code __c1, enum tree_code __c2, enum tree_code __c3,
2786 enum tree_code __c4)
2787{
2788 if (TREE_CODE (__t) != __c1
2789 && TREE_CODE (__t) != __c2
2790 && TREE_CODE (__t) != __c3
2791 && TREE_CODE (__t) != __c4)
2792 tree_check_failed (__t, __f, __l, __g, __c1, __c2, __c3, __c4, 0);
2793 return __t;
2794}
2795
2796inline tree
2797tree_not_check4 (tree __t, const char *__f, int __l, const char *__g,
2798 enum tree_code __c1, enum tree_code __c2, enum tree_code __c3,
2799 enum tree_code __c4)
2800{
2801 if (TREE_CODE (__t) == __c1
2802 || TREE_CODE (__t) == __c2
2803 || TREE_CODE (__t) == __c3
2804 || TREE_CODE (__t) == __c4)
2805 tree_not_check_failed (__t, __f, __l, __g, __c1, __c2, __c3, __c4, 0);
2806 return __t;
2807}
2808
2809inline tree
2810tree_check5 (tree __t, const char *__f, int __l, const char *__g,
2811 enum tree_code __c1, enum tree_code __c2, enum tree_code __c3,
2812 enum tree_code __c4, enum tree_code __c5)
2813{
2814 if (TREE_CODE (__t) != __c1
2815 && TREE_CODE (__t) != __c2
2816 && TREE_CODE (__t) != __c3
2817 && TREE_CODE (__t) != __c4
2818 && TREE_CODE (__t) != __c5)
2819 tree_check_failed (__t, __f, __l, __g, __c1, __c2, __c3, __c4, __c5, 0);
2820 return __t;
2821}
2822
2823inline tree
2824tree_not_check5 (tree __t, const char *__f, int __l, const char *__g,
2825 enum tree_code __c1, enum tree_code __c2, enum tree_code __c3,
2826 enum tree_code __c4, enum tree_code __c5)
2827{
2828 if (TREE_CODE (__t) == __c1
2829 || TREE_CODE (__t) == __c2
2830 || TREE_CODE (__t) == __c3
2831 || TREE_CODE (__t) == __c4
2832 || TREE_CODE (__t) == __c5)
2833 tree_not_check_failed (__t, __f, __l, __g, __c1, __c2, __c3, __c4, __c5, 0);
2834 return __t;
2835}
2836
2837inline tree
2838contains_struct_check (tree __t, const enum tree_node_structure_enum __s,
2839 const char *__f, int __l, const char *__g)
2840{
9af5ce0c 2841 if (tree_contains_struct[TREE_CODE (__t)][__s] != 1)
2b15d2ba 2842 tree_contains_struct_check_failed (__t, __s, __f, __l, __g);
2843 return __t;
2844}
2845
2846inline tree
2847tree_class_check (tree __t, const enum tree_code_class __class,
2848 const char *__f, int __l, const char *__g)
2849{
9af5ce0c 2850 if (TREE_CODE_CLASS (TREE_CODE (__t)) != __class)
2b15d2ba 2851 tree_class_check_failed (__t, __class, __f, __l, __g);
2852 return __t;
2853}
2854
2855inline tree
2856tree_range_check (tree __t,
2857 enum tree_code __code1, enum tree_code __code2,
2858 const char *__f, int __l, const char *__g)
2859{
2860 if (TREE_CODE (__t) < __code1 || TREE_CODE (__t) > __code2)
2861 tree_range_check_failed (__t, __f, __l, __g, __code1, __code2);
2862 return __t;
2863}
2864
2865inline tree
2866omp_clause_subcode_check (tree __t, enum omp_clause_code __code,
2867 const char *__f, int __l, const char *__g)
2868{
2869 if (TREE_CODE (__t) != OMP_CLAUSE)
2870 tree_check_failed (__t, __f, __l, __g, OMP_CLAUSE, 0);
2871 if (__t->omp_clause.code != __code)
2872 omp_clause_check_failed (__t, __f, __l, __g, __code);
2873 return __t;
2874}
2875
2876inline tree
2877omp_clause_range_check (tree __t,
2878 enum omp_clause_code __code1,
2879 enum omp_clause_code __code2,
2880 const char *__f, int __l, const char *__g)
2881{
2882 if (TREE_CODE (__t) != OMP_CLAUSE)
2883 tree_check_failed (__t, __f, __l, __g, OMP_CLAUSE, 0);
2884 if ((int) __t->omp_clause.code < (int) __code1
2885 || (int) __t->omp_clause.code > (int) __code2)
2886 omp_clause_range_check_failed (__t, __f, __l, __g, __code1, __code2);
2887 return __t;
2888}
2889
2890/* These checks have to be special cased. */
2891
2892inline tree
2893expr_check (tree __t, const char *__f, int __l, const char *__g)
2894{
2895 char const __c = TREE_CODE_CLASS (TREE_CODE (__t));
2896 if (!IS_EXPR_CODE_CLASS (__c))
2897 tree_class_check_failed (__t, tcc_expression, __f, __l, __g);
2898 return __t;
2899}
2900
2901/* These checks have to be special cased. */
2902
2903inline tree
2904non_type_check (tree __t, const char *__f, int __l, const char *__g)
2905{
2906 if (TYPE_P (__t))
2907 tree_not_class_check_failed (__t, tcc_type, __f, __l, __g);
2908 return __t;
2909}
2910
e913b5cd 2911inline const HOST_WIDE_INT *
2912tree_int_cst_elt_check (const_tree __t, int __i,
2913 const char *__f, int __l, const char *__g)
2914{
2915 if (TREE_CODE (__t) != INTEGER_CST)
2916 tree_check_failed (__t, __f, __l, __g, INTEGER_CST, 0);
271e739a 2917 if (__i < 0 || __i >= __t->base.u.int_length.extended)
2918 tree_int_cst_elt_check_failed (__i, __t->base.u.int_length.extended,
2919 __f, __l, __g);
e913b5cd 2920 return &CONST_CAST_TREE (__t)->int_cst.val[__i];
2921}
2922
2923inline HOST_WIDE_INT *
2924tree_int_cst_elt_check (tree __t, int __i,
2925 const char *__f, int __l, const char *__g)
2926{
2927 if (TREE_CODE (__t) != INTEGER_CST)
2928 tree_check_failed (__t, __f, __l, __g, INTEGER_CST, 0);
271e739a 2929 if (__i < 0 || __i >= __t->base.u.int_length.extended)
2930 tree_int_cst_elt_check_failed (__i, __t->base.u.int_length.extended,
2931 __f, __l, __g);
e913b5cd 2932 return &CONST_CAST_TREE (__t)->int_cst.val[__i];
2933}
2934
2b15d2ba 2935inline tree *
2936tree_vec_elt_check (tree __t, int __i,
2937 const char *__f, int __l, const char *__g)
2938{
2939 if (TREE_CODE (__t) != TREE_VEC)
2940 tree_check_failed (__t, __f, __l, __g, TREE_VEC, 0);
87d8f7b6 2941 if (__i < 0 || __i >= __t->base.u.length)
2942 tree_vec_elt_check_failed (__i, __t->base.u.length, __f, __l, __g);
2b15d2ba 2943 return &CONST_CAST_TREE (__t)->vec.a[__i];
2944}
2945
2946inline tree *
2947omp_clause_elt_check (tree __t, int __i,
2948 const char *__f, int __l, const char *__g)
2949{
2950 if (TREE_CODE (__t) != OMP_CLAUSE)
2951 tree_check_failed (__t, __f, __l, __g, OMP_CLAUSE, 0);
2952 if (__i < 0 || __i >= omp_clause_num_ops [__t->omp_clause.code])
2953 omp_clause_operand_check_failed (__i, __t, __f, __l, __g);
2954 return &__t->omp_clause.ops[__i];
2955}
2956
2957inline const_tree
2958tree_check (const_tree __t, const char *__f, int __l, const char *__g,
2959 tree_code __c)
2960{
2961 if (TREE_CODE (__t) != __c)
2962 tree_check_failed (__t, __f, __l, __g, __c, 0);
2963 return __t;
2964}
2965
2966inline const_tree
2967tree_not_check (const_tree __t, const char *__f, int __l, const char *__g,
2968 enum tree_code __c)
2969{
2970 if (TREE_CODE (__t) == __c)
2971 tree_not_check_failed (__t, __f, __l, __g, __c, 0);
2972 return __t;
2973}
2974
2975inline const_tree
2976tree_check2 (const_tree __t, const char *__f, int __l, const char *__g,
2977 enum tree_code __c1, enum tree_code __c2)
2978{
2979 if (TREE_CODE (__t) != __c1
2980 && TREE_CODE (__t) != __c2)
2981 tree_check_failed (__t, __f, __l, __g, __c1, __c2, 0);
2982 return __t;
2983}
2984
2985inline const_tree
2986tree_not_check2 (const_tree __t, const char *__f, int __l, const char *__g,
2987 enum tree_code __c1, enum tree_code __c2)
2988{
2989 if (TREE_CODE (__t) == __c1
2990 || TREE_CODE (__t) == __c2)
2991 tree_not_check_failed (__t, __f, __l, __g, __c1, __c2, 0);
2992 return __t;
2993}
2994
2995inline const_tree
2996tree_check3 (const_tree __t, const char *__f, int __l, const char *__g,
2997 enum tree_code __c1, enum tree_code __c2, enum tree_code __c3)
2998{
2999 if (TREE_CODE (__t) != __c1
3000 && TREE_CODE (__t) != __c2
3001 && TREE_CODE (__t) != __c3)
3002 tree_check_failed (__t, __f, __l, __g, __c1, __c2, __c3, 0);
3003 return __t;
3004}
3005
3006inline const_tree
3007tree_not_check3 (const_tree __t, const char *__f, int __l, const char *__g,
3008 enum tree_code __c1, enum tree_code __c2, enum tree_code __c3)
3009{
3010 if (TREE_CODE (__t) == __c1
3011 || TREE_CODE (__t) == __c2
3012 || TREE_CODE (__t) == __c3)
3013 tree_not_check_failed (__t, __f, __l, __g, __c1, __c2, __c3, 0);
3014 return __t;
3015}
3016
3017inline const_tree
3018tree_check4 (const_tree __t, const char *__f, int __l, const char *__g,
3019 enum tree_code __c1, enum tree_code __c2, enum tree_code __c3,
3020 enum tree_code __c4)
3021{
3022 if (TREE_CODE (__t) != __c1
3023 && TREE_CODE (__t) != __c2
3024 && TREE_CODE (__t) != __c3
3025 && TREE_CODE (__t) != __c4)
3026 tree_check_failed (__t, __f, __l, __g, __c1, __c2, __c3, __c4, 0);
3027 return __t;
3028}
3029
3030inline const_tree
3031tree_not_check4 (const_tree __t, const char *__f, int __l, const char *__g,
3032 enum tree_code __c1, enum tree_code __c2, enum tree_code __c3,
3033 enum tree_code __c4)
3034{
3035 if (TREE_CODE (__t) == __c1
3036 || TREE_CODE (__t) == __c2
3037 || TREE_CODE (__t) == __c3
3038 || TREE_CODE (__t) == __c4)
3039 tree_not_check_failed (__t, __f, __l, __g, __c1, __c2, __c3, __c4, 0);
3040 return __t;
3041}
3042
3043inline const_tree
3044tree_check5 (const_tree __t, const char *__f, int __l, const char *__g,
3045 enum tree_code __c1, enum tree_code __c2, enum tree_code __c3,
3046 enum tree_code __c4, enum tree_code __c5)
3047{
3048 if (TREE_CODE (__t) != __c1
3049 && TREE_CODE (__t) != __c2
3050 && TREE_CODE (__t) != __c3
3051 && TREE_CODE (__t) != __c4
3052 && TREE_CODE (__t) != __c5)
3053 tree_check_failed (__t, __f, __l, __g, __c1, __c2, __c3, __c4, __c5, 0);
3054 return __t;
3055}
3056
3057inline const_tree
3058tree_not_check5 (const_tree __t, const char *__f, int __l, const char *__g,
3059 enum tree_code __c1, enum tree_code __c2, enum tree_code __c3,
3060 enum tree_code __c4, enum tree_code __c5)
3061{
3062 if (TREE_CODE (__t) == __c1
3063 || TREE_CODE (__t) == __c2
3064 || TREE_CODE (__t) == __c3
3065 || TREE_CODE (__t) == __c4
3066 || TREE_CODE (__t) == __c5)
3067 tree_not_check_failed (__t, __f, __l, __g, __c1, __c2, __c3, __c4, __c5, 0);
3068 return __t;
3069}
3070
3071inline const_tree
3072contains_struct_check (const_tree __t, const enum tree_node_structure_enum __s,
3073 const char *__f, int __l, const char *__g)
3074{
9af5ce0c 3075 if (tree_contains_struct[TREE_CODE (__t)][__s] != 1)
2b15d2ba 3076 tree_contains_struct_check_failed (__t, __s, __f, __l, __g);
3077 return __t;
3078}
3079
3080inline const_tree
3081tree_class_check (const_tree __t, const enum tree_code_class __class,
3082 const char *__f, int __l, const char *__g)
3083{
9af5ce0c 3084 if (TREE_CODE_CLASS (TREE_CODE (__t)) != __class)
2b15d2ba 3085 tree_class_check_failed (__t, __class, __f, __l, __g);
3086 return __t;
3087}
3088
3089inline const_tree
3090tree_range_check (const_tree __t,
3091 enum tree_code __code1, enum tree_code __code2,
3092 const char *__f, int __l, const char *__g)
3093{
3094 if (TREE_CODE (__t) < __code1 || TREE_CODE (__t) > __code2)
3095 tree_range_check_failed (__t, __f, __l, __g, __code1, __code2);
3096 return __t;
3097}
3098
3099inline const_tree
3100omp_clause_subcode_check (const_tree __t, enum omp_clause_code __code,
3101 const char *__f, int __l, const char *__g)
3102{
3103 if (TREE_CODE (__t) != OMP_CLAUSE)
3104 tree_check_failed (__t, __f, __l, __g, OMP_CLAUSE, 0);
3105 if (__t->omp_clause.code != __code)
3106 omp_clause_check_failed (__t, __f, __l, __g, __code);
3107 return __t;
3108}
3109
3110inline const_tree
3111omp_clause_range_check (const_tree __t,
3112 enum omp_clause_code __code1,
3113 enum omp_clause_code __code2,
3114 const char *__f, int __l, const char *__g)
3115{
3116 if (TREE_CODE (__t) != OMP_CLAUSE)
3117 tree_check_failed (__t, __f, __l, __g, OMP_CLAUSE, 0);
3118 if ((int) __t->omp_clause.code < (int) __code1
3119 || (int) __t->omp_clause.code > (int) __code2)
3120 omp_clause_range_check_failed (__t, __f, __l, __g, __code1, __code2);
3121 return __t;
3122}
3123
3124inline const_tree
3125expr_check (const_tree __t, const char *__f, int __l, const char *__g)
3126{
3127 char const __c = TREE_CODE_CLASS (TREE_CODE (__t));
3128 if (!IS_EXPR_CODE_CLASS (__c))
3129 tree_class_check_failed (__t, tcc_expression, __f, __l, __g);
3130 return __t;
3131}
3132
3133inline const_tree
3134non_type_check (const_tree __t, const char *__f, int __l, const char *__g)
3135{
3136 if (TYPE_P (__t))
3137 tree_not_class_check_failed (__t, tcc_type, __f, __l, __g);
3138 return __t;
3139}
3140
3141inline const_tree *
3142tree_vec_elt_check (const_tree __t, int __i,
3143 const char *__f, int __l, const char *__g)
3144{
3145 if (TREE_CODE (__t) != TREE_VEC)
3146 tree_check_failed (__t, __f, __l, __g, TREE_VEC, 0);
87d8f7b6 3147 if (__i < 0 || __i >= __t->base.u.length)
3148 tree_vec_elt_check_failed (__i, __t->base.u.length, __f, __l, __g);
2b15d2ba 3149 return CONST_CAST (const_tree *, &__t->vec.a[__i]);
3150 //return &__t->vec.a[__i];
3151}
3152
3153inline const_tree *
3154omp_clause_elt_check (const_tree __t, int __i,
3155 const char *__f, int __l, const char *__g)
3156{
3157 if (TREE_CODE (__t) != OMP_CLAUSE)
3158 tree_check_failed (__t, __f, __l, __g, OMP_CLAUSE, 0);
3159 if (__i < 0 || __i >= omp_clause_num_ops [__t->omp_clause.code])
3160 omp_clause_operand_check_failed (__i, __t, __f, __l, __g);
3161 return CONST_CAST (const_tree *, &__t->omp_clause.ops[__i]);
3162}
3163
3164#endif
3165
3166/* Compute the number of operands in an expression node NODE. For
3167 tcc_vl_exp nodes like CALL_EXPRs, this is stored in the node itself,
3168 otherwise it is looked up from the node's code. */
3169static inline int
3170tree_operand_length (const_tree node)
3171{
3172 if (VL_EXP_CLASS_P (node))
3173 return VL_EXP_OPERAND_LENGTH (node);
3174 else
3175 return TREE_CODE_LENGTH (TREE_CODE (node));
3176}
3177
3178#if defined ENABLE_TREE_CHECKING && (GCC_VERSION >= 2007)
3179
3180/* Special checks for TREE_OPERANDs. */
3181inline tree *
3182tree_operand_check (tree __t, int __i,
3183 const char *__f, int __l, const char *__g)
3184{
3185 const_tree __u = EXPR_CHECK (__t);
3186 if (__i < 0 || __i >= TREE_OPERAND_LENGTH (__u))
3187 tree_operand_check_failed (__i, __u, __f, __l, __g);
3188 return &CONST_CAST_TREE (__u)->exp.operands[__i];
3189}
3190
3191inline tree *
3192tree_operand_check_code (tree __t, enum tree_code __code, int __i,
3193 const char *__f, int __l, const char *__g)
3194{
3195 if (TREE_CODE (__t) != __code)
3196 tree_check_failed (__t, __f, __l, __g, __code, 0);
3197 if (__i < 0 || __i >= TREE_OPERAND_LENGTH (__t))
3198 tree_operand_check_failed (__i, __t, __f, __l, __g);
3199 return &__t->exp.operands[__i];
3200}
3201
3202inline const_tree *
3203tree_operand_check (const_tree __t, int __i,
3204 const char *__f, int __l, const char *__g)
3205{
3206 const_tree __u = EXPR_CHECK (__t);
3207 if (__i < 0 || __i >= TREE_OPERAND_LENGTH (__u))
3208 tree_operand_check_failed (__i, __u, __f, __l, __g);
3209 return CONST_CAST (const_tree *, &__u->exp.operands[__i]);
3210}
3211
3212inline const_tree *
3213tree_operand_check_code (const_tree __t, enum tree_code __code, int __i,
3214 const char *__f, int __l, const char *__g)
3215{
3216 if (TREE_CODE (__t) != __code)
3217 tree_check_failed (__t, __f, __l, __g, __code, 0);
3218 if (__i < 0 || __i >= TREE_OPERAND_LENGTH (__t))
3219 tree_operand_check_failed (__i, __t, __f, __l, __g);
3220 return CONST_CAST (const_tree *, &__t->exp.operands[__i]);
3221}
3222
3223#endif
3224
775e7cc0 3225#define error_mark_node global_trees[TI_ERROR_MARK]
6c34d0c2 3226
775e7cc0 3227#define intQI_type_node global_trees[TI_INTQI_TYPE]
3228#define intHI_type_node global_trees[TI_INTHI_TYPE]
3229#define intSI_type_node global_trees[TI_INTSI_TYPE]
3230#define intDI_type_node global_trees[TI_INTDI_TYPE]
3231#define intTI_type_node global_trees[TI_INTTI_TYPE]
3232
3233#define unsigned_intQI_type_node global_trees[TI_UINTQI_TYPE]
3234#define unsigned_intHI_type_node global_trees[TI_UINTHI_TYPE]
3235#define unsigned_intSI_type_node global_trees[TI_UINTSI_TYPE]
3236#define unsigned_intDI_type_node global_trees[TI_UINTDI_TYPE]
3237#define unsigned_intTI_type_node global_trees[TI_UINTTI_TYPE]
3238
b560fabd 3239#define atomicQI_type_node global_trees[TI_ATOMICQI_TYPE]
3240#define atomicHI_type_node global_trees[TI_ATOMICHI_TYPE]
3241#define atomicSI_type_node global_trees[TI_ATOMICSI_TYPE]
3242#define atomicDI_type_node global_trees[TI_ATOMICDI_TYPE]
3243#define atomicTI_type_node global_trees[TI_ATOMICTI_TYPE]
3244
74bdbe96 3245#define uint16_type_node global_trees[TI_UINT16_TYPE]
42791117 3246#define uint32_type_node global_trees[TI_UINT32_TYPE]
3247#define uint64_type_node global_trees[TI_UINT64_TYPE]
3248
3ab4693e 3249#define void_node global_trees[TI_VOID]
3250
775e7cc0 3251#define integer_zero_node global_trees[TI_INTEGER_ZERO]
3252#define integer_one_node global_trees[TI_INTEGER_ONE]
2512209b 3253#define integer_three_node global_trees[TI_INTEGER_THREE]
c87787ad 3254#define integer_minus_one_node global_trees[TI_INTEGER_MINUS_ONE]
775e7cc0 3255#define size_zero_node global_trees[TI_SIZE_ZERO]
3256#define size_one_node global_trees[TI_SIZE_ONE]
02e7a332 3257#define bitsize_zero_node global_trees[TI_BITSIZE_ZERO]
3258#define bitsize_one_node global_trees[TI_BITSIZE_ONE]
3259#define bitsize_unit_node global_trees[TI_BITSIZE_UNIT]
3260
95f3173a 3261/* Base access nodes. */
2c584053 3262#define access_public_node global_trees[TI_PUBLIC]
3263#define access_protected_node global_trees[TI_PROTECTED]
3264#define access_private_node global_trees[TI_PRIVATE]
95f3173a 3265
775e7cc0 3266#define null_pointer_node global_trees[TI_NULL_POINTER]
3267
3268#define float_type_node global_trees[TI_FLOAT_TYPE]
3269#define double_type_node global_trees[TI_DOUBLE_TYPE]
3270#define long_double_type_node global_trees[TI_LONG_DOUBLE_TYPE]
3271
4070bd43 3272#define float_ptr_type_node global_trees[TI_FLOAT_PTR_TYPE]
3273#define double_ptr_type_node global_trees[TI_DOUBLE_PTR_TYPE]
3274#define long_double_ptr_type_node global_trees[TI_LONG_DOUBLE_PTR_TYPE]
3275#define integer_ptr_type_node global_trees[TI_INTEGER_PTR_TYPE]
3276
775e7cc0 3277#define complex_integer_type_node global_trees[TI_COMPLEX_INTEGER_TYPE]
3278#define complex_float_type_node global_trees[TI_COMPLEX_FLOAT_TYPE]
3279#define complex_double_type_node global_trees[TI_COMPLEX_DOUBLE_TYPE]
3280#define complex_long_double_type_node global_trees[TI_COMPLEX_LONG_DOUBLE_TYPE]
3281
3282#define void_type_node global_trees[TI_VOID_TYPE]
39b6af4b 3283/* The C type `void *'. */
775e7cc0 3284#define ptr_type_node global_trees[TI_PTR_TYPE]
39b6af4b 3285/* The C type `const void *'. */
775e7cc0 3286#define const_ptr_type_node global_trees[TI_CONST_PTR_TYPE]
654ef926 3287/* The C type `size_t'. */
3288#define size_type_node global_trees[TI_SIZE_TYPE]
73673831 3289#define pid_type_node global_trees[TI_PID_TYPE]
775e7cc0 3290#define ptrdiff_type_node global_trees[TI_PTRDIFF_TYPE]
3291#define va_list_type_node global_trees[TI_VA_LIST_TYPE]
a6c787e5 3292#define va_list_gpr_counter_field global_trees[TI_VA_LIST_GPR_COUNTER_FIELD]
3293#define va_list_fpr_counter_field global_trees[TI_VA_LIST_FPR_COUNTER_FIELD]
e256d445 3294/* The C type `FILE *'. */
3295#define fileptr_type_node global_trees[TI_FILEPTR_TYPE]
9e46467d 3296#define pointer_sized_int_node global_trees[TI_POINTER_SIZED_TYPE]
b06898ca 3297
3c2239cf 3298#define boolean_type_node global_trees[TI_BOOLEAN_TYPE]
3299#define boolean_false_node global_trees[TI_BOOLEAN_FALSE]
3300#define boolean_true_node global_trees[TI_BOOLEAN_TRUE]
3301
c4503c0a 3302/* The decimal floating point types. */
3303#define dfloat32_type_node global_trees[TI_DFLOAT32_TYPE]
3304#define dfloat64_type_node global_trees[TI_DFLOAT64_TYPE]
3305#define dfloat128_type_node global_trees[TI_DFLOAT128_TYPE]
3306#define dfloat32_ptr_type_node global_trees[TI_DFLOAT32_PTR_TYPE]
3307#define dfloat64_ptr_type_node global_trees[TI_DFLOAT64_PTR_TYPE]
3308#define dfloat128_ptr_type_node global_trees[TI_DFLOAT128_PTR_TYPE]
3309
06f0b99c 3310/* The fixed-point types. */
3311#define sat_short_fract_type_node global_trees[TI_SAT_SFRACT_TYPE]
3312#define sat_fract_type_node global_trees[TI_SAT_FRACT_TYPE]
3313#define sat_long_fract_type_node global_trees[TI_SAT_LFRACT_TYPE]
3314#define sat_long_long_fract_type_node global_trees[TI_SAT_LLFRACT_TYPE]
3315#define sat_unsigned_short_fract_type_node \
3316 global_trees[TI_SAT_USFRACT_TYPE]
3317#define sat_unsigned_fract_type_node global_trees[TI_SAT_UFRACT_TYPE]
3318#define sat_unsigned_long_fract_type_node \
3319 global_trees[TI_SAT_ULFRACT_TYPE]
3320#define sat_unsigned_long_long_fract_type_node \
3321 global_trees[TI_SAT_ULLFRACT_TYPE]
3322#define short_fract_type_node global_trees[TI_SFRACT_TYPE]
3323#define fract_type_node global_trees[TI_FRACT_TYPE]
3324#define long_fract_type_node global_trees[TI_LFRACT_TYPE]
3325#define long_long_fract_type_node global_trees[TI_LLFRACT_TYPE]
3326#define unsigned_short_fract_type_node global_trees[TI_USFRACT_TYPE]
3327#define unsigned_fract_type_node global_trees[TI_UFRACT_TYPE]
3328#define unsigned_long_fract_type_node global_trees[TI_ULFRACT_TYPE]
3329#define unsigned_long_long_fract_type_node \
3330 global_trees[TI_ULLFRACT_TYPE]
3331#define sat_short_accum_type_node global_trees[TI_SAT_SACCUM_TYPE]
3332#define sat_accum_type_node global_trees[TI_SAT_ACCUM_TYPE]
3333#define sat_long_accum_type_node global_trees[TI_SAT_LACCUM_TYPE]
3334#define sat_long_long_accum_type_node global_trees[TI_SAT_LLACCUM_TYPE]
3335#define sat_unsigned_short_accum_type_node \
3336 global_trees[TI_SAT_USACCUM_TYPE]
3337#define sat_unsigned_accum_type_node global_trees[TI_SAT_UACCUM_TYPE]
3338#define sat_unsigned_long_accum_type_node \
3339 global_trees[TI_SAT_ULACCUM_TYPE]
3340#define sat_unsigned_long_long_accum_type_node \
3341 global_trees[TI_SAT_ULLACCUM_TYPE]
3342#define short_accum_type_node global_trees[TI_SACCUM_TYPE]
3343#define accum_type_node global_trees[TI_ACCUM_TYPE]
3344#define long_accum_type_node global_trees[TI_LACCUM_TYPE]
3345#define long_long_accum_type_node global_trees[TI_LLACCUM_TYPE]
3346#define unsigned_short_accum_type_node global_trees[TI_USACCUM_TYPE]
3347#define unsigned_accum_type_node global_trees[TI_UACCUM_TYPE]
3348#define unsigned_long_accum_type_node global_trees[TI_ULACCUM_TYPE]
3349#define unsigned_long_long_accum_type_node \
3350 global_trees[TI_ULLACCUM_TYPE]
3351#define qq_type_node global_trees[TI_QQ_TYPE]
3352#define hq_type_node global_trees[TI_HQ_TYPE]
3353#define sq_type_node global_trees[TI_SQ_TYPE]
3354#define dq_type_node global_trees[TI_DQ_TYPE]
3355#define tq_type_node global_trees[TI_TQ_TYPE]
3356#define uqq_type_node global_trees[TI_UQQ_TYPE]
3357#define uhq_type_node global_trees[TI_UHQ_TYPE]
3358#define usq_type_node global_trees[TI_USQ_TYPE]
3359#define udq_type_node global_trees[TI_UDQ_TYPE]
3360#define utq_type_node global_trees[TI_UTQ_TYPE]
3361#define sat_qq_type_node global_trees[TI_SAT_QQ_TYPE]
3362#define sat_hq_type_node global_trees[TI_SAT_HQ_TYPE]
3363#define sat_sq_type_node global_trees[TI_SAT_SQ_TYPE]
3364#define sat_dq_type_node global_trees[TI_SAT_DQ_TYPE]
3365#define sat_tq_type_node global_trees[TI_SAT_TQ_TYPE]
3366#define sat_uqq_type_node global_trees[TI_SAT_UQQ_TYPE]
3367#define sat_uhq_type_node global_trees[TI_SAT_UHQ_TYPE]
3368#define sat_usq_type_node global_trees[TI_SAT_USQ_TYPE]
3369#define sat_udq_type_node global_trees[TI_SAT_UDQ_TYPE]
3370#define sat_utq_type_node global_trees[TI_SAT_UTQ_TYPE]
3371#define ha_type_node global_trees[TI_HA_TYPE]
3372#define sa_type_node global_trees[TI_SA_TYPE]
3373#define da_type_node global_trees[TI_DA_TYPE]
3374#define ta_type_node global_trees[TI_TA_TYPE]
3375#define uha_type_node global_trees[TI_UHA_TYPE]
3376#define usa_type_node global_trees[TI_USA_TYPE]
3377#define uda_type_node global_trees[TI_UDA_TYPE]
3378#define uta_type_node global_trees[TI_UTA_TYPE]
3379#define sat_ha_type_node global_trees[TI_SAT_HA_TYPE]
3380#define sat_sa_type_node global_trees[TI_SAT_SA_TYPE]
3381#define sat_da_type_node global_trees[TI_SAT_DA_TYPE]
3382#define sat_ta_type_node global_trees[TI_SAT_TA_TYPE]
3383#define sat_uha_type_node global_trees[TI_SAT_UHA_TYPE]
3384#define sat_usa_type_node global_trees[TI_SAT_USA_TYPE]
3385#define sat_uda_type_node global_trees[TI_SAT_UDA_TYPE]
3386#define sat_uta_type_node global_trees[TI_SAT_UTA_TYPE]
3387
83f69b41 3388/* The node that should be placed at the end of a parameter list to
3389 indicate that the function does not take a variable number of
3390 arguments. The TREE_VALUE will be void_type_node and there will be
3391 no TREE_CHAIN. Language-independent code should not assume
3392 anything else about this node. */
3393#define void_list_node global_trees[TI_VOID_LIST_NODE]
3394
5c62f199 3395#define main_identifier_node global_trees[TI_MAIN_IDENTIFIER]
eb65426a 3396#define MAIN_NAME_P(NODE) \
3397 (IDENTIFIER_NODE_CHECK (NODE) == main_identifier_node)
5c62f199 3398
24470055 3399/* Optimization options (OPTIMIZATION_NODE) to use for default and current
3400 functions. */
46f8e3b0 3401#define optimization_default_node global_trees[TI_OPTIMIZATION_DEFAULT]
3402#define optimization_current_node global_trees[TI_OPTIMIZATION_CURRENT]
46f8e3b0 3403
3404/* Default/current target options (TARGET_OPTION_NODE). */
3405#define target_option_default_node global_trees[TI_TARGET_OPTION_DEFAULT]
3406#define target_option_current_node global_trees[TI_TARGET_OPTION_CURRENT]
3407
3408/* Default tree list option(), optimize() pragmas to be linked into the
3409 attribute list. */
24470055 3410#define current_target_pragma global_trees[TI_CURRENT_TARGET_PRAGMA]
46f8e3b0 3411#define current_optimize_pragma global_trees[TI_CURRENT_OPTIMIZE_PRAGMA]
3412
b06898ca 3413#define char_type_node integer_types[itk_char]
3414#define signed_char_type_node integer_types[itk_signed_char]
3415#define unsigned_char_type_node integer_types[itk_unsigned_char]
3416#define short_integer_type_node integer_types[itk_short]
3417#define short_unsigned_type_node integer_types[itk_unsigned_short]
3418#define integer_type_node integer_types[itk_int]
3419#define unsigned_type_node integer_types[itk_unsigned_int]
3420#define long_integer_type_node integer_types[itk_long]
3421#define long_unsigned_type_node integer_types[itk_unsigned_long]
3422#define long_long_integer_type_node integer_types[itk_long_long]
3423#define long_long_unsigned_type_node integer_types[itk_unsigned_long_long]
6388cfe2 3424#define int128_integer_type_node integer_types[itk_int128]
3425#define int128_unsigned_type_node integer_types[itk_unsigned_int128]
fc5cb4c0 3426
da579dbb 3427/* True if NODE is an erroneous expression. */
3428
3429#define error_operand_p(NODE) \
3430 ((NODE) == error_mark_node \
3431 || ((NODE) && TREE_TYPE ((NODE)) == error_mark_node))
3432
60b8c5b3 3433extern tree decl_assembler_name (tree);
7bbf0ff2 3434extern tree decl_comdat_group (tree);
1d9ca4f0 3435extern tree decl_comdat_group_id (tree);
d72a838e 3436
6663ac46 3437/* Compute the number of bytes occupied by 'node'. This routine only
3438 looks at TREE_CODE and, if the code is TREE_VEC, TREE_VEC_LENGTH. */
3439
720082dc 3440extern size_t tree_size (const_tree);
6663ac46 3441
e913b5cd 3442/* Compute the number of bytes occupied by a tree with code CODE.
3443 This function cannot be used for TREE_VEC or INTEGER_CST nodes,
3444 which are of variable length. */
51d121a0 3445extern size_t tree_code_size (enum tree_code);
3446
e44576dd 3447/* Allocate and return a new UID from the DECL_UID namespace. */
3448extern int allocate_decl_uid (void);
3449
d72a838e 3450/* Lowest level primitive for allocating a node.
3451 The TREE_CODE is the only argument. Contents are initialized
3452 to zero except for a few of the common fields. */
3453
674b05f5 3454extern tree make_node_stat (enum tree_code MEM_STAT_DECL);
3455#define make_node(t) make_node_stat (t MEM_STAT_INFO)
d72a838e 3456
ff6d0dd9 3457/* Make a copy of a node, with all the same contents. */
d72a838e 3458
674b05f5 3459extern tree copy_node_stat (tree MEM_STAT_DECL);
3460#define copy_node(t) copy_node_stat (t MEM_STAT_INFO)
d72a838e 3461
3462/* Make a copy of a chain of TREE_LIST nodes. */
3463
60b8c5b3 3464extern tree copy_list (tree);
d72a838e 3465
b6e3dd65 3466/* Make a CASE_LABEL_EXPR. */
3467
3468extern tree build_case_label (tree, tree, tree);
3469
3cb98335 3470/* Make a BINFO. */
3471extern tree make_tree_binfo_stat (unsigned MEM_STAT_DECL);
3472#define make_tree_binfo(t) make_tree_binfo_stat (t MEM_STAT_INFO)
3473
b3fba3cd 3474/* Make an INTEGER_CST. */
e913b5cd 3475
271e739a 3476extern tree make_int_cst_stat (int, int MEM_STAT_DECL);
3477#define make_int_cst(LEN, EXT_LEN) \
3478 make_int_cst_stat (LEN, EXT_LEN MEM_STAT_INFO)
e913b5cd 3479
d72a838e 3480/* Make a TREE_VEC. */
3481
674b05f5 3482extern tree make_tree_vec_stat (int MEM_STAT_DECL);
3483#define make_tree_vec(t) make_tree_vec_stat (t MEM_STAT_INFO)
d72a838e 3484
19646b27 3485/* Grow a TREE_VEC. */
3486
3487extern tree grow_tree_vec_stat (tree v, int MEM_STAT_DECL);
3488#define grow_tree_vec(v, t) grow_tree_vec_stat (v, t MEM_STAT_INFO)
3489
d72a838e 3490/* Construct various types of nodes. */
3491
60b8c5b3 3492extern tree build_nt (enum tree_code, ...);
f1f41a6c 3493extern tree build_nt_call_vec (tree, vec<tree, va_gc> *);
60b8c5b3 3494
674b05f5 3495extern tree build0_stat (enum tree_code, tree MEM_STAT_DECL);
3496#define build0(c,t) build0_stat (c,t MEM_STAT_INFO)
3497extern tree build1_stat (enum tree_code, tree, tree MEM_STAT_DECL);
3498#define build1(c,t1,t2) build1_stat (c,t1,t2 MEM_STAT_INFO)
3499extern tree build2_stat (enum tree_code, tree, tree, tree MEM_STAT_DECL);
3500#define build2(c,t1,t2,t3) build2_stat (c,t1,t2,t3 MEM_STAT_INFO)
3501extern tree build3_stat (enum tree_code, tree, tree, tree, tree MEM_STAT_DECL);
3502#define build3(c,t1,t2,t3,t4) build3_stat (c,t1,t2,t3,t4 MEM_STAT_INFO)
3503extern tree build4_stat (enum tree_code, tree, tree, tree, tree,
3504 tree MEM_STAT_DECL);
3505#define build4(c,t1,t2,t3,t4,t5) build4_stat (c,t1,t2,t3,t4,t5 MEM_STAT_INFO)
1e8e9920 3506extern tree build5_stat (enum tree_code, tree, tree, tree, tree, tree,
3507 tree MEM_STAT_DECL);
3508#define build5(c,t1,t2,t3,t4,t5,t6) build5_stat (c,t1,t2,t3,t4,t5,t6 MEM_STAT_INFO)
413a7abf 3509
2330f9c5 3510/* _loc versions of build[1-5]. */
2d60d82b 3511
3512static inline tree
3513build1_stat_loc (location_t loc, enum tree_code code, tree type,
3514 tree arg1 MEM_STAT_DECL)
3515{
3516 tree t = build1_stat (code, type, arg1 PASS_MEM_STAT);
3517 if (CAN_HAVE_LOCATION_P (t))
3518 SET_EXPR_LOCATION (t, loc);
3519 return t;
3520}
3521#define build1_loc(l,c,t1,t2) build1_stat_loc (l,c,t1,t2 MEM_STAT_INFO)
3522
3523static inline tree
3524build2_stat_loc (location_t loc, enum tree_code code, tree type, tree arg0,
3525 tree arg1 MEM_STAT_DECL)
3526{
3527 tree t = build2_stat (code, type, arg0, arg1 PASS_MEM_STAT);
3528 if (CAN_HAVE_LOCATION_P (t))
3529 SET_EXPR_LOCATION (t, loc);
3530 return t;
3531}
3532#define build2_loc(l,c,t1,t2,t3) build2_stat_loc (l,c,t1,t2,t3 MEM_STAT_INFO)
3533
3534static inline tree
3535build3_stat_loc (location_t loc, enum tree_code code, tree type, tree arg0,
3536 tree arg1, tree arg2 MEM_STAT_DECL)
3537{
3538 tree t = build3_stat (code, type, arg0, arg1, arg2 PASS_MEM_STAT);
3539 if (CAN_HAVE_LOCATION_P (t))
3540 SET_EXPR_LOCATION (t, loc);
3541 return t;
3542}
3543#define build3_loc(l,c,t1,t2,t3,t4) \
3544 build3_stat_loc (l,c,t1,t2,t3,t4 MEM_STAT_INFO)
3545
3546static inline tree
3547build4_stat_loc (location_t loc, enum tree_code code, tree type, tree arg0,
3548 tree arg1, tree arg2, tree arg3 MEM_STAT_DECL)
3549{
3550 tree t = build4_stat (code, type, arg0, arg1, arg2, arg3 PASS_MEM_STAT);
3551 if (CAN_HAVE_LOCATION_P (t))
3552 SET_EXPR_LOCATION (t, loc);
3553 return t;
3554}
3555#define build4_loc(l,c,t1,t2,t3,t4,t5) \
3556 build4_stat_loc (l,c,t1,t2,t3,t4,t5 MEM_STAT_INFO)
3557
3558static inline tree
3559build5_stat_loc (location_t loc, enum tree_code code, tree type, tree arg0,
3560 tree arg1, tree arg2, tree arg3, tree arg4 MEM_STAT_DECL)
3561{
3562 tree t = build5_stat (code, type, arg0, arg1, arg2, arg3,
3563 arg4 PASS_MEM_STAT);
3564 if (CAN_HAVE_LOCATION_P (t))
3565 SET_EXPR_LOCATION (t, loc);
3566 return t;
3567}
3568#define build5_loc(l,c,t1,t2,t3,t4,t5,t6) \
3569 build5_stat_loc (l,c,t1,t2,t3,t4,t5,t6 MEM_STAT_INFO)
3570
9845d120 3571extern tree build_var_debug_value_stat (tree, tree MEM_STAT_DECL);
3572#define build_var_debug_value(t1,t2) \
3573 build_var_debug_value_stat (t1,t2 MEM_STAT_INFO)
3574
b79dc18a 3575/* Constructs double_int from tree CST. */
3576
b79dc18a 3577extern tree double_int_to_tree (tree, double_int);
796b6678 3578
796b6678 3579extern tree wide_int_to_tree (tree type, const wide_int_ref &cst);
3580extern tree force_fit_type (tree, const wide_int_ref &, int, bool);
b79dc18a 3581
d3bd87c3 3582/* Create an INT_CST node with a CST value zero extended. */
3583
e913b5cd 3584/* static inline */
7016c612 3585extern tree build_int_cst (tree, HOST_WIDE_INT);
e913b5cd 3586extern tree build_int_cstu (tree type, unsigned HOST_WIDE_INT cst);
dec41e98 3587extern tree build_int_cst_type (tree, HOST_WIDE_INT);
c7a1d251 3588extern tree make_vector_stat (unsigned MEM_STAT_DECL);
3589#define make_vector(n) make_vector_stat (n MEM_STAT_INFO)
fadf62f4 3590extern tree build_vector_stat (tree, tree * MEM_STAT_DECL);
3591#define build_vector(t,v) build_vector_stat (t, v MEM_STAT_INFO)
f1f41a6c 3592extern tree build_vector_from_ctor (tree, vec<constructor_elt, va_gc> *);
191b2c61 3593extern tree build_vector_from_val (tree, tree);
f1f41a6c 3594extern tree build_constructor (tree, vec<constructor_elt, va_gc> *);
c75b4594 3595extern tree build_constructor_single (tree, tree, tree);
3596extern tree build_constructor_from_list (tree, tree);
4fa680c3 3597extern tree build_constructor_va (tree, int, ...);
720082dc 3598extern tree build_real_from_int_cst (tree, const_tree);
60b8c5b3 3599extern tree build_complex (tree, tree, tree);
ba56cb50 3600extern tree build_one_cst (tree);
432dd330 3601extern tree build_minus_one_cst (tree);
2c83a45e 3602extern tree build_all_ones_cst (tree);
98d92e3c 3603extern tree build_zero_cst (tree);
60b8c5b3 3604extern tree build_string (int, const char *);
674b05f5 3605extern tree build_tree_list_stat (tree, tree MEM_STAT_DECL);
9af5ce0c 3606#define build_tree_list(t, q) build_tree_list_stat (t, q MEM_STAT_INFO)
f1f41a6c 3607extern tree build_tree_list_vec_stat (const vec<tree, va_gc> *MEM_STAT_DECL);
f352a3fb 3608#define build_tree_list_vec(v) build_tree_list_vec_stat (v MEM_STAT_INFO)
e60a6f7b 3609extern tree build_decl_stat (location_t, enum tree_code,
3610 tree, tree MEM_STAT_DECL);
7bd4091f 3611extern tree build_fn_decl (const char *, tree);
9af5ce0c 3612#define build_decl(l,c,t,q) build_decl_stat (l, c, t, q MEM_STAT_INFO)
23bdc9ca 3613extern tree build_translation_unit_decl (tree);
0a4b7550 3614extern tree build_block (tree, tree, tree, tree);
e60a6f7b 3615extern tree build_empty_stmt (location_t);
3616extern tree build_omp_clause (location_t, enum omp_clause_code);
d72a838e 3617
c2f47e15 3618extern tree build_vl_exp_stat (enum tree_code, int MEM_STAT_DECL);
9af5ce0c 3619#define build_vl_exp(c, n) build_vl_exp_stat (c, n MEM_STAT_INFO)
c2f47e15 3620
c2f47e15 3621extern tree build_call_nary (tree, tree, int, ...);
3622extern tree build_call_valist (tree, tree, int, va_list);
389dd41b 3623#define build_call_array(T1,T2,N,T3)\
3624 build_call_array_loc (UNKNOWN_LOCATION, T1, T2, N, T3)
3625extern tree build_call_array_loc (location_t, tree, tree, int, const tree *);
f1f41a6c 3626extern tree build_call_vec (tree, tree, vec<tree, va_gc> *);
f7715905 3627extern tree build_call_expr_loc_array (location_t, tree, int, tree *);
3628extern tree build_call_expr_loc_vec (location_t, tree, vec<tree, va_gc> *);
3629extern tree build_call_expr_loc (location_t, tree, int, ...);
3630extern tree build_call_expr (tree, int, ...);
3631extern tree build_string_literal (int, const char *);
c2f47e15 3632
d72a838e 3633/* Construct various nodes representing data types. */
3634
11773141 3635extern tree signed_or_unsigned_type_for (int, tree);
dbc64c75 3636extern tree signed_type_for (tree);
dec41e98 3637extern tree unsigned_type_for (tree);
f2c1848b 3638extern tree truth_type_for (tree);
b24423db 3639extern tree build_pointer_type_for_mode (tree, enum machine_mode, bool);
60b8c5b3 3640extern tree build_pointer_type (tree);
b24423db 3641extern tree build_reference_type_for_mode (tree, enum machine_mode, bool);
60b8c5b3 3642extern tree build_reference_type (tree);
4917c376 3643extern tree build_vector_type_for_mode (tree, enum machine_mode);
3644extern tree build_vector_type (tree innertype, int nunits);
8d125f7d 3645extern tree build_opaque_vector_type (tree innertype, int nunits);
60b8c5b3 3646extern tree build_index_type (tree);
60b8c5b3 3647extern tree build_array_type (tree, tree);
47c154d9 3648extern tree build_nonshared_array_type (tree, tree);
94b7b4dd 3649extern tree build_array_type_nelts (tree, unsigned HOST_WIDE_INT);
60b8c5b3 3650extern tree build_function_type (tree, tree);
3651extern tree build_function_type_list (tree, ...);
1c73f824 3652extern tree build_varargs_function_type_list (tree, ...);
5edc3af9 3653extern tree build_function_type_array (tree, int, tree *);
3654extern tree build_varargs_function_type_array (tree, int, tree *);
3655#define build_function_type_vec(RET, V) \
f1f41a6c 3656 build_function_type_array (RET, vec_safe_length (V), vec_safe_address (V))
5edc3af9 3657#define build_varargs_function_type_vec(RET, V) \
f1f41a6c 3658 build_varargs_function_type_array (RET, vec_safe_length (V), \
3659 vec_safe_address (V))
5bfb0742 3660extern tree build_method_type_directly (tree, tree, tree);
60b8c5b3 3661extern tree build_method_type (tree, tree);
3662extern tree build_offset_type (tree, tree);
3663extern tree build_complex_type (tree);
720082dc 3664extern tree array_type_nelts (const_tree);
60b8c5b3 3665
3666extern tree value_member (tree, tree);
720082dc 3667extern tree purpose_member (const_tree, tree);
f1f41a6c 3668extern bool vec_member (const_tree, vec<tree, va_gc> *);
7616de93 3669extern tree chain_index (int, tree);
908e5f41 3670
5493cb9a 3671extern int attribute_list_equal (const_tree, const_tree);
3672extern int attribute_list_contained (const_tree, const_tree);
720082dc 3673extern int tree_int_cst_equal (const_tree, const_tree);
d99d10ca 3674
031a4cb6 3675extern bool tree_fits_shwi_p (const_tree)
3676#ifndef ENABLE_TREE_CHECKING
3677 ATTRIBUTE_PURE /* tree_fits_shwi_p is pure only when checking is disabled. */
3678#endif
3679 ;
3680extern bool tree_fits_uhwi_p (const_tree)
3681#ifndef ENABLE_TREE_CHECKING
3682 ATTRIBUTE_PURE /* tree_fits_uhwi_p is pure only when checking is disabled. */
d6635d5c 3683#endif
3684 ;
b633e10e 3685extern HOST_WIDE_INT tree_to_shwi (const_tree);
aa59f000 3686extern unsigned HOST_WIDE_INT tree_to_uhwi (const_tree);
d6635d5c 3687#if !defined ENABLE_TREE_CHECKING && (GCC_VERSION >= 4003)
b633e10e 3688extern inline __attribute__ ((__gnu_inline__)) HOST_WIDE_INT
3689tree_to_shwi (const_tree t)
3690{
3691 gcc_assert (tree_fits_shwi_p (t));
08f4222b 3692 return TREE_INT_CST_LOW (t);
b633e10e 3693}
3694
aa59f000 3695extern inline __attribute__ ((__gnu_inline__)) unsigned HOST_WIDE_INT
b633e10e 3696tree_to_uhwi (const_tree t)
3697{
3698 gcc_assert (tree_fits_uhwi_p (t));
08f4222b 3699 return TREE_INT_CST_LOW (t);
b633e10e 3700}
d6635d5c 3701#endif
720082dc 3702extern int tree_int_cst_sgn (const_tree);
b7bf20db 3703extern int tree_int_cst_sign_bit (const_tree);
e913b5cd 3704extern unsigned int tree_int_cst_min_precision (tree, signop);
eec9c06d 3705extern tree strip_array_types (tree);
c6418a4e 3706extern tree excess_precision_type (tree);
85d86b55 3707extern bool valid_constant_size_p (const_tree);
9ed99284 3708
06f0b99c 3709
fb084c16 3710/* From expmed.c. Since rtl.h is included after tree.h, we can't
3711 put the prototype here. Rtl.h does declare the prototype if
3712 tree.h had been included. */
3713
60b8c5b3 3714extern tree make_tree (tree, rtx);
9ed99284 3715
a12eeaaf 3716/* Return a type like TTYPE except that its TYPE_ATTRIBUTES
3717 is ATTRIBUTE.
3718
3719 Such modified types already made are recorded so that duplicates
88b5b080 3720 are not made. */
a12eeaaf 3721
60b8c5b3 3722extern tree build_type_attribute_variant (tree, tree);
3723extern tree build_decl_attribute_variant (tree, tree);
e1f1071c 3724extern tree build_type_attribute_qual_variant (tree, tree, int);
a12eeaaf 3725
309303cf 3726/* Return 0 if the attributes for two types are incompatible, 1 if they
3727 are compatible, and 2 if they are nearly compatible (which causes a
3728 warning to be generated). */
3729extern int comp_type_attributes (const_tree, const_tree);
3730
ed5635e4 3731/* Default versions of target-overridable functions. */
60b8c5b3 3732extern tree merge_decl_attributes (tree, tree);
3733extern tree merge_type_attributes (tree, tree);
0bf60c2b 3734
c55c785f 3735/* This function is a private implementation detail of lookup_attribute()
3736 and you should never call it directly. */
3737extern tree private_lookup_attribute (const char *, size_t, tree);
3738
3739/* Given an attribute name ATTR_NAME and a list of attributes LIST,
3740 return a pointer to the attribute's list element if the attribute
3741 is part of the list, or NULL_TREE if not found. If the attribute
3742 appears more than once, this only returns the first occurrence; the
3743 TREE_CHAIN of the return value should be passed back in if further
3744 occurrences are wanted. ATTR_NAME must be in the form 'text' (not
3745 '__text__'). */
fe78f852 3746
c55c785f 3747static inline tree
3748lookup_attribute (const char *attr_name, tree list)
3749{
3750 gcc_checking_assert (attr_name[0] != '_');
3751 /* In most cases, list is NULL_TREE. */
3752 if (list == NULL_TREE)
3753 return NULL_TREE;
3754 else
3755 /* Do the strlen() before calling the out-of-line implementation.
3756 In most cases attr_name is a string constant, and the compiler
3757 will optimize the strlen() away. */
3758 return private_lookup_attribute (attr_name, strlen (attr_name), list);
3759}
fe78f852 3760
c55c785f 3761/* This function is a private implementation detail of
3762 is_attribute_p() and you should never call it directly. */
3763extern bool private_is_attribute_p (const char *, size_t, const_tree);
fe78f852 3764
c55c785f 3765/* Given an identifier node IDENT and a string ATTR_NAME, return true
3766 if the identifier node is a valid attribute name for the string.
3767 ATTR_NAME must be in the form 'text' (not '__text__'). IDENT could
3768 be the identifier for 'text' or for '__text__'. */
3769
3770static inline bool
3771is_attribute_p (const char *attr_name, const_tree ident)
3772{
3773 gcc_checking_assert (attr_name[0] != '_');
3774 /* Do the strlen() before calling the out-of-line implementation.
3775 In most cases attr_name is a string constant, and the compiler
3776 will optimize the strlen() away. */
3777 return private_is_attribute_p (attr_name, strlen (attr_name), ident);
3778}
4ab0a739 3779
6a47600c 3780/* Remove any instances of attribute ATTR_NAME in LIST and return the
c55c785f 3781 modified list. ATTR_NAME must be in the form 'text' (not
3782 '__text__'). */
6a47600c 3783
3784extern tree remove_attribute (const char *, tree);
3785
4ab0a739 3786/* Given two attributes lists, return a list of their union. */
3787
60b8c5b3 3788extern tree merge_attributes (tree, tree);
fe78f852 3789
3aa0c315 3790#if TARGET_DLLIMPORT_DECL_ATTRIBUTES
a767736d 3791/* Given two Windows decl attributes lists, possibly including
3792 dllimport, return a list of their union . */
60b8c5b3 3793extern tree merge_dllimport_decl_attributes (tree, tree);
3aa0c315 3794
3795/* Handle a "dllimport" or "dllexport" attribute. */
3796extern tree handle_dll_attribute (tree *, tree, tree, int, bool *);
a767736d 3797#endif
3798
e40000f4 3799/* Check whether CAND is suitable to be returned from get_qualified_type
3800 (BASE, TYPE_QUALS). */
3801
720082dc 3802extern bool check_qualified_type (const_tree, const_tree, int);
e40000f4 3803
051b8c96 3804/* Return a version of the TYPE, qualified as indicated by the
3805 TYPE_QUALS, if one exists. If no qualified version exists yet,
3806 return NULL_TREE. */
3807
60b8c5b3 3808extern tree get_qualified_type (tree, int);
051b8c96 3809
3810/* Like get_qualified_type, but creates the type if it does not
3811 exist. This function never returns NULL_TREE. */
a5b1863e 3812
60b8c5b3 3813extern tree build_qualified_type (tree, int);
a5b1863e 3814
5d9de213 3815/* Create a variant of type T with alignment ALIGN. */
3816
3817extern tree build_aligned_type (tree, unsigned int);
3818
a5b1863e 3819/* Like build_qualified_type, but only deals with the `const' and
3820 `volatile' qualifiers. This interface is retained for backwards
de132707 3821 compatibility with the various front-ends; new code should use
a5b1863e 3822 build_qualified_type instead. */
d72a838e 3823
a5b1863e 3824#define build_type_variant(TYPE, CONST_P, VOLATILE_P) \
76c6f48d 3825 build_qualified_type ((TYPE), \
a5b1863e 3826 ((CONST_P) ? TYPE_QUAL_CONST : 0) \
3827 | ((VOLATILE_P) ? TYPE_QUAL_VOLATILE : 0))
d72a838e 3828
11121344 3829/* Make a copy of a type node. */
3830
e086912e 3831extern tree build_distinct_type_copy (tree);
3832extern tree build_variant_type_copy (tree);
11121344 3833
d72a838e 3834/* Given a hashcode and a ..._TYPE node (for which the hashcode was made),
3835 return a canonicalized ..._TYPE node, so that duplicates are not made.
3836 How the hash code is computed is up to the caller, as long as any two
3837 callers that could hash identical-looking type nodes agree. */
3838
60b8c5b3 3839extern tree type_hash_canon (unsigned int, tree);
d72a838e 3840
60b8c5b3 3841extern tree convert (tree, tree);
720082dc 3842extern unsigned int expr_align (const_tree);
f8fd23c0 3843extern tree size_in_bytes (const_tree);
720082dc 3844extern HOST_WIDE_INT int_size_in_bytes (const_tree);
f8fd23c0 3845extern HOST_WIDE_INT max_int_size_in_bytes (const_tree);
720082dc 3846extern tree bit_position (const_tree);
3847extern HOST_WIDE_INT int_bit_position (const_tree);
3848extern tree byte_position (const_tree);
3849extern HOST_WIDE_INT int_byte_position (const_tree);
902de8ed 3850
748e5d45 3851#define sizetype sizetype_tab[(int) stk_sizetype]
3852#define bitsizetype sizetype_tab[(int) stk_bitsizetype]
3853#define ssizetype sizetype_tab[(int) stk_ssizetype]
3854#define sbitsizetype sizetype_tab[(int) stk_sbitsizetype]
748e5d45 3855#define size_int(L) size_int_kind (L, stk_sizetype)
3856#define ssize_int(L) size_int_kind (L, stk_ssizetype)
3857#define bitsize_int(L) size_int_kind (L, stk_bitsizetype)
3858#define sbitsize_int(L) size_int_kind (L, stk_sbitsizetype)
30384dcf 3859
d72a838e 3860/* Type for sizes of data-type. */
3861
30384dcf 3862#define BITS_PER_UNIT_LOG \
3863 ((BITS_PER_UNIT > 1) + (BITS_PER_UNIT > 2) + (BITS_PER_UNIT > 4) \
3864 + (BITS_PER_UNIT > 8) + (BITS_PER_UNIT > 16) + (BITS_PER_UNIT > 32) \
3865 + (BITS_PER_UNIT > 64) + (BITS_PER_UNIT > 128) + (BITS_PER_UNIT > 256))
3866
d72a838e 3867/* Concatenate two lists (chains of TREE_LIST nodes) X and Y
3868 by making the last node in X point to Y.
3869 Returns X, except if X is 0 returns Y. */
3870
60b8c5b3 3871extern tree chainon (tree, tree);
d72a838e 3872
3873/* Make a new TREE_LIST node from specified PURPOSE, VALUE and CHAIN. */
3874
674b05f5 3875extern tree tree_cons_stat (tree, tree, tree MEM_STAT_DECL);
3876#define tree_cons(t,q,w) tree_cons_stat (t,q,w MEM_STAT_INFO)
d72a838e 3877
3878/* Return the last tree node in a chain. */
3879
60b8c5b3 3880extern tree tree_last (tree);
d72a838e 3881
3882/* Reverse the order of elements in a chain, and return the new head. */
3883
60b8c5b3 3884extern tree nreverse (tree);
d72a838e 3885
3886/* Returns the length of a chain of nodes
3887 (number of chain pointers to follow before reaching a null pointer). */
3888
720082dc 3889extern int list_length (const_tree);
d72a838e 3890
8df5a43d 3891/* Returns the first FIELD_DECL in a type. */
3892
3893extern tree first_field (const_tree);
3894
e19896a4 3895/* Given an initializer INIT, return TRUE if INIT is zero or some
3896 aggregate of zeros. Otherwise return FALSE. */
3897
720082dc 3898extern bool initializer_zerop (const_tree);
e19896a4 3899
67f16f2b 3900/* Given a vector VEC, return its first element if all elements are
3901 the same. Otherwise return NULL_TREE. */
3902
3903extern tree uniform_vector_p (const_tree);
3904
f352a3fb 3905/* Given a CONSTRUCTOR CTOR, return the element values as a vector. */
3906
f1f41a6c 3907extern vec<tree, va_gc> *ctor_to_vec (tree);
f352a3fb 3908
778ac06a 3909/* integer_zerop (tree x) is nonzero if X is an integer constant of value 0. */
d72a838e 3910
720082dc 3911extern int integer_zerop (const_tree);
d72a838e 3912
778ac06a 3913/* integer_onep (tree x) is nonzero if X is an integer constant of value 1. */
d72a838e 3914
720082dc 3915extern int integer_onep (const_tree);
d72a838e 3916
3917/* integer_all_onesp (tree x) is nonzero if X is an integer constant
3918 all of whose significant bits are 1. */
3919
720082dc 3920extern int integer_all_onesp (const_tree);
d72a838e 3921
5a4f3016 3922/* integer_minus_onep (tree x) is nonzero if X is an integer constant of
3923 value -1. */
3924
3925extern int integer_minus_onep (const_tree);
3926
d72a838e 3927/* integer_pow2p (tree x) is nonzero is X is an integer constant with
3928 exactly one bit 1. */
3929
720082dc 3930extern int integer_pow2p (const_tree);
d72a838e 3931
805e22b2 3932/* integer_nonzerop (tree x) is nonzero if X is an integer constant
3933 with a nonzero value. */
3934
720082dc 3935extern int integer_nonzerop (const_tree);
805e22b2 3936
e1d65c9f 3937extern bool cst_and_fits_in_hwi (const_tree);
720082dc 3938extern tree num_ending_zeros (const_tree);
dec41e98 3939
06f0b99c 3940/* fixed_zerop (tree x) is nonzero if X is a fixed-point constant of
3941 value 0. */
3942
4dc2a232 3943extern int fixed_zerop (const_tree);
06f0b99c 3944
82e3f297 3945/* staticp (tree x) is nonzero if X is a reference to data allocated
3946 at a fixed address in memory. Returns the outermost data. */
d72a838e 3947
82e3f297 3948extern tree staticp (tree);
d72a838e 3949
d72a838e 3950/* save_expr (EXP) returns an expression equivalent to EXP
3951 but it can be used multiple times within context CTX
3952 and only evaluate EXP once. */
3953
60b8c5b3 3954extern tree save_expr (tree);
d72a838e 3955
3303f1bb 3956/* Look inside EXPR into any simple arithmetic operations. Return the
3957 outermost non-arithmetic or non-invariant node. */
414bee42 3958
60b8c5b3 3959extern tree skip_simple_arithmetic (tree);
414bee42 3960
3303f1bb 3961/* Look inside EXPR into simple arithmetic operations involving constants.
3962 Return the outermost non-arithmetic or non-constant node. */
3963
3964extern tree skip_simple_constant_arithmetic (tree);
3965
1f3233d1 3966/* Return which tree structure is used by T. */
3967
720082dc 3968enum tree_node_structure_enum tree_node_structure (const_tree);
1f3233d1 3969
91c9bb2d 3970/* Return true if EXP contains a PLACEHOLDER_EXPR, i.e. if it represents a
3971 size or offset that depends on a field within a record. */
9f354f8d 3972
b7bf20db 3973extern bool contains_placeholder_p (const_tree);
ce3fb06e 3974
3975/* This macro calls the above function but short-circuits the common
3976 case of a constant to save time. Also check for null. */
3977
3978#define CONTAINS_PLACEHOLDER_P(EXP) \
3979 ((EXP) != 0 && ! TREE_CONSTANT (EXP) && contains_placeholder_p (EXP))
3980
91c9bb2d 3981/* Return true if any part of the structure of TYPE involves a PLACEHOLDER_EXPR
3982 directly. This includes size, bounds, qualifiers (for QUAL_UNION_TYPE) and
3983 field positions. */
ce3fb06e 3984
60b8c5b3 3985extern bool type_contains_placeholder_p (tree);
9f354f8d 3986
9d75589a 3987/* Given a tree EXP, find all occurrences of references to fields
4189e677 3988 in a PLACEHOLDER_EXPR and place them in vector REFS without
3989 duplicates. Also record VAR_DECLs and CONST_DECLs. Note that
3990 we assume here that EXP contains only arithmetic expressions
3991 or CALL_EXPRs with PLACEHOLDER_EXPRs occurring only in their
3992 argument list. */
3993
f1f41a6c 3994extern void find_placeholder_in_expr (tree, vec<tree> *);
4189e677 3995
3996/* This macro calls the above function but short-circuits the common
3997 case of a constant to save time and also checks for NULL. */
3998
3999#define FIND_PLACEHOLDER_IN_EXPR(EXP, V) \
4000do { \
4001 if((EXP) && !TREE_CONSTANT (EXP)) \
4002 find_placeholder_in_expr (EXP, V); \
4003} while (0)
4004
9f354f8d 4005/* Given a tree EXP, a FIELD_DECL F, and a replacement value R,
4006 return a tree with all occurrences of references to F in a
4189e677 4007 PLACEHOLDER_EXPR replaced by R. Also handle VAR_DECLs and
4008 CONST_DECLs. Note that we assume here that EXP contains only
4009 arithmetic expressions or CALL_EXPRs with PLACEHOLDER_EXPRs
4010 occurring only in their argument list. */
9f354f8d 4011
60b8c5b3 4012extern tree substitute_in_expr (tree, tree, tree);
9f354f8d 4013
55f9d7dc 4014/* This macro calls the above function but short-circuits the common
4015 case of a constant to save time and also checks for NULL. */
4016
4017#define SUBSTITUTE_IN_EXPR(EXP, F, R) \
4018 ((EXP) == 0 || TREE_CONSTANT (EXP) ? (EXP) : substitute_in_expr (EXP, F, R))
4019
4020/* Similar, but look for a PLACEHOLDER_EXPR in EXP and find a replacement
4021 for it within OBJ, a tree that is an object or a chain of references. */
4022
4023extern tree substitute_placeholder_in_expr (tree, tree);
4024
4025/* This macro calls the above function but short-circuits the common
4026 case of a constant to save time and also checks for NULL. */
4027
4028#define SUBSTITUTE_PLACEHOLDER_IN_EXPR(EXP, OBJ) \
4029 ((EXP) == 0 || TREE_CONSTANT (EXP) ? (EXP) \
4030 : substitute_placeholder_in_expr (EXP, OBJ))
4031
654995a1 4032
845bebef 4033/* stabilize_reference (EXP) returns a reference equivalent to EXP
d72a838e 4034 but it can be used multiple times
4035 and only evaluate the subexpressions once. */
4036
60b8c5b3 4037extern tree stabilize_reference (tree);
d72a838e 4038
4039/* Return EXP, stripped of any conversions to wider types
4040 in such a way that the result of converting to type FOR_TYPE
4041 is the same as if EXP were converted to FOR_TYPE.
4042 If FOR_TYPE is 0, it signifies EXP's type. */
4043
60b8c5b3 4044extern tree get_unwidened (tree, tree);
d72a838e 4045
4046/* Return OP or a simpler expression for a narrower value
4047 which can be sign-extended or zero-extended to give back OP.
4048 Store in *UNSIGNEDP_PTR either 1 if the value should be zero-extended
4049 or 0 if the value should be sign-extended. */
4050
60b8c5b3 4051extern tree get_narrower (tree, int *);
d72a838e 4052
a306ee43 4053/* Return true if T is an expression that get_inner_reference handles. */
4054
a174b54d 4055static inline bool
4056handled_component_p (const_tree t)
4057{
4058 switch (TREE_CODE (t))
4059 {
a174b54d 4060 case COMPONENT_REF:
c165a033 4061 case BIT_FIELD_REF:
a174b54d 4062 case ARRAY_REF:
4063 case ARRAY_RANGE_REF:
a174b54d 4064 case REALPART_EXPR:
4065 case IMAGPART_EXPR:
c165a033 4066 case VIEW_CONVERT_EXPR:
a174b54d 4067 return true;
4068
4069 default:
4070 return false;
4071 }
4072}
a306ee43 4073
804dff30 4074/* Given a DECL or TYPE, return the scope in which it was declared, or
4075 NUL_TREE if there is no containing scope. */
4076
720082dc 4077extern tree get_containing_scope (const_tree);
804dff30 4078
d72a838e 4079/* Return the FUNCTION_DECL which provides this _DECL with its context,
4080 or zero if none. */
720082dc 4081extern tree decl_function_context (const_tree);
d72a838e 4082
7dd9d898 4083/* Return the RECORD_TYPE, UNION_TYPE, or QUAL_UNION_TYPE which provides
4084 this _DECL with its context, or zero if none. */
720082dc 4085extern tree decl_type_context (const_tree);
d72a838e 4086
03f2a1be 4087/* Return 1 if EXPR is the real constant zero. */
720082dc 4088extern int real_zerop (const_tree);
448e99f5 4089
4090/* Initialize the iterator I with arguments from function FNDECL */
4091
4092static inline void
0591727a 4093function_args_iter_init (function_args_iterator *i, const_tree fntype)
448e99f5 4094{
448e99f5 4095 i->next = TYPE_ARG_TYPES (fntype);
4096}
4097
4098/* Return a pointer that holds the next argument if there are more arguments to
4099 handle, otherwise return NULL. */
4100
4101static inline tree *
4102function_args_iter_cond_ptr (function_args_iterator *i)
4103{
4104 return (i->next) ? &TREE_VALUE (i->next) : NULL;
4105}
4106
4107/* Return the next argument if there are more arguments to handle, otherwise
4108 return NULL. */
4109
4110static inline tree
4111function_args_iter_cond (function_args_iterator *i)
4112{
4113 return (i->next) ? TREE_VALUE (i->next) : NULL_TREE;
4114}
4115
4116/* Advance to the next argument. */
4117static inline void
4118function_args_iter_next (function_args_iterator *i)
4119{
4120 gcc_assert (i->next != NULL_TREE);
4121 i->next = TREE_CHAIN (i->next);
4122}
4123
cee43f7e 4124/* We set BLOCK_SOURCE_LOCATION only to inlined function entry points. */
4125
4126static inline bool
4127inlined_function_outer_scope_p (const_tree block)
4128{
8e7408e3 4129 return LOCATION_LOCUS (BLOCK_SOURCE_LOCATION (block)) != UNKNOWN_LOCATION;
cee43f7e 4130}
4131
448e99f5 4132/* Loop over all function arguments of FNTYPE. In each iteration, PTR is set
4133 to point to the next tree element. ITER is an instance of
4134 function_args_iterator used to iterate the arguments. */
4135#define FOREACH_FUNCTION_ARGS_PTR(FNTYPE, PTR, ITER) \
4136 for (function_args_iter_init (&(ITER), (FNTYPE)); \
4137 (PTR = function_args_iter_cond_ptr (&(ITER))) != NULL; \
4138 function_args_iter_next (&(ITER)))
4139
4140/* Loop over all function arguments of FNTYPE. In each iteration, TREE is set
4141 to the next tree element. ITER is an instance of function_args_iterator
4142 used to iterate the arguments. */
4143#define FOREACH_FUNCTION_ARGS(FNTYPE, TREE, ITER) \
4144 for (function_args_iter_init (&(ITER), (FNTYPE)); \
4145 (TREE = function_args_iter_cond (&(ITER))) != NULL_TREE; \
4146 function_args_iter_next (&(ITER)))
4147
bb02c0b3 4148/* In tree.c */
eac18265 4149extern unsigned crc32_string (unsigned, const char *);
06306fd3 4150extern unsigned crc32_byte (unsigned, char);
267dc7fa 4151extern unsigned crc32_unsigned (unsigned, unsigned);
60b8c5b3 4152extern void clean_symbol_name (char *);
db85cc4f 4153extern tree get_file_function_name (const char *);
b7bf20db 4154extern tree get_callee_fndecl (const_tree);
720082dc 4155extern int type_num_arguments (const_tree);
21dff555 4156extern bool associative_tree_code (enum tree_code);
4157extern bool commutative_tree_code (enum tree_code);
00f4f705 4158extern bool commutative_ternary_tree_code (enum tree_code);
faab57e3 4159extern tree upper_bound_in_type (tree, tree);
4160extern tree lower_bound_in_type (tree, tree);
b7bf20db 4161extern int operand_equal_for_phi_arg_p (const_tree, const_tree);
e60a6f7b 4162extern tree create_artificial_label (location_t);
75a70cf9 4163extern const char *get_name (tree);
0591727a 4164extern bool stdarg_p (const_tree);
448e99f5 4165extern bool prototype_p (tree);
a8891ab1 4166extern bool is_typedef_decl (tree x);
4167extern bool typedef_variant_p (tree);
9f627b1a 4168extern bool auto_var_in_fn_p (const_tree, const_tree);
15155321 4169extern tree build_low_bits_mask (tree, unsigned);
98112881 4170extern tree tree_strip_nop_conversions (tree);
4171extern tree tree_strip_sign_nop_conversions (tree);
4c0315d0 4172extern const_tree strip_invariant_refs (const_tree);
58d82cd0 4173extern tree lhd_gcc_personality (void);
6816d0c4 4174extern void assign_assembler_name_if_neeeded (tree);
0e763b2a 4175extern void warn_deprecated_use (tree, tree);
8ceff600 4176extern void cache_integer_cst (tree);
6816d0c4 4177
4c0315d0 4178/* Compare and hash for any structure which begins with a canonical
4179 pointer. Assumes all pointers are interchangeable, which is sort
4180 of already assumed by gcc elsewhere IIRC. */
4181
4182static inline int
4183struct_ptr_eq (const void *a, const void *b)
4184{
4185 const void * const * x = (const void * const *) a;
4186 const void * const * y = (const void * const *) b;
4187 return *x == *y;
4188}
4189
4190static inline hashval_t
4191struct_ptr_hash (const void *a)
4192{
4193 const void * const * x = (const void * const *) a;
4194 return (intptr_t)*x >> 4;
4195}
4196
82012ffe 4197/* Return nonzero if CODE is a tree code that represents a truth value. */
4198static inline bool
4199truth_value_p (enum tree_code code)
4200{
4201 return (TREE_CODE_CLASS (code) == tcc_comparison
4202 || code == TRUTH_AND_EXPR || code == TRUTH_ANDIF_EXPR
4203 || code == TRUTH_OR_EXPR || code == TRUTH_ORIF_EXPR
4204 || code == TRUTH_XOR_EXPR || code == TRUTH_NOT_EXPR);
4205}
4206
a845d317 4207/* Return whether TYPE is a type suitable for an offset for
4208 a POINTER_PLUS_EXPR. */
4209static inline bool
4210ptrofftype_p (tree type)
4211{
4212 return (INTEGRAL_TYPE_P (type)
4213 && TYPE_PRECISION (type) == TYPE_PRECISION (sizetype)
4214 && TYPE_UNSIGNED (type) == TYPE_UNSIGNED (sizetype));
4215}
4216
a0553bff 4217/* Return OFF converted to a pointer offset type suitable as offset for
4218 POINTER_PLUS_EXPR. Use location LOC for this conversion. */
4219static inline tree
4220convert_to_ptrofftype_loc (location_t loc, tree off)
4221{
4222 return fold_convert_loc (loc, sizetype, off);
4223}
4224#define convert_to_ptrofftype(t) convert_to_ptrofftype_loc (UNKNOWN_LOCATION, t)
4225
2cc66f2a 4226/* Build and fold a POINTER_PLUS_EXPR at LOC offsetting PTR by OFF. */
4227static inline tree
4228fold_build_pointer_plus_loc (location_t loc, tree ptr, tree off)
4229{
4230 return fold_build2_loc (loc, POINTER_PLUS_EXPR, TREE_TYPE (ptr),
235620e5 4231 ptr, convert_to_ptrofftype_loc (loc, off));
2cc66f2a 4232}
4233#define fold_build_pointer_plus(p,o) \
4234 fold_build_pointer_plus_loc (UNKNOWN_LOCATION, p, o)
4235
4236/* Build and fold a POINTER_PLUS_EXPR at LOC offsetting PTR by OFF. */
4237static inline tree
4238fold_build_pointer_plus_hwi_loc (location_t loc, tree ptr, HOST_WIDE_INT off)
4239{
4240 return fold_build2_loc (loc, POINTER_PLUS_EXPR, TREE_TYPE (ptr),
4241 ptr, size_int (off));
4242}
4243#define fold_build_pointer_plus_hwi(p,o) \
4244 fold_build_pointer_plus_hwi_loc (UNKNOWN_LOCATION, p, o)
82012ffe 4245
60b8c5b3 4246extern tree strip_float_extensions (tree);
720082dc 4247extern int really_constant_p (const_tree);
c7d4e749 4248extern bool decl_address_invariant_p (const_tree);
b9c94ed7 4249extern bool decl_address_ip_invariant_p (const_tree);
a6caa15f 4250extern bool int_fits_type_p (const_tree, const_tree);
e506f1d4 4251#ifndef GENERATOR_FILE
1f1872fd 4252extern void get_type_static_bounds (const_tree, mpz_t, mpz_t);
e506f1d4 4253#endif
1f8a6ff8 4254extern bool variably_modified_type_p (tree, tree);
720082dc 4255extern int tree_log2 (const_tree);
4256extern int tree_floor_log2 (const_tree);
c8a2b4ff 4257extern unsigned int tree_ctz (const_tree);
b7bf20db 4258extern int simple_cst_equal (const_tree, const_tree);
720082dc 4259extern hashval_t iterative_hash_expr (const_tree, hashval_t);
591f01a8 4260extern hashval_t iterative_hash_host_wide_int (HOST_WIDE_INT, hashval_t);
f6c33c78 4261extern hashval_t iterative_hash_hashval_t (hashval_t, hashval_t);
34e5cced 4262extern hashval_t iterative_hash_host_wide_int (HOST_WIDE_INT, hashval_t);
720082dc 4263extern int compare_tree_int (const_tree, unsigned HOST_WIDE_INT);
b7bf20db 4264extern int type_list_equal (const_tree, const_tree);
720082dc 4265extern int chain_member (const_tree, const_tree);
60b8c5b3 4266extern void dump_tree_statistics (void);
750ad201 4267extern void recompute_tree_invariant_for_addr_expr (tree);
fb80456a 4268extern bool needs_to_live_in_memory (const_tree);
409a160c 4269extern tree reconstruct_complex_type (tree, tree);
720082dc 4270extern int real_onep (const_tree);
720082dc 4271extern int real_minus_onep (const_tree);
60b8c5b3 4272extern void init_ttree (void);
c38a75b7 4273extern void build_common_tree_nodes (bool, bool);
471eff36 4274extern void build_common_builtin_nodes (void);
4f7f7efd 4275extern tree build_nonstandard_integer_type (unsigned HOST_WIDE_INT, int);
60b8c5b3 4276extern tree build_range_type (tree, tree, tree);
47c154d9 4277extern tree build_nonshared_range_type (tree, tree, tree);
a9538d68 4278extern bool subrange_type_for_debug_p (const_tree, tree *, tree *);
720082dc 4279extern HOST_WIDE_INT int_cst_value (const_tree);
5169661d 4280extern tree tree_block (tree);
4281extern void tree_set_block (tree, tree);
1b16fc45 4282extern location_t *block_nonartificial_location (tree);
b430e8d9 4283extern location_t tree_nonartificial_location (tree);
15155321 4284extern tree block_ultimate_origin (const_tree);
6378ffb3 4285extern tree get_binfo_at_offset (tree, HOST_WIDE_INT, tree);
f5e35fed 4286extern bool virtual_method_call_p (tree);
fba0273a 4287extern tree obj_type_ref_class (tree ref);
7371d299 4288extern bool types_same_for_odr (tree type1, tree type2);
fb8b391e 4289extern bool contains_bitfld_component_ref_p (const_tree);
5514adf9 4290extern bool type_in_anonymous_namespace_p (tree);
0d9585ca 4291extern bool block_may_fallthru (const_tree);
4e57e76d 4292extern void using_eh_for_cleanups (void);
4293extern bool using_eh_for_cleanups_p (void);
f3d35d4d 4294extern const char *get_tree_code_name (enum tree_code);
9954b2fd 4295extern void set_call_expr_flags (tree, int);
20a8f962 4296extern tree walk_tree_1 (tree*, walk_tree_fn, void*, struct pointer_set_t*,
4297 walk_tree_lh);
4298extern tree walk_tree_without_duplicates_1 (tree*, walk_tree_fn, void*,
4299 walk_tree_lh);
4300#define walk_tree(a,b,c,d) \
4301 walk_tree_1 (a, b, c, d, NULL)
4302#define walk_tree_without_duplicates(a,b,c) \
4303 walk_tree_without_duplicates_1 (a, b, c, NULL)
1431bff6 4304
b04fab2a 4305extern tree get_base_address (tree t);
4a8f88ff 4306extern tree drop_tree_overflow (tree);
9af7fd5b 4307extern int tree_map_base_eq (const void *, const void *);
4308extern unsigned int tree_map_base_hash (const void *);
4309extern int tree_map_base_marked_p (const void *);
4310
9af7fd5b 4311#define tree_map_eq tree_map_base_eq
5ded8c6f 4312extern unsigned int tree_map_hash (const void *);
9af7fd5b 4313#define tree_map_marked_p tree_map_base_marked_p
4314
cc194b6e 4315#define tree_decl_map_eq tree_map_base_eq
4316extern unsigned int tree_decl_map_hash (const void *);
4317#define tree_decl_map_marked_p tree_map_base_marked_p
4318
9af7fd5b 4319#define tree_int_map_eq tree_map_base_eq
4320#define tree_int_map_hash tree_map_base_hash
4321#define tree_int_map_marked_p tree_map_base_marked_p
4322
9af7fd5b 4323#define tree_priority_map_eq tree_map_base_eq
4324#define tree_priority_map_hash tree_map_base_hash
4325#define tree_priority_map_marked_p tree_map_base_marked_p
bfd211a3 4326
841424cc 4327#define tree_vec_map_eq tree_map_base_eq
4328#define tree_vec_map_hash tree_decl_map_hash
4329#define tree_vec_map_marked_p tree_map_base_marked_p
4330
c2f47e15 4331/* Initialize the abstract argument list iterator object ITER with the
4332 arguments from CALL_EXPR node EXP. */
4333static inline void
4334init_call_expr_arg_iterator (tree exp, call_expr_arg_iterator *iter)
4335{
4336 iter->t = exp;
4337 iter->n = call_expr_nargs (exp);
4338 iter->i = 0;
4339}
4340
b7bf20db 4341static inline void
4342init_const_call_expr_arg_iterator (const_tree exp, const_call_expr_arg_iterator *iter)
4343{
4344 iter->t = exp;
4345 iter->n = call_expr_nargs (exp);
4346 iter->i = 0;
4347}
4348
c2f47e15 4349/* Return the next argument from abstract argument list iterator object ITER,
4350 and advance its state. Return NULL_TREE if there are no more arguments. */
4351static inline tree
4352next_call_expr_arg (call_expr_arg_iterator *iter)
4353{
4354 tree result;
4355 if (iter->i >= iter->n)
4356 return NULL_TREE;
4357 result = CALL_EXPR_ARG (iter->t, iter->i);
4358 iter->i++;
4359 return result;
4360}
4361
b7bf20db 4362static inline const_tree
4363next_const_call_expr_arg (const_call_expr_arg_iterator *iter)
4364{
4365 const_tree result;
4366 if (iter->i >= iter->n)
4367 return NULL_TREE;
4368 result = CALL_EXPR_ARG (iter->t, iter->i);
4369 iter->i++;
4370 return result;
4371}
4372
c2f47e15 4373/* Initialize the abstract argument list iterator object ITER, then advance
4374 past and return the first argument. Useful in for expressions, e.g.
4375 for (arg = first_call_expr_arg (exp, &iter); arg;
4376 arg = next_call_expr_arg (&iter)) */
4377static inline tree
4378first_call_expr_arg (tree exp, call_expr_arg_iterator *iter)
4379{
4380 init_call_expr_arg_iterator (exp, iter);
4381 return next_call_expr_arg (iter);
4382}
4383
b7bf20db 4384static inline const_tree
4385first_const_call_expr_arg (const_tree exp, const_call_expr_arg_iterator *iter)
4386{
4387 init_const_call_expr_arg_iterator (exp, iter);
4388 return next_const_call_expr_arg (iter);
4389}
4390
c2f47e15 4391/* Test whether there are more arguments in abstract argument list iterator
4392 ITER, without changing its state. */
4393static inline bool
4394more_call_expr_args_p (const call_expr_arg_iterator *iter)
4395{
4396 return (iter->i < iter->n);
4397}
4398
c2f47e15 4399/* Iterate through each argument ARG of CALL_EXPR CALL, using variable ITER
4400 (of type call_expr_arg_iterator) to hold the iteration state. */
4401#define FOR_EACH_CALL_EXPR_ARG(arg, iter, call) \
4402 for ((arg) = first_call_expr_arg ((call), &(iter)); (arg); \
4403 (arg) = next_call_expr_arg (&(iter)))
4404
b7bf20db 4405#define FOR_EACH_CONST_CALL_EXPR_ARG(arg, iter, call) \
4406 for ((arg) = first_const_call_expr_arg ((call), &(iter)); (arg); \
4407 (arg) = next_const_call_expr_arg (&(iter)))
4408
7bfefa9d 4409/* Return true if tree node T is a language-specific node. */
4410static inline bool
4411is_lang_specific (tree t)
4412{
4413 return TREE_CODE (t) == LANG_TYPE || TREE_CODE (t) >= NUM_TREE_CODES;
4414}
4415
b9a16870 4416/* Valid builtin number. */
4417#define BUILTIN_VALID_P(FNCODE) \
4418 (IN_RANGE ((int)FNCODE, ((int)BUILT_IN_NONE) + 1, ((int) END_BUILTINS) - 1))
4419
4420/* Return the tree node for an explicit standard builtin function or NULL. */
4421static inline tree
4422builtin_decl_explicit (enum built_in_function fncode)
4423{
4424 gcc_checking_assert (BUILTIN_VALID_P (fncode));
4425
4426 return builtin_info.decl[(size_t)fncode];
4427}
4428
4429/* Return the tree node for an implicit builtin function or NULL. */
4430static inline tree
4431builtin_decl_implicit (enum built_in_function fncode)
4432{
4433 size_t uns_fncode = (size_t)fncode;
4434 gcc_checking_assert (BUILTIN_VALID_P (fncode));
4435
4436 if (!builtin_info.implicit_p[uns_fncode])
4437 return NULL_TREE;
4438
4439 return builtin_info.decl[uns_fncode];
4440}
4441
4442/* Set explicit builtin function nodes and whether it is an implicit
4443 function. */
4444
4445static inline void
4446set_builtin_decl (enum built_in_function fncode, tree decl, bool implicit_p)
4447{
4448 size_t ufncode = (size_t)fncode;
4449
4450 gcc_checking_assert (BUILTIN_VALID_P (fncode)
4451 && (decl != NULL_TREE || !implicit_p));
4452
4453 builtin_info.decl[ufncode] = decl;
4454 builtin_info.implicit_p[ufncode] = implicit_p;
4455}
4456
4457/* Set the implicit flag for a builtin function. */
4458
4459static inline void
4460set_builtin_decl_implicit_p (enum built_in_function fncode, bool implicit_p)
4461{
4462 size_t uns_fncode = (size_t)fncode;
4463
4464 gcc_checking_assert (BUILTIN_VALID_P (fncode)
4465 && builtin_info.decl[uns_fncode] != NULL_TREE);
4466
4467 builtin_info.implicit_p[uns_fncode] = implicit_p;
4468}
4469
4470/* Return whether the standard builtin function can be used as an explicit
4471 function. */
4472
4473static inline bool
4474builtin_decl_explicit_p (enum built_in_function fncode)
4475{
4476 gcc_checking_assert (BUILTIN_VALID_P (fncode));
4477 return (builtin_info.decl[(size_t)fncode] != NULL_TREE);
4478}
4479
4480/* Return whether the standard builtin function can be used implicitly. */
4481
4482static inline bool
4483builtin_decl_implicit_p (enum built_in_function fncode)
4484{
4485 size_t uns_fncode = (size_t)fncode;
4486
4487 gcc_checking_assert (BUILTIN_VALID_P (fncode));
4488 return (builtin_info.decl[uns_fncode] != NULL_TREE
4489 && builtin_info.implicit_p[uns_fncode]);
4490}
4491
582791b0 4492/* Return true if T (assumed to be a DECL) is a global variable.
4493 A variable is considered global if its storage is not automatic. */
4494
4495static inline bool
4496is_global_var (const_tree t)
4497{
4498 return (TREE_STATIC (t) || DECL_EXTERNAL (t));
4499}
4500
4501/* Return true if VAR may be aliased. A variable is considered as
4502 maybe aliased if it has its address taken by the local TU
4503 or possibly by another TU and might be modified through a pointer. */
4504
4505static inline bool
4506may_be_aliased (const_tree var)
4507{
4508 return (TREE_CODE (var) != CONST_DECL
582791b0 4509 && (TREE_PUBLIC (var)
4510 || DECL_EXTERNAL (var)
e7e44439 4511 || TREE_ADDRESSABLE (var))
4512 && !((TREE_STATIC (var) || TREE_PUBLIC (var) || DECL_EXTERNAL (var))
4513 && ((TREE_READONLY (var)
4514 && !TYPE_NEEDS_CONSTRUCTING (TREE_TYPE (var)))
4515 || (TREE_CODE (var) == VAR_DECL
4516 && DECL_NONALIASED (var)))));
582791b0 4517}
4518
9c3a43b7 4519/* Return pointer to optimization flags of FNDECL. */
4520static inline struct cl_optimization *
4521opts_for_fn (const_tree fndecl)
4522{
4523 tree fn_opts = DECL_FUNCTION_SPECIFIC_OPTIMIZATION (fndecl);
4524 if (fn_opts == NULL_TREE)
4525 fn_opts = optimization_default_node;
4526 return TREE_OPTIMIZATION (fn_opts);
4527}
4528
4529/* opt flag for function FNDECL, e.g. opts_for_fn (fndecl, optimize) is
4530 the optimization level of function fndecl. */
4531#define opt_for_fn(fndecl, opt) (opts_for_fn (fndecl)->x_##opt)
4532
8ceff600 4533/* For anonymous aggregate types, we need some sort of name to
4534 hold on to. In practice, this should not appear, but it should
4535 not be harmful if it does. */
4536#ifndef NO_DOT_IN_LABEL
4537#define ANON_AGGRNAME_FORMAT "._%d"
4538#define ANON_AGGRNAME_P(ID_NODE) (IDENTIFIER_POINTER (ID_NODE)[0] == '.' \
4539 && IDENTIFIER_POINTER (ID_NODE)[1] == '_')
4540#else /* NO_DOT_IN_LABEL */
4541#ifndef NO_DOLLAR_IN_LABEL
4542#define ANON_AGGRNAME_FORMAT "$_%d"
4543#define ANON_AGGRNAME_P(ID_NODE) (IDENTIFIER_POINTER (ID_NODE)[0] == '$' \
4544 && IDENTIFIER_POINTER (ID_NODE)[1] == '_')
4545#else /* NO_DOLLAR_IN_LABEL */
4546#define ANON_AGGRNAME_PREFIX "__anon_"
4547#define ANON_AGGRNAME_P(ID_NODE) \
4548 (!strncmp (IDENTIFIER_POINTER (ID_NODE), ANON_AGGRNAME_PREFIX, \
4549 sizeof (ANON_AGGRNAME_PREFIX) - 1))
4550#define ANON_AGGRNAME_FORMAT "__anon_%d"
4551#endif /* NO_DOLLAR_IN_LABEL */
4552#endif /* NO_DOT_IN_LABEL */
4553
796b6678 4554/* The tree and const_tree overload templates. */
4555namespace wi
4556{
4557 template <>
4558 struct int_traits <const_tree>
4559 {
cc5bf449 4560 static const enum precision_type precision_type = VAR_PRECISION;
796b6678 4561 static const bool host_dependent_precision = false;
7acd91bc 4562 static const bool is_sign_extended = false;
796b6678 4563 static unsigned int get_precision (const_tree);
4564 static wi::storage_ref decompose (HOST_WIDE_INT *, unsigned int,
4565 const_tree);
4566 };
4567
4568 template <>
4569 struct int_traits <tree> : public int_traits <const_tree> {};
cc5bf449 4570
4571 template <int N>
4572 class extended_tree
4573 {
4574 private:
4575 const_tree m_t;
4576
4577 public:
4578 extended_tree (const_tree);
4579
4580 unsigned int get_precision () const;
4581 const HOST_WIDE_INT *get_val () const;
4582 unsigned int get_len () const;
4583 };
4584
cc5bf449 4585 template <int N>
4586 struct int_traits <extended_tree <N> >
4587 {
4588 static const enum precision_type precision_type = CONST_PRECISION;
4589 static const bool host_dependent_precision = false;
7acd91bc 4590 static const bool is_sign_extended = true;
cc5bf449 4591 static const unsigned int precision = N;
4592 };
4593
84014c53 4594 generic_wide_int <extended_tree <WIDE_INT_MAX_PRECISION> >
5de9d3ed 4595 to_widest (const_tree);
cc5bf449 4596
5de9d3ed 4597 generic_wide_int <extended_tree <ADDR_MAX_PRECISION> > to_offset (const_tree);
796b6678 4598}
4599
4600inline unsigned int
4601wi::int_traits <const_tree>::get_precision (const_tree tcst)
4602{
4603 return TYPE_PRECISION (TREE_TYPE (tcst));
4604}
4605
2e9ff529 4606/* Convert the tree_cst X into a wide_int of PRECISION. */
796b6678 4607inline wi::storage_ref
5b2cae25 4608wi::int_traits <const_tree>::decompose (HOST_WIDE_INT *,
796b6678 4609 unsigned int precision, const_tree x)
4610{
271e739a 4611 return wi::storage_ref (&TREE_INT_CST_ELT (x, 0), TREE_INT_CST_NUNITS (x),
4612 precision);
796b6678 4613}
4614
84014c53 4615inline generic_wide_int <wi::extended_tree <WIDE_INT_MAX_PRECISION> >
5de9d3ed 4616wi::to_widest (const_tree t)
cc5bf449 4617{
4618 return t;
4619}
4620
4621inline generic_wide_int <wi::extended_tree <ADDR_MAX_PRECISION> >
5de9d3ed 4622wi::to_offset (const_tree t)
cc5bf449 4623{
4624 return t;
4625}
4626
4627template <int N>
4628inline wi::extended_tree <N>::extended_tree (const_tree t)
4629 : m_t (t)
4630{
4631 gcc_checking_assert (TYPE_PRECISION (TREE_TYPE (t)) <= N);
4632}
4633
4634template <int N>
4635inline unsigned int
4636wi::extended_tree <N>::get_precision () const
4637{
4638 return N;
4639}
4640
4641template <int N>
4642inline const HOST_WIDE_INT *
4643wi::extended_tree <N>::get_val () const
4644{
4645 return &TREE_INT_CST_ELT (m_t, 0);
4646}
4647
4648template <int N>
4649inline unsigned int
4650wi::extended_tree <N>::get_len () const
4651{
01583702 4652 if (N == ADDR_MAX_PRECISION)
4653 return TREE_INT_CST_OFFSET_NUNITS (m_t);
84014c53 4654 else if (N >= WIDE_INT_MAX_PRECISION)
271e739a 4655 return TREE_INT_CST_EXT_NUNITS (m_t);
4656 else
01583702 4657 /* This class is designed to be used for specific output precisions
4658 and needs to be as fast as possible, so there is no fallback for
4659 other casees. */
4660 gcc_unreachable ();
cc5bf449 4661}
4662
796b6678 4663namespace wi
4664{
796b6678 4665 template <typename T>
4666 bool fits_to_tree_p (const T &x, const_tree);
4667
4668 wide_int min_value (const_tree);
4669 wide_int max_value (const_tree);
4670 wide_int from_mpz (const_tree, mpz_t, bool);
4671}
4672
796b6678 4673template <typename T>
4674bool
4675wi::fits_to_tree_p (const T &x, const_tree type)
4676{
4677 if (TYPE_SIGN (type) == UNSIGNED)
ab2c1de8 4678 return eq_p (x, zext (x, TYPE_PRECISION (type)));
796b6678 4679 else
ab2c1de8 4680 return eq_p (x, sext (x, TYPE_PRECISION (type)));
796b6678 4681}
4682
4683/* Produce the smallest number that is represented in TYPE. The precision
4684 and sign are taken from TYPE. */
4685inline wide_int
4686wi::min_value (const_tree type)
4687{
4688 return min_value (TYPE_PRECISION (type), TYPE_SIGN (type));
4689}
4690
4691/* Produce the largest number that is represented in TYPE. The precision
4692 and sign are taken from TYPE. */
4693inline wide_int
4694wi::max_value (const_tree type)
4695{
4696 return max_value (TYPE_PRECISION (type), TYPE_SIGN (type));
4697}
8ceff600 4698
d99d10ca 4699/* Return true if INTEGER_CST T1 is less than INTEGER_CST T2,
4700 extending both according to their respective TYPE_SIGNs. */
4701
4702inline bool
4703tree_int_cst_lt (const_tree t1, const_tree t2)
4704{
4705 return wi::lts_p (wi::to_widest (t1), wi::to_widest (t2));
4706}
4707
4708/* Return true if INTEGER_CST T1 is less than or equal to INTEGER_CST T2,
4709 extending both according to their respective TYPE_SIGNs. */
4710
4711inline bool
4712tree_int_cst_le (const_tree t1, const_tree t2)
4713{
4714 return wi::les_p (wi::to_widest (t1), wi::to_widest (t2));
4715}
4716
4717/* Returns -1 if T1 < T2, 0 if T1 == T2, and 1 if T1 > T2. T1 and T2
4718 are both INTEGER_CSTs and their values are extended according to their
4719 respective TYPE_SIGNs. */
4720
4721inline int
4722tree_int_cst_compare (const_tree t1, const_tree t2)
4723{
4724 return wi::cmps (wi::to_widest (t1), wi::to_widest (t2));
4725}
4726
9ed99284 4727/* FIXME - These declarations belong in builtins.h, expr.h and emit-rtl.h,
4728 but none of these files are allowed to be included from front ends.
4729 They should be split in two. One suitable for the FEs, the other suitable
4730 for the BE. */
4731
4732/* Assign the RTX to declaration. */
4733extern void set_decl_rtl (tree, rtx);
4734extern bool complete_ctor_at_level_p (const_tree, HOST_WIDE_INT, const_tree);
4735
4736/* Return a tree representing the upper bound of the array mentioned in
4737 EXP, an ARRAY_REF or an ARRAY_RANGE_REF. */
4738extern tree array_ref_up_bound (tree);
4739
4740extern tree build_personality_function (const char *);
4741
4742/* Given an expression EXP that is a handled_component_p,
4743 look for the ultimate containing object, which is returned and specify
4744 the access position and size. */
4745extern tree get_inner_reference (tree, HOST_WIDE_INT *, HOST_WIDE_INT *,
4746 tree *, enum machine_mode *, int *, int *,
4747 bool);
4748
4749/* Return a tree representing the lower bound of the array mentioned in
4750 EXP, an ARRAY_REF or an ARRAY_RANGE_REF. */
4751extern tree array_ref_low_bound (tree);
4752
b229f760 4753#endif /* GCC_TREE_H */