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