Annotation of researchv10dc/cmd/gcc/tree.h, revision 1.1

1.1     ! root        1: /* Front-end tree definitions for GNU compiler.
        !             2:    Copyright (C) 1987 Free Software Foundation, Inc.
        !             3: 
        !             4: This file is part of GNU CC.
        !             5: 
        !             6: GNU CC is distributed in the hope that it will be useful,
        !             7: but WITHOUT ANY WARRANTY.  No author or distributor
        !             8: accepts responsibility to anyone for the consequences of using it
        !             9: or for whether it serves any particular purpose or works at all,
        !            10: unless he says so in writing.  Refer to the GNU CC General Public
        !            11: License for full details.
        !            12: 
        !            13: Everyone is granted permission to copy, modify and redistribute
        !            14: GNU CC, but only under the conditions described in the
        !            15: GNU CC General Public License.   A copy of this license is
        !            16: supposed to have been given to you along with GNU CC so you
        !            17: can know your rights and responsibilities.  It should be in a
        !            18: file named COPYING.  Among other things, the copyright notice
        !            19: and this notice must be preserved on all copies.  */
        !            20: 
        !            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: 
        !            30: #undef DEFTREECODE
        !            31: 
        !            32: /* Indexed by enum tree_code, contains a character which is
        !            33:    `e' for an expression, `r' for a reference, `c' for a constant,
        !            34:    `d' for a decl, `t' for a type, `s' for a statement,
        !            35:    and `x' for anything else (TREE_LIST, IDENTIFIER, etc).  */
        !            36: 
        !            37: extern char *tree_code_type[];
        !            38: 
        !            39: /* Number of argument-words in each kind of tree-node.  */
        !            40: 
        !            41: extern int tree_code_length[];
        !            42: 
        !            43: /* Get the definition of `enum machine_mode' */
        !            44: 
        !            45: #ifndef HAVE_MACHINE_MODES
        !            46: #define DEF_MACHMODE(SYM, NAME, TYPE, SIZE, UNIT)  SYM,
        !            47: 
        !            48: enum machine_mode {
        !            49: #include "machmode.def"
        !            50: };
        !            51: 
        !            52: #undef DEF_MACHMODE
        !            53: 
        !            54: #define HAVE_MACHINE_MODES
        !            55: 
        !            56: #endif /* not HAVE_MACHINE_MODES */
        !            57: 
        !            58: #ifndef NUM_MACHINE_MODES
        !            59: #define NUM_MACHINE_MODES (int) MAX_MACHINE_MODE
        !            60: #endif
        !            61: 
        !            62: /* Codes that identify the various built in functions
        !            63:    so that expand_call can identify them quickly.  */
        !            64: 
        !            65: enum built_in_function
        !            66: {
        !            67:   NOT_BUILT_IN,
        !            68:   BUILT_IN_ALLOCA,
        !            69:   BUILT_IN_ABS,
        !            70:   BUILT_IN_FABS,
        !            71:   BUILT_IN_LABS,
        !            72:   BUILT_IN_FFS,
        !            73:   BUILT_IN_DIV,
        !            74:   BUILT_IN_LDIV,
        !            75:   BUILT_IN_FFLOOR,
        !            76:   BUILT_IN_FCEIL,
        !            77:   BUILT_IN_FMOD,
        !            78:   BUILT_IN_FREM,
        !            79:   BUILT_IN_MEMCPY,
        !            80:   BUILT_IN_MEMCMP,
        !            81:   BUILT_IN_MEMSET,
        !            82:   BUILT_IN_FSQRT,
        !            83:   BUILT_IN_GETEXP,
        !            84:   BUILT_IN_GETMAN
        !            85: };
        !            86: 
        !            87: /* The definition of tree nodes fills the next several pages.  */
        !            88: 
        !            89: /* A tree node can represent a data type, a variable, an expression
        !            90:    or a statement.  Each node has a TREE_CODE which says what kind of
        !            91:    thing it represents.  Some common codes are:
        !            92:    INTEGER_TYPE -- represents a type of integers.
        !            93:    ARRAY_TYPE -- represents a type of pointer.
        !            94:    VAR_DECL -- represents a declared variable.
        !            95:    INTEGER_CST -- represents a constant integer value.
        !            96:    PLUS_EXPR -- represents a sum (an expression).
        !            97: 
        !            98:    As for the contents of a tree node: there are some fields
        !            99:    that all nodes share.  Each TREE_CODE has various special-purpose
        !           100:    fields as well.  The fields of a node are never accessed directly,
        !           101:    always through accessor macros.  */
        !           102: 
        !           103: /* This type is used everywhere to refer to a tree node.  */
        !           104: 
        !           105: typedef union tree_node *tree;
        !           106: 
        !           107: #define NULL_TREE (tree) NULL
        !           108: 
        !           109: /* Every kind of tree node starts with this structure,
        !           110:    so all nodes have these fields.
        !           111: 
        !           112:    See the accessor macros, defined below, for documentation of the fields.  */
        !           113: 
        !           114: struct tree_common
        !           115: {
        !           116:   int uid;
        !           117:   union tree_node *chain;
        !           118:   union tree_node *type;
        !           119:   enum tree_code code : 8;
        !           120: 
        !           121:   unsigned external_attr : 1;
        !           122:   unsigned public_attr : 1;
        !           123:   unsigned static_attr : 1;
        !           124:   unsigned volatile_attr : 1;
        !           125:   unsigned packed_attr : 1;
        !           126:   unsigned readonly_attr : 1;
        !           127:   unsigned literal_attr : 1;
        !           128:   unsigned nonlocal_attr : 1;
        !           129:   unsigned permanent_attr : 1;
        !           130:   unsigned addressable_attr : 1;
        !           131:   unsigned regdecl_attr : 1;
        !           132:   unsigned this_vol_attr : 1;
        !           133:   unsigned unsigned_attr : 1;
        !           134:   unsigned asm_written_attr: 1;
        !           135:   unsigned inline_attr : 1;
        !           136: };
        !           137: 
        !           138: /* Define accessors for the fields that all tree nodes have
        !           139:    (though some fields are not used for all kinds of nodes).  */
        !           140: 
        !           141: /* The unique id of a tree node distinguishes it from all other nodes
        !           142:    in the same compiler run.  */
        !           143: #define TREE_UID(NODE) ((NODE)->common.uid)
        !           144: 
        !           145: /* The tree-code says what kind of node it is.
        !           146:    Codes are defined in tree.def.  */
        !           147: #define TREE_CODE(NODE) ((NODE)->common.code)
        !           148: #define TREE_SET_CODE(NODE, VALUE) ((NODE)->common.code = (VALUE))
        !           149: 
        !           150: /* In all nodes that are expressions, this is the data type of the expression.
        !           151:    In POINTER_TYPE nodes, this is the type that the pointer points to.
        !           152:    In ARRAY_TYPE nodes, this is the type of the elements.  */
        !           153: #define TREE_TYPE(NODE) ((NODE)->common.type)
        !           154: 
        !           155: /* Nodes are chained together for many purposes.
        !           156:    Types are chained together to record them for being output to the debugger
        !           157:    (see the function `chain_type').
        !           158:    Decls in the same scope are chained together to record the contents
        !           159:    of the scope.
        !           160:    Statement nodes for successive statements used to be chained together.
        !           161:    Often lists of things are represented by TREE_LIST nodes thaht
        !           162:    are chained together.  */
        !           163: 
        !           164: #define TREE_CHAIN(NODE) ((NODE)->common.chain)
        !           165: 
        !           166: /* Define many boolean fields that all tree nodes have.  */
        !           167: 
        !           168: /* In a VAR_DECL or FUNCTION_DECL,
        !           169:    nonzero means external reference:
        !           170:    do not allocate storage, and refer to a definition elsewhere.  */
        !           171: #define TREE_EXTERNAL(NODE) ((NODE)->common.external_attr)
        !           172: 
        !           173: /* In a VAR_DECL, nonzero means allocate static storage.
        !           174:    In a FUNCTION_DECL, currently nonzero if function has been defined.  */
        !           175: #define TREE_STATIC(NODE) ((NODE)->common.static_attr)
        !           176: 
        !           177: /* In a VAR_DECL or FUNCTION_DECL,
        !           178:    nonzero means name is to be accessible from outside this module.  */
        !           179: #define TREE_PUBLIC(NODE) ((NODE)->common.public_attr)
        !           180: 
        !           181: /* In VAR_DECL nodes, nonzero means address of this is needed.
        !           182:    So it cannot be in a register.
        !           183:    In a FUNCTION_DECL, nonzero means its address is needed.
        !           184:    So it must be compiled even if it is an inline function.
        !           185:    In CONSTRUCTOR nodes, it means are all constants suitable
        !           186:    for output as assembly-language initializers.
        !           187:    In LABEL_DECL nodes, it means a goto for this label has been seen 
        !           188:    from a place outside all binding contours that restore stack levels,
        !           189:    or that an error message about jumping into such a binding contour
        !           190:    has been printed for this label.  */
        !           191: #define TREE_ADDRESSABLE(NODE) ((NODE)->common.addressable_attr)
        !           192: 
        !           193: /* In VAR_DECL nodes, nonzero means declared `register'.  */
        !           194: #define TREE_REGDECL(NODE) ((NODE)->common.regdecl_attr)
        !           195: 
        !           196: /* In any expression, nonzero means it has side effects or reevaluation
        !           197:    of the whole expression could produce a different value.
        !           198:    This is set if any subexpression is a function call, a side effect
        !           199:    or a reference to a volatile variable.
        !           200:    In a ..._DECL, this is set only of the declaration said `volatile'.
        !           201:    In a ..._TYPE, nonzero means the type is volatile-qualified.  */
        !           202: #define TREE_VOLATILE(NODE) ((NODE)->common.volatile_attr)
        !           203: 
        !           204: /* Nonzero means this expression is volatile in the C sense:
        !           205:    its address should be of type `volatile WHATEVER *'.
        !           206:    If this bit is set, so is `volatile_attr'.  */
        !           207: #define TREE_THIS_VOLATILE(NODE) ((NODE)->common.this_vol_attr)
        !           208: 
        !           209: /* In a VAR_DECL, PARM_DECL or FIELD_DECL, or any kind of ..._REF node,
        !           210:    nonzero means it may not be the lhs of an assignment.
        !           211:    In a ..._TYPE node, means this type is const-qualified.  */
        !           212: #define TREE_READONLY(NODE) ((NODE)->common.readonly_attr)
        !           213: 
        !           214: /* Nonzero in a FIELD_DECL means it is a bit-field; it may occupy
        !           215:    less than a storage unit, and its address may not be taken, etc.
        !           216:    This controls layout of the containing record.
        !           217:    In a LABEL_DECL, nonzero means label was defined inside a binding
        !           218:    contour that restored a stack level and which is now exited.  */
        !           219: #define TREE_PACKED(NODE) ((NODE)->common.packed_attr)
        !           220: 
        !           221: /* Value of expression is constant.
        !           222:    Always appears in all ..._CST nodes.
        !           223:    May also appear in an arithmetic expression, an ADDR_EXPR or a CONSTRUCTOR
        !           224:    if the value is constant.  */
        !           225: #define TREE_LITERAL(NODE) ((NODE)->common.literal_attr)
        !           226: 
        !           227: /* Nonzero in a ..._DECL means this variable is ref'd from a nested function.
        !           228:    Cannot happen in C because it does not allow nested functions, as of now.
        !           229:    For VAR_DECL nodes, PARM_DECL nodes, and
        !           230:    maybe FUNCTION_DECL or LABEL_DECL nodes.  */
        !           231: #define TREE_NONLOCAL(NODE) ((NODE)->common.nonlocal_attr)
        !           232: 
        !           233: /* Nonzero means permanent node;
        !           234:    node will continue to exist for the entire compiler run.
        !           235:    Otherwise it will be recycled at the end of the function.  */
        !           236: #define TREE_PERMANENT(NODE) ((NODE)->common.permanent_attr)
        !           237: 
        !           238: /* In INTEGER_TYPE or ENUMERAL_TYPE nodes, means an unsigned type.
        !           239:    In FIELD_DECL nodes, means an unsigned bit field.  */
        !           240: #define TREE_UNSIGNED(NODE) ((NODE)->common.unsigned_attr)
        !           241: 
        !           242: /* Nonzero in a VAR_DECL means assembler code has been written.
        !           243:    Nonzero in a FUNCTION_DECL means that the function has been compiled.
        !           244:    This is interesting in an inline function, since it might not need
        !           245:    to be compiled separately.  */
        !           246: #define TREE_ASM_WRITTEN(NODE) ((NODE)->common.asm_written_attr)
        !           247: 
        !           248: /* Nonzero in a FUNCTION_DECL means this function can be substituted
        !           249:    where it is called.  */
        !           250: #define TREE_INLINE(NODE) ((NODE)->common.inline_attr)
        !           251: 
        !           252: /* Define additional fields and accessors for nodes representing constants.  */
        !           253: 
        !           254: /* In an INTEGER_CST node.  These two together make a 64 bit integer.
        !           255:    If the data type is signed, the value is sign-extended to 64 bits
        !           256:    even though not all of them may really be in use.
        !           257:    In an unsigned constant shorter than 64 bits, the extra bits are 0.  */
        !           258: #define TREE_INT_CST_LOW(NODE) ((NODE)->int_cst.int_cst_low)
        !           259: #define TREE_INT_CST_HIGH(NODE) ((NODE)->int_cst.int_cst_high)
        !           260: 
        !           261: #define INT_CST_LT(A, B)  \
        !           262: (TREE_INT_CST_HIGH (A) < TREE_INT_CST_HIGH (B)                 \
        !           263:  || (TREE_INT_CST_HIGH (A) == TREE_INT_CST_HIGH (B)            \
        !           264:      && ((unsigned) TREE_INT_CST_LOW (A) < (unsigned) TREE_INT_CST_LOW (B))))
        !           265: 
        !           266: #define INT_CST_LT_UNSIGNED(A, B)  \
        !           267: ((unsigned) TREE_INT_CST_HIGH (A) < (unsigned) TREE_INT_CST_HIGH (B)     \
        !           268:  || ((unsigned) TREE_INT_CST_HIGH (A) == (unsigned) TREE_INT_CST_HIGH (B) \
        !           269:      && ((unsigned) TREE_INT_CST_LOW (A) < (unsigned) TREE_INT_CST_LOW (B))))
        !           270: 
        !           271: struct tree_int_cst
        !           272: {
        !           273:   char common[sizeof (struct tree_common)];
        !           274:   long int_cst_low;
        !           275:   long int_cst_high;
        !           276: };
        !           277: 
        !           278: /* In REAL_CST, STRING_CST, COMPLEX_CST nodes, and CONSTRUCTOR nodes,
        !           279:    and generally in all kinds of constants that could
        !           280:    be given labels (rather than being immediate).  */
        !           281: 
        !           282: #define TREE_CST_RTL(NODE) ((NODE)->real_cst.rtl)
        !           283: 
        !           284: /* In a REAL_CST node.  */
        !           285: #define TREE_REAL_CST(NODE) ((NODE)->real_cst.real_cst)
        !           286: 
        !           287: struct tree_real_cst
        !           288: {
        !           289:   char common[sizeof (struct tree_common)];
        !           290:   struct rtx_def *rtl; /* acts as link to register transfer language
        !           291:                                   (rtl) info */
        !           292:   double real_cst;
        !           293: };
        !           294: 
        !           295: /* In a STRING_CST */
        !           296: #define TREE_STRING_LENGTH(NODE) ((NODE)->string.length)
        !           297: #define TREE_STRING_POINTER(NODE) ((NODE)->string.pointer)
        !           298: 
        !           299: struct tree_string
        !           300: {
        !           301:   char common[sizeof (struct tree_common)];
        !           302:   struct rtx_def *rtl; /* acts as link to register transfer language
        !           303:                                   (rtl) info */
        !           304:   int length;
        !           305:   char *pointer;
        !           306: };
        !           307: 
        !           308: /* In a COMPLEX_CST node.  */
        !           309: #define TREE_REALPART(NODE) ((NODE)->complex.real)
        !           310: #define TREE_IMAGPART(NODE) ((NODE)->complex.imag)
        !           311: 
        !           312: struct tree_complex
        !           313: {
        !           314:   char common[sizeof (struct tree_common)];
        !           315:   struct rtx_def *rtl; /* acts as link to register transfer language
        !           316:                                   (rtl) info */
        !           317:   union tree_node *real;
        !           318:   union tree_node *imag;
        !           319: };
        !           320: 
        !           321: /* Define fields and accessors for some special-purpose tree nodes.  */
        !           322: 
        !           323: #define IDENTIFIER_LENGTH(NODE) ((NODE)->identifier.length)
        !           324: #define IDENTIFIER_POINTER(NODE) ((NODE)->identifier.pointer)
        !           325: #define IDENTIFIER_GLOBAL_VALUE(NODE) ((NODE)->identifier.global_value)
        !           326: #define IDENTIFIER_LOCAL_VALUE(NODE) ((NODE)->identifier.local_value)
        !           327: #define IDENTIFIER_LABEL_VALUE(NODE) ((NODE)->identifier.label_value)
        !           328: #define IDENTIFIER_IMPLICIT_DECL(NODE) ((NODE)->identifier.implicit_decl)
        !           329: 
        !           330: struct tree_identifier
        !           331: {
        !           332:   char common[sizeof (struct tree_common)];
        !           333:   int length;
        !           334:   char *pointer;
        !           335:   union tree_node *global_value;
        !           336:   union tree_node *local_value;
        !           337:   union tree_node *label_value;
        !           338:   union tree_node *implicit_decl;
        !           339: };
        !           340: 
        !           341: /* In a TREE_LIST node.  */
        !           342: #define TREE_PURPOSE(NODE) ((NODE)->list.purpose)
        !           343: #define TREE_VALUE(NODE) ((NODE)->list.value)
        !           344: 
        !           345: struct tree_list
        !           346: {
        !           347:   char common[sizeof (struct tree_common)];
        !           348:   union tree_node *purpose;
        !           349:   union tree_node *value;
        !           350: };
        !           351: 
        !           352: /* Define fields and accessors for some nodes that represent expressions.  */
        !           353: 
        !           354: /* In a SAVE_EXPR node.  */
        !           355: #define SAVE_EXPR_RTL(NODE) (*(struct rtx_def **) &(NODE)->exp.operands[1])
        !           356: 
        !           357: /* In a RTL_EXPR node.  */
        !           358: #define RTL_EXPR_SEQUENCE(NODE) (*(struct rtx_def **) &(NODE)->exp.operands[0])
        !           359: #define RTL_EXPR_RTL(NODE) (*(struct rtx_def **) &(NODE)->exp.operands[1])
        !           360: 
        !           361: /* In a CALL_EXPR node.  */
        !           362: #define CALL_EXPR_RTL(NODE) (*(struct rtx_def **) &(NODE)->exp.operands[2])
        !           363: 
        !           364: /* In a CONSTRUCTOR node.  */
        !           365: #define CONSTRUCTOR_ELTS(NODE) TREE_OPERAND (NODE, 1)
        !           366: 
        !           367: /* In expression and reference nodes.  */
        !           368: #define TREE_OPERAND(NODE, I) ((NODE)->exp.operands[I])
        !           369: #define TREE_COMPLEXITY(NODE, I) ((NODE)->exp.complexity)
        !           370: 
        !           371: struct tree_exp
        !           372: {
        !           373:   char common[sizeof (struct tree_common)];
        !           374:   int complexity;
        !           375:   union tree_node *operands[1];
        !           376: };
        !           377: 
        !           378: /* Define fields and accessors for nodes representing data types.  */
        !           379: 
        !           380: /* See tree.def for documentation of the use of these fields.  */
        !           381: 
        !           382: #define TYPE_SIZE(NODE) ((NODE)->type.size)
        !           383: #define TYPE_SIZE_UNIT(NODE) ((NODE)->type.size_unit)
        !           384: #define TYPE_MODE(NODE) ((NODE)->type.mode)
        !           385: #define TYPE_ALIGN(NODE) ((NODE)->type.align)
        !           386: #define TYPE_VALUES(NODE) ((NODE)->type.values)
        !           387: #define TYPE_DOMAIN(NODE) ((NODE)->type.values)
        !           388: #define TYPE_FIELDS(NODE) ((NODE)->type.values)
        !           389: #define TYPE_ARG_TYPES(NODE) ((NODE)->type.values)
        !           390: #define TYPE_SEP(NODE) ((NODE)->type.sep)
        !           391: #define TYPE_SEP_UNIT(NODE) ((NODE)->type.sep_unit)
        !           392: #define TYPE_POINTER_TO(NODE) ((NODE)->type.pointer_to)
        !           393: #define TYPE_MIN_VALUE(NODE) ((NODE)->type.sep)
        !           394: #define TYPE_MAX_VALUE(NODE) ((NODE)->type.max)
        !           395: #define TYPE_PRECISION(NODE) ((NODE)->type.sep_unit)
        !           396: #define TYPE_PARSE_INFO(NODE) ((NODE)->type.parse_info)
        !           397: #define TYPE_SYMTAB_ADDRESS(NODE) ((NODE)->type.symtab_address)
        !           398: #define TYPE_NAME(NODE) ((NODE)->type.name)
        !           399: #define TYPE_NEXT_VARIANT(NODE) ((NODE)->type.next_variant)
        !           400: #define TYPE_MAIN_VARIANT(NODE) ((NODE)->type.main_variant)
        !           401: 
        !           402: struct tree_type
        !           403: {
        !           404:   char common[sizeof (struct tree_common)];
        !           405:   union tree_node *values;
        !           406:   union tree_node *sep;
        !           407:   union tree_node *size;
        !           408:   enum machine_mode mode;
        !           409:   unsigned char size_unit;
        !           410:   unsigned char align;
        !           411:   unsigned char sep_unit;
        !           412:   enum machine_mode elt_mode;  /* Unused */
        !           413:   union tree_node *pointer_to;
        !           414:   int parse_info;
        !           415:   int symtab_address;
        !           416:   union tree_node *name;
        !           417:   union tree_node *max;
        !           418:   union tree_node *next_variant;
        !           419:   union tree_node *main_variant;
        !           420: };
        !           421: 
        !           422: /* Define fields and accessors for nodes representing declared names.  */
        !           423: 
        !           424: #define DECL_VOFFSET(NODE) ((NODE)->decl.voffset)
        !           425: #define DECL_VOFFSET_UNIT(NODE) ((NODE)->decl.voffset_unit)
        !           426: #define DECL_OFFSET(NODE) ((NODE)->decl.offset)
        !           427: #define DECL_FUNCTION_CODE(NODE) ((enum built_in_function) (NODE)->decl.offset)
        !           428: #define DECL_SET_FUNCTION_CODE(NODE,VAL) ((NODE)->decl.offset = (int) (VAL))
        !           429: #define DECL_NAME(NODE) ((NODE)->decl.name)
        !           430: #define DECL_CONTEXT(NODE) ((NODE)->decl.context)
        !           431: #define DECL_ARGUMENTS(NODE) ((NODE)->decl.arguments)
        !           432: #define DECL_ARG_TYPE(NODE) ((NODE)->decl.arguments)
        !           433: #define DECL_RESULT(NODE) ((NODE)->decl.result)
        !           434: #define DECL_INITIAL(NODE) ((NODE)->decl.initial)
        !           435: #define DECL_SOURCE_FILE(NODE) ((NODE)->decl.filename)
        !           436: #define DECL_SOURCE_LINE(NODE) ((NODE)->decl.linenum)
        !           437: #define DECL_SIZE(NODE) ((NODE)->decl.size)
        !           438: #define DECL_SIZE_UNIT(NODE) ((NODE)->decl.size_unit)
        !           439: #define DECL_ALIGN(NODE) ((NODE)->decl.align)
        !           440: #define DECL_MODE(NODE) ((NODE)->decl.mode)
        !           441: #define DECL_RTL(NODE) ((NODE)->decl.rtl)
        !           442: #define DECL_BLOCK_SYMTAB_ADDRESS(NODE) ((NODE)->decl.block_symtab_address)
        !           443: #define DECL_SYMTAB_INDEX(NODE) ((NODE)->decl.block_symtab_address)
        !           444: #define DECL_SAVED_INSNS(NODE) ((NODE)->decl.saved_insns)
        !           445: #define DECL_FRAME_SIZE(NODE) ((NODE)->decl.frame_size)
        !           446: 
        !           447: struct tree_decl
        !           448: {
        !           449:   char common[sizeof (struct tree_common)];
        !           450:   char *filename;
        !           451:   int linenum;
        !           452:   union tree_node *size;
        !           453:   enum machine_mode mode;
        !           454:   unsigned char size_unit;
        !           455:   unsigned char align;
        !           456:   unsigned char voffset_unit;
        !           457:   union tree_node *name;
        !           458:   union tree_node *context;
        !           459:   int offset;
        !           460:   union tree_node *voffset;
        !           461:   union tree_node *arguments;
        !           462:   union tree_node *result;
        !           463:   union tree_node *initial;
        !           464:   struct rtx_def *rtl; /* acts as link to register transfer language
        !           465:                                   (rtl) info */
        !           466:   int frame_size;              /* For FUNCTION_DECLs: size of stack frame */
        !           467:   struct rtx_def *saved_insns; /* For FUNCTION_DECLs: points to insn that
        !           468:                                   constitute its definition on the
        !           469:                                   permanent obstack.  */
        !           470:   int block_symtab_address;
        !           471: };
        !           472: 
        !           473: /* Define fields and accessors for nodes representing statements.
        !           474:    These are now obsolete for C, except for LET_STMT, which is used
        !           475:    to record the structure of binding contours (and the names declared
        !           476:    in each contour) for the sake of outputting debugging info.
        !           477:    Perhaps they will be used once again for other languages.  */
        !           478: 
        !           479: /* For LABEL_STMT, GOTO_STMT, RETURN_STMT, LOOP_STMT,
        !           480:    COMPOUND_STMT, ASM_STMT.  */
        !           481: #define STMT_SOURCE_LINE(NODE) ((NODE)->stmt.linenum)
        !           482: #define STMT_SOURCE_FILE(NODE) ((NODE)->stmt.filename)
        !           483: #define STMT_BODY(NODE) ((NODE)->stmt.body)
        !           484: 
        !           485: struct tree_stmt
        !           486: {
        !           487:   char common[sizeof (struct tree_common)];
        !           488:   char *filename;
        !           489:   int linenum;
        !           490:   union tree_node *body;
        !           491: };
        !           492: 
        !           493: /* For IF_STMT.  */
        !           494: 
        !           495: /* #define STMT_SOURCE_LINE(NODE) */
        !           496: /* #define STMT_SOURCE_FILE(NODE) */
        !           497: #define STMT_COND(NODE) ((NODE)->if_stmt.cond)
        !           498: #define STMT_THEN(NODE) ((NODE)->if_stmt.thenpart)
        !           499: #define STMT_ELSE(NODE) ((NODE)->if_stmt.elsepart)
        !           500: 
        !           501: struct tree_if_stmt
        !           502: {
        !           503:   char common[sizeof (struct tree_common)];
        !           504:   char *filename;
        !           505:   int linenum;
        !           506:   union tree_node *cond, *thenpart, *elsepart;
        !           507: };
        !           508: 
        !           509: /* For LET_STMT and WITH_STMT.  */
        !           510: 
        !           511: /* #define STMT_SOURCE_LINE(NODE) */
        !           512: /* #define STMT_SOURCE_FILE(NODE) */
        !           513: /* #define STMT_BODY(NODE) */
        !           514: #define STMT_VARS(NODE) ((NODE)->bind_stmt.vars)
        !           515: #define STMT_SUPERCONTEXT(NODE) ((NODE)->bind_stmt.supercontext)
        !           516: #define STMT_BIND_SIZE(NODE) ((NODE)->bind_stmt.bind_size)
        !           517: #define STMT_TYPE_TAGS(NODE) ((NODE)->bind_stmt.type_tags)
        !           518: 
        !           519: struct tree_bind_stmt
        !           520: {
        !           521:   char common[sizeof (struct tree_common)];
        !           522:   char *filename;
        !           523:   int linenum;
        !           524:   union tree_node *body, *vars, *supercontext, *bind_size, *type_tags;
        !           525: };
        !           526: 
        !           527: /* For CASE_STMT.  */
        !           528: 
        !           529: #define STMT_CASE_INDEX(NODE) ((NODE)->case_stmt.index)
        !           530: #define STMT_CASE_LIST(NODE) ((NODE)->case_stmt.case_list)
        !           531: 
        !           532: struct tree_case_stmt
        !           533: {
        !           534:   char common[sizeof (struct tree_common)];
        !           535:   char *filename;
        !           536:   int linenum;
        !           537:   union tree_node *index, *case_list;
        !           538: };
        !           539: 
        !           540: /* Define the overall contents of a tree node.
        !           541:    It may be any of the structures declared above
        !           542:    for various types of node.  */
        !           543: 
        !           544: union tree_node
        !           545: {
        !           546:   struct tree_common common;
        !           547:   struct tree_int_cst int_cst;
        !           548:   struct tree_real_cst real_cst;
        !           549:   struct tree_string string;
        !           550:   struct tree_complex complex;
        !           551:   struct tree_identifier identifier;
        !           552:   struct tree_decl decl;
        !           553:   struct tree_type type;
        !           554:   struct tree_list list;
        !           555:   struct tree_exp exp;
        !           556:   struct tree_stmt stmt;
        !           557:   struct tree_if_stmt if_stmt;
        !           558:   struct tree_bind_stmt bind_stmt;
        !           559:   struct tree_case_stmt case_stmt;
        !           560: };
        !           561: 
        !           562: extern char *oballoc ();
        !           563: extern char *permalloc ();
        !           564: 
        !           565: /* Lowest level primitive for allocating a node.
        !           566:    The TREE_CODE is the only argument.  Contents are initialized
        !           567:    to zero except for a few of the common fields.  */
        !           568: 
        !           569: extern tree make_node ();
        !           570: 
        !           571: /* Make a copy of a node, with all the same contents except
        !           572:    for TREE_UID and TREE_PERMANENT.  (The copy is permanent
        !           573:    iff nodes being made now are permanent.)  */
        !           574: 
        !           575: extern tree copy_node ();
        !           576: 
        !           577: /* Return the (unique) IDENTIFIER_NODE node for a given name.
        !           578:    The name is supplied as a char *.  */
        !           579: 
        !           580: extern tree get_identifier ();
        !           581: 
        !           582: /* Construct various types of nodes.  */
        !           583: 
        !           584: extern tree build_int_2 ();
        !           585: extern tree build_real ();
        !           586: extern tree build_real_from_string ();
        !           587: extern tree build_real_from_int_cst ();
        !           588: extern tree build_complex ();
        !           589: extern tree build_string ();
        !           590: extern tree build ();
        !           591: extern tree build_nt ();
        !           592: extern tree build_tree_list ();
        !           593: extern tree build_decl ();
        !           594: extern tree build_let ();
        !           595: 
        !           596: /* Construct various nodes representing data types.  */
        !           597: 
        !           598: extern tree make_signed_type ();
        !           599: extern tree make_unsigned_type ();
        !           600: extern void fixup_unsigned_type ();
        !           601: extern tree build_pointer_type ();
        !           602: extern tree build_array_type ();
        !           603: extern tree build_function_type ();
        !           604: 
        !           605: /* Construct expressions, performing type checking.  */
        !           606: 
        !           607: extern tree build_binary_op ();
        !           608: extern tree build_indirect_ref ();
        !           609: extern tree build_unary_op ();
        !           610: 
        !           611: /* Given a type node TYPE, and CONSTP and VOLATILEP, return a type
        !           612:    for the same kind of data as TYPE describes.
        !           613:    Variants point to the "main variant" (which has neither CONST nor VOLATILE)
        !           614:    via TYPE_MAIN_VARIANT, and it points to a chain of other variants
        !           615:    so that duplicate variants are never made.
        !           616:    Only main variants should ever appear as types of expressions.  */
        !           617: 
        !           618: extern tree build_type_variant ();
        !           619: 
        !           620: /* Given a ..._TYPE node, calculate the TYPE_SIZE, TYPE_SIZE_UNIT,
        !           621:    TYPE_ALIGN and TYPE_MODE fields.
        !           622:    If called more than once on one node, does nothing except
        !           623:    for the first time.  */
        !           624: 
        !           625: extern void layout_type ();
        !           626: 
        !           627: /* Given a hashcode and a ..._TYPE node (for which the hashcode was made),
        !           628:    return a canonicalized ..._TYPE node, so that duplicates are not made.
        !           629:    How the hash code is computed is up to the caller, as long as any two
        !           630:    callers that could hash identical-looking type nodes agree.  */
        !           631: 
        !           632: extern tree type_hash_canon ();
        !           633: 
        !           634: /* Given a VAR_DECL, PARM_DECL, RESULT_DECL or FIELD_DECL node,
        !           635:    calculates the DECL_SIZE, DECL_SIZE_UNIT, DECL_ALIGN and DECL_MODE
        !           636:    fields.  Call this only once for any given decl node.
        !           637: 
        !           638:    Second argument is the boundary that this field can be assumed to
        !           639:    be starting at (in bits).  Zero means it can be assumed aligned
        !           640:    on any boundary that may be needed.  */
        !           641: 
        !           642: extern void layout_decl ();
        !           643: 
        !           644: /* Fold constants as much as possible in an expression.
        !           645:    Returns the simplified expression.
        !           646:    Acts only on the top level of the expression;
        !           647:    if the argument itself cannot be simplified, its
        !           648:    subexpressions are not changed.  */
        !           649: 
        !           650: extern tree fold ();
        !           651: 
        !           652: /* combine (tree_code, exp1, exp2) where EXP1 and EXP2 are constants
        !           653:    returns a constant expression for the result of performing
        !           654:    the operation specified by TREE_CODE on EXP1 and EXP2.  */
        !           655: 
        !           656: extern tree combine ();
        !           657: 
        !           658: extern tree convert ();
        !           659: extern tree convert_units ();
        !           660: extern tree size_in_bytes ();
        !           661: extern tree genop ();
        !           662: extern tree build_int ();
        !           663: 
        !           664: /* Type for sizes of data-type.  */
        !           665: 
        !           666: extern tree sizetype;
        !           667: 
        !           668: /* Concatenate two lists (chains of TREE_LIST nodes) X and Y
        !           669:    by making the last node in X point to Y.
        !           670:    Returns X, except if X is 0 returns Y.  */
        !           671: 
        !           672: extern tree chainon ();
        !           673: 
        !           674: /* Make a new TREE_LIST node from specified PURPOSE, VALUE and CHAIN.  */
        !           675: 
        !           676: extern tree tree_cons ();
        !           677: 
        !           678: /* Return the last tree node in a chain.  */
        !           679: 
        !           680: extern tree tree_last ();
        !           681: 
        !           682: /* Reverse the order of elements in a chain, and return the new head.  */
        !           683: 
        !           684: extern tree nreverse ();
        !           685: 
        !           686: /* Returns the length of a chain of nodes
        !           687:    (number of chain pointers to follow before reaching a null pointer).  */
        !           688: 
        !           689: extern int list_length ();
        !           690: 
        !           691: /* integer_zerop (tree x) is nonzero if X is an integer constant of value 0 */
        !           692: 
        !           693: extern int integer_zerop ();
        !           694: 
        !           695: /* integer_onep (tree x) is nonzero if X is an integer constant of value 1 */
        !           696: 
        !           697: extern int integer_onep ();
        !           698: 
        !           699: /* integer_all_onesp (tree x) is nonzero if X is an integer constant
        !           700:    all of whose significant bits are 1.  */
        !           701: 
        !           702: extern int integer_all_onesp ();
        !           703: 
        !           704: /* type_unsigned_p (tree x) is nonzero if the type X is an unsigned type
        !           705:    (all of its possible values are >= 0).
        !           706:    If X is a pointer type, the value is 1.
        !           707:    If X is a real type, the value is 0.  */
        !           708: 
        !           709: extern int type_unsigned_p ();
        !           710: 
        !           711: /* staticp (tree x) is nonzero if X is a reference to data allocated
        !           712:    at a fixed address in memory.  */
        !           713: 
        !           714: extern int staticp ();
        !           715: 
        !           716: /* Gets an error if argument X is not an lvalue.
        !           717:    Also returns 1 if X is an lvalue, 0 if not.  */
        !           718: 
        !           719: extern int lvalue_or_else ();
        !           720: 
        !           721: /* save_expr (EXP) returns an expression equivalent to EXP
        !           722:    but it can be used multiple times within context CTX
        !           723:    and only evaluate EXP once.  */
        !           724: 
        !           725: extern tree save_expr ();
        !           726: 
        !           727: /* stabilize_reference (EXP) returns an reference equivalent to EXP
        !           728:    but it can be used multiple times
        !           729:    and only evaluate the subexpressions once.  */
        !           730: 
        !           731: extern tree stabilize_reference ();
        !           732: 
        !           733: /* Return EXP, stripped of any conversions to wider types
        !           734:    in such a way that the result of converting to type FOR_TYPE
        !           735:    is the same as if EXP were converted to FOR_TYPE.
        !           736:    If FOR_TYPE is 0, it signifies EXP's type.  */
        !           737: 
        !           738: extern tree get_unwidened ();
        !           739: 
        !           740: /* Return OP or a simpler expression for a narrower value
        !           741:    which can be sign-extended or zero-extended to give back OP.
        !           742:    Store in *UNSIGNEDP_PTR either 1 if the value should be zero-extended
        !           743:    or 0 if the value should be sign-extended.  */
        !           744: 
        !           745: extern tree get_narrower ();
        !           746: 
        !           747: /* Given PRECISION and UNSIGNEDP, return a suitable type-tree
        !           748:    for an integer type with at least that precision.
        !           749:    The definition of this resides in language-specific code
        !           750:    as the repertoir of available types may vary.  */
        !           751: 
        !           752: extern tree type_for_size ();
        !           753: 
        !           754: /* Given an integer type T, return a type like T but unsigned.
        !           755:    If T is unsigned, the value is T.
        !           756:    The definition of this resides in language-specific code
        !           757:    as the repertoir of available types may vary.  */
        !           758: 
        !           759: extern tree unsigned_type ();
        !           760: 
        !           761: /* Given an integer type T, return a type like T but signed.
        !           762:    If T is signed, the value is T.
        !           763:    The definition of this resides in language-specific code
        !           764:    as the repertoir of available types may vary.  */
        !           765: 
        !           766: extern tree signed_type ();
        !           767: 
        !           768: /* Return the floating type node for a given floating machine mode.  */
        !           769: 
        !           770: extern tree get_floating_type ();
        !           771: 
        !           772: /* Given the FUNCTION_DECL for the current function,
        !           773:    return zero if it is ok for this function to be inline.
        !           774:    Otherwise return a warning message with a single %s
        !           775:    for the function's name.  */
        !           776: 
        !           777: extern char *function_cannot_inline_p ();
        !           778: 
        !           779: /* Declare commonly used variables for tree structure.  */
        !           780: 
        !           781: /* An integer constant with value 0 */
        !           782: extern tree integer_zero_node;
        !           783: 
        !           784: /* An integer constant with value 1 */
        !           785: extern tree integer_one_node;
        !           786: 
        !           787: /* An integer constant with value 0 whose type is sizetype.  */
        !           788: extern tree size_zero_node;
        !           789: 
        !           790: /* An integer constant with value 1 whose type is sizetype.  */
        !           791: extern tree size_one_node;
        !           792: 
        !           793: /* A constant of type pointer-to-int and value 0 */
        !           794: extern tree null_pointer_node;
        !           795: 
        !           796: /* A node of type ERROR_MARK.  */
        !           797: extern tree error_mark_node;
        !           798: 
        !           799: /* The type node for the void type.  */
        !           800: extern tree void_type_node;
        !           801: 
        !           802: /* The type node for the ordinary (signed) integer type.  */
        !           803: extern tree integer_type_node;
        !           804: 
        !           805: /* The type node for the unsigned integer type.  */
        !           806: extern tree unsigned_type_node;
        !           807: 
        !           808: /* The type node for the ordinary character type.  */
        !           809: extern tree char_type_node;
        !           810: 
        !           811: /* Points to the name of the input file from which the current input
        !           812:    being parsed originally came (before it went into cpp).  */
        !           813: extern char *input_filename;
        !           814: 
        !           815: /* Nonzero for -pedantic switch: warn about anything
        !           816:    that standard C forbids.  */
        !           817: extern int pedantic;
        !           818: 
        !           819: /* In stmt.c */
        !           820: 
        !           821: extern tree get_last_expr ();
        !           822: extern void expand_expr_stmt(), clear_last_expr();
        !           823: extern void expand_label(), expand_goto(), expand_asm();
        !           824: extern void expand_start_cond(), expand_end_cond();
        !           825: extern void expand_start_else(), expand_end_else();
        !           826: extern void expand_start_loop(), expand_start_loop_continue_elsewhere();
        !           827: extern void expand_loop_continue_here();
        !           828: extern void expand_end_loop();
        !           829: extern int expand_continue_loop();
        !           830: extern int expand_exit_loop(), expand_exit_loop_if_false();
        !           831: extern int expand_exit_something();
        !           832: 
        !           833: extern void expand_start_delayed_expr ();
        !           834: extern tree expand_end_delayed_expr ();
        !           835: extern void expand_emit_delayed_expr ();
        !           836: 
        !           837: extern void expand_null_return(), expand_return();
        !           838: extern void expand_start_bindings(), expand_end_bindings();
        !           839: extern void expand_start_case(), expand_end_case();
        !           840: extern int pushcase();
        !           841: extern void expand_start_function(), expand_end_function();

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.