|
|
1.1 ! root 1: /* Front-end tree definitions for GNU compiler. ! 2: Copyright (C) 1989, 1993 Free Software Foundation, Inc. ! 3: ! 4: This file is part of GNU CC. ! 5: ! 6: GNU CC is free software; you can redistribute it and/or modify ! 7: it under the terms of the GNU General Public License as published by ! 8: the Free Software Foundation; either version 2, or (at your option) ! 9: any later version. ! 10: ! 11: GNU CC is distributed in the hope that it will be useful, ! 12: but WITHOUT ANY WARRANTY; without even the implied warranty of ! 13: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ! 14: GNU General Public License for more details. ! 15: ! 16: You should have received a copy of the GNU General Public License ! 17: along with GNU CC; see the file COPYING. If not, write to ! 18: the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ ! 19: ! 20: #include "machmode.h" ! 21: ! 22: /* codes of tree nodes */ ! 23: ! 24: #define DEFTREECODE(SYM, STRING, TYPE, NARGS) SYM, ! 25: ! 26: enum tree_code { ! 27: #include "tree.def" ! 28: ! 29: LAST_AND_UNUSED_TREE_CODE /* A convenient way to get a value for ! 30: NUM_TREE_CODE. */ ! 31: }; ! 32: ! 33: #undef DEFTREECODE ! 34: ! 35: /* Number of tree codes. */ ! 36: #define NUM_TREE_CODES ((int)LAST_AND_UNUSED_TREE_CODE) ! 37: ! 38: /* Indexed by enum tree_code, contains a character which is ! 39: `<' for a comparison expression, `1', for a unary arithmetic ! 40: expression, `2' for a binary arithmetic expression, `e' for ! 41: other types of expressions, `r' for a reference, `c' for a ! 42: constant, `d' for a decl, `t' for a type, `s' for a statement, ! 43: and `x' for anything else (TREE_LIST, IDENTIFIER, etc). */ ! 44: ! 45: extern char **tree_code_type; ! 46: #define TREE_CODE_CLASS(CODE) (*tree_code_type[(int) (CODE)]) ! 47: ! 48: /* Number of argument-words in each kind of tree-node. */ ! 49: ! 50: extern int *tree_code_length; ! 51: ! 52: /* Names of tree components. */ ! 53: ! 54: extern char **tree_code_name; ! 55: ! 56: /* Codes that identify the various built in functions ! 57: so that expand_call can identify them quickly. */ ! 58: ! 59: enum built_in_function ! 60: { ! 61: NOT_BUILT_IN, ! 62: BUILT_IN_ALLOCA, ! 63: BUILT_IN_ABS, ! 64: BUILT_IN_FABS, ! 65: BUILT_IN_LABS, ! 66: BUILT_IN_FFS, ! 67: BUILT_IN_DIV, ! 68: BUILT_IN_LDIV, ! 69: BUILT_IN_FFLOOR, ! 70: BUILT_IN_FCEIL, ! 71: BUILT_IN_FMOD, ! 72: BUILT_IN_FREM, ! 73: BUILT_IN_MEMCPY, ! 74: BUILT_IN_MEMCMP, ! 75: BUILT_IN_MEMSET, ! 76: BUILT_IN_STRCPY, ! 77: BUILT_IN_STRCMP, ! 78: BUILT_IN_STRLEN, ! 79: BUILT_IN_FSQRT, ! 80: BUILT_IN_SIN, ! 81: BUILT_IN_COS, ! 82: BUILT_IN_GETEXP, ! 83: BUILT_IN_GETMAN, ! 84: BUILT_IN_SAVEREGS, ! 85: BUILT_IN_CLASSIFY_TYPE, ! 86: BUILT_IN_NEXT_ARG, ! 87: BUILT_IN_ARGS_INFO, ! 88: BUILT_IN_CONSTANT_P, ! 89: BUILT_IN_FRAME_ADDRESS, ! 90: BUILT_IN_RETURN_ADDRESS, ! 91: BUILT_IN_CALLER_RETURN_ADDRESS, ! 92: BUILT_IN_APPLY_ARGS, ! 93: BUILT_IN_APPLY, ! 94: BUILT_IN_RETURN, ! 95: ! 96: /* C++ extensions */ ! 97: BUILT_IN_NEW, ! 98: BUILT_IN_VEC_NEW, ! 99: BUILT_IN_DELETE, ! 100: BUILT_IN_VEC_DELETE, ! 101: ! 102: /* Upper bound on non-language-specific builtins. */ ! 103: END_BUILTINS ! 104: }; ! 105: ! 106: /* The definition of tree nodes fills the next several pages. */ ! 107: ! 108: /* A tree node can represent a data type, a variable, an expression ! 109: or a statement. Each node has a TREE_CODE which says what kind of ! 110: thing it represents. Some common codes are: ! 111: INTEGER_TYPE -- represents a type of integers. ! 112: ARRAY_TYPE -- represents a type of pointer. ! 113: VAR_DECL -- represents a declared variable. ! 114: INTEGER_CST -- represents a constant integer value. ! 115: PLUS_EXPR -- represents a sum (an expression). ! 116: ! 117: As for the contents of a tree node: there are some fields ! 118: that all nodes share. Each TREE_CODE has various special-purpose ! 119: fields as well. The fields of a node are never accessed directly, ! 120: always through accessor macros. */ ! 121: ! 122: /* This type is used everywhere to refer to a tree node. */ ! 123: ! 124: typedef union tree_node *tree; ! 125: ! 126: /* Every kind of tree node starts with this structure, ! 127: so all nodes have these fields. ! 128: ! 129: See the accessor macros, defined below, for documentation of the fields. */ ! 130: ! 131: struct tree_common ! 132: { ! 133: union tree_node *chain; ! 134: union tree_node *type; ! 135: #ifdef ONLY_INT_FIELDS ! 136: unsigned int code : 8; ! 137: #else ! 138: enum tree_code code : 8; ! 139: #endif ! 140: ! 141: unsigned side_effects_flag : 1; ! 142: unsigned constant_flag : 1; ! 143: unsigned permanent_flag : 1; ! 144: unsigned addressable_flag : 1; ! 145: unsigned volatile_flag : 1; ! 146: unsigned readonly_flag : 1; ! 147: unsigned unsigned_flag : 1; ! 148: unsigned asm_written_flag: 1; ! 149: ! 150: unsigned used_flag : 1; ! 151: unsigned raises_flag : 1; ! 152: unsigned static_flag : 1; ! 153: unsigned public_flag : 1; ! 154: unsigned private_flag : 1; ! 155: unsigned protected_flag : 1; ! 156: ! 157: unsigned lang_flag_0 : 1; ! 158: unsigned lang_flag_1 : 1; ! 159: unsigned lang_flag_2 : 1; ! 160: unsigned lang_flag_3 : 1; ! 161: unsigned lang_flag_4 : 1; ! 162: unsigned lang_flag_5 : 1; ! 163: unsigned lang_flag_6 : 1; ! 164: /* There is room for two more flags. */ ! 165: }; ! 166: ! 167: /* Define accessors for the fields that all tree nodes have ! 168: (though some fields are not used for all kinds of nodes). */ ! 169: ! 170: /* The tree-code says what kind of node it is. ! 171: Codes are defined in tree.def. */ ! 172: #define TREE_CODE(NODE) ((enum tree_code) (NODE)->common.code) ! 173: #define TREE_SET_CODE(NODE, VALUE) ((NODE)->common.code = (int) (VALUE)) ! 174: ! 175: /* In all nodes that are expressions, this is the data type of the expression. ! 176: In POINTER_TYPE nodes, this is the type that the pointer points to. ! 177: In ARRAY_TYPE nodes, this is the type of the elements. */ ! 178: #define TREE_TYPE(NODE) ((NODE)->common.type) ! 179: ! 180: /* Nodes are chained together for many purposes. ! 181: Types are chained together to record them for being output to the debugger ! 182: (see the function `chain_type'). ! 183: Decls in the same scope are chained together to record the contents ! 184: of the scope. ! 185: Statement nodes for successive statements used to be chained together. ! 186: Often lists of things are represented by TREE_LIST nodes that ! 187: are chained together. */ ! 188: ! 189: #define TREE_CHAIN(NODE) ((NODE)->common.chain) ! 190: ! 191: /* Given an expression as a tree, strip any NON_LVALUE_EXPRs and NOP_EXPRs ! 192: that don't change the machine mode. */ ! 193: ! 194: #define STRIP_NOPS(EXP) \ ! 195: while ((TREE_CODE (EXP) == NOP_EXPR \ ! 196: || TREE_CODE (EXP) == CONVERT_EXPR \ ! 197: || TREE_CODE (EXP) == NON_LVALUE_EXPR) \ ! 198: && (TYPE_MODE (TREE_TYPE (EXP)) \ ! 199: == TYPE_MODE (TREE_TYPE (TREE_OPERAND (EXP, 0))))) \ ! 200: (EXP) = TREE_OPERAND (EXP, 0); ! 201: ! 202: /* Like STRIP_NOPS, but don't alter the TREE_TYPE either. */ ! 203: ! 204: #define STRIP_TYPE_NOPS(EXP) \ ! 205: while ((TREE_CODE (EXP) == NOP_EXPR \ ! 206: || TREE_CODE (EXP) == CONVERT_EXPR \ ! 207: || TREE_CODE (EXP) == NON_LVALUE_EXPR) \ ! 208: && (TREE_TYPE (EXP) \ ! 209: == TREE_TYPE (TREE_OPERAND (EXP, 0)))) \ ! 210: (EXP) = TREE_OPERAND (EXP, 0); ! 211: ! 212: /* Nonzero if TYPE represents an integral type. Note that we do not ! 213: include COMPLEX types here. */ ! 214: ! 215: #define INTEGRAL_TYPE_P(TYPE) \ ! 216: (TREE_CODE (TYPE) == INTEGER_TYPE || TREE_CODE (TYPE) == ENUMERAL_TYPE \ ! 217: || TREE_CODE (TYPE) == BOOLEAN_TYPE || TREE_CODE (TYPE) == CHAR_TYPE) ! 218: ! 219: /* Nonzero if TYPE represents a floating-point type, including complex ! 220: floating-point types. */ ! 221: ! 222: #define FLOAT_TYPE_P(TYPE) \ ! 223: (TREE_CODE (TYPE) == REAL_TYPE \ ! 224: || (TREE_CODE (TYPE) == COMPLEX_TYPE \ ! 225: && TREE_CODE (TREE_TYPE (TYPE)) == REAL_TYPE)) ! 226: ! 227: /* Define many boolean fields that all tree nodes have. */ ! 228: ! 229: /* In VAR_DECL nodes, nonzero means address of this is needed. ! 230: So it cannot be in a register. ! 231: In a FUNCTION_DECL, nonzero means its address is needed. ! 232: So it must be compiled even if it is an inline function. ! 233: In CONSTRUCTOR nodes, it means object constructed must be in memory. ! 234: In LABEL_DECL nodes, it means a goto for this label has been seen ! 235: from a place outside all binding contours that restore stack levels. ! 236: In ..._TYPE nodes, it means that objects of this type must ! 237: be fully addressable. This means that pieces of this ! 238: object cannot go into register parameters, for example. ! 239: In IDENTIFIER_NODEs, this means that some extern decl for this name ! 240: had its address taken. That matters for inline functions. */ ! 241: #define TREE_ADDRESSABLE(NODE) ((NODE)->common.addressable_flag) ! 242: ! 243: /* In a VAR_DECL, nonzero means allocate static storage. ! 244: In a FUNCTION_DECL, nonzero if function has been defined. ! 245: In a CONSTRUCTOR, nonzero means allocate static storage. */ ! 246: #define TREE_STATIC(NODE) ((NODE)->common.static_flag) ! 247: ! 248: /* In a CONVERT_EXPR or NOP_EXPR, this means the node was made ! 249: implicitly and should not lead to an "unused value" warning. */ ! 250: #define TREE_NO_UNUSED_WARNING(NODE) ((NODE)->common.static_flag) ! 251: ! 252: /* Nonzero for a TREE_LIST or TREE_VEC node means that the derivation ! 253: chain is via a `virtual' declaration. */ ! 254: #define TREE_VIA_VIRTUAL(NODE) ((NODE)->common.static_flag) ! 255: ! 256: /* In an INTEGER_CST, this means there was an overflow in folding. ! 257: This is distinct from TREE_OVERFLOW because ANSI C requires a diagnostic ! 258: when overflows occur in constant expressions. */ ! 259: #define TREE_CONSTANT_OVERFLOW(NODE) ((NODE)->common.static_flag) ! 260: ! 261: /* In an INTEGER_CST, this means there was an overflow in folding, ! 262: and no warning has been issued for this subexpression. ! 263: TREE_OVERFLOW implies TREE_CONSTANT_OVERFLOW, but not vice versa. */ ! 264: #define TREE_OVERFLOW(NODE) ((NODE)->common.public_flag) ! 265: ! 266: /* In a VAR_DECL or FUNCTION_DECL, ! 267: nonzero means name is to be accessible from outside this module. ! 268: In an identifier node, nonzero means an external declaration ! 269: accessible from outside this module was previously seen ! 270: for this name in an inner scope. */ ! 271: #define TREE_PUBLIC(NODE) ((NODE)->common.public_flag) ! 272: ! 273: /* Nonzero for TREE_LIST or TREE_VEC node means that the path to the ! 274: base class is via a `public' declaration, which preserves public ! 275: fields from the base class as public. */ ! 276: #define TREE_VIA_PUBLIC(NODE) ((NODE)->common.public_flag) ! 277: ! 278: /* Ditto, for `private' declarations. */ ! 279: #define TREE_VIA_PRIVATE(NODE) ((NODE)->common.private_flag) ! 280: ! 281: /* Nonzero for TREE_LIST node means that the path to the ! 282: base class is via a `protected' declaration, which preserves ! 283: protected fields from the base class as protected. ! 284: OVERLOADED. */ ! 285: #define TREE_VIA_PROTECTED(NODE) ((NODE)->common.protected_flag) ! 286: ! 287: /* In any expression, nonzero means it has side effects or reevaluation ! 288: of the whole expression could produce a different value. ! 289: This is set if any subexpression is a function call, a side effect ! 290: or a reference to a volatile variable. ! 291: In a ..._DECL, this is set only if the declaration said `volatile'. */ ! 292: #define TREE_SIDE_EFFECTS(NODE) ((NODE)->common.side_effects_flag) ! 293: ! 294: /* Nonzero means this expression is volatile in the C sense: ! 295: its address should be of type `volatile WHATEVER *'. ! 296: In other words, the declared item is volatile qualified. ! 297: This is used in _DECL nodes and _REF nodes. ! 298: ! 299: In a ..._TYPE node, means this type is volatile-qualified. ! 300: But use TYPE_VOLATILE instead of this macro when the node is a type, ! 301: because eventually we may make that a different bit. ! 302: ! 303: If this bit is set in an expression, so is TREE_SIDE_EFFECTS. */ ! 304: #define TREE_THIS_VOLATILE(NODE) ((NODE)->common.volatile_flag) ! 305: ! 306: /* In a VAR_DECL, PARM_DECL or FIELD_DECL, or any kind of ..._REF node, ! 307: nonzero means it may not be the lhs of an assignment. ! 308: In a ..._TYPE node, means this type is const-qualified ! 309: (but the macro TYPE_READONLY should be used instead of this macro ! 310: when the node is a type). */ ! 311: #define TREE_READONLY(NODE) ((NODE)->common.readonly_flag) ! 312: ! 313: /* Value of expression is constant. ! 314: Always appears in all ..._CST nodes. ! 315: May also appear in an arithmetic expression, an ADDR_EXPR or a CONSTRUCTOR ! 316: if the value is constant. */ ! 317: #define TREE_CONSTANT(NODE) ((NODE)->common.constant_flag) ! 318: ! 319: /* Nonzero means permanent node; ! 320: node will continue to exist for the entire compiler run. ! 321: Otherwise it will be recycled at the end of the function. */ ! 322: #define TREE_PERMANENT(NODE) ((NODE)->common.permanent_flag) ! 323: ! 324: /* In INTEGER_TYPE or ENUMERAL_TYPE nodes, means an unsigned type. ! 325: In FIELD_DECL nodes, means an unsigned bit field. ! 326: The same bit is used in functions as DECL_BUILT_IN_NONANSI. */ ! 327: #define TREE_UNSIGNED(NODE) ((NODE)->common.unsigned_flag) ! 328: ! 329: /* Nonzero in a VAR_DECL means assembler code has been written. ! 330: Nonzero in a FUNCTION_DECL means that the function has been compiled. ! 331: This is interesting in an inline function, since it might not need ! 332: to be compiled separately. ! 333: Nonzero in a RECORD_TYPE, UNION_TYPE, QUAL_UNION_TYPE or ENUMERAL_TYPE ! 334: if the sdb debugging info for the type has been written. ! 335: In a BLOCK node, nonzero if reorder_blocks has already seen this block. */ ! 336: #define TREE_ASM_WRITTEN(NODE) ((NODE)->common.asm_written_flag) ! 337: ! 338: /* Nonzero in a _DECL if the name is used in its scope. ! 339: Nonzero in an expr node means inhibit warning if value is unused. ! 340: In IDENTIFIER_NODEs, this means that some extern decl for this name ! 341: was used. */ ! 342: #define TREE_USED(NODE) ((NODE)->common.used_flag) ! 343: ! 344: /* Nonzero for a tree node whose evaluation could result ! 345: in the raising of an exception. Not implemented yet. */ ! 346: #define TREE_RAISES(NODE) ((NODE)->common.raises_flag) ! 347: ! 348: /* Used in classes in C++. */ ! 349: #define TREE_PRIVATE(NODE) ((NODE)->common.private_flag) ! 350: /* Used in classes in C++. ! 351: In a BLOCK node, this is BLOCK_HANDLER_BLOCK. */ ! 352: #define TREE_PROTECTED(NODE) ((NODE)->common.protected_flag) ! 353: ! 354: /* This specifies for a decl, if it is a offset type */ ! 355: #define TREE_SELF_OFFSET(NODE) TREE_LANG_FLAG_6 (NODE) ! 356: ! 357: /* These flags are available for each language front end to use internally. */ ! 358: #define TREE_LANG_FLAG_0(NODE) ((NODE)->common.lang_flag_0) ! 359: #define TREE_LANG_FLAG_1(NODE) ((NODE)->common.lang_flag_1) ! 360: #define TREE_LANG_FLAG_2(NODE) ((NODE)->common.lang_flag_2) ! 361: #define TREE_LANG_FLAG_3(NODE) ((NODE)->common.lang_flag_3) ! 362: #define TREE_LANG_FLAG_4(NODE) ((NODE)->common.lang_flag_4) ! 363: #define TREE_LANG_FLAG_5(NODE) ((NODE)->common.lang_flag_5) ! 364: #define TREE_LANG_FLAG_6(NODE) ((NODE)->common.lang_flag_6) ! 365: ! 366: /* Define additional fields and accessors for nodes representing constants. */ ! 367: ! 368: /* In an INTEGER_CST node. These two together make a 2-word integer. ! 369: If the data type is signed, the value is sign-extended to 2 words ! 370: even though not all of them may really be in use. ! 371: In an unsigned constant shorter than 2 words, the extra bits are 0. */ ! 372: #define TREE_INT_CST_LOW(NODE) ((NODE)->int_cst.int_cst_low) ! 373: #define TREE_INT_CST_HIGH(NODE) ((NODE)->int_cst.int_cst_high) ! 374: ! 375: #define INT_CST_LT(A, B) \ ! 376: (TREE_INT_CST_HIGH (A) < TREE_INT_CST_HIGH (B) \ ! 377: || (TREE_INT_CST_HIGH (A) == TREE_INT_CST_HIGH (B) \ ! 378: && ((unsigned HOST_WIDE_INT) TREE_INT_CST_LOW (A) \ ! 379: < (unsigned HOST_WIDE_INT) TREE_INT_CST_LOW (B)))) ! 380: ! 381: #define INT_CST_LT_UNSIGNED(A, B) \ ! 382: (((unsigned HOST_WIDE_INT) TREE_INT_CST_HIGH (A) \ ! 383: < (unsigned HOST_WIDE_INT) TREE_INT_CST_HIGH (B)) \ ! 384: || (((unsigned HOST_WIDE_INT) TREE_INT_CST_HIGH (A) \ ! 385: == (unsigned HOST_WIDE_INT ) TREE_INT_CST_HIGH (B)) \ ! 386: && (((unsigned HOST_WIDE_INT) TREE_INT_CST_LOW (A) \ ! 387: < (unsigned HOST_WIDE_INT) TREE_INT_CST_LOW (B))))) ! 388: ! 389: struct tree_int_cst ! 390: { ! 391: char common[sizeof (struct tree_common)]; ! 392: HOST_WIDE_INT int_cst_low; ! 393: HOST_WIDE_INT int_cst_high; ! 394: }; ! 395: ! 396: /* In REAL_CST, STRING_CST, COMPLEX_CST nodes, and CONSTRUCTOR nodes, ! 397: and generally in all kinds of constants that could ! 398: be given labels (rather than being immediate). */ ! 399: ! 400: #define TREE_CST_RTL(NODE) ((NODE)->real_cst.rtl) ! 401: ! 402: /* In a REAL_CST node. */ ! 403: /* We can represent a real value as either a `double' or a string. ! 404: Strings don't allow for any optimization, but they do allow ! 405: for cross-compilation. */ ! 406: ! 407: #define TREE_REAL_CST(NODE) ((NODE)->real_cst.real_cst) ! 408: ! 409: #include "real.h" ! 410: ! 411: struct tree_real_cst ! 412: { ! 413: char common[sizeof (struct tree_common)]; ! 414: struct rtx_def *rtl; /* acts as link to register transfer language ! 415: (rtl) info */ ! 416: REAL_VALUE_TYPE real_cst; ! 417: }; ! 418: ! 419: /* In a STRING_CST */ ! 420: #define TREE_STRING_LENGTH(NODE) ((NODE)->string.length) ! 421: #define TREE_STRING_POINTER(NODE) ((NODE)->string.pointer) ! 422: ! 423: struct tree_string ! 424: { ! 425: char common[sizeof (struct tree_common)]; ! 426: struct rtx_def *rtl; /* acts as link to register transfer language ! 427: (rtl) info */ ! 428: int length; ! 429: char *pointer; ! 430: }; ! 431: ! 432: /* In a COMPLEX_CST node. */ ! 433: #define TREE_REALPART(NODE) ((NODE)->complex.real) ! 434: #define TREE_IMAGPART(NODE) ((NODE)->complex.imag) ! 435: ! 436: struct tree_complex ! 437: { ! 438: char common[sizeof (struct tree_common)]; ! 439: struct rtx_def *rtl; /* acts as link to register transfer language ! 440: (rtl) info */ ! 441: union tree_node *real; ! 442: union tree_node *imag; ! 443: }; ! 444: ! 445: /* Define fields and accessors for some special-purpose tree nodes. */ ! 446: ! 447: #define IDENTIFIER_LENGTH(NODE) ((NODE)->identifier.length) ! 448: #define IDENTIFIER_POINTER(NODE) ((NODE)->identifier.pointer) ! 449: ! 450: struct tree_identifier ! 451: { ! 452: char common[sizeof (struct tree_common)]; ! 453: int length; ! 454: char *pointer; ! 455: }; ! 456: ! 457: /* In a TREE_LIST node. */ ! 458: #define TREE_PURPOSE(NODE) ((NODE)->list.purpose) ! 459: #define TREE_VALUE(NODE) ((NODE)->list.value) ! 460: ! 461: struct tree_list ! 462: { ! 463: char common[sizeof (struct tree_common)]; ! 464: union tree_node *purpose; ! 465: union tree_node *value; ! 466: }; ! 467: ! 468: /* In a TREE_VEC node. */ ! 469: #define TREE_VEC_LENGTH(NODE) ((NODE)->vec.length) ! 470: #define TREE_VEC_ELT(NODE,I) ((NODE)->vec.a[I]) ! 471: #define TREE_VEC_END(NODE) (&((NODE)->vec.a[(NODE)->vec.length])) ! 472: ! 473: struct tree_vec ! 474: { ! 475: char common[sizeof (struct tree_common)]; ! 476: int length; ! 477: union tree_node *a[1]; ! 478: }; ! 479: ! 480: /* Define fields and accessors for some nodes that represent expressions. */ ! 481: ! 482: /* In a SAVE_EXPR node. */ ! 483: #define SAVE_EXPR_CONTEXT(NODE) TREE_OPERAND(NODE, 1) ! 484: #define SAVE_EXPR_RTL(NODE) (*(struct rtx_def **) &(NODE)->exp.operands[2]) ! 485: ! 486: /* In a RTL_EXPR node. */ ! 487: #define RTL_EXPR_SEQUENCE(NODE) (*(struct rtx_def **) &(NODE)->exp.operands[0]) ! 488: #define RTL_EXPR_RTL(NODE) (*(struct rtx_def **) &(NODE)->exp.operands[1]) ! 489: ! 490: /* In a CALL_EXPR node. */ ! 491: #define CALL_EXPR_RTL(NODE) (*(struct rtx_def **) &(NODE)->exp.operands[2]) ! 492: ! 493: /* In a CONSTRUCTOR node. */ ! 494: #define CONSTRUCTOR_ELTS(NODE) TREE_OPERAND (NODE, 1) ! 495: ! 496: /* In ordinary expression nodes. */ ! 497: #define TREE_OPERAND(NODE, I) ((NODE)->exp.operands[I]) ! 498: #define TREE_COMPLEXITY(NODE) ((NODE)->exp.complexity) ! 499: ! 500: struct tree_exp ! 501: { ! 502: char common[sizeof (struct tree_common)]; ! 503: int complexity; ! 504: union tree_node *operands[1]; ! 505: }; ! 506: ! 507: /* In a BLOCK node. */ ! 508: #define BLOCK_VARS(NODE) ((NODE)->block.vars) ! 509: #define BLOCK_TYPE_TAGS(NODE) ((NODE)->block.type_tags) ! 510: #define BLOCK_SUBBLOCKS(NODE) ((NODE)->block.subblocks) ! 511: #define BLOCK_SUPERCONTEXT(NODE) ((NODE)->block.supercontext) ! 512: /* Note: when changing this, make sure to find the places ! 513: that use chainon or nreverse. */ ! 514: #define BLOCK_CHAIN(NODE) TREE_CHAIN (NODE) ! 515: #define BLOCK_ABSTRACT_ORIGIN(NODE) ((NODE)->block.abstract_origin) ! 516: #define BLOCK_ABSTRACT(NODE) ((NODE)->block.abstract_flag) ! 517: #define BLOCK_END_NOTE(NODE) ((NODE)->block.end_note) ! 518: ! 519: /* Nonzero means that this block is prepared to handle exceptions ! 520: listed in the BLOCK_VARS slot. */ ! 521: #define BLOCK_HANDLER_BLOCK(NODE) ((NODE)->block.handler_block_flag) ! 522: ! 523: struct tree_block ! 524: { ! 525: char common[sizeof (struct tree_common)]; ! 526: ! 527: unsigned handler_block_flag : 1; ! 528: unsigned abstract_flag : 1; ! 529: ! 530: union tree_node *vars; ! 531: union tree_node *type_tags; ! 532: union tree_node *subblocks; ! 533: union tree_node *supercontext; ! 534: union tree_node *abstract_origin; ! 535: struct rtx_def *end_note; ! 536: }; ! 537: ! 538: /* Define fields and accessors for nodes representing data types. */ ! 539: ! 540: /* See tree.def for documentation of the use of these fields. ! 541: Look at the documentation of the various ..._TYPE tree codes. */ ! 542: ! 543: #define TYPE_UID(NODE) ((NODE)->type.uid) ! 544: #define TYPE_SIZE(NODE) ((NODE)->type.size) ! 545: #define TYPE_MODE(NODE) ((NODE)->type.mode) ! 546: #define TYPE_VALUES(NODE) ((NODE)->type.values) ! 547: #define TYPE_DOMAIN(NODE) ((NODE)->type.values) ! 548: #define TYPE_FIELDS(NODE) ((NODE)->type.values) ! 549: #define TYPE_METHODS(NODE) ((NODE)->type.maxval) ! 550: #define TYPE_VFIELD(NODE) ((NODE)->type.minval) ! 551: #define TYPE_ARG_TYPES(NODE) ((NODE)->type.values) ! 552: #define TYPE_METHOD_BASETYPE(NODE) ((NODE)->type.maxval) ! 553: #define TYPE_OFFSET_BASETYPE(NODE) ((NODE)->type.maxval) ! 554: #define TYPE_POINTER_TO(NODE) ((NODE)->type.pointer_to) ! 555: #define TYPE_REFERENCE_TO(NODE) ((NODE)->type.reference_to) ! 556: #define TYPE_MIN_VALUE(NODE) ((NODE)->type.minval) ! 557: #define TYPE_MAX_VALUE(NODE) ((NODE)->type.maxval) ! 558: #define TYPE_PRECISION(NODE) ((NODE)->type.precision) ! 559: #define TYPE_PARSE_INFO(NODE) ((NODE)->type.parse_info) ! 560: #define TYPE_SYMTAB_ADDRESS(NODE) ((NODE)->type.symtab.address) ! 561: #define TYPE_SYMTAB_POINTER(NODE) ((NODE)->type.symtab.pointer) ! 562: #define TYPE_NAME(NODE) ((NODE)->type.name) ! 563: #define TYPE_NEXT_VARIANT(NODE) ((NODE)->type.next_variant) ! 564: #define TYPE_MAIN_VARIANT(NODE) ((NODE)->type.main_variant) ! 565: #define TYPE_BINFO(NODE) ((NODE)->type.binfo) ! 566: #define TYPE_NONCOPIED_PARTS(NODE) ((NODE)->type.noncopied_parts) ! 567: #define TYPE_CONTEXT(NODE) ((NODE)->type.context) ! 568: #define TYPE_OBSTACK(NODE) ((NODE)->type.obstack) ! 569: #define TYPE_LANG_SPECIFIC(NODE) ((NODE)->type.lang_specific) ! 570: ! 571: /* The alignment necessary for objects of this type. ! 572: The value is an int, measured in bits. */ ! 573: #define TYPE_ALIGN(NODE) ((NODE)->type.align) ! 574: ! 575: #define TYPE_STUB_DECL(NODE) (TREE_CHAIN (NODE)) ! 576: ! 577: /* In a RECORD_TYPE, UNION_TYPE or QUAL_UNION_TYPE, it means the type ! 578: has BLKmode only because it lacks the alignment requirement for ! 579: its size. */ ! 580: #define TYPE_NO_FORCE_BLK(NODE) ((NODE)->type.no_force_blk_flag) ! 581: ! 582: /* Nonzero in a type considered volatile as a whole. */ ! 583: #define TYPE_VOLATILE(NODE) ((NODE)->common.volatile_flag) ! 584: ! 585: /* Means this type is const-qualified. */ ! 586: #define TYPE_READONLY(NODE) ((NODE)->common.readonly_flag) ! 587: ! 588: /* These flags are available for each language front end to use internally. */ ! 589: #define TYPE_LANG_FLAG_0(NODE) ((NODE)->type.lang_flag_0) ! 590: #define TYPE_LANG_FLAG_1(NODE) ((NODE)->type.lang_flag_1) ! 591: #define TYPE_LANG_FLAG_2(NODE) ((NODE)->type.lang_flag_2) ! 592: #define TYPE_LANG_FLAG_3(NODE) ((NODE)->type.lang_flag_3) ! 593: #define TYPE_LANG_FLAG_4(NODE) ((NODE)->type.lang_flag_4) ! 594: #define TYPE_LANG_FLAG_5(NODE) ((NODE)->type.lang_flag_5) ! 595: #define TYPE_LANG_FLAG_6(NODE) ((NODE)->type.lang_flag_6) ! 596: ! 597: struct tree_type ! 598: { ! 599: char common[sizeof (struct tree_common)]; ! 600: union tree_node *values; ! 601: union tree_node *size; ! 602: unsigned uid; ! 603: ! 604: #ifdef ONLY_INT_FIELDS ! 605: int mode : 8; ! 606: #else ! 607: enum machine_mode mode : 8; ! 608: #endif ! 609: unsigned char precision; ! 610: ! 611: unsigned no_force_blk_flag : 1; ! 612: unsigned lang_flag_0 : 1; ! 613: unsigned lang_flag_1 : 1; ! 614: unsigned lang_flag_2 : 1; ! 615: unsigned lang_flag_3 : 1; ! 616: unsigned lang_flag_4 : 1; ! 617: unsigned lang_flag_5 : 1; ! 618: unsigned lang_flag_6 : 1; ! 619: ! 620: unsigned int align; ! 621: union tree_node *pointer_to; ! 622: union tree_node *reference_to; ! 623: int parse_info; ! 624: union {int address; char *pointer; } symtab; ! 625: union tree_node *name; ! 626: union tree_node *minval; ! 627: union tree_node *maxval; ! 628: union tree_node *next_variant; ! 629: union tree_node *main_variant; ! 630: union tree_node *binfo; ! 631: union tree_node *noncopied_parts; ! 632: union tree_node *context; ! 633: struct obstack *obstack; ! 634: /* Points to a structure whose details depend on the language in use. */ ! 635: struct lang_type *lang_specific; ! 636: }; ! 637: ! 638: /* Define accessor macros for information about type inheritance ! 639: and basetypes. ! 640: ! 641: A "basetype" means a particular usage of a data type for inheritance ! 642: in another type. Each such basetype usage has its own "binfo" ! 643: object to describe it. The binfo object is a TREE_VEC node. ! 644: ! 645: Inheritance is represented by the binfo nodes allocated for a ! 646: given type. For example, given types C and D, such that D is ! 647: inherited by C, 3 binfo nodes will be allocated: one for describing ! 648: the binfo properties of C, similarly one for D, and one for ! 649: describing the binfo properties of D as a base type for C. ! 650: Thus, given a pointer to class C, one can get a pointer to the binfo ! 651: of D acting as a basetype for C by looking at C's binfo's basetypes. */ ! 652: ! 653: /* The actual data type node being inherited in this basetype. */ ! 654: #define BINFO_TYPE(NODE) TREE_TYPE (NODE) ! 655: ! 656: /* The offset where this basetype appears in its containing type. ! 657: BINFO_OFFSET slot holds the offset (in bytes) ! 658: from the base of the complete object to the base of the part of the ! 659: object that is allocated on behalf of this `type'. ! 660: This is always 0 except when there is multiple inheritance. */ ! 661: ! 662: #define BINFO_OFFSET(NODE) TREE_VEC_ELT ((NODE), 1) ! 663: #define TYPE_BINFO_OFFSET(NODE) BINFO_OFFSET (TYPE_BINFO (NODE)) ! 664: #define BINFO_OFFSET_ZEROP(NODE) (BINFO_OFFSET (NODE) == integer_zero_node) ! 665: ! 666: /* The virtual function table belonging to this basetype. Virtual ! 667: function tables provide a mechanism for run-time method dispatching. ! 668: The entries of a virtual function table are language-dependent. */ ! 669: ! 670: #define BINFO_VTABLE(NODE) TREE_VEC_ELT ((NODE), 2) ! 671: #define TYPE_BINFO_VTABLE(NODE) BINFO_VTABLE (TYPE_BINFO (NODE)) ! 672: ! 673: /* The virtual functions in the virtual function table. This is ! 674: a TREE_LIST that is used as an initial approximation for building ! 675: a virtual function table for this basetype. */ ! 676: #define BINFO_VIRTUALS(NODE) TREE_VEC_ELT ((NODE), 3) ! 677: #define TYPE_BINFO_VIRTUALS(NODE) BINFO_VIRTUALS (TYPE_BINFO (NODE)) ! 678: ! 679: /* A vector of additional binfos for the types inherited by this basetype. ! 680: ! 681: If this basetype describes type D as inherited in C, ! 682: and if the basetypes of D are E anf F, ! 683: then this vector contains binfos for inheritance of E and F by C. ! 684: ! 685: ??? This could probably be done by just allocating the ! 686: base types at the end of this TREE_VEC (instead of using ! 687: another TREE_VEC). This would simplify the calculation ! 688: of how many basetypes a given type had. */ ! 689: #define BINFO_BASETYPES(NODE) TREE_VEC_ELT ((NODE), 4) ! 690: #define TYPE_BINFO_BASETYPES(NODE) TREE_VEC_ELT (TYPE_BINFO (NODE), 4) ! 691: ! 692: /* For a BINFO record describing an inheritance, this yields a pointer ! 693: to the artificial FIELD_DECL node which contains the "virtual base ! 694: class pointer" for the given inheritance. */ ! 695: ! 696: #define BINFO_VPTR_FIELD(NODE) TREE_VEC_ELT ((NODE), 5) ! 697: ! 698: /* Accessor macro to get to the Nth basetype of this basetype. */ ! 699: #define BINFO_BASETYPE(NODE,N) TREE_VEC_ELT (BINFO_BASETYPES (NODE), (N)) ! 700: #define TYPE_BINFO_BASETYPE(NODE,N) BINFO_TYPE (TREE_VEC_ELT (BINFO_BASETYPES (TYPE_BINFO (NODE)), (N))) ! 701: ! 702: /* Slot used to build a chain that represents a use of inheritance. ! 703: For example, if X is derived from Y, and Y is derived from Z, ! 704: then this field can be used to link the binfo node for X to ! 705: the binfo node for X's Y to represent the use of inheritance ! 706: from X to Y. Similarly, this slot of the binfo node for X's Y ! 707: can point to the Z from which Y is inherited (in X's inheritance ! 708: hierarchy). In this fashion, one can represent and traverse specific ! 709: uses of inheritance using the binfo nodes themselves (instead of ! 710: consing new space pointing to binfo nodes). ! 711: It is up to the language-dependent front-ends to maintain ! 712: this information as necessary. */ ! 713: #define BINFO_INHERITANCE_CHAIN(NODE) TREE_VEC_ELT ((NODE), 0) ! 714: ! 715: /* Define fields and accessors for nodes representing declared names. */ ! 716: ! 717: /* This is the name of the object as written by the user. ! 718: It is an IDENTIFIER_NODE. */ ! 719: #define DECL_NAME(NODE) ((NODE)->decl.name) ! 720: /* This macro is marked for death. */ ! 721: #define DECL_PRINT_NAME(NODE) ((NODE)->decl.print_name) ! 722: /* This is the name of the object as the assembler will see it ! 723: (but before any translations made by ASM_OUTPUT_LABELREF). ! 724: Often this is the same as DECL_NAME. ! 725: It is an IDENTIFIER_NODE. */ ! 726: #define DECL_ASSEMBLER_NAME(NODE) ((NODE)->decl.assembler_name) ! 727: /* For FIELD_DECLs, this is the ! 728: RECORD_TYPE, UNION_TYPE, or QUAL_UNION_TYPE node that the field is ! 729: a member of. For VAR_DECL, PARM_DECL, FUNCTION_DECL, LABEL_DECL, ! 730: and CONST_DECL nodes, this points to the FUNCTION_DECL for the ! 731: containing function, or else yields NULL_TREE if the given decl has "file scope". */ ! 732: #define DECL_CONTEXT(NODE) ((NODE)->decl.context) ! 733: #define DECL_FIELD_CONTEXT(NODE) ((NODE)->decl.context) ! 734: /* In a FIELD_DECL, this is the field position, counting in bits, ! 735: of the bit closest to the beginning of the structure. */ ! 736: #define DECL_FIELD_BITPOS(NODE) ((NODE)->decl.arguments) ! 737: /* In a FIELD_DECL, this indicates whether the field was a bit-field and ! 738: if so, the type that was originally specified for it. ! 739: TREE_TYPE may have been modified (in finish_struct). */ ! 740: #define DECL_BIT_FIELD_TYPE(NODE) ((NODE)->decl.result) ! 741: /* In FUNCTION_DECL, a chain of ..._DECL nodes. */ ! 742: /* VAR_DECL and PARM_DECL reserve the arguments slot ! 743: for language-specific uses. */ ! 744: #define DECL_ARGUMENTS(NODE) ((NODE)->decl.arguments) ! 745: /* In FUNCTION_DECL, holds the decl for the return value. */ ! 746: #define DECL_RESULT(NODE) ((NODE)->decl.result) ! 747: /* In PARM_DECL, holds the type as written (perhaps a function or array). */ ! 748: #define DECL_ARG_TYPE_AS_WRITTEN(NODE) ((NODE)->decl.result) ! 749: /* For a FUNCTION_DECL, holds the tree of BINDINGs. ! 750: For a VAR_DECL, holds the initial value. ! 751: For a PARM_DECL, not used--default ! 752: values for parameters are encoded in the type of the function, ! 753: not in the PARM_DECL slot. */ ! 754: #define DECL_INITIAL(NODE) ((NODE)->decl.initial) ! 755: /* For a PARM_DECL, records the data type used to pass the argument, ! 756: which may be different from the type seen in the program. */ ! 757: #define DECL_ARG_TYPE(NODE) ((NODE)->decl.initial) /* In PARM_DECL. */ ! 758: /* For a FIELD_DECL in a QUAL_UNION_TYPE, records the expression, which ! 759: if nonzero, indicates that the field occupies the type. */ ! 760: #define DECL_QUALIFIER(NODE) ((NODE)->decl.initial) ! 761: /* These two fields describe where in the source code the declaration was. */ ! 762: #define DECL_SOURCE_FILE(NODE) ((NODE)->decl.filename) ! 763: #define DECL_SOURCE_LINE(NODE) ((NODE)->decl.linenum) ! 764: /* Holds the size of the datum, as a tree expression. ! 765: Need not be constant. */ ! 766: #define DECL_SIZE(NODE) ((NODE)->decl.size) ! 767: /* Holds the alignment required for the datum. */ ! 768: #define DECL_ALIGN(NODE) ((NODE)->decl.frame_size) ! 769: /* Holds the machine mode corresponding to the declaration of a variable or ! 770: field. Always equal to TYPE_MODE (TREE_TYPE (decl)) except for a ! 771: FIELD_DECL. */ ! 772: #define DECL_MODE(NODE) ((NODE)->decl.mode) ! 773: /* Holds the RTL expression for the value of a variable or function. If ! 774: PROMOTED_MODE is defined, the mode of this expression may not be same ! 775: as DECL_MODE. In that case, DECL_MODE contains the mode corresponding ! 776: to the variable's data type, while the mode ! 777: of DECL_RTL is the mode actually used to contain the data. */ ! 778: #define DECL_RTL(NODE) ((NODE)->decl.rtl) ! 779: /* For PARM_DECL, holds an RTL for the stack slot or register ! 780: where the data was actually passed. */ ! 781: #define DECL_INCOMING_RTL(NODE) ((NODE)->decl.saved_insns.r) ! 782: /* For FUNCTION_DECL, if it is inline, holds the saved insn chain. */ ! 783: #define DECL_SAVED_INSNS(NODE) ((NODE)->decl.saved_insns.r) ! 784: /* For FUNCTION_DECL, if it is inline, ! 785: holds the size of the stack frame, as an integer. */ ! 786: #define DECL_FRAME_SIZE(NODE) ((NODE)->decl.frame_size) ! 787: /* For FUNCTION_DECL, if it is built-in, ! 788: this identifies which built-in operation it is. */ ! 789: #define DECL_FUNCTION_CODE(NODE) \ ! 790: ((enum built_in_function) (NODE)->decl.frame_size) ! 791: #define DECL_SET_FUNCTION_CODE(NODE,VAL) \ ! 792: ((NODE)->decl.frame_size = (int) (VAL)) ! 793: /* For a FIELD_DECL, holds the size of the member as an integer. */ ! 794: #define DECL_FIELD_SIZE(NODE) ((NODE)->decl.saved_insns.i) ! 795: ! 796: /* The DECL_VINDEX is used for FUNCTION_DECLS in two different ways. ! 797: Before the struct containing the FUNCTION_DECL is laid out, ! 798: DECL_VINDEX may point to a FUNCTION_DECL in a base class which ! 799: is the FUNCTION_DECL which this FUNCTION_DECL will replace as a virtual ! 800: function. When the class is laid out, this pointer is changed ! 801: to an INTEGER_CST node which is suitable for use as an index ! 802: into the virtual function table. */ ! 803: #define DECL_VINDEX(NODE) ((NODE)->decl.vindex) ! 804: /* For FIELD_DECLS, DECL_FCONTEXT is the *first* baseclass in ! 805: which this FIELD_DECL is defined. This information is needed when ! 806: writing debugging information about vfield and vbase decls for C++. */ ! 807: #define DECL_FCONTEXT(NODE) ((NODE)->decl.vindex) ! 808: ! 809: /* Every ..._DECL node gets a unique number. */ ! 810: #define DECL_UID(NODE) ((NODE)->decl.uid) ! 811: ! 812: /* For any sort of a ..._DECL node, this points to the original (abstract) ! 813: decl node which this decl is an instance of, or else it is NULL indicating ! 814: that this decl is not an instance of some other decl. */ ! 815: #define DECL_ABSTRACT_ORIGIN(NODE) ((NODE)->decl.abstract_origin) ! 816: ! 817: /* Nonzero for any sort of ..._DECL node means this decl node represents ! 818: an inline instance of some original (abstract) decl from an inline function; ! 819: suppress any warnings about shadowing some other variable. */ ! 820: #define DECL_FROM_INLINE(NODE) (DECL_ABSTRACT_ORIGIN (NODE) != (tree) 0) ! 821: ! 822: /* Nonzero if a _DECL means that the name of this decl should be ignored ! 823: for symbolic debug purposes. */ ! 824: #define DECL_IGNORED_P(NODE) ((NODE)->decl.ignored_flag) ! 825: ! 826: /* Nonzero for a given ..._DECL node means that this node represents an ! 827: "abstract instance" of the given declaration (e.g. in the original ! 828: declaration of an inline function). When generating symbolic debugging ! 829: information, we musn't try to generate any address information for nodes ! 830: marked as "abstract instances" because we don't actually generate ! 831: any code or allocate any data space for such instances. */ ! 832: #define DECL_ABSTRACT(NODE) ((NODE)->decl.abstract_flag) ! 833: ! 834: /* Nonzero if a _DECL means that no warnings should be generated just ! 835: because this decl is unused. */ ! 836: #define DECL_IN_SYSTEM_HEADER(NODE) ((NODE)->decl.in_system_header_flag) ! 837: ! 838: /* Language-specific decl information. */ ! 839: #define DECL_LANG_SPECIFIC(NODE) ((NODE)->decl.lang_specific) ! 840: ! 841: /* In a VAR_DECL or FUNCTION_DECL, ! 842: nonzero means external reference: ! 843: do not allocate storage, and refer to a definition elsewhere. */ ! 844: #define DECL_EXTERNAL(NODE) ((NODE)->decl.external_flag) ! 845: ! 846: /* In VAR_DECL and PARM_DECL nodes, nonzero means declared `register'. ! 847: In LABEL_DECL nodes, nonzero means that an error message about ! 848: jumping into such a binding contour has been printed for this label. */ ! 849: #define DECL_REGISTER(NODE) ((NODE)->decl.regdecl_flag) ! 850: /* In a FIELD_DECL, indicates this field should be bit-packed. */ ! 851: #define DECL_PACKED(NODE) ((NODE)->decl.regdecl_flag) ! 852: ! 853: /* Nonzero in a ..._DECL means this variable is ref'd from a nested function. ! 854: For VAR_DECL nodes, PARM_DECL nodes, and FUNCTION_DECL nodes. ! 855: ! 856: For LABEL_DECL nodes, nonzero if nonlocal gotos to the label are permitted. ! 857: ! 858: Also set in some languages for variables, etc., outside the normal ! 859: lexical scope, such as class instance variables. */ ! 860: #define DECL_NONLOCAL(NODE) ((NODE)->decl.nonlocal_flag) ! 861: ! 862: /* Nonzero in a FUNCTION_DECL means this function can be substituted ! 863: where it is called. */ ! 864: #define DECL_INLINE(NODE) ((NODE)->decl.inline_flag) ! 865: ! 866: /* Nonzero in a FUNCTION_DECL means this is a built-in function ! 867: that is not specified by ansi C and that users are supposed to be allowed ! 868: to redefine for any purpose whatever. */ ! 869: #define DECL_BUILT_IN_NONANSI(NODE) ((NODE)->common.unsigned_flag) ! 870: ! 871: /* Nonzero in a FIELD_DECL means it is a bit field, and must be accessed ! 872: specially. */ ! 873: #define DECL_BIT_FIELD(NODE) ((NODE)->decl.bit_field_flag) ! 874: /* In a LABEL_DECL, nonzero means label was defined inside a binding ! 875: contour that restored a stack level and which is now exited. */ ! 876: #define DECL_TOO_LATE(NODE) ((NODE)->decl.bit_field_flag) ! 877: /* In a FUNCTION_DECL, nonzero means a built in function. */ ! 878: #define DECL_BUILT_IN(NODE) ((NODE)->decl.bit_field_flag) ! 879: /* In a VAR_DECL that's static, ! 880: nonzero if the space is in the text section. */ ! 881: #define DECL_IN_TEXT_SECTION(NODE) ((NODE)->decl.bit_field_flag) ! 882: ! 883: /* Used in VAR_DECLs to indicate that the variable is a vtable. ! 884: It is also used in FIELD_DECLs for vtable pointers. */ ! 885: #define DECL_VIRTUAL_P(NODE) ((NODE)->decl.virtual_flag) ! 886: ! 887: /* Additional flags for language-specific uses. */ ! 888: #define DECL_LANG_FLAG_0(NODE) ((NODE)->decl.lang_flag_0) ! 889: #define DECL_LANG_FLAG_1(NODE) ((NODE)->decl.lang_flag_1) ! 890: #define DECL_LANG_FLAG_2(NODE) ((NODE)->decl.lang_flag_2) ! 891: #define DECL_LANG_FLAG_3(NODE) ((NODE)->decl.lang_flag_3) ! 892: #define DECL_LANG_FLAG_4(NODE) ((NODE)->decl.lang_flag_4) ! 893: #define DECL_LANG_FLAG_5(NODE) ((NODE)->decl.lang_flag_5) ! 894: #define DECL_LANG_FLAG_6(NODE) ((NODE)->decl.lang_flag_6) ! 895: #define DECL_LANG_FLAG_7(NODE) ((NODE)->decl.lang_flag_7) ! 896: ! 897: struct tree_decl ! 898: { ! 899: char common[sizeof (struct tree_common)]; ! 900: char *filename; ! 901: int linenum; ! 902: union tree_node *size; ! 903: unsigned int uid; ! 904: #ifdef ONLY_INT_FIELDS ! 905: int mode : 8; ! 906: #else ! 907: enum machine_mode mode : 8; ! 908: #endif ! 909: ! 910: unsigned external_flag : 1; ! 911: unsigned nonlocal_flag : 1; ! 912: unsigned regdecl_flag : 1; ! 913: unsigned inline_flag : 1; ! 914: unsigned bit_field_flag : 1; ! 915: unsigned virtual_flag : 1; ! 916: unsigned ignored_flag : 1; ! 917: unsigned abstract_flag : 1; ! 918: ! 919: unsigned in_system_header_flag : 1; ! 920: /* room for seven more */ ! 921: ! 922: unsigned lang_flag_0 : 1; ! 923: unsigned lang_flag_1 : 1; ! 924: unsigned lang_flag_2 : 1; ! 925: unsigned lang_flag_3 : 1; ! 926: unsigned lang_flag_4 : 1; ! 927: unsigned lang_flag_5 : 1; ! 928: unsigned lang_flag_6 : 1; ! 929: unsigned lang_flag_7 : 1; ! 930: ! 931: union tree_node *name; ! 932: union tree_node *context; ! 933: union tree_node *arguments; ! 934: union tree_node *result; ! 935: union tree_node *initial; ! 936: union tree_node *abstract_origin; ! 937: /* The PRINT_NAME field is marked for death. */ ! 938: char *print_name; ! 939: union tree_node *assembler_name; ! 940: struct rtx_def *rtl; /* acts as link to register transfer language ! 941: (rtl) info */ ! 942: /* For a FUNCTION_DECL, if inline, this is the size of frame needed. ! 943: If built-in, this is the code for which built-in function. ! 944: For other kinds of decls, this is DECL_ALIGN. */ ! 945: int frame_size; ! 946: /* For FUNCTION_DECLs: points to insn that constitutes its definition ! 947: on the permanent obstack. For any other kind of decl, this is the ! 948: alignment. */ ! 949: union { ! 950: struct rtx_def *r; ! 951: int i; ! 952: } saved_insns; ! 953: union tree_node *vindex; ! 954: /* Points to a structure whose details depend on the language in use. */ ! 955: struct lang_decl *lang_specific; ! 956: }; ! 957: ! 958: /* Define the overall contents of a tree node. ! 959: It may be any of the structures declared above ! 960: for various types of node. */ ! 961: ! 962: union tree_node ! 963: { ! 964: struct tree_common common; ! 965: struct tree_int_cst int_cst; ! 966: struct tree_real_cst real_cst; ! 967: struct tree_string string; ! 968: struct tree_complex complex; ! 969: struct tree_identifier identifier; ! 970: struct tree_decl decl; ! 971: struct tree_type type; ! 972: struct tree_list list; ! 973: struct tree_vec vec; ! 974: struct tree_exp exp; ! 975: struct tree_block block; ! 976: }; ! 977: ! 978: /* Add prototype support. */ ! 979: #ifndef PROTO ! 980: #if defined (USE_PROTOTYPES) ? USE_PROTOTYPES : defined (__STDC__) ! 981: #define PROTO(ARGS) ARGS ! 982: #else ! 983: #define PROTO(ARGS) () ! 984: #endif ! 985: #endif ! 986: ! 987: ! 988: #define NULL_TREE (tree) NULL ! 989: ! 990: /* Define a generic NULL if one hasn't already been defined. */ ! 991: ! 992: #ifndef NULL ! 993: #define NULL 0 ! 994: #endif ! 995: ! 996: #ifndef GENERIC_PTR ! 997: #if defined (USE_PROTOTYPES) ? USE_PROTOTYPES : defined (__STDC__) ! 998: #define GENERIC_PTR void * ! 999: #else ! 1000: #define GENERIC_PTR char * ! 1001: #endif ! 1002: #endif ! 1003: ! 1004: #ifndef NULL_PTR ! 1005: #define NULL_PTR ((GENERIC_PTR)0) ! 1006: #endif ! 1007: ! 1008: /* The following functions accept a wide integer argument. Rather than ! 1009: having to cast on every function call, we use a macro instead, that is ! 1010: defined here and in rtl.h. */ ! 1011: ! 1012: #ifndef exact_log2 ! 1013: #define exact_log2(N) exact_log2_wide ((HOST_WIDE_INT) (N)) ! 1014: #define floor_log2(N) floor_log2_wide ((HOST_WIDE_INT) (N)) ! 1015: #endif ! 1016: ! 1017: #if 0 ! 1018: /* At present, don't prototype xrealloc, since all of the callers don't ! 1019: cast their pointers to char *, and all of the xrealloc's don't use ! 1020: void * yet. */ ! 1021: extern char *xmalloc PROTO((size_t)); ! 1022: extern char *xrealloc PROTO((void *, size_t)); ! 1023: #else ! 1024: extern char *xmalloc (); ! 1025: extern char *xrealloc (); ! 1026: #endif ! 1027: ! 1028: extern char *oballoc PROTO((int)); ! 1029: extern char *permalloc PROTO((int)); ! 1030: extern char *savealloc PROTO((int)); ! 1031: extern void free PROTO((void *)); ! 1032: ! 1033: /* Lowest level primitive for allocating a node. ! 1034: The TREE_CODE is the only argument. Contents are initialized ! 1035: to zero except for a few of the common fields. */ ! 1036: ! 1037: extern tree make_node PROTO((enum tree_code)); ! 1038: ! 1039: /* Make a copy of a node, with all the same contents except ! 1040: for TREE_PERMANENT. (The copy is permanent ! 1041: iff nodes being made now are permanent.) */ ! 1042: ! 1043: extern tree copy_node PROTO((tree)); ! 1044: ! 1045: /* Make a copy of a chain of TREE_LIST nodes. */ ! 1046: ! 1047: extern tree copy_list PROTO((tree)); ! 1048: ! 1049: /* Make a TREE_VEC. */ ! 1050: ! 1051: extern tree make_tree_vec PROTO((int)); ! 1052: ! 1053: /* Return the (unique) IDENTIFIER_NODE node for a given name. ! 1054: The name is supplied as a char *. */ ! 1055: ! 1056: extern tree get_identifier PROTO((char *)); ! 1057: ! 1058: /* Construct various types of nodes. */ ! 1059: ! 1060: #define build_int_2(LO,HI) \ ! 1061: build_int_2_wide ((HOST_WIDE_INT) (LO), (HOST_WIDE_INT) (HI)) ! 1062: ! 1063: #if 0 ! 1064: /* We cannot define prototypes for the variable argument functions, ! 1065: since they have not been ANSI-fied, and an ANSI compiler would ! 1066: complain when compiling the definition of these functions. */ ! 1067: ! 1068: extern tree build PROTO((enum tree_code, tree, ...)); ! 1069: extern tree build_nt PROTO((enum tree_code, ...)); ! 1070: extern tree build_parse_node PROTO((enum tree_code, ...)); ! 1071: #else ! 1072: extern tree build (); ! 1073: extern tree build_nt (); ! 1074: extern tree build_parse_node (); ! 1075: #endif ! 1076: ! 1077: extern tree build_int_2_wide PROTO((HOST_WIDE_INT, HOST_WIDE_INT)); ! 1078: extern tree build_real PROTO((tree, REAL_VALUE_TYPE)); ! 1079: extern tree build_real_from_int_cst PROTO((tree, tree)); ! 1080: extern tree build_complex PROTO((tree, tree)); ! 1081: extern tree build_string PROTO((int, char *)); ! 1082: extern tree build1 PROTO((enum tree_code, tree, tree)); ! 1083: extern tree build_tree_list PROTO((tree, tree)); ! 1084: extern tree build_decl_list PROTO((tree, tree)); ! 1085: extern tree build_decl PROTO((enum tree_code, tree, tree)); ! 1086: extern tree build_block PROTO((tree, tree, tree, tree, tree)); ! 1087: ! 1088: /* Construct various nodes representing data types. */ ! 1089: ! 1090: extern tree make_signed_type PROTO((int)); ! 1091: extern tree make_unsigned_type PROTO((int)); ! 1092: extern tree signed_or_unsigned_type PROTO((int, tree)); ! 1093: extern void fixup_unsigned_type PROTO((tree)); ! 1094: extern tree build_pointer_type PROTO((tree)); ! 1095: extern tree build_reference_type PROTO((tree)); ! 1096: extern tree build_index_type PROTO((tree)); ! 1097: extern tree build_index_2_type PROTO((tree, tree)); ! 1098: extern tree build_array_type PROTO((tree, tree)); ! 1099: extern tree build_function_type PROTO((tree, tree)); ! 1100: extern tree build_method_type PROTO((tree, tree)); ! 1101: extern tree build_offset_type PROTO((tree, tree)); ! 1102: extern tree build_complex_type PROTO((tree)); ! 1103: extern tree array_type_nelts PROTO((tree)); ! 1104: ! 1105: extern tree value_member PROTO((tree, tree)); ! 1106: extern tree purpose_member PROTO((tree, tree)); ! 1107: extern tree binfo_member PROTO((tree, tree)); ! 1108: extern int tree_int_cst_equal PROTO((tree, tree)); ! 1109: extern int tree_int_cst_lt PROTO((tree, tree)); ! 1110: extern int index_type_equal PROTO((tree, tree)); ! 1111: ! 1112: /* From expmed.c. Since rtl.h is included after tree.h, we can't ! 1113: put the prototype here. Rtl.h does declare the prototype if ! 1114: tree.h had been included. */ ! 1115: ! 1116: extern tree make_tree (); ! 1117: ! 1118: /* Given a type node TYPE, and CONSTP and VOLATILEP, return a type ! 1119: for the same kind of data as TYPE describes. ! 1120: Variants point to the "main variant" (which has neither CONST nor VOLATILE) ! 1121: via TYPE_MAIN_VARIANT, and it points to a chain of other variants ! 1122: so that duplicate variants are never made. ! 1123: Only main variants should ever appear as types of expressions. */ ! 1124: ! 1125: extern tree build_type_variant PROTO((tree, int, int)); ! 1126: ! 1127: /* Make a copy of a type node. */ ! 1128: ! 1129: extern tree build_type_copy PROTO((tree)); ! 1130: ! 1131: /* Given a ..._TYPE node, calculate the TYPE_SIZE, TYPE_SIZE_UNIT, ! 1132: TYPE_ALIGN and TYPE_MODE fields. ! 1133: If called more than once on one node, does nothing except ! 1134: for the first time. */ ! 1135: ! 1136: extern void layout_type PROTO((tree)); ! 1137: ! 1138: /* Given a hashcode and a ..._TYPE node (for which the hashcode was made), ! 1139: return a canonicalized ..._TYPE node, so that duplicates are not made. ! 1140: How the hash code is computed is up to the caller, as long as any two ! 1141: callers that could hash identical-looking type nodes agree. */ ! 1142: ! 1143: extern tree type_hash_canon PROTO((int, tree)); ! 1144: ! 1145: /* Given a VAR_DECL, PARM_DECL, RESULT_DECL or FIELD_DECL node, ! 1146: calculates the DECL_SIZE, DECL_SIZE_UNIT, DECL_ALIGN and DECL_MODE ! 1147: fields. Call this only once for any given decl node. ! 1148: ! 1149: Second argument is the boundary that this field can be assumed to ! 1150: be starting at (in bits). Zero means it can be assumed aligned ! 1151: on any boundary that may be needed. */ ! 1152: ! 1153: extern void layout_decl PROTO((tree, unsigned)); ! 1154: ! 1155: /* Return an expr equal to X but certainly not valid as an lvalue. */ ! 1156: ! 1157: extern tree non_lvalue PROTO((tree)); ! 1158: extern tree pedantic_non_lvalue PROTO((tree)); ! 1159: ! 1160: extern tree convert PROTO((tree, tree)); ! 1161: extern tree size_in_bytes PROTO((tree)); ! 1162: extern int int_size_in_bytes PROTO((tree)); ! 1163: extern tree size_binop PROTO((enum tree_code, tree, tree)); ! 1164: extern tree size_int PROTO((unsigned)); ! 1165: extern tree round_up PROTO((tree, int)); ! 1166: extern tree get_pending_sizes PROTO((void)); ! 1167: ! 1168: /* Type for sizes of data-type. */ ! 1169: ! 1170: extern tree sizetype; ! 1171: ! 1172: /* Concatenate two lists (chains of TREE_LIST nodes) X and Y ! 1173: by making the last node in X point to Y. ! 1174: Returns X, except if X is 0 returns Y. */ ! 1175: ! 1176: extern tree chainon PROTO((tree, tree)); ! 1177: ! 1178: /* Make a new TREE_LIST node from specified PURPOSE, VALUE and CHAIN. */ ! 1179: ! 1180: extern tree tree_cons PROTO((tree, tree, tree)); ! 1181: extern tree perm_tree_cons PROTO((tree, tree, tree)); ! 1182: extern tree temp_tree_cons PROTO((tree, tree, tree)); ! 1183: extern tree saveable_tree_cons PROTO((tree, tree, tree)); ! 1184: extern tree decl_tree_cons PROTO((tree, tree, tree)); ! 1185: ! 1186: /* Return the last tree node in a chain. */ ! 1187: ! 1188: extern tree tree_last PROTO((tree)); ! 1189: ! 1190: /* Reverse the order of elements in a chain, and return the new head. */ ! 1191: ! 1192: extern tree nreverse PROTO((tree)); ! 1193: ! 1194: /* Returns the length of a chain of nodes ! 1195: (number of chain pointers to follow before reaching a null pointer). */ ! 1196: ! 1197: extern int list_length PROTO((tree)); ! 1198: ! 1199: /* integer_zerop (tree x) is nonzero if X is an integer constant of value 0 */ ! 1200: ! 1201: extern int integer_zerop PROTO((tree)); ! 1202: ! 1203: /* integer_onep (tree x) is nonzero if X is an integer constant of value 1 */ ! 1204: ! 1205: extern int integer_onep PROTO((tree)); ! 1206: ! 1207: /* integer_all_onesp (tree x) is nonzero if X is an integer constant ! 1208: all of whose significant bits are 1. */ ! 1209: ! 1210: extern int integer_all_onesp PROTO((tree)); ! 1211: ! 1212: /* integer_pow2p (tree x) is nonzero is X is an integer constant with ! 1213: exactly one bit 1. */ ! 1214: ! 1215: extern int integer_pow2p PROTO((tree)); ! 1216: ! 1217: /* staticp (tree x) is nonzero if X is a reference to data allocated ! 1218: at a fixed address in memory. */ ! 1219: ! 1220: extern int staticp PROTO((tree)); ! 1221: ! 1222: /* Gets an error if argument X is not an lvalue. ! 1223: Also returns 1 if X is an lvalue, 0 if not. */ ! 1224: ! 1225: extern int lvalue_or_else PROTO((tree, char *)); ! 1226: ! 1227: /* save_expr (EXP) returns an expression equivalent to EXP ! 1228: but it can be used multiple times within context CTX ! 1229: and only evaluate EXP once. */ ! 1230: ! 1231: extern tree save_expr PROTO((tree)); ! 1232: ! 1233: /* Return 1 if EXP contains a PLACEHOLDER_EXPR; i.e., if it represents a size ! 1234: or offset that depends on a field within a record. ! 1235: ! 1236: Note that we only allow such expressions within simple arithmetic ! 1237: or a COND_EXPR. */ ! 1238: ! 1239: extern int contains_placeholder_p PROTO((tree)); ! 1240: ! 1241: /* Given a tree EXP, a FIELD_DECL F, and a replacement value R, ! 1242: return a tree with all occurrences of references to F in a ! 1243: PLACEHOLDER_EXPR replaced by R. Note that we assume here that EXP ! 1244: contains only arithmetic expressions. */ ! 1245: ! 1246: extern tree substitute_in_expr PROTO((tree, tree, tree)); ! 1247: ! 1248: /* Given a type T, a FIELD_DECL F, and a replacement value R, ! 1249: return a new type with all size expressions that contain F ! 1250: updated by replacing the reference to F with R. */ ! 1251: ! 1252: extern tree substitute_in_type PROTO((tree, tree, tree)); ! 1253: ! 1254: /* variable_size (EXP) is like save_expr (EXP) except that it ! 1255: is for the special case of something that is part of a ! 1256: variable size for a data type. It makes special arrangements ! 1257: to compute the value at the right time when the data type ! 1258: belongs to a function parameter. */ ! 1259: ! 1260: extern tree variable_size PROTO((tree)); ! 1261: ! 1262: /* stabilize_reference (EXP) returns an reference equivalent to EXP ! 1263: but it can be used multiple times ! 1264: and only evaluate the subexpressions once. */ ! 1265: ! 1266: extern tree stabilize_reference PROTO((tree)); ! 1267: ! 1268: /* Return EXP, stripped of any conversions to wider types ! 1269: in such a way that the result of converting to type FOR_TYPE ! 1270: is the same as if EXP were converted to FOR_TYPE. ! 1271: If FOR_TYPE is 0, it signifies EXP's type. */ ! 1272: ! 1273: extern tree get_unwidened PROTO((tree, tree)); ! 1274: ! 1275: /* Return OP or a simpler expression for a narrower value ! 1276: which can be sign-extended or zero-extended to give back OP. ! 1277: Store in *UNSIGNEDP_PTR either 1 if the value should be zero-extended ! 1278: or 0 if the value should be sign-extended. */ ! 1279: ! 1280: extern tree get_narrower PROTO((tree, int *)); ! 1281: ! 1282: /* Given MODE and UNSIGNEDP, return a suitable type-tree ! 1283: with that mode. ! 1284: The definition of this resides in language-specific code ! 1285: as the repertoire of available types may vary. */ ! 1286: ! 1287: extern tree type_for_mode PROTO((enum machine_mode, int)); ! 1288: ! 1289: /* Given PRECISION and UNSIGNEDP, return a suitable type-tree ! 1290: for an integer type with at least that precision. ! 1291: The definition of this resides in language-specific code ! 1292: as the repertoire of available types may vary. */ ! 1293: ! 1294: extern tree type_for_size PROTO((unsigned, int)); ! 1295: ! 1296: /* Given an integer type T, return a type like T but unsigned. ! 1297: If T is unsigned, the value is T. ! 1298: The definition of this resides in language-specific code ! 1299: as the repertoire of available types may vary. */ ! 1300: ! 1301: extern tree unsigned_type PROTO((tree)); ! 1302: ! 1303: /* Given an integer type T, return a type like T but signed. ! 1304: If T is signed, the value is T. ! 1305: The definition of this resides in language-specific code ! 1306: as the repertoire of available types may vary. */ ! 1307: ! 1308: extern tree signed_type PROTO((tree)); ! 1309: ! 1310: /* This function must be defined in the language-specific files. ! 1311: expand_expr calls it to build the cleanup-expression for a TARGET_EXPR. ! 1312: This is defined in a language-specific file. */ ! 1313: ! 1314: extern tree maybe_build_cleanup PROTO((tree)); ! 1315: ! 1316: /* Given an expression EXP that may be a COMPONENT_REF or an ARRAY_REF, ! 1317: look for nested component-refs or array-refs at constant positions ! 1318: and find the ultimate containing object, which is returned. */ ! 1319: ! 1320: extern tree get_inner_reference PROTO((tree, int *, int *, tree *, enum machine_mode *, int *, int *)); ! 1321: ! 1322: /* Return the FUNCTION_DECL which provides this _DECL with its context, ! 1323: or zero if none. */ ! 1324: extern tree decl_function_context PROTO((tree)); ! 1325: ! 1326: /* Return the RECORD_TYPE, UNION_TYPE, or QUAL_UNION_TYPE which provides ! 1327: this _DECL with its context, or zero if none. */ ! 1328: extern tree decl_type_context PROTO((tree)); ! 1329: ! 1330: /* Given the FUNCTION_DECL for the current function, ! 1331: return zero if it is ok for this function to be inline. ! 1332: Otherwise return a warning message with a single %s ! 1333: for the function's name. */ ! 1334: ! 1335: extern char *function_cannot_inline_p PROTO((tree)); ! 1336: ! 1337: /* Return 1 if EXPR is the real constant zero. */ ! 1338: extern int real_zerop PROTO((tree)); ! 1339: ! 1340: /* Declare commonly used variables for tree structure. */ ! 1341: ! 1342: /* An integer constant with value 0 */ ! 1343: extern tree integer_zero_node; ! 1344: ! 1345: /* An integer constant with value 1 */ ! 1346: extern tree integer_one_node; ! 1347: ! 1348: /* An integer constant with value 0 whose type is sizetype. */ ! 1349: extern tree size_zero_node; ! 1350: ! 1351: /* An integer constant with value 1 whose type is sizetype. */ ! 1352: extern tree size_one_node; ! 1353: ! 1354: /* A constant of type pointer-to-int and value 0 */ ! 1355: extern tree null_pointer_node; ! 1356: ! 1357: /* A node of type ERROR_MARK. */ ! 1358: extern tree error_mark_node; ! 1359: ! 1360: /* The type node for the void type. */ ! 1361: extern tree void_type_node; ! 1362: ! 1363: /* The type node for the ordinary (signed) integer type. */ ! 1364: extern tree integer_type_node; ! 1365: ! 1366: /* The type node for the unsigned integer type. */ ! 1367: extern tree unsigned_type_node; ! 1368: ! 1369: /* The type node for the ordinary character type. */ ! 1370: extern tree char_type_node; ! 1371: ! 1372: /* Points to the name of the input file from which the current input ! 1373: being parsed originally came (before it went into cpp). */ ! 1374: extern char *input_filename; ! 1375: ! 1376: /* Current line number in input file. */ ! 1377: extern int lineno; ! 1378: ! 1379: /* Nonzero for -pedantic switch: warn about anything ! 1380: that standard C forbids. */ ! 1381: extern int pedantic; ! 1382: ! 1383: /* Nonzero means can safely call expand_expr now; ! 1384: otherwise layout_type puts variable sizes onto `pending_sizes' instead. */ ! 1385: ! 1386: extern int immediate_size_expand; ! 1387: ! 1388: /* Points to the FUNCTION_DECL of the function whose body we are reading. */ ! 1389: ! 1390: extern tree current_function_decl; ! 1391: ! 1392: /* Nonzero if function being compiled can call setjmp. */ ! 1393: ! 1394: extern int current_function_calls_setjmp; ! 1395: ! 1396: /* Nonzero if function being compiled can call longjmp. */ ! 1397: ! 1398: extern int current_function_calls_longjmp; ! 1399: ! 1400: /* Nonzero means all ..._TYPE nodes should be allocated permanently. */ ! 1401: ! 1402: extern int all_types_permanent; ! 1403: ! 1404: /* Pointer to function to compute the name to use to print a declaration. */ ! 1405: ! 1406: extern char *(*decl_printable_name) (); ! 1407: ! 1408: /* Pointer to function to finish handling an incomplete decl at the ! 1409: end of compilation. */ ! 1410: ! 1411: extern void (*incomplete_decl_finalize_hook) (); ! 1412: ! 1413: /* In tree.c */ ! 1414: extern char *perm_calloc PROTO((int, long)); ! 1415: ! 1416: /* In stmt.c */ ! 1417: ! 1418: extern tree expand_start_stmt_expr PROTO((void)); ! 1419: extern tree expand_end_stmt_expr PROTO((tree)); ! 1420: extern void expand_expr_stmt PROTO((tree)); ! 1421: extern void expand_decl_init PROTO((tree)); ! 1422: extern void clear_last_expr PROTO((void)); ! 1423: extern void expand_label PROTO((tree)); ! 1424: extern void expand_goto PROTO((tree)); ! 1425: extern void expand_asm PROTO((tree)); ! 1426: extern void expand_start_cond PROTO((tree, int)); ! 1427: extern void expand_end_cond PROTO((void)); ! 1428: extern void expand_start_else PROTO((void)); ! 1429: extern void expand_start_elseif PROTO((tree)); ! 1430: extern struct nesting *expand_start_loop PROTO((int)); ! 1431: extern struct nesting *expand_start_loop_continue_elsewhere PROTO((int)); ! 1432: extern void expand_loop_continue_here PROTO((void)); ! 1433: extern void expand_end_loop PROTO((void)); ! 1434: extern int expand_continue_loop PROTO((struct nesting *)); ! 1435: extern int expand_exit_loop PROTO((struct nesting *)); ! 1436: extern int expand_exit_loop_if_false PROTO((struct nesting *, tree)); ! 1437: extern int expand_exit_something PROTO((void)); ! 1438: ! 1439: extern void expand_null_return PROTO((void)); ! 1440: extern void expand_return PROTO((tree)); ! 1441: extern void expand_start_bindings PROTO((int)); ! 1442: extern void expand_end_bindings PROTO((tree, int, int)); ! 1443: extern tree last_cleanup_this_contour PROTO((void)); ! 1444: extern void expand_start_case PROTO((int, tree, tree, char *)); ! 1445: extern void expand_end_case PROTO((tree)); ! 1446: extern int pushcase PROTO((tree, tree (*) (tree, tree), tree, tree *)); ! 1447: extern int pushcase_range PROTO((tree, tree, tree (*) (tree, tree), tree, tree *)); ! 1448: ! 1449: /* In fold-const.c */ ! 1450: ! 1451: /* Fold constants as much as possible in an expression. ! 1452: Returns the simplified expression. ! 1453: Acts only on the top level of the expression; ! 1454: if the argument itself cannot be simplified, its ! 1455: subexpressions are not changed. */ ! 1456: ! 1457: extern tree fold PROTO((tree)); ! 1458: ! 1459: extern int force_fit_type PROTO((tree, int)); ! 1460: extern int add_double PROTO((HOST_WIDE_INT, HOST_WIDE_INT, ! 1461: HOST_WIDE_INT, HOST_WIDE_INT, ! 1462: HOST_WIDE_INT *, HOST_WIDE_INT *)); ! 1463: extern int neg_double PROTO((HOST_WIDE_INT, HOST_WIDE_INT, ! 1464: HOST_WIDE_INT *, HOST_WIDE_INT *)); ! 1465: extern int mul_double PROTO((HOST_WIDE_INT, HOST_WIDE_INT, ! 1466: HOST_WIDE_INT, HOST_WIDE_INT, ! 1467: HOST_WIDE_INT *, HOST_WIDE_INT *)); ! 1468: extern void lshift_double PROTO((HOST_WIDE_INT, HOST_WIDE_INT, ! 1469: HOST_WIDE_INT, int, HOST_WIDE_INT *, ! 1470: HOST_WIDE_INT *, int)); ! 1471: extern void rshift_double PROTO((HOST_WIDE_INT, HOST_WIDE_INT, ! 1472: HOST_WIDE_INT, int, ! 1473: HOST_WIDE_INT *, HOST_WIDE_INT *, int)); ! 1474: extern void lrotate_double PROTO((HOST_WIDE_INT, HOST_WIDE_INT, ! 1475: HOST_WIDE_INT, int, HOST_WIDE_INT *, ! 1476: HOST_WIDE_INT *)); ! 1477: extern void rrotate_double PROTO((HOST_WIDE_INT, HOST_WIDE_INT, ! 1478: HOST_WIDE_INT, int, HOST_WIDE_INT *, ! 1479: HOST_WIDE_INT *)); ! 1480: extern int operand_equal_p PROTO((tree, tree, int)); ! 1481: extern tree invert_truthvalue PROTO((tree)); ! 1482: ! 1483: /* The language front-end must define these functions. */ ! 1484: ! 1485: /* Function of no arguments for initializing lexical scanning. */ ! 1486: extern void init_lex PROTO((void)); ! 1487: /* Function of no arguments for initializing the symbol table. */ ! 1488: extern void init_decl_processing PROTO((void)); ! 1489: ! 1490: /* Functions called with no arguments at the beginning and end or processing ! 1491: the input source file. */ ! 1492: extern void lang_init PROTO((void)); ! 1493: extern void lang_finish PROTO((void)); ! 1494: ! 1495: /* Funtion to identify which front-end produced the output file. */ ! 1496: extern char *lang_identify PROTO((void)); ! 1497: ! 1498: /* Function called with no arguments to parse and compile the input. */ ! 1499: extern int yyparse PROTO((void)); ! 1500: /* Function called with option as argument ! 1501: to decode options starting with -f or -W or +. ! 1502: It should return nonzero if it handles the option. */ ! 1503: extern int lang_decode_option PROTO((char *)); ! 1504: ! 1505: /* Functions for processing symbol declarations. */ ! 1506: /* Function to enter a new lexical scope. ! 1507: Takes one argument: always zero when called from outside the front end. */ ! 1508: extern void pushlevel PROTO((int)); ! 1509: /* Function to exit a lexical scope. It returns a BINDING for that scope. ! 1510: Takes three arguments: ! 1511: KEEP -- nonzero if there were declarations in this scope. ! 1512: REVERSE -- reverse the order of decls before returning them. ! 1513: FUNCTIONBODY -- nonzero if this level is the body of a function. */ ! 1514: extern tree poplevel PROTO((int, int, int)); ! 1515: /* Set the BLOCK node for the current scope level. */ ! 1516: extern void set_block PROTO((tree)); ! 1517: /* Function to add a decl to the current scope level. ! 1518: Takes one argument, a decl to add. ! 1519: Returns that decl, or, if the same symbol is already declared, may ! 1520: return a different decl for that name. */ ! 1521: extern tree pushdecl PROTO((tree)); ! 1522: /* Function to return the chain of decls so far in the current scope level. */ ! 1523: extern tree getdecls PROTO((void)); ! 1524: /* Function to return the chain of structure tags in the current scope level. */ ! 1525: extern tree gettags PROTO((void)); ! 1526: ! 1527: extern tree build_range_type PROTO((tree, tree, tree)); ! 1528: ! 1529: /* Call when starting to parse a declaration: ! 1530: make expressions in the declaration last the length of the function. ! 1531: Returns an argument that should be passed to resume_momentary later. */ ! 1532: extern int suspend_momentary PROTO((void)); ! 1533: ! 1534: extern int allocation_temporary_p PROTO((void)); ! 1535: ! 1536: /* Call when finished parsing a declaration: ! 1537: restore the treatment of node-allocation that was ! 1538: in effect before the suspension. ! 1539: YES should be the value previously returned by suspend_momentary. */ ! 1540: extern void resume_momentary PROTO((int)); ! 1541: ! 1542: /* Called after finishing a record, union or enumeral type. */ ! 1543: extern void rest_of_type_compilation PROTO((tree, int)); ! 1544: ! 1545: /* Save the current set of obstacks, but don't change them. */ ! 1546: extern void push_obstacks_nochange PROTO((void)); ! 1547: ! 1548: extern void push_momentary PROTO((void)); ! 1549: ! 1550: extern void clear_momentary PROTO((void)); ! 1551: ! 1552: extern void pop_momentary PROTO((void)); ! 1553: ! 1554: extern void end_temporary_allocation PROTO((void)); ! 1555: ! 1556: /* Pop the obstack selection stack. */ ! 1557: extern void pop_obstacks PROTO((void));
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.