OSDN Git Service

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