118334Speter/* Front-end tree definitions for GNU compiler.
290075Sobrien   Copyright (C) 1989, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
3169689Skan   2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
418334Speter
590075SobrienThis file is part of GCC.
618334Speter
790075SobrienGCC is free software; you can redistribute it and/or modify it under
890075Sobrienthe terms of the GNU General Public License as published by the Free
990075SobrienSoftware Foundation; either version 2, or (at your option) any later
1090075Sobrienversion.
1118334Speter
1290075SobrienGCC is distributed in the hope that it will be useful, but WITHOUT ANY
1390075SobrienWARRANTY; without even the implied warranty of MERCHANTABILITY or
1490075SobrienFITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
1590075Sobrienfor more details.
1618334Speter
1718334SpeterYou should have received a copy of the GNU General Public License
1890075Sobrienalong with GCC; see the file COPYING.  If not, write to the Free
19169689SkanSoftware Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
20169689Skan02110-1301, USA.  */
2118334Speter
22117395Skan#ifndef GCC_TREE_H
23117395Skan#define GCC_TREE_H
24117395Skan
25223262Sbenl#include <sys/param.h>
26223262Sbenl#ifndef __PAST_END
27223262Sbenl# define __PAST_END(array, offset) (((typeof(*(array)) *)(array))[offset])
28223262Sbenl#endif
29223262Sbenl
30169689Skan#include "hashtab.h"
3118334Speter#include "machmode.h"
32132718Skan#include "input.h"
33169689Skan#include "statistics.h"
34169689Skan#include "vec.h"
3518334Speter
3618334Speter/* Codes of tree nodes */
3718334Speter
3818334Speter#define DEFTREECODE(SYM, STRING, TYPE, NARGS)   SYM,
3918334Speter
4018334Speterenum tree_code {
4118334Speter#include "tree.def"
4218334Speter
4318334Speter  LAST_AND_UNUSED_TREE_CODE	/* A convenient way to get a value for
44169689Skan				   NUM_TREE_CODES.  */
4518334Speter};
4618334Speter
4718334Speter#undef DEFTREECODE
4818334Speter
49169689Skanextern unsigned char tree_contains_struct[256][64];
50169689Skan#define CODE_CONTAINS_STRUCT(CODE, STRUCT) (tree_contains_struct[(CODE)][(STRUCT)])
51169689Skan
5290075Sobrien/* Number of language-independent tree codes.  */
5390075Sobrien#define NUM_TREE_CODES ((int) LAST_AND_UNUSED_TREE_CODE)
5418334Speter
55169689Skan/* Tree code classes.  */
5618334Speter
57169689Skan/* Each tree_code has an associated code class represented by a
58169689Skan   TREE_CODE_CLASS.  */
59169689Skan
60169689Skanenum tree_code_class {
61169689Skan  tcc_exceptional, /* An exceptional code (fits no category).  */
62169689Skan  tcc_constant,    /* A constant.  */
63169689Skan  /* Order of tcc_type and tcc_declaration is important.  */
64169689Skan  tcc_type,        /* A type object code.  */
65169689Skan  tcc_declaration, /* A declaration (also serving as variable refs).  */
66169689Skan  tcc_reference,   /* A reference to storage.  */
67169689Skan  tcc_comparison,  /* A comparison expression.  */
68169689Skan  tcc_unary,       /* A unary arithmetic expression.  */
69169689Skan  tcc_binary,      /* A binary arithmetic expression.  */
70169689Skan  tcc_statement,   /* A statement expression, which have side effects
71169689Skan		      but usually no interesting value.  */
72169689Skan  tcc_expression   /* Any other expression.  */
73169689Skan};
74169689Skan
75169689Skan/* Each tree code class has an associated string representation.
76169689Skan   These must correspond to the tree_code_class entries.  */
77169689Skan
78169689Skanextern const char *const tree_code_class_strings[];
79169689Skan
80169689Skan/* Returns the string representing CLASS.  */
81169689Skan
82169689Skan#define TREE_CODE_CLASS_STRING(CLASS)\
83169689Skan        tree_code_class_strings[(int) (CLASS)]
84169689Skan
8550397Sobrien#define MAX_TREE_CODES 256
86169689Skanextern const enum tree_code_class tree_code_type[];
8750397Sobrien#define TREE_CODE_CLASS(CODE)	tree_code_type[(int) (CODE)]
8818334Speter
89169689Skan/* Nonzero if CODE represents an exceptional code.  */
90169689Skan
91169689Skan#define EXCEPTIONAL_CLASS_P(CODE)\
92169689Skan	(TREE_CODE_CLASS (TREE_CODE (CODE)) == tcc_exceptional)
93169689Skan
94169689Skan/* Nonzero if CODE represents a constant.  */
95169689Skan
96169689Skan#define CONSTANT_CLASS_P(CODE)\
97169689Skan	(TREE_CODE_CLASS (TREE_CODE (CODE)) == tcc_constant)
98169689Skan
99169689Skan/* Nonzero if CODE represents a type.  */
100169689Skan
101169689Skan#define TYPE_P(CODE)\
102169689Skan	(TREE_CODE_CLASS (TREE_CODE (CODE)) == tcc_type)
103169689Skan
104169689Skan/* Nonzero if CODE represents a declaration.  */
105169689Skan
106169689Skan#define DECL_P(CODE)\
107169689Skan        (TREE_CODE_CLASS (TREE_CODE (CODE)) == tcc_declaration)
108169689Skan
109169689Skan/* Nonzero if CODE represents a memory tag.  */
110169689Skan
111169689Skan#define MTAG_P(CODE) \
112169689Skan  (TREE_CODE (CODE) == STRUCT_FIELD_TAG		\
113169689Skan   || TREE_CODE (CODE) == NAME_MEMORY_TAG	\
114169689Skan   || TREE_CODE (CODE) == SYMBOL_MEMORY_TAG)
115169689Skan
116169689Skan
117169689Skan/* Nonzero if DECL represents a VAR_DECL or FUNCTION_DECL.  */
118169689Skan
119169689Skan#define VAR_OR_FUNCTION_DECL_P(DECL)\
120169689Skan  (TREE_CODE (DECL) == VAR_DECL || TREE_CODE (DECL) == FUNCTION_DECL)
121169689Skan
122169689Skan/* Nonzero if CODE represents a INDIRECT_REF.  Keep these checks in
123169689Skan   ascending code order.  */
124169689Skan
125169689Skan#define INDIRECT_REF_P(CODE)\
126169689Skan  (TREE_CODE (CODE) == INDIRECT_REF \
127169689Skan   || TREE_CODE (CODE) == ALIGN_INDIRECT_REF \
128169689Skan   || TREE_CODE (CODE) == MISALIGNED_INDIRECT_REF)
129169689Skan
130169689Skan/* Nonzero if CODE represents a reference.  */
131169689Skan
132169689Skan#define REFERENCE_CLASS_P(CODE)\
133169689Skan	(TREE_CODE_CLASS (TREE_CODE (CODE)) == tcc_reference)
134169689Skan
135169689Skan/* Nonzero if CODE represents a comparison.  */
136169689Skan
137169689Skan#define COMPARISON_CLASS_P(CODE)\
138169689Skan	(TREE_CODE_CLASS (TREE_CODE (CODE)) == tcc_comparison)
139169689Skan
140169689Skan/* Nonzero if CODE represents a unary arithmetic expression.  */
141169689Skan
142169689Skan#define UNARY_CLASS_P(CODE)\
143169689Skan	(TREE_CODE_CLASS (TREE_CODE (CODE)) == tcc_unary)
144169689Skan
145169689Skan/* Nonzero if CODE represents a binary arithmetic expression.  */
146169689Skan
147169689Skan#define BINARY_CLASS_P(CODE)\
148169689Skan	(TREE_CODE_CLASS (TREE_CODE (CODE)) == tcc_binary)
149169689Skan
150169689Skan/* Nonzero if CODE represents a statement expression.  */
151169689Skan
152169689Skan#define STATEMENT_CLASS_P(CODE)\
153169689Skan	(TREE_CODE_CLASS (TREE_CODE (CODE)) == tcc_statement)
154169689Skan
155169689Skan/* Nonzero if CODE represents any other expression.  */
156169689Skan
157169689Skan#define EXPRESSION_CLASS_P(CODE)\
158169689Skan	(TREE_CODE_CLASS (TREE_CODE (CODE)) == tcc_expression)
159169689Skan
160169689Skan/* Returns nonzero iff CODE represents a type or declaration.  */
161169689Skan
162169689Skan#define IS_TYPE_OR_DECL_P(CODE)\
163169689Skan	(TYPE_P (CODE) || DECL_P (CODE))
164169689Skan
165117395Skan/* Returns nonzero iff CLASS is the tree-code class of an
16650397Sobrien   expression.  */
16750397Sobrien
168169689Skan#define IS_EXPR_CODE_CLASS(CLASS)\
169169689Skan	((CLASS) >= tcc_reference && (CLASS) <= tcc_expression)
17050397Sobrien
171132718Skan/* Returns nonzero iff NODE is an expression of some kind.  */
172132718Skan
173132718Skan#define EXPR_P(NODE) IS_EXPR_CODE_CLASS (TREE_CODE_CLASS (TREE_CODE (NODE)))
174132718Skan
175169689Skan/* Returns nonzero iff NODE is an OpenMP directive.  */
176169689Skan
177169689Skan#define OMP_DIRECTIVE_P(NODE)				\
178169689Skan    (TREE_CODE (NODE) == OMP_PARALLEL			\
179169689Skan     || TREE_CODE (NODE) == OMP_FOR			\
180169689Skan     || TREE_CODE (NODE) == OMP_SECTIONS		\
181169689Skan     || TREE_CODE (NODE) == OMP_SINGLE			\
182169689Skan     || TREE_CODE (NODE) == OMP_SECTION			\
183169689Skan     || TREE_CODE (NODE) == OMP_MASTER			\
184169689Skan     || TREE_CODE (NODE) == OMP_ORDERED			\
185169689Skan     || TREE_CODE (NODE) == OMP_CRITICAL		\
186169689Skan     || TREE_CODE (NODE) == OMP_RETURN			\
187169689Skan     || TREE_CODE (NODE) == OMP_CONTINUE)
188169689Skan
18918334Speter/* Number of argument-words in each kind of tree-node.  */
19018334Speter
191117395Skanextern const unsigned char tree_code_length[];
19290075Sobrien#define TREE_CODE_LENGTH(CODE)	tree_code_length[(int) (CODE)]
19318334Speter
19418334Speter/* Names of tree components.  */
19518334Speter
196117395Skanextern const char *const tree_code_name[];
197169689Skan
198169689Skan/* A vectors of trees.  */
199169689SkanDEF_VEC_P(tree);
200169689SkanDEF_VEC_ALLOC_P(tree,gc);
201169689SkanDEF_VEC_ALLOC_P(tree,heap);
202169689Skan
20318334Speter
20490075Sobrien/* Classify which part of the compiler has defined a given builtin function.
20590075Sobrien   Note that we assume below that this is no more than two bits.  */
20690075Sobrienenum built_in_class
20790075Sobrien{
20890075Sobrien  NOT_BUILT_IN = 0,
20990075Sobrien  BUILT_IN_FRONTEND,
21090075Sobrien  BUILT_IN_MD,
21190075Sobrien  BUILT_IN_NORMAL
21290075Sobrien};
21390075Sobrien
21490075Sobrien/* Names for the above.  */
21590075Sobrienextern const char *const built_in_class_names[4];
21690075Sobrien
21718334Speter/* Codes that identify the various built in functions
21818334Speter   so that expand_call can identify them quickly.  */
21918334Speter
220169689Skan#define DEF_BUILTIN(ENUM, N, C, T, LT, B, F, NA, AT, IM, COND) ENUM,
22118334Speterenum built_in_function
22218334Speter{
22390075Sobrien#include "builtins.def"
22418334Speter
225169689Skan  /* Complex division routines in libgcc.  These are done via builtins
226169689Skan     because emit_library_call_value can't handle complex values.  */
227169689Skan  BUILT_IN_COMPLEX_MUL_MIN,
228169689Skan  BUILT_IN_COMPLEX_MUL_MAX
229169689Skan    = BUILT_IN_COMPLEX_MUL_MIN
230169689Skan      + MAX_MODE_COMPLEX_FLOAT
231169689Skan      - MIN_MODE_COMPLEX_FLOAT,
232169689Skan
233169689Skan  BUILT_IN_COMPLEX_DIV_MIN,
234169689Skan  BUILT_IN_COMPLEX_DIV_MAX
235169689Skan    = BUILT_IN_COMPLEX_DIV_MIN
236169689Skan      + MAX_MODE_COMPLEX_FLOAT
237169689Skan      - MIN_MODE_COMPLEX_FLOAT,
238169689Skan
23990075Sobrien  /* Upper bound on non-language-specific builtins.  */
24090075Sobrien  END_BUILTINS
24190075Sobrien};
24290075Sobrien#undef DEF_BUILTIN
24350397Sobrien
24490075Sobrien/* Names for the above.  */
245169689Skanextern const char * built_in_names[(int) END_BUILTINS];
24618334Speter
247169689Skan/* Helper macros for math builtins.  */
248169689Skan
249169689Skan#define BUILTIN_EXP10_P(FN) \
250169689Skan ((FN) == BUILT_IN_EXP10 || (FN) == BUILT_IN_EXP10F || (FN) == BUILT_IN_EXP10L \
251169689Skan  || (FN) == BUILT_IN_POW10 || (FN) == BUILT_IN_POW10F || (FN) == BUILT_IN_POW10L)
252169689Skan
253169689Skan#define BUILTIN_EXPONENT_P(FN) (BUILTIN_EXP10_P (FN) \
254169689Skan  || (FN) == BUILT_IN_EXP || (FN) == BUILT_IN_EXPF || (FN) == BUILT_IN_EXPL \
255169689Skan  || (FN) == BUILT_IN_EXP2 || (FN) == BUILT_IN_EXP2F || (FN) == BUILT_IN_EXP2L)
256169689Skan
257169689Skan#define BUILTIN_SQRT_P(FN) \
258169689Skan ((FN) == BUILT_IN_SQRT || (FN) == BUILT_IN_SQRTF || (FN) == BUILT_IN_SQRTL)
259169689Skan
260169689Skan#define BUILTIN_CBRT_P(FN) \
261169689Skan ((FN) == BUILT_IN_CBRT || (FN) == BUILT_IN_CBRTF || (FN) == BUILT_IN_CBRTL)
262169689Skan
263169689Skan#define BUILTIN_ROOT_P(FN) (BUILTIN_SQRT_P (FN) || BUILTIN_CBRT_P (FN))
264169689Skan
265169689Skan#define CASE_FLT_FN(FN) case FN: case FN##F: case FN##L
266169689Skan#define CASE_INT_FN(FN) case FN: case FN##L: case FN##LL
267169689Skan
26890075Sobrien/* An array of _DECL trees for the above.  */
269132718Skanextern GTY(()) tree built_in_decls[(int) END_BUILTINS];
270132718Skanextern GTY(()) tree implicit_built_in_decls[(int) END_BUILTINS];
27118334Speter
272169689Skan/* In an OMP_CLAUSE node.  */
273169689Skan
274169689Skan/* Number of operands and names for each clause.  */
275169689Skanextern unsigned const char omp_clause_num_ops[];
276169689Skanextern const char * const omp_clause_code_name[];
277169689Skan
278169689Skan/* Clause codes.  Do not reorder, as this is used to index into the tables
279169689Skan   omp_clause_num_ops and omp_clause_code_name.  */
280169689Skanenum omp_clause_code
281169689Skan{
282169689Skan  /* Clause zero is special-cased inside the parser
283169689Skan     (c_parser_omp_variable_list).  */
284169689Skan  OMP_CLAUSE_ERROR = 0,
285169689Skan
286169689Skan  /* OpenMP clause: private (variable_list).  */
287169689Skan  OMP_CLAUSE_PRIVATE,
288169689Skan
289169689Skan  /* OpenMP clause: shared (variable_list).  */
290169689Skan  OMP_CLAUSE_SHARED,
291169689Skan
292169689Skan  /* OpenMP clause: firstprivate (variable_list).  */
293169689Skan  OMP_CLAUSE_FIRSTPRIVATE,
294169689Skan
295169689Skan  /* OpenMP clause: lastprivate (variable_list).  */
296169689Skan  OMP_CLAUSE_LASTPRIVATE,
297169689Skan
298169689Skan  /* OpenMP clause: reduction (operator:variable_list).
299169689Skan     OMP_CLAUSE_REDUCTION_CODE: The tree_code of the operator.
300169689Skan     Operand 1: OMP_CLAUSE_REDUCTION_INIT: Stmt-list to initialize the var.
301169689Skan     Operand 2: OMP_CLAUSE_REDUCTION_MERGE: Stmt-list to merge private var
302169689Skan                into the shared one.
303169689Skan     Operand 3: OMP_CLAUSE_REDUCTION_PLACEHOLDER: A dummy VAR_DECL
304169689Skan                placeholder used in OMP_CLAUSE_REDUCTION_MERGE.  */
305169689Skan  OMP_CLAUSE_REDUCTION,
306169689Skan
307169689Skan  /* OpenMP clause: copyin (variable_list).  */
308169689Skan  OMP_CLAUSE_COPYIN,
309169689Skan
310169689Skan  /* OpenMP clause: copyprivate (variable_list).  */
311169689Skan  OMP_CLAUSE_COPYPRIVATE,
312169689Skan
313169689Skan  /* OpenMP clause: if (scalar-expression).  */
314169689Skan  OMP_CLAUSE_IF,
315169689Skan
316169689Skan  /* OpenMP clause: num_threads (integer-expression).  */
317169689Skan  OMP_CLAUSE_NUM_THREADS,
318169689Skan
319169689Skan  /* OpenMP clause: schedule.  */
320169689Skan  OMP_CLAUSE_SCHEDULE,
321169689Skan
322169689Skan  /* OpenMP clause: nowait.  */
323169689Skan  OMP_CLAUSE_NOWAIT,
324169689Skan
325169689Skan  /* OpenMP clause: ordered.  */
326169689Skan  OMP_CLAUSE_ORDERED,
327169689Skan
328169689Skan  /* OpenMP clause: default.  */
329169689Skan  OMP_CLAUSE_DEFAULT
330169689Skan};
331169689Skan
33218334Speter/* The definition of tree nodes fills the next several pages.  */
33318334Speter
33418334Speter/* A tree node can represent a data type, a variable, an expression
33518334Speter   or a statement.  Each node has a TREE_CODE which says what kind of
33618334Speter   thing it represents.  Some common codes are:
33718334Speter   INTEGER_TYPE -- represents a type of integers.
33818334Speter   ARRAY_TYPE -- represents a type of pointer.
33918334Speter   VAR_DECL -- represents a declared variable.
34018334Speter   INTEGER_CST -- represents a constant integer value.
34118334Speter   PLUS_EXPR -- represents a sum (an expression).
34218334Speter
34318334Speter   As for the contents of a tree node: there are some fields
34418334Speter   that all nodes share.  Each TREE_CODE has various special-purpose
34518334Speter   fields as well.  The fields of a node are never accessed directly,
34618334Speter   always through accessor macros.  */
34718334Speter
34818334Speter/* Every kind of tree node starts with this structure,
34918334Speter   so all nodes have these fields.
35018334Speter
35190075Sobrien   See the accessor macros, defined below, for documentation of the
35290075Sobrien   fields.  */
353169689Skanunion tree_ann_d;
35418334Speter
355117395Skanstruct tree_common GTY(())
35618334Speter{
35790075Sobrien  tree chain;
35890075Sobrien  tree type;
359169689Skan  union tree_ann_d *ann;
36096263Sobrien
36190075Sobrien  ENUM_BITFIELD(tree_code) code : 8;
36296263Sobrien
36318334Speter  unsigned side_effects_flag : 1;
36418334Speter  unsigned constant_flag : 1;
36518334Speter  unsigned addressable_flag : 1;
36618334Speter  unsigned volatile_flag : 1;
36718334Speter  unsigned readonly_flag : 1;
36818334Speter  unsigned unsigned_flag : 1;
36918334Speter  unsigned asm_written_flag: 1;
370169689Skan  unsigned nowarning_flag : 1;
37118334Speter
37218334Speter  unsigned used_flag : 1;
37390075Sobrien  unsigned nothrow_flag : 1;
37418334Speter  unsigned static_flag : 1;
37518334Speter  unsigned public_flag : 1;
37618334Speter  unsigned private_flag : 1;
37718334Speter  unsigned protected_flag : 1;
37890075Sobrien  unsigned deprecated_flag : 1;
379169689Skan  unsigned invariant_flag : 1;
38018334Speter
38118334Speter  unsigned lang_flag_0 : 1;
38218334Speter  unsigned lang_flag_1 : 1;
38318334Speter  unsigned lang_flag_2 : 1;
38418334Speter  unsigned lang_flag_3 : 1;
38518334Speter  unsigned lang_flag_4 : 1;
38618334Speter  unsigned lang_flag_5 : 1;
38718334Speter  unsigned lang_flag_6 : 1;
388169689Skan  unsigned visited : 1;
389260918Spfg  /* APPLE LOCAL "unavailable" attribute (Radar 2809697) --ilr */
390260918Spfg  unsigned unavailable_flag : 1;
39118334Speter};
39218334Speter
39350397Sobrien/* The following table lists the uses of each of the above flags and
39450397Sobrien   for which types of nodes they are defined.  Note that expressions
39550397Sobrien   include decls.
39650397Sobrien
39750397Sobrien   addressable_flag:
39850397Sobrien
39950397Sobrien       TREE_ADDRESSABLE in
400132718Skan	   VAR_DECL, FUNCTION_DECL, FIELD_DECL, CONSTRUCTOR, LABEL_DECL,
40190075Sobrien	   ..._TYPE, IDENTIFIER_NODE.
40290075Sobrien	   In a STMT_EXPR, it means we want the result of the enclosed
40390075Sobrien	   expression.
404169689Skan       CALL_EXPR_TAILCALL in CALL_EXPR
405169689Skan       CASE_LOW_SEEN in CASE_LABEL_EXPR
40650397Sobrien
40750397Sobrien   static_flag:
40850397Sobrien
40950397Sobrien       TREE_STATIC in
41050397Sobrien           VAR_DECL, FUNCTION_DECL, CONSTRUCTOR, ADDR_EXPR
411169689Skan       BINFO_VIRTUAL_P in
412169689Skan           TREE_BINFO
41350397Sobrien       TREE_CONSTANT_OVERFLOW in
41496263Sobrien           INTEGER_CST, REAL_CST, COMPLEX_CST, VECTOR_CST
41550397Sobrien       TREE_SYMBOL_REFERENCED in
41650397Sobrien           IDENTIFIER_NODE
41796263Sobrien       CLEANUP_EH_ONLY in
418169689Skan           TARGET_EXPR, WITH_CLEANUP_EXPR
419169689Skan       ASM_INPUT_P in
420169689Skan           ASM_EXPR
421169689Skan       EH_FILTER_MUST_NOT_THROW in EH_FILTER_EXPR
422169689Skan       TYPE_REF_CAN_ALIAS_ALL in
423169689Skan           POINTER_TYPE, REFERENCE_TYPE
424169689Skan       CASE_HIGH_SEEN in CASE_LABEL_EXPR
42550397Sobrien
42650397Sobrien   public_flag:
42750397Sobrien
42850397Sobrien       TREE_OVERFLOW in
42996263Sobrien           INTEGER_CST, REAL_CST, COMPLEX_CST, VECTOR_CST
43050397Sobrien       TREE_PUBLIC in
43190075Sobrien           VAR_DECL or FUNCTION_DECL or IDENTIFIER_NODE
432169689Skan       ASM_VOLATILE_P in
433169689Skan           ASM_EXPR
434169689Skan       TYPE_CACHED_VALUES_P in
435169689Skan          ..._TYPE
436169689Skan       SAVE_EXPR_RESOLVED_P in
437169689Skan	  SAVE_EXPR
438169689Skan       OMP_CLAUSE_LASTPRIVATE_FIRSTPRIVATE in
439169689Skan	  OMP_CLAUSE_LASTPRIVATE
440169689Skan       OMP_CLAUSE_PRIVATE_DEBUG in
441169689Skan	  OMP_CLAUSE_PRIVATE
44250397Sobrien
44350397Sobrien   private_flag:
44450397Sobrien
44550397Sobrien       TREE_PRIVATE in
44696263Sobrien           ..._DECL
447169689Skan       CALL_EXPR_RETURN_SLOT_OPT in
448132718Skan           CALL_EXPR
449169689Skan       DECL_BY_REFERENCE in
450169689Skan           PARM_DECL, RESULT_DECL
451169689Skan       OMP_RETURN_NOWAIT in
452169689Skan	   OMP_RETURN
453169689Skan       OMP_SECTION_LAST in
454169689Skan	   OMP_SECTION
455169689Skan       OMP_PARALLEL_COMBINED in
456169689Skan	   OMP_PARALLEL
45750397Sobrien
45850397Sobrien   protected_flag:
45950397Sobrien
46050397Sobrien       TREE_PROTECTED in
46150397Sobrien           BLOCK
46296263Sobrien	   ..._DECL
463132718Skan       CALL_FROM_THUNK_P in
464169689Skan           CALL_EXPR
46550397Sobrien
46650397Sobrien   side_effects_flag:
46750397Sobrien
46850397Sobrien       TREE_SIDE_EFFECTS in
46950397Sobrien           all expressions
470169689Skan	   all decls
471169689Skan	   all constants
47250397Sobrien
473169689Skan       FORCED_LABEL in
474169689Skan	   LABEL_DECL
475169689Skan
47650397Sobrien   volatile_flag:
47750397Sobrien
47850397Sobrien       TREE_THIS_VOLATILE in
47950397Sobrien           all expressions
48050397Sobrien       TYPE_VOLATILE in
48150397Sobrien           ..._TYPE
48250397Sobrien
48350397Sobrien   readonly_flag:
48450397Sobrien
48550397Sobrien       TREE_READONLY in
48650397Sobrien           all expressions
48750397Sobrien       TYPE_READONLY in
48850397Sobrien           ..._TYPE
48950397Sobrien
49050397Sobrien   constant_flag:
49150397Sobrien
49250397Sobrien       TREE_CONSTANT in
49350397Sobrien           all expressions
494169689Skan	   all decls
495169689Skan	   all constants
496169689Skan       TYPE_SIZES_GIMPLIFIED
497169689Skan           ..._TYPE
49850397Sobrien
49950397Sobrien   unsigned_flag:
50050397Sobrien
501169689Skan       TYPE_UNSIGNED in
502169689Skan           all types
503169689Skan       DECL_UNSIGNED in
504169689Skan           all decls
505169689Skan       BIT_FIELD_REF_UNSIGNED in
506169689Skan           BIT_FIELD_REF
50750397Sobrien
50850397Sobrien   asm_written_flag:
50950397Sobrien
51050397Sobrien       TREE_ASM_WRITTEN in
51150397Sobrien           VAR_DECL, FUNCTION_DECL, RECORD_TYPE, UNION_TYPE, QUAL_UNION_TYPE
512169689Skan	   BLOCK, SSA_NAME
51350397Sobrien
51450397Sobrien   used_flag:
51550397Sobrien
51650397Sobrien       TREE_USED in
51750397Sobrien           expressions, IDENTIFIER_NODE
51850397Sobrien
51990075Sobrien   nothrow_flag:
52050397Sobrien
52190075Sobrien       TREE_NOTHROW in
52290075Sobrien           CALL_EXPR, FUNCTION_DECL
52350397Sobrien
524132718Skan       TYPE_ALIGN_OK in
52590075Sobrien	   ..._TYPE
52690075Sobrien
527169689Skan       TREE_THIS_NOTRAP in
528169689Skan          (ALIGN/MISALIGNED_)INDIRECT_REF, ARRAY_REF, ARRAY_RANGE_REF
529169689Skan
53090075Sobrien   deprecated_flag:
53190075Sobrien
53290075Sobrien	TREE_DEPRECATED in
53390075Sobrien	   ..._DECL
534132718Skan
535169689Skan	IDENTIFIER_TRANSPARENT_ALIAS in
536169689Skan	   IDENTIFIER_NODE
537169689Skan
538260918Spfg   APPLE LOCAL begin "unavailable" attribute (Radar 2809697)
539260918Spfg   unavailable_flag:
540260918Spfg
541260918Spfg	TREE_UNAVAILABLE in
542260918Spfg	   ..._DECL
543260918Spfg   APPLE LOCAL end "unavailable" attribute (Radar 2809697)
544260918Spfg
545169689Skan   visited:
546169689Skan
547169689Skan   	Used in tree traversals to mark visited nodes.
548169689Skan
549169689Skan   invariant_flag:
550169689Skan
551169689Skan	TREE_INVARIANT in
552169689Skan	    all expressions.
553169689Skan
554169689Skan   nowarning_flag:
555169689Skan
556169689Skan       TREE_NO_WARNING in
557169689Skan           ... any expr or decl node
55890075Sobrien*/
559169689Skan#undef DEFTREESTRUCT
560169689Skan#define DEFTREESTRUCT(ENUM, NAME) ENUM,
561169689Skanenum tree_node_structure_enum {
562169689Skan#include "treestruct.def"
563169689Skan  LAST_TS_ENUM
564169689Skan};
565169689Skan#undef DEFTREESTRUCT
56690075Sobrien
56718334Speter/* Define accessors for the fields that all tree nodes have
56818334Speter   (though some fields are not used for all kinds of nodes).  */
56918334Speter
57018334Speter/* The tree-code says what kind of node it is.
57118334Speter   Codes are defined in tree.def.  */
57218334Speter#define TREE_CODE(NODE) ((enum tree_code) (NODE)->common.code)
573132718Skan#define TREE_SET_CODE(NODE, VALUE) ((NODE)->common.code = (VALUE))
57418334Speter
57550397Sobrien/* When checking is enabled, errors will be generated if a tree node
576169689Skan   is accessed incorrectly. The macros die with a fatal error.  */
57790075Sobrien#if defined ENABLE_TREE_CHECKING && (GCC_VERSION >= 2007)
57850397Sobrien
579132718Skan#define TREE_CHECK(T, CODE) __extension__				\
580132718Skan({  const tree __t = (T);						\
581132718Skan    if (TREE_CODE (__t) != (CODE))					\
582169689Skan      tree_check_failed (__t, __FILE__, __LINE__, __FUNCTION__, 	\
583169689Skan			 (CODE), 0);					\
58490075Sobrien    __t; })
585132718Skan
586169689Skan#define TREE_NOT_CHECK(T, CODE) __extension__				\
587169689Skan({  const tree __t = (T);						\
588169689Skan    if (TREE_CODE (__t) == (CODE))					\
589169689Skan      tree_not_check_failed (__t, __FILE__, __LINE__, __FUNCTION__,	\
590169689Skan			     (CODE), 0);				\
591169689Skan    __t; })
592169689Skan
593169689Skan#define TREE_CHECK2(T, CODE1, CODE2) __extension__			\
594169689Skan({  const tree __t = (T);						\
595169689Skan    if (TREE_CODE (__t) != (CODE1)					\
596169689Skan	&& TREE_CODE (__t) != (CODE2))					\
597169689Skan      tree_check_failed (__t, __FILE__, __LINE__, __FUNCTION__,		\
598169689Skan 			 (CODE1), (CODE2), 0);				\
599169689Skan    __t; })
600169689Skan
601169689Skan#define TREE_NOT_CHECK2(T, CODE1, CODE2) __extension__			\
602169689Skan({  const tree __t = (T);						\
603169689Skan    if (TREE_CODE (__t) == (CODE1)					\
604169689Skan	|| TREE_CODE (__t) == (CODE2))					\
605169689Skan      tree_not_check_failed (__t, __FILE__, __LINE__, __FUNCTION__,	\
606169689Skan			     (CODE1), (CODE2), 0);			\
607169689Skan    __t; })
608169689Skan
609169689Skan#define TREE_CHECK3(T, CODE1, CODE2, CODE3) __extension__		\
610169689Skan({  const tree __t = (T);						\
611169689Skan    if (TREE_CODE (__t) != (CODE1)					\
612169689Skan	&& TREE_CODE (__t) != (CODE2)					\
613169689Skan	&& TREE_CODE (__t) != (CODE3))					\
614169689Skan      tree_check_failed (__t, __FILE__, __LINE__, __FUNCTION__,		\
615169689Skan			     (CODE1), (CODE2), (CODE3), 0);		\
616169689Skan    __t; })
617169689Skan
618169689Skan#define TREE_NOT_CHECK3(T, CODE1, CODE2, CODE3) __extension__		\
619169689Skan({  const tree __t = (T);						\
620169689Skan    if (TREE_CODE (__t) == (CODE1)					\
621169689Skan	|| TREE_CODE (__t) == (CODE2)					\
622169689Skan	|| TREE_CODE (__t) == (CODE3))					\
623169689Skan      tree_not_check_failed (__t, __FILE__, __LINE__, __FUNCTION__,	\
624169689Skan			     (CODE1), (CODE2), (CODE3), 0);		\
625169689Skan    __t; })
626169689Skan
627169689Skan#define TREE_CHECK4(T, CODE1, CODE2, CODE3, CODE4) __extension__	\
628169689Skan({  const tree __t = (T);						\
629169689Skan    if (TREE_CODE (__t) != (CODE1)					\
630169689Skan	&& TREE_CODE (__t) != (CODE2)					\
631169689Skan	&& TREE_CODE (__t) != (CODE3)					\
632169689Skan	&& TREE_CODE (__t) != (CODE4))					\
633169689Skan      tree_check_failed (__t, __FILE__, __LINE__, __FUNCTION__,		\
634169689Skan			     (CODE1), (CODE2), (CODE3), (CODE4), 0);	\
635169689Skan    __t; })
636169689Skan
637169689Skan#define NON_TREE_CHECK4(T, CODE1, CODE2, CODE3, CODE4) __extension__	\
638169689Skan({  const tree __t = (T);						\
639169689Skan    if (TREE_CODE (__t) == (CODE1)					\
640169689Skan	|| TREE_CODE (__t) == (CODE2)					\
641169689Skan	|| TREE_CODE (__t) == (CODE3)					\
642169689Skan	|| TREE_CODE (__t) == (CODE4))					\
643169689Skan      tree_not_check_failed (__t, __FILE__, __LINE__, __FUNCTION__,	\
644169689Skan			     (CODE1), (CODE2), (CODE3), (CODE4), 0);	\
645169689Skan    __t; })
646169689Skan
647169689Skan#define TREE_CHECK5(T, CODE1, CODE2, CODE3, CODE4, CODE5) __extension__	\
648169689Skan({  const tree __t = (T);						\
649169689Skan    if (TREE_CODE (__t) != (CODE1)					\
650169689Skan	&& TREE_CODE (__t) != (CODE2)					\
651169689Skan	&& TREE_CODE (__t) != (CODE3)					\
652169689Skan	&& TREE_CODE (__t) != (CODE4)					\
653169689Skan	&& TREE_CODE (__t) != (CODE5))					\
654169689Skan      tree_check_failed (__t, __FILE__, __LINE__, __FUNCTION__,		\
655169689Skan			     (CODE1), (CODE2), (CODE3), (CODE4), (CODE5), 0);\
656169689Skan    __t; })
657169689Skan
658169689Skan#define TREE_NOT_CHECK5(T, CODE1, CODE2, CODE3, CODE4, CODE5) __extension__ \
659169689Skan({  const tree __t = (T);						\
660169689Skan    if (TREE_CODE (__t) == (CODE1)					\
661169689Skan	|| TREE_CODE (__t) == (CODE2)					\
662169689Skan	|| TREE_CODE (__t) == (CODE3)					\
663169689Skan	|| TREE_CODE (__t) == (CODE4)					\
664169689Skan	|| TREE_CODE (__t) == (CODE5))					\
665169689Skan      tree_not_check_failed (__t, __FILE__, __LINE__, __FUNCTION__,	\
666169689Skan			     (CODE1), (CODE2), (CODE3), (CODE4), (CODE5), 0);\
667169689Skan    __t; })
668169689Skan
669169689Skan#define CONTAINS_STRUCT_CHECK(T, STRUCT) __extension__			\
670169689Skan({  const tree __t = (T);						\
671169689Skan  if (tree_contains_struct[TREE_CODE(__t)][(STRUCT)] != 1)		\
672169689Skan      tree_contains_struct_check_failed (__t, (STRUCT), __FILE__, __LINE__,	\
673169689Skan			       __FUNCTION__);				\
674169689Skan    __t; })
675169689Skan
676132718Skan#define TREE_CLASS_CHECK(T, CLASS) __extension__			\
677132718Skan({  const tree __t = (T);						\
678132718Skan    if (TREE_CODE_CLASS (TREE_CODE(__t)) != (CLASS))			\
679132718Skan      tree_class_check_failed (__t, (CLASS), __FILE__, __LINE__,	\
68090075Sobrien			       __FUNCTION__);				\
68190075Sobrien    __t; })
68290075Sobrien
683169689Skan#define TREE_RANGE_CHECK(T, CODE1, CODE2) __extension__			\
684169689Skan({  const tree __t = (T);						\
685169689Skan    if (TREE_CODE (__t) < (CODE1) || TREE_CODE (__t) > (CODE2))		\
686169689Skan      tree_range_check_failed (__t, __FILE__, __LINE__, __FUNCTION__,	\
687169689Skan			       (CODE1), (CODE2));			\
688169689Skan    __t; })
689169689Skan
690169689Skan#define OMP_CLAUSE_SUBCODE_CHECK(T, CODE) __extension__			\
691169689Skan({  const tree __t = (T);						\
692169689Skan    if (TREE_CODE (__t) != OMP_CLAUSE)					\
693169689Skan      tree_check_failed (__t, __FILE__, __LINE__, __FUNCTION__,  	\
694169689Skan			 OMP_CLAUSE, 0);				\
695169689Skan    if (__t->omp_clause.code != (CODE))					\
696169689Skan      omp_clause_check_failed (__t, __FILE__, __LINE__, __FUNCTION__, 	\
697169689Skan			       (CODE));					\
698169689Skan    __t; })
699169689Skan
700169689Skan#define OMP_CLAUSE_RANGE_CHECK(T, CODE1, CODE2) __extension__		\
701169689Skan({  const tree __t = (T);						\
702169689Skan    if (TREE_CODE (__t) != OMP_CLAUSE)					\
703169689Skan      tree_check_failed (__t, __FILE__, __LINE__, __FUNCTION__,  	\
704169689Skan			 OMP_CLAUSE, 0);				\
705169689Skan    if ((int) __t->omp_clause.code < (int) (CODE1)			\
706169689Skan        || (int) __t->omp_clause.code > (int) (CODE2))			\
707169689Skan      omp_clause_range_check_failed (__t, __FILE__, __LINE__,		\
708169689Skan				     __FUNCTION__, (CODE1), (CODE2));	\
709169689Skan    __t; })
710169689Skan
71190075Sobrien/* These checks have to be special cased.  */
712132718Skan#define EXPR_CHECK(T) __extension__					\
713132718Skan({  const tree __t = (T);						\
714132718Skan    char const __c = TREE_CODE_CLASS (TREE_CODE (__t));			\
715132718Skan    if (!IS_EXPR_CODE_CLASS (__c))					\
716169689Skan      tree_class_check_failed (__t, tcc_expression, __FILE__, __LINE__,	\
71790075Sobrien			       __FUNCTION__);				\
71890075Sobrien    __t; })
71990075Sobrien
720169689Skan/* These checks have to be special cased.  */
721169689Skan#define NON_TYPE_CHECK(T) __extension__					\
722169689Skan({  const tree __t = (T);						\
723169689Skan    if (TYPE_P (__t))							\
724169689Skan      tree_not_class_check_failed (__t, tcc_type, __FILE__, __LINE__,	\
725169689Skan				   __FUNCTION__);			\
726169689Skan    __t; })
727169689Skan
728132718Skan#define TREE_VEC_ELT_CHECK(T, I) __extension__				\
729132718Skan(*({const tree __t = (T);						\
730132718Skan    const int __i = (I);						\
731117395Skan    if (TREE_CODE (__t) != TREE_VEC)					\
732169689Skan      tree_check_failed (__t, __FILE__, __LINE__, __FUNCTION__,		\
733169689Skan  			 TREE_VEC, 0);					\
734117395Skan    if (__i < 0 || __i >= __t->vec.length)				\
735117395Skan      tree_vec_elt_check_failed (__i, __t->vec.length,			\
736117395Skan				 __FILE__, __LINE__, __FUNCTION__);	\
737117395Skan    &__t->vec.a[__i]; }))
738117395Skan
739169689Skan#define PHI_NODE_ELT_CHECK(t, i) __extension__				\
740169689Skan(*({const tree __t = t;							\
741169689Skan    const int __i = (i);						\
742169689Skan    if (TREE_CODE (__t) != PHI_NODE)					\
743169689Skan      tree_check_failed (__t, __FILE__, __LINE__, __FUNCTION__,  	\
744169689Skan			 PHI_NODE, 0);					\
745169689Skan    if (__i < 0 || __i >= __t->phi.capacity)				\
746169689Skan      phi_node_elt_check_failed (__i, __t->phi.num_args,		\
747169689Skan				 __FILE__, __LINE__, __FUNCTION__);	\
748169689Skan    &__t->phi.a[__i]; }))
749169689Skan
750169689Skan#define OMP_CLAUSE_ELT_CHECK(t, i) __extension__			\
751169689Skan(*({const tree __t = t;							\
752169689Skan    const int __i = (i);						\
753169689Skan    if (TREE_CODE (__t) != OMP_CLAUSE)					\
754169689Skan      tree_check_failed (__t, __FILE__, __LINE__, __FUNCTION__,  	\
755169689Skan			 OMP_CLAUSE, 0);				\
756169689Skan    if (__i < 0 || __i >= omp_clause_num_ops [__t->omp_clause.code])	\
757169689Skan      omp_clause_operand_check_failed (__i, __t, __FILE__, __LINE__,	\
758169689Skan	                               __FUNCTION__);			\
759169689Skan    &__t->omp_clause.ops[__i]; }))
760169689Skan
761132718Skan/* Special checks for TREE_OPERANDs.  */
762132718Skan#define TREE_OPERAND_CHECK(T, I) __extension__				\
763132718Skan(*({const tree __t = EXPR_CHECK (T);					\
764132718Skan    const int __i = (I);						\
765132718Skan    if (__i < 0 || __i >= TREE_CODE_LENGTH (TREE_CODE (__t)))		\
766132718Skan      tree_operand_check_failed (__i, TREE_CODE (__t),			\
767132718Skan				 __FILE__, __LINE__, __FUNCTION__);	\
768132718Skan    &__t->exp.operands[__i]; }))
769132718Skan
770132718Skan#define TREE_OPERAND_CHECK_CODE(T, CODE, I) __extension__		\
771132718Skan(*({const tree __t = (T);						\
772132718Skan    const int __i = (I);						\
773132718Skan    if (TREE_CODE (__t) != CODE)					\
774169689Skan      tree_check_failed (__t, __FILE__, __LINE__, __FUNCTION__, (CODE), 0);\
775132718Skan    if (__i < 0 || __i >= TREE_CODE_LENGTH (CODE))			\
776132718Skan      tree_operand_check_failed (__i, (CODE),				\
777132718Skan				 __FILE__, __LINE__, __FUNCTION__);	\
778132718Skan    &__t->exp.operands[__i]; }))
779132718Skan
780132718Skan#define TREE_RTL_OPERAND_CHECK(T, CODE, I) __extension__		\
781132718Skan(*(rtx *)								\
782132718Skan ({const tree __t = (T);						\
783132718Skan    const int __i = (I);						\
784132718Skan    if (TREE_CODE (__t) != (CODE))					\
785169689Skan      tree_check_failed (__t, __FILE__, __LINE__, __FUNCTION__, (CODE), 0); \
786132718Skan    if (__i < 0 || __i >= TREE_CODE_LENGTH ((CODE)))			\
787132718Skan      tree_operand_check_failed (__i, (CODE),				\
788132718Skan				 __FILE__, __LINE__, __FUNCTION__);	\
789132718Skan    &__t->exp.operands[__i]; }))
790132718Skan
791169689Skanextern void tree_contains_struct_check_failed (const tree,
792169689Skan					       const enum tree_node_structure_enum,
793169689Skan					       const char *, int, const char *)
794169689Skan  ATTRIBUTE_NORETURN;
795169689Skan
796169689Skanextern void tree_check_failed (const tree, const char *, int, const char *,
797169689Skan			       ...) ATTRIBUTE_NORETURN;
798169689Skanextern void tree_not_check_failed (const tree, const char *, int, const char *,
799169689Skan				   ...) ATTRIBUTE_NORETURN;
800169689Skanextern void tree_class_check_failed (const tree, const enum tree_code_class,
801132718Skan				     const char *, int, const char *)
80290075Sobrien    ATTRIBUTE_NORETURN;
803169689Skanextern void tree_range_check_failed (const tree, const char *, int,
804169689Skan				     const char *, enum tree_code,
805169689Skan				     enum tree_code);
806169689Skanextern void tree_not_class_check_failed (const tree,
807169689Skan					 const enum tree_code_class,
808169689Skan					 const char *, int, const char *)
809169689Skan    ATTRIBUTE_NORETURN;
810132718Skanextern void tree_vec_elt_check_failed (int, int, const char *,
811132718Skan				       int, const char *)
812117395Skan    ATTRIBUTE_NORETURN;
813169689Skanextern void phi_node_elt_check_failed (int, int, const char *,
814169689Skan				       int, const char *)
815169689Skan    ATTRIBUTE_NORETURN;
816132718Skanextern void tree_operand_check_failed (int, enum tree_code,
817132718Skan				       const char *, int, const char *)
818132718Skan    ATTRIBUTE_NORETURN;
819169689Skanextern void omp_clause_check_failed (const tree, const char *, int,
820169689Skan				     const char *, enum omp_clause_code)
821169689Skan    ATTRIBUTE_NORETURN;
822169689Skanextern void omp_clause_operand_check_failed (int, tree, const char *,
823169689Skan				             int, const char *)
824169689Skan    ATTRIBUTE_NORETURN;
825169689Skanextern void omp_clause_range_check_failed (const tree, const char *, int,
826169689Skan			       const char *, enum omp_clause_code,
827169689Skan			       enum omp_clause_code)
828169689Skan    ATTRIBUTE_NORETURN;
829132718Skan
83090075Sobrien#else /* not ENABLE_TREE_CHECKING, or not gcc */
83190075Sobrien
832169689Skan#define CONTAINS_STRUCT_CHECK(T, ENUM)          (T)
833169689Skan#define TREE_CHECK(T, CODE)			(T)
834169689Skan#define TREE_NOT_CHECK(T, CODE)			(T)
835169689Skan#define TREE_CHECK2(T, CODE1, CODE2)		(T)
836169689Skan#define TREE_NOT_CHECK2(T, CODE1, CODE2)	(T)
837169689Skan#define TREE_CHECK3(T, CODE1, CODE2, CODE3)	(T)
838169689Skan#define TREE_NOT_CHECK3(T, CODE1, CODE2, CODE3)	(T)
839169689Skan#define TREE_CHECK4(T, CODE1, CODE2, CODE3, CODE4) (T)
840169689Skan#define TREE_NOT_CHECK4(T, CODE1, CODE2, CODE3, CODE4) (T)
841169689Skan#define TREE_CHECK5(T, CODE1, CODE2, CODE3, CODE4, CODE5) (T)
842169689Skan#define TREE_NOT_CHECK5(T, CODE1, CODE2, CODE3, CODE4, CODE5) (T)
843169689Skan#define TREE_CLASS_CHECK(T, CODE)		(T)
844169689Skan#define TREE_RANGE_CHECK(T, CODE1, CODE2)	(T)
845169689Skan#define EXPR_CHECK(T)				(T)
846169689Skan#define NON_TYPE_CHECK(T)			(T)
847223262Sbenl#define TREE_VEC_ELT_CHECK(T, I)		__PAST_END((T)->vec.a, I)
848223262Sbenl#define TREE_OPERAND_CHECK(T, I)		__PAST_END((T)->exp.operands, I)
849223262Sbenl#define TREE_OPERAND_CHECK_CODE(T, CODE, I)	__PAST_END((T)->exp.operands, I)
850132718Skan#define TREE_RTL_OPERAND_CHECK(T, CODE, I)  (*(rtx *) &((T)->exp.operands[I]))
851169689Skan#define PHI_NODE_ELT_CHECK(T, i)	((T)->phi.a[i])
852223262Sbenl#define OMP_CLAUSE_ELT_CHECK(T, i)	        __PAST_END((T)->omp_clause.ops, i)
853169689Skan#define OMP_CLAUSE_RANGE_CHECK(T, CODE1, CODE2)	(T)
854169689Skan#define OMP_CLAUSE_SUBCODE_CHECK(T, CODE)	(T)
85590075Sobrien
85650397Sobrien#endif
85750397Sobrien
858169689Skan#define TREE_BLOCK(NODE)		(EXPR_CHECK (NODE)->exp.block)
859169689Skan
86050397Sobrien#include "tree-check.h"
86150397Sobrien
862169689Skan#define TYPE_CHECK(T)		TREE_CLASS_CHECK (T, tcc_type)
863169689Skan#define DECL_MINIMAL_CHECK(T)   CONTAINS_STRUCT_CHECK (T, TS_DECL_MINIMAL)
864169689Skan#define TREE_MEMORY_TAG_CHECK(T)       CONTAINS_STRUCT_CHECK (T, TS_MEMORY_TAG)
865169689Skan#define DECL_COMMON_CHECK(T)    CONTAINS_STRUCT_CHECK (T, TS_DECL_COMMON)
866169689Skan#define DECL_WRTL_CHECK(T)      CONTAINS_STRUCT_CHECK (T, TS_DECL_WRTL)
867169689Skan#define DECL_WITH_VIS_CHECK(T)  CONTAINS_STRUCT_CHECK (T, TS_DECL_WITH_VIS)
868169689Skan#define DECL_NON_COMMON_CHECK(T) CONTAINS_STRUCT_CHECK (T, TS_DECL_NON_COMMON)
869169689Skan#define CST_CHECK(T)		TREE_CLASS_CHECK (T, tcc_constant)
870169689Skan#define STMT_CHECK(T)		TREE_CLASS_CHECK (T, tcc_statement)
871169689Skan#define FUNC_OR_METHOD_CHECK(T)	TREE_CHECK2 (T, FUNCTION_TYPE, METHOD_TYPE)
872261188Spfg/* APPLE LOCAL blocks 5862465 */
873261188Spfg#define PTR_OR_REF_CHECK(T)	TREE_CHECK3 (T, POINTER_TYPE, REFERENCE_TYPE, BLOCK_POINTER_TYPE)
87450397Sobrien
875169689Skan#define RECORD_OR_UNION_CHECK(T)	\
876169689Skan  TREE_CHECK3 (T, RECORD_TYPE, UNION_TYPE, QUAL_UNION_TYPE)
877169689Skan#define NOT_RECORD_OR_UNION_CHECK(T) \
878169689Skan  TREE_NOT_CHECK3 (T, RECORD_TYPE, UNION_TYPE, QUAL_UNION_TYPE)
879169689Skan
880169689Skan#define NUMERICAL_TYPE_CHECK(T)					\
881169689Skan  TREE_CHECK4 (T, INTEGER_TYPE, ENUMERAL_TYPE, BOOLEAN_TYPE, REAL_TYPE)
882169689Skan
88318334Speter/* In all nodes that are expressions, this is the data type of the expression.
88418334Speter   In POINTER_TYPE nodes, this is the type that the pointer points to.
88590075Sobrien   In ARRAY_TYPE nodes, this is the type of the elements.
88690075Sobrien   In VECTOR_TYPE nodes, this is the type of the elements.  */
88718334Speter#define TREE_TYPE(NODE) ((NODE)->common.type)
88818334Speter
88990075Sobrien/* Here is how primitive or already-canonicalized types' hash codes
89090075Sobrien   are made.  */
891169689Skan#define TYPE_HASH(TYPE) (TYPE_UID (TYPE))
89290075Sobrien
893169689Skan/* A simple hash function for an arbitrary tree node.  This must not be
894169689Skan   used in hash tables which are saved to a PCH.  */
895169689Skan#define TREE_HASH(NODE) ((size_t) (NODE) & 0777777)
896169689Skan
89718334Speter/* Nodes are chained together for many purposes.
89818334Speter   Types are chained together to record them for being output to the debugger
89918334Speter   (see the function `chain_type').
90018334Speter   Decls in the same scope are chained together to record the contents
90118334Speter   of the scope.
90218334Speter   Statement nodes for successive statements used to be chained together.
90318334Speter   Often lists of things are represented by TREE_LIST nodes that
90418334Speter   are chained together.  */
90518334Speter
90618334Speter#define TREE_CHAIN(NODE) ((NODE)->common.chain)
90718334Speter
90818334Speter/* Given an expression as a tree, strip any NON_LVALUE_EXPRs and NOP_EXPRs
90918334Speter   that don't change the machine mode.  */
91018334Speter
91190075Sobrien#define STRIP_NOPS(EXP)						\
91218334Speter  while ((TREE_CODE (EXP) == NOP_EXPR				\
91318334Speter	  || TREE_CODE (EXP) == CONVERT_EXPR			\
91418334Speter	  || TREE_CODE (EXP) == NON_LVALUE_EXPR)		\
91590075Sobrien	 && TREE_OPERAND (EXP, 0) != error_mark_node		\
91618334Speter	 && (TYPE_MODE (TREE_TYPE (EXP))			\
91718334Speter	     == TYPE_MODE (TREE_TYPE (TREE_OPERAND (EXP, 0)))))	\
91890075Sobrien    (EXP) = TREE_OPERAND (EXP, 0)
91918334Speter
92090075Sobrien/* Like STRIP_NOPS, but don't let the signedness change either.  */
92190075Sobrien
92290075Sobrien#define STRIP_SIGN_NOPS(EXP) \
92390075Sobrien  while ((TREE_CODE (EXP) == NOP_EXPR				\
92490075Sobrien	  || TREE_CODE (EXP) == CONVERT_EXPR			\
92590075Sobrien	  || TREE_CODE (EXP) == NON_LVALUE_EXPR)		\
92690075Sobrien	 && TREE_OPERAND (EXP, 0) != error_mark_node		\
92790075Sobrien	 && (TYPE_MODE (TREE_TYPE (EXP))			\
92890075Sobrien	     == TYPE_MODE (TREE_TYPE (TREE_OPERAND (EXP, 0))))	\
929169689Skan	 && (TYPE_UNSIGNED (TREE_TYPE (EXP))			\
930169689Skan	     == TYPE_UNSIGNED (TREE_TYPE (TREE_OPERAND (EXP, 0))))) \
93190075Sobrien    (EXP) = TREE_OPERAND (EXP, 0)
93290075Sobrien
93318334Speter/* Like STRIP_NOPS, but don't alter the TREE_TYPE either.  */
93418334Speter
93518334Speter#define STRIP_TYPE_NOPS(EXP) \
93618334Speter  while ((TREE_CODE (EXP) == NOP_EXPR				\
93718334Speter	  || TREE_CODE (EXP) == CONVERT_EXPR			\
93818334Speter	  || TREE_CODE (EXP) == NON_LVALUE_EXPR)		\
93990075Sobrien	 && TREE_OPERAND (EXP, 0) != error_mark_node		\
94018334Speter	 && (TREE_TYPE (EXP)					\
94118334Speter	     == TREE_TYPE (TREE_OPERAND (EXP, 0))))		\
94290075Sobrien    (EXP) = TREE_OPERAND (EXP, 0)
94318334Speter
944169689Skan/* Remove unnecessary type conversions according to
945169689Skan   tree_ssa_useless_type_conversion.  */
946169689Skan
947169689Skan#define STRIP_USELESS_TYPE_CONVERSION(EXP)				\
948169689Skan      while (tree_ssa_useless_type_conversion (EXP))			\
949169689Skan	EXP = TREE_OPERAND (EXP, 0)
950169689Skan
95118334Speter/* Nonzero if TYPE represents an integral type.  Note that we do not
952169689Skan   include COMPLEX types here.  Keep these checks in ascending code
953169689Skan   order.  */
95418334Speter
95518334Speter#define INTEGRAL_TYPE_P(TYPE)  \
956169689Skan  (TREE_CODE (TYPE) == ENUMERAL_TYPE  \
957169689Skan   || TREE_CODE (TYPE) == BOOLEAN_TYPE \
958169689Skan   || TREE_CODE (TYPE) == INTEGER_TYPE)
95918334Speter
960132718Skan/* Nonzero if TYPE represents a scalar floating-point type.  */
961132718Skan
962132718Skan#define SCALAR_FLOAT_TYPE_P(TYPE) (TREE_CODE (TYPE) == REAL_TYPE)
963132718Skan
964132718Skan/* Nonzero if TYPE represents a complex floating-point type.  */
965132718Skan
966132718Skan#define COMPLEX_FLOAT_TYPE_P(TYPE)	\
967132718Skan  (TREE_CODE (TYPE) == COMPLEX_TYPE	\
968132718Skan   && TREE_CODE (TREE_TYPE (TYPE)) == REAL_TYPE)
969132718Skan
970169689Skan/* Nonzero if TYPE represents a vector floating-point type.  */
971169689Skan
972169689Skan#define VECTOR_FLOAT_TYPE_P(TYPE)	\
973169689Skan  (TREE_CODE (TYPE) == VECTOR_TYPE	\
974169689Skan   && TREE_CODE (TREE_TYPE (TYPE)) == REAL_TYPE)
975169689Skan
97618334Speter/* Nonzero if TYPE represents a floating-point type, including complex
977169689Skan   and vector floating-point types.  The vector and complex check does
978169689Skan   not use the previous two macros to enable early folding.  */
97918334Speter
980169689Skan#define FLOAT_TYPE_P(TYPE)			\
981169689Skan  (SCALAR_FLOAT_TYPE_P (TYPE)			\
982169689Skan   || ((TREE_CODE (TYPE) == COMPLEX_TYPE 	\
983169689Skan        || TREE_CODE (TYPE) == VECTOR_TYPE)	\
984169689Skan       && SCALAR_FLOAT_TYPE_P (TREE_TYPE (TYPE))))
98518334Speter
986169689Skan/* Nonzero if TYPE represents a decimal floating-point type.  */
987169689Skan#define DECIMAL_FLOAT_TYPE_P(TYPE)		\
988169689Skan  (SCALAR_FLOAT_TYPE_P (TYPE)			\
989169689Skan   && DECIMAL_FLOAT_MODE_P (TYPE_MODE (TYPE)))
99018334Speter
991169689Skan/* Nonzero if TYPE represents an aggregate (multi-component) type.
992169689Skan   Keep these checks in ascending code order.  */
993169689Skan
99418334Speter#define AGGREGATE_TYPE_P(TYPE) \
99518334Speter  (TREE_CODE (TYPE) == ARRAY_TYPE || TREE_CODE (TYPE) == RECORD_TYPE \
996169689Skan   || TREE_CODE (TYPE) == UNION_TYPE || TREE_CODE (TYPE) == QUAL_UNION_TYPE)
99718334Speter
998132718Skan/* Nonzero if TYPE represents a pointer or reference type.
999169689Skan   (It should be renamed to INDIRECT_TYPE_P.)  Keep these checks in
1000169689Skan   ascending code order.  */
100118334Speter
1002261188Spfg/* APPLE LOCAL begin blocks 5862465 */
100318334Speter#define POINTER_TYPE_P(TYPE) \
1004261188Spfg  (TREE_CODE (TYPE) == POINTER_TYPE \
1005261188Spfg   || TREE_CODE (TYPE) == REFERENCE_TYPE \
1006261188Spfg   || TREE_CODE (TYPE) == BLOCK_POINTER_TYPE)
1007261188Spfg/* APPLE LOCAL end blocks 5862465 */
100850397Sobrien
100990075Sobrien/* Nonzero if this type is a complete type.  */
101090075Sobrien#define COMPLETE_TYPE_P(NODE) (TYPE_SIZE (NODE) != NULL_TREE)
101190075Sobrien
101290075Sobrien/* Nonzero if this type is the (possibly qualified) void type.  */
101390075Sobrien#define VOID_TYPE_P(NODE) (TREE_CODE (NODE) == VOID_TYPE)
101490075Sobrien
101590075Sobrien/* Nonzero if this type is complete or is cv void.  */
101690075Sobrien#define COMPLETE_OR_VOID_TYPE_P(NODE) \
101790075Sobrien  (COMPLETE_TYPE_P (NODE) || VOID_TYPE_P (NODE))
101890075Sobrien
101990075Sobrien/* Nonzero if this type is complete or is an array with unspecified bound.  */
102090075Sobrien#define COMPLETE_OR_UNBOUND_ARRAY_TYPE_P(NODE) \
102190075Sobrien  (COMPLETE_TYPE_P (TREE_CODE (NODE) == ARRAY_TYPE ? TREE_TYPE (NODE) : (NODE)))
102290075Sobrien
102318334Speter
102418334Speter/* Define many boolean fields that all tree nodes have.  */
102518334Speter
102618334Speter/* In VAR_DECL nodes, nonzero means address of this is needed.
102718334Speter   So it cannot be in a register.
102818334Speter   In a FUNCTION_DECL, nonzero means its address is needed.
102918334Speter   So it must be compiled even if it is an inline function.
103090075Sobrien   In a FIELD_DECL node, it means that the programmer is permitted to
103190075Sobrien   construct the address of this field.  This is used for aliasing
103290075Sobrien   purposes: see record_component_aliases.
103318334Speter   In CONSTRUCTOR nodes, it means object constructed must be in memory.
1034117395Skan   In LABEL_DECL nodes, it means a goto for this label has been seen
103518334Speter   from a place outside all binding contours that restore stack levels.
103618334Speter   In ..._TYPE nodes, it means that objects of this type must
103718334Speter   be fully addressable.  This means that pieces of this
103818334Speter   object cannot go into register parameters, for example.
103918334Speter   In IDENTIFIER_NODEs, this means that some extern decl for this name
104018334Speter   had its address taken.  That matters for inline functions.  */
104118334Speter#define TREE_ADDRESSABLE(NODE) ((NODE)->common.addressable_flag)
104218334Speter
1043169689Skan/* Set on a CALL_EXPR if the call is in a tail position, ie. just before the
1044169689Skan   exit of a function.  Calls for which this is true are candidates for tail
1045169689Skan   call optimizations.  */
1046169689Skan#define CALL_EXPR_TAILCALL(NODE) (CALL_EXPR_CHECK(NODE)->common.addressable_flag)
1047169689Skan
1048169689Skan/* Used as a temporary field on a CASE_LABEL_EXPR to indicate that the
1049169689Skan   CASE_LOW operand has been processed.  */
1050169689Skan#define CASE_LOW_SEEN(NODE) \
1051169689Skan  (CASE_LABEL_EXPR_CHECK (NODE)->common.addressable_flag)
1052169689Skan
105318334Speter/* In a VAR_DECL, nonzero means allocate static storage.
105418334Speter   In a FUNCTION_DECL, nonzero if function has been defined.
1055169689Skan   In a CONSTRUCTOR, nonzero means allocate static storage.
1056169689Skan
1057169689Skan   ??? This is also used in lots of other nodes in unclear ways which
1058169689Skan   should be cleaned up some day.  */
105918334Speter#define TREE_STATIC(NODE) ((NODE)->common.static_flag)
106018334Speter
1061169689Skan/* In a TARGET_EXPR, WITH_CLEANUP_EXPR, means that the pertinent cleanup
1062169689Skan   should only be executed if an exception is thrown, not on normal exit
1063169689Skan   of its scope.  */
106496263Sobrien#define CLEANUP_EH_ONLY(NODE) ((NODE)->common.static_flag)
106596263Sobrien
1066169689Skan/* Used as a temporary field on a CASE_LABEL_EXPR to indicate that the
1067169689Skan   CASE_HIGH operand has been processed.  */
1068169689Skan#define CASE_HIGH_SEEN(NODE) \
1069169689Skan  (CASE_LABEL_EXPR_CHECK (NODE)->common.static_flag)
107018334Speter
1071169689Skan/* In an expr node (usually a conversion) this means the node was made
1072169689Skan   implicitly and should not lead to any sort of warning.  In a decl node,
1073169689Skan   warnings concerning the decl should be suppressed.  This is used at
1074169689Skan   least for used-before-set warnings, and it set after one warning is
1075169689Skan   emitted.  */
1076169689Skan#define TREE_NO_WARNING(NODE) ((NODE)->common.nowarning_flag)
107718334Speter
107896263Sobrien/* In an INTEGER_CST, REAL_CST, COMPLEX_CST, or VECTOR_CST this means
107996263Sobrien   there was an overflow in folding.  This is distinct from
108096263Sobrien   TREE_OVERFLOW because ANSI C requires a diagnostic when overflows
108196263Sobrien   occur in constant expressions.  */
1082169689Skan#define TREE_CONSTANT_OVERFLOW(NODE) (CST_CHECK (NODE)->common.static_flag)
108318334Speter
108418334Speter/* In an IDENTIFIER_NODE, this means that assemble_name was called with
108518334Speter   this string as an argument.  */
108690075Sobrien#define TREE_SYMBOL_REFERENCED(NODE) \
108790075Sobrien  (IDENTIFIER_NODE_CHECK (NODE)->common.static_flag)
108818334Speter
1089169689Skan/* Nonzero in a pointer or reference type means the data pointed to
1090169689Skan   by this type can alias anything.  */
1091169689Skan#define TYPE_REF_CAN_ALIAS_ALL(NODE) \
1092169689Skan  (PTR_OR_REF_CHECK (NODE)->common.static_flag)
1093169689Skan
109496263Sobrien/* In an INTEGER_CST, REAL_CST, COMPLEX_CST, or VECTOR_CST, this means
109596263Sobrien   there was an overflow in folding, and no warning has been issued
1096169689Skan   for this subexpression.  TREE_OVERFLOW implies TREE_CONSTANT_OVERFLOW,
1097169689Skan   but not vice versa.  */
109818334Speter
1099169689Skan#define TREE_OVERFLOW(NODE) (CST_CHECK (NODE)->common.public_flag)
1100169689Skan
1101259268Spfg/* TREE_OVERFLOW can only be true for EXPR of CONSTANT_CLASS_P. */
1102259268Spfg
1103259268Spfg#define TREE_OVERFLOW_P(EXPR) \
1104259268Spfg  (CONSTANT_CLASS_P (EXPR) && TREE_OVERFLOW (EXPR))
1105259268Spfg
1106169689Skan/* In a VAR_DECL, FUNCTION_DECL, NAMESPACE_DECL or TYPE_DECL,
110718334Speter   nonzero means name is to be accessible from outside this module.
110890075Sobrien   In an IDENTIFIER_NODE, nonzero means an external declaration
110918334Speter   accessible from outside this module was previously seen
111018334Speter   for this name in an inner scope.  */
111118334Speter#define TREE_PUBLIC(NODE) ((NODE)->common.public_flag)
111218334Speter
1113169689Skan/* In a _TYPE, indicates whether TYPE_CACHED_VALUES contains a vector
1114169689Skan   of cached values, or is something else.  */
1115169689Skan#define TYPE_CACHED_VALUES_P(NODE) (TYPE_CHECK(NODE)->common.public_flag)
111618334Speter
1117169689Skan/* In a SAVE_EXPR, indicates that the original expression has already
1118169689Skan   been substituted with a VAR_DECL that contains the value.  */
1119169689Skan#define SAVE_EXPR_RESOLVED_P(NODE) \
1120169689Skan  (TREE_CHECK (NODE, SAVE_EXPR)->common.public_flag)
1121169689Skan
1122169689Skan/* In any expression, decl, or constant, nonzero means it has side effects or
1123169689Skan   reevaluation of the whole expression could produce a different value.
1124169689Skan   This is set if any subexpression is a function call, a side effect or a
1125169689Skan   reference to a volatile variable.  In a ..._DECL, this is set only if the
1126169689Skan   declaration said `volatile'.  This will never be set for a constant.  */
1127169689Skan#define TREE_SIDE_EFFECTS(NODE) \
1128169689Skan  (NON_TYPE_CHECK (NODE)->common.side_effects_flag)
1129169689Skan
1130169689Skan/* In a LABEL_DECL, nonzero means this label had its address taken
1131169689Skan   and therefore can never be deleted and is a jump target for
1132169689Skan   computed gotos.  */
1133169689Skan#define FORCED_LABEL(NODE) ((NODE)->common.side_effects_flag)
1134169689Skan
113518334Speter/* Nonzero means this expression is volatile in the C sense:
113618334Speter   its address should be of type `volatile WHATEVER *'.
113718334Speter   In other words, the declared item is volatile qualified.
113818334Speter   This is used in _DECL nodes and _REF nodes.
1139169689Skan   On a FUNCTION_DECL node, this means the function does not
1140169689Skan   return normally.  This is the same effect as setting
1141169689Skan   the attribute noreturn on the function in C.
114218334Speter
114318334Speter   In a ..._TYPE node, means this type is volatile-qualified.
114418334Speter   But use TYPE_VOLATILE instead of this macro when the node is a type,
114518334Speter   because eventually we may make that a different bit.
114618334Speter
114718334Speter   If this bit is set in an expression, so is TREE_SIDE_EFFECTS.  */
114818334Speter#define TREE_THIS_VOLATILE(NODE) ((NODE)->common.volatile_flag)
114918334Speter
1150169689Skan/* Nonzero means this node will not trap.  In an INDIRECT_REF, means
1151169689Skan   accessing the memory pointed to won't generate a trap.  However,
1152169689Skan   this only applies to an object when used appropriately: it doesn't
1153169689Skan   mean that writing a READONLY mem won't trap. Similarly for
1154169689Skan   ALIGN_INDIRECT_REF and MISALIGNED_INDIRECT_REF.
1155169689Skan
1156169689Skan   In ARRAY_REF and ARRAY_RANGE_REF means that we know that the index
1157169689Skan   (or slice of the array) always belongs to the range of the array.
1158169689Skan   I.e. that the access will not trap, provided that the access to
1159169689Skan   the base to the array will not trap.  */
1160169689Skan#define TREE_THIS_NOTRAP(NODE) ((NODE)->common.nothrow_flag)
1161169689Skan
116218334Speter/* In a VAR_DECL, PARM_DECL or FIELD_DECL, or any kind of ..._REF node,
1163169689Skan   nonzero means it may not be the lhs of an assignment.  */
1164169689Skan#define TREE_READONLY(NODE) (NON_TYPE_CHECK (NODE)->common.readonly_flag)
116518334Speter
1166132718Skan/* Nonzero if NODE is a _DECL with TREE_READONLY set.  */
1167169689Skan#define TREE_READONLY_DECL_P(NODE)\
1168169689Skan	(DECL_P (NODE) && TREE_READONLY (NODE))
116990075Sobrien
1170169689Skan/* Value of expression is constant.  Always on in all ..._CST nodes.  May
1171169689Skan   also appear in an expression or decl where the value is constant.  */
1172169689Skan#define TREE_CONSTANT(NODE) (NON_TYPE_CHECK (NODE)->common.constant_flag)
117318334Speter
1174169689Skan/* Nonzero if NODE, a type, has had its sizes gimplified.  */
1175169689Skan#define TYPE_SIZES_GIMPLIFIED(NODE) (TYPE_CHECK (NODE)->common.constant_flag)
117618334Speter
1177169689Skan/* In a decl (most significantly a FIELD_DECL), means an unsigned field.  */
1178169689Skan#define DECL_UNSIGNED(NODE) (DECL_COMMON_CHECK (NODE)->common.unsigned_flag)
117990075Sobrien
1180169689Skan/* In a BIT_FIELD_REF, means the bitfield is to be interpreted as unsigned.  */
1181169689Skan#define BIT_FIELD_REF_UNSIGNED(NODE) \
1182169689Skan  (BIT_FIELD_REF_CHECK (NODE)->common.unsigned_flag)
1183169689Skan
1184169689Skan/* In integral and pointer types, means an unsigned type.  */
1185169689Skan#define TYPE_UNSIGNED(NODE) (TYPE_CHECK (NODE)->common.unsigned_flag)
1186169689Skan
118718334Speter/* Nonzero in a VAR_DECL means assembler code has been written.
118818334Speter   Nonzero in a FUNCTION_DECL means that the function has been compiled.
118918334Speter   This is interesting in an inline function, since it might not need
119018334Speter   to be compiled separately.
119118334Speter   Nonzero in a RECORD_TYPE, UNION_TYPE, QUAL_UNION_TYPE or ENUMERAL_TYPE
119218334Speter   if the sdb debugging info for the type has been written.
1193169689Skan   In a BLOCK node, nonzero if reorder_blocks has already seen this block.
1194169689Skan   In an SSA_NAME node, nonzero if the SSA_NAME occurs in an abnormal
1195169689Skan   PHI node.  */
119618334Speter#define TREE_ASM_WRITTEN(NODE) ((NODE)->common.asm_written_flag)
119718334Speter
119818334Speter/* Nonzero in a _DECL if the name is used in its scope.
119918334Speter   Nonzero in an expr node means inhibit warning if value is unused.
120018334Speter   In IDENTIFIER_NODEs, this means that some extern decl for this name
1201169689Skan   was used.
1202169689Skan   In a BLOCK, this means that the block contains variables that are used.  */
120318334Speter#define TREE_USED(NODE) ((NODE)->common.used_flag)
120418334Speter
120590075Sobrien/* In a FUNCTION_DECL, nonzero means a call to the function cannot throw
120690075Sobrien   an exception.  In a CALL_EXPR, nonzero means the call cannot throw.  */
120790075Sobrien#define TREE_NOTHROW(NODE) ((NODE)->common.nothrow_flag)
120818334Speter
1209169689Skan/* In a CALL_EXPR, means that it's safe to use the target of the call
1210169689Skan   expansion as the return slot for a call that returns in memory.  */
1211169689Skan#define CALL_EXPR_RETURN_SLOT_OPT(NODE) ((NODE)->common.private_flag)
1212132718Skan
1213169689Skan/* In a RESULT_DECL or PARM_DECL, means that it is passed by invisible
1214169689Skan   reference (and the TREE_TYPE is a pointer to the true type).  */
1215169689Skan#define DECL_BY_REFERENCE(NODE) (DECL_COMMON_CHECK (NODE)->common.private_flag)
1216169689Skan
1217132718Skan/* In a CALL_EXPR, means that the call is the jump from a thunk to the
1218132718Skan   thunked-to function.  */
1219169689Skan#define CALL_FROM_THUNK_P(NODE) (CALL_EXPR_CHECK (NODE)->common.protected_flag)
1220132718Skan
122190075Sobrien/* In a type, nonzero means that all objects of the type are guaranteed by the
122290075Sobrien   language or front-end to be properly aligned, so we can indicate that a MEM
122390075Sobrien   of this type is aligned at least to the alignment of the type, even if it
122490075Sobrien   doesn't appear that it is.  We see this, for example, in object-oriented
122590075Sobrien   languages where a tag field may show this is an object of a more-aligned
1226169689Skan   variant of the more generic type.
1227169689Skan
1228169689Skan   In an SSA_NAME node, nonzero if the SSA_NAME node is on the SSA_NAME
1229169689Skan   freelist.  */
123090075Sobrien#define TYPE_ALIGN_OK(NODE) (TYPE_CHECK (NODE)->common.nothrow_flag)
123190075Sobrien
123218334Speter/* Used in classes in C++.  */
123318334Speter#define TREE_PRIVATE(NODE) ((NODE)->common.private_flag)
123418334Speter/* Used in classes in C++.
123518334Speter   In a BLOCK node, this is BLOCK_HANDLER_BLOCK.  */
123618334Speter#define TREE_PROTECTED(NODE) ((NODE)->common.protected_flag)
123718334Speter
1238169689Skan/* Nonzero in a _DECL if the use of the name is defined as a
123990075Sobrien   deprecated feature by __attribute__((deprecated)).  */
1240169689Skan#define TREE_DEPRECATED(NODE) \
1241169689Skan  ((NODE)->common.deprecated_flag)
124290075Sobrien
1243260918Spfg/* APPLE LOCAL begin "unavailable" attribute (Radar 2809697) */
1244260918Spfg/* Nonzero in a IDENTIFIER_NODE if the use of the name is defined as a
1245260918Spfg   unavailable feature by __attribute__((unavailable)).  */
1246260918Spfg#define TREE_UNAVAILABLE(NODE) ((NODE)->common.unavailable_flag)
1247260918Spfg/* APPLE LOCAL end "unavailable" attribute (Radar 2809697) */
1248260918Spfg
1249169689Skan/* Nonzero in an IDENTIFIER_NODE if the name is a local alias, whose
1250169689Skan   uses are to be substituted for uses of the TREE_CHAINed identifier.  */
1251169689Skan#define IDENTIFIER_TRANSPARENT_ALIAS(NODE) \
1252169689Skan  (IDENTIFIER_NODE_CHECK (NODE)->common.deprecated_flag)
1253169689Skan
1254169689Skan/* Value of expression is function invariant.  A strict subset of
1255169689Skan   TREE_CONSTANT, such an expression is constant over any one function
1256169689Skan   invocation, though not across different invocations.  May appear in
1257169689Skan   any expression node.  */
1258169689Skan#define TREE_INVARIANT(NODE) ((NODE)->common.invariant_flag)
1259169689Skan
126018334Speter/* These flags are available for each language front end to use internally.  */
126118334Speter#define TREE_LANG_FLAG_0(NODE) ((NODE)->common.lang_flag_0)
126218334Speter#define TREE_LANG_FLAG_1(NODE) ((NODE)->common.lang_flag_1)
126318334Speter#define TREE_LANG_FLAG_2(NODE) ((NODE)->common.lang_flag_2)
126418334Speter#define TREE_LANG_FLAG_3(NODE) ((NODE)->common.lang_flag_3)
126518334Speter#define TREE_LANG_FLAG_4(NODE) ((NODE)->common.lang_flag_4)
126618334Speter#define TREE_LANG_FLAG_5(NODE) ((NODE)->common.lang_flag_5)
126718334Speter#define TREE_LANG_FLAG_6(NODE) ((NODE)->common.lang_flag_6)
126818334Speter
126918334Speter/* Define additional fields and accessors for nodes representing constants.  */
127018334Speter
127118334Speter/* In an INTEGER_CST node.  These two together make a 2-word integer.
127218334Speter   If the data type is signed, the value is sign-extended to 2 words
127318334Speter   even though not all of them may really be in use.
127418334Speter   In an unsigned constant shorter than 2 words, the extra bits are 0.  */
127590075Sobrien#define TREE_INT_CST(NODE) (INTEGER_CST_CHECK (NODE)->int_cst.int_cst)
127690075Sobrien#define TREE_INT_CST_LOW(NODE) (TREE_INT_CST (NODE).low)
127790075Sobrien#define TREE_INT_CST_HIGH(NODE) (TREE_INT_CST (NODE).high)
127818334Speter
127990075Sobrien#define INT_CST_LT(A, B)				\
128090075Sobrien  (TREE_INT_CST_HIGH (A) < TREE_INT_CST_HIGH (B)	\
128190075Sobrien   || (TREE_INT_CST_HIGH (A) == TREE_INT_CST_HIGH (B)	\
128290075Sobrien       && TREE_INT_CST_LOW (A) < TREE_INT_CST_LOW (B)))
128318334Speter
128490075Sobrien#define INT_CST_LT_UNSIGNED(A, B)				\
128590075Sobrien  (((unsigned HOST_WIDE_INT) TREE_INT_CST_HIGH (A)		\
128690075Sobrien    < (unsigned HOST_WIDE_INT) TREE_INT_CST_HIGH (B))		\
128790075Sobrien   || (((unsigned HOST_WIDE_INT) TREE_INT_CST_HIGH (A)		\
1288117395Skan	== (unsigned HOST_WIDE_INT) TREE_INT_CST_HIGH (B))	\
128990075Sobrien       && TREE_INT_CST_LOW (A) < TREE_INT_CST_LOW (B)))
1290132718Skan
1291117395Skanstruct tree_int_cst GTY(())
129218334Speter{
129390075Sobrien  struct tree_common common;
1294169689Skan  double_int int_cst;
129518334Speter};
129618334Speter
1297117395Skan/* In a REAL_CST node.  struct real_value is an opaque entity, with
1298117395Skan   manipulators defined in real.h.  We don't want tree.h depending on
1299117395Skan   real.h and transitively on tm.h.  */
1300117395Skanstruct real_value;
130118334Speter
1302117395Skan#define TREE_REAL_CST_PTR(NODE) (REAL_CST_CHECK (NODE)->real_cst.real_cst_ptr)
1303117395Skan#define TREE_REAL_CST(NODE) (*TREE_REAL_CST_PTR (NODE))
130490075Sobrien
1305117395Skanstruct tree_real_cst GTY(())
130618334Speter{
130790075Sobrien  struct tree_common common;
1308117395Skan  struct real_value * real_cst_ptr;
130918334Speter};
131018334Speter
131118334Speter/* In a STRING_CST */
131250397Sobrien#define TREE_STRING_LENGTH(NODE) (STRING_CST_CHECK (NODE)->string.length)
1313169689Skan#define TREE_STRING_POINTER(NODE) \
1314169689Skan  ((const char *)(STRING_CST_CHECK (NODE)->string.str))
131518334Speter
1316117395Skanstruct tree_string GTY(())
131718334Speter{
131890075Sobrien  struct tree_common common;
131918334Speter  int length;
1320169689Skan  char str[1];
132118334Speter};
132218334Speter
132318334Speter/* In a COMPLEX_CST node.  */
132450397Sobrien#define TREE_REALPART(NODE) (COMPLEX_CST_CHECK (NODE)->complex.real)
132550397Sobrien#define TREE_IMAGPART(NODE) (COMPLEX_CST_CHECK (NODE)->complex.imag)
132618334Speter
1327117395Skanstruct tree_complex GTY(())
132818334Speter{
132990075Sobrien  struct tree_common common;
133090075Sobrien  tree real;
133190075Sobrien  tree imag;
133218334Speter};
133396263Sobrien
133496263Sobrien/* In a VECTOR_CST node.  */
133596263Sobrien#define TREE_VECTOR_CST_ELTS(NODE) (VECTOR_CST_CHECK (NODE)->vector.elements)
133696263Sobrien
1337117395Skanstruct tree_vector GTY(())
133896263Sobrien{
133996263Sobrien  struct tree_common common;
134096263Sobrien  tree elements;
134196263Sobrien};
134218334Speter
1343169689Skan#include "symtab.h"
134490075Sobrien
134518334Speter/* Define fields and accessors for some special-purpose tree nodes.  */
134618334Speter
134790075Sobrien#define IDENTIFIER_LENGTH(NODE) \
134890075Sobrien  (IDENTIFIER_NODE_CHECK (NODE)->identifier.id.len)
134990075Sobrien#define IDENTIFIER_POINTER(NODE) \
135090075Sobrien  ((const char *) IDENTIFIER_NODE_CHECK (NODE)->identifier.id.str)
1351117395Skan#define IDENTIFIER_HASH_VALUE(NODE) \
1352117395Skan  (IDENTIFIER_NODE_CHECK (NODE)->identifier.id.hash_value)
135318334Speter
135490075Sobrien/* Translate a hash table identifier pointer to a tree_identifier
135590075Sobrien   pointer, and vice versa.  */
135690075Sobrien
135790075Sobrien#define HT_IDENT_TO_GCC_IDENT(NODE) \
135890075Sobrien  ((tree) ((char *) (NODE) - sizeof (struct tree_common)))
135990075Sobrien#define GCC_IDENT_TO_HT_IDENT(NODE) (&((struct tree_identifier *) (NODE))->id)
136090075Sobrien
1361117395Skanstruct tree_identifier GTY(())
136218334Speter{
136390075Sobrien  struct tree_common common;
136490075Sobrien  struct ht_identifier id;
136518334Speter};
136618334Speter
136718334Speter/* In a TREE_LIST node.  */
136850397Sobrien#define TREE_PURPOSE(NODE) (TREE_LIST_CHECK (NODE)->list.purpose)
136950397Sobrien#define TREE_VALUE(NODE) (TREE_LIST_CHECK (NODE)->list.value)
137018334Speter
1371117395Skanstruct tree_list GTY(())
137218334Speter{
137390075Sobrien  struct tree_common common;
137490075Sobrien  tree purpose;
137590075Sobrien  tree value;
137618334Speter};
137718334Speter
137818334Speter/* In a TREE_VEC node.  */
137950397Sobrien#define TREE_VEC_LENGTH(NODE) (TREE_VEC_CHECK (NODE)->vec.length)
138090075Sobrien#define TREE_VEC_END(NODE) \
138190075Sobrien  ((void) TREE_VEC_CHECK (NODE), &((NODE)->vec.a[(NODE)->vec.length]))
138218334Speter
1383117395Skan#define TREE_VEC_ELT(NODE,I) TREE_VEC_ELT_CHECK (NODE, I)
1384117395Skan
1385117395Skanstruct tree_vec GTY(())
138618334Speter{
138790075Sobrien  struct tree_common common;
138818334Speter  int length;
1389117395Skan  tree GTY ((length ("TREE_VEC_LENGTH ((tree)&%h)"))) a[1];
139018334Speter};
139118334Speter
1392169689Skan/* In a CONSTRUCTOR node.  */
1393169689Skan#define CONSTRUCTOR_ELTS(NODE) (CONSTRUCTOR_CHECK (NODE)->constructor.elts)
139418334Speter
1395169689Skan/* Iterate through the vector V of CONSTRUCTOR_ELT elements, yielding the
1396169689Skan   value of each element (stored within VAL). IX must be a scratch variable
1397169689Skan   of unsigned integer type.  */
1398169689Skan#define FOR_EACH_CONSTRUCTOR_VALUE(V, IX, VAL) \
1399169689Skan  for (IX = 0; (IX >= VEC_length (constructor_elt, V)) \
1400169689Skan	       ? false \
1401169689Skan	       : ((VAL = VEC_index (constructor_elt, V, IX)->value), \
1402169689Skan	       true); \
1403169689Skan       (IX)++)
1404132718Skan
1405169689Skan/* Iterate through the vector V of CONSTRUCTOR_ELT elements, yielding both
1406169689Skan   the value of each element (stored within VAL) and its index (stored
1407169689Skan   within INDEX). IX must be a scratch variable of unsigned integer type.  */
1408169689Skan#define FOR_EACH_CONSTRUCTOR_ELT(V, IX, INDEX, VAL) \
1409169689Skan  for (IX = 0; (IX >= VEC_length (constructor_elt, V)) \
1410169689Skan	       ? false \
1411169689Skan	       : ((VAL = VEC_index (constructor_elt, V, IX)->value), \
1412169689Skan		  (INDEX = VEC_index (constructor_elt, V, IX)->index), \
1413169689Skan	       true); \
1414169689Skan       (IX)++)
141518334Speter
1416169689Skan/* Append a new constructor element to V, with the specified INDEX and VAL.  */
1417169689Skan#define CONSTRUCTOR_APPEND_ELT(V, INDEX, VALUE) \
1418169689Skan  do { \
1419169689Skan    constructor_elt *_ce___ = VEC_safe_push (constructor_elt, gc, V, NULL); \
1420169689Skan    _ce___->index = INDEX; \
1421169689Skan    _ce___->value = VALUE; \
1422169689Skan  } while (0)
142318334Speter
1424169689Skan/* A single element of a CONSTRUCTOR. VALUE holds the actual value of the
1425169689Skan   element. INDEX can optionally design the position of VALUE: in arrays,
1426169689Skan   it is the index where VALUE has to be placed; in structures, it is the
1427169689Skan   FIELD_DECL of the member.  */
1428169689Skantypedef struct constructor_elt_d GTY(())
1429169689Skan{
1430169689Skan  tree index;
1431169689Skan  tree value;
1432169689Skan} constructor_elt;
143318334Speter
1434169689SkanDEF_VEC_O(constructor_elt);
1435169689SkanDEF_VEC_ALLOC_O(constructor_elt,gc);
143618334Speter
1437169689Skanstruct tree_constructor GTY(())
1438169689Skan{
1439169689Skan  struct tree_common common;
1440169689Skan  VEC(constructor_elt,gc) *elts;
1441169689Skan};
1442169689Skan
1443169689Skan/* Define fields and accessors for some nodes that represent expressions.  */
1444169689Skan
1445169689Skan/* Nonzero if NODE is an empty statement (NOP_EXPR <0>).  */
1446169689Skan#define IS_EMPTY_STMT(NODE)	(TREE_CODE (NODE) == NOP_EXPR \
1447169689Skan				 && VOID_TYPE_P (TREE_TYPE (NODE)) \
1448169689Skan				 && integer_zerop (TREE_OPERAND (NODE, 0)))
1449169689Skan
145018334Speter/* In ordinary expression nodes.  */
1451132718Skan#define TREE_OPERAND(NODE, I) TREE_OPERAND_CHECK (NODE, I)
145250397Sobrien#define TREE_COMPLEXITY(NODE) (EXPR_CHECK (NODE)->exp.complexity)
145318334Speter
145452284Sobrien/* In a LOOP_EXPR node.  */
1455132718Skan#define LOOP_EXPR_BODY(NODE) TREE_OPERAND_CHECK_CODE (NODE, LOOP_EXPR, 0)
145652284Sobrien
1457169689Skan#ifdef USE_MAPPED_LOCATION
1458169689Skan/* The source location of this expression.  Non-tree_exp nodes such as
1459169689Skan   decls and constants can be shared among multiple locations, so
1460169689Skan   return nothing.  */
1461169689Skan#define EXPR_LOCATION(NODE)					\
1462169689Skan  (EXPR_P (NODE) ? (NODE)->exp.locus : UNKNOWN_LOCATION)
1463169689Skan#define SET_EXPR_LOCATION(NODE, FROM) \
1464169689Skan  (EXPR_CHECK (NODE)->exp.locus = (FROM))
1465169689Skan#define EXPR_HAS_LOCATION(NODE) (EXPR_LOCATION (NODE) != UNKNOWN_LOCATION)
1466169689Skan/* EXPR_LOCUS and SET_EXPR_LOCUS are deprecated.  */
1467169689Skan#define EXPR_LOCUS(NODE)					\
1468169689Skan  (EXPR_P (NODE) ? &(NODE)->exp.locus : (location_t *)NULL)
1469169689Skan#define SET_EXPR_LOCUS(NODE, FROM) \
1470169689Skan  do { source_location *loc_tmp = FROM; \
1471169689Skan       EXPR_CHECK (NODE)->exp.locus \
1472169689Skan       = loc_tmp == NULL ? UNKNOWN_LOCATION : *loc_tmp; } while (0)
1473169689Skan#define EXPR_FILENAME(NODE) \
1474169689Skan  LOCATION_FILE (EXPR_CHECK (NODE)->exp.locus)
1475169689Skan#define EXPR_LINENO(NODE) \
1476169689Skan  LOCATION_LINE (EXPR_CHECK (NODE)->exp.locus)
1477169689Skan#else
1478169689Skan/* The source location of this expression.  Non-tree_exp nodes such as
1479169689Skan   decls and constants can be shared among multiple locations, so
1480169689Skan   return nothing.  */
1481169689Skan#define EXPR_LOCUS(NODE)					\
1482169689Skan  (EXPR_P (NODE) ? (NODE)->exp.locus : (location_t *)NULL)
1483169689Skan#define SET_EXPR_LOCUS(NODE, FROM) \
1484169689Skan  (EXPR_CHECK (NODE)->exp.locus = (FROM))
1485169689Skan#define SET_EXPR_LOCATION(NODE, FROM) annotate_with_locus (NODE, FROM)
1486169689Skan#define EXPR_FILENAME(NODE) \
1487169689Skan  (EXPR_CHECK (NODE)->exp.locus->file)
1488169689Skan#define EXPR_LINENO(NODE) \
1489169689Skan  (EXPR_CHECK (NODE)->exp.locus->line)
1490169689Skan#define EXPR_HAS_LOCATION(NODE) (EXPR_LOCUS (NODE) != NULL)
1491169689Skan#define EXPR_LOCATION(NODE) \
1492169689Skan  (EXPR_HAS_LOCATION(NODE) ? *(NODE)->exp.locus : UNKNOWN_LOCATION)
1493169689Skan#endif
149450397Sobrien
1495117395Skan/* In a TARGET_EXPR node.  */
1496132718Skan#define TARGET_EXPR_SLOT(NODE) TREE_OPERAND_CHECK_CODE (NODE, TARGET_EXPR, 0)
1497132718Skan#define TARGET_EXPR_INITIAL(NODE) TREE_OPERAND_CHECK_CODE (NODE, TARGET_EXPR, 1)
1498132718Skan#define TARGET_EXPR_CLEANUP(NODE) TREE_OPERAND_CHECK_CODE (NODE, TARGET_EXPR, 2)
1499117395Skan
1500169689Skan/* DECL_EXPR accessor. This gives access to the DECL associated with
1501169689Skan   the given declaration statement.  */
1502169689Skan#define DECL_EXPR_DECL(NODE)    TREE_OPERAND (DECL_EXPR_CHECK (NODE), 0)
1503169689Skan
1504169689Skan#define EXIT_EXPR_COND(NODE)	     TREE_OPERAND (EXIT_EXPR_CHECK (NODE), 0)
1505169689Skan
1506169689Skan/* SWITCH_EXPR accessors. These give access to the condition, body and
1507169689Skan   original condition type (before any compiler conversions)
1508169689Skan   of the switch statement, respectively.  */
1509169689Skan#define SWITCH_COND(NODE)       TREE_OPERAND (SWITCH_EXPR_CHECK (NODE), 0)
1510169689Skan#define SWITCH_BODY(NODE)       TREE_OPERAND (SWITCH_EXPR_CHECK (NODE), 1)
1511169689Skan#define SWITCH_LABELS(NODE)     TREE_OPERAND (SWITCH_EXPR_CHECK (NODE), 2)
1512169689Skan
1513169689Skan/* CASE_LABEL_EXPR accessors. These give access to the high and low values
1514169689Skan   of a case label, respectively.  */
1515169689Skan#define CASE_LOW(NODE)          	TREE_OPERAND (CASE_LABEL_EXPR_CHECK (NODE), 0)
1516169689Skan#define CASE_HIGH(NODE)         	TREE_OPERAND (CASE_LABEL_EXPR_CHECK (NODE), 1)
1517169689Skan#define CASE_LABEL(NODE)		TREE_OPERAND (CASE_LABEL_EXPR_CHECK (NODE), 2)
1518169689Skan
1519169689Skan/* The operands of a TARGET_MEM_REF.  */
1520169689Skan#define TMR_SYMBOL(NODE) (TREE_OPERAND (TARGET_MEM_REF_CHECK (NODE), 0))
1521169689Skan#define TMR_BASE(NODE) (TREE_OPERAND (TARGET_MEM_REF_CHECK (NODE), 1))
1522169689Skan#define TMR_INDEX(NODE) (TREE_OPERAND (TARGET_MEM_REF_CHECK (NODE), 2))
1523169689Skan#define TMR_STEP(NODE) (TREE_OPERAND (TARGET_MEM_REF_CHECK (NODE), 3))
1524169689Skan#define TMR_OFFSET(NODE) (TREE_OPERAND (TARGET_MEM_REF_CHECK (NODE), 4))
1525169689Skan#define TMR_ORIGINAL(NODE) (TREE_OPERAND (TARGET_MEM_REF_CHECK (NODE), 5))
1526169689Skan#define TMR_TAG(NODE) (TREE_OPERAND (TARGET_MEM_REF_CHECK (NODE), 6))
1527169689Skan
1528169689Skan/* The operands of a BIND_EXPR.  */
1529169689Skan#define BIND_EXPR_VARS(NODE) (TREE_OPERAND (BIND_EXPR_CHECK (NODE), 0))
1530169689Skan#define BIND_EXPR_BODY(NODE) (TREE_OPERAND (BIND_EXPR_CHECK (NODE), 1))
1531169689Skan#define BIND_EXPR_BLOCK(NODE) (TREE_OPERAND (BIND_EXPR_CHECK (NODE), 2))
1532169689Skan
1533169689Skan/* GOTO_EXPR accessor. This gives access to the label associated with
1534169689Skan   a goto statement.  */
1535169689Skan#define GOTO_DESTINATION(NODE)  TREE_OPERAND ((NODE), 0)
1536169689Skan
1537169689Skan/* ASM_EXPR accessors. ASM_STRING returns a STRING_CST for the
1538169689Skan   instruction (e.g., "mov x, y"). ASM_OUTPUTS, ASM_INPUTS, and
1539169689Skan   ASM_CLOBBERS represent the outputs, inputs, and clobbers for the
1540169689Skan   statement.  */
1541169689Skan#define ASM_STRING(NODE)        TREE_OPERAND (ASM_EXPR_CHECK (NODE), 0)
1542169689Skan#define ASM_OUTPUTS(NODE)       TREE_OPERAND (ASM_EXPR_CHECK (NODE), 1)
1543169689Skan#define ASM_INPUTS(NODE)        TREE_OPERAND (ASM_EXPR_CHECK (NODE), 2)
1544169689Skan#define ASM_CLOBBERS(NODE)      TREE_OPERAND (ASM_EXPR_CHECK (NODE), 3)
1545169689Skan/* Nonzero if we want to create an ASM_INPUT instead of an
1546169689Skan   ASM_OPERAND with no operands.  */
1547169689Skan#define ASM_INPUT_P(NODE) (TREE_STATIC (NODE))
1548169689Skan#define ASM_VOLATILE_P(NODE) (TREE_PUBLIC (NODE))
1549169689Skan
1550169689Skan/* COND_EXPR accessors.  */
1551169689Skan#define COND_EXPR_COND(NODE)	(TREE_OPERAND (COND_EXPR_CHECK (NODE), 0))
1552169689Skan#define COND_EXPR_THEN(NODE)	(TREE_OPERAND (COND_EXPR_CHECK (NODE), 1))
1553169689Skan#define COND_EXPR_ELSE(NODE)	(TREE_OPERAND (COND_EXPR_CHECK (NODE), 2))
1554169689Skan
1555169689Skan/* LABEL_EXPR accessor. This gives access to the label associated with
1556169689Skan   the given label expression.  */
1557169689Skan#define LABEL_EXPR_LABEL(NODE)  TREE_OPERAND (LABEL_EXPR_CHECK (NODE), 0)
1558169689Skan
1559169689Skan/* VDEF_EXPR accessors are specified in tree-flow.h, along with the other
1560169689Skan   accessors for SSA operands.  */
1561169689Skan
1562169689Skan/* CATCH_EXPR accessors.  */
1563169689Skan#define CATCH_TYPES(NODE)	TREE_OPERAND (CATCH_EXPR_CHECK (NODE), 0)
1564169689Skan#define CATCH_BODY(NODE)	TREE_OPERAND (CATCH_EXPR_CHECK (NODE), 1)
1565169689Skan
1566169689Skan/* EH_FILTER_EXPR accessors.  */
1567169689Skan#define EH_FILTER_TYPES(NODE)	TREE_OPERAND (EH_FILTER_EXPR_CHECK (NODE), 0)
1568169689Skan#define EH_FILTER_FAILURE(NODE)	TREE_OPERAND (EH_FILTER_EXPR_CHECK (NODE), 1)
1569169689Skan#define EH_FILTER_MUST_NOT_THROW(NODE) TREE_STATIC (EH_FILTER_EXPR_CHECK (NODE))
1570169689Skan
1571169689Skan/* OBJ_TYPE_REF accessors.  */
1572169689Skan#define OBJ_TYPE_REF_EXPR(NODE)	  TREE_OPERAND (OBJ_TYPE_REF_CHECK (NODE), 0)
1573169689Skan#define OBJ_TYPE_REF_OBJECT(NODE) TREE_OPERAND (OBJ_TYPE_REF_CHECK (NODE), 1)
1574169689Skan#define OBJ_TYPE_REF_TOKEN(NODE)  TREE_OPERAND (OBJ_TYPE_REF_CHECK (NODE), 2)
1575169689Skan
1576169689Skan/* ASSERT_EXPR accessors.  */
1577169689Skan#define ASSERT_EXPR_VAR(NODE)	TREE_OPERAND (ASSERT_EXPR_CHECK (NODE), 0)
1578169689Skan#define ASSERT_EXPR_COND(NODE)	TREE_OPERAND (ASSERT_EXPR_CHECK (NODE), 1)
1579169689Skan
1580169689Skan/* OpenMP directive and clause accessors.  */
1581169689Skan
1582169689Skan#define OMP_BODY(NODE) \
1583169689Skan  TREE_OPERAND (TREE_RANGE_CHECK (NODE, OMP_PARALLEL, OMP_CRITICAL), 0)
1584169689Skan#define OMP_CLAUSES(NODE) \
1585169689Skan  TREE_OPERAND (TREE_RANGE_CHECK (NODE, OMP_PARALLEL, OMP_SINGLE), 1)
1586169689Skan
1587169689Skan#define OMP_PARALLEL_BODY(NODE)    TREE_OPERAND (OMP_PARALLEL_CHECK (NODE), 0)
1588169689Skan#define OMP_PARALLEL_CLAUSES(NODE) TREE_OPERAND (OMP_PARALLEL_CHECK (NODE), 1)
1589169689Skan#define OMP_PARALLEL_FN(NODE) TREE_OPERAND (OMP_PARALLEL_CHECK (NODE), 2)
1590169689Skan#define OMP_PARALLEL_DATA_ARG(NODE) TREE_OPERAND (OMP_PARALLEL_CHECK (NODE), 3)
1591169689Skan
1592169689Skan#define OMP_FOR_BODY(NODE)	   TREE_OPERAND (OMP_FOR_CHECK (NODE), 0)
1593169689Skan#define OMP_FOR_CLAUSES(NODE)	   TREE_OPERAND (OMP_FOR_CHECK (NODE), 1)
1594169689Skan#define OMP_FOR_INIT(NODE)	   TREE_OPERAND (OMP_FOR_CHECK (NODE), 2)
1595169689Skan#define OMP_FOR_COND(NODE)	   TREE_OPERAND (OMP_FOR_CHECK (NODE), 3)
1596169689Skan#define OMP_FOR_INCR(NODE)	   TREE_OPERAND (OMP_FOR_CHECK (NODE), 4)
1597169689Skan#define OMP_FOR_PRE_BODY(NODE)	   TREE_OPERAND (OMP_FOR_CHECK (NODE), 5)
1598169689Skan
1599169689Skan#define OMP_SECTIONS_BODY(NODE)    TREE_OPERAND (OMP_SECTIONS_CHECK (NODE), 0)
1600169689Skan#define OMP_SECTIONS_CLAUSES(NODE) TREE_OPERAND (OMP_SECTIONS_CHECK (NODE), 1)
1601169689Skan
1602169689Skan#define OMP_SECTION_BODY(NODE)	   TREE_OPERAND (OMP_SECTION_CHECK (NODE), 0)
1603169689Skan
1604169689Skan#define OMP_SINGLE_BODY(NODE)	   TREE_OPERAND (OMP_SINGLE_CHECK (NODE), 0)
1605169689Skan#define OMP_SINGLE_CLAUSES(NODE)   TREE_OPERAND (OMP_SINGLE_CHECK (NODE), 1)
1606169689Skan
1607169689Skan#define OMP_MASTER_BODY(NODE)	   TREE_OPERAND (OMP_MASTER_CHECK (NODE), 0)
1608169689Skan
1609169689Skan#define OMP_ORDERED_BODY(NODE)	   TREE_OPERAND (OMP_ORDERED_CHECK (NODE), 0)
1610169689Skan
1611169689Skan#define OMP_CRITICAL_BODY(NODE)    TREE_OPERAND (OMP_CRITICAL_CHECK (NODE), 0)
1612169689Skan#define OMP_CRITICAL_NAME(NODE)    TREE_OPERAND (OMP_CRITICAL_CHECK (NODE), 1)
1613169689Skan
1614169689Skan#define OMP_CLAUSE_CHAIN(NODE)     TREE_CHAIN (OMP_CLAUSE_CHECK (NODE))
1615169689Skan#define OMP_CLAUSE_DECL(NODE)      					\
1616169689Skan  OMP_CLAUSE_OPERAND (OMP_CLAUSE_RANGE_CHECK (OMP_CLAUSE_CHECK (NODE),	\
1617169689Skan					      OMP_CLAUSE_PRIVATE,	\
1618169689Skan	                                      OMP_CLAUSE_COPYPRIVATE), 0)
1619169689Skan
1620169689Skan/* True on an OMP_SECTION statement that was the last lexical member.
1621169689Skan   This status is meaningful in the implementation of lastprivate.  */
1622169689Skan#define OMP_SECTION_LAST(NODE) \
1623169689Skan  TREE_PRIVATE (OMP_SECTION_CHECK (NODE))
1624169689Skan
1625169689Skan/* True on an OMP_RETURN statement if the return does not require a
1626169689Skan   thread synchronization via some sort of barrier.  The exact barrier
1627169689Skan   that would otherwise be emitted is dependent on the OMP statement
1628169689Skan   with which this return is associated.  */
1629169689Skan#define OMP_RETURN_NOWAIT(NODE) \
1630169689Skan  TREE_PRIVATE (OMP_RETURN_CHECK (NODE))
1631169689Skan
1632169689Skan/* True on an OMP_PARALLEL statement if it represents an explicit
1633169689Skan   combined parallel work-sharing constructs.  */
1634169689Skan#define OMP_PARALLEL_COMBINED(NODE) \
1635169689Skan  TREE_PRIVATE (OMP_PARALLEL_CHECK (NODE))
1636169689Skan
1637169689Skan/* True on a PRIVATE clause if its decl is kept around for debugging
1638169689Skan   information only and its DECL_VALUE_EXPR is supposed to point
1639169689Skan   to what it has been remapped to.  */
1640169689Skan#define OMP_CLAUSE_PRIVATE_DEBUG(NODE) \
1641169689Skan  TREE_PUBLIC (OMP_CLAUSE_SUBCODE_CHECK (NODE, OMP_CLAUSE_PRIVATE))
1642169689Skan
1643169689Skan/* True on a LASTPRIVATE clause if a FIRSTPRIVATE clause for the same
1644169689Skan   decl is present in the chain.  */
1645169689Skan#define OMP_CLAUSE_LASTPRIVATE_FIRSTPRIVATE(NODE) \
1646169689Skan  TREE_PUBLIC (OMP_CLAUSE_SUBCODE_CHECK (NODE, OMP_CLAUSE_LASTPRIVATE))
1647169689Skan
1648169689Skan#define OMP_CLAUSE_IF_EXPR(NODE) \
1649169689Skan  OMP_CLAUSE_OPERAND (OMP_CLAUSE_SUBCODE_CHECK (NODE, OMP_CLAUSE_IF), 0)
1650169689Skan#define OMP_CLAUSE_NUM_THREADS_EXPR(NODE) \
1651169689Skan  OMP_CLAUSE_OPERAND (OMP_CLAUSE_SUBCODE_CHECK (NODE, OMP_CLAUSE_NUM_THREADS),0)
1652169689Skan#define OMP_CLAUSE_SCHEDULE_CHUNK_EXPR(NODE) \
1653169689Skan  OMP_CLAUSE_OPERAND (OMP_CLAUSE_SUBCODE_CHECK (NODE, OMP_CLAUSE_SCHEDULE), 0)
1654169689Skan
1655169689Skan#define OMP_CLAUSE_REDUCTION_CODE(NODE)	\
1656169689Skan  (OMP_CLAUSE_SUBCODE_CHECK (NODE, OMP_CLAUSE_REDUCTION)->omp_clause.subcode.reduction_code)
1657169689Skan#define OMP_CLAUSE_REDUCTION_INIT(NODE) \
1658169689Skan  OMP_CLAUSE_OPERAND (OMP_CLAUSE_SUBCODE_CHECK (NODE, OMP_CLAUSE_REDUCTION), 1)
1659169689Skan#define OMP_CLAUSE_REDUCTION_MERGE(NODE) \
1660169689Skan  OMP_CLAUSE_OPERAND (OMP_CLAUSE_SUBCODE_CHECK (NODE, OMP_CLAUSE_REDUCTION), 2)
1661169689Skan#define OMP_CLAUSE_REDUCTION_PLACEHOLDER(NODE) \
1662169689Skan  OMP_CLAUSE_OPERAND (OMP_CLAUSE_SUBCODE_CHECK (NODE, OMP_CLAUSE_REDUCTION), 3)
1663169689Skan
1664169689Skanenum omp_clause_schedule_kind
1665169689Skan{
1666169689Skan  OMP_CLAUSE_SCHEDULE_STATIC,
1667169689Skan  OMP_CLAUSE_SCHEDULE_DYNAMIC,
1668169689Skan  OMP_CLAUSE_SCHEDULE_GUIDED,
1669169689Skan  OMP_CLAUSE_SCHEDULE_RUNTIME
1670169689Skan};
1671169689Skan
1672169689Skan#define OMP_CLAUSE_SCHEDULE_KIND(NODE) \
1673169689Skan  (OMP_CLAUSE_SUBCODE_CHECK (NODE, OMP_CLAUSE_SCHEDULE)->omp_clause.subcode.schedule_kind)
1674169689Skan
1675169689Skanenum omp_clause_default_kind
1676169689Skan{
1677169689Skan  OMP_CLAUSE_DEFAULT_UNSPECIFIED,
1678169689Skan  OMP_CLAUSE_DEFAULT_SHARED,
1679169689Skan  OMP_CLAUSE_DEFAULT_NONE,
1680169689Skan  OMP_CLAUSE_DEFAULT_PRIVATE
1681169689Skan};
1682169689Skan
1683169689Skan#define OMP_CLAUSE_DEFAULT_KIND(NODE) \
1684169689Skan  (OMP_CLAUSE_SUBCODE_CHECK (NODE, OMP_CLAUSE_DEFAULT)->omp_clause.subcode.default_kind)
1685169689Skan
1686117395Skanstruct tree_exp GTY(())
168718334Speter{
168890075Sobrien  struct tree_common common;
1689169689Skan  source_locus locus;
169018334Speter  int complexity;
1691169689Skan  tree block;
1692132718Skan  tree GTY ((special ("tree_exp"),
1693132718Skan	     desc ("TREE_CODE ((tree) &%0)")))
1694117395Skan    operands[1];
169518334Speter};
169618334Speter
1697169689Skan/* SSA_NAME accessors.  */
1698169689Skan
1699169689Skan/* Returns the variable being referenced.  Once released, this is the
1700169689Skan   only field that can be relied upon.  */
1701169689Skan#define SSA_NAME_VAR(NODE)	SSA_NAME_CHECK (NODE)->ssa_name.var
1702169689Skan
1703169689Skan/* Returns the statement which defines this reference.   Note that
1704169689Skan   we use the same field when chaining SSA_NAME nodes together on
1705169689Skan   the SSA_NAME freelist.  */
1706169689Skan#define SSA_NAME_DEF_STMT(NODE)	SSA_NAME_CHECK (NODE)->common.chain
1707169689Skan
1708169689Skan/* Returns the SSA version number of this SSA name.  Note that in
1709169689Skan   tree SSA, version numbers are not per variable and may be recycled.  */
1710169689Skan#define SSA_NAME_VERSION(NODE)	SSA_NAME_CHECK (NODE)->ssa_name.version
1711169689Skan
1712169689Skan/* Nonzero if this SSA name occurs in an abnormal PHI.  SSA_NAMES are
1713169689Skan   never output, so we can safely use the ASM_WRITTEN_FLAG for this
1714169689Skan   status bit.  */
1715169689Skan#define SSA_NAME_OCCURS_IN_ABNORMAL_PHI(NODE) \
1716169689Skan    SSA_NAME_CHECK (NODE)->common.asm_written_flag
1717169689Skan
1718169689Skan/* Nonzero if this SSA_NAME expression is currently on the free list of
1719169689Skan   SSA_NAMES.  Using NOTHROW_FLAG seems reasonably safe since throwing
1720169689Skan   has no meaning for an SSA_NAME.  */
1721169689Skan#define SSA_NAME_IN_FREE_LIST(NODE) \
1722169689Skan    SSA_NAME_CHECK (NODE)->common.nothrow_flag
1723169689Skan
1724169689Skan/* Attributes for SSA_NAMEs for pointer-type variables.  */
1725169689Skan#define SSA_NAME_PTR_INFO(N) \
1726169689Skan    SSA_NAME_CHECK (N)->ssa_name.ptr_info
1727169689Skan
1728169689Skan/* Get the value of this SSA_NAME, if available.  */
1729169689Skan#define SSA_NAME_VALUE(N) \
1730169689Skan   SSA_NAME_CHECK (N)->ssa_name.value_handle
1731169689Skan
1732169689Skan#ifndef _TREE_FLOW_H
1733169689Skanstruct ptr_info_def;
1734169689Skan#endif
1735169689Skan
1736169689Skan
1737169689Skan
1738169689Skan/* Immediate use linking structure.  This structure is used for maintaining
1739169689Skan   a doubly linked list of uses of an SSA_NAME.  */
1740169689Skantypedef struct ssa_use_operand_d GTY(())
1741169689Skan{
1742169689Skan  struct ssa_use_operand_d* GTY((skip(""))) prev;
1743169689Skan  struct ssa_use_operand_d* GTY((skip(""))) next;
1744169689Skan  tree GTY((skip(""))) stmt;
1745169689Skan  tree *GTY((skip(""))) use;
1746169689Skan} ssa_use_operand_t;
1747169689Skan
1748169689Skan/* Return the immediate_use information for an SSA_NAME. */
1749169689Skan#define SSA_NAME_IMM_USE_NODE(NODE) SSA_NAME_CHECK (NODE)->ssa_name.imm_uses
1750169689Skan
1751169689Skanstruct tree_ssa_name GTY(())
1752169689Skan{
1753169689Skan  struct tree_common common;
1754169689Skan
1755169689Skan  /* _DECL wrapped by this SSA name.  */
1756169689Skan  tree var;
1757169689Skan
1758169689Skan  /* SSA version number.  */
1759169689Skan  unsigned int version;
1760169689Skan
1761169689Skan  /* Pointer attributes used for alias analysis.  */
1762169689Skan  struct ptr_info_def *ptr_info;
1763169689Skan
1764169689Skan  /* Value for SSA name used by various passes.
1765169689Skan
1766169689Skan     Right now only invariants are allowed to persist beyond a pass in
1767169689Skan     this field; in the future we will allow VALUE_HANDLEs to persist
1768169689Skan     as well.  */
1769169689Skan  tree value_handle;
1770169689Skan
1771169689Skan  /* Immediate uses list for this SSA_NAME.  */
1772169689Skan  struct ssa_use_operand_d imm_uses;
1773169689Skan};
1774169689Skan
1775169689Skan/* In a PHI_NODE node.  */
1776169689Skan
1777169689Skan/* These 2 macros should be considered off limits for use by developers.  If
1778169689Skan   you wish to access the use or def fields of a PHI_NODE in the SSA
1779169689Skan   optimizers, use the accessor macros found in tree-ssa-operands.h.
1780169689Skan   These two macros are to be used only by those accessor macros, and other
1781169689Skan   select places where we *absolutely* must take the address of the tree.  */
1782169689Skan
1783169689Skan#define PHI_RESULT_TREE(NODE)		PHI_NODE_CHECK (NODE)->phi.result
1784169689Skan#define PHI_ARG_DEF_TREE(NODE, I)	PHI_NODE_ELT_CHECK (NODE, I).def
1785169689Skan
1786169689Skan/* PHI_NODEs for each basic block are chained together in a single linked
1787169689Skan   list.  The head of the list is linked from the block annotation, and
1788169689Skan   the link to the next PHI is in PHI_CHAIN.  */
1789169689Skan#define PHI_CHAIN(NODE)		TREE_CHAIN (PHI_NODE_CHECK (NODE))
1790169689Skan
1791169689Skan#define PHI_NUM_ARGS(NODE)		PHI_NODE_CHECK (NODE)->phi.num_args
1792169689Skan#define PHI_ARG_CAPACITY(NODE)		PHI_NODE_CHECK (NODE)->phi.capacity
1793169689Skan#define PHI_ARG_ELT(NODE, I)		PHI_NODE_ELT_CHECK (NODE, I)
1794169689Skan#define PHI_ARG_EDGE(NODE, I) 		(EDGE_PRED (PHI_BB ((NODE)), (I)))
1795169689Skan#define PHI_BB(NODE)			PHI_NODE_CHECK (NODE)->phi.bb
1796169689Skan#define PHI_ARG_IMM_USE_NODE(NODE, I)	PHI_NODE_ELT_CHECK (NODE, I).imm_use
1797169689Skan
1798169689Skanstruct phi_arg_d GTY(())
1799169689Skan{
1800169689Skan  /* imm_use MUST be the first element in struct because we do some
1801169689Skan     pointer arithmetic with it.  See phi_arg_index_from_use.  */
1802169689Skan  struct ssa_use_operand_d imm_use;
1803169689Skan  tree def;
1804169689Skan};
1805169689Skan
1806169689Skanstruct tree_phi_node GTY(())
1807169689Skan{
1808169689Skan  struct tree_common common;
1809169689Skan  tree result;
1810169689Skan  int num_args;
1811169689Skan  int capacity;
1812169689Skan
1813169689Skan  /* Basic block to that the phi node belongs.  */
1814169689Skan  struct basic_block_def *bb;
1815169689Skan
1816169689Skan  /* Arguments of the PHI node.  These are maintained in the same
1817169689Skan     order as predecessor edge vector BB->PREDS.  */
1818169689Skan  struct phi_arg_d GTY ((length ("((tree)&%h)->phi.num_args"))) a[1];
1819169689Skan};
1820169689Skan
1821169689Skan#define OMP_CLAUSE_CODE(NODE)					\
1822169689Skan	(OMP_CLAUSE_CHECK (NODE))->omp_clause.code
1823169689Skan
1824169689Skan#define OMP_CLAUSE_SET_CODE(NODE, CODE)				\
1825169689Skan	((OMP_CLAUSE_CHECK (NODE))->omp_clause.code = (CODE))
1826169689Skan
1827169689Skan#define OMP_CLAUSE_CODE(NODE)					\
1828169689Skan	(OMP_CLAUSE_CHECK (NODE))->omp_clause.code
1829169689Skan
1830169689Skan#define OMP_CLAUSE_OPERAND(NODE, I)				\
1831169689Skan	OMP_CLAUSE_ELT_CHECK (NODE, I)
1832169689Skan
1833169689Skanstruct tree_omp_clause GTY(())
1834169689Skan{
1835169689Skan  struct tree_common common;
1836169689Skan  enum omp_clause_code code;
1837169689Skan  union omp_clause_subcode {
1838169689Skan    enum omp_clause_default_kind  default_kind;
1839169689Skan    enum omp_clause_schedule_kind schedule_kind;
1840169689Skan    enum tree_code                reduction_code;
1841169689Skan  } GTY ((skip)) subcode;
1842169689Skan  tree GTY ((length ("omp_clause_num_ops[OMP_CLAUSE_CODE ((tree)&%h)]"))) ops[1];
1843169689Skan};
1844169689Skan
1845169689Skan
1846169689Skanstruct varray_head_tag;
1847169689Skan
184818334Speter/* In a BLOCK node.  */
184950397Sobrien#define BLOCK_VARS(NODE) (BLOCK_CHECK (NODE)->block.vars)
185050397Sobrien#define BLOCK_SUBBLOCKS(NODE) (BLOCK_CHECK (NODE)->block.subblocks)
185150397Sobrien#define BLOCK_SUPERCONTEXT(NODE) (BLOCK_CHECK (NODE)->block.supercontext)
185218334Speter/* Note: when changing this, make sure to find the places
185318334Speter   that use chainon or nreverse.  */
185490075Sobrien#define BLOCK_CHAIN(NODE) TREE_CHAIN (BLOCK_CHECK (NODE))
185550397Sobrien#define BLOCK_ABSTRACT_ORIGIN(NODE) (BLOCK_CHECK (NODE)->block.abstract_origin)
185650397Sobrien#define BLOCK_ABSTRACT(NODE) (BLOCK_CHECK (NODE)->block.abstract_flag)
185718334Speter
185890075Sobrien/* Nonzero means that this block is prepared to handle exceptions
185990075Sobrien   listed in the BLOCK_VARS slot.  */
186090075Sobrien#define BLOCK_HANDLER_BLOCK(NODE) \
186190075Sobrien  (BLOCK_CHECK (NODE)->block.handler_block_flag)
186250397Sobrien
186390075Sobrien/* An index number for this block.  These values are not guaranteed to
186490075Sobrien   be unique across functions -- whether or not they are depends on
186590075Sobrien   the debugging output format in use.  */
186690075Sobrien#define BLOCK_NUMBER(NODE) (BLOCK_CHECK (NODE)->block.block_num)
186750397Sobrien
186890075Sobrien/* If block reordering splits a lexical block into discontiguous
186990075Sobrien   address ranges, we'll make a copy of the original block.
187050397Sobrien
187190075Sobrien   Note that this is logically distinct from BLOCK_ABSTRACT_ORIGIN.
187290075Sobrien   In that case, we have one source block that has been replicated
187390075Sobrien   (through inlining or unrolling) into many logical blocks, and that
187490075Sobrien   these logical blocks have different physical variables in them.
187518334Speter
187690075Sobrien   In this case, we have one logical block split into several
187790075Sobrien   non-contiguous address ranges.  Most debug formats can't actually
187890075Sobrien   represent this idea directly, so we fake it by creating multiple
187990075Sobrien   logical blocks with the same variables in them.  However, for those
188090075Sobrien   that do support non-contiguous regions, these allow the original
188190075Sobrien   logical block to be reconstructed, along with the set of address
188290075Sobrien   ranges.
188390075Sobrien
188490075Sobrien   One of the logical block fragments is arbitrarily chosen to be
188590075Sobrien   the ORIGIN.  The other fragments will point to the origin via
188690075Sobrien   BLOCK_FRAGMENT_ORIGIN; the origin itself will have this pointer
1887117395Skan   be null.  The list of fragments will be chained through
188890075Sobrien   BLOCK_FRAGMENT_CHAIN from the origin.  */
188990075Sobrien
189090075Sobrien#define BLOCK_FRAGMENT_ORIGIN(NODE) (BLOCK_CHECK (NODE)->block.fragment_origin)
189190075Sobrien#define BLOCK_FRAGMENT_CHAIN(NODE) (BLOCK_CHECK (NODE)->block.fragment_chain)
189290075Sobrien
1893169689Skan/* For an inlined function, this gives the location where it was called
1894169689Skan   from.  This is only set in the top level block, which corresponds to the
1895169689Skan   inlined function scope.  This is used in the debug output routines.  */
1896169689Skan
1897169689Skan#define BLOCK_SOURCE_LOCATION(NODE) (BLOCK_CHECK (NODE)->block.locus)
1898169689Skan
1899117395Skanstruct tree_block GTY(())
190018334Speter{
190190075Sobrien  struct tree_common common;
190218334Speter
190318334Speter  unsigned handler_block_flag : 1;
190418334Speter  unsigned abstract_flag : 1;
190590075Sobrien  unsigned block_num : 30;
190618334Speter
190790075Sobrien  tree vars;
190890075Sobrien  tree subblocks;
190990075Sobrien  tree supercontext;
191090075Sobrien  tree abstract_origin;
191190075Sobrien  tree fragment_origin;
191290075Sobrien  tree fragment_chain;
1913169689Skan  location_t locus;
191418334Speter};
191518334Speter
191618334Speter/* Define fields and accessors for nodes representing data types.  */
191718334Speter
191818334Speter/* See tree.def for documentation of the use of these fields.
1919169689Skan   Look at the documentation of the various ..._TYPE tree codes.
192018334Speter
1921169689Skan   Note that the type.values, type.minval, and type.maxval fields are
1922169689Skan   overloaded and used for different macros in different kinds of types.
1923169689Skan   Each macro must check to ensure the tree node is of the proper kind of
1924169689Skan   type.  Note also that some of the front-ends also overload these fields,
1925169689Skan   so they must be checked as well.  */
1926169689Skan
192750397Sobrien#define TYPE_UID(NODE) (TYPE_CHECK (NODE)->type.uid)
192850397Sobrien#define TYPE_SIZE(NODE) (TYPE_CHECK (NODE)->type.size)
192950397Sobrien#define TYPE_SIZE_UNIT(NODE) (TYPE_CHECK (NODE)->type.size_unit)
193050397Sobrien#define TYPE_MODE(NODE) (TYPE_CHECK (NODE)->type.mode)
1931169689Skan#define TYPE_VALUES(NODE) (ENUMERAL_TYPE_CHECK (NODE)->type.values)
1932169689Skan#define TYPE_DOMAIN(NODE) (ARRAY_TYPE_CHECK (NODE)->type.values)
1933169689Skan#define TYPE_FIELDS(NODE) (RECORD_OR_UNION_CHECK (NODE)->type.values)
1934169689Skan#define TYPE_CACHED_VALUES(NODE) (TYPE_CHECK(NODE)->type.values)
1935169689Skan#define TYPE_ORIG_SIZE_TYPE(NODE)			\
1936169689Skan  (INTEGER_TYPE_CHECK (NODE)->type.values		\
1937169689Skan  ? TREE_TYPE ((NODE)->type.values) : NULL_TREE)
1938169689Skan#define TYPE_METHODS(NODE) (RECORD_OR_UNION_CHECK (NODE)->type.maxval)
1939169689Skan#define TYPE_VFIELD(NODE) (RECORD_OR_UNION_CHECK (NODE)->type.minval)
1940169689Skan#define TYPE_ARG_TYPES(NODE) (FUNC_OR_METHOD_CHECK (NODE)->type.values)
1941169689Skan#define TYPE_METHOD_BASETYPE(NODE) (FUNC_OR_METHOD_CHECK (NODE)->type.maxval)
1942169689Skan#define TYPE_OFFSET_BASETYPE(NODE) (OFFSET_TYPE_CHECK (NODE)->type.maxval)
194350397Sobrien#define TYPE_POINTER_TO(NODE) (TYPE_CHECK (NODE)->type.pointer_to)
194450397Sobrien#define TYPE_REFERENCE_TO(NODE) (TYPE_CHECK (NODE)->type.reference_to)
1945169689Skan#define TYPE_NEXT_PTR_TO(NODE) (POINTER_TYPE_CHECK (NODE)->type.minval)
1946169689Skan#define TYPE_NEXT_REF_TO(NODE) (REFERENCE_TYPE_CHECK (NODE)->type.minval)
1947169689Skan#define TYPE_MIN_VALUE(NODE) (NUMERICAL_TYPE_CHECK (NODE)->type.minval)
1948169689Skan#define TYPE_MAX_VALUE(NODE) (NUMERICAL_TYPE_CHECK (NODE)->type.maxval)
194950397Sobrien#define TYPE_PRECISION(NODE) (TYPE_CHECK (NODE)->type.precision)
195050397Sobrien#define TYPE_SYMTAB_ADDRESS(NODE) (TYPE_CHECK (NODE)->type.symtab.address)
195150397Sobrien#define TYPE_SYMTAB_POINTER(NODE) (TYPE_CHECK (NODE)->type.symtab.pointer)
1952117395Skan#define TYPE_SYMTAB_DIE(NODE) (TYPE_CHECK (NODE)->type.symtab.die)
195350397Sobrien#define TYPE_NAME(NODE) (TYPE_CHECK (NODE)->type.name)
195450397Sobrien#define TYPE_NEXT_VARIANT(NODE) (TYPE_CHECK (NODE)->type.next_variant)
195550397Sobrien#define TYPE_MAIN_VARIANT(NODE) (TYPE_CHECK (NODE)->type.main_variant)
195650397Sobrien#define TYPE_CONTEXT(NODE) (TYPE_CHECK (NODE)->type.context)
195750397Sobrien#define TYPE_LANG_SPECIFIC(NODE) (TYPE_CHECK (NODE)->type.lang_specific)
195818334Speter
195990075Sobrien/* For a VECTOR_TYPE node, this describes a different type which is emitted
196090075Sobrien   in the debugging output.  We use this to describe a vector as a
196190075Sobrien   structure containing an array.  */
1962169689Skan#define TYPE_DEBUG_REPRESENTATION_TYPE(NODE) (VECTOR_TYPE_CHECK (NODE)->type.values)
196390075Sobrien
1964169689Skan/* For record and union types, information about this type, as a base type
1965169689Skan   for itself.  */
1966169689Skan#define TYPE_BINFO(NODE) (RECORD_OR_UNION_CHECK(NODE)->type.binfo)
196752284Sobrien
1968169689Skan/* For non record and union types, used in a language-dependent way.  */
1969169689Skan#define TYPE_LANG_SLOT_1(NODE) (NOT_RECORD_OR_UNION_CHECK(NODE)->type.binfo)
1970169689Skan
197150397Sobrien/* The (language-specific) typed-based alias set for this type.
197250397Sobrien   Objects whose TYPE_ALIAS_SETs are different cannot alias each
197350397Sobrien   other.  If the TYPE_ALIAS_SET is -1, no alias set has yet been
197450397Sobrien   assigned to this type.  If the TYPE_ALIAS_SET is 0, objects of this
197550397Sobrien   type can alias objects of any type.  */
197650397Sobrien#define TYPE_ALIAS_SET(NODE) (TYPE_CHECK (NODE)->type.alias_set)
197750397Sobrien
197850397Sobrien/* Nonzero iff the typed-based alias set for this type has been
197950397Sobrien   calculated.  */
198090075Sobrien#define TYPE_ALIAS_SET_KNOWN_P(NODE) (TYPE_CHECK (NODE)->type.alias_set != -1)
198150397Sobrien
198218334Speter/* A TREE_LIST of IDENTIFIER nodes of the attributes that apply
198318334Speter   to this type.  */
198450397Sobrien#define TYPE_ATTRIBUTES(NODE) (TYPE_CHECK (NODE)->type.attributes)
198518334Speter
198618334Speter/* The alignment necessary for objects of this type.
198718334Speter   The value is an int, measured in bits.  */
198850397Sobrien#define TYPE_ALIGN(NODE) (TYPE_CHECK (NODE)->type.align)
198918334Speter
199090075Sobrien/* 1 if the alignment for this type was requested by "aligned" attribute,
199190075Sobrien   0 if it is the default for this type.  */
199290075Sobrien#define TYPE_USER_ALIGN(NODE) (TYPE_CHECK (NODE)->type.user_align)
199318334Speter
199490075Sobrien/* The alignment for NODE, in bytes.  */
199590075Sobrien#define TYPE_ALIGN_UNIT(NODE) (TYPE_ALIGN (NODE) / BITS_PER_UNIT)
199690075Sobrien
199790075Sobrien/* If your language allows you to declare types, and you want debug info
199890075Sobrien   for them, then you need to generate corresponding TYPE_DECL nodes.
199990075Sobrien   These "stub" TYPE_DECL nodes have no name, and simply point at the
200090075Sobrien   type node.  You then set the TYPE_STUB_DECL field of the type node
200190075Sobrien   to point back at the TYPE_DECL node.  This allows the debug routines
200290075Sobrien   to know that the two nodes represent the same type, so that we only
200390075Sobrien   get one debug info record for them.  */
200490075Sobrien#define TYPE_STUB_DECL(NODE) TREE_CHAIN (NODE)
200590075Sobrien
200618334Speter/* In a RECORD_TYPE, UNION_TYPE or QUAL_UNION_TYPE, it means the type
200718334Speter   has BLKmode only because it lacks the alignment requirement for
200818334Speter   its size.  */
200950397Sobrien#define TYPE_NO_FORCE_BLK(NODE) (TYPE_CHECK (NODE)->type.no_force_blk_flag)
201018334Speter
201190075Sobrien/* In an INTEGER_TYPE, it means the type represents a size.  We use
201290075Sobrien   this both for validity checking and to permit optimizations that
201390075Sobrien   are unsafe for other types.  Note that the C `size_t' type should
201490075Sobrien   *not* have this flag set.  The `size_t' type is simply a typedef
201590075Sobrien   for an ordinary integer type that happens to be the type of an
201690075Sobrien   expression returned by `sizeof'; `size_t' has no special
201790075Sobrien   properties.  Expressions whose type have TYPE_IS_SIZETYPE set are
201890075Sobrien   always actual sizes.  */
201990075Sobrien#define TYPE_IS_SIZETYPE(NODE) \
202090075Sobrien  (INTEGER_TYPE_CHECK (NODE)->type.no_force_blk_flag)
202190075Sobrien
202290075Sobrien/* In a FUNCTION_TYPE, indicates that the function returns with the stack
202390075Sobrien   pointer depressed.  */
202490075Sobrien#define TYPE_RETURNS_STACK_DEPRESSED(NODE) \
202590075Sobrien  (FUNCTION_TYPE_CHECK (NODE)->type.no_force_blk_flag)
202690075Sobrien
202718334Speter/* Nonzero in a type considered volatile as a whole.  */
202890075Sobrien#define TYPE_VOLATILE(NODE) (TYPE_CHECK (NODE)->common.volatile_flag)
202918334Speter
203018334Speter/* Means this type is const-qualified.  */
203190075Sobrien#define TYPE_READONLY(NODE) (TYPE_CHECK (NODE)->common.readonly_flag)
203218334Speter
203352284Sobrien/* If nonzero, this type is `restrict'-qualified, in the C sense of
203452284Sobrien   the term.  */
203552284Sobrien#define TYPE_RESTRICT(NODE) (TYPE_CHECK (NODE)->type.restrict_flag)
203652284Sobrien
203752284Sobrien/* There is a TYPE_QUAL value for each type qualifier.  They can be
203852284Sobrien   combined by bitwise-or to form the complete set of qualifiers for a
203952284Sobrien   type.  */
204052284Sobrien
204152284Sobrien#define TYPE_UNQUALIFIED   0x0
204252284Sobrien#define TYPE_QUAL_CONST    0x1
204352284Sobrien#define TYPE_QUAL_VOLATILE 0x2
204452284Sobrien#define TYPE_QUAL_RESTRICT 0x4
204552284Sobrien
204652284Sobrien/* The set of type qualifiers for this type.  */
204790075Sobrien#define TYPE_QUALS(NODE)					\
204890075Sobrien  ((TYPE_READONLY (NODE) * TYPE_QUAL_CONST)			\
204990075Sobrien   | (TYPE_VOLATILE (NODE) * TYPE_QUAL_VOLATILE)		\
2050132718Skan   | (TYPE_RESTRICT (NODE) * TYPE_QUAL_RESTRICT))
205152284Sobrien
205218334Speter/* These flags are available for each language front end to use internally.  */
205350397Sobrien#define TYPE_LANG_FLAG_0(NODE) (TYPE_CHECK (NODE)->type.lang_flag_0)
205450397Sobrien#define TYPE_LANG_FLAG_1(NODE) (TYPE_CHECK (NODE)->type.lang_flag_1)
205550397Sobrien#define TYPE_LANG_FLAG_2(NODE) (TYPE_CHECK (NODE)->type.lang_flag_2)
205650397Sobrien#define TYPE_LANG_FLAG_3(NODE) (TYPE_CHECK (NODE)->type.lang_flag_3)
205750397Sobrien#define TYPE_LANG_FLAG_4(NODE) (TYPE_CHECK (NODE)->type.lang_flag_4)
205850397Sobrien#define TYPE_LANG_FLAG_5(NODE) (TYPE_CHECK (NODE)->type.lang_flag_5)
205950397Sobrien#define TYPE_LANG_FLAG_6(NODE) (TYPE_CHECK (NODE)->type.lang_flag_6)
206018334Speter
2061169689Skan/* Used to keep track of visited nodes in tree traversals.  This is set to
2062169689Skan   0 by copy_node and make_node.  */
2063169689Skan#define TREE_VISITED(NODE) ((NODE)->common.visited)
2064169689Skan
206518334Speter/* If set in an ARRAY_TYPE, indicates a string type (for languages
206618334Speter   that distinguish string from array of char).
2067169689Skan   If set in a INTEGER_TYPE, indicates a character type.  */
206850397Sobrien#define TYPE_STRING_FLAG(NODE) (TYPE_CHECK (NODE)->type.string_flag)
206918334Speter
207090075Sobrien/* If non-NULL, this is an upper bound of the size (in bytes) of an
207190075Sobrien   object of the given ARRAY_TYPE.  This allows temporaries to be
207290075Sobrien   allocated.  */
207390075Sobrien#define TYPE_ARRAY_MAX_SIZE(ARRAY_TYPE) \
2074169689Skan  (ARRAY_TYPE_CHECK (ARRAY_TYPE)->type.maxval)
207550397Sobrien
207690075Sobrien/* For a VECTOR_TYPE, this is the number of sub-parts of the vector.  */
207790075Sobrien#define TYPE_VECTOR_SUBPARTS(VECTOR_TYPE) \
2078169689Skan  (((unsigned HOST_WIDE_INT) 1) \
2079169689Skan   << VECTOR_TYPE_CHECK (VECTOR_TYPE)->type.precision)
208090075Sobrien
2081169689Skan/* Set precision to n when we have 2^n sub-parts of the vector.  */
2082169689Skan#define SET_TYPE_VECTOR_SUBPARTS(VECTOR_TYPE, X) \
2083169689Skan  (VECTOR_TYPE_CHECK (VECTOR_TYPE)->type.precision = exact_log2 (X))
2084169689Skan
2085169689Skan/* Indicates that objects of this type must be initialized by calling a
208618334Speter   function when they are created.  */
208790075Sobrien#define TYPE_NEEDS_CONSTRUCTING(NODE) \
208890075Sobrien  (TYPE_CHECK (NODE)->type.needs_constructing_flag)
208918334Speter
209018334Speter/* Indicates that objects of this type (a UNION_TYPE), should be passed
209118334Speter   the same way that the first union alternative would be passed.  */
209290075Sobrien#define TYPE_TRANSPARENT_UNION(NODE)  \
209390075Sobrien  (UNION_TYPE_CHECK (NODE)->type.transparent_union_flag)
209418334Speter
209590075Sobrien/* For an ARRAY_TYPE, indicates that it is not permitted to
209690075Sobrien   take the address of a component of the type.  */
209790075Sobrien#define TYPE_NONALIASED_COMPONENT(NODE) \
209890075Sobrien  (ARRAY_TYPE_CHECK (NODE)->type.transparent_union_flag)
209990075Sobrien
210050397Sobrien/* Indicated that objects of this type should be laid out in as
210118334Speter   compact a way as possible.  */
210250397Sobrien#define TYPE_PACKED(NODE) (TYPE_CHECK (NODE)->type.packed_flag)
210318334Speter
2104169689Skan/* Used by type_contains_placeholder_p to avoid recomputation.
2105169689Skan   Values are: 0 (unknown), 1 (false), 2 (true).  Never access
2106169689Skan   this field directly.  */
2107169689Skan#define TYPE_CONTAINS_PLACEHOLDER_INTERNAL(NODE) \
2108169689Skan  (TYPE_CHECK (NODE)->type.contains_placeholder_bits)
2109169689Skan
2110261188Spfg/* APPLE LOCAL begin radar 5811943 - Fix type of pointers to blocks  */
2111261188Spfg/* Indicates that the struct type is a block struct, rather than
2112261188Spfg   a 'normal' struct, i.e. one of its fields is a function that can
2113261188Spfg   be called.  This uses the existing bit-field lang_flag_2 in the
2114261188Spfg   struct tree_type, rather than creating a new bit field, as
2115261188Spfg   lang_flag_2 is currently unused and we don't want to increase the
2116261188Spfg   size of trees if we can avoid it.  */
2117261188Spfg#define TYPE_BLOCK_IMPL_STRUCT(NODE) \
2118261188Spfg(TYPE_CHECK (NODE)->type.lang_flag_2)
2119261188Spfg/* APPLE LOCAL end radar 5811943 - Fix type of pointers to Blocks  */
2120261188Spfg
2121117395Skanstruct die_struct;
2122117395Skan
2123117395Skanstruct tree_type GTY(())
212418334Speter{
212590075Sobrien  struct tree_common common;
212690075Sobrien  tree values;
212790075Sobrien  tree size;
212890075Sobrien  tree size_unit;
212990075Sobrien  tree attributes;
213090075Sobrien  unsigned int uid;
213118334Speter
213290075Sobrien  unsigned int precision : 9;
213390075Sobrien  ENUM_BITFIELD(machine_mode) mode : 7;
213418334Speter
213518334Speter  unsigned string_flag : 1;
213618334Speter  unsigned no_force_blk_flag : 1;
213718334Speter  unsigned needs_constructing_flag : 1;
213818334Speter  unsigned transparent_union_flag : 1;
213918334Speter  unsigned packed_flag : 1;
214052284Sobrien  unsigned restrict_flag : 1;
2141169689Skan  unsigned contains_placeholder_bits : 2;
214252284Sobrien
214318334Speter  unsigned lang_flag_0 : 1;
214418334Speter  unsigned lang_flag_1 : 1;
2145261188Spfg  /* APPLE LOCAL begin radar 5811943 - Fix type of pointers to Blocks  */
2146261188Spfg  /* Since it is currently completely unused, and in the interest of
2147261188Spfg     not making trees any bigger than they already are, lang_flag_2
2148261188Spfg     in the tree_type struct will be used to indicate that a struct is a
2149261188Spfg     block struct.  The macro used for these purposes is
2150261188Spfg     TYPE_BLOCK_IMPL_STRUCT, rather than TYPE_LANG_FLAG_2, in order to make
2151261188Spfg     its uses in the code more clear.  */
2152261188Spfg  /* APPLE LOCAL end radar 5811943 - Fix type of pointers to Blocks  */
215318334Speter  unsigned lang_flag_2 : 1;
215418334Speter  unsigned lang_flag_3 : 1;
215518334Speter  unsigned lang_flag_4 : 1;
215618334Speter  unsigned lang_flag_5 : 1;
215718334Speter  unsigned lang_flag_6 : 1;
215890075Sobrien  unsigned user_align : 1;
215918334Speter
216018334Speter  unsigned int align;
216190075Sobrien  tree pointer_to;
216290075Sobrien  tree reference_to;
2163117395Skan  union tree_type_symtab {
2164132718Skan    int GTY ((tag ("0"))) address;
2165132718Skan    char * GTY ((tag ("1"))) pointer;
2166132718Skan    struct die_struct * GTY ((tag ("2"))) die;
2167132718Skan  } GTY ((desc ("debug_hooks == &sdb_debug_hooks ? 1 : debug_hooks == &dwarf2_debug_hooks ? 2 : 0"),
2168117395Skan	  descbits ("2"))) symtab;
216990075Sobrien  tree name;
217090075Sobrien  tree minval;
217190075Sobrien  tree maxval;
217290075Sobrien  tree next_variant;
217390075Sobrien  tree main_variant;
217490075Sobrien  tree binfo;
217590075Sobrien  tree context;
217690075Sobrien  HOST_WIDE_INT alias_set;
217718334Speter  /* Points to a structure whose details depend on the language in use.  */
217818334Speter  struct lang_type *lang_specific;
217918334Speter};
218018334Speter
218118334Speter/* Define accessor macros for information about type inheritance
218218334Speter   and basetypes.
218318334Speter
218418334Speter   A "basetype" means a particular usage of a data type for inheritance
218518334Speter   in another type.  Each such basetype usage has its own "binfo"
218618334Speter   object to describe it.  The binfo object is a TREE_VEC node.
218718334Speter
218818334Speter   Inheritance is represented by the binfo nodes allocated for a
218918334Speter   given type.  For example, given types C and D, such that D is
219018334Speter   inherited by C, 3 binfo nodes will be allocated: one for describing
219118334Speter   the binfo properties of C, similarly one for D, and one for
219218334Speter   describing the binfo properties of D as a base type for C.
219318334Speter   Thus, given a pointer to class C, one can get a pointer to the binfo
219418334Speter   of D acting as a basetype for C by looking at C's binfo's basetypes.  */
219518334Speter
2196169689Skan/* BINFO specific flags.  */
2197169689Skan
2198169689Skan/* Nonzero means that the derivation chain is via a `virtual' declaration.  */
2199169689Skan#define BINFO_VIRTUAL_P(NODE) (TREE_BINFO_CHECK (NODE)->common.static_flag)
2200169689Skan
2201169689Skan/* Flags for language dependent use.  */
2202169689Skan#define BINFO_MARKED(NODE) TREE_LANG_FLAG_0(TREE_BINFO_CHECK(NODE))
2203169689Skan#define BINFO_FLAG_1(NODE) TREE_LANG_FLAG_1(TREE_BINFO_CHECK(NODE))
2204169689Skan#define BINFO_FLAG_2(NODE) TREE_LANG_FLAG_2(TREE_BINFO_CHECK(NODE))
2205169689Skan#define BINFO_FLAG_3(NODE) TREE_LANG_FLAG_3(TREE_BINFO_CHECK(NODE))
2206169689Skan#define BINFO_FLAG_4(NODE) TREE_LANG_FLAG_4(TREE_BINFO_CHECK(NODE))
2207169689Skan#define BINFO_FLAG_5(NODE) TREE_LANG_FLAG_5(TREE_BINFO_CHECK(NODE))
2208169689Skan#define BINFO_FLAG_6(NODE) TREE_LANG_FLAG_6(TREE_BINFO_CHECK(NODE))
2209169689Skan
221018334Speter/* The actual data type node being inherited in this basetype.  */
2211169689Skan#define BINFO_TYPE(NODE) TREE_TYPE (TREE_BINFO_CHECK(NODE))
221218334Speter
221318334Speter/* The offset where this basetype appears in its containing type.
221418334Speter   BINFO_OFFSET slot holds the offset (in bytes)
221518334Speter   from the base of the complete object to the base of the part of the
221618334Speter   object that is allocated on behalf of this `type'.
221718334Speter   This is always 0 except when there is multiple inheritance.  */
2218117395Skan
2219169689Skan#define BINFO_OFFSET(NODE) (TREE_BINFO_CHECK(NODE)->binfo.offset)
222050397Sobrien#define BINFO_OFFSET_ZEROP(NODE) (integer_zerop (BINFO_OFFSET (NODE)))
222118334Speter
222218334Speter/* The virtual function table belonging to this basetype.  Virtual
222318334Speter   function tables provide a mechanism for run-time method dispatching.
222418334Speter   The entries of a virtual function table are language-dependent.  */
222518334Speter
2226169689Skan#define BINFO_VTABLE(NODE) (TREE_BINFO_CHECK(NODE)->binfo.vtable)
222718334Speter
222818334Speter/* The virtual functions in the virtual function table.  This is
222918334Speter   a TREE_LIST that is used as an initial approximation for building
223018334Speter   a virtual function table for this basetype.  */
2231169689Skan#define BINFO_VIRTUALS(NODE) (TREE_BINFO_CHECK(NODE)->binfo.virtuals)
223218334Speter
223390075Sobrien/* A vector of binfos for the direct basetypes inherited by this
223490075Sobrien   basetype.
223518334Speter
223690075Sobrien   If this basetype describes type D as inherited in C, and if the
223790075Sobrien   basetypes of D are E and F, then this vector contains binfos for
2238169689Skan   inheritance of E and F by C.  */
2239169689Skan#define BINFO_BASE_BINFOS(NODE) (&TREE_BINFO_CHECK(NODE)->binfo.base_binfos)
224018334Speter
224190075Sobrien/* The number of basetypes for NODE.  */
2242169689Skan#define BINFO_N_BASE_BINFOS(NODE) (VEC_length (tree, BINFO_BASE_BINFOS (NODE)))
224390075Sobrien
2244169689Skan/* Accessor macro to get to the Nth base binfo of this binfo.  */
2245169689Skan#define BINFO_BASE_BINFO(NODE,N) \
2246169689Skan (VEC_index (tree, BINFO_BASE_BINFOS (NODE), (N)))
2247169689Skan#define BINFO_BASE_ITERATE(NODE,N,B) \
2248169689Skan (VEC_iterate (tree, BINFO_BASE_BINFOS (NODE), (N), (B)))
2249169689Skan#define BINFO_BASE_APPEND(NODE,T) \
2250169689Skan (VEC_quick_push (tree, BINFO_BASE_BINFOS (NODE), (T)))
225150397Sobrien
225290075Sobrien/* For a BINFO record describing a virtual base class, i.e., one where
225390075Sobrien   TREE_VIA_VIRTUAL is set, this field assists in locating the virtual
2254132718Skan   base.  The actual contents are language-dependent.  In the C++
2255132718Skan   front-end this field is an INTEGER_CST giving an offset into the
2256132718Skan   vtable where the offset to the virtual base can be found.  */
2257169689Skan#define BINFO_VPTR_FIELD(NODE) (TREE_BINFO_CHECK(NODE)->binfo.vptr_field)
225818334Speter
2259132718Skan/* Indicates the accesses this binfo has to its bases. The values are
2260132718Skan   access_public_node, access_protected_node or access_private_node.
2261132718Skan   If this array is not present, public access is implied.  */
2262169689Skan#define BINFO_BASE_ACCESSES(NODE) (TREE_BINFO_CHECK(NODE)->binfo.base_accesses)
226318334Speter
2264169689Skan#define BINFO_BASE_ACCESS(NODE,N) \
2265169689Skan  VEC_index (tree, BINFO_BASE_ACCESSES (NODE), (N))
2266169689Skan#define BINFO_BASE_ACCESS_APPEND(NODE,T) \
2267169689Skan  VEC_quick_push (tree, BINFO_BASE_ACCESSES (NODE), (T))
2268132718Skan
2269169689Skan/* The index in the VTT where this subobject's sub-VTT can be found.
2270169689Skan   NULL_TREE if there is no sub-VTT.  */
2271169689Skan#define BINFO_SUBVTT_INDEX(NODE) (TREE_BINFO_CHECK(NODE)->binfo.vtt_subvtt)
2272132718Skan
2273169689Skan/* The index in the VTT where the vptr for this subobject can be
2274169689Skan   found.  NULL_TREE if there is no secondary vptr in the VTT.  */
2275169689Skan#define BINFO_VPTR_INDEX(NODE) (TREE_BINFO_CHECK(NODE)->binfo.vtt_vptr)
2276169689Skan
2277169689Skan/* The BINFO_INHERITANCE_CHAIN points at the binfo for the base
2278169689Skan   inheriting this base for non-virtual bases. For virtual bases it
2279169689Skan   points either to the binfo for which this is a primary binfo, or to
2280169689Skan   the binfo of the most derived type.  */
2281169689Skan#define BINFO_INHERITANCE_CHAIN(NODE) \
2282169689Skan	(TREE_BINFO_CHECK(NODE)->binfo.inheritance)
2283169689Skan
2284169689Skanstruct tree_binfo GTY (())
2285169689Skan{
2286169689Skan  struct tree_common common;
2287169689Skan
2288169689Skan  tree offset;
2289169689Skan  tree vtable;
2290169689Skan  tree virtuals;
2291169689Skan  tree vptr_field;
2292169689Skan  VEC(tree,gc) *base_accesses;
2293169689Skan  tree inheritance;
2294169689Skan
2295169689Skan  tree vtt_subvtt;
2296169689Skan  tree vtt_vptr;
2297169689Skan
2298169689Skan  VEC(tree,none) base_binfos;
2299169689Skan};
2300169689Skan
230118334Speter
230218334Speter/* Define fields and accessors for nodes representing declared names.  */
230318334Speter
2304169689Skan/* Nonzero if DECL represents a variable for the SSA passes.  */
2305169689Skan#define SSA_VAR_P(DECL)							\
2306169689Skan	(TREE_CODE (DECL) == VAR_DECL					\
2307169689Skan	 || TREE_CODE (DECL) == PARM_DECL				\
2308169689Skan	 || TREE_CODE (DECL) == RESULT_DECL				\
2309169689Skan	 || MTAG_P (DECL)						\
2310169689Skan	 || (TREE_CODE (DECL) == SSA_NAME				\
2311169689Skan	     && (TREE_CODE (SSA_NAME_VAR (DECL)) == VAR_DECL		\
2312169689Skan		 || TREE_CODE (SSA_NAME_VAR (DECL)) == PARM_DECL	\
2313169689Skan		 || TREE_CODE (SSA_NAME_VAR (DECL)) == RESULT_DECL	\
2314169689Skan		 || MTAG_P (SSA_NAME_VAR (DECL)))))
231590075Sobrien
231690075Sobrien
231790075Sobrien
231890075Sobrien
2319169689Skan/* Enumerate visibility settings.  */
2320169689Skan#ifndef SYMBOL_VISIBILITY_DEFINED
2321169689Skan#define SYMBOL_VISIBILITY_DEFINED
2322169689Skanenum symbol_visibility
2323169689Skan{
2324169689Skan  VISIBILITY_DEFAULT,
2325169689Skan  VISIBILITY_PROTECTED,
2326169689Skan  VISIBILITY_HIDDEN,
2327169689Skan  VISIBILITY_INTERNAL
2328169689Skan};
2329169689Skan#endif
233090075Sobrien
2331169689Skanstruct function;
2332117395Skan
233390075Sobrien
2334169689Skan/* This is the name of the object as written by the user.
2335169689Skan   It is an IDENTIFIER_NODE.  */
2336169689Skan#define DECL_NAME(NODE) (DECL_MINIMAL_CHECK (NODE)->decl_minimal.name)
233790075Sobrien
2338169689Skan/* Every ..._DECL node gets a unique number.  */
2339169689Skan#define DECL_UID(NODE) (DECL_MINIMAL_CHECK (NODE)->decl_minimal.uid)
234090075Sobrien
2341169689Skan/* These two fields describe where in the source code the declaration
2342169689Skan   was.  If the declaration appears in several places (as for a C
2343169689Skan   function that is declared first and then defined later), this
2344169689Skan   information should refer to the definition.  */
2345169689Skan#define DECL_SOURCE_LOCATION(NODE) (DECL_MINIMAL_CHECK (NODE)->decl_minimal.locus)
2346169689Skan#define DECL_SOURCE_FILE(NODE) LOCATION_FILE (DECL_SOURCE_LOCATION (NODE))
2347169689Skan#define DECL_SOURCE_LINE(NODE) LOCATION_LINE (DECL_SOURCE_LOCATION (NODE))
2348169689Skan#ifdef USE_MAPPED_LOCATION
2349169689Skan#define DECL_IS_BUILTIN(DECL) \
2350169689Skan  (DECL_SOURCE_LOCATION (DECL) <= BUILTINS_LOCATION)
2351169689Skan#else
2352169689Skan#define DECL_IS_BUILTIN(DECL) (DECL_SOURCE_LINE(DECL) == 0)
2353169689Skan#endif
235490075Sobrien
2355132718Skan/*  For FIELD_DECLs, this is the RECORD_TYPE, UNION_TYPE, or
2356132718Skan    QUAL_UNION_TYPE node that the field is a member of.  For VAR_DECL,
2357132718Skan    PARM_DECL, FUNCTION_DECL, LABEL_DECL, and CONST_DECL nodes, this
2358132718Skan    points to either the FUNCTION_DECL for the containing function,
2359132718Skan    the RECORD_TYPE or UNION_TYPE for the containing type, or
2360132718Skan    NULL_TREE or a TRANSLATION_UNIT_DECL if the given decl has "file
2361132718Skan    scope".  */
2362169689Skan#define DECL_CONTEXT(NODE) (DECL_MINIMAL_CHECK (NODE)->decl_minimal.context)
2363169689Skan#define DECL_FIELD_CONTEXT(NODE) (FIELD_DECL_CHECK (NODE)->decl_minimal.context)
2364169689Skanstruct tree_decl_minimal GTY(())
2365169689Skan{
2366169689Skan  struct tree_common common;
2367169689Skan  location_t locus;
2368169689Skan  unsigned int uid;
2369169689Skan  tree name;
2370169689Skan  tree context;
2371169689Skan};
237290075Sobrien
2373169689Skan/* When computing aliasing information, we represent the memory pointed-to
2374169689Skan   by pointers with artificial variables called "memory tags" (MT).  There
2375169689Skan   are two kinds of tags, namely symbol and name:
237690075Sobrien
2377169689Skan   Symbol tags (SMT) are used in flow-insensitive alias analysis, they
2378169689Skan   represent all the pointed-to locations and variables pointed-to by
2379169689Skan   the same pointer symbol.  Usually, this set is computed using
2380169689Skan   type-based analysis (i.e., alias set classes), but this may not
2381169689Skan   always be the case.
238290075Sobrien
2383169689Skan   Name tags (NMT) are used in flow-sensitive points-to alias
2384169689Skan   analysis, they represent the variables and memory locations
2385169689Skan   pointed-to by a specific SSA_NAME pointer.
238618334Speter
2387169689Skan   In general, given a pointer P with a symbol tag SMT, the alias set
2388169689Skan   of SMT should be the union of all the alias sets of the NMTs of
2389169689Skan   every SSA_NAME for P.  */
2390169689Skanstruct tree_memory_tag GTY(())
2391169689Skan{
2392169689Skan  struct tree_decl_minimal common;
2393169689Skan  unsigned int is_global:1;
2394169689Skan  unsigned int is_used_alone:1;
2395169689Skan  unsigned int old_used_alone:1;
2396169689Skan};
239790075Sobrien
2398169689Skan#define MTAG_GLOBAL(NODE) (TREE_MEMORY_TAG_CHECK (NODE)->mtag.is_global)
239918334Speter
2400169689Skan/* This flag is true if a SMT is used as the V_MAY_DEF or VUSE operand
2401169689Skan   directly, because the access had all of the SMT's aliases pruned
2402169689Skan   from it.  */
2403169689Skan#define SMT_USED_ALONE(NODE) (SYMBOL_MEMORY_TAG_CHECK (NODE)->mtag.is_used_alone)
240418334Speter
2405169689Skan/* This flag is used to temporarily store the old value of the used alone
2406169689Skan   flag when updating so we know whether to mark the symbol for
2407169689Skan   renaming.  */
2408169689Skan#define SMT_OLD_USED_ALONE(NODE) (SYMBOL_MEMORY_TAG_CHECK (NODE)->mtag.old_used_alone)
2409169689Skan
2410169689Skanstruct tree_struct_field_tag GTY(())
2411169689Skan{
2412169689Skan  struct tree_memory_tag common;
2413169689Skan
2414169689Skan  /* Parent variable.  */
2415169689Skan  tree parent_var;
2416169689Skan
2417169689Skan  /* Offset inside structure.  */
2418169689Skan  unsigned HOST_WIDE_INT offset;
2419169689Skan
2420169689Skan  /* Size of the field.  */
2421169689Skan  unsigned HOST_WIDE_INT size;
2422169689Skan
2423169689Skan};
2424169689Skan#define SFT_PARENT_VAR(NODE) (STRUCT_FIELD_TAG_CHECK (NODE)->sft.parent_var)
2425169689Skan#define SFT_OFFSET(NODE) (STRUCT_FIELD_TAG_CHECK (NODE)->sft.offset)
2426169689Skan#define SFT_SIZE(NODE) (STRUCT_FIELD_TAG_CHECK (NODE)->sft.size)
2427169689Skan
242818334Speter/* For any sort of a ..._DECL node, this points to the original (abstract)
242918334Speter   decl node which this decl is an instance of, or else it is NULL indicating
243050397Sobrien   that this decl is not an instance of some other decl.  For example,
243150397Sobrien   in a nested declaration of an inline function, this points back to the
243250397Sobrien   definition.  */
2433169689Skan#define DECL_ABSTRACT_ORIGIN(NODE) (DECL_COMMON_CHECK (NODE)->decl_common.abstract_origin)
243418334Speter
243552284Sobrien/* Like DECL_ABSTRACT_ORIGIN, but returns NODE if there's no abstract
243652284Sobrien   origin.  This is useful when setting the DECL_ABSTRACT_ORIGIN.  */
243752284Sobrien#define DECL_ORIGIN(NODE) \
243890075Sobrien  (DECL_ABSTRACT_ORIGIN (NODE) ? DECL_ABSTRACT_ORIGIN (NODE) : (NODE))
243952284Sobrien
244090075Sobrien/* Nonzero for any sort of ..._DECL node means this decl node represents an
244190075Sobrien   inline instance of some original (abstract) decl from an inline function;
244290075Sobrien   suppress any warnings about shadowing some other variable.  FUNCTION_DECL
244390075Sobrien   nodes can also have their abstract origin set to themselves.  */
244490075Sobrien#define DECL_FROM_INLINE(NODE) (DECL_ABSTRACT_ORIGIN (NODE) != NULL_TREE \
244590075Sobrien				&& DECL_ABSTRACT_ORIGIN (NODE) != (NODE))
244618334Speter
2447169689Skan/* In a DECL this is the field where attributes are stored.  */
2448169689Skan#define DECL_ATTRIBUTES(NODE) (DECL_COMMON_CHECK (NODE)->decl_common.attributes)
244918334Speter
2450169689Skan/* For a FUNCTION_DECL, holds the tree of BINDINGs.
2451169689Skan   For a TRANSLATION_UNIT_DECL, holds the namespace's BLOCK.
2452169689Skan   For a VAR_DECL, holds the initial value.
2453169689Skan   For a PARM_DECL, not used--default
2454169689Skan   values for parameters are encoded in the type of the function,
2455169689Skan   not in the PARM_DECL slot.
2456169689Skan   For a FIELD_DECL, this is used for enumeration values and the C
2457169689Skan   frontend uses it for temporarily storing bitwidth of bitfields.
2458169689Skan
2459169689Skan   ??? Need to figure out some way to check this isn't a PARM_DECL.  */
2460169689Skan#define DECL_INITIAL(NODE) (DECL_COMMON_CHECK (NODE)->decl_common.initial)
2461169689Skan
2462169689Skan/* Holds the size of the datum, in bits, as a tree expression.
2463169689Skan   Need not be constant.  */
2464169689Skan#define DECL_SIZE(NODE) (DECL_COMMON_CHECK (NODE)->decl_common.size)
2465169689Skan/* Likewise for the size in bytes.  */
2466169689Skan#define DECL_SIZE_UNIT(NODE) (DECL_COMMON_CHECK (NODE)->decl_common.size_unit)
2467169689Skan/* Holds the alignment required for the datum, in bits.  */
2468259694Spfg#define DECL_ALIGN(NODE) (DECL_COMMON_CHECK (NODE)->decl_common.align)
2469169689Skan/* The alignment of NODE, in bytes.  */
2470169689Skan#define DECL_ALIGN_UNIT(NODE) (DECL_ALIGN (NODE) / BITS_PER_UNIT)
2471259694Spfg/* Set if the alignment of this DECL has been set by the user, for
2472259694Spfg   example with an 'aligned' attribute.  */
2473169689Skan#define DECL_USER_ALIGN(NODE) (DECL_COMMON_CHECK (NODE)->decl_common.user_align)
2474169689Skan/* Holds the machine mode corresponding to the declaration of a variable or
2475169689Skan   field.  Always equal to TYPE_MODE (TREE_TYPE (decl)) except for a
2476169689Skan   FIELD_DECL.  */
2477169689Skan#define DECL_MODE(NODE) (DECL_COMMON_CHECK (NODE)->decl_common.mode)
2478169689Skan
2479169689Skan/* For FUNCTION_DECL, if it is built-in, this identifies which built-in
2480169689Skan   operation it is.  Note, however, that this field is overloaded, with
2481169689Skan   DECL_BUILT_IN_CLASS as the discriminant, so the latter must always be
2482169689Skan   checked before any access to the former.  */
2483259694Spfg#define DECL_FUNCTION_CODE(NODE) \
2484259694Spfg  (FUNCTION_DECL_CHECK (NODE)->function_decl.function_code)
2485169689Skan#define DECL_DEBUG_EXPR_IS_FROM(NODE) \
2486169689Skan  (DECL_COMMON_CHECK (NODE)->decl_common.debug_expr_is_from)
2487169689Skan
2488169689Skan/* Nonzero for a given ..._DECL node means that the name of this node should
2489169689Skan   be ignored for symbolic debug purposes.  */
2490169689Skan#define DECL_IGNORED_P(NODE) (DECL_COMMON_CHECK (NODE)->decl_common.ignored_flag)
2491169689Skan
249218334Speter/* Nonzero for a given ..._DECL node means that this node represents an
249318334Speter   "abstract instance" of the given declaration (e.g. in the original
249418334Speter   declaration of an inline function).  When generating symbolic debugging
249518334Speter   information, we mustn't try to generate any address information for nodes
249618334Speter   marked as "abstract instances" because we don't actually generate
249718334Speter   any code or allocate any data space for such instances.  */
2498169689Skan#define DECL_ABSTRACT(NODE) (DECL_COMMON_CHECK (NODE)->decl_common.abstract_flag)
249918334Speter
250018334Speter/* Language-specific decl information.  */
2501169689Skan#define DECL_LANG_SPECIFIC(NODE) (DECL_COMMON_CHECK (NODE)->decl_common.lang_specific)
250218334Speter
2503169689Skan/* In a VAR_DECL or FUNCTION_DECL, nonzero means external reference:
2504169689Skan   do not allocate storage, and refer to a definition elsewhere.  Note that
2505169689Skan   this does not necessarily imply the entity represented by NODE
2506169689Skan   has no program source-level definition in this translation unit.  For
2507169689Skan   example, for a FUNCTION_DECL, DECL_SAVED_TREE may be non-NULL and
2508169689Skan   DECL_EXTERNAL may be true simultaneously; that can be the case for
2509169689Skan   a C99 "extern inline" function.  */
2510169689Skan#define DECL_EXTERNAL(NODE) (DECL_COMMON_CHECK (NODE)->decl_common.decl_flag_2)
251118334Speter
251252284Sobrien/* In a VAR_DECL for a RECORD_TYPE, sets number for non-init_priority
2513132718Skan   initializations.  */
251452284Sobrien#define DEFAULT_INIT_PRIORITY 65535
251552284Sobrien#define MAX_INIT_PRIORITY 65535
251652284Sobrien#define MAX_RESERVED_INIT_PRIORITY 100
251752284Sobrien
251818334Speter
251918334Speter/* Nonzero in a ..._DECL means this variable is ref'd from a nested function.
252018334Speter   For VAR_DECL nodes, PARM_DECL nodes, and FUNCTION_DECL nodes.
252118334Speter
252218334Speter   For LABEL_DECL nodes, nonzero if nonlocal gotos to the label are permitted.
252318334Speter
252418334Speter   Also set in some languages for variables, etc., outside the normal
252518334Speter   lexical scope, such as class instance variables.  */
2526169689Skan#define DECL_NONLOCAL(NODE) (DECL_COMMON_CHECK (NODE)->decl_common.nonlocal_flag)
252718334Speter
2528169689Skan/* Used in VAR_DECLs to indicate that the variable is a vtable.
2529169689Skan   Used in FIELD_DECLs for vtable pointers.
2530169689Skan   Used in FUNCTION_DECLs to indicate that the function is virtual.  */
2531169689Skan#define DECL_VIRTUAL_P(NODE) (DECL_COMMON_CHECK (NODE)->decl_common.virtual_flag)
253218334Speter
2533169689Skan/* Used to indicate that this DECL represents a compiler-generated entity.  */
2534169689Skan#define DECL_ARTIFICIAL(NODE) (DECL_COMMON_CHECK (NODE)->decl_common.artificial_flag)
2535117395Skan
2536169689Skan/* Additional flags for language-specific uses.  */
2537169689Skan#define DECL_LANG_FLAG_0(NODE) (DECL_COMMON_CHECK (NODE)->decl_common.lang_flag_0)
2538169689Skan#define DECL_LANG_FLAG_1(NODE) (DECL_COMMON_CHECK (NODE)->decl_common.lang_flag_1)
2539169689Skan#define DECL_LANG_FLAG_2(NODE) (DECL_COMMON_CHECK (NODE)->decl_common.lang_flag_2)
2540169689Skan#define DECL_LANG_FLAG_3(NODE) (DECL_COMMON_CHECK (NODE)->decl_common.lang_flag_3)
2541169689Skan#define DECL_LANG_FLAG_4(NODE) (DECL_COMMON_CHECK (NODE)->decl_common.lang_flag_4)
2542169689Skan#define DECL_LANG_FLAG_5(NODE) (DECL_COMMON_CHECK (NODE)->decl_common.lang_flag_5)
2543169689Skan#define DECL_LANG_FLAG_6(NODE) (DECL_COMMON_CHECK (NODE)->decl_common.lang_flag_6)
2544169689Skan#define DECL_LANG_FLAG_7(NODE) (DECL_COMMON_CHECK (NODE)->decl_common.lang_flag_7)
2545132718Skan
2546169689Skan/* Used to indicate an alias set for the memory pointed to by this
2547169689Skan   particular FIELD_DECL, PARM_DECL, or VAR_DECL, which must have
2548169689Skan   pointer (or reference) type.  */
2549169689Skan#define DECL_POINTER_ALIAS_SET(NODE) \
2550169689Skan  (DECL_COMMON_CHECK (NODE)->decl_common.pointer_alias_set)
255190075Sobrien
2552169689Skan/* Nonzero if an alias set has been assigned to this declaration.  */
2553169689Skan#define DECL_POINTER_ALIAS_SET_KNOWN_P(NODE) \
2554169689Skan  (DECL_POINTER_ALIAS_SET (NODE) != - 1)
2555117395Skan
2556169689Skan/* Nonzero for a decl which is at file scope.  */
2557169689Skan#define DECL_FILE_SCOPE_P(EXP) 					\
2558169689Skan  (! DECL_CONTEXT (EXP)						\
2559169689Skan   || TREE_CODE (DECL_CONTEXT (EXP)) == TRANSLATION_UNIT_DECL)
256090075Sobrien
2561169689Skan/* Nonzero for a decl that is decorated using attribute used.
2562169689Skan   This indicates compiler tools that this decl needs to be preserved.  */
2563169689Skan#define DECL_PRESERVE_P(DECL) \
2564169689Skan  DECL_COMMON_CHECK (DECL)->decl_common.preserve_flag
256590075Sobrien
2566169689Skan/* For function local variables of COMPLEX type, indicates that the
2567169689Skan   variable is not aliased, and that all modifications to the variable
2568169689Skan   have been adjusted so that they are killing assignments.  Thus the
2569169689Skan   variable may now be treated as a GIMPLE register, and use real
2570169689Skan   instead of virtual ops in SSA form.  */
2571169689Skan#define DECL_COMPLEX_GIMPLE_REG_P(DECL) \
2572169689Skan  DECL_COMMON_CHECK (DECL)->decl_common.gimple_reg_flag
257390075Sobrien
2574169689Skan/* This is true if DECL is call clobbered in the current function.
2575169689Skan   The result of this flag should always be the same as
2576169689Skan   bitmap_bit_p (call_clobbered_vars, DECL_UID (decl)).  */
2577169689Skan#define DECL_CALL_CLOBBERED(DECL) \
2578169689Skan  DECL_COMMON_CHECK (DECL)->decl_common.call_clobbered_flag
257990075Sobrien
2580169689Skanstruct tree_decl_common GTY(())
2581169689Skan{
2582169689Skan  struct tree_decl_minimal common;
2583169689Skan  tree size;
2584169689Skan
2585169689Skan  ENUM_BITFIELD(machine_mode) mode : 8;
2586169689Skan
2587169689Skan  unsigned nonlocal_flag : 1;
2588169689Skan  unsigned virtual_flag : 1;
2589169689Skan  unsigned ignored_flag : 1;
2590169689Skan  unsigned abstract_flag : 1;
2591169689Skan  unsigned artificial_flag : 1;
2592169689Skan  unsigned user_align : 1;
2593169689Skan  unsigned preserve_flag: 1;
2594169689Skan  unsigned debug_expr_is_from : 1;
2595169689Skan
2596169689Skan  unsigned lang_flag_0 : 1;
2597169689Skan  unsigned lang_flag_1 : 1;
2598169689Skan  unsigned lang_flag_2 : 1;
2599169689Skan  unsigned lang_flag_3 : 1;
2600169689Skan  unsigned lang_flag_4 : 1;
2601169689Skan  unsigned lang_flag_5 : 1;
2602169689Skan  unsigned lang_flag_6 : 1;
2603169689Skan  unsigned lang_flag_7 : 1;
2604169689Skan
2605169689Skan  /* In LABEL_DECL, this is DECL_ERROR_ISSUED.
2606169689Skan     In VAR_DECL and PARM_DECL, this is DECL_REGISTER.  */
2607169689Skan  unsigned decl_flag_0 : 1;
2608169689Skan  /* In FIELD_DECL, this is DECL_PACKED.  */
2609169689Skan  unsigned decl_flag_1 : 1;
2610169689Skan  /* In FIELD_DECL, this is DECL_BIT_FIELD
2611169689Skan     In VAR_DECL and FUNCTION_DECL, this is DECL_EXTERNAL.
2612169689Skan     In TYPE_DECL, this is TYPE_DECL_SUPRESS_DEBUG.  */
2613169689Skan  unsigned decl_flag_2 : 1;
2614169689Skan  /* In FIELD_DECL, this is DECL_NONADDRESSABLE_P
2615169689Skan     In VAR_DECL and PARM_DECL, this is DECL_HAS_VALUE_EXPR.  */
2616169689Skan  unsigned decl_flag_3 : 1;
2617169689Skan  /* Logically, these two would go in a theoretical base shared by var and
2618169689Skan     parm decl. */
2619169689Skan  unsigned gimple_reg_flag : 1;
2620169689Skan  unsigned call_clobbered_flag : 1;
2621169689Skan
2622261188Spfg  /* APPLE LOCAL duplicate decls in multiple files. */
2623261188Spfg  unsigned duplicate_decl : 1;
2624261188Spfg
2625259694Spfg  unsigned int align : 24;
2626259694Spfg  /* DECL_OFFSET_ALIGN, used only for FIELD_DECLs.  */
2627259694Spfg  unsigned int off_align : 8;
2628169689Skan
2629169689Skan  tree size_unit;
2630169689Skan  tree initial;
2631169689Skan  tree attributes;
2632169689Skan  tree abstract_origin;
2633169689Skan
2634169689Skan  HOST_WIDE_INT pointer_alias_set;
2635169689Skan  /* Points to a structure whose details depend on the language in use.  */
2636169689Skan  struct lang_decl *lang_specific;
2637169689Skan};
2638169689Skan
2639169689Skanextern tree decl_value_expr_lookup (tree);
2640169689Skanextern void decl_value_expr_insert (tree, tree);
2641169689Skan
2642169689Skan/* In a VAR_DECL or PARM_DECL, the location at which the value may be found,
2643169689Skan   if transformations have made this more complicated than evaluating the
2644169689Skan   decl itself.  This should only be used for debugging; once this field has
2645169689Skan   been set, the decl itself may not legitimately appear in the function.  */
2646169689Skan#define DECL_HAS_VALUE_EXPR_P(NODE) \
2647169689Skan  (TREE_CHECK2 (NODE, VAR_DECL, PARM_DECL)->decl_common.decl_flag_3)
2648169689Skan#define DECL_VALUE_EXPR(NODE) \
2649169689Skan  (decl_value_expr_lookup (DECL_WRTL_CHECK (NODE)))
2650169689Skan#define SET_DECL_VALUE_EXPR(NODE, VAL)			\
2651169689Skan  (decl_value_expr_insert (DECL_WRTL_CHECK (NODE), VAL))
2652169689Skan
2653169689Skan/* Holds the RTL expression for the value of a variable or function.
2654169689Skan   This value can be evaluated lazily for functions, variables with
2655169689Skan   static storage duration, and labels.  */
2656169689Skan#define DECL_RTL(NODE)					\
2657169689Skan  (DECL_WRTL_CHECK (NODE)->decl_with_rtl.rtl		\
2658169689Skan   ? (NODE)->decl_with_rtl.rtl					\
2659169689Skan   : (make_decl_rtl (NODE), (NODE)->decl_with_rtl.rtl))
2660169689Skan
2661169689Skan/* Set the DECL_RTL for NODE to RTL.  */
2662169689Skan#define SET_DECL_RTL(NODE, RTL) set_decl_rtl (NODE, RTL)
2663169689Skan
2664169689Skan/* Returns nonzero if NODE is a tree node that can contain RTL.  */
2665169689Skan#define HAS_RTL_P(NODE) (CODE_CONTAINS_STRUCT (TREE_CODE (NODE), TS_DECL_WRTL))
2666169689Skan
2667169689Skan/* Returns nonzero if the DECL_RTL for NODE has already been set.  */
2668169689Skan#define DECL_RTL_SET_P(NODE)  (HAS_RTL_P (NODE) && DECL_WRTL_CHECK (NODE)->decl_with_rtl.rtl != NULL)
2669169689Skan
2670169689Skan/* Copy the RTL from NODE1 to NODE2.  If the RTL was not set for
2671169689Skan   NODE1, it will not be set for NODE2; this is a lazy copy.  */
2672169689Skan#define COPY_DECL_RTL(NODE1, NODE2) \
2673169689Skan  (DECL_WRTL_CHECK (NODE2)->decl_with_rtl.rtl = DECL_WRTL_CHECK (NODE1)->decl_with_rtl.rtl)
2674169689Skan
2675169689Skan/* The DECL_RTL for NODE, if it is set, or NULL, if it is not set.  */
2676169689Skan#define DECL_RTL_IF_SET(NODE) (DECL_RTL_SET_P (NODE) ? DECL_RTL (NODE) : NULL)
2677169689Skan
2678169689Skan/* In VAR_DECL and PARM_DECL nodes, nonzero means declared `register'.  */
2679169689Skan#define DECL_REGISTER(NODE) (DECL_WRTL_CHECK (NODE)->decl_common.decl_flag_0)
2680169689Skan
2681169689Skanstruct tree_decl_with_rtl GTY(())
2682169689Skan{
2683169689Skan  struct tree_decl_common common;
2684169689Skan  rtx rtl;
2685169689Skan};
2686169689Skan
2687169689Skan/* In a FIELD_DECL, this is the field position, counting in bytes, of the
2688169689Skan   DECL_OFFSET_ALIGN-bit-sized word containing the bit closest to the beginning
2689169689Skan   of the structure.  */
2690169689Skan#define DECL_FIELD_OFFSET(NODE) (FIELD_DECL_CHECK (NODE)->field_decl.offset)
2691169689Skan
2692169689Skan/* In a FIELD_DECL, this is the offset, in bits, of the first bit of the
2693169689Skan   field from DECL_FIELD_OFFSET.  This field may be nonzero even for fields
2694169689Skan   that are not bit fields (since DECL_OFFSET_ALIGN may be larger than the
2695169689Skan   natural alignment of the field's type).  */
2696169689Skan#define DECL_FIELD_BIT_OFFSET(NODE) (FIELD_DECL_CHECK (NODE)->field_decl.bit_offset)
2697169689Skan
2698169689Skan/* In a FIELD_DECL, this indicates whether the field was a bit-field and
2699169689Skan   if so, the type that was originally specified for it.
2700169689Skan   TREE_TYPE may have been modified (in finish_struct).  */
2701169689Skan#define DECL_BIT_FIELD_TYPE(NODE) (FIELD_DECL_CHECK (NODE)->field_decl.bit_field_type)
2702169689Skan
2703169689Skan/* For a FIELD_DECL in a QUAL_UNION_TYPE, records the expression, which
2704169689Skan   if nonzero, indicates that the field occupies the type.  */
2705169689Skan#define DECL_QUALIFIER(NODE) (FIELD_DECL_CHECK (NODE)->field_decl.qualifier)
2706169689Skan
2707169689Skan/* For FIELD_DECLs, off_align holds the number of low-order bits of
2708169689Skan   DECL_FIELD_OFFSET which are known to be always zero.
2709169689Skan   DECL_OFFSET_ALIGN thus returns the alignment that DECL_FIELD_OFFSET
2710169689Skan   has.  */
2711169689Skan#define DECL_OFFSET_ALIGN(NODE) \
2712259694Spfg  (((unsigned HOST_WIDE_INT)1) << FIELD_DECL_CHECK (NODE)->decl_common.off_align)
2713169689Skan
2714169689Skan/* Specify that DECL_ALIGN(NODE) is a multiple of X.  */
2715169689Skan#define SET_DECL_OFFSET_ALIGN(NODE, X) \
2716259694Spfg  (FIELD_DECL_CHECK (NODE)->decl_common.off_align = exact_log2 ((X) & -(X)))
2717169689Skan/* 1 if the alignment for this type was requested by "aligned" attribute,
2718169689Skan   0 if it is the default for this type.  */
2719169689Skan
2720169689Skan/* For FIELD_DECLS, DECL_FCONTEXT is the *first* baseclass in
2721169689Skan   which this FIELD_DECL is defined.  This information is needed when
2722169689Skan   writing debugging information about vfield and vbase decls for C++.  */
2723169689Skan#define DECL_FCONTEXT(NODE) (FIELD_DECL_CHECK (NODE)->field_decl.fcontext)
2724169689Skan
2725169689Skan/* In a FIELD_DECL, indicates this field should be bit-packed.  */
2726169689Skan#define DECL_PACKED(NODE) (FIELD_DECL_CHECK (NODE)->decl_common.decl_flag_1)
2727169689Skan
272818334Speter/* Nonzero in a FIELD_DECL means it is a bit field, and must be accessed
272918334Speter   specially.  */
2730169689Skan#define DECL_BIT_FIELD(NODE) (FIELD_DECL_CHECK (NODE)->decl_common.decl_flag_2)
273190075Sobrien
2732169689Skan/* Used in a FIELD_DECL to indicate that we cannot form the address of
2733169689Skan   this component.  */
2734169689Skan#define DECL_NONADDRESSABLE_P(NODE) \
2735169689Skan  (FIELD_DECL_CHECK (NODE)->decl_common.decl_flag_3)
273690075Sobrien
2737169689Skanstruct tree_field_decl GTY(())
2738169689Skan{
2739169689Skan  struct tree_decl_common common;
274090075Sobrien
2741169689Skan  tree offset;
2742169689Skan  tree bit_field_type;
2743169689Skan  tree qualifier;
2744169689Skan  tree bit_offset;
2745169689Skan  tree fcontext;
274618334Speter
2747169689Skan};
274890075Sobrien
2749169689Skan/* A numeric unique identifier for a LABEL_DECL.  The UID allocation is
2750169689Skan   dense, unique within any one function, and may be used to index arrays.
2751169689Skan   If the value is -1, then no UID has been assigned.  */
2752169689Skan#define LABEL_DECL_UID(NODE) \
2753169689Skan  (LABEL_DECL_CHECK (NODE)->decl_common.pointer_alias_set)
275490075Sobrien
2755169689Skan/* In LABEL_DECL nodes, nonzero means that an error message about
2756169689Skan   jumping into such a binding contour has been printed for this label.  */
2757169689Skan#define DECL_ERROR_ISSUED(NODE) (LABEL_DECL_CHECK (NODE)->decl_common.decl_flag_0)
275818334Speter
2759169689Skanstruct tree_label_decl GTY(())
2760169689Skan{
2761169689Skan  struct tree_decl_with_rtl common;
2762169689Skan  /* Java's verifier has some need to store information about labels,
2763169689Skan     and was using fields that no longer exist on labels.
2764169689Skan     Once the verifier doesn't need these anymore, they should be removed.  */
2765169689Skan  tree java_field_1;
2766169689Skan  tree java_field_2;
2767169689Skan  tree java_field_3;
2768169689Skan  unsigned int java_field_4;
2769169689Skan
2770169689Skan};
2771169689Skan
2772169689Skanstruct tree_result_decl GTY(())
2773169689Skan{
2774169689Skan  struct tree_decl_with_rtl common;
2775169689Skan};
2776169689Skan
2777169689Skanstruct tree_const_decl GTY(())
2778169689Skan{
2779169689Skan  struct tree_decl_with_rtl common;
2780169689Skan};
2781169689Skan
2782169689Skan/* For a PARM_DECL, records the data type used to pass the argument,
2783169689Skan   which may be different from the type seen in the program.  */
2784169689Skan#define DECL_ARG_TYPE(NODE) (PARM_DECL_CHECK (NODE)->decl_common.initial)
2785169689Skan
2786169689Skan/* For PARM_DECL, holds an RTL for the stack slot or register
2787169689Skan   where the data was actually passed.  */
2788169689Skan#define DECL_INCOMING_RTL(NODE) (PARM_DECL_CHECK (NODE)->parm_decl.incoming_rtl)
2789169689Skan
2790169689Skanstruct tree_parm_decl GTY(())
2791169689Skan{
2792169689Skan  struct tree_decl_with_rtl common;
2793169689Skan  rtx incoming_rtl;
2794169689Skan};
2795169689Skan
2796169689Skan
2797169689Skan/* Nonzero in a decl means that the gimplifier has seen (or placed)
2798169689Skan   this variable in a BIND_EXPR.  */
2799169689Skan#define DECL_SEEN_IN_BIND_EXPR_P(NODE) \
2800169689Skan  (DECL_WITH_VIS_CHECK (NODE)->decl_with_vis.seen_in_bind_expr)
2801169689Skan
280218334Speter/* Used to indicate that the linkage status of this DECL is not yet known,
280318334Speter   so it should not be output now.  */
2804169689Skan#define DECL_DEFER_OUTPUT(NODE) (DECL_WITH_VIS_CHECK (NODE)->decl_with_vis.defer_output)
280518334Speter
2806261188Spfg/* APPLE LOCAL duplicate decls in multiple files. */
2807261188Spfg#define DECL_DUPLICATE_DECL(NODE) (DECL_COMMON_CHECK (NODE)->decl_common.duplicate_decl)
2808261188Spfg
2809169689Skan/* Nonzero for a given ..._DECL node means that no warnings should be
2810169689Skan   generated just because this node is unused.  */
2811169689Skan#define DECL_IN_SYSTEM_HEADER(NODE) \
2812169689Skan  (DECL_WITH_VIS_CHECK (NODE)->decl_with_vis.in_system_header_flag)
281318334Speter
2814169689Skan  /* Used to indicate that this DECL has weak linkage.  */
2815169689Skan#define DECL_WEAK(NODE) (DECL_WITH_VIS_CHECK (NODE)->decl_with_vis.weak_flag)
281618334Speter
2817169689Skan/* Internal to the gimplifier.  Indicates that the value is a formal
2818169689Skan   temporary controlled by the gimplifier.  */
2819169689Skan#define DECL_GIMPLE_FORMAL_TEMP_P(DECL) \
2820169689Skan  DECL_WITH_VIS_CHECK (DECL)->decl_with_vis.gimple_formal_temp
282190075Sobrien
2822169689Skan/* Used to indicate that the DECL is a dllimport.  */
2823169689Skan#define DECL_DLLIMPORT_P(NODE) (DECL_WITH_VIS_CHECK (NODE)->decl_with_vis.dllimport_flag)
282418334Speter
2825169689Skan/* DECL_BASED_ON_RESTRICT_P records whether a VAR_DECL is a temporary
2826169689Skan   based on a variable with a restrict qualified type.  If it is,
2827169689Skan   DECL_RESTRICT_BASE returns the restrict qualified variable on which
2828169689Skan   it is based.  */
282918334Speter
2830169689Skan#define DECL_BASED_ON_RESTRICT_P(NODE) \
2831169689Skan  (VAR_DECL_CHECK (NODE)->decl_with_vis.based_on_restrict_p)
2832169689Skan#define DECL_GET_RESTRICT_BASE(NODE) \
2833169689Skan  (decl_restrict_base_lookup (VAR_DECL_CHECK (NODE)))
2834169689Skan#define SET_DECL_RESTRICT_BASE(NODE, VAL) \
2835169689Skan  (decl_restrict_base_insert (VAR_DECL_CHECK (NODE), (VAL)))
283650397Sobrien
2837169689Skanextern tree decl_restrict_base_lookup (tree);
2838169689Skanextern void decl_restrict_base_insert (tree, tree);
2839169689Skan
284052284Sobrien/* Used in a DECL to indicate that, even if it TREE_PUBLIC, it need
284152284Sobrien   not be put out unless it is needed in this translation unit.
284252284Sobrien   Entities like this are shared across translation units (like weak
284352284Sobrien   entities), but are guaranteed to be generated by any translation
284452284Sobrien   unit that needs them, and therefore need not be put out anywhere
284552284Sobrien   where they are not needed.  DECL_COMDAT is just a hint to the
284652284Sobrien   back-end; it is up to front-ends which set this flag to ensure
284752284Sobrien   that there will never be any harm, other than bloat, in putting out
284852284Sobrien   something which is DECL_COMDAT.  */
2849169689Skan#define DECL_COMDAT(NODE) (DECL_WITH_VIS_CHECK (NODE)->decl_with_vis.comdat_flag)
285052284Sobrien
2851169689Skan/* A replaceable function is one which may be replaced at link-time
2852169689Skan   with an entirely different definition, provided that the
2853169689Skan   replacement has the same type.  For example, functions declared
2854169689Skan   with __attribute__((weak)) on most systems are replaceable.
2855169689Skan
2856169689Skan   COMDAT functions are not replaceable, since all definitions of the
2857169689Skan   function must be equivalent.  It is important that COMDAT functions
2858169689Skan   not be treated as replaceable so that use of C++ template
2859169689Skan   instantiations is not penalized.
2860169689Skan
2861169689Skan   For example, DECL_REPLACEABLE is used to determine whether or not a
2862169689Skan   function (including a template instantiation) which is not
2863169689Skan   explicitly declared "inline" can be inlined.  If the function is
2864169689Skan   DECL_REPLACEABLE then it is not safe to do the inlining, since the
2865169689Skan   implementation chosen at link-time may be different.  However, a
2866169689Skan   function that is not DECL_REPLACEABLE can be inlined, since all
2867169689Skan   versions of the function will be functionally identical.  */
2868169689Skan#define DECL_REPLACEABLE_P(NODE) \
2869169689Skan  (!DECL_COMDAT (NODE) && !targetm.binds_local_p (NODE))
2870169689Skan
2871169689Skan/* The name of the object as the assembler will see it (but before any
2872169689Skan   translations made by ASM_OUTPUT_LABELREF).  Often this is the same
2873169689Skan   as DECL_NAME.  It is an IDENTIFIER_NODE.  */
2874169689Skan#define DECL_ASSEMBLER_NAME(NODE) decl_assembler_name (NODE)
2875169689Skan
2876169689Skan/* Return true if NODE is a NODE that can contain a DECL_ASSEMBLER_NAME.
2877169689Skan   This is true of all DECL nodes except FIELD_DECL.  */
2878169689Skan#define HAS_DECL_ASSEMBLER_NAME_P(NODE) \
2879169689Skan  (CODE_CONTAINS_STRUCT (TREE_CODE (NODE), TS_DECL_WITH_VIS))
2880169689Skan
2881169689Skan/* Returns nonzero if the DECL_ASSEMBLER_NAME for NODE has been set.  If zero,
2882169689Skan   the NODE might still have a DECL_ASSEMBLER_NAME -- it just hasn't been set
2883169689Skan   yet.  */
2884169689Skan#define DECL_ASSEMBLER_NAME_SET_P(NODE) \
2885169689Skan  (HAS_DECL_ASSEMBLER_NAME_P (NODE) &&  DECL_WITH_VIS_CHECK (NODE)->decl_with_vis.assembler_name != NULL_TREE)
2886169689Skan
2887169689Skan/* Set the DECL_ASSEMBLER_NAME for NODE to NAME.  */
2888169689Skan#define SET_DECL_ASSEMBLER_NAME(NODE, NAME) \
2889169689Skan  (DECL_WITH_VIS_CHECK (NODE)->decl_with_vis.assembler_name = (NAME))
2890169689Skan
2891169689Skan/* Copy the DECL_ASSEMBLER_NAME from DECL1 to DECL2.  Note that if DECL1's
2892169689Skan   DECL_ASSEMBLER_NAME has not yet been set, using this macro will not cause
2893169689Skan   the DECL_ASSEMBLER_NAME of either DECL to be set.  In other words, the
2894169689Skan   semantics of using this macro, are different than saying:
2895169689Skan
2896169689Skan     SET_DECL_ASSEMBLER_NAME(DECL2, DECL_ASSEMBLER_NAME (DECL1))
2897169689Skan
2898169689Skan   which will try to set the DECL_ASSEMBLER_NAME for DECL1.  */
2899169689Skan
2900169689Skan#define COPY_DECL_ASSEMBLER_NAME(DECL1, DECL2)				\
2901169689Skan  (DECL_ASSEMBLER_NAME_SET_P (DECL1)					\
2902169689Skan   ? (void) SET_DECL_ASSEMBLER_NAME (DECL2,				\
2903169689Skan				     DECL_ASSEMBLER_NAME (DECL1))	\
2904169689Skan   : (void) 0)
2905169689Skan
2906169689Skan/* Records the section name in a section attribute.  Used to pass
2907169689Skan   the name from decl_attributes to make_function_rtl and make_decl_rtl.  */
2908169689Skan#define DECL_SECTION_NAME(NODE) (DECL_WITH_VIS_CHECK (NODE)->decl_with_vis.section_name)
2909169689Skan
2910169689Skan/* Value of the decls's visibility attribute */
2911169689Skan#define DECL_VISIBILITY(NODE) (DECL_WITH_VIS_CHECK (NODE)->decl_with_vis.visibility)
2912169689Skan
2913169689Skan/* Nonzero means that the decl had its visibility specified rather than
2914169689Skan   being inferred.  */
2915169689Skan#define DECL_VISIBILITY_SPECIFIED(NODE) (DECL_WITH_VIS_CHECK (NODE)->decl_with_vis.visibility_specified)
2916169689Skan
2917169689Skan/* Used in TREE_PUBLIC decls to indicate that copies of this DECL in
2918169689Skan   multiple translation units should be merged.  */
2919169689Skan#define DECL_ONE_ONLY(NODE) (DECL_WITH_VIS_CHECK (NODE)->decl_with_vis.one_only)
2920169689Skan
2921169689Skanstruct tree_decl_with_vis GTY(())
2922169689Skan{
2923169689Skan struct tree_decl_with_rtl common;
2924169689Skan tree assembler_name;
2925169689Skan tree section_name;
2926169689Skan
2927169689Skan /* Belong to VAR_DECL exclusively.  */
2928169689Skan unsigned defer_output:1;
2929169689Skan unsigned hard_register:1;
2930169689Skan unsigned thread_local:1;
2931169689Skan unsigned common_flag:1;
2932169689Skan unsigned in_text_section : 1;
2933169689Skan unsigned gimple_formal_temp : 1;
2934169689Skan unsigned dllimport_flag : 1;
2935169689Skan unsigned based_on_restrict_p : 1;
2936169689Skan /* Used by C++.  Might become a generic decl flag.  */
2937169689Skan unsigned shadowed_for_var_p : 1;
2938169689Skan
2939169689Skan /* Don't belong to VAR_DECL exclusively.  */
2940169689Skan unsigned in_system_header_flag : 1;
2941169689Skan unsigned weak_flag:1;
2942169689Skan unsigned seen_in_bind_expr : 1;
2943169689Skan unsigned comdat_flag : 1;
2944169689Skan ENUM_BITFIELD(symbol_visibility) visibility : 2;
2945169689Skan unsigned visibility_specified : 1;
2946169689Skan /* Belong to FUNCTION_DECL exclusively.  */
2947169689Skan unsigned one_only : 1;
2948169689Skan unsigned init_priority_p:1;
2949169689Skan
2950169689Skan /* Belongs to VAR_DECL exclusively.  */
2951169689Skan ENUM_BITFIELD(tls_model) tls_model : 3;
2952261188Spfg
2953261188Spfg /* APPLE LOCAL begin radar 5732232 - blocks */
2954261188Spfg /* Belong to VAR_DECL exclusively. */
2955261188Spfg unsigned block_decl_byref : 1;
2956261188Spfg unsigned block_decl_copied : 1;
2957261188Spfg /* APPLE LOCAL begin radar 5932809 - copyable byref blocks */
2958261188Spfg unsigned copyable_byref_local_var : 1;
2959261188Spfg unsigned copyable_byref_local_nonpod : 1;
2960261188Spfg /* APPLE LOCAL radar 6172148 */
2961261188Spfg unsigned block_synthesized_function : 1;
2962261188Spfg /* APPLE LOCAL radar 5847976 */
2963261188Spfg unsigned block_weak : 1;
2964261188Spfg /* 5 unused bits. */
2965261188Spfg /* APPLE LOCAL end radar 5932809 - copyable byref blocks */
2966261188Spfg /* APPLE LOCAL end radar 5732232 - blocks */
2967169689Skan};
2968169689Skan
2969169689Skan/* In a VAR_DECL that's static,
2970169689Skan   nonzero if the space is in the text section.  */
2971169689Skan#define DECL_IN_TEXT_SECTION(NODE) (VAR_DECL_CHECK (NODE)->decl_with_vis.in_text_section)
2972169689Skan
2973169689Skan/* Nonzero for a given ..._DECL node means that this node should be
2974169689Skan   put in .common, if possible.  If a DECL_INITIAL is given, and it
2975169689Skan   is not error_mark_node, then the decl cannot be put in .common.  */
2976169689Skan#define DECL_COMMON(NODE) (DECL_WITH_VIS_CHECK (NODE)->decl_with_vis.common_flag)
2977169689Skan
2978169689Skan/* In a VAR_DECL, nonzero if the decl is a register variable with
2979169689Skan   an explicit asm specification.  */
2980169689Skan#define DECL_HARD_REGISTER(NODE)  (VAR_DECL_CHECK (NODE)->decl_with_vis.hard_register)
2981169689Skan
2982169689Skanextern tree decl_debug_expr_lookup (tree);
2983169689Skanextern void decl_debug_expr_insert (tree, tree);
2984169689Skan/* For VAR_DECL, this is set to either an expression that it was split
2985169689Skan   from (if DECL_DEBUG_EXPR_IS_FROM is true), otherwise a tree_list of
2986169689Skan   subexpressions that it was split into.  */
2987169689Skan#define DECL_DEBUG_EXPR(NODE) \
2988169689Skan  (decl_debug_expr_lookup (VAR_DECL_CHECK (NODE)))
2989169689Skan
2990169689Skan#define SET_DECL_DEBUG_EXPR(NODE, VAL) \
2991169689Skan  (decl_debug_expr_insert (VAR_DECL_CHECK (NODE), VAL))
2992169689Skan
2993169689Skan
2994169689Skanextern unsigned short decl_init_priority_lookup (tree);
2995169689Skanextern void decl_init_priority_insert (tree, unsigned short);
2996169689Skan
2997169689Skan/* In a non-local VAR_DECL with static storage duration, this is the
2998169689Skan   initialization priority.  If this value is zero, the NODE will be
2999169689Skan   initialized at the DEFAULT_INIT_PRIORITY.  Only used by C++ FE*/
3000169689Skan
3001169689Skan#define DECL_HAS_INIT_PRIORITY_P(NODE) \
3002169689Skan  (VAR_DECL_CHECK (NODE)->decl_with_vis.init_priority_p)
3003169689Skan#define DECL_INIT_PRIORITY(NODE) \
3004169689Skan  (decl_init_priority_lookup (VAR_DECL_CHECK (NODE)))
3005169689Skan#define SET_DECL_INIT_PRIORITY(NODE, VAL) \
3006169689Skan  (decl_init_priority_insert (VAR_DECL_CHECK (NODE), VAL))
3007169689Skan
3008169689Skan/* In a VAR_DECL, the model to use if the data should be allocated from
3009169689Skan   thread-local storage.  */
3010169689Skan#define DECL_TLS_MODEL(NODE) (VAR_DECL_CHECK (NODE)->decl_with_vis.tls_model)
3011169689Skan
3012261188Spfg/* APPLE LOCAL begin radar 5732232 - blocks */
3013261188Spfg#define BLOCK_DECL_BYREF(NODE) (VAR_DECL_CHECK (NODE)->decl_with_vis.block_decl_byref)
3014261188Spfg#define BLOCK_DECL_COPIED(NODE) (VAR_DECL_CHECK (NODE)->decl_with_vis.block_decl_copied)
3015261188Spfg/* APPLE LOCAL end radar 5732232 - blocks */
3016261188Spfg/* APPLE LOCAL radar 6172148 */
3017261188Spfg#define BLOCK_SYNTHESIZED_FUNC(NODE) (FUNCTION_DECL_CHECK (NODE)->decl_with_vis.block_synthesized_function)
3018261188Spfg/* APPLE LOCAL begin radar 5932809 - copyable byref blocks */
3019261188Spfg#define COPYABLE_BYREF_LOCAL_VAR(NODE) (VAR_DECL_CHECK (NODE)->decl_with_vis.copyable_byref_local_var)
3020261188Spfg#define COPYABLE_BYREF_LOCAL_NONPOD(NODE) (VAR_DECL_CHECK (NODE)->decl_with_vis.copyable_byref_local_nonpod)
3021261188Spfg/* APPLE LOCAL radar 5847976 */
3022261188Spfg#define COPYABLE_WEAK_BLOCK(NODE) (VAR_DECL_CHECK (NODE)->decl_with_vis.block_weak)
3023261188Spfg/* APPLE LOCAL end radar 5932809 - copyable byref blocks */
3024261188Spfg
3025169689Skan/* In a VAR_DECL, nonzero if the data should be allocated from
3026169689Skan   thread-local storage.  */
3027169689Skan#define DECL_THREAD_LOCAL_P(NODE) \
3028169689Skan  (VAR_DECL_CHECK (NODE)->decl_with_vis.tls_model != TLS_MODEL_NONE)
3029169689Skan
3030169689Skanstruct tree_var_decl GTY(())
3031169689Skan{
3032169689Skan  struct tree_decl_with_vis common;
3033169689Skan};
3034169689Skan
3035169689Skan
3036169689Skan/* This field is used to reference anything in decl.result and is meant only
3037169689Skan   for use by the garbage collector.  */
3038169689Skan#define DECL_RESULT_FLD(NODE) (DECL_NON_COMMON_CHECK (NODE)->decl_non_common.result)
3039169689Skan
3040169689Skan/* The DECL_VINDEX is used for FUNCTION_DECLS in two different ways.
3041169689Skan   Before the struct containing the FUNCTION_DECL is laid out,
3042169689Skan   DECL_VINDEX may point to a FUNCTION_DECL in a base class which
3043169689Skan   is the FUNCTION_DECL which this FUNCTION_DECL will replace as a virtual
3044169689Skan   function.  When the class is laid out, this pointer is changed
3045169689Skan   to an INTEGER_CST node which is suitable for use as an index
3046169689Skan   into the virtual function table.
3047169689Skan   C++ also uses this field in namespaces, hence the DECL_NON_COMMON_CHECK.  */
3048169689Skan#define DECL_VINDEX(NODE) (DECL_NON_COMMON_CHECK (NODE)->decl_non_common.vindex)
3049169689Skan
3050169689Skanstruct tree_decl_non_common GTY(())
3051169689Skan
3052169689Skan{
3053169689Skan  struct tree_decl_with_vis common;
3054169689Skan  /* C++ uses this in namespaces.  */
3055169689Skan  tree saved_tree;
3056169689Skan  /* C++ uses this in templates.  */
3057169689Skan  tree arguments;
3058169689Skan  /* Almost all FE's use this.  */
3059169689Skan  tree result;
3060169689Skan  /* C++ uses this in namespaces.  */
3061169689Skan  tree vindex;
3062169689Skan};
3063169689Skan
3064169689Skan/* In FUNCTION_DECL, holds the decl for the return value.  */
3065169689Skan#define DECL_RESULT(NODE) (FUNCTION_DECL_CHECK (NODE)->decl_non_common.result)
3066169689Skan
3067169689Skan/* In a FUNCTION_DECL, nonzero if the function cannot be inlined.  */
3068169689Skan#define DECL_UNINLINABLE(NODE) (FUNCTION_DECL_CHECK (NODE)->function_decl.uninlinable)
3069169689Skan
3070169689Skan/* In a FUNCTION_DECL, the saved representation of the body of the
3071169689Skan   entire function.  */
3072169689Skan#define DECL_SAVED_TREE(NODE) (FUNCTION_DECL_CHECK (NODE)->decl_non_common.saved_tree)
3073169689Skan
3074169689Skan/* Nonzero in a FUNCTION_DECL means this function should be treated
3075169689Skan   as if it were a malloc, meaning it returns a pointer that is
3076169689Skan   not an alias.  */
3077169689Skan#define DECL_IS_MALLOC(NODE) (FUNCTION_DECL_CHECK (NODE)->function_decl.malloc_flag)
3078169689Skan
3079169689Skan/* Nonzero in a FUNCTION_DECL means this function may return more
3080169689Skan   than once.  */
3081169689Skan#define DECL_IS_RETURNS_TWICE(NODE) \
3082169689Skan  (FUNCTION_DECL_CHECK (NODE)->function_decl.returns_twice_flag)
3083169689Skan
3084169689Skan/* Nonzero in a FUNCTION_DECL means this function should be treated
3085169689Skan   as "pure" function (like const function, but may read global memory).  */
3086169689Skan#define DECL_IS_PURE(NODE) (FUNCTION_DECL_CHECK (NODE)->function_decl.pure_flag)
3087169689Skan
3088169689Skan/* Nonzero in a FUNCTION_DECL means this function should be treated
3089169689Skan   as "novops" function (function that does not read global memory,
3090169689Skan   but may have arbitrary side effects).  */
3091169689Skan#define DECL_IS_NOVOPS(NODE) (FUNCTION_DECL_CHECK (NODE)->function_decl.novops_flag)
3092169689Skan
3093169689Skan/* Used in FUNCTION_DECLs to indicate that they should be run automatically
3094169689Skan   at the beginning or end of execution.  */
3095169689Skan#define DECL_STATIC_CONSTRUCTOR(NODE) \
3096169689Skan  (FUNCTION_DECL_CHECK (NODE)->function_decl.static_ctor_flag)
3097169689Skan
3098169689Skan#define DECL_STATIC_DESTRUCTOR(NODE) \
3099169689Skan(FUNCTION_DECL_CHECK (NODE)->function_decl.static_dtor_flag)
3100169689Skan
310152284Sobrien/* Used in FUNCTION_DECLs to indicate that function entry and exit should
310252284Sobrien   be instrumented with calls to support routines.  */
310390075Sobrien#define DECL_NO_INSTRUMENT_FUNCTION_ENTRY_EXIT(NODE) \
3104169689Skan  (FUNCTION_DECL_CHECK (NODE)->function_decl.no_instrument_function_entry_exit)
310552284Sobrien
310690075Sobrien/* Used in FUNCTION_DECLs to indicate that limit-stack-* should be
310790075Sobrien   disabled in this function.  */
310890075Sobrien#define DECL_NO_LIMIT_STACK(NODE) \
3109169689Skan  (FUNCTION_DECL_CHECK (NODE)->function_decl.no_limit_stack)
311052284Sobrien
3111169689Skan/* In a FUNCTION_DECL with a nonzero DECL_CONTEXT, indicates that a
3112169689Skan   static chain is not needed.  */
3113169689Skan#define DECL_NO_STATIC_CHAIN(NODE) \
3114169689Skan  (FUNCTION_DECL_CHECK (NODE)->function_decl.regdecl_flag)
311518334Speter
3116169689Skan/* Nonzero for a decl that cgraph has decided should be inlined into
3117169689Skan   at least one call site.  It is not meaningful to look at this
3118169689Skan   directly; always use cgraph_function_possibly_inlined_p.  */
3119169689Skan#define DECL_POSSIBLY_INLINED(DECL) \
3120169689Skan  FUNCTION_DECL_CHECK (DECL)->function_decl.possibly_inlined
312150397Sobrien
3122169689Skan/* Nonzero in a FUNCTION_DECL means this function can be substituted
3123169689Skan   where it is called.  */
3124169689Skan#define DECL_INLINE(NODE) (FUNCTION_DECL_CHECK (NODE)->function_decl.inline_flag)
312590075Sobrien
3126169689Skan/* Nonzero in a FUNCTION_DECL means that this function was declared inline,
3127169689Skan   such as via the `inline' keyword in C/C++.  This flag controls the linkage
3128169689Skan   semantics of 'inline'; whether or not the function is inlined is
3129169689Skan   controlled by DECL_INLINE.  */
3130169689Skan#define DECL_DECLARED_INLINE_P(NODE) \
3131169689Skan  (FUNCTION_DECL_CHECK (NODE)->function_decl.declared_inline_flag)
313252284Sobrien
3133169689Skan/* For FUNCTION_DECL, this holds a pointer to a structure ("struct function")
3134169689Skan   that describes the status of this function.  */
3135169689Skan#define DECL_STRUCT_FUNCTION(NODE) (FUNCTION_DECL_CHECK (NODE)->function_decl.f)
313652284Sobrien
3137169689Skan/* In a FUNCTION_DECL, nonzero means a built in function.  */
3138169689Skan#define DECL_BUILT_IN(NODE) (DECL_BUILT_IN_CLASS (NODE) != NOT_BUILT_IN)
313990075Sobrien
3140169689Skan/* For a builtin function, identify which part of the compiler defined it.  */
3141169689Skan#define DECL_BUILT_IN_CLASS(NODE) \
3142169689Skan   (FUNCTION_DECL_CHECK (NODE)->function_decl.built_in_class)
3143132718Skan
3144169689Skan/* In FUNCTION_DECL, a chain of ..._DECL nodes.
3145169689Skan   VAR_DECL and PARM_DECL reserve the arguments slot for language-specific
3146169689Skan   uses.  */
3147169689Skan#define DECL_ARGUMENTS(NODE) (FUNCTION_DECL_CHECK (NODE)->decl_non_common.arguments)
3148169689Skan#define DECL_ARGUMENT_FLD(NODE) (DECL_NON_COMMON_CHECK (NODE)->decl_non_common.arguments)
3149132718Skan
3150169689Skan/* FUNCTION_DECL inherits from DECL_NON_COMMON because of the use of the
3151169689Skan   arguments/result/saved_tree fields by front ends.   It was either inherit
3152169689Skan   FUNCTION_DECL from non_common, or inherit non_common from FUNCTION_DECL,
3153169689Skan   which seemed a bit strange.  */
315490075Sobrien
3155169689Skanstruct tree_function_decl GTY(())
315618334Speter{
3157169689Skan  struct tree_decl_non_common common;
315818334Speter
3159259694Spfg  /* In a FUNCTION_DECL for which DECL_BUILT_IN holds, this is
3160259694Spfg     DECL_FUNCTION_CODE.  Otherwise unused.  */
3161259694Spfg  enum built_in_function function_code;
3162259694Spfg
316318334Speter  unsigned static_ctor_flag : 1;
316418334Speter  unsigned static_dtor_flag : 1;
3165169689Skan  unsigned uninlinable : 1;
3166169689Skan  unsigned possibly_inlined : 1;
3167169689Skan  unsigned novops_flag : 1;
3168169689Skan  unsigned returns_twice_flag : 1;
3169169689Skan  unsigned malloc_flag : 1;
3170169689Skan  unsigned pure_flag : 1;
317118334Speter
3172169689Skan  unsigned declared_inline_flag : 1;
3173169689Skan  unsigned regdecl_flag : 1;
3174169689Skan  unsigned inline_flag : 1;
317590075Sobrien  unsigned no_instrument_function_entry_exit : 1;
317690075Sobrien  unsigned no_limit_stack : 1;
317790075Sobrien  ENUM_BITFIELD(built_in_class) built_in_class : 2;
317890075Sobrien
3179169689Skan  struct function *f;
3180169689Skan};
318190075Sobrien
3182169689Skan/* For a TYPE_DECL, holds the "original" type.  (TREE_TYPE has the copy.) */
3183169689Skan#define DECL_ORIGINAL_TYPE(NODE) (TYPE_DECL_CHECK (NODE)->decl_non_common.result)
318418334Speter
3185169689Skan/* In a TYPE_DECL nonzero means the detail info about this type is not dumped
3186169689Skan   into stabs.  Instead it will generate cross reference ('x') of names.
3187169689Skan   This uses the same flag as DECL_EXTERNAL.  */
3188169689Skan#define TYPE_DECL_SUPPRESS_DEBUG(NODE) \
3189169689Skan  (TYPE_DECL_CHECK (NODE)->decl_common.decl_flag_2)
319050397Sobrien
3191169689Skanstruct tree_type_decl GTY(())
3192169689Skan{
3193169689Skan  struct tree_decl_non_common common;
319490075Sobrien
3195169689Skan};
3196169689Skan
3197169689Skan/* A STATEMENT_LIST chains statements together in GENERIC and GIMPLE.
3198169689Skan   To reduce overhead, the nodes containing the statements are not trees.
3199169689Skan   This avoids the overhead of tree_common on all linked list elements.
320050397Sobrien
3201169689Skan   Use the interface in tree-iterator.h to access this node.  */
320290075Sobrien
3203169689Skan#define STATEMENT_LIST_HEAD(NODE) \
3204169689Skan  (STATEMENT_LIST_CHECK (NODE)->stmt_list.head)
3205169689Skan#define STATEMENT_LIST_TAIL(NODE) \
3206169689Skan  (STATEMENT_LIST_CHECK (NODE)->stmt_list.tail)
320790075Sobrien
3208169689Skanstruct tree_statement_list_node
3209169689Skan  GTY ((chain_next ("%h.next"), chain_prev ("%h.prev")))
3210169689Skan{
3211169689Skan  struct tree_statement_list_node *prev;
3212169689Skan  struct tree_statement_list_node *next;
3213169689Skan  tree stmt;
321418334Speter};
3215169689Skan
3216169689Skanstruct tree_statement_list
3217169689Skan  GTY(())
3218169689Skan{
3219169689Skan  struct tree_common common;
3220169689Skan  struct tree_statement_list_node *head;
3221169689Skan  struct tree_statement_list_node *tail;
3222117395Skan};
3223117395Skan
3224169689Skan#define VALUE_HANDLE_ID(NODE)		\
3225169689Skan  (VALUE_HANDLE_CHECK (NODE)->value_handle.id)
3226169689Skan
3227169689Skan#define VALUE_HANDLE_EXPR_SET(NODE)	\
3228169689Skan  (VALUE_HANDLE_CHECK (NODE)->value_handle.expr_set)
3229169689Skan
3230169689Skan#define VALUE_HANDLE_VUSES(NODE)        \
3231169689Skan  (VALUE_HANDLE_CHECK (NODE)->value_handle.vuses)
3232169689Skan
3233169689Skan/* Defined and used in tree-ssa-pre.c.  */
3234169689Skanstruct value_set;
3235169689Skan
3236169689Skanstruct tree_value_handle GTY(())
3237169689Skan{
3238169689Skan  struct tree_common common;
3239169689Skan
3240169689Skan  /* The set of expressions represented by this handle.  */
3241169689Skan  struct value_set * GTY ((skip)) expr_set;
3242169689Skan
3243169689Skan  /* Unique ID for this value handle.  IDs are handed out in a
3244169689Skan     conveniently dense form starting at 0, so that we can make
3245169689Skan     bitmaps of value handles.  */
3246169689Skan  unsigned int id;
3247169689Skan
3248169689Skan  /* Set of virtual uses represented by this handle.  */
3249169689Skan  VEC (tree, gc) *vuses;
3250169689Skan};
3251169689Skan
325218334Speter/* Define the overall contents of a tree node.
325318334Speter   It may be any of the structures declared above
325418334Speter   for various types of node.  */
325518334Speter
3256117395Skanunion tree_node GTY ((ptr_alias (union lang_tree_node),
3257117395Skan		      desc ("tree_node_structure (&%h)")))
325818334Speter{
3259117395Skan  struct tree_common GTY ((tag ("TS_COMMON"))) common;
3260117395Skan  struct tree_int_cst GTY ((tag ("TS_INT_CST"))) int_cst;
3261117395Skan  struct tree_real_cst GTY ((tag ("TS_REAL_CST"))) real_cst;
3262117395Skan  struct tree_vector GTY ((tag ("TS_VECTOR"))) vector;
3263117395Skan  struct tree_string GTY ((tag ("TS_STRING"))) string;
3264117395Skan  struct tree_complex GTY ((tag ("TS_COMPLEX"))) complex;
3265117395Skan  struct tree_identifier GTY ((tag ("TS_IDENTIFIER"))) identifier;
3266169689Skan  struct tree_decl_minimal GTY((tag ("TS_DECL_MINIMAL"))) decl_minimal;
3267169689Skan  struct tree_decl_common GTY ((tag ("TS_DECL_COMMON"))) decl_common;
3268169689Skan  struct tree_decl_with_rtl GTY ((tag ("TS_DECL_WRTL"))) decl_with_rtl;
3269169689Skan  struct tree_decl_non_common  GTY ((tag ("TS_DECL_NON_COMMON"))) decl_non_common;
3270169689Skan  struct tree_parm_decl  GTY  ((tag ("TS_PARM_DECL"))) parm_decl;
3271169689Skan  struct tree_decl_with_vis GTY ((tag ("TS_DECL_WITH_VIS"))) decl_with_vis;
3272169689Skan  struct tree_var_decl GTY ((tag ("TS_VAR_DECL"))) var_decl;
3273169689Skan  struct tree_field_decl GTY ((tag ("TS_FIELD_DECL"))) field_decl;
3274169689Skan  struct tree_label_decl GTY ((tag ("TS_LABEL_DECL"))) label_decl;
3275169689Skan  struct tree_result_decl GTY ((tag ("TS_RESULT_DECL"))) result_decl;
3276169689Skan  struct tree_const_decl GTY ((tag ("TS_CONST_DECL"))) const_decl;
3277169689Skan  struct tree_type_decl GTY ((tag ("TS_TYPE_DECL"))) type_decl;
3278169689Skan  struct tree_function_decl GTY ((tag ("TS_FUNCTION_DECL"))) function_decl;
3279117395Skan  struct tree_type GTY ((tag ("TS_TYPE"))) type;
3280117395Skan  struct tree_list GTY ((tag ("TS_LIST"))) list;
3281117395Skan  struct tree_vec GTY ((tag ("TS_VEC"))) vec;
3282117395Skan  struct tree_exp GTY ((tag ("TS_EXP"))) exp;
3283169689Skan  struct tree_ssa_name GTY ((tag ("TS_SSA_NAME"))) ssa_name;
3284169689Skan  struct tree_phi_node GTY ((tag ("TS_PHI_NODE"))) phi;
3285117395Skan  struct tree_block GTY ((tag ("TS_BLOCK"))) block;
3286169689Skan  struct tree_binfo GTY ((tag ("TS_BINFO"))) binfo;
3287169689Skan  struct tree_statement_list GTY ((tag ("TS_STATEMENT_LIST"))) stmt_list;
3288169689Skan  struct tree_value_handle GTY ((tag ("TS_VALUE_HANDLE"))) value_handle;
3289169689Skan  struct tree_constructor GTY ((tag ("TS_CONSTRUCTOR"))) constructor;
3290169689Skan  struct tree_memory_tag GTY ((tag ("TS_MEMORY_TAG"))) mtag;
3291169689Skan  struct tree_struct_field_tag GTY ((tag ("TS_STRUCT_FIELD_TAG"))) sft;
3292169689Skan  struct tree_omp_clause GTY ((tag ("TS_OMP_CLAUSE"))) omp_clause;
3293169689Skan};
329450397Sobrien
329590075Sobrien/* Standard named or nameless data types of the C compiler.  */
329690075Sobrien
329790075Sobrienenum tree_index
329890075Sobrien{
329990075Sobrien  TI_ERROR_MARK,
330090075Sobrien  TI_INTQI_TYPE,
330190075Sobrien  TI_INTHI_TYPE,
330290075Sobrien  TI_INTSI_TYPE,
330390075Sobrien  TI_INTDI_TYPE,
330490075Sobrien  TI_INTTI_TYPE,
330590075Sobrien
330690075Sobrien  TI_UINTQI_TYPE,
330790075Sobrien  TI_UINTHI_TYPE,
330890075Sobrien  TI_UINTSI_TYPE,
330990075Sobrien  TI_UINTDI_TYPE,
331090075Sobrien  TI_UINTTI_TYPE,
3311117395Skan
3312259563Spfg  TI_UINT32_TYPE,
3313259563Spfg  TI_UINT64_TYPE,
3314259563Spfg
331590075Sobrien  TI_INTEGER_ZERO,
331690075Sobrien  TI_INTEGER_ONE,
331790075Sobrien  TI_INTEGER_MINUS_ONE,
331890075Sobrien  TI_NULL_POINTER,
331990075Sobrien
332090075Sobrien  TI_SIZE_ZERO,
332190075Sobrien  TI_SIZE_ONE,
332290075Sobrien
332390075Sobrien  TI_BITSIZE_ZERO,
332490075Sobrien  TI_BITSIZE_ONE,
332590075Sobrien  TI_BITSIZE_UNIT,
332690075Sobrien
3327132718Skan  TI_PUBLIC,
3328132718Skan  TI_PROTECTED,
3329132718Skan  TI_PRIVATE,
3330132718Skan
3331132718Skan  TI_BOOLEAN_FALSE,
3332132718Skan  TI_BOOLEAN_TRUE,
3333132718Skan
333490075Sobrien  TI_COMPLEX_INTEGER_TYPE,
333590075Sobrien  TI_COMPLEX_FLOAT_TYPE,
333690075Sobrien  TI_COMPLEX_DOUBLE_TYPE,
333790075Sobrien  TI_COMPLEX_LONG_DOUBLE_TYPE,
333890075Sobrien
333990075Sobrien  TI_FLOAT_TYPE,
334090075Sobrien  TI_DOUBLE_TYPE,
334190075Sobrien  TI_LONG_DOUBLE_TYPE,
334290075Sobrien
3343132718Skan  TI_FLOAT_PTR_TYPE,
3344132718Skan  TI_DOUBLE_PTR_TYPE,
3345132718Skan  TI_LONG_DOUBLE_PTR_TYPE,
3346132718Skan  TI_INTEGER_PTR_TYPE,
3347132718Skan
334890075Sobrien  TI_VOID_TYPE,
334990075Sobrien  TI_PTR_TYPE,
335090075Sobrien  TI_CONST_PTR_TYPE,
3351110611Skan  TI_SIZE_TYPE,
3352169689Skan  TI_PID_TYPE,
335390075Sobrien  TI_PTRDIFF_TYPE,
335490075Sobrien  TI_VA_LIST_TYPE,
3355169689Skan  TI_VA_LIST_GPR_COUNTER_FIELD,
3356169689Skan  TI_VA_LIST_FPR_COUNTER_FIELD,
3357132718Skan  TI_BOOLEAN_TYPE,
3358169689Skan  TI_FILEPTR_TYPE,
335990075Sobrien
3360169689Skan  TI_DFLOAT32_TYPE,
3361169689Skan  TI_DFLOAT64_TYPE,
3362169689Skan  TI_DFLOAT128_TYPE,
3363169689Skan  TI_DFLOAT32_PTR_TYPE,
3364169689Skan  TI_DFLOAT64_PTR_TYPE,
3365169689Skan  TI_DFLOAT128_PTR_TYPE,
3366169689Skan
336790075Sobrien  TI_VOID_LIST_NODE,
336890075Sobrien
336990075Sobrien  TI_MAIN_IDENTIFIER,
337090075Sobrien
337190075Sobrien  TI_MAX
337290075Sobrien};
337390075Sobrien
3374117395Skanextern GTY(()) tree global_trees[TI_MAX];
337590075Sobrien
337690075Sobrien#define error_mark_node			global_trees[TI_ERROR_MARK]
3377117395Skan
337890075Sobrien#define intQI_type_node			global_trees[TI_INTQI_TYPE]
337990075Sobrien#define intHI_type_node			global_trees[TI_INTHI_TYPE]
338090075Sobrien#define intSI_type_node			global_trees[TI_INTSI_TYPE]
338190075Sobrien#define intDI_type_node			global_trees[TI_INTDI_TYPE]
338290075Sobrien#define intTI_type_node			global_trees[TI_INTTI_TYPE]
338390075Sobrien
338490075Sobrien#define unsigned_intQI_type_node	global_trees[TI_UINTQI_TYPE]
338590075Sobrien#define unsigned_intHI_type_node	global_trees[TI_UINTHI_TYPE]
338690075Sobrien#define unsigned_intSI_type_node	global_trees[TI_UINTSI_TYPE]
338790075Sobrien#define unsigned_intDI_type_node	global_trees[TI_UINTDI_TYPE]
338890075Sobrien#define unsigned_intTI_type_node	global_trees[TI_UINTTI_TYPE]
338990075Sobrien
3390259563Spfg#define uint32_type_node		global_trees[TI_UINT32_TYPE]
3391259563Spfg#define uint64_type_node		global_trees[TI_UINT64_TYPE]
3392259563Spfg
339390075Sobrien#define integer_zero_node		global_trees[TI_INTEGER_ZERO]
339490075Sobrien#define integer_one_node		global_trees[TI_INTEGER_ONE]
339590075Sobrien#define integer_minus_one_node		global_trees[TI_INTEGER_MINUS_ONE]
339690075Sobrien#define size_zero_node			global_trees[TI_SIZE_ZERO]
339790075Sobrien#define size_one_node			global_trees[TI_SIZE_ONE]
339890075Sobrien#define bitsize_zero_node		global_trees[TI_BITSIZE_ZERO]
339990075Sobrien#define bitsize_one_node		global_trees[TI_BITSIZE_ONE]
340090075Sobrien#define bitsize_unit_node		global_trees[TI_BITSIZE_UNIT]
340190075Sobrien
3402132718Skan/* Base access nodes.  */
3403132718Skan#define access_public_node		global_trees[TI_PUBLIC]
3404132718Skan#define access_protected_node	        global_trees[TI_PROTECTED]
3405132718Skan#define access_private_node		global_trees[TI_PRIVATE]
3406132718Skan
340790075Sobrien#define null_pointer_node		global_trees[TI_NULL_POINTER]
340890075Sobrien
340990075Sobrien#define float_type_node			global_trees[TI_FLOAT_TYPE]
341090075Sobrien#define double_type_node		global_trees[TI_DOUBLE_TYPE]
341190075Sobrien#define long_double_type_node		global_trees[TI_LONG_DOUBLE_TYPE]
341290075Sobrien
3413132718Skan#define float_ptr_type_node		global_trees[TI_FLOAT_PTR_TYPE]
3414132718Skan#define double_ptr_type_node		global_trees[TI_DOUBLE_PTR_TYPE]
3415132718Skan#define long_double_ptr_type_node	global_trees[TI_LONG_DOUBLE_PTR_TYPE]
3416132718Skan#define integer_ptr_type_node		global_trees[TI_INTEGER_PTR_TYPE]
3417132718Skan
341890075Sobrien#define complex_integer_type_node	global_trees[TI_COMPLEX_INTEGER_TYPE]
341990075Sobrien#define complex_float_type_node		global_trees[TI_COMPLEX_FLOAT_TYPE]
342090075Sobrien#define complex_double_type_node	global_trees[TI_COMPLEX_DOUBLE_TYPE]
342190075Sobrien#define complex_long_double_type_node	global_trees[TI_COMPLEX_LONG_DOUBLE_TYPE]
342290075Sobrien
342390075Sobrien#define void_type_node			global_trees[TI_VOID_TYPE]
342490075Sobrien/* The C type `void *'.  */
342590075Sobrien#define ptr_type_node			global_trees[TI_PTR_TYPE]
342690075Sobrien/* The C type `const void *'.  */
342790075Sobrien#define const_ptr_type_node		global_trees[TI_CONST_PTR_TYPE]
3428110611Skan/* The C type `size_t'.  */
3429110611Skan#define size_type_node                  global_trees[TI_SIZE_TYPE]
3430169689Skan#define pid_type_node                   global_trees[TI_PID_TYPE]
343190075Sobrien#define ptrdiff_type_node		global_trees[TI_PTRDIFF_TYPE]
343290075Sobrien#define va_list_type_node		global_trees[TI_VA_LIST_TYPE]
3433169689Skan#define va_list_gpr_counter_field	global_trees[TI_VA_LIST_GPR_COUNTER_FIELD]
3434169689Skan#define va_list_fpr_counter_field	global_trees[TI_VA_LIST_FPR_COUNTER_FIELD]
3435169689Skan/* The C type `FILE *'.  */
3436169689Skan#define fileptr_type_node		global_trees[TI_FILEPTR_TYPE]
343790075Sobrien
3438132718Skan#define boolean_type_node		global_trees[TI_BOOLEAN_TYPE]
3439132718Skan#define boolean_false_node		global_trees[TI_BOOLEAN_FALSE]
3440132718Skan#define boolean_true_node		global_trees[TI_BOOLEAN_TRUE]
3441132718Skan
3442169689Skan/* The decimal floating point types. */
3443169689Skan#define dfloat32_type_node              global_trees[TI_DFLOAT32_TYPE]
3444169689Skan#define dfloat64_type_node              global_trees[TI_DFLOAT64_TYPE]
3445169689Skan#define dfloat128_type_node             global_trees[TI_DFLOAT128_TYPE]
3446169689Skan#define dfloat32_ptr_type_node          global_trees[TI_DFLOAT32_PTR_TYPE]
3447169689Skan#define dfloat64_ptr_type_node          global_trees[TI_DFLOAT64_PTR_TYPE]
3448169689Skan#define dfloat128_ptr_type_node         global_trees[TI_DFLOAT128_PTR_TYPE]
3449169689Skan
345090075Sobrien/* The node that should be placed at the end of a parameter list to
345190075Sobrien   indicate that the function does not take a variable number of
345290075Sobrien   arguments.  The TREE_VALUE will be void_type_node and there will be
345390075Sobrien   no TREE_CHAIN.  Language-independent code should not assume
345490075Sobrien   anything else about this node.  */
345590075Sobrien#define void_list_node                  global_trees[TI_VOID_LIST_NODE]
345690075Sobrien
345790075Sobrien#define main_identifier_node		global_trees[TI_MAIN_IDENTIFIER]
345890075Sobrien#define MAIN_NAME_P(NODE) (IDENTIFIER_NODE_CHECK (NODE) == main_identifier_node)
345990075Sobrien
346090075Sobrien/* An enumeration of the standard C integer types.  These must be
3461117395Skan   ordered so that shorter types appear before longer ones, and so
3462117395Skan   that signed types appear before unsigned ones, for the correct
3463117395Skan   functioning of interpret_integer() in c-lex.c.  */
3464117395Skanenum integer_type_kind
346590075Sobrien{
346690075Sobrien  itk_char,
346790075Sobrien  itk_signed_char,
346890075Sobrien  itk_unsigned_char,
346990075Sobrien  itk_short,
347090075Sobrien  itk_unsigned_short,
347190075Sobrien  itk_int,
347290075Sobrien  itk_unsigned_int,
347390075Sobrien  itk_long,
347490075Sobrien  itk_unsigned_long,
347590075Sobrien  itk_long_long,
347690075Sobrien  itk_unsigned_long_long,
347790075Sobrien  itk_none
347890075Sobrien};
347990075Sobrien
348090075Sobrientypedef enum integer_type_kind integer_type_kind;
348190075Sobrien
348290075Sobrien/* The standard C integer types.  Use integer_type_kind to index into
348390075Sobrien   this array.  */
3484117395Skanextern GTY(()) tree integer_types[itk_none];
348590075Sobrien
348690075Sobrien#define char_type_node			integer_types[itk_char]
348790075Sobrien#define signed_char_type_node		integer_types[itk_signed_char]
348890075Sobrien#define unsigned_char_type_node		integer_types[itk_unsigned_char]
348990075Sobrien#define short_integer_type_node		integer_types[itk_short]
349090075Sobrien#define short_unsigned_type_node	integer_types[itk_unsigned_short]
349190075Sobrien#define integer_type_node		integer_types[itk_int]
349290075Sobrien#define unsigned_type_node		integer_types[itk_unsigned_int]
349390075Sobrien#define long_integer_type_node		integer_types[itk_long]
349490075Sobrien#define long_unsigned_type_node		integer_types[itk_unsigned_long]
349590075Sobrien#define long_long_integer_type_node	integer_types[itk_long_long]
349690075Sobrien#define long_long_unsigned_type_node	integer_types[itk_unsigned_long_long]
3497117395Skan
3498117395Skan/* Set to the default thread-local storage (tls) model to use.  */
349990075Sobrien
3500117395Skanextern enum tls_model flag_tls_default;
3501117395Skan
350290075Sobrien
3503104752Skan/* A pointer-to-function member type looks like:
3504104752Skan
3505104752Skan     struct {
3506104752Skan       __P __pfn;
3507104752Skan       ptrdiff_t __delta;
3508104752Skan     };
3509104752Skan
3510104752Skan   If __pfn is NULL, it is a NULL pointer-to-member-function.
3511104752Skan
3512104752Skan   (Because the vtable is always the first thing in the object, we
3513104752Skan   don't need its offset.)  If the function is virtual, then PFN is
3514104752Skan   one plus twice the index into the vtable; otherwise, it is just a
3515104752Skan   pointer to the function.
3516104752Skan
3517104752Skan   Unfortunately, using the lowest bit of PFN doesn't work in
3518104752Skan   architectures that don't impose alignment requirements on function
3519104752Skan   addresses, or that use the lowest bit to tell one ISA from another,
3520104752Skan   for example.  For such architectures, we use the lowest bit of
3521104752Skan   DELTA instead of the lowest bit of the PFN, and DELTA will be
3522104752Skan   multiplied by 2.  */
3523104752Skan
3524104752Skanenum ptrmemfunc_vbit_where_t
3525104752Skan{
3526104752Skan  ptrmemfunc_vbit_in_pfn,
3527104752Skan  ptrmemfunc_vbit_in_delta
3528104752Skan};
3529104752Skan
353018334Speter#define NULL_TREE (tree) NULL
353118334Speter
3532132718Skanextern tree decl_assembler_name (tree);
353318334Speter
353490075Sobrien/* Compute the number of bytes occupied by 'node'.  This routine only
353590075Sobrien   looks at TREE_CODE and, if the code is TREE_VEC, TREE_VEC_LENGTH.  */
353618334Speter
3537132718Skanextern size_t tree_size (tree);
353890075Sobrien
3539169689Skan/* Compute the number of bytes occupied by a tree with code CODE.  This
3540169689Skan   function cannot be used for TREE_VEC or PHI_NODE codes, which are of
3541169689Skan   variable length.  */
3542169689Skanextern size_t tree_code_size (enum tree_code);
3543169689Skan
354418334Speter/* Lowest level primitive for allocating a node.
354518334Speter   The TREE_CODE is the only argument.  Contents are initialized
354618334Speter   to zero except for a few of the common fields.  */
354718334Speter
3548169689Skanextern tree make_node_stat (enum tree_code MEM_STAT_DECL);
3549169689Skan#define make_node(t) make_node_stat (t MEM_STAT_INFO)
355018334Speter
3551117395Skan/* Make a copy of a node, with all the same contents.  */
355218334Speter
3553169689Skanextern tree copy_node_stat (tree MEM_STAT_DECL);
3554169689Skan#define copy_node(t) copy_node_stat (t MEM_STAT_INFO)
355518334Speter
355618334Speter/* Make a copy of a chain of TREE_LIST nodes.  */
355718334Speter
3558132718Skanextern tree copy_list (tree);
355918334Speter
3560169689Skan/* Make a BINFO.  */
3561169689Skanextern tree make_tree_binfo_stat (unsigned MEM_STAT_DECL);
3562169689Skan#define make_tree_binfo(t) make_tree_binfo_stat (t MEM_STAT_INFO)
3563169689Skan
356418334Speter/* Make a TREE_VEC.  */
356518334Speter
3566169689Skanextern tree make_tree_vec_stat (int MEM_STAT_DECL);
3567169689Skan#define make_tree_vec(t) make_tree_vec_stat (t MEM_STAT_INFO)
356818334Speter
3569169689Skan/* Tree nodes for SSA analysis.  */
3570169689Skan
3571169689Skanextern void init_phinodes (void);
3572169689Skanextern void fini_phinodes (void);
3573169689Skanextern void release_phi_node (tree);
3574169689Skan#ifdef GATHER_STATISTICS
3575169689Skanextern void phinodes_print_statistics (void);
3576169689Skan#endif
3577169689Skan
3578169689Skanextern void init_ssanames (void);
3579169689Skanextern void fini_ssanames (void);
3580169689Skanextern tree make_ssa_name (tree, tree);
3581169689Skanextern tree duplicate_ssa_name (tree, tree);
3582169689Skanextern void duplicate_ssa_name_ptr_info (tree, struct ptr_info_def *);
3583169689Skanextern void release_ssa_name (tree);
3584169689Skanextern void release_defs (tree);
3585169689Skanextern void replace_ssa_name_symbol (tree, tree);
3586169689Skan
3587169689Skan#ifdef GATHER_STATISTICS
3588169689Skanextern void ssanames_print_statistics (void);
3589169689Skan#endif
3590169689Skan
359118334Speter/* Return the (unique) IDENTIFIER_NODE node for a given name.
359218334Speter   The name is supplied as a char *.  */
359318334Speter
3594132718Skanextern tree get_identifier (const char *);
359518334Speter
3596132718Skan#if GCC_VERSION >= 3000
3597132718Skan#define get_identifier(str) \
3598132718Skan  (__builtin_constant_p (str)				\
3599132718Skan    ? get_identifier_with_length ((str), strlen (str))  \
3600132718Skan    : get_identifier (str))
3601132718Skan#endif
3602132718Skan
3603132718Skan
360490075Sobrien/* Identical to get_identifier, except that the length is assumed
360590075Sobrien   known.  */
360690075Sobrien
3607132718Skanextern tree get_identifier_with_length (const char *, size_t);
360890075Sobrien
360950397Sobrien/* If an identifier with the name TEXT (a null-terminated string) has
361050397Sobrien   previously been referred to, return that node; otherwise return
361150397Sobrien   NULL_TREE.  */
361250397Sobrien
3613132718Skanextern tree maybe_get_identifier (const char *);
361450397Sobrien
361518334Speter/* Construct various types of nodes.  */
361618334Speter
3617132718Skanextern tree build_nt (enum tree_code, ...);
361818334Speter
3619169689Skanextern tree build0_stat (enum tree_code, tree MEM_STAT_DECL);
3620169689Skan#define build0(c,t) build0_stat (c,t MEM_STAT_INFO)
3621169689Skanextern tree build1_stat (enum tree_code, tree, tree MEM_STAT_DECL);
3622169689Skan#define build1(c,t1,t2) build1_stat (c,t1,t2 MEM_STAT_INFO)
3623169689Skanextern tree build2_stat (enum tree_code, tree, tree, tree MEM_STAT_DECL);
3624169689Skan#define build2(c,t1,t2,t3) build2_stat (c,t1,t2,t3 MEM_STAT_INFO)
3625169689Skanextern tree build3_stat (enum tree_code, tree, tree, tree, tree MEM_STAT_DECL);
3626169689Skan#define build3(c,t1,t2,t3,t4) build3_stat (c,t1,t2,t3,t4 MEM_STAT_INFO)
3627169689Skanextern tree build4_stat (enum tree_code, tree, tree, tree, tree,
3628169689Skan			 tree MEM_STAT_DECL);
3629169689Skan#define build4(c,t1,t2,t3,t4,t5) build4_stat (c,t1,t2,t3,t4,t5 MEM_STAT_INFO)
3630169689Skanextern tree build5_stat (enum tree_code, tree, tree, tree, tree, tree,
3631169689Skan			 tree MEM_STAT_DECL);
3632169689Skan#define build5(c,t1,t2,t3,t4,t5,t6) build5_stat (c,t1,t2,t3,t4,t5,t6 MEM_STAT_INFO)
3633169689Skanextern tree build7_stat (enum tree_code, tree, tree, tree, tree, tree,
3634169689Skan			 tree, tree, tree MEM_STAT_DECL);
3635169689Skan#define build7(c,t1,t2,t3,t4,t5,t6,t7,t8) \
3636169689Skan  build7_stat (c,t1,t2,t3,t4,t5,t6,t7,t8 MEM_STAT_INFO)
3637169689Skan
3638169689Skanextern tree build_int_cst (tree, HOST_WIDE_INT);
3639169689Skanextern tree build_int_cst_type (tree, HOST_WIDE_INT);
3640169689Skanextern tree build_int_cstu (tree, unsigned HOST_WIDE_INT);
3641169689Skanextern tree build_int_cst_wide (tree, unsigned HOST_WIDE_INT, HOST_WIDE_INT);
3642132718Skanextern tree build_vector (tree, tree);
3643169689Skanextern tree build_vector_from_ctor (tree, VEC(constructor_elt,gc) *);
3644169689Skanextern tree build_constructor (tree, VEC(constructor_elt,gc) *);
3645169689Skanextern tree build_constructor_single (tree, tree, tree);
3646169689Skanextern tree build_constructor_from_list (tree, tree);
3647132718Skanextern tree build_real_from_int_cst (tree, tree);
3648132718Skanextern tree build_complex (tree, tree, tree);
3649169689Skanextern tree build_one_cst (tree);
3650132718Skanextern tree build_string (int, const char *);
3651169689Skanextern tree build_tree_list_stat (tree, tree MEM_STAT_DECL);
3652169689Skan#define build_tree_list(t,q) build_tree_list_stat(t,q MEM_STAT_INFO)
3653169689Skanextern tree build_decl_stat (enum tree_code, tree, tree MEM_STAT_DECL);
3654169689Skanextern tree build_fn_decl (const char *, tree);
3655169689Skan#define build_decl(c,t,q) build_decl_stat (c,t,q MEM_STAT_INFO)
3656169689Skanextern tree build_block (tree, tree, tree, tree);
3657169689Skan#ifndef USE_MAPPED_LOCATION
3658169689Skanextern void annotate_with_file_line (tree, const char *, int);
3659169689Skanextern void annotate_with_locus (tree, location_t);
3660169689Skan#endif
3661169689Skanextern tree build_empty_stmt (void);
3662169689Skanextern tree build_omp_clause (enum omp_clause_code);
366318334Speter
366418334Speter/* Construct various nodes representing data types.  */
366518334Speter
3666132718Skanextern tree make_signed_type (int);
3667132718Skanextern tree make_unsigned_type (int);
3668169689Skanextern tree signed_type_for (tree);
3669169689Skanextern tree unsigned_type_for (tree);
3670169689Skanextern void initialize_sizetypes (bool);
3671132718Skanextern void set_sizetype (tree);
3672132718Skanextern void fixup_unsigned_type (tree);
3673169689Skanextern tree build_pointer_type_for_mode (tree, enum machine_mode, bool);
3674132718Skanextern tree build_pointer_type (tree);
3675261188Spfg/* APPLE LOCAL radar 5732232 - blocks */
3676261188Spfgextern tree build_block_pointer_type (tree);
3677169689Skanextern tree build_reference_type_for_mode (tree, enum machine_mode, bool);
3678132718Skanextern tree build_reference_type (tree);
3679169689Skanextern tree build_vector_type_for_mode (tree, enum machine_mode);
3680169689Skanextern tree build_vector_type (tree innertype, int nunits);
3681132718Skanextern tree build_type_no_quals (tree);
3682132718Skanextern tree build_index_type (tree);
3683132718Skanextern tree build_index_2_type (tree, tree);
3684132718Skanextern tree build_array_type (tree, tree);
3685132718Skanextern tree build_function_type (tree, tree);
3686132718Skanextern tree build_function_type_list (tree, ...);
3687132718Skanextern tree build_method_type_directly (tree, tree, tree);
3688132718Skanextern tree build_method_type (tree, tree);
3689132718Skanextern tree build_offset_type (tree, tree);
3690132718Skanextern tree build_complex_type (tree);
3691169689Skanextern tree build_resx (int);
3692132718Skanextern tree array_type_nelts (tree);
3693169689Skanextern bool in_array_bounds_p (tree);
3694169689Skanextern bool range_in_array_bounds_p (tree);
369518334Speter
3696132718Skanextern tree value_member (tree, tree);
3697132718Skanextern tree purpose_member (tree, tree);
3698169689Skan
3699132718Skanextern int attribute_list_equal (tree, tree);
3700132718Skanextern int attribute_list_contained (tree, tree);
3701132718Skanextern int tree_int_cst_equal (tree, tree);
3702132718Skanextern int tree_int_cst_lt (tree, tree);
3703132718Skanextern int tree_int_cst_compare (tree, tree);
3704132718Skanextern int host_integerp (tree, int);
3705132718Skanextern HOST_WIDE_INT tree_low_cst (tree, int);
3706132718Skanextern int tree_int_cst_msb (tree);
3707132718Skanextern int tree_int_cst_sgn (tree);
3708169689Skanextern int tree_int_cst_sign_bit (tree);
3709132718Skanextern int tree_expr_nonnegative_p (tree);
3710169689Skanextern int tree_expr_nonnegative_warnv_p (tree, bool *);
3711169689Skanextern bool may_negate_without_overflow_p (tree);
3712132718Skanextern tree get_inner_array_type (tree);
371318334Speter
371418334Speter/* From expmed.c.  Since rtl.h is included after tree.h, we can't
371518334Speter   put the prototype here.  Rtl.h does declare the prototype if
371618334Speter   tree.h had been included.  */
371718334Speter
3718132718Skanextern tree make_tree (tree, rtx);
371918334Speter
372018334Speter/* Return a type like TTYPE except that its TYPE_ATTRIBUTES
372118334Speter   is ATTRIBUTE.
372218334Speter
372318334Speter   Such modified types already made are recorded so that duplicates
372490075Sobrien   are not made.  */
372518334Speter
3726132718Skanextern tree build_type_attribute_variant (tree, tree);
3727132718Skanextern tree build_decl_attribute_variant (tree, tree);
372818334Speter
372990075Sobrien/* Structure describing an attribute and a function to handle it.  */
373090075Sobrienstruct attribute_spec
373190075Sobrien{
373290075Sobrien  /* The name of the attribute (without any leading or trailing __),
373390075Sobrien     or NULL to mark the end of a table of attributes.  */
373490075Sobrien  const char *const name;
373590075Sobrien  /* The minimum length of the list of arguments of the attribute.  */
373690075Sobrien  const int min_length;
373790075Sobrien  /* The maximum length of the list of arguments of the attribute
373890075Sobrien     (-1 for no maximum).  */
373990075Sobrien  const int max_length;
374090075Sobrien  /* Whether this attribute requires a DECL.  If it does, it will be passed
374190075Sobrien     from types of DECLs, function return types and array element types to
374290075Sobrien     the DECLs, function types and array types respectively; but when
374390075Sobrien     applied to a type in any other circumstances, it will be ignored with
374490075Sobrien     a warning.  (If greater control is desired for a given attribute,
374590075Sobrien     this should be false, and the flags argument to the handler may be
374690075Sobrien     used to gain greater control in that case.)  */
374790075Sobrien  const bool decl_required;
374890075Sobrien  /* Whether this attribute requires a type.  If it does, it will be passed
374990075Sobrien     from a DECL to the type of that DECL.  */
375090075Sobrien  const bool type_required;
375190075Sobrien  /* Whether this attribute requires a function (or method) type.  If it does,
375290075Sobrien     it will be passed from a function pointer type to the target type,
375390075Sobrien     and from a function return type (which is not itself a function
375490075Sobrien     pointer type) to the function type.  */
375590075Sobrien  const bool function_type_required;
375690075Sobrien  /* Function to handle this attribute.  NODE points to the node to which
375790075Sobrien     the attribute is to be applied.  If a DECL, it should be modified in
375890075Sobrien     place; if a TYPE, a copy should be created.  NAME is the name of the
375990075Sobrien     attribute (possibly with leading or trailing __).  ARGS is the TREE_LIST
376090075Sobrien     of the arguments (which may be NULL).  FLAGS gives further information
376190075Sobrien     about the context of the attribute.  Afterwards, the attributes will
376290075Sobrien     be added to the DECL_ATTRIBUTES or TYPE_ATTRIBUTES, as appropriate,
376390075Sobrien     unless *NO_ADD_ATTRS is set to true (which should be done on error,
376490075Sobrien     as well as in any other cases when the attributes should not be added
376590075Sobrien     to the DECL or TYPE).  Depending on FLAGS, any attributes to be
376690075Sobrien     applied to another type or DECL later may be returned;
376790075Sobrien     otherwise the return value should be NULL_TREE.  This pointer may be
376890075Sobrien     NULL if no special handling is required beyond the checks implied
376990075Sobrien     by the rest of this structure.  */
3770132718Skan  tree (*const handler) (tree *node, tree name, tree args,
3771132718Skan				 int flags, bool *no_add_attrs);
377290075Sobrien};
377350397Sobrien
377490075Sobrien/* Flags that may be passed in the third argument of decl_attributes, and
377590075Sobrien   to handler functions for attributes.  */
377690075Sobrienenum attribute_flags
377790075Sobrien{
377890075Sobrien  /* The type passed in is the type of a DECL, and any attributes that
377990075Sobrien     should be passed in again to be applied to the DECL rather than the
378090075Sobrien     type should be returned.  */
378190075Sobrien  ATTR_FLAG_DECL_NEXT = 1,
378290075Sobrien  /* The type passed in is a function return type, and any attributes that
378390075Sobrien     should be passed in again to be applied to the function type rather
378490075Sobrien     than the return type should be returned.  */
378590075Sobrien  ATTR_FLAG_FUNCTION_NEXT = 2,
378690075Sobrien  /* The type passed in is an array element type, and any attributes that
378790075Sobrien     should be passed in again to be applied to the array type rather
378890075Sobrien     than the element type should be returned.  */
378990075Sobrien  ATTR_FLAG_ARRAY_NEXT = 4,
379090075Sobrien  /* The type passed in is a structure, union or enumeration type being
379190075Sobrien     created, and should be modified in place.  */
379290075Sobrien  ATTR_FLAG_TYPE_IN_PLACE = 8,
379390075Sobrien  /* The attributes are being applied by default to a library function whose
379490075Sobrien     name indicates known behavior, and should be silently ignored if they
379590075Sobrien     are not in fact compatible with the function type.  */
379690075Sobrien  ATTR_FLAG_BUILT_IN = 16
379790075Sobrien};
379890075Sobrien
379990075Sobrien/* Default versions of target-overridable functions.  */
380090075Sobrien
3801132718Skanextern tree merge_decl_attributes (tree, tree);
3802132718Skanextern tree merge_type_attributes (tree, tree);
380390075Sobrien
3804117395Skan/* Given a tree node and a string, return nonzero if the tree node is
380518334Speter   a valid attribute name for the string.  */
380618334Speter
3807132718Skanextern int is_attribute_p (const char *, tree);
380818334Speter
380918334Speter/* Given an attribute name and a list of attributes, return the list element
381018334Speter   of the attribute or NULL_TREE if not found.  */
381118334Speter
3812132718Skanextern tree lookup_attribute (const char *, tree);
381318334Speter
3814169689Skan/* Remove any instances of attribute ATTR_NAME in LIST and return the
3815169689Skan   modified list.  */
3816169689Skan
3817169689Skanextern tree remove_attribute (const char *, tree);
3818169689Skan
381950397Sobrien/* Given two attributes lists, return a list of their union.  */
382050397Sobrien
3821132718Skanextern tree merge_attributes (tree, tree);
382250397Sobrien
3823169689Skan#if TARGET_DLLIMPORT_DECL_ATTRIBUTES
382490075Sobrien/* Given two Windows decl attributes lists, possibly including
382590075Sobrien   dllimport, return a list of their union .  */
3826132718Skanextern tree merge_dllimport_decl_attributes (tree, tree);
3827169689Skan
3828169689Skan/* Handle a "dllimport" or "dllexport" attribute.  */
3829169689Skanextern tree handle_dll_attribute (tree *, tree, tree, int, bool *);
383090075Sobrien#endif
383118334Speter
3832169689Skan/* Check whether CAND is suitable to be returned from get_qualified_type
3833169689Skan   (BASE, TYPE_QUALS).  */
3834169689Skan
3835169689Skanextern bool check_qualified_type (tree, tree, int);
3836169689Skan
383790075Sobrien/* Return a version of the TYPE, qualified as indicated by the
383890075Sobrien   TYPE_QUALS, if one exists.  If no qualified version exists yet,
383990075Sobrien   return NULL_TREE.  */
384018334Speter
3841132718Skanextern tree get_qualified_type (tree, int);
384290075Sobrien
384390075Sobrien/* Like get_qualified_type, but creates the type if it does not
384490075Sobrien   exist.  This function never returns NULL_TREE.  */
384590075Sobrien
3846132718Skanextern tree build_qualified_type (tree, int);
384790075Sobrien
384852284Sobrien/* Like build_qualified_type, but only deals with the `const' and
384952284Sobrien   `volatile' qualifiers.  This interface is retained for backwards
3850132718Skan   compatibility with the various front-ends; new code should use
385152284Sobrien   build_qualified_type instead.  */
385252284Sobrien
385352284Sobrien#define build_type_variant(TYPE, CONST_P, VOLATILE_P)			\
385490075Sobrien  build_qualified_type ((TYPE),						\
385552284Sobrien			((CONST_P) ? TYPE_QUAL_CONST : 0)		\
385652284Sobrien			| ((VOLATILE_P) ? TYPE_QUAL_VOLATILE : 0))
385752284Sobrien
385818334Speter/* Make a copy of a type node.  */
385918334Speter
3860169689Skanextern tree build_distinct_type_copy (tree);
3861169689Skanextern tree build_variant_type_copy (tree);
386218334Speter
3863132718Skan/* Finish up a builtin RECORD_TYPE. Give it a name and provide its
3864169689Skan   fields. Optionally specify an alignment, and then lay it out.  */
3865132718Skan
3866132718Skanextern void finish_builtin_struct (tree, const char *,
3867132718Skan							 tree, tree);
3868132718Skan
386918334Speter/* Given a ..._TYPE node, calculate the TYPE_SIZE, TYPE_SIZE_UNIT,
387090075Sobrien   TYPE_ALIGN and TYPE_MODE fields.  If called more than once on one
387190075Sobrien   node, does nothing except for the first time.  */
387218334Speter
3873132718Skanextern void layout_type (tree);
387418334Speter
387590075Sobrien/* These functions allow a front-end to perform a manual layout of a
387690075Sobrien   RECORD_TYPE.  (For instance, if the placement of subsequent fields
387790075Sobrien   depends on the placement of fields so far.)  Begin by calling
387890075Sobrien   start_record_layout.  Then, call place_field for each of the
387990075Sobrien   fields.  Then, call finish_record_layout.  See layout_type for the
388090075Sobrien   default way in which these functions are used.  */
388190075Sobrien
388290075Sobrientypedef struct record_layout_info_s
388390075Sobrien{
388490075Sobrien  /* The RECORD_TYPE that we are laying out.  */
388590075Sobrien  tree t;
388690075Sobrien  /* The offset into the record so far, in bytes, not including bits in
388790075Sobrien     BITPOS.  */
388890075Sobrien  tree offset;
388990075Sobrien  /* The last known alignment of SIZE.  */
389090075Sobrien  unsigned int offset_align;
389190075Sobrien  /* The bit position within the last OFFSET_ALIGN bits, in bits.  */
389290075Sobrien  tree bitpos;
389390075Sobrien  /* The alignment of the record so far, in bits.  */
389490075Sobrien  unsigned int record_align;
3895132718Skan  /* The alignment of the record so far, ignoring #pragma pack and
3896132718Skan     __attribute__ ((packed)), in bits.  */
389790075Sobrien  unsigned int unpacked_align;
389896263Sobrien  /* The previous field layed out.  */
389996263Sobrien  tree prev_field;
390090075Sobrien  /* The static variables (i.e., class variables, as opposed to
390190075Sobrien     instance variables) encountered in T.  */
390290075Sobrien  tree pending_statics;
3903117395Skan  /* Bits remaining in the current alignment group */
3904117395Skan  int remaining_in_alignment;
3905132718Skan  /* True if we've seen a packed field that didn't have normal
3906132718Skan     alignment anyway.  */
390790075Sobrien  int packed_maybe_necessary;
390890075Sobrien} *record_layout_info;
390990075Sobrien
3910132718Skanextern void set_lang_adjust_rli (void (*) (record_layout_info));
3911132718Skanextern record_layout_info start_record_layout (tree);
3912132718Skanextern tree bit_from_pos (tree, tree);
3913132718Skanextern tree byte_from_pos (tree, tree);
3914132718Skanextern void pos_from_bit (tree *, tree *, unsigned int, tree);
3915132718Skanextern void normalize_offset (tree *, tree *, unsigned int);
3916132718Skanextern tree rli_size_unit_so_far (record_layout_info);
3917132718Skanextern tree rli_size_so_far (record_layout_info);
3918132718Skanextern void normalize_rli (record_layout_info);
3919132718Skanextern void place_field (record_layout_info, tree);
3920132718Skanextern void compute_record_mode (tree);
3921132718Skanextern void finish_record_layout (record_layout_info, int);
392290075Sobrien
392318334Speter/* Given a hashcode and a ..._TYPE node (for which the hashcode was made),
392418334Speter   return a canonicalized ..._TYPE node, so that duplicates are not made.
392518334Speter   How the hash code is computed is up to the caller, as long as any two
392618334Speter   callers that could hash identical-looking type nodes agree.  */
392718334Speter
3928132718Skanextern tree type_hash_canon (unsigned int, tree);
392918334Speter
393018334Speter/* Given a VAR_DECL, PARM_DECL, RESULT_DECL or FIELD_DECL node,
393118334Speter   calculates the DECL_SIZE, DECL_SIZE_UNIT, DECL_ALIGN and DECL_MODE
393218334Speter   fields.  Call this only once for any given decl node.
393318334Speter
393418334Speter   Second argument is the boundary that this field can be assumed to
393518334Speter   be starting at (in bits).  Zero means it can be assumed aligned
393618334Speter   on any boundary that may be needed.  */
393718334Speter
3938132718Skanextern void layout_decl (tree, unsigned);
393918334Speter
3940169689Skan/* Given a VAR_DECL, PARM_DECL or RESULT_DECL, clears the results of
3941169689Skan   a previous call to layout_decl and calls it again.  */
3942169689Skan
3943169689Skanextern void relayout_decl (tree);
3944169689Skan
394590075Sobrien/* Return the mode for data of a given size SIZE and mode class CLASS.
394690075Sobrien   If LIMIT is nonzero, then don't use modes bigger than MAX_FIXED_MODE_SIZE.
394790075Sobrien   The value is BLKmode if no other mode is found.  This is like
394890075Sobrien   mode_for_size, but is passed a tree.  */
394990075Sobrien
3950132718Skanextern enum machine_mode mode_for_size_tree (tree, enum mode_class, int);
395190075Sobrien
395218334Speter/* Return an expr equal to X but certainly not valid as an lvalue.  */
395318334Speter
3954132718Skanextern tree non_lvalue (tree);
395518334Speter
3956132718Skanextern tree convert (tree, tree);
3957132718Skanextern unsigned int expr_align (tree);
3958132718Skanextern tree expr_first (tree);
3959132718Skanextern tree expr_last (tree);
3960169689Skanextern tree expr_only (tree);
3961132718Skanextern tree size_in_bytes (tree);
3962132718Skanextern HOST_WIDE_INT int_size_in_bytes (tree);
3963169689Skanextern HOST_WIDE_INT max_int_size_in_bytes (tree);
3964132718Skanextern tree bit_position (tree);
3965132718Skanextern HOST_WIDE_INT int_bit_position (tree);
3966132718Skanextern tree byte_position (tree);
3967132718Skanextern HOST_WIDE_INT int_byte_position (tree);
396850397Sobrien
396990075Sobrien/* Define data structures, macros, and functions for handling sizes
397090075Sobrien   and the various types used to represent sizes.  */
397118334Speter
397290075Sobrienenum size_type_kind
397390075Sobrien{
397490075Sobrien  SIZETYPE,		/* Normal representation of sizes in bytes.  */
397590075Sobrien  SSIZETYPE,		/* Signed representation of sizes in bytes.  */
397690075Sobrien  BITSIZETYPE,		/* Normal representation of sizes in bits.  */
397790075Sobrien  SBITSIZETYPE,		/* Signed representation of sizes in bits.  */
397890075Sobrien  TYPE_KIND_LAST};
397990075Sobrien
3980117395Skanextern GTY(()) tree sizetype_tab[(int) TYPE_KIND_LAST];
398190075Sobrien
398290075Sobrien#define sizetype sizetype_tab[(int) SIZETYPE]
398390075Sobrien#define bitsizetype sizetype_tab[(int) BITSIZETYPE]
398490075Sobrien#define ssizetype sizetype_tab[(int) SSIZETYPE]
398590075Sobrien#define sbitsizetype sizetype_tab[(int) SBITSIZETYPE]
398690075Sobrien
3987169689Skanextern tree size_int_kind (HOST_WIDE_INT, enum size_type_kind);
3988132718Skanextern tree size_binop (enum tree_code, tree, tree);
3989132718Skanextern tree size_diffop (tree, tree);
399090075Sobrien
3991169689Skan#define size_int(L) size_int_kind (L, SIZETYPE)
3992169689Skan#define ssize_int(L) size_int_kind (L, SSIZETYPE)
3993169689Skan#define bitsize_int(L) size_int_kind (L, BITSIZETYPE)
3994169689Skan#define sbitsize_int(L) size_int_kind (L, SBITSIZETYPE)
399590075Sobrien
3996132718Skanextern tree round_up (tree, int);
3997132718Skanextern tree round_down (tree, int);
3998132718Skanextern tree get_pending_sizes (void);
3999132718Skanextern void put_pending_size (tree);
4000132718Skanextern void put_pending_sizes (tree);
400190075Sobrien
400218334Speter/* Type for sizes of data-type.  */
400318334Speter
400450397Sobrien#define BITS_PER_UNIT_LOG \
400550397Sobrien  ((BITS_PER_UNIT > 1) + (BITS_PER_UNIT > 2) + (BITS_PER_UNIT > 4) \
400650397Sobrien   + (BITS_PER_UNIT > 8) + (BITS_PER_UNIT > 16) + (BITS_PER_UNIT > 32) \
400750397Sobrien   + (BITS_PER_UNIT > 64) + (BITS_PER_UNIT > 128) + (BITS_PER_UNIT > 256))
400818334Speter
4009169689Skan/* If nonzero, an upper limit on alignment of structure fields, in bits,  */
401090075Sobrienextern unsigned int maximum_field_alignment;
4011169689Skan/* and its original value in bytes, specified via -fpack-struct=<value>.  */
4012169689Skanextern unsigned int initial_max_fld_align;
401350397Sobrien
401418334Speter/* Concatenate two lists (chains of TREE_LIST nodes) X and Y
401518334Speter   by making the last node in X point to Y.
401618334Speter   Returns X, except if X is 0 returns Y.  */
401718334Speter
4018132718Skanextern tree chainon (tree, tree);
401918334Speter
402018334Speter/* Make a new TREE_LIST node from specified PURPOSE, VALUE and CHAIN.  */
402118334Speter
4022169689Skanextern tree tree_cons_stat (tree, tree, tree MEM_STAT_DECL);
4023169689Skan#define tree_cons(t,q,w) tree_cons_stat (t,q,w MEM_STAT_INFO)
402418334Speter
402518334Speter/* Return the last tree node in a chain.  */
402618334Speter
4027132718Skanextern tree tree_last (tree);
402818334Speter
402918334Speter/* Reverse the order of elements in a chain, and return the new head.  */
403018334Speter
4031132718Skanextern tree nreverse (tree);
403218334Speter
403318334Speter/* Returns the length of a chain of nodes
403418334Speter   (number of chain pointers to follow before reaching a null pointer).  */
403518334Speter
4036132718Skanextern int list_length (tree);
403718334Speter
403890075Sobrien/* Returns the number of FIELD_DECLs in a type.  */
403990075Sobrien
4040132718Skanextern int fields_length (tree);
404190075Sobrien
4042117395Skan/* Given an initializer INIT, return TRUE if INIT is zero or some
4043117395Skan   aggregate of zeros.  Otherwise return FALSE.  */
4044117395Skan
4045132718Skanextern bool initializer_zerop (tree);
4046117395Skan
4047169689Skan/* Examine CTOR to discover:
4048169689Skan   * how many scalar fields are set to nonzero values,
4049169689Skan     and place it in *P_NZ_ELTS;
4050169689Skan   * how many scalar fields in total are in CTOR,
4051169689Skan     and place it in *P_ELT_COUNT.
4052169689Skan   * if a type is a union, and the initializer from the constructor
4053169689Skan     is not the largest element in the union, then set *p_must_clear.
4054132718Skan
4055169689Skan   Return whether or not CTOR is a valid static constant initializer, the same
4056169689Skan   as "initializer_constant_valid_p (CTOR, TREE_TYPE (CTOR)) != 0".  */
4057132718Skan
4058169689Skanextern bool categorize_ctor_elements (tree, HOST_WIDE_INT *, HOST_WIDE_INT *,
4059169689Skan				      bool *);
406018334Speter
4061169689Skanextern HOST_WIDE_INT count_type_elements (tree, bool);
4062169689Skan
4063169689Skan/* integer_zerop (tree x) is nonzero if X is an integer constant of value 0.  */
4064169689Skan
4065132718Skanextern int integer_zerop (tree);
406618334Speter
4067169689Skan/* integer_onep (tree x) is nonzero if X is an integer constant of value 1.  */
406818334Speter
4069132718Skanextern int integer_onep (tree);
407018334Speter
407118334Speter/* integer_all_onesp (tree x) is nonzero if X is an integer constant
407218334Speter   all of whose significant bits are 1.  */
407318334Speter
4074132718Skanextern int integer_all_onesp (tree);
407518334Speter
407618334Speter/* integer_pow2p (tree x) is nonzero is X is an integer constant with
407718334Speter   exactly one bit 1.  */
407818334Speter
4079132718Skanextern int integer_pow2p (tree);
408018334Speter
4081132718Skan/* integer_nonzerop (tree x) is nonzero if X is an integer constant
4082132718Skan   with a nonzero value.  */
4083132718Skan
4084132718Skanextern int integer_nonzerop (tree);
4085132718Skan
4086169689Skanextern bool zero_p (tree);
4087169689Skanextern bool cst_and_fits_in_hwi (tree);
4088169689Skanextern tree num_ending_zeros (tree);
4089169689Skan
409018334Speter/* staticp (tree x) is nonzero if X is a reference to data allocated
4091169689Skan   at a fixed address in memory.  Returns the outermost data.  */
409218334Speter
4093169689Skanextern tree staticp (tree);
409418334Speter
409518334Speter/* save_expr (EXP) returns an expression equivalent to EXP
409618334Speter   but it can be used multiple times within context CTX
409718334Speter   and only evaluate EXP once.  */
409818334Speter
4099132718Skanextern tree save_expr (tree);
410018334Speter
4101132718Skan/* Look inside EXPR and into any simple arithmetic operations.  Return
4102132718Skan   the innermost non-arithmetic node.  */
4103132718Skan
4104132718Skanextern tree skip_simple_arithmetic (tree);
4105132718Skan
4106117395Skan/* Return which tree structure is used by T.  */
4107117395Skan
4108132718Skanenum tree_node_structure_enum tree_node_structure (tree);
4109117395Skan
411018334Speter/* Return 1 if EXP contains a PLACEHOLDER_EXPR; i.e., if it represents a size
411118334Speter   or offset that depends on a field within a record.
411218334Speter
411318334Speter   Note that we only allow such expressions within simple arithmetic
411418334Speter   or a COND_EXPR.  */
411518334Speter
4116132718Skanextern bool contains_placeholder_p (tree);
411718334Speter
4118132718Skan/* This macro calls the above function but short-circuits the common
4119132718Skan   case of a constant to save time.  Also check for null.  */
4120132718Skan
4121132718Skan#define CONTAINS_PLACEHOLDER_P(EXP) \
4122132718Skan  ((EXP) != 0 && ! TREE_CONSTANT (EXP) && contains_placeholder_p (EXP))
4123132718Skan
4124132718Skan/* Return 1 if any part of the computation of TYPE involves a PLACEHOLDER_EXPR.
4125132718Skan   This includes size, bounds, qualifiers (for QUAL_UNION_TYPE) and field
4126132718Skan   positions.  */
4127132718Skan
4128132718Skanextern bool type_contains_placeholder_p (tree);
4129132718Skan
413018334Speter/* Given a tree EXP, a FIELD_DECL F, and a replacement value R,
413118334Speter   return a tree with all occurrences of references to F in a
413218334Speter   PLACEHOLDER_EXPR replaced by R.   Note that we assume here that EXP
413318334Speter   contains only arithmetic expressions.  */
413418334Speter
4135132718Skanextern tree substitute_in_expr (tree, tree, tree);
413618334Speter
4137169689Skan/* This macro calls the above function but short-circuits the common
4138169689Skan   case of a constant to save time and also checks for NULL.  */
4139169689Skan
4140169689Skan#define SUBSTITUTE_IN_EXPR(EXP, F, R) \
4141169689Skan  ((EXP) == 0 || TREE_CONSTANT (EXP) ? (EXP) : substitute_in_expr (EXP, F, R))
4142169689Skan
4143169689Skan/* Similar, but look for a PLACEHOLDER_EXPR in EXP and find a replacement
4144169689Skan   for it within OBJ, a tree that is an object or a chain of references.  */
4145169689Skan
4146169689Skanextern tree substitute_placeholder_in_expr (tree, tree);
4147169689Skan
4148169689Skan/* This macro calls the above function but short-circuits the common
4149169689Skan   case of a constant to save time and also checks for NULL.  */
4150169689Skan
4151169689Skan#define SUBSTITUTE_PLACEHOLDER_IN_EXPR(EXP, OBJ) \
4152169689Skan  ((EXP) == 0 || TREE_CONSTANT (EXP) ? (EXP)	\
4153169689Skan   : substitute_placeholder_in_expr (EXP, OBJ))
4154169689Skan
415518334Speter/* variable_size (EXP) is like save_expr (EXP) except that it
415618334Speter   is for the special case of something that is part of a
415718334Speter   variable size for a data type.  It makes special arrangements
415818334Speter   to compute the value at the right time when the data type
415918334Speter   belongs to a function parameter.  */
416018334Speter
4161132718Skanextern tree variable_size (tree);
416218334Speter
4163132718Skan/* stabilize_reference (EXP) returns a reference equivalent to EXP
416418334Speter   but it can be used multiple times
416518334Speter   and only evaluate the subexpressions once.  */
416618334Speter
4167132718Skanextern tree stabilize_reference (tree);
416818334Speter
416918334Speter/* Subroutine of stabilize_reference; this is called for subtrees of
417018334Speter   references.  Any expression with side-effects must be put in a SAVE_EXPR
417118334Speter   to ensure that it is only evaluated once.  */
417218334Speter
4173132718Skanextern tree stabilize_reference_1 (tree);
417418334Speter
417518334Speter/* Return EXP, stripped of any conversions to wider types
417618334Speter   in such a way that the result of converting to type FOR_TYPE
417718334Speter   is the same as if EXP were converted to FOR_TYPE.
417818334Speter   If FOR_TYPE is 0, it signifies EXP's type.  */
417918334Speter
4180132718Skanextern tree get_unwidened (tree, tree);
418118334Speter
418218334Speter/* Return OP or a simpler expression for a narrower value
418318334Speter   which can be sign-extended or zero-extended to give back OP.
418418334Speter   Store in *UNSIGNEDP_PTR either 1 if the value should be zero-extended
418518334Speter   or 0 if the value should be sign-extended.  */
418618334Speter
4187132718Skanextern tree get_narrower (tree, int *);
418818334Speter
418918334Speter/* Given an expression EXP that may be a COMPONENT_REF or an ARRAY_REF,
419018334Speter   look for nested component-refs or array-refs at constant positions
419118334Speter   and find the ultimate containing object, which is returned.  */
419218334Speter
4193132718Skanextern tree get_inner_reference (tree, HOST_WIDE_INT *, HOST_WIDE_INT *,
4194169689Skan				 tree *, enum machine_mode *, int *, int *,
4195169689Skan				 bool);
419618334Speter
4197220150Smm/* Given an expression EXP that may be a COMPONENT_REF or an ARRAY_REF,
4198220150Smm   look for whether EXP or any nested component-refs within EXP is marked
4199220150Smm   as PACKED.  */
4200220150Smm
4201220150Smmextern bool contains_packed_reference (tree exp);
4202220150Smm
420390075Sobrien/* Return 1 if T is an expression that get_inner_reference handles.  */
420490075Sobrien
4205132718Skanextern int handled_component_p (tree);
420690075Sobrien
4207169689Skan/* Return a tree of sizetype representing the size, in bytes, of the element
4208169689Skan   of EXP, an ARRAY_REF.  */
4209169689Skan
4210169689Skanextern tree array_ref_element_size (tree);
4211169689Skan
4212169689Skan/* Return a tree representing the lower bound of the array mentioned in
4213169689Skan   EXP, an ARRAY_REF.  */
4214169689Skan
4215169689Skanextern tree array_ref_low_bound (tree);
4216169689Skan
4217169689Skan/* Return a tree representing the upper bound of the array mentioned in
4218169689Skan   EXP, an ARRAY_REF.  */
4219169689Skan
4220169689Skanextern tree array_ref_up_bound (tree);
4221169689Skan
4222169689Skan/* Return a tree representing the offset, in bytes, of the field referenced
4223169689Skan   by EXP.  This does not include any offset in DECL_FIELD_BIT_OFFSET.  */
4224169689Skan
4225169689Skanextern tree component_ref_field_offset (tree);
4226169689Skan
422790075Sobrien/* Given a DECL or TYPE, return the scope in which it was declared, or
422890075Sobrien   NUL_TREE if there is no containing scope.  */
422990075Sobrien
4230132718Skanextern tree get_containing_scope (tree);
423190075Sobrien
423218334Speter/* Return the FUNCTION_DECL which provides this _DECL with its context,
423318334Speter   or zero if none.  */
4234132718Skanextern tree decl_function_context (tree);
423518334Speter
423618334Speter/* Return the RECORD_TYPE, UNION_TYPE, or QUAL_UNION_TYPE which provides
423718334Speter   this _DECL with its context, or zero if none.  */
4238132718Skanextern tree decl_type_context (tree);
423918334Speter
424018334Speter/* Return 1 if EXPR is the real constant zero.  */
4241132718Skanextern int real_zerop (tree);
424218334Speter
424318334Speter/* Declare commonly used variables for tree structure.  */
424418334Speter
424518334Speter/* Nonzero means lvalues are limited to those valid in pedantic ANSI C.
424618334Speter   Zero means allow extended lvalues.  */
424718334Speter
424818334Speterextern int pedantic_lvalues;
424918334Speter
425090075Sobrien/* Points to the FUNCTION_DECL of the function whose body we are reading.  */
425118334Speter
4252117395Skanextern GTY(()) tree current_function_decl;
425318334Speter
425490075Sobrien/* Nonzero means a FUNC_BEGIN label was emitted.  */
4255169689Skanextern GTY(()) const char * current_function_func_begin_label;
425618334Speter
425718334Speter/* In tree.c */
4258132718Skanextern unsigned crc32_string (unsigned, const char *);
4259132718Skanextern void clean_symbol_name (char *);
4260259563Spfgextern tree get_file_function_name (const char *);
4261132718Skanextern tree get_callee_fndecl (tree);
4262132718Skanextern void change_decl_assembler_name (tree, tree);
4263132718Skanextern int type_num_arguments (tree);
4264169689Skanextern bool associative_tree_code (enum tree_code);
4265169689Skanextern bool commutative_tree_code (enum tree_code);
4266169689Skanextern tree upper_bound_in_type (tree, tree);
4267169689Skanextern tree lower_bound_in_type (tree, tree);
4268169689Skanextern int operand_equal_for_phi_arg_p (tree, tree);
4269169689Skanextern bool empty_body_p (tree);
427018334Speter
427118334Speter/* In stmt.c */
427218334Speter
4273132718Skanextern void expand_expr_stmt (tree);
4274169689Skanextern int warn_if_unused_value (tree, location_t);
4275132718Skanextern void expand_label (tree);
4276132718Skanextern void expand_goto (tree);
427718334Speter
4278169689Skanextern rtx expand_stack_save (void);
4279169689Skanextern void expand_stack_restore (tree);
4280132718Skanextern void expand_return (tree);
4281132718Skanextern int is_body_block (tree);
428290075Sobrien
4283169689Skan/* In tree-eh.c */
4284132718Skanextern void using_eh_for_cleanups (void);
428518334Speter
428618334Speter/* In fold-const.c */
428718334Speter
4288169689Skan/* Non-zero if we are folding constants inside an initializer; zero
4289169689Skan   otherwise.  */
4290169689Skanextern int folding_initializer;
4291169689Skan
429218334Speter/* Fold constants as much as possible in an expression.
429318334Speter   Returns the simplified expression.
429418334Speter   Acts only on the top level of the expression;
429518334Speter   if the argument itself cannot be simplified, its
429618334Speter   subexpressions are not changed.  */
429718334Speter
4298132718Skanextern tree fold (tree);
4299169689Skanextern tree fold_unary (enum tree_code, tree, tree);
4300169689Skanextern tree fold_binary (enum tree_code, tree, tree, tree);
4301169689Skanextern tree fold_ternary (enum tree_code, tree, tree, tree, tree);
4302169689Skanextern tree fold_build1_stat (enum tree_code, tree, tree MEM_STAT_DECL);
4303169689Skan#define fold_build1(c,t1,t2) fold_build1_stat (c, t1, t2 MEM_STAT_INFO)
4304169689Skanextern tree fold_build2_stat (enum tree_code, tree, tree, tree MEM_STAT_DECL);
4305169689Skan#define fold_build2(c,t1,t2,t3) fold_build2_stat (c, t1, t2, t3 MEM_STAT_INFO)
4306169689Skanextern tree fold_build3_stat (enum tree_code, tree, tree, tree, tree MEM_STAT_DECL);
4307169689Skan#define fold_build3(c,t1,t2,t3,t4) fold_build3_stat (c, t1, t2, t3, t4 MEM_STAT_INFO)
4308169689Skanextern tree fold_build1_initializer (enum tree_code, tree, tree);
4309169689Skanextern tree fold_build2_initializer (enum tree_code, tree, tree, tree);
4310169689Skanextern tree fold_build3_initializer (enum tree_code, tree, tree, tree, tree);
4311169689Skanextern tree fold_convert (tree, tree);
4312132718Skanextern tree fold_single_bit_test (enum tree_code, tree, tree, tree);
4313169689Skanextern tree fold_ignored_result (tree);
4314169689Skanextern tree fold_abs_const (tree, tree);
4315169689Skanextern tree fold_indirect_ref_1 (tree, tree);
4316169689Skanextern void fold_defer_overflow_warnings (void);
4317169689Skanextern void fold_undefer_overflow_warnings (bool, tree, int);
4318169689Skanextern void fold_undefer_and_ignore_overflow_warnings (void);
4319169689Skanextern bool fold_deferring_overflow_warnings_p (void);
432018334Speter
4321169689Skanextern tree force_fit_type (tree, int, bool, bool);
4322169689Skan
4323169689Skanextern int add_double_with_sign (unsigned HOST_WIDE_INT, HOST_WIDE_INT,
4324169689Skan				 unsigned HOST_WIDE_INT, HOST_WIDE_INT,
4325169689Skan				 unsigned HOST_WIDE_INT *, HOST_WIDE_INT *,
4326169689Skan				 bool);
4327169689Skan#define add_double(l1,h1,l2,h2,lv,hv) \
4328169689Skan  add_double_with_sign (l1, h1, l2, h2, lv, hv, false)
4329132718Skanextern int neg_double (unsigned HOST_WIDE_INT, HOST_WIDE_INT,
4330132718Skan		       unsigned HOST_WIDE_INT *, HOST_WIDE_INT *);
4331169689Skanextern int mul_double_with_sign (unsigned HOST_WIDE_INT, HOST_WIDE_INT,
4332169689Skan				 unsigned HOST_WIDE_INT, HOST_WIDE_INT,
4333169689Skan				 unsigned HOST_WIDE_INT *, HOST_WIDE_INT *,
4334169689Skan				 bool);
4335169689Skan#define mul_double(l1,h1,l2,h2,lv,hv) \
4336169689Skan  mul_double_with_sign (l1, h1, l2, h2, lv, hv, false)
4337132718Skanextern void lshift_double (unsigned HOST_WIDE_INT, HOST_WIDE_INT,
4338132718Skan			   HOST_WIDE_INT, unsigned int,
4339132718Skan			   unsigned HOST_WIDE_INT *, HOST_WIDE_INT *, int);
4340132718Skanextern void rshift_double (unsigned HOST_WIDE_INT, HOST_WIDE_INT,
4341132718Skan			   HOST_WIDE_INT, unsigned int,
4342132718Skan			   unsigned HOST_WIDE_INT *, HOST_WIDE_INT *, int);
4343132718Skanextern void lrotate_double (unsigned HOST_WIDE_INT, HOST_WIDE_INT,
4344132718Skan			    HOST_WIDE_INT, unsigned int,
4345132718Skan			    unsigned HOST_WIDE_INT *, HOST_WIDE_INT *);
4346132718Skanextern void rrotate_double (unsigned HOST_WIDE_INT, HOST_WIDE_INT,
4347132718Skan			    HOST_WIDE_INT, unsigned int,
4348132718Skan			    unsigned HOST_WIDE_INT *, HOST_WIDE_INT *);
434950397Sobrien
4350132718Skanextern int div_and_round_double (enum tree_code, int, unsigned HOST_WIDE_INT,
4351132718Skan				 HOST_WIDE_INT, unsigned HOST_WIDE_INT,
4352132718Skan				 HOST_WIDE_INT, unsigned HOST_WIDE_INT *,
4353132718Skan				 HOST_WIDE_INT *, unsigned HOST_WIDE_INT *,
4354132718Skan				 HOST_WIDE_INT *);
435518334Speter
4356169689Skanenum operand_equal_flag
4357169689Skan{
4358169689Skan  OEP_ONLY_CONST = 1,
4359169689Skan  OEP_PURE_SAME = 2
4360169689Skan};
4361169689Skan
4362169689Skanextern int operand_equal_p (tree, tree, unsigned int);
4363169689Skan
4364132718Skanextern tree omit_one_operand (tree, tree, tree);
4365169689Skanextern tree omit_two_operands (tree, tree, tree, tree);
4366132718Skanextern tree invert_truthvalue (tree);
4367169689Skanextern tree fold_truth_not_expr (tree);
4368169689Skanextern tree fold_unary_to_constant (enum tree_code, tree, tree);
4369169689Skanextern tree fold_binary_to_constant (enum tree_code, tree, tree, tree);
4370169689Skanextern tree fold_read_from_constant_string (tree);
4371169689Skanextern tree int_const_binop (enum tree_code, tree, tree, int);
4372169689Skanextern tree build_fold_addr_expr (tree);
4373169689Skanextern tree fold_build_cleanup_point_expr (tree type, tree expr);
4374169689Skanextern tree fold_strip_sign_ops (tree);
4375169689Skanextern tree build_fold_addr_expr_with_type (tree, tree);
4376169689Skanextern tree build_fold_indirect_ref (tree);
4377169689Skanextern tree fold_indirect_ref (tree);
4378169689Skanextern tree constant_boolean_node (int, tree);
4379169689Skanextern tree build_low_bits_mask (tree, unsigned);
4380132718Skan
4381169689Skanextern bool tree_swap_operands_p (tree, tree, bool);
4382169689Skanextern void swap_tree_operands (tree, tree *, tree *);
4383169689Skanextern enum tree_code swap_tree_comparison (enum tree_code);
4384169689Skan
4385169689Skanextern bool ptr_difference_const (tree, tree, HOST_WIDE_INT *);
4386169689Skanextern enum tree_code invert_tree_comparison (enum tree_code, bool);
4387169689Skan
4388169689Skanextern bool tree_expr_nonzero_p (tree);
4389169689Skanextern bool tree_expr_nonzero_warnv_p (tree, bool *);
4390169689Skan
4391132718Skan/* In builtins.c */
4392169689Skanextern tree fold_builtin (tree, tree, bool);
4393169689Skanextern tree fold_builtin_fputs (tree, bool, bool, tree);
4394169689Skanextern tree fold_builtin_strcpy (tree, tree, tree);
4395169689Skanextern tree fold_builtin_strncpy (tree, tree, tree);
4396169689Skanextern tree fold_builtin_memory_chk (tree, tree, tree, bool,
4397169689Skan				     enum built_in_function);
4398169689Skanextern tree fold_builtin_stxcpy_chk (tree, tree, tree, bool,
4399169689Skan				     enum built_in_function);
4400169689Skanextern tree fold_builtin_strncpy_chk (tree, tree);
4401169689Skanextern tree fold_builtin_snprintf_chk (tree, tree, enum built_in_function);
4402169689Skanextern bool fold_builtin_next_arg (tree);
4403132718Skanextern enum built_in_function builtin_mathfn_code (tree);
4404132718Skanextern tree build_function_call_expr (tree, tree);
4405132718Skanextern tree mathfn_built_in (tree, enum built_in_function fn);
4406169689Skanextern tree strip_float_extensions (tree);
4407169689Skanextern tree c_strlen (tree, int);
4408169689Skanextern tree std_gimplify_va_arg_expr (tree, tree, tree *, tree *);
4409169689Skanextern tree build_va_arg_indirect_ref (tree);
4410169689Skantree build_string_literal (int, const char *);
4411132718Skan
4412132718Skan/* In convert.c */
4413132718Skanextern tree strip_float_extensions (tree);
4414132718Skan
441590075Sobrien/* In alias.c */
4416132718Skanextern void record_component_aliases (tree);
4417132718Skanextern HOST_WIDE_INT get_alias_set (tree);
4418132718Skanextern int alias_sets_conflict_p (HOST_WIDE_INT, HOST_WIDE_INT);
4419169689Skanextern int alias_sets_might_conflict_p (HOST_WIDE_INT, HOST_WIDE_INT);
4420132718Skanextern int objects_must_conflict_p (tree, tree);
442118334Speter
442250397Sobrien/* In tree.c */
4423132718Skanextern int really_constant_p (tree);
4424132718Skanextern int int_fits_type_p (tree, tree);
4425169689Skanextern bool variably_modified_type_p (tree, tree);
4426132718Skanextern int tree_log2 (tree);
4427132718Skanextern int tree_floor_log2 (tree);
4428132718Skanextern int simple_cst_equal (tree, tree);
4429169689Skanextern hashval_t iterative_hash_expr (tree, hashval_t);
4430132718Skanextern int compare_tree_int (tree, unsigned HOST_WIDE_INT);
4431132718Skanextern int type_list_equal (tree, tree);
4432132718Skanextern int chain_member (tree, tree);
4433132718Skanextern tree type_hash_lookup (unsigned int, tree);
4434132718Skanextern void type_hash_add (unsigned int, tree);
4435132718Skanextern int simple_cst_list_equal (tree, tree);
4436132718Skanextern void dump_tree_statistics (void);
4437132718Skanextern void expand_function_end (void);
4438169689Skanextern void expand_function_start (tree);
4439169689Skanextern void stack_protect_prologue (void);
4440169689Skanextern void stack_protect_epilogue (void);
4441169689Skanextern void recompute_tree_invariant_for_addr_expr (tree);
4442169689Skanextern bool is_global_var (tree t);
4443169689Skanextern bool needs_to_live_in_memory (tree);
4444146895Skanextern tree reconstruct_complex_type (tree, tree);
444550397Sobrien
4446132718Skanextern int real_onep (tree);
4447132718Skanextern int real_twop (tree);
4448132718Skanextern int real_minus_onep (tree);
4449132718Skanextern void init_ttree (void);
4450169689Skanextern void build_common_tree_nodes (bool, bool);
4451132718Skanextern void build_common_tree_nodes_2 (int);
4452169689Skanextern void build_common_builtin_nodes (void);
4453169689Skanextern tree build_nonstandard_integer_type (unsigned HOST_WIDE_INT, int);
4454132718Skanextern tree build_range_type (tree, tree, tree);
4455169689Skanextern HOST_WIDE_INT int_cst_value (tree);
4456169689Skanextern tree tree_fold_gcd (tree, tree);
4457169689Skanextern tree build_addr (tree, tree);
445890075Sobrien
4459169689Skanextern bool fields_compatible_p (tree, tree);
4460169689Skanextern tree find_compatible_field (tree, tree);
4461169689Skan
446250397Sobrien/* In function.c */
4463132718Skanextern void expand_main_function (void);
4464132718Skanextern void init_dummy_function_start (void);
4465132718Skanextern void expand_dummy_function_end (void);
4466169689Skanextern unsigned int init_function_for_compilation (void);
4467132718Skanextern void allocate_struct_function (tree);
4468132718Skanextern void init_function_start (tree);
4469169689Skanextern bool use_register_for_decl (tree);
4470169689Skanextern void setjmp_vars_warning (tree);
4471132718Skanextern void setjmp_args_warning (void);
4472132718Skanextern void init_temp_slots (void);
4473132718Skanextern void free_temp_slots (void);
4474132718Skanextern void pop_temp_slots (void);
4475132718Skanextern void push_temp_slots (void);
4476132718Skanextern void preserve_temp_slots (rtx);
4477132718Skanextern int aggregate_value_p (tree, tree);
4478132718Skanextern void push_function_context (void);
4479132718Skanextern void pop_function_context (void);
4480132718Skanextern void push_function_context_to (tree);
4481132718Skanextern void pop_function_context_from (tree);
4482169689Skanextern tree gimplify_parameters (void);
448350397Sobrien
448450397Sobrien/* In print-rtl.c */
448550397Sobrien#ifdef BUFSIZ
4486132718Skanextern void print_rtl (FILE *, rtx);
448750397Sobrien#endif
448850397Sobrien
448950397Sobrien/* In print-tree.c */
4490132718Skanextern void debug_tree (tree);
449150397Sobrien#ifdef BUFSIZ
4492169689Skanextern void dump_addr (FILE*, const char *, void *);
4493132718Skanextern void print_node (FILE *, const char *, tree, int);
4494132718Skanextern void print_node_brief (FILE *, const char *, tree, int);
4495132718Skanextern void indent_to (FILE *, int);
449650397Sobrien#endif
449750397Sobrien
4498169689Skan/* In tree-inline.c:  */
4499169689Skanextern bool debug_find_tree (tree, tree);
4500169689Skan/* This is in tree-inline.c since the routine uses
4501169689Skan   data structures from the inliner.  */
4502169689Skanextern tree unsave_expr_now (tree);
4503169689Skanextern tree build_duplicate_type (tree);
450450397Sobrien
450550397Sobrien/* In emit-rtl.c */
4506132718Skanextern rtx emit_line_note (location_t);
450750397Sobrien
450890075Sobrien/* In calls.c */
450950397Sobrien
4510169689Skan/* Nonzero if this is a call to a function whose return value depends
4511169689Skan   solely on its arguments, has no side effects, and does not read
4512169689Skan   global memory.  */
4513132718Skan#define ECF_CONST		1
4514169689Skan/* Nonzero if this call will never return.  */
4515132718Skan#define ECF_NORETURN		2
4516132718Skan/* Nonzero if this is a call to malloc or a related function.  */
4517132718Skan#define ECF_MALLOC		4
4518132718Skan/* Nonzero if it is plausible that this is a call to alloca.  */
4519132718Skan#define ECF_MAY_BE_ALLOCA	8
4520132718Skan/* Nonzero if this is a call to a function that won't throw an exception.  */
4521132718Skan#define ECF_NOTHROW		16
4522132718Skan/* Nonzero if this is a call to setjmp or a related function.  */
4523132718Skan#define ECF_RETURNS_TWICE	32
4524169689Skan/* Nonzero if this call replaces the current stack frame.  */
4525169689Skan#define ECF_SIBCALL		64
4526132718Skan/* Nonzero if this is a call to "pure" function (like const function,
4527132718Skan   but may read memory.  */
4528169689Skan#define ECF_PURE		128
4529132718Skan/* Nonzero if this is a call to a function that returns with the stack
4530132718Skan   pointer depressed.  */
4531169689Skan#define ECF_SP_DEPRESSED	256
4532132718Skan/* Create libcall block around the call.  */
4533169689Skan#define ECF_LIBCALL_BLOCK	512
4534169689Skan/* Function does not read or write memory (but may have side effects, so
4535169689Skan   it does not necessarily fit ECF_CONST).  */
4536169689Skan#define ECF_NOVOPS		1024
453750397Sobrien
4538132718Skanextern int flags_from_decl_or_type (tree);
4539132718Skanextern int call_expr_flags (tree);
4540132718Skan
4541132718Skanextern int setjmp_call_p (tree);
4542132718Skanextern bool alloca_call_p (tree);
4543169689Skanextern bool must_pass_in_stack_var_size (enum machine_mode, tree);
4544169689Skanextern bool must_pass_in_stack_var_size_or_pad (enum machine_mode, tree);
4545132718Skan
454690075Sobrien/* In attribs.c.  */
454750397Sobrien
454890075Sobrien/* Process the attributes listed in ATTRIBUTES and install them in *NODE,
454990075Sobrien   which is either a DECL (including a TYPE_DECL) or a TYPE.  If a DECL,
455090075Sobrien   it should be modified in place; if a TYPE, a copy should be created
455190075Sobrien   unless ATTR_FLAG_TYPE_IN_PLACE is set in FLAGS.  FLAGS gives further
455290075Sobrien   information, in the form of a bitwise OR of flags in enum attribute_flags
455390075Sobrien   from tree.h.  Depending on these flags, some attributes may be
455490075Sobrien   returned to be applied at a later stage (for example, to apply
455590075Sobrien   a decl attribute to the declaration rather than to its type).  */
4556132718Skanextern tree decl_attributes (tree *, tree, int);
455750397Sobrien
455850397Sobrien/* In integrate.c */
4559132718Skanextern void set_decl_abstract_flags (tree, int);
4560132718Skanextern void set_decl_origin_self (tree);
456150397Sobrien
456250397Sobrien/* In stor-layout.c */
4563132718Skanextern void set_min_and_max_values_for_integral_type (tree, int, bool);
4564132718Skanextern void fixup_signed_type (tree);
4565132718Skanextern void internal_reference_types (void);
4566169689Skanextern unsigned int update_alignment_for_field (record_layout_info, tree,
4567169689Skan                                                unsigned int);
456850397Sobrien/* varasm.c */
4569169689Skanextern void make_decl_rtl (tree);
4570132718Skanextern void make_decl_one_only (tree);
4571132718Skanextern int supports_one_only (void);
4572132718Skanextern void resolve_unique_section (tree, int, int);
4573132718Skanextern void mark_referenced (tree);
4574169689Skanextern void mark_decl_referenced (tree);
4575132718Skanextern void notice_global_symbol (tree);
4576169689Skanextern void set_user_assembler_name (tree, const char *);
4577169689Skanextern void process_pending_assemble_externals (void);
4578169689Skanextern void finish_aliases_1 (void);
4579169689Skanextern void finish_aliases_2 (void);
458050397Sobrien
458150397Sobrien/* In stmt.c */
4582132718Skanextern void expand_computed_goto (tree);
4583132718Skanextern bool parse_output_constraint (const char **, int, int, int,
4584132718Skan				     bool *, bool *, bool *);
4585132718Skanextern bool parse_input_constraint (const char **, int, int, int, int,
4586132718Skan				    const char * const *, bool *, bool *);
4587169689Skanextern void expand_asm_expr (tree);
4588132718Skanextern tree resolve_asm_operand_names (tree, tree, tree);
4589169689Skanextern void expand_case (tree);
4590132718Skanextern void expand_decl (tree);
4591132718Skanextern void expand_anon_union_decl (tree, tree, tree);
4592169689Skan#ifdef HARD_CONST
4593169689Skan/* Silly ifdef to avoid having all includers depend on hard-reg-set.h.  */
4594169689Skanextern tree tree_overlaps_hard_reg_set (tree, HARD_REG_SET *);
4595169689Skan#endif
459650397Sobrien
4597169689Skan/* In gimplify.c.  */
4598169689Skanextern tree create_artificial_label (void);
4599169689Skanextern void gimplify_function_tree (tree);
4600169689Skanextern const char *get_name (tree);
4601169689Skanextern tree unshare_expr (tree);
4602169689Skanextern void sort_case_labels (tree);
460350397Sobrien
460450397Sobrien/* Interface of the DWARF2 unwind info support.  */
460550397Sobrien
460650397Sobrien/* Generate a new label for the CFI info to refer to.  */
460750397Sobrien
4608132718Skanextern char *dwarf2out_cfi_label (void);
460950397Sobrien
461050397Sobrien/* Entry point to update the canonical frame address (CFA).  */
461150397Sobrien
4612132718Skanextern void dwarf2out_def_cfa (const char *, unsigned, HOST_WIDE_INT);
461350397Sobrien
461450397Sobrien/* Add the CFI for saving a register window.  */
461550397Sobrien
4616132718Skanextern void dwarf2out_window_save (const char *);
461750397Sobrien
461850397Sobrien/* Add a CFI to update the running total of the size of arguments pushed
461950397Sobrien   onto the stack.  */
462050397Sobrien
4621132718Skanextern void dwarf2out_args_size (const char *, HOST_WIDE_INT);
462250397Sobrien
462350397Sobrien/* Entry point for saving a register to the stack.  */
462450397Sobrien
4625132718Skanextern void dwarf2out_reg_save (const char *, unsigned, HOST_WIDE_INT);
462650397Sobrien
462750397Sobrien/* Entry point for saving the return address in the stack.  */
462850397Sobrien
4629132718Skanextern void dwarf2out_return_save (const char *, HOST_WIDE_INT);
463050397Sobrien
463150397Sobrien/* Entry point for saving the return address in a register.  */
463250397Sobrien
4633132718Skanextern void dwarf2out_return_reg (const char *, unsigned);
463450397Sobrien
4635169689Skan/* Entry point for saving the first register into the second.  */
463650397Sobrien
4637169689Skanextern void dwarf2out_reg_save_reg (const char *, rtx, rtx);
463850397Sobrien
4639169689Skan/* In tree-inline.c  */
464050397Sobrien
4641169689Skan/* The type of a set of already-visited pointers.  Functions for creating
4642169689Skan   and manipulating it are declared in pointer-set.h */
4643169689Skanstruct pointer_set_t;
464490075Sobrien
4645169689Skan/* The type of a callback function for walking over tree structure.  */
464690075Sobrien
4647169689Skantypedef tree (*walk_tree_fn) (tree *, int *, void *);
4648169689Skanextern tree walk_tree (tree*, walk_tree_fn, void*, struct pointer_set_t*);
4649169689Skanextern tree walk_tree_without_duplicates (tree*, walk_tree_fn, void*);
465090075Sobrien
4651132718Skan/* Assign the RTX to declaration.  */
465290075Sobrien
4653132718Skanextern void set_decl_rtl (tree, rtx);
4654169689Skanextern void set_decl_incoming_rtl (tree, rtx);
465590075Sobrien
4656169689Skan/* Enum and arrays used for tree allocation stats.
4657132718Skan   Keep in sync with tree.c:tree_node_kind_names.  */
4658132718Skantypedef enum
4659132718Skan{
4660132718Skan  d_kind,
4661132718Skan  t_kind,
4662132718Skan  b_kind,
4663132718Skan  s_kind,
4664132718Skan  r_kind,
4665132718Skan  e_kind,
4666132718Skan  c_kind,
4667132718Skan  id_kind,
4668132718Skan  perm_list_kind,
4669132718Skan  temp_list_kind,
4670132718Skan  vec_kind,
4671169689Skan  binfo_kind,
4672169689Skan  phi_kind,
4673169689Skan  ssa_name_kind,
4674169689Skan  constr_kind,
4675132718Skan  x_kind,
4676132718Skan  lang_decl,
4677132718Skan  lang_type,
4678169689Skan  omp_clause_kind,
4679132718Skan  all_kinds
4680132718Skan} tree_node_kind;
4681132718Skan
4682132718Skanextern int tree_node_counts[];
4683132718Skanextern int tree_node_sizes[];
4684169689Skan
4685169689Skan/* True if we are in gimple form and the actions of the folders need to
4686169689Skan   be restricted.  False if we are not in gimple form and folding is not
4687169689Skan   restricted to creating gimple expressions.  */
4688169689Skanextern bool in_gimple_form;
4689169689Skan
4690169689Skan/* In tree-gimple.c.  */
4691169689Skanextern tree get_base_address (tree t);
4692169689Skan
4693169689Skan/* In tree-vectorizer.c.  */
4694169689Skanextern void vect_set_verbosity_level (const char *);
4695169689Skan
4696169689Skanstruct tree_map GTY(())
4697169689Skan{
4698169689Skan  unsigned int hash;
4699169689Skan  tree from;
4700169689Skan  tree to;
4701169689Skan};
4702169689Skan
4703169689Skanextern unsigned int tree_map_hash (const void *);
4704169689Skanextern int tree_map_marked_p (const void *);
4705169689Skanextern int tree_map_eq (const void *, const void *);
4706169689Skan
4707169689Skan/* In tree-ssa-address.c.  */
4708169689Skanextern tree tree_mem_ref_addr (tree, tree);
4709169689Skanextern void copy_mem_ref_info (tree, tree);
4710169689Skan
4711169689Skan/* In tree-vrp.c */
4712169689Skanextern bool ssa_name_nonzero_p (tree);
4713169689Skanextern bool ssa_name_nonnegative_p (tree);
4714169689Skan
4715169689Skan/* In tree-object-size.c.  */
4716169689Skanextern void init_object_sizes (void);
4717169689Skanextern void fini_object_sizes (void);
4718169689Skanextern unsigned HOST_WIDE_INT compute_builtin_object_size (tree, int);
4719169689Skan
4720169689Skan/* In expr.c.  */
4721169689Skanextern unsigned HOST_WIDE_INT highest_pow2_factor (tree);
4722169689Skan
4723261188Spfg/* APPLE LOCAL begin radar 6300081  */
4724261188Spfgextern GTY(()) tree generic_block_literal_struct_type;
4725261188Spfg/* APPLE LOCAL end radar 6300081  */
4726261188Spfg
4727117395Skan#endif  /* GCC_TREE_H  */
4728