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