|
|
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();
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.