OSDN Git Service

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