OSDN Git Service

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