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