|
|
1.1 ! root 1: /* Language-independent node constructors for parse phase of GNU compiler. ! 2: Copyright (C) 1987, 1988, 1992, 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: ! 21: /* This file contains the low level primitives for operating on tree nodes, ! 22: including allocation, list operations, interning of identifiers, ! 23: construction of data type nodes and statement nodes, ! 24: and construction of type conversion nodes. It also contains ! 25: tables index by tree code that describe how to take apart ! 26: nodes of that code. ! 27: ! 28: It is intended to be language-independent, but occasionally ! 29: calls language-dependent routines defined (for C) in typecheck.c. ! 30: ! 31: The low-level allocation routines oballoc and permalloc ! 32: are used also for allocating many other kinds of objects ! 33: by all passes of the compiler. */ ! 34: ! 35: #include "config.h" ! 36: #include "flags.h" ! 37: #include "tree.h" ! 38: #include "objc-act.h" ! 39: #include "function.h" ! 40: #include "obstack.h" ! 41: #include "gvarargs.h" ! 42: #include <stdio.h> ! 43: ! 44: #define obstack_chunk_alloc xmalloc ! 45: #define obstack_chunk_free free ! 46: ! 47: /* Tree nodes of permanent duration are allocated in this obstack. ! 48: They are the identifier nodes, and everything outside of ! 49: the bodies and parameters of function definitions. */ ! 50: ! 51: struct obstack permanent_obstack; ! 52: ! 53: /* The initial RTL, and all ..._TYPE nodes, in a function ! 54: are allocated in this obstack. Usually they are freed at the ! 55: end of the function, but if the function is inline they are saved. ! 56: For top-level functions, this is maybepermanent_obstack. ! 57: Separate obstacks are made for nested functions. */ ! 58: ! 59: struct obstack *function_maybepermanent_obstack; ! 60: ! 61: /* This is the function_maybepermanent_obstack for top-level functions. */ ! 62: ! 63: struct obstack maybepermanent_obstack; ! 64: ! 65: /* The contents of the current function definition are allocated ! 66: in this obstack, and all are freed at the end of the function. ! 67: For top-level functions, this is temporary_obstack. ! 68: Separate obstacks are made for nested functions. */ ! 69: ! 70: struct obstack *function_obstack; ! 71: ! 72: /* This is used for reading initializers of global variables. */ ! 73: ! 74: struct obstack temporary_obstack; ! 75: ! 76: /* The tree nodes of an expression are allocated ! 77: in this obstack, and all are freed at the end of the expression. */ ! 78: ! 79: struct obstack momentary_obstack; ! 80: ! 81: /* The tree nodes of a declarator are allocated ! 82: in this obstack, and all are freed when the declarator ! 83: has been parsed. */ ! 84: ! 85: static struct obstack temp_decl_obstack; ! 86: ! 87: /* This points at either permanent_obstack ! 88: or the current function_maybepermanent_obstack. */ ! 89: ! 90: struct obstack *saveable_obstack; ! 91: ! 92: /* This is same as saveable_obstack during parse and expansion phase; ! 93: it points to the current function's obstack during optimization. ! 94: This is the obstack to be used for creating rtl objects. */ ! 95: ! 96: struct obstack *rtl_obstack; ! 97: ! 98: /* This points at either permanent_obstack or the current function_obstack. */ ! 99: ! 100: struct obstack *current_obstack; ! 101: ! 102: /* This points at either permanent_obstack or the current function_obstack ! 103: or momentary_obstack. */ ! 104: ! 105: struct obstack *expression_obstack; ! 106: ! 107: /* Stack of obstack selections for push_obstacks and pop_obstacks. */ ! 108: ! 109: struct obstack_stack ! 110: { ! 111: struct obstack_stack *next; ! 112: struct obstack *current; ! 113: struct obstack *saveable; ! 114: struct obstack *expression; ! 115: struct obstack *rtl; ! 116: }; ! 117: ! 118: struct obstack_stack *obstack_stack; ! 119: ! 120: /* Obstack for allocating struct obstack_stack entries. */ ! 121: ! 122: static struct obstack obstack_stack_obstack; ! 123: ! 124: /* Addresses of first objects in some obstacks. ! 125: This is for freeing their entire contents. */ ! 126: char *maybepermanent_firstobj; ! 127: char *temporary_firstobj; ! 128: char *momentary_firstobj; ! 129: char *temp_decl_firstobj; ! 130: ! 131: /* Nonzero means all ..._TYPE nodes should be allocated permanently. */ ! 132: ! 133: int all_types_permanent; ! 134: ! 135: /* Stack of places to restore the momentary obstack back to. */ ! 136: ! 137: struct momentary_level ! 138: { ! 139: /* Pointer back to previous such level. */ ! 140: struct momentary_level *prev; ! 141: /* First object allocated within this level. */ ! 142: char *base; ! 143: /* Value of expression_obstack saved at entry to this level. */ ! 144: struct obstack *obstack; ! 145: }; ! 146: ! 147: struct momentary_level *momentary_stack; ! 148: ! 149: /* Table indexed by tree code giving a string containing a character ! 150: classifying the tree code. Possibilities are ! 151: t, d, s, c, r, <, 1, 2 and e. See tree.def for details. */ ! 152: ! 153: #define DEFTREECODE(SYM, NAME, TYPE, LENGTH) TYPE, ! 154: ! 155: char *standard_tree_code_type[] = { ! 156: #include "tree.def" ! 157: }; ! 158: #undef DEFTREECODE ! 159: ! 160: /* Table indexed by tree code giving number of expression ! 161: operands beyond the fixed part of the node structure. ! 162: Not used for types or decls. */ ! 163: ! 164: #define DEFTREECODE(SYM, NAME, TYPE, LENGTH) LENGTH, ! 165: ! 166: int standard_tree_code_length[] = { ! 167: #include "tree.def" ! 168: }; ! 169: #undef DEFTREECODE ! 170: ! 171: /* Names of tree components. ! 172: Used for printing out the tree and error messages. */ ! 173: #define DEFTREECODE(SYM, NAME, TYPE, LEN) NAME, ! 174: ! 175: char *standard_tree_code_name[] = { ! 176: #include "tree.def" ! 177: }; ! 178: #undef DEFTREECODE ! 179: ! 180: /* Table indexed by tree code giving a string containing a character ! 181: classifying the tree code. Possibilities are ! 182: t, d, s, c, r, e, <, 1 and 2. See tree.def for details. */ ! 183: ! 184: char **tree_code_type; ! 185: ! 186: /* Table indexed by tree code giving number of expression ! 187: operands beyond the fixed part of the node structure. ! 188: Not used for types or decls. */ ! 189: ! 190: int *tree_code_length; ! 191: ! 192: /* Table indexed by tree code giving name of tree code, as a string. */ ! 193: ! 194: char **tree_code_name; ! 195: ! 196: /* Statistics-gathering stuff. */ ! 197: typedef enum ! 198: { ! 199: d_kind, ! 200: t_kind, ! 201: b_kind, ! 202: s_kind, ! 203: r_kind, ! 204: e_kind, ! 205: c_kind, ! 206: id_kind, ! 207: op_id_kind, ! 208: perm_list_kind, ! 209: temp_list_kind, ! 210: vec_kind, ! 211: x_kind, ! 212: lang_decl, ! 213: lang_type, ! 214: all_kinds ! 215: } tree_node_kind; ! 216: ! 217: int tree_node_counts[(int)all_kinds]; ! 218: int tree_node_sizes[(int)all_kinds]; ! 219: int id_string_size = 0; ! 220: ! 221: char *tree_node_kind_names[] = { ! 222: "decls", ! 223: "types", ! 224: "blocks", ! 225: "stmts", ! 226: "refs", ! 227: "exprs", ! 228: "constants", ! 229: "identifiers", ! 230: "op_identifiers", ! 231: "perm_tree_lists", ! 232: "temp_tree_lists", ! 233: "vecs", ! 234: "random kinds", ! 235: "lang_decl kinds", ! 236: "lang_type kinds" ! 237: }; ! 238: ! 239: /* Hash table for uniquizing IDENTIFIER_NODEs by name. */ ! 240: ! 241: #define MAX_HASH_TABLE 1009 ! 242: static tree hash_table[MAX_HASH_TABLE]; /* id hash buckets */ ! 243: ! 244: /* 0 while creating built-in identifiers. */ ! 245: static int do_identifier_warnings; ! 246: ! 247: /* Unique id for next decl created. */ ! 248: static int next_decl_uid; ! 249: /* Unique id for next type created. */ ! 250: static int next_type_uid = 1; ! 251: ! 252: extern char *mode_name[]; ! 253: ! 254: #ifdef NEXT_SEMANTICS ! 255: extern short *reg_renumber; ! 256: #endif ! 257: ! 258: void gcc_obstack_init (); ! 259: static tree stabilize_reference_1 (); ! 260: ! 261: /* Init the principal obstacks. */ ! 262: ! 263: void ! 264: init_obstacks () ! 265: { ! 266: gcc_obstack_init (&obstack_stack_obstack); ! 267: gcc_obstack_init (&permanent_obstack); ! 268: ! 269: gcc_obstack_init (&temporary_obstack); ! 270: temporary_firstobj = (char *) obstack_alloc (&temporary_obstack, 0); ! 271: gcc_obstack_init (&momentary_obstack); ! 272: momentary_firstobj = (char *) obstack_alloc (&momentary_obstack, 0); ! 273: gcc_obstack_init (&maybepermanent_obstack); ! 274: maybepermanent_firstobj ! 275: = (char *) obstack_alloc (&maybepermanent_obstack, 0); ! 276: gcc_obstack_init (&temp_decl_obstack); ! 277: temp_decl_firstobj = (char *) obstack_alloc (&temp_decl_obstack, 0); ! 278: ! 279: function_obstack = &temporary_obstack; ! 280: function_maybepermanent_obstack = &maybepermanent_obstack; ! 281: current_obstack = &permanent_obstack; ! 282: expression_obstack = &permanent_obstack; ! 283: rtl_obstack = saveable_obstack = &permanent_obstack; ! 284: ! 285: /* Init the hash table of identifiers. */ ! 286: bzero (hash_table, sizeof hash_table); ! 287: } ! 288: ! 289: void ! 290: gcc_obstack_init (obstack) ! 291: struct obstack *obstack; ! 292: { ! 293: /* Let particular systems override the size of a chunk. */ ! 294: #ifndef OBSTACK_CHUNK_SIZE ! 295: #define OBSTACK_CHUNK_SIZE 0 ! 296: #endif ! 297: /* Let them override the alloc and free routines too. */ ! 298: #ifndef OBSTACK_CHUNK_ALLOC ! 299: #define OBSTACK_CHUNK_ALLOC xmalloc ! 300: #endif ! 301: #ifndef OBSTACK_CHUNK_FREE ! 302: #define OBSTACK_CHUNK_FREE free ! 303: #endif ! 304: _obstack_begin (obstack, OBSTACK_CHUNK_SIZE, 0, ! 305: (void *(*) ()) OBSTACK_CHUNK_ALLOC, ! 306: (void (*) ()) OBSTACK_CHUNK_FREE); ! 307: } ! 308: ! 309: /* Save all variables describing the current status into the structure *P. ! 310: This is used before starting a nested function. */ ! 311: ! 312: void ! 313: save_tree_status (p) ! 314: struct function *p; ! 315: { ! 316: p->all_types_permanent = all_types_permanent; ! 317: p->momentary_stack = momentary_stack; ! 318: p->maybepermanent_firstobj = maybepermanent_firstobj; ! 319: p->momentary_firstobj = momentary_firstobj; ! 320: p->function_obstack = function_obstack; ! 321: p->function_maybepermanent_obstack = function_maybepermanent_obstack; ! 322: p->current_obstack = current_obstack; ! 323: p->expression_obstack = expression_obstack; ! 324: p->saveable_obstack = saveable_obstack; ! 325: p->rtl_obstack = rtl_obstack; ! 326: ! 327: /* Objects that need to be saved in this function can be in the nonsaved ! 328: obstack of the enclosing function since they can't possibly be needed ! 329: once it has returned. */ ! 330: function_maybepermanent_obstack = function_obstack; ! 331: ! 332: function_obstack = (struct obstack *) xmalloc (sizeof (struct obstack)); ! 333: gcc_obstack_init (function_obstack); ! 334: ! 335: current_obstack = &permanent_obstack; ! 336: expression_obstack = &permanent_obstack; ! 337: rtl_obstack = saveable_obstack = &permanent_obstack; ! 338: ! 339: momentary_firstobj = (char *) obstack_finish (&momentary_obstack); ! 340: maybepermanent_firstobj ! 341: = (char *) obstack_finish (function_maybepermanent_obstack); ! 342: } ! 343: ! 344: /* Restore all variables describing the current status from the structure *P. ! 345: This is used after a nested function. */ ! 346: ! 347: void ! 348: restore_tree_status (p) ! 349: struct function *p; ! 350: { ! 351: all_types_permanent = p->all_types_permanent; ! 352: momentary_stack = p->momentary_stack; ! 353: ! 354: obstack_free (&momentary_obstack, momentary_firstobj); ! 355: ! 356: /* Free saveable storage used by the function just compiled and not ! 357: saved. ! 358: ! 359: CAUTION: This is in function_obstack of the containing function. So ! 360: we must be sure that we never allocate from that obstack during ! 361: the compilation of a nested function if we expect it to survive past the ! 362: nested function's end. */ ! 363: obstack_free (function_maybepermanent_obstack, maybepermanent_firstobj); ! 364: ! 365: obstack_free (function_obstack, 0); ! 366: free (function_obstack); ! 367: ! 368: momentary_firstobj = p->momentary_firstobj; ! 369: maybepermanent_firstobj = p->maybepermanent_firstobj; ! 370: function_obstack = p->function_obstack; ! 371: function_maybepermanent_obstack = p->function_maybepermanent_obstack; ! 372: current_obstack = p->current_obstack; ! 373: expression_obstack = p->expression_obstack; ! 374: saveable_obstack = p->saveable_obstack; ! 375: rtl_obstack = p->rtl_obstack; ! 376: } ! 377: ! 378: /* Start allocating on the temporary (per function) obstack. ! 379: This is done in start_function before parsing the function body, ! 380: and before each initialization at top level, and to go back ! 381: to temporary allocation after doing permanent_allocation. */ ! 382: ! 383: void ! 384: temporary_allocation () ! 385: { ! 386: /* Note that function_obstack at top level points to temporary_obstack. ! 387: But within a nested function context, it is a separate obstack. */ ! 388: current_obstack = function_obstack; ! 389: expression_obstack = function_obstack; ! 390: rtl_obstack = saveable_obstack = function_maybepermanent_obstack; ! 391: momentary_stack = 0; ! 392: } ! 393: ! 394: /* Start allocating on the permanent obstack but don't ! 395: free the temporary data. After calling this, call ! 396: `permanent_allocation' to fully resume permanent allocation status. */ ! 397: ! 398: void ! 399: end_temporary_allocation () ! 400: { ! 401: current_obstack = &permanent_obstack; ! 402: expression_obstack = &permanent_obstack; ! 403: rtl_obstack = saveable_obstack = &permanent_obstack; ! 404: } ! 405: ! 406: /* Resume allocating on the temporary obstack, undoing ! 407: effects of `end_temporary_allocation'. */ ! 408: ! 409: void ! 410: resume_temporary_allocation () ! 411: { ! 412: current_obstack = function_obstack; ! 413: expression_obstack = function_obstack; ! 414: rtl_obstack = saveable_obstack = function_maybepermanent_obstack; ! 415: } ! 416: ! 417: /* While doing temporary allocation, switch to allocating in such a ! 418: way as to save all nodes if the function is inlined. Call ! 419: resume_temporary_allocation to go back to ordinary temporary ! 420: allocation. */ ! 421: ! 422: void ! 423: saveable_allocation () ! 424: { ! 425: /* Note that function_obstack at top level points to temporary_obstack. ! 426: But within a nested function context, it is a separate obstack. */ ! 427: expression_obstack = current_obstack = saveable_obstack; ! 428: } ! 429: ! 430: /* Switch to current obstack CURRENT and maybepermanent obstack SAVEABLE, ! 431: recording the previously current obstacks on a stack. ! 432: This does not free any storage in any obstack. */ ! 433: ! 434: void ! 435: push_obstacks (current, saveable) ! 436: struct obstack *current, *saveable; ! 437: { ! 438: struct obstack_stack *p ! 439: = (struct obstack_stack *) obstack_alloc (&obstack_stack_obstack, ! 440: (sizeof (struct obstack_stack))); ! 441: ! 442: p->current = current_obstack; ! 443: p->saveable = saveable_obstack; ! 444: p->expression = expression_obstack; ! 445: p->rtl = rtl_obstack; ! 446: p->next = obstack_stack; ! 447: obstack_stack = p; ! 448: ! 449: current_obstack = current; ! 450: expression_obstack = current; ! 451: rtl_obstack = saveable_obstack = saveable; ! 452: } ! 453: ! 454: /* Save the current set of obstacks, but don't change them. */ ! 455: ! 456: void ! 457: push_obstacks_nochange () ! 458: { ! 459: struct obstack_stack *p ! 460: = (struct obstack_stack *) obstack_alloc (&obstack_stack_obstack, ! 461: (sizeof (struct obstack_stack))); ! 462: ! 463: p->current = current_obstack; ! 464: p->saveable = saveable_obstack; ! 465: p->expression = expression_obstack; ! 466: p->rtl = rtl_obstack; ! 467: p->next = obstack_stack; ! 468: obstack_stack = p; ! 469: } ! 470: ! 471: /* Pop the obstack selection stack. */ ! 472: ! 473: void ! 474: pop_obstacks () ! 475: { ! 476: struct obstack_stack *p = obstack_stack; ! 477: obstack_stack = p->next; ! 478: ! 479: current_obstack = p->current; ! 480: saveable_obstack = p->saveable; ! 481: expression_obstack = p->expression; ! 482: rtl_obstack = p->rtl; ! 483: ! 484: obstack_free (&obstack_stack_obstack, p); ! 485: } ! 486: ! 487: /* Nonzero if temporary allocation is currently in effect. ! 488: Zero if currently doing permanent allocation. */ ! 489: ! 490: int ! 491: allocation_temporary_p () ! 492: { ! 493: return current_obstack != &permanent_obstack; ! 494: } ! 495: ! 496: /* Go back to allocating on the permanent obstack ! 497: and free everything in the temporary obstack. ! 498: This is done in finish_function after fully compiling a function. */ ! 499: ! 500: void ! 501: permanent_allocation () ! 502: { ! 503: /* Free up previous temporary obstack data */ ! 504: obstack_free (&temporary_obstack, temporary_firstobj); ! 505: obstack_free (&momentary_obstack, momentary_firstobj); ! 506: obstack_free (&maybepermanent_obstack, maybepermanent_firstobj); ! 507: obstack_free (&temp_decl_obstack, temp_decl_firstobj); ! 508: ! 509: current_obstack = &permanent_obstack; ! 510: expression_obstack = &permanent_obstack; ! 511: rtl_obstack = saveable_obstack = &permanent_obstack; ! 512: #ifdef NEXT_SEMANTICS ! 513: reg_renumber = 0; ! 514: #endif ! 515: } ! 516: ! 517: /* Save permanently everything on the maybepermanent_obstack. */ ! 518: ! 519: void ! 520: preserve_data () ! 521: { ! 522: maybepermanent_firstobj ! 523: = (char *) obstack_alloc (function_maybepermanent_obstack, 0); ! 524: } ! 525: ! 526: void ! 527: preserve_initializer () ! 528: { ! 529: temporary_firstobj ! 530: = (char *) obstack_alloc (&temporary_obstack, 0); ! 531: momentary_firstobj ! 532: = (char *) obstack_alloc (&momentary_obstack, 0); ! 533: maybepermanent_firstobj ! 534: = (char *) obstack_alloc (function_maybepermanent_obstack, 0); ! 535: } ! 536: ! 537: /* Start allocating new rtl in current_obstack. ! 538: Use resume_temporary_allocation ! 539: to go back to allocating rtl in saveable_obstack. */ ! 540: ! 541: void ! 542: rtl_in_current_obstack () ! 543: { ! 544: rtl_obstack = current_obstack; ! 545: } ! 546: ! 547: /* Start allocating rtl from saveable_obstack. Intended to be used after ! 548: a call to push_obstacks_nochange. */ ! 549: ! 550: void ! 551: rtl_in_saveable_obstack () ! 552: { ! 553: rtl_obstack = saveable_obstack; ! 554: } ! 555: ! 556: /* Allocate SIZE bytes in the current obstack ! 557: and return a pointer to them. ! 558: In practice the current obstack is always the temporary one. */ ! 559: ! 560: char * ! 561: oballoc (size) ! 562: int size; ! 563: { ! 564: return (char *) obstack_alloc (current_obstack, size); ! 565: } ! 566: ! 567: /* Free the object PTR in the current obstack ! 568: as well as everything allocated since PTR. ! 569: In practice the current obstack is always the temporary one. */ ! 570: ! 571: void ! 572: obfree (ptr) ! 573: char *ptr; ! 574: { ! 575: obstack_free (current_obstack, ptr); ! 576: } ! 577: ! 578: /* Allocate SIZE bytes in the permanent obstack ! 579: and return a pointer to them. */ ! 580: ! 581: char * ! 582: permalloc (size) ! 583: int size; ! 584: { ! 585: return (char *) obstack_alloc (&permanent_obstack, size); ! 586: } ! 587: ! 588: /* Allocate NELEM items of SIZE bytes in the permanent obstack ! 589: and return a pointer to them. The storage is cleared before ! 590: returning the value. */ ! 591: ! 592: char * ! 593: perm_calloc (nelem, size) ! 594: int nelem; ! 595: long size; ! 596: { ! 597: char *rval = (char *) obstack_alloc (&permanent_obstack, nelem * size); ! 598: bzero (rval, nelem * size); ! 599: return rval; ! 600: } ! 601: ! 602: /* Allocate SIZE bytes in the saveable obstack ! 603: and return a pointer to them. */ ! 604: ! 605: char * ! 606: savealloc (size) ! 607: int size; ! 608: { ! 609: return (char *) obstack_alloc (saveable_obstack, size); ! 610: } ! 611: ! 612: /* Print out which obstack an object is in. */ ! 613: ! 614: void ! 615: print_obstack_name (object, file, prefix) ! 616: char *object; ! 617: FILE *file; ! 618: char *prefix; ! 619: { ! 620: struct obstack *obstack = NULL; ! 621: char *obstack_name = NULL; ! 622: struct function *p; ! 623: ! 624: for (p = outer_function_chain; p; p = p->next) ! 625: { ! 626: if (_obstack_allocated_p (p->function_obstack, object)) ! 627: { ! 628: obstack = p->function_obstack; ! 629: obstack_name = "containing function obstack"; ! 630: } ! 631: if (_obstack_allocated_p (p->function_maybepermanent_obstack, object)) ! 632: { ! 633: obstack = p->function_maybepermanent_obstack; ! 634: obstack_name = "containing function maybepermanent obstack"; ! 635: } ! 636: } ! 637: ! 638: if (_obstack_allocated_p (&obstack_stack_obstack, object)) ! 639: { ! 640: obstack = &obstack_stack_obstack; ! 641: obstack_name = "obstack_stack_obstack"; ! 642: } ! 643: else if (_obstack_allocated_p (function_obstack, object)) ! 644: { ! 645: obstack = function_obstack; ! 646: obstack_name = "function obstack"; ! 647: } ! 648: else if (_obstack_allocated_p (&permanent_obstack, object)) ! 649: { ! 650: obstack = &permanent_obstack; ! 651: obstack_name = "permanent_obstack"; ! 652: } ! 653: else if (_obstack_allocated_p (&momentary_obstack, object)) ! 654: { ! 655: obstack = &momentary_obstack; ! 656: obstack_name = "momentary_obstack"; ! 657: } ! 658: else if (_obstack_allocated_p (function_maybepermanent_obstack, object)) ! 659: { ! 660: obstack = function_maybepermanent_obstack; ! 661: obstack_name = "function maybepermanent obstack"; ! 662: } ! 663: else if (_obstack_allocated_p (&temp_decl_obstack, object)) ! 664: { ! 665: obstack = &temp_decl_obstack; ! 666: obstack_name = "temp_decl_obstack"; ! 667: } ! 668: ! 669: /* Check to see if the object is in the free area of the obstack. */ ! 670: if (obstack != NULL) ! 671: { ! 672: if (object >= obstack->next_free ! 673: && object < obstack->chunk_limit) ! 674: fprintf (file, "%s in free portion of obstack %s", ! 675: prefix, obstack_name); ! 676: else ! 677: fprintf (file, "%s allocated from %s", prefix, obstack_name); ! 678: } ! 679: else ! 680: fprintf (file, "%s not allocated from any obstack", prefix); ! 681: } ! 682: ! 683: void ! 684: debug_obstack (object) ! 685: char *object; ! 686: { ! 687: print_obstack_name (object, stderr, "object"); ! 688: fprintf (stderr, ".\n"); ! 689: } ! 690: ! 691: /* Return 1 if OBJ is in the permanent obstack. ! 692: This is slow, and should be used only for debugging. ! 693: Use TREE_PERMANENT for other purposes. */ ! 694: ! 695: int ! 696: object_permanent_p (obj) ! 697: tree obj; ! 698: { ! 699: return _obstack_allocated_p (&permanent_obstack, obj); ! 700: } ! 701: ! 702: /* Start a level of momentary allocation. ! 703: In C, each compound statement has its own level ! 704: and that level is freed at the end of each statement. ! 705: All expression nodes are allocated in the momentary allocation level. */ ! 706: ! 707: void ! 708: push_momentary () ! 709: { ! 710: struct momentary_level *tem ! 711: = (struct momentary_level *) obstack_alloc (&momentary_obstack, ! 712: sizeof (struct momentary_level)); ! 713: tem->prev = momentary_stack; ! 714: tem->base = (char *) obstack_base (&momentary_obstack); ! 715: tem->obstack = expression_obstack; ! 716: momentary_stack = tem; ! 717: expression_obstack = &momentary_obstack; ! 718: } ! 719: ! 720: /* Free all the storage in the current momentary-allocation level. ! 721: In C, this happens at the end of each statement. */ ! 722: ! 723: void ! 724: clear_momentary () ! 725: { ! 726: obstack_free (&momentary_obstack, momentary_stack->base); ! 727: } ! 728: ! 729: /* Discard a level of momentary allocation. ! 730: In C, this happens at the end of each compound statement. ! 731: Restore the status of expression node allocation ! 732: that was in effect before this level was created. */ ! 733: ! 734: void ! 735: pop_momentary () ! 736: { ! 737: struct momentary_level *tem = momentary_stack; ! 738: momentary_stack = tem->prev; ! 739: expression_obstack = tem->obstack; ! 740: obstack_free (&momentary_obstack, tem); ! 741: } ! 742: ! 743: /* Pop back to the previous level of momentary allocation, ! 744: but don't free any momentary data just yet. */ ! 745: ! 746: void ! 747: pop_momentary_nofree () ! 748: { ! 749: struct momentary_level *tem = momentary_stack; ! 750: momentary_stack = tem->prev; ! 751: expression_obstack = tem->obstack; ! 752: } ! 753: ! 754: /* Call when starting to parse a declaration: ! 755: make expressions in the declaration last the length of the function. ! 756: Returns an argument that should be passed to resume_momentary later. */ ! 757: ! 758: int ! 759: suspend_momentary () ! 760: { ! 761: register int tem = expression_obstack == &momentary_obstack; ! 762: expression_obstack = saveable_obstack; ! 763: return tem; ! 764: } ! 765: ! 766: /* Call when finished parsing a declaration: ! 767: restore the treatment of node-allocation that was ! 768: in effect before the suspension. ! 769: YES should be the value previously returned by suspend_momentary. */ ! 770: ! 771: void ! 772: resume_momentary (yes) ! 773: int yes; ! 774: { ! 775: if (yes) ! 776: expression_obstack = &momentary_obstack; ! 777: } ! 778: ! 779: /* Init the tables indexed by tree code. ! 780: Note that languages can add to these tables to define their own codes. */ ! 781: ! 782: void ! 783: init_tree_codes () ! 784: { ! 785: tree_code_type = (char **) xmalloc (sizeof (standard_tree_code_type)); ! 786: tree_code_length = (int *) xmalloc (sizeof (standard_tree_code_length)); ! 787: tree_code_name = (char **) xmalloc (sizeof (standard_tree_code_name)); ! 788: bcopy (standard_tree_code_type, tree_code_type, ! 789: sizeof (standard_tree_code_type)); ! 790: bcopy (standard_tree_code_length, tree_code_length, ! 791: sizeof (standard_tree_code_length)); ! 792: bcopy (standard_tree_code_name, tree_code_name, ! 793: sizeof (standard_tree_code_name)); ! 794: } ! 795: ! 796: /* Return a newly allocated node of code CODE. ! 797: Initialize the node's unique id and its TREE_PERMANENT flag. ! 798: For decl and type nodes, some other fields are initialized. ! 799: The rest of the node is initialized to zero. ! 800: ! 801: Achoo! I got a code in the node. */ ! 802: ! 803: tree ! 804: make_node (code) ! 805: enum tree_code code; ! 806: { ! 807: register tree t; ! 808: register int type = TREE_CODE_CLASS (code); ! 809: register int length; ! 810: register struct obstack *obstack = current_obstack; ! 811: register int i; ! 812: register tree_node_kind kind; ! 813: ! 814: switch (type) ! 815: { ! 816: case 'd': /* A decl node */ ! 817: #ifdef GATHER_STATISTICS ! 818: kind = d_kind; ! 819: #endif ! 820: length = sizeof (struct tree_decl); ! 821: /* All decls in an inline function need to be saved. */ ! 822: if (obstack != &permanent_obstack) ! 823: obstack = saveable_obstack; ! 824: ! 825: /* PARM_DECLs go on the context of the parent. If this is a nested ! 826: function, then we must allocate the PARM_DECL on the parent's ! 827: obstack, so that they will live to the end of the parent's ! 828: closing brace. This is neccesary in case we try to inline the ! 829: function into its parent. ! 830: ! 831: PARM_DECLs of top-level functions do not have this problem. However, ! 832: we allocate them where we put the FUNCTION_DECL for languauges such as ! 833: Ada that need to consult some flags in the PARM_DECLs of the function ! 834: when calling it. ! 835: ! 836: See comment in restore_tree_status for why we can't put this ! 837: in function_obstack. */ ! 838: if (code == PARM_DECL && obstack != &permanent_obstack) ! 839: { ! 840: tree context = 0; ! 841: if (current_function_decl) ! 842: context = decl_function_context (current_function_decl); ! 843: ! 844: if (context) ! 845: obstack ! 846: = find_function_data (context)->function_maybepermanent_obstack; ! 847: } ! 848: break; ! 849: ! 850: case 't': /* a type node */ ! 851: #ifdef GATHER_STATISTICS ! 852: kind = t_kind; ! 853: #endif ! 854: length = sizeof (struct tree_type); ! 855: /* All data types are put where we can preserve them if nec. */ ! 856: if (obstack != &permanent_obstack) ! 857: obstack = all_types_permanent ? &permanent_obstack : saveable_obstack; ! 858: break; ! 859: ! 860: case 'b': /* a lexical block */ ! 861: #ifdef GATHER_STATISTICS ! 862: kind = b_kind; ! 863: #endif ! 864: length = sizeof (struct tree_block); ! 865: /* All BLOCK nodes are put where we can preserve them if nec. */ ! 866: if (obstack != &permanent_obstack) ! 867: obstack = saveable_obstack; ! 868: break; ! 869: ! 870: case 's': /* an expression with side effects */ ! 871: #ifdef GATHER_STATISTICS ! 872: kind = s_kind; ! 873: goto usual_kind; ! 874: #endif ! 875: case 'r': /* a reference */ ! 876: #ifdef GATHER_STATISTICS ! 877: kind = r_kind; ! 878: goto usual_kind; ! 879: #endif ! 880: case 'e': /* an expression */ ! 881: case '<': /* a comparison expression */ ! 882: case '1': /* a unary arithmetic expression */ ! 883: case '2': /* a binary arithmetic expression */ ! 884: #ifdef GATHER_STATISTICS ! 885: kind = e_kind; ! 886: usual_kind: ! 887: #endif ! 888: obstack = expression_obstack; ! 889: /* All BIND_EXPR nodes are put where we can preserve them if nec. */ ! 890: if (code == BIND_EXPR && obstack != &permanent_obstack) ! 891: obstack = saveable_obstack; ! 892: length = sizeof (struct tree_exp) ! 893: + (tree_code_length[(int) code] - 1) * sizeof (char *); ! 894: break; ! 895: ! 896: case 'c': /* a constant */ ! 897: #ifdef GATHER_STATISTICS ! 898: kind = c_kind; ! 899: #endif ! 900: obstack = expression_obstack; ! 901: ! 902: /* We can't use tree_code_length for INTEGER_CST, since the number of ! 903: words is machine-dependent due to varying length of HOST_WIDE_INT, ! 904: which might be wider than a pointer (e.g., long long). Similarly ! 905: for REAL_CST, since the number of words is machine-dependent due ! 906: to varying size and alignment of `double'. */ ! 907: ! 908: if (code == INTEGER_CST) ! 909: length = sizeof (struct tree_int_cst); ! 910: else if (code == REAL_CST) ! 911: length = sizeof (struct tree_real_cst); ! 912: else ! 913: length = sizeof (struct tree_common) ! 914: + tree_code_length[(int) code] * sizeof (char *); ! 915: break; ! 916: ! 917: case 'x': /* something random, like an identifier. */ ! 918: #ifdef GATHER_STATISTICS ! 919: if (code == IDENTIFIER_NODE) ! 920: kind = id_kind; ! 921: else if (code == OP_IDENTIFIER) ! 922: kind = op_id_kind; ! 923: else if (code == TREE_VEC) ! 924: kind = vec_kind; ! 925: else ! 926: kind = x_kind; ! 927: #endif ! 928: length = sizeof (struct tree_common) ! 929: + tree_code_length[(int) code] * sizeof (char *); ! 930: /* Identifier nodes are always permanent since they are ! 931: unique in a compiler run. */ ! 932: if (code == IDENTIFIER_NODE) obstack = &permanent_obstack; ! 933: } ! 934: ! 935: t = (tree) obstack_alloc (obstack, length); ! 936: ! 937: #ifdef GATHER_STATISTICS ! 938: tree_node_counts[(int)kind]++; ! 939: tree_node_sizes[(int)kind] += length; ! 940: #endif ! 941: ! 942: /* Clear a word at a time. */ ! 943: for (i = (length / sizeof (int)) - 1; i >= 0; i--) ! 944: ((int *) t)[i] = 0; ! 945: /* Clear any extra bytes. */ ! 946: for (i = length / sizeof (int) * sizeof (int); i < length; i++) ! 947: ((char *) t)[i] = 0; ! 948: ! 949: TREE_SET_CODE (t, code); ! 950: if (obstack == &permanent_obstack) ! 951: TREE_PERMANENT (t) = 1; ! 952: ! 953: switch (type) ! 954: { ! 955: case 's': ! 956: TREE_SIDE_EFFECTS (t) = 1; ! 957: TREE_TYPE (t) = void_type_node; ! 958: break; ! 959: ! 960: case 'd': ! 961: if (code != FUNCTION_DECL) ! 962: DECL_ALIGN (t) = 1; ! 963: DECL_IN_SYSTEM_HEADER (t) ! 964: = in_system_header && (obstack == &permanent_obstack); ! 965: DECL_SOURCE_LINE (t) = lineno; ! 966: DECL_SOURCE_FILE (t) = (input_filename) ? input_filename : "<built-in>"; ! 967: DECL_UID (t) = next_decl_uid++; ! 968: break; ! 969: ! 970: case 't': ! 971: TYPE_UID (t) = next_type_uid++; ! 972: TYPE_ALIGN (t) = 1; ! 973: TYPE_MAIN_VARIANT (t) = t; ! 974: TYPE_OBSTACK (t) = obstack; ! 975: break; ! 976: ! 977: case 'c': ! 978: TREE_CONSTANT (t) = 1; ! 979: break; ! 980: } ! 981: ! 982: return t; ! 983: } ! 984: ! 985: /* Return a new node with the same contents as NODE ! 986: except that its TREE_CHAIN is zero and it has a fresh uid. */ ! 987: ! 988: tree ! 989: copy_node (node) ! 990: tree node; ! 991: { ! 992: register tree t; ! 993: register enum tree_code code = TREE_CODE (node); ! 994: register int length; ! 995: register int i; ! 996: ! 997: switch (TREE_CODE_CLASS (code)) ! 998: { ! 999: case 'd': /* A decl node */ ! 1000: length = sizeof (struct tree_decl); ! 1001: break; ! 1002: ! 1003: case 't': /* a type node */ ! 1004: length = sizeof (struct tree_type); ! 1005: break; ! 1006: ! 1007: case 'b': /* a lexical block node */ ! 1008: length = sizeof (struct tree_block); ! 1009: break; ! 1010: ! 1011: case 'r': /* a reference */ ! 1012: case 'e': /* an expression */ ! 1013: case 's': /* an expression with side effects */ ! 1014: case '<': /* a comparison expression */ ! 1015: case '1': /* a unary arithmetic expression */ ! 1016: case '2': /* a binary arithmetic expression */ ! 1017: length = sizeof (struct tree_exp) ! 1018: + (tree_code_length[(int) code] - 1) * sizeof (char *); ! 1019: break; ! 1020: ! 1021: case 'c': /* a constant */ ! 1022: /* We can't use tree_code_length for this, since the number of words ! 1023: is machine-dependent due to varying alignment of `double'. */ ! 1024: if (code == REAL_CST) ! 1025: { ! 1026: length = sizeof (struct tree_real_cst); ! 1027: break; ! 1028: } ! 1029: ! 1030: case 'x': /* something random, like an identifier. */ ! 1031: length = sizeof (struct tree_common) ! 1032: + tree_code_length[(int) code] * sizeof (char *); ! 1033: if (code == TREE_VEC) ! 1034: length += (TREE_VEC_LENGTH (node) - 1) * sizeof (char *); ! 1035: } ! 1036: ! 1037: t = (tree) obstack_alloc (current_obstack, length); ! 1038: ! 1039: for (i = (length / sizeof (int)) - 1; i >= 0; i--) ! 1040: ((int *) t)[i] = ((int *) node)[i]; ! 1041: /* Clear any extra bytes. */ ! 1042: for (i = length / sizeof (int) * sizeof (int); i < length; i++) ! 1043: ((char *) t)[i] = ((char *) node)[i]; ! 1044: ! 1045: TREE_CHAIN (t) = 0; ! 1046: ! 1047: if (TREE_CODE_CLASS (code) == 'd') ! 1048: DECL_UID (t) = next_decl_uid++; ! 1049: else if (TREE_CODE_CLASS (code) == 't') ! 1050: { ! 1051: TYPE_UID (t) = next_type_uid++; ! 1052: TYPE_OBSTACK (t) = current_obstack; ! 1053: } ! 1054: ! 1055: TREE_PERMANENT (t) = (current_obstack == &permanent_obstack); ! 1056: ! 1057: return t; ! 1058: } ! 1059: ! 1060: /* Return a copy of a chain of nodes, chained through the TREE_CHAIN field. ! 1061: For example, this can copy a list made of TREE_LIST nodes. */ ! 1062: ! 1063: tree ! 1064: copy_list (list) ! 1065: tree list; ! 1066: { ! 1067: tree head; ! 1068: register tree prev, next; ! 1069: ! 1070: if (list == 0) ! 1071: return 0; ! 1072: ! 1073: head = prev = copy_node (list); ! 1074: next = TREE_CHAIN (list); ! 1075: while (next) ! 1076: { ! 1077: TREE_CHAIN (prev) = copy_node (next); ! 1078: prev = TREE_CHAIN (prev); ! 1079: next = TREE_CHAIN (next); ! 1080: } ! 1081: return head; ! 1082: } ! 1083: ! 1084: #define HASHBITS 30 ! 1085: ! 1086: /* Return an IDENTIFIER_NODE whose name is TEXT (a null-terminated string). ! 1087: If an identifier with that name has previously been referred to, ! 1088: the same node is returned this time. */ ! 1089: ! 1090: tree ! 1091: get_identifier (text) ! 1092: register char *text; ! 1093: { ! 1094: register int hi; ! 1095: register int i; ! 1096: register tree idp; ! 1097: register int len, hash_len; ! 1098: ! 1099: /* Compute length of text in len. */ ! 1100: for (len = 0; text[len]; len++); ! 1101: ! 1102: /* Decide how much of that length to hash on */ ! 1103: hash_len = len; ! 1104: if (warn_id_clash && len > id_clash_len) ! 1105: hash_len = id_clash_len; ! 1106: ! 1107: /* Compute hash code */ ! 1108: hi = hash_len * 613 + (unsigned)text[0]; ! 1109: for (i = 1; i < hash_len; i += 2) ! 1110: hi = ((hi * 613) + (unsigned)(text[i])); ! 1111: ! 1112: hi &= (1 << HASHBITS) - 1; ! 1113: hi %= MAX_HASH_TABLE; ! 1114: ! 1115: /* Search table for identifier */ ! 1116: for (idp = hash_table[hi]; idp; idp = TREE_CHAIN (idp)) ! 1117: if (IDENTIFIER_LENGTH (idp) == len ! 1118: && IDENTIFIER_POINTER (idp)[0] == text[0] ! 1119: && !bcmp (IDENTIFIER_POINTER (idp), text, len)) ! 1120: return idp; /* <-- return if found */ ! 1121: ! 1122: /* Not found; optionally warn about a similar identifier */ ! 1123: if (warn_id_clash && do_identifier_warnings && len >= id_clash_len) ! 1124: for (idp = hash_table[hi]; idp; idp = TREE_CHAIN (idp)) ! 1125: if (!strncmp (IDENTIFIER_POINTER (idp), text, id_clash_len)) ! 1126: { ! 1127: warning ("`%s' and `%s' identical in first %d characters", ! 1128: IDENTIFIER_POINTER (idp), text, id_clash_len); ! 1129: break; ! 1130: } ! 1131: ! 1132: if (tree_code_length[(int) IDENTIFIER_NODE] < 0) ! 1133: abort (); /* set_identifier_size hasn't been called. */ ! 1134: ! 1135: /* Not found, create one, add to chain */ ! 1136: idp = make_node (IDENTIFIER_NODE); ! 1137: IDENTIFIER_LENGTH (idp) = len; ! 1138: #ifdef GATHER_STATISTICS ! 1139: id_string_size += len; ! 1140: #endif ! 1141: ! 1142: IDENTIFIER_POINTER (idp) = obstack_copy0 (&permanent_obstack, text, len); ! 1143: ! 1144: TREE_CHAIN (idp) = hash_table[hi]; ! 1145: hash_table[hi] = idp; ! 1146: return idp; /* <-- return if created */ ! 1147: } ! 1148: ! 1149: /* Enable warnings on similar identifiers (if requested). ! 1150: Done after the built-in identifiers are created. */ ! 1151: ! 1152: void ! 1153: start_identifier_warnings () ! 1154: { ! 1155: do_identifier_warnings = 1; ! 1156: } ! 1157: ! 1158: /* Record the size of an identifier node for the language in use. ! 1159: SIZE is the total size in bytes. ! 1160: This is called by the language-specific files. This must be ! 1161: called before allocating any identifiers. */ ! 1162: ! 1163: void ! 1164: set_identifier_size (size) ! 1165: int size; ! 1166: { ! 1167: tree_code_length[(int) IDENTIFIER_NODE] ! 1168: = (size - sizeof (struct tree_common)) / sizeof (tree); ! 1169: } ! 1170: ! 1171: /* Return a newly constructed INTEGER_CST node whose constant value ! 1172: is specified by the two ints LOW and HI. ! 1173: The TREE_TYPE is set to `int'. ! 1174: ! 1175: This function should be used via the `build_int_2' macro. */ ! 1176: ! 1177: tree ! 1178: build_int_2_wide (low, hi) ! 1179: HOST_WIDE_INT low, hi; ! 1180: { ! 1181: register tree t = make_node (INTEGER_CST); ! 1182: TREE_INT_CST_LOW (t) = low; ! 1183: TREE_INT_CST_HIGH (t) = hi; ! 1184: TREE_TYPE (t) = integer_type_node; ! 1185: return t; ! 1186: } ! 1187: ! 1188: /* Return a new REAL_CST node whose type is TYPE and value is D. */ ! 1189: ! 1190: tree ! 1191: build_real (type, d) ! 1192: tree type; ! 1193: REAL_VALUE_TYPE d; ! 1194: { ! 1195: tree v; ! 1196: ! 1197: /* Check for valid float value for this type on this target machine; ! 1198: if not, can print error message and store a valid value in D. */ ! 1199: #ifdef CHECK_FLOAT_VALUE ! 1200: CHECK_FLOAT_VALUE (TYPE_MODE (type), d); ! 1201: #endif ! 1202: ! 1203: v = make_node (REAL_CST); ! 1204: TREE_TYPE (v) = type; ! 1205: TREE_REAL_CST (v) = d; ! 1206: return v; ! 1207: } ! 1208: ! 1209: /* Return a new REAL_CST node whose type is TYPE ! 1210: and whose value is the integer value of the INTEGER_CST node I. */ ! 1211: ! 1212: #if !defined (REAL_IS_NOT_DOUBLE) || defined (REAL_ARITHMETIC) ! 1213: ! 1214: REAL_VALUE_TYPE ! 1215: real_value_from_int_cst (i) ! 1216: tree i; ! 1217: { ! 1218: REAL_VALUE_TYPE d; ! 1219: REAL_VALUE_TYPE e; ! 1220: /* Some 386 compilers mishandle unsigned int to float conversions, ! 1221: so introduce a temporary variable E to avoid those bugs. */ ! 1222: ! 1223: #ifdef REAL_ARITHMETIC ! 1224: if (! TREE_UNSIGNED (TREE_TYPE (i))) ! 1225: REAL_VALUE_FROM_INT (d, TREE_INT_CST_LOW (i), TREE_INT_CST_HIGH (i)); ! 1226: else ! 1227: REAL_VALUE_FROM_UNSIGNED_INT (d, TREE_INT_CST_LOW (i), TREE_INT_CST_HIGH (i)); ! 1228: #else /* not REAL_ARITHMETIC */ ! 1229: if (TREE_INT_CST_HIGH (i) < 0 && ! TREE_UNSIGNED (TREE_TYPE (i))) ! 1230: { ! 1231: d = (double) (~ TREE_INT_CST_HIGH (i)); ! 1232: e = ((double) ((HOST_WIDE_INT) 1 << (HOST_BITS_PER_WIDE_INT / 2)) ! 1233: * (double) ((HOST_WIDE_INT) 1 << (HOST_BITS_PER_WIDE_INT / 2))); ! 1234: d *= e; ! 1235: e = (double) (unsigned HOST_WIDE_INT) (~ TREE_INT_CST_LOW (i)); ! 1236: d += e; ! 1237: d = (- d - 1.0); ! 1238: } ! 1239: else ! 1240: { ! 1241: d = (double) (unsigned HOST_WIDE_INT) TREE_INT_CST_HIGH (i); ! 1242: e = ((double) ((HOST_WIDE_INT) 1 << (HOST_BITS_PER_WIDE_INT / 2)) ! 1243: * (double) ((HOST_WIDE_INT) 1 << (HOST_BITS_PER_WIDE_INT / 2))); ! 1244: d *= e; ! 1245: e = (double) (unsigned HOST_WIDE_INT) TREE_INT_CST_LOW (i); ! 1246: d += e; ! 1247: } ! 1248: #endif /* not REAL_ARITHMETIC */ ! 1249: return d; ! 1250: } ! 1251: ! 1252: /* This function can't be implemented if we can't do arithmetic ! 1253: on the float representation. */ ! 1254: ! 1255: tree ! 1256: build_real_from_int_cst (type, i) ! 1257: tree type; ! 1258: tree i; ! 1259: { ! 1260: tree v; ! 1261: REAL_VALUE_TYPE d; ! 1262: ! 1263: v = make_node (REAL_CST); ! 1264: TREE_TYPE (v) = type; ! 1265: ! 1266: d = REAL_VALUE_TRUNCATE (TYPE_MODE (type), real_value_from_int_cst (i)); ! 1267: /* Check for valid float value for this type on this target machine; ! 1268: if not, can print error message and store a valid value in D. */ ! 1269: #ifdef CHECK_FLOAT_VALUE ! 1270: CHECK_FLOAT_VALUE (TYPE_MODE (type), d); ! 1271: #endif ! 1272: ! 1273: TREE_REAL_CST (v) = d; ! 1274: return v; ! 1275: } ! 1276: ! 1277: #endif /* not REAL_IS_NOT_DOUBLE, or REAL_ARITHMETIC */ ! 1278: ! 1279: /* Return a newly constructed STRING_CST node whose value is ! 1280: the LEN characters at STR. ! 1281: The TREE_TYPE is not initialized. */ ! 1282: ! 1283: tree ! 1284: build_string (len, str) ! 1285: int len; ! 1286: char *str; ! 1287: { ! 1288: /* Put the string in saveable_obstack since it will be placed in the RTL ! 1289: for an "asm" statement and will also be kept around a while if ! 1290: deferring constant output in varasm.c. */ ! 1291: ! 1292: register tree s = make_node (STRING_CST); ! 1293: TREE_STRING_LENGTH (s) = len; ! 1294: TREE_STRING_POINTER (s) = obstack_copy0 (saveable_obstack, str, len); ! 1295: return s; ! 1296: } ! 1297: ! 1298: /* Return a newly constructed COMPLEX_CST node whose value is ! 1299: specified by the real and imaginary parts REAL and IMAG. ! 1300: Both REAL and IMAG should be constant nodes. ! 1301: The TREE_TYPE is not initialized. */ ! 1302: ! 1303: tree ! 1304: build_complex (real, imag) ! 1305: tree real, imag; ! 1306: { ! 1307: register tree t = make_node (COMPLEX_CST); ! 1308: TREE_REALPART (t) = real; ! 1309: TREE_IMAGPART (t) = imag; ! 1310: TREE_TYPE (t) = build_complex_type (TREE_TYPE (real)); ! 1311: return t; ! 1312: } ! 1313: ! 1314: /* Build a newly constructed TREE_VEC node of length LEN. */ ! 1315: tree ! 1316: make_tree_vec (len) ! 1317: int len; ! 1318: { ! 1319: register tree t; ! 1320: register int length = (len-1) * sizeof (tree) + sizeof (struct tree_vec); ! 1321: register struct obstack *obstack = current_obstack; ! 1322: register int i; ! 1323: ! 1324: #ifdef GATHER_STATISTICS ! 1325: tree_node_counts[(int)vec_kind]++; ! 1326: tree_node_sizes[(int)vec_kind] += length; ! 1327: #endif ! 1328: ! 1329: t = (tree) obstack_alloc (obstack, length); ! 1330: ! 1331: for (i = (length / sizeof (int)) - 1; i >= 0; i--) ! 1332: ((int *) t)[i] = 0; ! 1333: ! 1334: TREE_SET_CODE (t, TREE_VEC); ! 1335: TREE_VEC_LENGTH (t) = len; ! 1336: if (obstack == &permanent_obstack) ! 1337: TREE_PERMANENT (t) = 1; ! 1338: ! 1339: return t; ! 1340: } ! 1341: ! 1342: /* Return 1 if EXPR is the integer constant zero. */ ! 1343: ! 1344: int ! 1345: integer_zerop (expr) ! 1346: tree expr; ! 1347: { ! 1348: STRIP_NOPS (expr); ! 1349: ! 1350: return (TREE_CODE (expr) == INTEGER_CST ! 1351: && TREE_INT_CST_LOW (expr) == 0 ! 1352: && TREE_INT_CST_HIGH (expr) == 0); ! 1353: } ! 1354: ! 1355: /* Return 1 if EXPR is the integer constant one. */ ! 1356: ! 1357: int ! 1358: integer_onep (expr) ! 1359: tree expr; ! 1360: { ! 1361: STRIP_NOPS (expr); ! 1362: ! 1363: return (TREE_CODE (expr) == INTEGER_CST ! 1364: && TREE_INT_CST_LOW (expr) == 1 ! 1365: && TREE_INT_CST_HIGH (expr) == 0); ! 1366: } ! 1367: ! 1368: /* Return 1 if EXPR is an integer containing all 1's ! 1369: in as much precision as it contains. */ ! 1370: ! 1371: int ! 1372: integer_all_onesp (expr) ! 1373: tree expr; ! 1374: { ! 1375: register int prec; ! 1376: register int uns; ! 1377: ! 1378: STRIP_NOPS (expr); ! 1379: ! 1380: if (TREE_CODE (expr) != INTEGER_CST) ! 1381: return 0; ! 1382: ! 1383: uns = TREE_UNSIGNED (TREE_TYPE (expr)); ! 1384: if (!uns) ! 1385: return TREE_INT_CST_LOW (expr) == -1 && TREE_INT_CST_HIGH (expr) == -1; ! 1386: ! 1387: prec = TYPE_PRECISION (TREE_TYPE (expr)); ! 1388: if (prec >= HOST_BITS_PER_WIDE_INT) ! 1389: { ! 1390: int high_value, shift_amount; ! 1391: ! 1392: shift_amount = prec - HOST_BITS_PER_WIDE_INT; ! 1393: ! 1394: if (shift_amount > HOST_BITS_PER_WIDE_INT) ! 1395: /* Can not handle precisions greater than twice the host int size. */ ! 1396: abort (); ! 1397: else if (shift_amount == HOST_BITS_PER_WIDE_INT) ! 1398: /* Shifting by the host word size is undefined according to the ANSI ! 1399: standard, so we must handle this as a special case. */ ! 1400: high_value = -1; ! 1401: else ! 1402: high_value = ((HOST_WIDE_INT) 1 << shift_amount) - 1; ! 1403: ! 1404: return TREE_INT_CST_LOW (expr) == -1 ! 1405: && TREE_INT_CST_HIGH (expr) == high_value; ! 1406: } ! 1407: else ! 1408: return TREE_INT_CST_LOW (expr) == ((HOST_WIDE_INT) 1 << prec) - 1; ! 1409: } ! 1410: ! 1411: /* Return 1 if EXPR is an integer constant that is a power of 2 (i.e., has only ! 1412: one bit on). */ ! 1413: ! 1414: int ! 1415: integer_pow2p (expr) ! 1416: tree expr; ! 1417: { ! 1418: HOST_WIDE_INT high, low; ! 1419: ! 1420: STRIP_NOPS (expr); ! 1421: ! 1422: if (TREE_CODE (expr) != INTEGER_CST) ! 1423: return 0; ! 1424: ! 1425: high = TREE_INT_CST_HIGH (expr); ! 1426: low = TREE_INT_CST_LOW (expr); ! 1427: ! 1428: if (high == 0 && low == 0) ! 1429: return 0; ! 1430: ! 1431: return ((high == 0 && (low & (low - 1)) == 0) ! 1432: || (low == 0 && (high & (high - 1)) == 0)); ! 1433: } ! 1434: ! 1435: /* Return 1 if EXPR is the real constant zero. */ ! 1436: ! 1437: int ! 1438: real_zerop (expr) ! 1439: tree expr; ! 1440: { ! 1441: STRIP_NOPS (expr); ! 1442: ! 1443: return (TREE_CODE (expr) == REAL_CST ! 1444: && REAL_VALUES_EQUAL (TREE_REAL_CST (expr), dconst0)); ! 1445: } ! 1446: ! 1447: /* Return 1 if EXPR is the real constant one. */ ! 1448: ! 1449: int ! 1450: real_onep (expr) ! 1451: tree expr; ! 1452: { ! 1453: STRIP_NOPS (expr); ! 1454: ! 1455: return (TREE_CODE (expr) == REAL_CST ! 1456: && REAL_VALUES_EQUAL (TREE_REAL_CST (expr), dconst1)); ! 1457: } ! 1458: ! 1459: /* Return 1 if EXPR is the real constant two. */ ! 1460: ! 1461: int ! 1462: real_twop (expr) ! 1463: tree expr; ! 1464: { ! 1465: STRIP_NOPS (expr); ! 1466: ! 1467: return (TREE_CODE (expr) == REAL_CST ! 1468: && REAL_VALUES_EQUAL (TREE_REAL_CST (expr), dconst2)); ! 1469: } ! 1470: ! 1471: /* Nonzero if EXP is a constant or a cast of a constant. */ ! 1472: ! 1473: int ! 1474: really_constant_p (exp) ! 1475: tree exp; ! 1476: { ! 1477: /* This is not quite the same as STRIP_NOPS. It does more. */ ! 1478: while (TREE_CODE (exp) == NOP_EXPR ! 1479: || TREE_CODE (exp) == CONVERT_EXPR ! 1480: || TREE_CODE (exp) == NON_LVALUE_EXPR) ! 1481: exp = TREE_OPERAND (exp, 0); ! 1482: return TREE_CONSTANT (exp); ! 1483: } ! 1484: ! 1485: /* Return first list element whose TREE_VALUE is ELEM. ! 1486: Return 0 if ELEM is not it LIST. */ ! 1487: ! 1488: tree ! 1489: value_member (elem, list) ! 1490: tree elem, list; ! 1491: { ! 1492: while (list) ! 1493: { ! 1494: if (elem == TREE_VALUE (list)) ! 1495: return list; ! 1496: list = TREE_CHAIN (list); ! 1497: } ! 1498: return NULL_TREE; ! 1499: } ! 1500: ! 1501: /* Return first list element whose TREE_PURPOSE is ELEM. ! 1502: Return 0 if ELEM is not it LIST. */ ! 1503: ! 1504: tree ! 1505: purpose_member (elem, list) ! 1506: tree elem, list; ! 1507: { ! 1508: while (list) ! 1509: { ! 1510: if (elem == TREE_PURPOSE (list)) ! 1511: return list; ! 1512: list = TREE_CHAIN (list); ! 1513: } ! 1514: return NULL_TREE; ! 1515: } ! 1516: ! 1517: /* Return first list element whose BINFO_TYPE is ELEM. ! 1518: Return 0 if ELEM is not it LIST. */ ! 1519: ! 1520: tree ! 1521: binfo_member (elem, list) ! 1522: tree elem, list; ! 1523: { ! 1524: while (list) ! 1525: { ! 1526: if (elem == BINFO_TYPE (list)) ! 1527: return list; ! 1528: list = TREE_CHAIN (list); ! 1529: } ! 1530: return NULL_TREE; ! 1531: } ! 1532: ! 1533: /* Return nonzero if ELEM is part of the chain CHAIN. */ ! 1534: ! 1535: int ! 1536: chain_member (elem, chain) ! 1537: tree elem, chain; ! 1538: { ! 1539: while (chain) ! 1540: { ! 1541: if (elem == chain) ! 1542: return 1; ! 1543: chain = TREE_CHAIN (chain); ! 1544: } ! 1545: ! 1546: return 0; ! 1547: } ! 1548: ! 1549: /* Return the length of a chain of nodes chained through TREE_CHAIN. ! 1550: We expect a null pointer to mark the end of the chain. ! 1551: This is the Lisp primitive `length'. */ ! 1552: ! 1553: int ! 1554: list_length (t) ! 1555: tree t; ! 1556: { ! 1557: register tree tail; ! 1558: register int len = 0; ! 1559: ! 1560: for (tail = t; tail; tail = TREE_CHAIN (tail)) ! 1561: len++; ! 1562: ! 1563: return len; ! 1564: } ! 1565: ! 1566: /* Concatenate two chains of nodes (chained through TREE_CHAIN) ! 1567: by modifying the last node in chain 1 to point to chain 2. ! 1568: This is the Lisp primitive `nconc'. */ ! 1569: ! 1570: tree ! 1571: chainon (op1, op2) ! 1572: tree op1, op2; ! 1573: { ! 1574: tree t; ! 1575: ! 1576: if (op1) ! 1577: { ! 1578: for (t = op1; TREE_CHAIN (t); t = TREE_CHAIN (t)) ! 1579: if (t == op2) abort (); /* Circularity being created */ ! 1580: if (t == op2) abort (); /* Circularity being created */ ! 1581: TREE_CHAIN (t) = op2; ! 1582: return op1; ! 1583: } ! 1584: else return op2; ! 1585: } ! 1586: ! 1587: /* Return the last node in a chain of nodes (chained through TREE_CHAIN). */ ! 1588: ! 1589: tree ! 1590: tree_last (chain) ! 1591: register tree chain; ! 1592: { ! 1593: register tree next; ! 1594: if (chain) ! 1595: while (next = TREE_CHAIN (chain)) ! 1596: chain = next; ! 1597: return chain; ! 1598: } ! 1599: ! 1600: /* Reverse the order of elements in the chain T, ! 1601: and return the new head of the chain (old last element). */ ! 1602: ! 1603: tree ! 1604: nreverse (t) ! 1605: tree t; ! 1606: { ! 1607: register tree prev = 0, decl, next; ! 1608: for (decl = t; decl; decl = next) ! 1609: { ! 1610: next = TREE_CHAIN (decl); ! 1611: TREE_CHAIN (decl) = prev; ! 1612: prev = decl; ! 1613: } ! 1614: return prev; ! 1615: } ! 1616: ! 1617: /* Given a chain CHAIN of tree nodes, ! 1618: construct and return a list of those nodes. */ ! 1619: ! 1620: tree ! 1621: listify (chain) ! 1622: tree chain; ! 1623: { ! 1624: tree result = NULL_TREE; ! 1625: tree in_tail = chain; ! 1626: tree out_tail = NULL_TREE; ! 1627: ! 1628: while (in_tail) ! 1629: { ! 1630: tree next = tree_cons (NULL_TREE, in_tail, NULL_TREE); ! 1631: if (out_tail) ! 1632: TREE_CHAIN (out_tail) = next; ! 1633: else ! 1634: result = next; ! 1635: out_tail = next; ! 1636: in_tail = TREE_CHAIN (in_tail); ! 1637: } ! 1638: ! 1639: return result; ! 1640: } ! 1641: ! 1642: /* Return a newly created TREE_LIST node whose ! 1643: purpose and value fields are PARM and VALUE. */ ! 1644: ! 1645: tree ! 1646: build_tree_list (parm, value) ! 1647: tree parm, value; ! 1648: { ! 1649: register tree t = make_node (TREE_LIST); ! 1650: TREE_PURPOSE (t) = parm; ! 1651: TREE_VALUE (t) = value; ! 1652: return t; ! 1653: } ! 1654: ! 1655: /* Similar, but build on the temp_decl_obstack. */ ! 1656: ! 1657: tree ! 1658: build_decl_list (parm, value) ! 1659: tree parm, value; ! 1660: { ! 1661: register tree node; ! 1662: register struct obstack *ambient_obstack = current_obstack; ! 1663: current_obstack = &temp_decl_obstack; ! 1664: node = build_tree_list (parm, value); ! 1665: current_obstack = ambient_obstack; ! 1666: return node; ! 1667: } ! 1668: ! 1669: /* Return a newly created TREE_LIST node whose ! 1670: purpose and value fields are PARM and VALUE ! 1671: and whose TREE_CHAIN is CHAIN. */ ! 1672: ! 1673: tree ! 1674: tree_cons (purpose, value, chain) ! 1675: tree purpose, value, chain; ! 1676: { ! 1677: #if 0 ! 1678: register tree node = make_node (TREE_LIST); ! 1679: #else ! 1680: register int i; ! 1681: register tree node = (tree) obstack_alloc (current_obstack, sizeof (struct tree_list)); ! 1682: #ifdef GATHER_STATISTICS ! 1683: tree_node_counts[(int)x_kind]++; ! 1684: tree_node_sizes[(int)x_kind] += sizeof (struct tree_list); ! 1685: #endif ! 1686: ! 1687: for (i = (sizeof (struct tree_common) / sizeof (int)) - 1; i >= 0; i--) ! 1688: ((int *) node)[i] = 0; ! 1689: ! 1690: TREE_SET_CODE (node, TREE_LIST); ! 1691: if (current_obstack == &permanent_obstack) ! 1692: TREE_PERMANENT (node) = 1; ! 1693: #endif ! 1694: ! 1695: TREE_CHAIN (node) = chain; ! 1696: TREE_PURPOSE (node) = purpose; ! 1697: TREE_VALUE (node) = value; ! 1698: return node; ! 1699: } ! 1700: ! 1701: /* Similar, but build on the temp_decl_obstack. */ ! 1702: ! 1703: tree ! 1704: decl_tree_cons (purpose, value, chain) ! 1705: tree purpose, value, chain; ! 1706: { ! 1707: register tree node; ! 1708: register struct obstack *ambient_obstack = current_obstack; ! 1709: current_obstack = &temp_decl_obstack; ! 1710: node = tree_cons (purpose, value, chain); ! 1711: current_obstack = ambient_obstack; ! 1712: return node; ! 1713: } ! 1714: ! 1715: /* Same as `tree_cons' but make a permanent object. */ ! 1716: ! 1717: tree ! 1718: perm_tree_cons (purpose, value, chain) ! 1719: tree purpose, value, chain; ! 1720: { ! 1721: register tree node; ! 1722: register struct obstack *ambient_obstack = current_obstack; ! 1723: current_obstack = &permanent_obstack; ! 1724: ! 1725: node = tree_cons (purpose, value, chain); ! 1726: current_obstack = ambient_obstack; ! 1727: return node; ! 1728: } ! 1729: ! 1730: /* Same as `tree_cons', but make this node temporary, regardless. */ ! 1731: ! 1732: tree ! 1733: temp_tree_cons (purpose, value, chain) ! 1734: tree purpose, value, chain; ! 1735: { ! 1736: register tree node; ! 1737: register struct obstack *ambient_obstack = current_obstack; ! 1738: current_obstack = &temporary_obstack; ! 1739: ! 1740: node = tree_cons (purpose, value, chain); ! 1741: current_obstack = ambient_obstack; ! 1742: return node; ! 1743: } ! 1744: ! 1745: /* Same as `tree_cons', but save this node if the function's RTL is saved. */ ! 1746: ! 1747: tree ! 1748: saveable_tree_cons (purpose, value, chain) ! 1749: tree purpose, value, chain; ! 1750: { ! 1751: register tree node; ! 1752: register struct obstack *ambient_obstack = current_obstack; ! 1753: current_obstack = saveable_obstack; ! 1754: ! 1755: node = tree_cons (purpose, value, chain); ! 1756: current_obstack = ambient_obstack; ! 1757: return node; ! 1758: } ! 1759: ! 1760: /* Return the size nominally occupied by an object of type TYPE ! 1761: when it resides in memory. The value is measured in units of bytes, ! 1762: and its data type is that normally used for type sizes ! 1763: (which is the first type created by make_signed_type or ! 1764: make_unsigned_type). */ ! 1765: ! 1766: tree ! 1767: size_in_bytes (type) ! 1768: tree type; ! 1769: { ! 1770: tree t; ! 1771: ! 1772: if (type == error_mark_node) ! 1773: return integer_zero_node; ! 1774: type = TYPE_MAIN_VARIANT (type); ! 1775: if (TYPE_SIZE (type) == 0) ! 1776: { ! 1777: incomplete_type_error (NULL_TREE, type); ! 1778: return integer_zero_node; ! 1779: } ! 1780: t = size_binop (CEIL_DIV_EXPR, TYPE_SIZE (type), ! 1781: size_int (BITS_PER_UNIT)); ! 1782: if (TREE_CODE (t) == INTEGER_CST) ! 1783: force_fit_type (t, 0); ! 1784: return t; ! 1785: } ! 1786: ! 1787: /* Return the size of TYPE (in bytes) as an integer, ! 1788: or return -1 if the size can vary. */ ! 1789: ! 1790: int ! 1791: int_size_in_bytes (type) ! 1792: tree type; ! 1793: { ! 1794: unsigned int size; ! 1795: if (type == error_mark_node) ! 1796: return 0; ! 1797: type = TYPE_MAIN_VARIANT (type); ! 1798: if (TYPE_SIZE (type) == 0) ! 1799: return -1; ! 1800: if (TREE_CODE (TYPE_SIZE (type)) != INTEGER_CST) ! 1801: return -1; ! 1802: if (TREE_INT_CST_HIGH (TYPE_SIZE (type)) != 0) ! 1803: { ! 1804: tree t = size_binop (CEIL_DIV_EXPR, TYPE_SIZE (type), ! 1805: size_int (BITS_PER_UNIT)); ! 1806: return TREE_INT_CST_LOW (t); ! 1807: } ! 1808: size = TREE_INT_CST_LOW (TYPE_SIZE (type)); ! 1809: return (size + BITS_PER_UNIT - 1) / BITS_PER_UNIT; ! 1810: } ! 1811: ! 1812: /* Return, as a tree node, the number of elements for TYPE (which is an ! 1813: ARRAY_TYPE) minus one. This counts only elements of the top array. */ ! 1814: ! 1815: tree ! 1816: array_type_nelts (type) ! 1817: tree type; ! 1818: { ! 1819: tree index_type = TYPE_DOMAIN (type); ! 1820: ! 1821: return (integer_zerop (TYPE_MIN_VALUE (index_type)) ! 1822: ? TYPE_MAX_VALUE (index_type) ! 1823: : fold (build (MINUS_EXPR, TREE_TYPE (TYPE_MAX_VALUE (index_type)), ! 1824: TYPE_MAX_VALUE (index_type), ! 1825: TYPE_MIN_VALUE (index_type)))); ! 1826: } ! 1827: ! 1828: /* Return nonzero if arg is static -- a reference to an object in ! 1829: static storage. This is not the same as the C meaning of `static'. */ ! 1830: ! 1831: int ! 1832: staticp (arg) ! 1833: tree arg; ! 1834: { ! 1835: switch (TREE_CODE (arg)) ! 1836: { ! 1837: case VAR_DECL: ! 1838: case FUNCTION_DECL: ! 1839: return TREE_STATIC (arg) || DECL_EXTERNAL (arg); ! 1840: ! 1841: case CONSTRUCTOR: ! 1842: return TREE_STATIC (arg); ! 1843: ! 1844: case STRING_CST: ! 1845: return 1; ! 1846: ! 1847: case COMPONENT_REF: ! 1848: case BIT_FIELD_REF: ! 1849: return staticp (TREE_OPERAND (arg, 0)); ! 1850: ! 1851: case INDIRECT_REF: ! 1852: return TREE_CONSTANT (TREE_OPERAND (arg, 0)); ! 1853: ! 1854: case ARRAY_REF: ! 1855: if (TREE_CODE (TYPE_SIZE (TREE_TYPE (arg))) == INTEGER_CST ! 1856: && TREE_CODE (TREE_OPERAND (arg, 1)) == INTEGER_CST) ! 1857: return staticp (TREE_OPERAND (arg, 0)); ! 1858: } ! 1859: ! 1860: return 0; ! 1861: } ! 1862: ! 1863: /* Wrap a SAVE_EXPR around EXPR, if appropriate. ! 1864: Do this to any expression which may be used in more than one place, ! 1865: but must be evaluated only once. ! 1866: ! 1867: Normally, expand_expr would reevaluate the expression each time. ! 1868: Calling save_expr produces something that is evaluated and recorded ! 1869: the first time expand_expr is called on it. Subsequent calls to ! 1870: expand_expr just reuse the recorded value. ! 1871: ! 1872: The call to expand_expr that generates code that actually computes ! 1873: the value is the first call *at compile time*. Subsequent calls ! 1874: *at compile time* generate code to use the saved value. ! 1875: This produces correct result provided that *at run time* control ! 1876: always flows through the insns made by the first expand_expr ! 1877: before reaching the other places where the save_expr was evaluated. ! 1878: You, the caller of save_expr, must make sure this is so. ! 1879: ! 1880: Constants, and certain read-only nodes, are returned with no ! 1881: SAVE_EXPR because that is safe. Expressions containing placeholders ! 1882: are not touched; see tree.def for an explanation of what these ! 1883: are used for. */ ! 1884: ! 1885: tree ! 1886: save_expr (expr) ! 1887: tree expr; ! 1888: { ! 1889: register tree t = fold (expr); ! 1890: ! 1891: /* We don't care about whether this can be used as an lvalue in this ! 1892: context. */ ! 1893: while (TREE_CODE (t) == NON_LVALUE_EXPR) ! 1894: t = TREE_OPERAND (t, 0); ! 1895: ! 1896: /* If the tree evaluates to a constant, then we don't want to hide that ! 1897: fact (i.e. this allows further folding, and direct checks for constants). ! 1898: However, a read-only object that has side effects cannot be bypassed. ! 1899: Since it is no problem to reevaluate literals, we just return the ! 1900: literal node. */ ! 1901: ! 1902: if (TREE_CONSTANT (t) || (TREE_READONLY (t) && ! TREE_SIDE_EFFECTS (t)) ! 1903: || TREE_CODE (t) == SAVE_EXPR) ! 1904: return t; ! 1905: ! 1906: /* If T contains a PLACEHOLDER_EXPR, we must evaluate it each time, since ! 1907: it means that the size or offset of some field of an object depends on ! 1908: the value within another field. ! 1909: ! 1910: Note that it must not be the case that T contains both a PLACEHOLDER_EXPR ! 1911: and some variable since it would then need to be both evaluated once and ! 1912: evaluated more than once. Front-ends must assure this case cannot ! 1913: happen by surrounding any such subexpressions in their own SAVE_EXPR ! 1914: and forcing evaluation at the proper time. */ ! 1915: if (contains_placeholder_p (t)) ! 1916: return t; ! 1917: ! 1918: t = build (SAVE_EXPR, TREE_TYPE (expr), t, current_function_decl, NULL_TREE); ! 1919: ! 1920: /* This expression might be placed ahead of a jump to ensure that the ! 1921: value was computed on both sides of the jump. So make sure it isn't ! 1922: eliminated as dead. */ ! 1923: TREE_SIDE_EFFECTS (t) = 1; ! 1924: return t; ! 1925: } ! 1926: ! 1927: /* Return 1 if EXP contains a PLACEHOLDER_EXPR; i.e., if it represents a size ! 1928: or offset that depends on a field within a record. ! 1929: ! 1930: Note that we only allow such expressions within simple arithmetic ! 1931: or a COND_EXPR. */ ! 1932: ! 1933: int ! 1934: contains_placeholder_p (exp) ! 1935: tree exp; ! 1936: { ! 1937: register enum tree_code code = TREE_CODE (exp); ! 1938: tree inner; ! 1939: ! 1940: /* If we have a WITH_RECORD_EXPR, it "cancels" any PLACEHOLDER_EXPR ! 1941: in it since it is supplying a value for it. */ ! 1942: if (code == WITH_RECORD_EXPR || code == ERROR_MARK) ! 1943: return 0; ! 1944: ! 1945: switch (TREE_CODE_CLASS (code)) ! 1946: { ! 1947: case 'r': ! 1948: for (inner = TREE_OPERAND (exp, 0); ! 1949: TREE_CODE_CLASS (TREE_CODE (inner)) == 'r'; ! 1950: inner = TREE_OPERAND (inner, 0)) ! 1951: ; ! 1952: return TREE_CODE (inner) == PLACEHOLDER_EXPR; ! 1953: ! 1954: case '1': ! 1955: case '2': case '<': ! 1956: case 'e': ! 1957: switch (tree_code_length[(int) code]) ! 1958: { ! 1959: case 1: ! 1960: return contains_placeholder_p (TREE_OPERAND (exp, 0)); ! 1961: case 2: ! 1962: return (code != RTL_EXPR ! 1963: && code != CONSTRUCTOR ! 1964: && ! (code == SAVE_EXPR && SAVE_EXPR_RTL (exp) != 0) ! 1965: && code != WITH_RECORD_EXPR ! 1966: && (contains_placeholder_p (TREE_OPERAND (exp, 0)) ! 1967: || contains_placeholder_p (TREE_OPERAND (exp, 1)))); ! 1968: case 3: ! 1969: return (code == COND_EXPR ! 1970: && (contains_placeholder_p (TREE_OPERAND (exp, 0)) ! 1971: || contains_placeholder_p (TREE_OPERAND (exp, 1)) ! 1972: || contains_placeholder_p (TREE_OPERAND (exp, 2)))); ! 1973: } ! 1974: } ! 1975: ! 1976: return 0; ! 1977: } ! 1978: ! 1979: /* Given a tree EXP, a FIELD_DECL F, and a replacement value R, ! 1980: return a tree with all occurrences of references to F in a ! 1981: PLACEHOLDER_EXPR replaced by R. Note that we assume here that EXP ! 1982: contains only arithmetic expressions. */ ! 1983: ! 1984: tree ! 1985: substitute_in_expr (exp, f, r) ! 1986: tree exp; ! 1987: tree f; ! 1988: tree r; ! 1989: { ! 1990: enum tree_code code = TREE_CODE (exp); ! 1991: tree inner; ! 1992: ! 1993: switch (TREE_CODE_CLASS (code)) ! 1994: { ! 1995: case 'c': ! 1996: case 'd': ! 1997: return exp; ! 1998: ! 1999: case 'x': ! 2000: if (code == PLACEHOLDER_EXPR) ! 2001: return exp; ! 2002: break; ! 2003: ! 2004: case '1': ! 2005: case '2': ! 2006: case '<': ! 2007: case 'e': ! 2008: switch (tree_code_length[(int) code]) ! 2009: { ! 2010: case 1: ! 2011: return fold (build1 (code, TREE_TYPE (exp), ! 2012: substitute_in_expr (TREE_OPERAND (exp, 0), ! 2013: f, r))); ! 2014: ! 2015: case 2: ! 2016: if (code == RTL_EXPR || code == CONSTRUCTOR) ! 2017: abort (); ! 2018: ! 2019: return fold (build (code, TREE_TYPE (exp), ! 2020: substitute_in_expr (TREE_OPERAND (exp, 0), f, r), ! 2021: substitute_in_expr (TREE_OPERAND (exp, 1), ! 2022: f, r))); ! 2023: ! 2024: case 3: ! 2025: if (code != COND_EXPR) ! 2026: abort (); ! 2027: ! 2028: return fold (build (code, TREE_TYPE (exp), ! 2029: substitute_in_expr (TREE_OPERAND (exp, 0), f, r), ! 2030: substitute_in_expr (TREE_OPERAND (exp, 1), f, r), ! 2031: substitute_in_expr (TREE_OPERAND (exp, 2), ! 2032: f, r))); ! 2033: } ! 2034: ! 2035: break; ! 2036: ! 2037: case 'r': ! 2038: switch (code) ! 2039: { ! 2040: case COMPONENT_REF: ! 2041: /* If this expression is getting a value from a PLACEHOLDER_EXPR ! 2042: and it is the right field, replace it with R. */ ! 2043: for (inner = TREE_OPERAND (exp, 0); ! 2044: TREE_CODE_CLASS (TREE_CODE (inner)) == 'r'; ! 2045: inner = TREE_OPERAND (inner, 0)) ! 2046: ; ! 2047: if (TREE_CODE (inner) == PLACEHOLDER_EXPR ! 2048: && TREE_OPERAND (exp, 1) == f) ! 2049: return r; ! 2050: ! 2051: return fold (build (code, TREE_TYPE (exp), ! 2052: substitute_in_expr (TREE_OPERAND (exp, 0), f, r), ! 2053: TREE_OPERAND (exp, 1))); ! 2054: case BIT_FIELD_REF: ! 2055: return fold (build (code, TREE_TYPE (exp), ! 2056: substitute_in_expr (TREE_OPERAND (exp, 0), f, r), ! 2057: substitute_in_expr (TREE_OPERAND (exp, 1), f, r), ! 2058: substitute_in_expr (TREE_OPERAND (exp, 2), f, r))); ! 2059: case INDIRECT_REF: ! 2060: case BUFFER_REF: ! 2061: return fold (build1 (code, TREE_TYPE (exp), ! 2062: substitute_in_expr (TREE_OPERAND (exp, 0), ! 2063: f, r))); ! 2064: case OFFSET_REF: ! 2065: return fold (build (code, TREE_TYPE (exp), ! 2066: substitute_in_expr (TREE_OPERAND (exp, 0), f, r), ! 2067: substitute_in_expr (TREE_OPERAND (exp, 1), f, r))); ! 2068: } ! 2069: } ! 2070: ! 2071: /* If it wasn't one of the cases we handle, give up. */ ! 2072: ! 2073: abort (); ! 2074: } ! 2075: ! 2076: /* Given a type T, a FIELD_DECL F, and a replacement value R, ! 2077: return a new type with all size expressions that contain F ! 2078: updated by replacing F with R. */ ! 2079: ! 2080: tree ! 2081: substitute_in_type (t, f, r) ! 2082: tree t, f, r; ! 2083: { ! 2084: switch (TREE_CODE (t)) ! 2085: { ! 2086: case POINTER_TYPE: ! 2087: case VOID_TYPE: ! 2088: return t; ! 2089: case INTEGER_TYPE: ! 2090: case ENUMERAL_TYPE: ! 2091: case BOOLEAN_TYPE: ! 2092: case CHAR_TYPE: ! 2093: if ((TREE_CODE (TYPE_MIN_VALUE (t)) != INTEGER_CST ! 2094: && contains_placeholder_p (TYPE_MIN_VALUE (t))) ! 2095: || (TREE_CODE (TYPE_MAX_VALUE (t)) != INTEGER_CST ! 2096: && contains_placeholder_p (TYPE_MAX_VALUE (t)))) ! 2097: return build_range_type (t, ! 2098: substitute_in_expr (TYPE_MIN_VALUE (t), f, r), ! 2099: substitute_in_expr (TYPE_MAX_VALUE (t), f, r)); ! 2100: return t; ! 2101: ! 2102: case REAL_TYPE: ! 2103: if ((TREE_CODE (TYPE_MIN_VALUE (t)) != INTEGER_CST ! 2104: && contains_placeholder_p (TYPE_MIN_VALUE (t))) ! 2105: || (TREE_CODE (TYPE_MAX_VALUE (t)) != INTEGER_CST ! 2106: && contains_placeholder_p (TYPE_MAX_VALUE (t)))) ! 2107: { ! 2108: t = build_type_copy (t); ! 2109: TYPE_MIN_VALUE (t) = substitute_in_expr (TYPE_MIN_VALUE (t), f, r); ! 2110: TYPE_MAX_VALUE (t) = substitute_in_expr (TYPE_MAX_VALUE (t), f, r); ! 2111: } ! 2112: return t; ! 2113: ! 2114: case COMPLEX_TYPE: ! 2115: return build_complex_type (substitute_in_type (TREE_TYPE (t), f, r)); ! 2116: ! 2117: case OFFSET_TYPE: ! 2118: case METHOD_TYPE: ! 2119: case REFERENCE_TYPE: ! 2120: case FILE_TYPE: ! 2121: case SET_TYPE: ! 2122: case STRING_TYPE: ! 2123: case FUNCTION_TYPE: ! 2124: case LANG_TYPE: ! 2125: /* Don't know how to do these yet. */ ! 2126: abort (); ! 2127: ! 2128: case ARRAY_TYPE: ! 2129: t = build_array_type (substitute_in_type (TREE_TYPE (t), f, r), ! 2130: substitute_in_type (TYPE_DOMAIN (t), f, r)); ! 2131: TYPE_SIZE (t) = 0; ! 2132: layout_type (t); ! 2133: return t; ! 2134: ! 2135: case RECORD_TYPE: ! 2136: case UNION_TYPE: ! 2137: case QUAL_UNION_TYPE: ! 2138: { ! 2139: tree new = copy_node (t); ! 2140: tree field; ! 2141: tree last_field = 0; ! 2142: ! 2143: /* Start out with no fields, make new fields, and chain them ! 2144: in. */ ! 2145: ! 2146: TYPE_FIELDS (new) = 0; ! 2147: TYPE_SIZE (new) = 0; ! 2148: ! 2149: for (field = TYPE_FIELDS (t); field; ! 2150: field = TREE_CHAIN (field)) ! 2151: { ! 2152: tree new_field = copy_node (field); ! 2153: ! 2154: TREE_TYPE (new_field) ! 2155: = substitute_in_type (TREE_TYPE (new_field), f, r); ! 2156: ! 2157: /* If this is an anonymous field and the type of this field is ! 2158: a UNION_TYPE or RECORD_TYPE with no elements, ignore it. If ! 2159: the type just has one element, treat that as the field. ! 2160: But don't do this if we are processing a QUAL_UNION_TYPE. */ ! 2161: if (TREE_CODE (t) != QUAL_UNION_TYPE && DECL_NAME (new_field) == 0 ! 2162: && (TREE_CODE (TREE_TYPE (new_field)) == UNION_TYPE ! 2163: || TREE_CODE (TREE_TYPE (new_field)) == RECORD_TYPE)) ! 2164: { ! 2165: if (TYPE_FIELDS (TREE_TYPE (new_field)) == 0) ! 2166: continue; ! 2167: ! 2168: if (TREE_CHAIN (TYPE_FIELDS (TREE_TYPE (new_field))) == 0) ! 2169: new_field = TYPE_FIELDS (TREE_TYPE (new_field)); ! 2170: } ! 2171: ! 2172: DECL_CONTEXT (new_field) = new; ! 2173: DECL_SIZE (new_field) = 0; ! 2174: ! 2175: if (TREE_CODE (t) == QUAL_UNION_TYPE) ! 2176: { ! 2177: /* Do the substitution inside the qualifier and if we find ! 2178: that this field will not be present, omit it. */ ! 2179: DECL_QUALIFIER (new_field) ! 2180: = substitute_in_expr (DECL_QUALIFIER (field), f, r); ! 2181: if (integer_zerop (DECL_QUALIFIER (new_field))) ! 2182: continue; ! 2183: } ! 2184: ! 2185: if (last_field == 0) ! 2186: TYPE_FIELDS (new) = new_field; ! 2187: else ! 2188: TREE_CHAIN (last_field) = new_field; ! 2189: ! 2190: last_field = new_field; ! 2191: ! 2192: /* If this is a qualified type and this field will always be ! 2193: present, we are done. */ ! 2194: if (TREE_CODE (t) == QUAL_UNION_TYPE ! 2195: && integer_onep (DECL_QUALIFIER (new_field))) ! 2196: break; ! 2197: } ! 2198: ! 2199: /* If this used to be a qualified union type, but we now know what ! 2200: field will be present, make this a normal union. */ ! 2201: if (TREE_CODE (new) == QUAL_UNION_TYPE ! 2202: && (TYPE_FIELDS (new) == 0 ! 2203: || integer_onep (DECL_QUALIFIER (TYPE_FIELDS (new))))) ! 2204: TREE_SET_CODE (new, UNION_TYPE); ! 2205: ! 2206: layout_type (new); ! 2207: return new; ! 2208: } ! 2209: } ! 2210: } ! 2211: ! 2212: /* Stabilize a reference so that we can use it any number of times ! 2213: without causing its operands to be evaluated more than once. ! 2214: Returns the stabilized reference. This works by means of save_expr, ! 2215: so see the caveats in the comments about save_expr. ! 2216: ! 2217: Also allows conversion expressions whose operands are references. ! 2218: Any other kind of expression is returned unchanged. */ ! 2219: ! 2220: tree ! 2221: stabilize_reference (ref) ! 2222: tree ref; ! 2223: { ! 2224: register tree result; ! 2225: register enum tree_code code = TREE_CODE (ref); ! 2226: ! 2227: switch (code) ! 2228: { ! 2229: case VAR_DECL: ! 2230: case PARM_DECL: ! 2231: case RESULT_DECL: ! 2232: /* No action is needed in this case. */ ! 2233: return ref; ! 2234: ! 2235: case NOP_EXPR: ! 2236: case CONVERT_EXPR: ! 2237: case FLOAT_EXPR: ! 2238: case FIX_TRUNC_EXPR: ! 2239: case FIX_FLOOR_EXPR: ! 2240: case FIX_ROUND_EXPR: ! 2241: case FIX_CEIL_EXPR: ! 2242: result = build_nt (code, stabilize_reference (TREE_OPERAND (ref, 0))); ! 2243: break; ! 2244: ! 2245: case INDIRECT_REF: ! 2246: result = build_nt (INDIRECT_REF, ! 2247: stabilize_reference_1 (TREE_OPERAND (ref, 0))); ! 2248: break; ! 2249: ! 2250: case COMPONENT_REF: ! 2251: result = build_nt (COMPONENT_REF, ! 2252: stabilize_reference (TREE_OPERAND (ref, 0)), ! 2253: TREE_OPERAND (ref, 1)); ! 2254: break; ! 2255: ! 2256: case BIT_FIELD_REF: ! 2257: result = build_nt (BIT_FIELD_REF, ! 2258: stabilize_reference (TREE_OPERAND (ref, 0)), ! 2259: stabilize_reference_1 (TREE_OPERAND (ref, 1)), ! 2260: stabilize_reference_1 (TREE_OPERAND (ref, 2))); ! 2261: break; ! 2262: ! 2263: case ARRAY_REF: ! 2264: result = build_nt (ARRAY_REF, ! 2265: stabilize_reference (TREE_OPERAND (ref, 0)), ! 2266: stabilize_reference_1 (TREE_OPERAND (ref, 1))); ! 2267: break; ! 2268: ! 2269: /* If arg isn't a kind of lvalue we recognize, make no change. ! 2270: Caller should recognize the error for an invalid lvalue. */ ! 2271: default: ! 2272: return ref; ! 2273: ! 2274: case ERROR_MARK: ! 2275: return error_mark_node; ! 2276: } ! 2277: ! 2278: TREE_TYPE (result) = TREE_TYPE (ref); ! 2279: TREE_READONLY (result) = TREE_READONLY (ref); ! 2280: TREE_SIDE_EFFECTS (result) = TREE_SIDE_EFFECTS (ref); ! 2281: TREE_THIS_VOLATILE (result) = TREE_THIS_VOLATILE (ref); ! 2282: TREE_RAISES (result) = TREE_RAISES (ref); ! 2283: ! 2284: return result; ! 2285: } ! 2286: ! 2287: /* Subroutine of stabilize_reference; this is called for subtrees of ! 2288: references. Any expression with side-effects must be put in a SAVE_EXPR ! 2289: to ensure that it is only evaluated once. ! 2290: ! 2291: We don't put SAVE_EXPR nodes around everything, because assigning very ! 2292: simple expressions to temporaries causes us to miss good opportunities ! 2293: for optimizations. Among other things, the opportunity to fold in the ! 2294: addition of a constant into an addressing mode often gets lost, e.g. ! 2295: "y[i+1] += x;". In general, we take the approach that we should not make ! 2296: an assignment unless we are forced into it - i.e., that any non-side effect ! 2297: operator should be allowed, and that cse should take care of coalescing ! 2298: multiple utterances of the same expression should that prove fruitful. */ ! 2299: ! 2300: static tree ! 2301: stabilize_reference_1 (e) ! 2302: tree e; ! 2303: { ! 2304: register tree result; ! 2305: register int length; ! 2306: register enum tree_code code = TREE_CODE (e); ! 2307: ! 2308: /* We cannot ignore const expressions because it might be a reference ! 2309: to a const array but whose index contains side-effects. But we can ! 2310: ignore things that are actual constant or that already have been ! 2311: handled by this function. */ ! 2312: ! 2313: if (TREE_CONSTANT (e) || code == SAVE_EXPR) ! 2314: return e; ! 2315: ! 2316: switch (TREE_CODE_CLASS (code)) ! 2317: { ! 2318: case 'x': ! 2319: case 't': ! 2320: case 'd': ! 2321: case 'b': ! 2322: case '<': ! 2323: case 's': ! 2324: case 'e': ! 2325: case 'r': ! 2326: /* If the expression has side-effects, then encase it in a SAVE_EXPR ! 2327: so that it will only be evaluated once. */ ! 2328: /* The reference (r) and comparison (<) classes could be handled as ! 2329: below, but it is generally faster to only evaluate them once. */ ! 2330: if (TREE_SIDE_EFFECTS (e)) ! 2331: return save_expr (e); ! 2332: return e; ! 2333: ! 2334: case 'c': ! 2335: /* Constants need no processing. In fact, we should never reach ! 2336: here. */ ! 2337: return e; ! 2338: ! 2339: case '2': ! 2340: /* Division is slow and tends to be compiled with jumps, ! 2341: especially the division by powers of 2 that is often ! 2342: found inside of an array reference. So do it just once. */ ! 2343: if (code == TRUNC_DIV_EXPR || code == TRUNC_MOD_EXPR ! 2344: || code == FLOOR_DIV_EXPR || code == FLOOR_MOD_EXPR ! 2345: || code == CEIL_DIV_EXPR || code == CEIL_MOD_EXPR ! 2346: || code == ROUND_DIV_EXPR || code == ROUND_MOD_EXPR) ! 2347: return save_expr (e); ! 2348: /* Recursively stabilize each operand. */ ! 2349: result = build_nt (code, stabilize_reference_1 (TREE_OPERAND (e, 0)), ! 2350: stabilize_reference_1 (TREE_OPERAND (e, 1))); ! 2351: break; ! 2352: ! 2353: case '1': ! 2354: /* Recursively stabilize each operand. */ ! 2355: result = build_nt (code, stabilize_reference_1 (TREE_OPERAND (e, 0))); ! 2356: break; ! 2357: } ! 2358: ! 2359: TREE_TYPE (result) = TREE_TYPE (e); ! 2360: TREE_READONLY (result) = TREE_READONLY (e); ! 2361: TREE_SIDE_EFFECTS (result) = TREE_SIDE_EFFECTS (e); ! 2362: TREE_THIS_VOLATILE (result) = TREE_THIS_VOLATILE (e); ! 2363: TREE_RAISES (result) = TREE_RAISES (e); ! 2364: ! 2365: return result; ! 2366: } ! 2367: ! 2368: /* Low-level constructors for expressions. */ ! 2369: ! 2370: /* Build an expression of code CODE, data type TYPE, ! 2371: and operands as specified by the arguments ARG1 and following arguments. ! 2372: Expressions and reference nodes can be created this way. ! 2373: Constants, decls, types and misc nodes cannot be. */ ! 2374: ! 2375: tree ! 2376: build (va_alist) ! 2377: va_dcl ! 2378: { ! 2379: va_list p; ! 2380: enum tree_code code; ! 2381: register tree t; ! 2382: register int length; ! 2383: register int i; ! 2384: ! 2385: va_start (p); ! 2386: ! 2387: code = va_arg (p, enum tree_code); ! 2388: t = make_node (code); ! 2389: length = tree_code_length[(int) code]; ! 2390: TREE_TYPE (t) = va_arg (p, tree); ! 2391: ! 2392: if (length == 2) ! 2393: { ! 2394: /* This is equivalent to the loop below, but faster. */ ! 2395: register tree arg0 = va_arg (p, tree); ! 2396: register tree arg1 = va_arg (p, tree); ! 2397: TREE_OPERAND (t, 0) = arg0; ! 2398: TREE_OPERAND (t, 1) = arg1; ! 2399: if ((arg0 && TREE_SIDE_EFFECTS (arg0)) ! 2400: || (arg1 && TREE_SIDE_EFFECTS (arg1))) ! 2401: TREE_SIDE_EFFECTS (t) = 1; ! 2402: TREE_RAISES (t) ! 2403: = (arg0 && TREE_RAISES (arg0)) || (arg1 && TREE_RAISES (arg1)); ! 2404: } ! 2405: else if (length == 1) ! 2406: { ! 2407: register tree arg0 = va_arg (p, tree); ! 2408: ! 2409: /* Call build1 for this! */ ! 2410: if (TREE_CODE_CLASS (code) != 's') ! 2411: abort (); ! 2412: TREE_OPERAND (t, 0) = arg0; ! 2413: if (arg0 && TREE_SIDE_EFFECTS (arg0)) ! 2414: TREE_SIDE_EFFECTS (t) = 1; ! 2415: TREE_RAISES (t) = (arg0 && TREE_RAISES (arg0)); ! 2416: } ! 2417: else ! 2418: { ! 2419: for (i = 0; i < length; i++) ! 2420: { ! 2421: register tree operand = va_arg (p, tree); ! 2422: TREE_OPERAND (t, i) = operand; ! 2423: if (operand) ! 2424: { ! 2425: if (TREE_SIDE_EFFECTS (operand)) ! 2426: TREE_SIDE_EFFECTS (t) = 1; ! 2427: if (TREE_RAISES (operand)) ! 2428: TREE_RAISES (t) = 1; ! 2429: } ! 2430: } ! 2431: } ! 2432: va_end (p); ! 2433: return t; ! 2434: } ! 2435: ! 2436: /* Same as above, but only builds for unary operators. ! 2437: Saves lions share of calls to `build'; cuts down use ! 2438: of varargs, which is expensive for RISC machines. */ ! 2439: tree ! 2440: build1 (code, type, node) ! 2441: enum tree_code code; ! 2442: tree type; ! 2443: tree node; ! 2444: { ! 2445: register struct obstack *obstack = current_obstack; ! 2446: register int i, length; ! 2447: register tree_node_kind kind; ! 2448: register tree t; ! 2449: ! 2450: #ifdef GATHER_STATISTICS ! 2451: if (TREE_CODE_CLASS (code) == 'r') ! 2452: kind = r_kind; ! 2453: else ! 2454: kind = e_kind; ! 2455: #endif ! 2456: ! 2457: obstack = expression_obstack; ! 2458: length = sizeof (struct tree_exp); ! 2459: ! 2460: t = (tree) obstack_alloc (obstack, length); ! 2461: ! 2462: #ifdef GATHER_STATISTICS ! 2463: tree_node_counts[(int)kind]++; ! 2464: tree_node_sizes[(int)kind] += length; ! 2465: #endif ! 2466: ! 2467: for (i = (length / sizeof (int)) - 1; i >= 0; i--) ! 2468: ((int *) t)[i] = 0; ! 2469: ! 2470: TREE_TYPE (t) = type; ! 2471: TREE_SET_CODE (t, code); ! 2472: ! 2473: if (obstack == &permanent_obstack) ! 2474: TREE_PERMANENT (t) = 1; ! 2475: ! 2476: TREE_OPERAND (t, 0) = node; ! 2477: if (node) ! 2478: { ! 2479: if (TREE_SIDE_EFFECTS (node)) ! 2480: TREE_SIDE_EFFECTS (t) = 1; ! 2481: if (TREE_RAISES (node)) ! 2482: TREE_RAISES (t) = 1; ! 2483: } ! 2484: ! 2485: return t; ! 2486: } ! 2487: ! 2488: /* Similar except don't specify the TREE_TYPE ! 2489: and leave the TREE_SIDE_EFFECTS as 0. ! 2490: It is permissible for arguments to be null, ! 2491: or even garbage if their values do not matter. */ ! 2492: ! 2493: tree ! 2494: build_nt (va_alist) ! 2495: va_dcl ! 2496: { ! 2497: va_list p; ! 2498: register enum tree_code code; ! 2499: register tree t; ! 2500: register int length; ! 2501: register int i; ! 2502: ! 2503: va_start (p); ! 2504: ! 2505: code = va_arg (p, enum tree_code); ! 2506: t = make_node (code); ! 2507: length = tree_code_length[(int) code]; ! 2508: ! 2509: for (i = 0; i < length; i++) ! 2510: TREE_OPERAND (t, i) = va_arg (p, tree); ! 2511: ! 2512: va_end (p); ! 2513: return t; ! 2514: } ! 2515: ! 2516: /* Similar to `build_nt', except we build ! 2517: on the temp_decl_obstack, regardless. */ ! 2518: ! 2519: tree ! 2520: build_parse_node (va_alist) ! 2521: va_dcl ! 2522: { ! 2523: register struct obstack *ambient_obstack = expression_obstack; ! 2524: va_list p; ! 2525: register enum tree_code code; ! 2526: register tree t; ! 2527: register int length; ! 2528: register int i; ! 2529: ! 2530: expression_obstack = &temp_decl_obstack; ! 2531: ! 2532: va_start (p); ! 2533: ! 2534: code = va_arg (p, enum tree_code); ! 2535: t = make_node (code); ! 2536: length = tree_code_length[(int) code]; ! 2537: ! 2538: for (i = 0; i < length; i++) ! 2539: TREE_OPERAND (t, i) = va_arg (p, tree); ! 2540: ! 2541: va_end (p); ! 2542: expression_obstack = ambient_obstack; ! 2543: return t; ! 2544: } ! 2545: ! 2546: #if 0 ! 2547: /* Commented out because this wants to be done very ! 2548: differently. See cp-lex.c. */ ! 2549: tree ! 2550: build_op_identifier (op1, op2) ! 2551: tree op1, op2; ! 2552: { ! 2553: register tree t = make_node (OP_IDENTIFIER); ! 2554: TREE_PURPOSE (t) = op1; ! 2555: TREE_VALUE (t) = op2; ! 2556: return t; ! 2557: } ! 2558: #endif ! 2559: ! 2560: /* Create a DECL_... node of code CODE, name NAME and data type TYPE. ! 2561: We do NOT enter this node in any sort of symbol table. ! 2562: ! 2563: layout_decl is used to set up the decl's storage layout. ! 2564: Other slots are initialized to 0 or null pointers. */ ! 2565: ! 2566: tree ! 2567: build_decl (code, name, type) ! 2568: enum tree_code code; ! 2569: tree name, type; ! 2570: { ! 2571: register tree t; ! 2572: ! 2573: t = make_node (code); ! 2574: ! 2575: /* if (type == error_mark_node) ! 2576: type = integer_type_node; */ ! 2577: /* That is not done, deliberately, so that having error_mark_node ! 2578: as the type can suppress useless errors in the use of this variable. */ ! 2579: ! 2580: DECL_NAME (t) = name; ! 2581: DECL_ASSEMBLER_NAME (t) = name; ! 2582: TREE_TYPE (t) = type; ! 2583: ! 2584: if (code == VAR_DECL || code == PARM_DECL || code == RESULT_DECL) ! 2585: layout_decl (t, 0); ! 2586: else if (code == FUNCTION_DECL) ! 2587: DECL_MODE (t) = FUNCTION_MODE; ! 2588: ! 2589: return t; ! 2590: } ! 2591: ! 2592: /* BLOCK nodes are used to represent the structure of binding contours ! 2593: and declarations, once those contours have been exited and their contents ! 2594: compiled. This information is used for outputting debugging info. */ ! 2595: ! 2596: tree ! 2597: build_block (vars, tags, subblocks, supercontext, chain) ! 2598: tree vars, tags, subblocks, supercontext, chain; ! 2599: { ! 2600: register tree block = make_node (BLOCK); ! 2601: BLOCK_VARS (block) = vars; ! 2602: BLOCK_TYPE_TAGS (block) = tags; ! 2603: BLOCK_SUBBLOCKS (block) = subblocks; ! 2604: BLOCK_SUPERCONTEXT (block) = supercontext; ! 2605: BLOCK_CHAIN (block) = chain; ! 2606: return block; ! 2607: } ! 2608: ! 2609: /* Return a type like TYPE except that its TYPE_READONLY is CONSTP ! 2610: and its TYPE_VOLATILE is VOLATILEP. ! 2611: ! 2612: Such variant types already made are recorded so that duplicates ! 2613: are not made. ! 2614: ! 2615: A variant types should never be used as the type of an expression. ! 2616: Always copy the variant information into the TREE_READONLY ! 2617: and TREE_THIS_VOLATILE of the expression, and then give the expression ! 2618: as its type the "main variant", the variant whose TYPE_READONLY ! 2619: and TYPE_VOLATILE are zero. Use TYPE_MAIN_VARIANT to find the ! 2620: main variant. */ ! 2621: ! 2622: tree ! 2623: build_type_variant (type, constp, volatilep) ! 2624: tree type; ! 2625: int constp, volatilep; ! 2626: { ! 2627: register tree t, m = TYPE_MAIN_VARIANT (type); ! 2628: register struct obstack *ambient_obstack = current_obstack; ! 2629: ! 2630: /* Treat any nonzero argument as 1. */ ! 2631: constp = !!constp; ! 2632: volatilep = !!volatilep; ! 2633: ! 2634: /* If not generating auxiliary info, search the chain of variants to see ! 2635: if there is already one there just like the one we need to have. If so, ! 2636: use that existing one. ! 2637: ! 2638: We don't do this in the case where we are generating aux info because ! 2639: in that case we want each typedef names to get it's own distinct type ! 2640: node, even if the type of this new typedef is the same as some other ! 2641: (existing) type. */ ! 2642: ! 2643: if (!flag_gen_aux_info) ! 2644: for (t = m; t; t = TYPE_NEXT_VARIANT (t)) ! 2645: if (constp == TYPE_READONLY (t) && volatilep == TYPE_VOLATILE (t)) ! 2646: return t; ! 2647: ! 2648: /* We need a new one. */ ! 2649: ! 2650: current_obstack = TYPE_OBSTACK (type); ! 2651: t = copy_node (type); ! 2652: current_obstack = ambient_obstack; ! 2653: ! 2654: TYPE_READONLY (t) = constp; ! 2655: TYPE_VOLATILE (t) = volatilep; ! 2656: TYPE_POINTER_TO (t) = 0; ! 2657: TYPE_REFERENCE_TO (t) = 0; ! 2658: ! 2659: /* Add this type to the chain of variants of TYPE. */ ! 2660: TYPE_NEXT_VARIANT (t) = TYPE_NEXT_VARIANT (m); ! 2661: TYPE_NEXT_VARIANT (m) = t; ! 2662: ! 2663: return t; ! 2664: } ! 2665: ! 2666: /* Give TYPE a new main variant: NEW_MAIN. ! 2667: This is the right thing to do only when something else ! 2668: about TYPE is modified in place. */ ! 2669: ! 2670: tree ! 2671: change_main_variant (type, new_main) ! 2672: tree type, new_main; ! 2673: { ! 2674: tree t; ! 2675: tree omain = TYPE_MAIN_VARIANT (type); ! 2676: ! 2677: /* Remove TYPE from the TYPE_NEXT_VARIANT chain of its main variant. */ ! 2678: if (TYPE_NEXT_VARIANT (omain) == type) ! 2679: TYPE_NEXT_VARIANT (omain) = TYPE_NEXT_VARIANT (type); ! 2680: else ! 2681: for (t = TYPE_NEXT_VARIANT (omain); t && TYPE_NEXT_VARIANT (t); ! 2682: t = TYPE_NEXT_VARIANT (t)) ! 2683: if (TYPE_NEXT_VARIANT (t) == type) ! 2684: { ! 2685: TYPE_NEXT_VARIANT (t) = TYPE_NEXT_VARIANT (type); ! 2686: break; ! 2687: } ! 2688: ! 2689: TYPE_MAIN_VARIANT (type) = new_main; ! 2690: TYPE_NEXT_VARIANT (type) = TYPE_NEXT_VARIANT (new_main); ! 2691: TYPE_NEXT_VARIANT (new_main) = type; ! 2692: } ! 2693: ! 2694: /* Create a new variant of TYPE, equivalent but distinct. ! 2695: This is so the caller can modify it. */ ! 2696: ! 2697: tree ! 2698: build_type_copy (type) ! 2699: tree type; ! 2700: { ! 2701: register tree t, m = TYPE_MAIN_VARIANT (type); ! 2702: register struct obstack *ambient_obstack = current_obstack; ! 2703: ! 2704: current_obstack = TYPE_OBSTACK (type); ! 2705: t = copy_node (type); ! 2706: current_obstack = ambient_obstack; ! 2707: ! 2708: TYPE_POINTER_TO (t) = 0; ! 2709: TYPE_REFERENCE_TO (t) = 0; ! 2710: ! 2711: /* Add this type to the chain of variants of TYPE. */ ! 2712: TYPE_NEXT_VARIANT (t) = TYPE_NEXT_VARIANT (m); ! 2713: TYPE_NEXT_VARIANT (m) = t; ! 2714: ! 2715: return t; ! 2716: } ! 2717: ! 2718: /* Hashing of types so that we don't make duplicates. ! 2719: The entry point is `type_hash_canon'. */ ! 2720: ! 2721: /* Each hash table slot is a bucket containing a chain ! 2722: of these structures. */ ! 2723: ! 2724: struct type_hash ! 2725: { ! 2726: struct type_hash *next; /* Next structure in the bucket. */ ! 2727: int hashcode; /* Hash code of this type. */ ! 2728: tree type; /* The type recorded here. */ ! 2729: }; ! 2730: ! 2731: /* Now here is the hash table. When recording a type, it is added ! 2732: to the slot whose index is the hash code mod the table size. ! 2733: Note that the hash table is used for several kinds of types ! 2734: (function types, array types and array index range types, for now). ! 2735: While all these live in the same table, they are completely independent, ! 2736: and the hash code is computed differently for each of these. */ ! 2737: ! 2738: #define TYPE_HASH_SIZE 59 ! 2739: struct type_hash *type_hash_table[TYPE_HASH_SIZE]; ! 2740: ! 2741: /* Here is how primitive or already-canonicalized types' hash ! 2742: codes are made. */ ! 2743: #define TYPE_HASH(TYPE) ((HOST_WIDE_INT) (TYPE) & 0777777) ! 2744: ! 2745: /* Compute a hash code for a list of types (chain of TREE_LIST nodes ! 2746: with types in the TREE_VALUE slots), by adding the hash codes ! 2747: of the individual types. */ ! 2748: ! 2749: int ! 2750: type_hash_list (list) ! 2751: tree list; ! 2752: { ! 2753: register int hashcode; ! 2754: register tree tail; ! 2755: for (hashcode = 0, tail = list; tail; tail = TREE_CHAIN (tail)) ! 2756: hashcode += TYPE_HASH (TREE_VALUE (tail)); ! 2757: return hashcode; ! 2758: } ! 2759: ! 2760: /* Look in the type hash table for a type isomorphic to TYPE. ! 2761: If one is found, return it. Otherwise return 0. */ ! 2762: ! 2763: tree ! 2764: type_hash_lookup (hashcode, type) ! 2765: int hashcode; ! 2766: tree type; ! 2767: { ! 2768: register struct type_hash *h; ! 2769: for (h = type_hash_table[hashcode % TYPE_HASH_SIZE]; h; h = h->next) ! 2770: if (h->hashcode == hashcode ! 2771: && TREE_CODE (h->type) == TREE_CODE (type) ! 2772: && TREE_TYPE (h->type) == TREE_TYPE (type) ! 2773: && (TYPE_MAX_VALUE (h->type) == TYPE_MAX_VALUE (type) ! 2774: || tree_int_cst_equal (TYPE_MAX_VALUE (h->type), ! 2775: TYPE_MAX_VALUE (type))) ! 2776: && (TYPE_MIN_VALUE (h->type) == TYPE_MIN_VALUE (type) ! 2777: || tree_int_cst_equal (TYPE_MIN_VALUE (h->type), ! 2778: TYPE_MIN_VALUE (type))) ! 2779: && (TYPE_DOMAIN (h->type) == TYPE_DOMAIN (type) ! 2780: || (TYPE_DOMAIN (h->type) ! 2781: && TREE_CODE (TYPE_DOMAIN (h->type)) == TREE_LIST ! 2782: && TYPE_DOMAIN (type) ! 2783: && TREE_CODE (TYPE_DOMAIN (type)) == TREE_LIST ! 2784: && type_list_equal (TYPE_DOMAIN (h->type), TYPE_DOMAIN (type))))) ! 2785: return h->type; ! 2786: return 0; ! 2787: } ! 2788: ! 2789: /* Add an entry to the type-hash-table ! 2790: for a type TYPE whose hash code is HASHCODE. */ ! 2791: ! 2792: void ! 2793: type_hash_add (hashcode, type) ! 2794: int hashcode; ! 2795: tree type; ! 2796: { ! 2797: register struct type_hash *h; ! 2798: ! 2799: h = (struct type_hash *) oballoc (sizeof (struct type_hash)); ! 2800: h->hashcode = hashcode; ! 2801: h->type = type; ! 2802: h->next = type_hash_table[hashcode % TYPE_HASH_SIZE]; ! 2803: type_hash_table[hashcode % TYPE_HASH_SIZE] = h; ! 2804: } ! 2805: ! 2806: /* Given TYPE, and HASHCODE its hash code, return the canonical ! 2807: object for an identical type if one already exists. ! 2808: Otherwise, return TYPE, and record it as the canonical object ! 2809: if it is a permanent object. ! 2810: ! 2811: To use this function, first create a type of the sort you want. ! 2812: Then compute its hash code from the fields of the type that ! 2813: make it different from other similar types. ! 2814: Then call this function and use the value. ! 2815: This function frees the type you pass in if it is a duplicate. */ ! 2816: ! 2817: /* Set to 1 to debug without canonicalization. Never set by program. */ ! 2818: int debug_no_type_hash = 0; ! 2819: ! 2820: tree ! 2821: type_hash_canon (hashcode, type) ! 2822: int hashcode; ! 2823: tree type; ! 2824: { ! 2825: tree t1; ! 2826: ! 2827: if (debug_no_type_hash) ! 2828: return type; ! 2829: ! 2830: t1 = type_hash_lookup (hashcode, type); ! 2831: if (t1 != 0) ! 2832: { ! 2833: struct obstack *o ! 2834: = TREE_PERMANENT (type) ? &permanent_obstack : saveable_obstack; ! 2835: obstack_free (o, type); ! 2836: #ifdef GATHER_STATISTICS ! 2837: tree_node_counts[(int)t_kind]--; ! 2838: tree_node_sizes[(int)t_kind] -= sizeof (struct tree_type); ! 2839: #endif ! 2840: return t1; ! 2841: } ! 2842: ! 2843: /* If this is a new type, record it for later reuse. */ ! 2844: if (current_obstack == &permanent_obstack) ! 2845: type_hash_add (hashcode, type); ! 2846: ! 2847: return type; ! 2848: } ! 2849: ! 2850: /* Given two lists of types ! 2851: (chains of TREE_LIST nodes with types in the TREE_VALUE slots) ! 2852: return 1 if the lists contain the same types in the same order. ! 2853: Also, the TREE_PURPOSEs must match. */ ! 2854: ! 2855: int ! 2856: type_list_equal (l1, l2) ! 2857: tree l1, l2; ! 2858: { ! 2859: register tree t1, t2; ! 2860: for (t1 = l1, t2 = l2; t1 && t2; t1 = TREE_CHAIN (t1), t2 = TREE_CHAIN (t2)) ! 2861: { ! 2862: if (TREE_VALUE (t1) != TREE_VALUE (t2)) ! 2863: return 0; ! 2864: if (TREE_PURPOSE (t1) != TREE_PURPOSE (t2)) ! 2865: { ! 2866: int cmp = simple_cst_equal (TREE_PURPOSE (t1), TREE_PURPOSE (t2)); ! 2867: if (cmp < 0) ! 2868: abort (); ! 2869: if (cmp == 0) ! 2870: return 0; ! 2871: } ! 2872: } ! 2873: ! 2874: return t1 == t2; ! 2875: } ! 2876: ! 2877: /* Nonzero if integer constants T1 and T2 ! 2878: represent the same constant value. */ ! 2879: ! 2880: int ! 2881: tree_int_cst_equal (t1, t2) ! 2882: tree t1, t2; ! 2883: { ! 2884: if (t1 == t2) ! 2885: return 1; ! 2886: if (t1 == 0 || t2 == 0) ! 2887: return 0; ! 2888: if (TREE_CODE (t1) == INTEGER_CST ! 2889: && TREE_CODE (t2) == INTEGER_CST ! 2890: && TREE_INT_CST_LOW (t1) == TREE_INT_CST_LOW (t2) ! 2891: && TREE_INT_CST_HIGH (t1) == TREE_INT_CST_HIGH (t2)) ! 2892: return 1; ! 2893: return 0; ! 2894: } ! 2895: ! 2896: /* Nonzero if integer constants T1 and T2 represent values that satisfy <. ! 2897: The precise way of comparison depends on their data type. */ ! 2898: ! 2899: int ! 2900: tree_int_cst_lt (t1, t2) ! 2901: tree t1, t2; ! 2902: { ! 2903: if (t1 == t2) ! 2904: return 0; ! 2905: ! 2906: if (!TREE_UNSIGNED (TREE_TYPE (t1))) ! 2907: return INT_CST_LT (t1, t2); ! 2908: return INT_CST_LT_UNSIGNED (t1, t2); ! 2909: } ! 2910: ! 2911: /* Compare two constructor-element-type constants. */ ! 2912: int ! 2913: simple_cst_list_equal (l1, l2) ! 2914: tree l1, l2; ! 2915: { ! 2916: while (l1 != NULL_TREE && l2 != NULL_TREE) ! 2917: { ! 2918: int cmp = simple_cst_equal (TREE_VALUE (l1), TREE_VALUE (l2)); ! 2919: if (cmp < 0) ! 2920: abort (); ! 2921: if (cmp == 0) ! 2922: return 0; ! 2923: l1 = TREE_CHAIN (l1); ! 2924: l2 = TREE_CHAIN (l2); ! 2925: } ! 2926: return (l1 == l2); ! 2927: } ! 2928: ! 2929: /* Return truthvalue of whether T1 is the same tree structure as T2. ! 2930: Return 1 if they are the same. ! 2931: Return 0 if they are understandably different. ! 2932: Return -1 if either contains tree structure not understood by ! 2933: this function. */ ! 2934: ! 2935: int ! 2936: simple_cst_equal (t1, t2) ! 2937: tree t1, t2; ! 2938: { ! 2939: register enum tree_code code1, code2; ! 2940: int cmp; ! 2941: ! 2942: if (t1 == t2) ! 2943: return 1; ! 2944: if (t1 == 0 || t2 == 0) ! 2945: return 0; ! 2946: ! 2947: code1 = TREE_CODE (t1); ! 2948: code2 = TREE_CODE (t2); ! 2949: ! 2950: if (code1 == NOP_EXPR || code1 == CONVERT_EXPR || code1 == NON_LVALUE_EXPR) ! 2951: if (code2 == NOP_EXPR || code2 == CONVERT_EXPR || code2 == NON_LVALUE_EXPR) ! 2952: return simple_cst_equal (TREE_OPERAND (t1, 0), TREE_OPERAND (t2, 0)); ! 2953: else ! 2954: return simple_cst_equal (TREE_OPERAND (t1, 0), t2); ! 2955: else if (code2 == NOP_EXPR || code2 == CONVERT_EXPR ! 2956: || code2 == NON_LVALUE_EXPR) ! 2957: return simple_cst_equal (t1, TREE_OPERAND (t2, 0)); ! 2958: ! 2959: if (code1 != code2) ! 2960: return 0; ! 2961: ! 2962: switch (code1) ! 2963: { ! 2964: case INTEGER_CST: ! 2965: return TREE_INT_CST_LOW (t1) == TREE_INT_CST_LOW (t2) ! 2966: && TREE_INT_CST_HIGH (t1) == TREE_INT_CST_HIGH (t2); ! 2967: ! 2968: case REAL_CST: ! 2969: return REAL_VALUES_EQUAL (TREE_REAL_CST (t1), TREE_REAL_CST (t2)); ! 2970: ! 2971: case STRING_CST: ! 2972: return TREE_STRING_LENGTH (t1) == TREE_STRING_LENGTH (t2) ! 2973: && !bcmp (TREE_STRING_POINTER (t1), TREE_STRING_POINTER (t2), ! 2974: TREE_STRING_LENGTH (t1)); ! 2975: ! 2976: case CONSTRUCTOR: ! 2977: abort (); ! 2978: ! 2979: case SAVE_EXPR: ! 2980: return simple_cst_equal (TREE_OPERAND (t1, 0), TREE_OPERAND (t2, 0)); ! 2981: ! 2982: case CALL_EXPR: ! 2983: cmp = simple_cst_equal (TREE_OPERAND (t1, 0), TREE_OPERAND (t2, 0)); ! 2984: if (cmp <= 0) ! 2985: return cmp; ! 2986: return simple_cst_list_equal (TREE_OPERAND (t1, 1), TREE_OPERAND (t2, 1)); ! 2987: ! 2988: case TARGET_EXPR: ! 2989: /* Special case: if either target is an unallocated VAR_DECL, ! 2990: it means that it's going to be unified with whatever the ! 2991: TARGET_EXPR is really supposed to initialize, so treat it ! 2992: as being equivalent to anything. */ ! 2993: if ((TREE_CODE (TREE_OPERAND (t1, 0)) == VAR_DECL ! 2994: && DECL_NAME (TREE_OPERAND (t1, 0)) == NULL_TREE ! 2995: && DECL_RTL (TREE_OPERAND (t1, 0)) == 0) ! 2996: || (TREE_CODE (TREE_OPERAND (t2, 0)) == VAR_DECL ! 2997: && DECL_NAME (TREE_OPERAND (t2, 0)) == NULL_TREE ! 2998: && DECL_RTL (TREE_OPERAND (t2, 0)) == 0)) ! 2999: cmp = 1; ! 3000: else ! 3001: cmp = simple_cst_equal (TREE_OPERAND (t1, 0), TREE_OPERAND (t2, 0)); ! 3002: if (cmp <= 0) ! 3003: return cmp; ! 3004: return simple_cst_equal (TREE_OPERAND (t1, 1), TREE_OPERAND (t2, 1)); ! 3005: ! 3006: case WITH_CLEANUP_EXPR: ! 3007: cmp = simple_cst_equal (TREE_OPERAND (t1, 0), TREE_OPERAND (t2, 0)); ! 3008: if (cmp <= 0) ! 3009: return cmp; ! 3010: return simple_cst_equal (TREE_OPERAND (t1, 2), TREE_OPERAND (t1, 2)); ! 3011: ! 3012: case COMPONENT_REF: ! 3013: if (TREE_OPERAND (t1, 1) == TREE_OPERAND (t2, 1)) ! 3014: return simple_cst_equal (TREE_OPERAND (t1, 0), TREE_OPERAND (t2, 0)); ! 3015: return 0; ! 3016: ! 3017: case VAR_DECL: ! 3018: case PARM_DECL: ! 3019: case CONST_DECL: ! 3020: case FUNCTION_DECL: ! 3021: return 0; ! 3022: } ! 3023: ! 3024: /* This general rule works for most tree codes. ! 3025: All exceptions should be handled above. */ ! 3026: ! 3027: switch (TREE_CODE_CLASS (code1)) ! 3028: { ! 3029: int i; ! 3030: case '1': ! 3031: case '2': ! 3032: case '<': ! 3033: case 'e': ! 3034: case 'r': ! 3035: case 's': ! 3036: cmp = 1; ! 3037: for (i=0; i<tree_code_length[(int) code1]; ++i) ! 3038: { ! 3039: cmp = simple_cst_equal (TREE_OPERAND (t1, i), TREE_OPERAND (t2, i)); ! 3040: if (cmp <= 0) ! 3041: return cmp; ! 3042: } ! 3043: return cmp; ! 3044: } ! 3045: ! 3046: return -1; ! 3047: } ! 3048: ! 3049: /* Constructors for pointer, array and function types. ! 3050: (RECORD_TYPE, UNION_TYPE and ENUMERAL_TYPE nodes are ! 3051: constructed by language-dependent code, not here.) */ ! 3052: ! 3053: /* Construct, lay out and return the type of pointers to TO_TYPE. ! 3054: If such a type has already been constructed, reuse it. */ ! 3055: ! 3056: tree ! 3057: build_pointer_type (to_type) ! 3058: tree to_type; ! 3059: { ! 3060: register tree t = TYPE_POINTER_TO (to_type); ! 3061: ! 3062: /* First, if we already have a type for pointers to TO_TYPE, use it. */ ! 3063: ! 3064: if (t) ! 3065: return t; ! 3066: ! 3067: /* We need a new one. Put this in the same obstack as TO_TYPE. */ ! 3068: push_obstacks (TYPE_OBSTACK (to_type), TYPE_OBSTACK (to_type)); ! 3069: t = make_node (POINTER_TYPE); ! 3070: pop_obstacks (); ! 3071: ! 3072: TREE_TYPE (t) = to_type; ! 3073: ! 3074: /* Record this type as the pointer to TO_TYPE. */ ! 3075: TYPE_POINTER_TO (to_type) = t; ! 3076: ! 3077: /* Lay out the type. This function has many callers that are concerned ! 3078: with expression-construction, and this simplifies them all. ! 3079: Also, it guarantees the TYPE_SIZE is in the same obstack as the type. */ ! 3080: layout_type (t); ! 3081: ! 3082: return t; ! 3083: } ! 3084: ! 3085: /* Create a type of integers to be the TYPE_DOMAIN of an ARRAY_TYPE. ! 3086: MAXVAL should be the maximum value in the domain ! 3087: (one less than the length of the array). */ ! 3088: ! 3089: tree ! 3090: build_index_type (maxval) ! 3091: tree maxval; ! 3092: { ! 3093: register tree itype = make_node (INTEGER_TYPE); ! 3094: TYPE_PRECISION (itype) = TYPE_PRECISION (sizetype); ! 3095: TYPE_MIN_VALUE (itype) = build_int_2 (0, 0); ! 3096: TREE_TYPE (TYPE_MIN_VALUE (itype)) = sizetype; ! 3097: TYPE_MAX_VALUE (itype) = convert (sizetype, maxval); ! 3098: TYPE_MODE (itype) = TYPE_MODE (sizetype); ! 3099: TYPE_SIZE (itype) = TYPE_SIZE (sizetype); ! 3100: TYPE_ALIGN (itype) = TYPE_ALIGN (sizetype); ! 3101: if (TREE_CODE (maxval) == INTEGER_CST) ! 3102: { ! 3103: int maxint = (int) TREE_INT_CST_LOW (maxval); ! 3104: /* If the domain should be empty, make sure the maxval ! 3105: remains -1 and is not spoiled by truncation. */ ! 3106: if (INT_CST_LT (maxval, integer_zero_node)) ! 3107: { ! 3108: TYPE_MAX_VALUE (itype) = build_int_2 (-1, -1); ! 3109: TREE_TYPE (TYPE_MAX_VALUE (itype)) = sizetype; ! 3110: } ! 3111: return type_hash_canon (maxint < 0 ? ~maxint : maxint, itype); ! 3112: } ! 3113: else ! 3114: return itype; ! 3115: } ! 3116: ! 3117: /* Create a range of some discrete type TYPE (an INTEGER_TYPE, ! 3118: ENUMERAL_TYPE, BOOLEAN_TYPE, or CHAR_TYPE), with ! 3119: low bound LOWVAL and high bound HIGHVAL. ! 3120: if TYPE==NULL_TREE, sizetype is used. */ ! 3121: ! 3122: tree ! 3123: build_range_type (type, lowval, highval) ! 3124: tree type, lowval, highval; ! 3125: { ! 3126: register tree itype = make_node (INTEGER_TYPE); ! 3127: TREE_TYPE (itype) = type; ! 3128: if (type == NULL_TREE) ! 3129: type = sizetype; ! 3130: TYPE_PRECISION (itype) = TYPE_PRECISION (type); ! 3131: TYPE_MIN_VALUE (itype) = convert (type, lowval); ! 3132: TYPE_MAX_VALUE (itype) = convert (type, highval); ! 3133: TYPE_MODE (itype) = TYPE_MODE (type); ! 3134: TYPE_SIZE (itype) = TYPE_SIZE (type); ! 3135: TYPE_ALIGN (itype) = TYPE_ALIGN (type); ! 3136: if ((TREE_CODE (lowval) == INTEGER_CST) ! 3137: && (TREE_CODE (highval) == INTEGER_CST)) ! 3138: { ! 3139: HOST_WIDE_INT highint = TREE_INT_CST_LOW (highval); ! 3140: HOST_WIDE_INT lowint = TREE_INT_CST_LOW (lowval); ! 3141: int maxint = (int) (highint - lowint); ! 3142: return type_hash_canon (maxint < 0 ? ~maxint : maxint, itype); ! 3143: } ! 3144: else ! 3145: return itype; ! 3146: } ! 3147: ! 3148: /* Just like build_index_type, but takes lowval and highval instead ! 3149: of just highval (maxval). */ ! 3150: ! 3151: tree ! 3152: build_index_2_type (lowval,highval) ! 3153: tree lowval, highval; ! 3154: { ! 3155: return build_range_type (NULL_TREE, lowval, highval); ! 3156: } ! 3157: ! 3158: /* Return nonzero iff ITYPE1 and ITYPE2 are equal (in the LISP sense). ! 3159: Needed because when index types are not hashed, equal index types ! 3160: built at different times appear distinct, even though structurally, ! 3161: they are not. */ ! 3162: ! 3163: int ! 3164: index_type_equal (itype1, itype2) ! 3165: tree itype1, itype2; ! 3166: { ! 3167: if (TREE_CODE (itype1) != TREE_CODE (itype2)) ! 3168: return 0; ! 3169: if (TREE_CODE (itype1) == INTEGER_TYPE) ! 3170: { ! 3171: if (TYPE_PRECISION (itype1) != TYPE_PRECISION (itype2) ! 3172: || TYPE_MODE (itype1) != TYPE_MODE (itype2) ! 3173: || ! simple_cst_equal (TYPE_SIZE (itype1), TYPE_SIZE (itype2)) ! 3174: || TYPE_ALIGN (itype1) != TYPE_ALIGN (itype2)) ! 3175: return 0; ! 3176: if (simple_cst_equal (TYPE_MIN_VALUE (itype1), TYPE_MIN_VALUE (itype2)) ! 3177: && simple_cst_equal (TYPE_MAX_VALUE (itype1), TYPE_MAX_VALUE (itype2))) ! 3178: return 1; ! 3179: } ! 3180: return 0; ! 3181: } ! 3182: ! 3183: /* Construct, lay out and return the type of arrays of elements with ELT_TYPE ! 3184: and number of elements specified by the range of values of INDEX_TYPE. ! 3185: If such a type has already been constructed, reuse it. */ ! 3186: ! 3187: tree ! 3188: build_array_type (elt_type, index_type) ! 3189: tree elt_type, index_type; ! 3190: { ! 3191: register tree t; ! 3192: int hashcode; ! 3193: ! 3194: if (TREE_CODE (elt_type) == FUNCTION_TYPE) ! 3195: { ! 3196: error ("arrays of functions are not meaningful"); ! 3197: elt_type = integer_type_node; ! 3198: } ! 3199: ! 3200: /* Make sure TYPE_POINTER_TO (elt_type) is filled in. */ ! 3201: build_pointer_type (elt_type); ! 3202: ! 3203: /* Allocate the array after the pointer type, ! 3204: in case we free it in type_hash_canon. */ ! 3205: t = make_node (ARRAY_TYPE); ! 3206: TREE_TYPE (t) = elt_type; ! 3207: TYPE_DOMAIN (t) = index_type; ! 3208: ! 3209: if (index_type == 0) ! 3210: { ! 3211: return t; ! 3212: } ! 3213: ! 3214: hashcode = TYPE_HASH (elt_type) + TYPE_HASH (index_type); ! 3215: t = type_hash_canon (hashcode, t); ! 3216: ! 3217: #if 0 /* This led to crashes, because it could put a temporary node ! 3218: on the TYPE_NEXT_VARIANT chain of a permanent one. */ ! 3219: /* The main variant of an array type should always ! 3220: be an array whose element type is the main variant. */ ! 3221: if (elt_type != TYPE_MAIN_VARIANT (elt_type)) ! 3222: change_main_variant (t, build_array_type (TYPE_MAIN_VARIANT (elt_type), ! 3223: index_type)); ! 3224: #endif ! 3225: ! 3226: if (TYPE_SIZE (t) == 0) ! 3227: layout_type (t); ! 3228: return t; ! 3229: } ! 3230: ! 3231: /* Construct, lay out and return ! 3232: the type of functions returning type VALUE_TYPE ! 3233: given arguments of types ARG_TYPES. ! 3234: ARG_TYPES is a chain of TREE_LIST nodes whose TREE_VALUEs ! 3235: are data type nodes for the arguments of the function. ! 3236: If such a type has already been constructed, reuse it. */ ! 3237: ! 3238: tree ! 3239: build_function_type (value_type, arg_types) ! 3240: tree value_type, arg_types; ! 3241: { ! 3242: register tree t; ! 3243: int hashcode; ! 3244: ! 3245: if (TREE_CODE (value_type) == FUNCTION_TYPE) ! 3246: { ! 3247: error ("function return type cannot be function"); ! 3248: value_type = integer_type_node; ! 3249: } ! 3250: ! 3251: /* Make a node of the sort we want. */ ! 3252: t = make_node (FUNCTION_TYPE); ! 3253: TREE_TYPE (t) = value_type; ! 3254: TYPE_ARG_TYPES (t) = arg_types; ! 3255: ! 3256: /* If we already have such a type, use the old one and free this one. */ ! 3257: hashcode = TYPE_HASH (value_type) + type_hash_list (arg_types); ! 3258: t = type_hash_canon (hashcode, t); ! 3259: ! 3260: if (TYPE_SIZE (t) == 0) ! 3261: layout_type (t); ! 3262: return t; ! 3263: } ! 3264: ! 3265: /* Build the node for the type of references-to-TO_TYPE. */ ! 3266: ! 3267: tree ! 3268: build_reference_type (to_type) ! 3269: tree to_type; ! 3270: { ! 3271: register tree t = TYPE_REFERENCE_TO (to_type); ! 3272: register struct obstack *ambient_obstack = current_obstack; ! 3273: register struct obstack *ambient_saveable_obstack = saveable_obstack; ! 3274: ! 3275: /* First, if we already have a type for pointers to TO_TYPE, use it. */ ! 3276: ! 3277: if (t) ! 3278: return t; ! 3279: ! 3280: /* We need a new one. If TO_TYPE is permanent, make this permanent too. */ ! 3281: if (TREE_PERMANENT (to_type)) ! 3282: { ! 3283: current_obstack = &permanent_obstack; ! 3284: saveable_obstack = &permanent_obstack; ! 3285: } ! 3286: ! 3287: t = make_node (REFERENCE_TYPE); ! 3288: TREE_TYPE (t) = to_type; ! 3289: ! 3290: /* Record this type as the pointer to TO_TYPE. */ ! 3291: TYPE_REFERENCE_TO (to_type) = t; ! 3292: ! 3293: layout_type (t); ! 3294: ! 3295: current_obstack = ambient_obstack; ! 3296: saveable_obstack = ambient_saveable_obstack; ! 3297: return t; ! 3298: } ! 3299: ! 3300: /* Construct, lay out and return the type of methods belonging to class ! 3301: BASETYPE and whose arguments and values are described by TYPE. ! 3302: If that type exists already, reuse it. ! 3303: TYPE must be a FUNCTION_TYPE node. */ ! 3304: ! 3305: tree ! 3306: build_method_type (basetype, type) ! 3307: tree basetype, type; ! 3308: { ! 3309: register tree t; ! 3310: int hashcode; ! 3311: ! 3312: /* Make a node of the sort we want. */ ! 3313: t = make_node (METHOD_TYPE); ! 3314: ! 3315: if (TREE_CODE (type) != FUNCTION_TYPE) ! 3316: abort (); ! 3317: ! 3318: TYPE_METHOD_BASETYPE (t) = TYPE_MAIN_VARIANT (basetype); ! 3319: TREE_TYPE (t) = TREE_TYPE (type); ! 3320: ! 3321: /* The actual arglist for this function includes a "hidden" argument ! 3322: which is "this". Put it into the list of argument types. */ ! 3323: ! 3324: TYPE_ARG_TYPES (t) ! 3325: = tree_cons (NULL_TREE, ! 3326: build_pointer_type (basetype), TYPE_ARG_TYPES (type)); ! 3327: ! 3328: /* If we already have such a type, use the old one and free this one. */ ! 3329: hashcode = TYPE_HASH (basetype) + TYPE_HASH (type); ! 3330: t = type_hash_canon (hashcode, t); ! 3331: ! 3332: if (TYPE_SIZE (t) == 0) ! 3333: layout_type (t); ! 3334: ! 3335: return t; ! 3336: } ! 3337: ! 3338: /* Construct, lay out and return the type of offsets to a value ! 3339: of type TYPE, within an object of type BASETYPE. ! 3340: If a suitable offset type exists already, reuse it. */ ! 3341: ! 3342: tree ! 3343: build_offset_type (basetype, type) ! 3344: tree basetype, type; ! 3345: { ! 3346: register tree t; ! 3347: int hashcode; ! 3348: ! 3349: /* Make a node of the sort we want. */ ! 3350: t = make_node (OFFSET_TYPE); ! 3351: ! 3352: TYPE_OFFSET_BASETYPE (t) = TYPE_MAIN_VARIANT (basetype); ! 3353: TREE_TYPE (t) = type; ! 3354: ! 3355: /* If we already have such a type, use the old one and free this one. */ ! 3356: hashcode = TYPE_HASH (basetype) + TYPE_HASH (type); ! 3357: t = type_hash_canon (hashcode, t); ! 3358: ! 3359: if (TYPE_SIZE (t) == 0) ! 3360: layout_type (t); ! 3361: ! 3362: return t; ! 3363: } ! 3364: ! 3365: /* Create a complex type whose components are COMPONENT_TYPE. */ ! 3366: ! 3367: tree ! 3368: build_complex_type (component_type) ! 3369: tree component_type; ! 3370: { ! 3371: register tree t; ! 3372: int hashcode; ! 3373: ! 3374: /* Make a node of the sort we want. */ ! 3375: t = make_node (COMPLEX_TYPE); ! 3376: ! 3377: TREE_TYPE (t) = TYPE_MAIN_VARIANT (component_type); ! 3378: TYPE_VOLATILE (t) = TYPE_VOLATILE (component_type); ! 3379: TYPE_READONLY (t) = TYPE_READONLY (component_type); ! 3380: ! 3381: /* If we already have such a type, use the old one and free this one. */ ! 3382: hashcode = TYPE_HASH (component_type); ! 3383: t = type_hash_canon (hashcode, t); ! 3384: ! 3385: if (TYPE_SIZE (t) == 0) ! 3386: layout_type (t); ! 3387: ! 3388: return t; ! 3389: } ! 3390: ! 3391: /* Return OP, stripped of any conversions to wider types as much as is safe. ! 3392: Converting the value back to OP's type makes a value equivalent to OP. ! 3393: ! 3394: If FOR_TYPE is nonzero, we return a value which, if converted to ! 3395: type FOR_TYPE, would be equivalent to converting OP to type FOR_TYPE. ! 3396: ! 3397: If FOR_TYPE is nonzero, unaligned bit-field references may be changed to the ! 3398: narrowest type that can hold the value, even if they don't exactly fit. ! 3399: Otherwise, bit-field references are changed to a narrower type ! 3400: only if they can be fetched directly from memory in that type. ! 3401: ! 3402: OP must have integer, real or enumeral type. Pointers are not allowed! ! 3403: ! 3404: There are some cases where the obvious value we could return ! 3405: would regenerate to OP if converted to OP's type, ! 3406: but would not extend like OP to wider types. ! 3407: If FOR_TYPE indicates such extension is contemplated, we eschew such values. ! 3408: For example, if OP is (unsigned short)(signed char)-1, ! 3409: we avoid returning (signed char)-1 if FOR_TYPE is int, ! 3410: even though extending that to an unsigned short would regenerate OP, ! 3411: since the result of extending (signed char)-1 to (int) ! 3412: is different from (int) OP. */ ! 3413: ! 3414: tree ! 3415: get_unwidened (op, for_type) ! 3416: register tree op; ! 3417: tree for_type; ! 3418: { ! 3419: /* Set UNS initially if converting OP to FOR_TYPE is a zero-extension. */ ! 3420: /* TYPE_PRECISION is safe in place of type_precision since ! 3421: pointer types are not allowed. */ ! 3422: register tree type = TREE_TYPE (op); ! 3423: register unsigned final_prec ! 3424: = TYPE_PRECISION (for_type != 0 ? for_type : type); ! 3425: register int uns ! 3426: = (for_type != 0 && for_type != type ! 3427: && final_prec > TYPE_PRECISION (type) ! 3428: && TREE_UNSIGNED (type)); ! 3429: register tree win = op; ! 3430: ! 3431: while (TREE_CODE (op) == NOP_EXPR) ! 3432: { ! 3433: register int bitschange ! 3434: = TYPE_PRECISION (TREE_TYPE (op)) ! 3435: - TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (op, 0))); ! 3436: ! 3437: /* Truncations are many-one so cannot be removed. ! 3438: Unless we are later going to truncate down even farther. */ ! 3439: if (bitschange < 0 ! 3440: && final_prec > TYPE_PRECISION (TREE_TYPE (op))) ! 3441: break; ! 3442: ! 3443: /* See what's inside this conversion. If we decide to strip it, ! 3444: we will set WIN. */ ! 3445: op = TREE_OPERAND (op, 0); ! 3446: ! 3447: /* If we have not stripped any zero-extensions (uns is 0), ! 3448: we can strip any kind of extension. ! 3449: If we have previously stripped a zero-extension, ! 3450: only zero-extensions can safely be stripped. ! 3451: Any extension can be stripped if the bits it would produce ! 3452: are all going to be discarded later by truncating to FOR_TYPE. */ ! 3453: ! 3454: if (bitschange > 0) ! 3455: { ! 3456: if (! uns || final_prec <= TYPE_PRECISION (TREE_TYPE (op))) ! 3457: win = op; ! 3458: /* TREE_UNSIGNED says whether this is a zero-extension. ! 3459: Let's avoid computing it if it does not affect WIN ! 3460: and if UNS will not be needed again. */ ! 3461: if ((uns || TREE_CODE (op) == NOP_EXPR) ! 3462: && TREE_UNSIGNED (TREE_TYPE (op))) ! 3463: { ! 3464: uns = 1; ! 3465: win = op; ! 3466: } ! 3467: } ! 3468: } ! 3469: ! 3470: if (TREE_CODE (op) == COMPONENT_REF ! 3471: /* Since type_for_size always gives an integer type. */ ! 3472: && TREE_CODE (type) != REAL_TYPE) ! 3473: { ! 3474: unsigned innerprec = TREE_INT_CST_LOW (DECL_SIZE (TREE_OPERAND (op, 1))); ! 3475: type = type_for_size (innerprec, TREE_UNSIGNED (TREE_OPERAND (op, 1))); ! 3476: ! 3477: /* We can get this structure field in the narrowest type it fits in. ! 3478: If FOR_TYPE is 0, do this only for a field that matches the ! 3479: narrower type exactly and is aligned for it ! 3480: The resulting extension to its nominal type (a fullword type) ! 3481: must fit the same conditions as for other extensions. */ ! 3482: ! 3483: if (innerprec < TYPE_PRECISION (TREE_TYPE (op)) ! 3484: && (for_type || ! DECL_BIT_FIELD (TREE_OPERAND (op, 1))) ! 3485: && (! uns || final_prec <= innerprec ! 3486: || TREE_UNSIGNED (TREE_OPERAND (op, 1))) ! 3487: && type != 0) ! 3488: { ! 3489: win = build (COMPONENT_REF, type, TREE_OPERAND (op, 0), ! 3490: TREE_OPERAND (op, 1)); ! 3491: TREE_SIDE_EFFECTS (win) = TREE_SIDE_EFFECTS (op); ! 3492: TREE_THIS_VOLATILE (win) = TREE_THIS_VOLATILE (op); ! 3493: TREE_RAISES (win) = TREE_RAISES (op); ! 3494: } ! 3495: } ! 3496: return win; ! 3497: } ! 3498: ! 3499: /* Return OP or a simpler expression for a narrower value ! 3500: which can be sign-extended or zero-extended to give back OP. ! 3501: Store in *UNSIGNEDP_PTR either 1 if the value should be zero-extended ! 3502: or 0 if the value should be sign-extended. */ ! 3503: ! 3504: tree ! 3505: get_narrower (op, unsignedp_ptr) ! 3506: register tree op; ! 3507: int *unsignedp_ptr; ! 3508: { ! 3509: register int uns = 0; ! 3510: int first = 1; ! 3511: register tree win = op; ! 3512: ! 3513: while (TREE_CODE (op) == NOP_EXPR) ! 3514: { ! 3515: register int bitschange ! 3516: = TYPE_PRECISION (TREE_TYPE (op)) ! 3517: - TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (op, 0))); ! 3518: ! 3519: /* Truncations are many-one so cannot be removed. */ ! 3520: if (bitschange < 0) ! 3521: break; ! 3522: ! 3523: /* See what's inside this conversion. If we decide to strip it, ! 3524: we will set WIN. */ ! 3525: op = TREE_OPERAND (op, 0); ! 3526: ! 3527: if (bitschange > 0) ! 3528: { ! 3529: /* An extension: the outermost one can be stripped, ! 3530: but remember whether it is zero or sign extension. */ ! 3531: if (first) ! 3532: uns = TREE_UNSIGNED (TREE_TYPE (op)); ! 3533: /* Otherwise, if a sign extension has been stripped, ! 3534: only sign extensions can now be stripped; ! 3535: if a zero extension has been stripped, only zero-extensions. */ ! 3536: else if (uns != TREE_UNSIGNED (TREE_TYPE (op))) ! 3537: break; ! 3538: first = 0; ! 3539: } ! 3540: else /* bitschange == 0 */ ! 3541: { ! 3542: /* A change in nominal type can always be stripped, but we must ! 3543: preserve the unsignedness. */ ! 3544: if (first) ! 3545: uns = TREE_UNSIGNED (TREE_TYPE (op)); ! 3546: first = 0; ! 3547: } ! 3548: ! 3549: win = op; ! 3550: } ! 3551: ! 3552: if (TREE_CODE (op) == COMPONENT_REF ! 3553: /* Since type_for_size always gives an integer type. */ ! 3554: && TREE_CODE (TREE_TYPE (op)) != REAL_TYPE) ! 3555: { ! 3556: unsigned innerprec = TREE_INT_CST_LOW (DECL_SIZE (TREE_OPERAND (op, 1))); ! 3557: tree type = type_for_size (innerprec, TREE_UNSIGNED (op)); ! 3558: ! 3559: /* We can get this structure field in a narrower type that fits it, ! 3560: but the resulting extension to its nominal type (a fullword type) ! 3561: must satisfy the same conditions as for other extensions. ! 3562: ! 3563: Do this only for fields that are aligned (not bit-fields), ! 3564: because when bit-field insns will be used there is no ! 3565: advantage in doing this. */ ! 3566: ! 3567: if (innerprec < TYPE_PRECISION (TREE_TYPE (op)) ! 3568: && ! DECL_BIT_FIELD (TREE_OPERAND (op, 1)) ! 3569: && (first || uns == TREE_UNSIGNED (TREE_OPERAND (op, 1))) ! 3570: && type != 0) ! 3571: { ! 3572: if (first) ! 3573: uns = TREE_UNSIGNED (TREE_OPERAND (op, 1)); ! 3574: win = build (COMPONENT_REF, type, TREE_OPERAND (op, 0), ! 3575: TREE_OPERAND (op, 1)); ! 3576: TREE_SIDE_EFFECTS (win) = TREE_SIDE_EFFECTS (op); ! 3577: TREE_THIS_VOLATILE (win) = TREE_THIS_VOLATILE (op); ! 3578: TREE_RAISES (win) = TREE_RAISES (op); ! 3579: } ! 3580: } ! 3581: *unsignedp_ptr = uns; ! 3582: return win; ! 3583: } ! 3584: ! 3585: /* Return the precision of a type, for arithmetic purposes. ! 3586: Supports all types on which arithmetic is possible ! 3587: (including pointer types). ! 3588: It's not clear yet what will be right for complex types. */ ! 3589: ! 3590: int ! 3591: type_precision (type) ! 3592: register tree type; ! 3593: { ! 3594: return ((TREE_CODE (type) == INTEGER_TYPE ! 3595: || TREE_CODE (type) == ENUMERAL_TYPE ! 3596: || TREE_CODE (type) == REAL_TYPE) ! 3597: ? TYPE_PRECISION (type) : POINTER_SIZE); ! 3598: } ! 3599: ! 3600: /* Nonzero if integer constant C has a value that is permissible ! 3601: for type TYPE (an INTEGER_TYPE). */ ! 3602: ! 3603: int ! 3604: int_fits_type_p (c, type) ! 3605: tree c, type; ! 3606: { ! 3607: if (TREE_UNSIGNED (type)) ! 3608: return (!INT_CST_LT_UNSIGNED (TYPE_MAX_VALUE (type), c) ! 3609: && !INT_CST_LT_UNSIGNED (c, TYPE_MIN_VALUE (type)) ! 3610: && (TREE_INT_CST_HIGH (c) >= 0 || TREE_UNSIGNED (TREE_TYPE (c)))); ! 3611: else ! 3612: return (!INT_CST_LT (TYPE_MAX_VALUE (type), c) ! 3613: && !INT_CST_LT (c, TYPE_MIN_VALUE (type)) ! 3614: && (TREE_INT_CST_HIGH (c) >= 0 || !TREE_UNSIGNED (TREE_TYPE (c)))); ! 3615: } ! 3616: ! 3617: /* Return the innermost context enclosing DECL that is ! 3618: a FUNCTION_DECL, or zero if none. */ ! 3619: ! 3620: tree ! 3621: decl_function_context (decl) ! 3622: tree decl; ! 3623: { ! 3624: tree context; ! 3625: ! 3626: if (TREE_CODE (decl) == ERROR_MARK) ! 3627: return 0; ! 3628: ! 3629: #ifdef METHOD_SEL_NAME ! 3630: if (TREE_CODE (decl) == INSTANCE_METHOD_DECL ! 3631: || TREE_CODE (decl) == CLASS_METHOD_DECL) ! 3632: return 0; ! 3633: #endif ! 3634: ! 3635: if (TREE_CODE (decl) == SAVE_EXPR) ! 3636: context = SAVE_EXPR_CONTEXT (decl); ! 3637: else ! 3638: context = DECL_CONTEXT (decl); ! 3639: ! 3640: while (context && TREE_CODE (context) != FUNCTION_DECL) ! 3641: { ! 3642: if (TREE_CODE (context) == RECORD_TYPE ! 3643: || TREE_CODE (context) == UNION_TYPE) ! 3644: context = TYPE_CONTEXT (context); ! 3645: else if (TREE_CODE (context) == TYPE_DECL) ! 3646: context = DECL_CONTEXT (context); ! 3647: else if (TREE_CODE (context) == BLOCK) ! 3648: context = BLOCK_SUPERCONTEXT (context); ! 3649: else ! 3650: /* Unhandled CONTEXT !? */ ! 3651: abort (); ! 3652: } ! 3653: ! 3654: return context; ! 3655: } ! 3656: ! 3657: /* Return the innermost context enclosing DECL that is ! 3658: a RECORD_TYPE, UNION_TYPE or QUAL_UNION_TYPE, or zero if none. ! 3659: TYPE_DECLs and FUNCTION_DECLs are transparent to this function. */ ! 3660: ! 3661: tree ! 3662: decl_type_context (decl) ! 3663: tree decl; ! 3664: { ! 3665: tree context = DECL_CONTEXT (decl); ! 3666: ! 3667: while (context) ! 3668: { ! 3669: if (TREE_CODE (context) == RECORD_TYPE ! 3670: || TREE_CODE (context) == UNION_TYPE ! 3671: || TREE_CODE (context) == QUAL_UNION_TYPE) ! 3672: return context; ! 3673: if (TREE_CODE (context) == TYPE_DECL ! 3674: || TREE_CODE (context) == FUNCTION_DECL) ! 3675: context = DECL_CONTEXT (context); ! 3676: else if (TREE_CODE (context) == BLOCK) ! 3677: context = BLOCK_SUPERCONTEXT (context); ! 3678: else ! 3679: /* Unhandled CONTEXT!? */ ! 3680: abort (); ! 3681: } ! 3682: return NULL_TREE; ! 3683: } ! 3684: ! 3685: void ! 3686: print_obstack_statistics (str, o) ! 3687: char *str; ! 3688: struct obstack *o; ! 3689: { ! 3690: struct _obstack_chunk *chunk = o->chunk; ! 3691: int n_chunks = 0; ! 3692: int n_alloc = 0; ! 3693: ! 3694: while (chunk) ! 3695: { ! 3696: n_chunks += 1; ! 3697: n_alloc += chunk->limit - &chunk->contents[0]; ! 3698: chunk = chunk->prev; ! 3699: } ! 3700: fprintf (stderr, "obstack %s: %d bytes, %d chunks\n", ! 3701: str, n_alloc, n_chunks); ! 3702: } ! 3703: void ! 3704: dump_tree_statistics () ! 3705: { ! 3706: int i; ! 3707: int total_nodes, total_bytes; ! 3708: ! 3709: fprintf (stderr, "\n??? tree nodes created\n\n"); ! 3710: #ifdef GATHER_STATISTICS ! 3711: fprintf (stderr, "Kind Nodes Bytes\n"); ! 3712: fprintf (stderr, "-------------------------------------\n"); ! 3713: total_nodes = total_bytes = 0; ! 3714: for (i = 0; i < (int) all_kinds; i++) ! 3715: { ! 3716: fprintf (stderr, "%-20s %6d %9d\n", tree_node_kind_names[i], ! 3717: tree_node_counts[i], tree_node_sizes[i]); ! 3718: total_nodes += tree_node_counts[i]; ! 3719: total_bytes += tree_node_sizes[i]; ! 3720: } ! 3721: fprintf (stderr, "%-20s %9d\n", "identifier names", id_string_size); ! 3722: fprintf (stderr, "-------------------------------------\n"); ! 3723: fprintf (stderr, "%-20s %6d %9d\n", "Total", total_nodes, total_bytes); ! 3724: fprintf (stderr, "-------------------------------------\n"); ! 3725: #else ! 3726: fprintf (stderr, "(No per-node statistics)\n"); ! 3727: #endif ! 3728: print_lang_statistics (); ! 3729: } ! 3730: ! 3731: #define FILE_FUNCTION_PREFIX_LEN 9 ! 3732: ! 3733: #ifndef NO_DOLLAR_IN_LABEL ! 3734: #define FILE_FUNCTION_FORMAT "_GLOBAL_$D$%s" ! 3735: #else /* NO_DOLLAR_IN_LABEL */ ! 3736: #ifndef NO_DOT_IN_LABEL ! 3737: #define FILE_FUNCTION_FORMAT "_GLOBAL_.D.%s" ! 3738: #else /* NO_DOT_IN_LABEL */ ! 3739: #define FILE_FUNCTION_FORMAT "__GLOBAL_D_%s" ! 3740: #endif /* NO_DOT_IN_LABEL */ ! 3741: #endif /* NO_DOLLAR_IN_LABEL */ ! 3742: ! 3743: extern char * first_global_object_name; ! 3744: ! 3745: /* If KIND=='I', return a suitable global initializer (constructor) name. ! 3746: If KIND=='D', return a suitable global clean-up (destructor) name. */ ! 3747: ! 3748: tree ! 3749: get_file_function_name (kind) ! 3750: int kind; ! 3751: { ! 3752: char *buf; ! 3753: register char *p; ! 3754: ! 3755: if (first_global_object_name) ! 3756: p = first_global_object_name; ! 3757: else if (main_input_filename) ! 3758: p = main_input_filename; ! 3759: else ! 3760: p = input_filename; ! 3761: ! 3762: buf = (char *) alloca (sizeof (FILE_FUNCTION_FORMAT) + strlen (p)); ! 3763: ! 3764: /* Set up the name of the file-level functions we may need. */ ! 3765: /* Use a global object (which is already required to be unique over ! 3766: the program) rather than the file name (which imposes extra ! 3767: constraints). -- [email protected], 10 Jan 1990. */ ! 3768: sprintf (buf, FILE_FUNCTION_FORMAT, p); ! 3769: ! 3770: /* Don't need to pull wierd characters out of global names. */ ! 3771: if (p != first_global_object_name) ! 3772: { ! 3773: for (p = buf+11; *p; p++) ! 3774: if (! ((*p >= '0' && *p <= '9') ! 3775: #if 0 /* we always want labels, which are valid C++ identifiers (+ `$') */ ! 3776: #ifndef ASM_IDENTIFY_GCC /* this is required if `.' is invalid -- k. raeburn */ ! 3777: || *p == '.' ! 3778: #endif ! 3779: #endif ! 3780: #ifndef NO_DOLLAR_IN_LABEL /* this for `$'; unlikely, but... -- kr */ ! 3781: || *p == '$' ! 3782: #endif ! 3783: #ifndef NO_DOT_IN_LABEL /* this for `.'; unlikely, but... */ ! 3784: || *p == '.' ! 3785: #endif ! 3786: || (*p >= 'A' && *p <= 'Z') ! 3787: || (*p >= 'a' && *p <= 'z'))) ! 3788: *p = '_'; ! 3789: } ! 3790: ! 3791: buf[FILE_FUNCTION_PREFIX_LEN] = kind; ! 3792: ! 3793: return get_identifier (buf); ! 3794: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.