]> gcc.gnu.org Git - gcc.git/blob - gcc/cp/tree.c
cp-tree.def: Add SRCLOC.
[gcc.git] / gcc / cp / tree.c
1 /* Language-dependent node constructors for parse phase of GNU compiler.
2 Copyright (C) 1987, 88, 92, 93, 94, 95, 1996 Free Software Foundation, Inc.
3 Hacked by Michael Tiemann (tiemann@cygnus.com)
4
5 This file is part of GNU CC.
6
7 GNU CC is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2, or (at your option)
10 any later version.
11
12 GNU CC is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with GNU CC; see the file COPYING. If not, write to
19 the Free Software Foundation, 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, USA. */
21
22 #include "config.h"
23 #include "system.h"
24 #include "obstack.h"
25 #include "tree.h"
26 #include "cp-tree.h"
27 #include "flags.h"
28 #include "rtl.h"
29 #include "toplev.h"
30
31 #ifdef __STDC__
32 #include <stdarg.h>
33 #else
34 #include <varargs.h>
35 #endif
36
37 extern void compiler_error ();
38
39 static tree get_identifier_list PROTO((tree));
40 static tree bot_manip PROTO((tree));
41 static tree perm_manip PROTO((tree));
42 static tree build_cplus_array_type_1 PROTO((tree, tree));
43 static void list_hash_add PROTO((int, tree));
44 static int list_hash PROTO((tree, tree, tree));
45 static tree list_hash_lookup PROTO((int, int, int, int, tree, tree,
46 tree));
47 static void propagate_binfo_offsets PROTO((tree, tree));
48 static void unshare_base_binfos PROTO((tree));
49 static int avoid_overlap PROTO((tree, tree));
50
51 #define CEIL(x,y) (((x) + (y) - 1) / (y))
52
53 /* Return nonzero if REF is an lvalue valid for this language.
54 Lvalues can be assigned, unless they have TREE_READONLY.
55 Lvalues can have their address taken, unless they have DECL_REGISTER. */
56
57 int
58 real_lvalue_p (ref)
59 tree ref;
60 {
61 if (! language_lvalue_valid (ref))
62 return 0;
63
64 if (TREE_CODE (TREE_TYPE (ref)) == REFERENCE_TYPE)
65 return 1;
66
67 if (ref == current_class_ptr && flag_this_is_variable <= 0)
68 return 0;
69
70 switch (TREE_CODE (ref))
71 {
72 /* preincrements and predecrements are valid lvals, provided
73 what they refer to are valid lvals. */
74 case PREINCREMENT_EXPR:
75 case PREDECREMENT_EXPR:
76 case COMPONENT_REF:
77 case SAVE_EXPR:
78 case UNSAVE_EXPR:
79 case TRY_CATCH_EXPR:
80 case WITH_CLEANUP_EXPR:
81 return real_lvalue_p (TREE_OPERAND (ref, 0));
82
83 case STRING_CST:
84 return 1;
85
86 case VAR_DECL:
87 if (TREE_READONLY (ref) && ! TREE_STATIC (ref)
88 && DECL_LANG_SPECIFIC (ref)
89 && DECL_IN_AGGR_P (ref))
90 return 0;
91 case INDIRECT_REF:
92 case ARRAY_REF:
93 case PARM_DECL:
94 case RESULT_DECL:
95 case ERROR_MARK:
96 if (TREE_CODE (TREE_TYPE (ref)) != FUNCTION_TYPE
97 && TREE_CODE (TREE_TYPE (ref)) != METHOD_TYPE)
98 return 1;
99 break;
100
101 /* A currently unresolved scope ref. */
102 case SCOPE_REF:
103 my_friendly_abort (103);
104 case OFFSET_REF:
105 if (TREE_CODE (TREE_OPERAND (ref, 1)) == FUNCTION_DECL)
106 return 1;
107 return real_lvalue_p (TREE_OPERAND (ref, 0))
108 && real_lvalue_p (TREE_OPERAND (ref, 1));
109 break;
110
111 case COND_EXPR:
112 return (real_lvalue_p (TREE_OPERAND (ref, 1))
113 && real_lvalue_p (TREE_OPERAND (ref, 2)));
114
115 case MODIFY_EXPR:
116 return 1;
117
118 case COMPOUND_EXPR:
119 return real_lvalue_p (TREE_OPERAND (ref, 1));
120
121 case MAX_EXPR:
122 case MIN_EXPR:
123 return (real_lvalue_p (TREE_OPERAND (ref, 0))
124 && real_lvalue_p (TREE_OPERAND (ref, 1)));
125
126 default:
127 break;
128 }
129
130 return 0;
131 }
132
133 /* This differs from real_lvalue_p in that class rvalues are considered
134 lvalues. */
135 int
136 lvalue_p (ref)
137 tree ref;
138 {
139 if (! language_lvalue_valid (ref))
140 return 0;
141
142 if (TREE_CODE (TREE_TYPE (ref)) == REFERENCE_TYPE)
143 return 1;
144
145 if (ref == current_class_ptr && flag_this_is_variable <= 0)
146 return 0;
147
148 switch (TREE_CODE (ref))
149 {
150 /* preincrements and predecrements are valid lvals, provided
151 what they refer to are valid lvals. */
152 case PREINCREMENT_EXPR:
153 case PREDECREMENT_EXPR:
154 case REALPART_EXPR:
155 case IMAGPART_EXPR:
156 case COMPONENT_REF:
157 case SAVE_EXPR:
158 case UNSAVE_EXPR:
159 case TRY_CATCH_EXPR:
160 case WITH_CLEANUP_EXPR:
161 return lvalue_p (TREE_OPERAND (ref, 0));
162
163 case STRING_CST:
164 return 1;
165
166 case VAR_DECL:
167 if (TREE_READONLY (ref) && ! TREE_STATIC (ref)
168 && DECL_LANG_SPECIFIC (ref)
169 && DECL_IN_AGGR_P (ref))
170 return 0;
171 case INDIRECT_REF:
172 case ARRAY_REF:
173 case PARM_DECL:
174 case RESULT_DECL:
175 case ERROR_MARK:
176 if (TREE_CODE (TREE_TYPE (ref)) != FUNCTION_TYPE
177 && TREE_CODE (TREE_TYPE (ref)) != METHOD_TYPE)
178 return 1;
179 break;
180
181 case TARGET_EXPR:
182 return 1;
183
184 case CALL_EXPR:
185 if (IS_AGGR_TYPE (TREE_TYPE (ref)))
186 return 1;
187 break;
188
189 /* A currently unresolved scope ref. */
190 case SCOPE_REF:
191 my_friendly_abort (103);
192 case OFFSET_REF:
193 if (TREE_CODE (TREE_OPERAND (ref, 1)) == FUNCTION_DECL)
194 return 1;
195 return lvalue_p (TREE_OPERAND (ref, 0))
196 && lvalue_p (TREE_OPERAND (ref, 1));
197 break;
198
199 case COND_EXPR:
200 return (lvalue_p (TREE_OPERAND (ref, 1))
201 && lvalue_p (TREE_OPERAND (ref, 2)));
202
203 case MODIFY_EXPR:
204 return 1;
205
206 case COMPOUND_EXPR:
207 return lvalue_p (TREE_OPERAND (ref, 1));
208
209 case MAX_EXPR:
210 case MIN_EXPR:
211 return (lvalue_p (TREE_OPERAND (ref, 0))
212 && lvalue_p (TREE_OPERAND (ref, 1)));
213
214 default:
215 break;
216 }
217
218 return 0;
219 }
220
221 /* Return nonzero if REF is an lvalue valid for this language;
222 otherwise, print an error message and return zero. */
223
224 int
225 lvalue_or_else (ref, string)
226 tree ref;
227 char *string;
228 {
229 int win = lvalue_p (ref);
230 if (! win)
231 error ("non-lvalue in %s", string);
232 return win;
233 }
234
235 /* INIT is a CALL_EXPR which needs info about its target.
236 TYPE is the type that this initialization should appear to have.
237
238 Build an encapsulation of the initialization to perform
239 and return it so that it can be processed by language-independent
240 and language-specific expression expanders. */
241
242 tree
243 build_cplus_new (type, init)
244 tree type;
245 tree init;
246 {
247 tree slot;
248 tree rval;
249
250 if (TREE_CODE (init) != CALL_EXPR && TREE_CODE (init) != AGGR_INIT_EXPR)
251 return init;
252
253 slot = build (VAR_DECL, type);
254 DECL_ARTIFICIAL (slot) = 1;
255 layout_decl (slot, 0);
256 rval = build (AGGR_INIT_EXPR, type,
257 TREE_OPERAND (init, 0), TREE_OPERAND (init, 1), slot);
258 TREE_SIDE_EFFECTS (rval) = 1;
259 rval = build (TARGET_EXPR, type, slot, rval, NULL_TREE, NULL_TREE);
260 TREE_SIDE_EFFECTS (rval) = 1;
261
262 return rval;
263 }
264
265 /* Encapsulate the expression INIT in a TARGET_EXPR. */
266
267 tree
268 get_target_expr (init)
269 tree init;
270 {
271 tree slot;
272 tree rval;
273
274 slot = build (VAR_DECL, TREE_TYPE (init));
275 DECL_ARTIFICIAL (slot) = 1;
276 layout_decl (slot, 0);
277 rval = build (TARGET_EXPR, TREE_TYPE (init), slot, init,
278 NULL_TREE, NULL_TREE);
279 TREE_SIDE_EFFECTS (rval) = 1;
280
281 return rval;
282 }
283
284 /* Recursively search EXP for CALL_EXPRs that need cleanups and replace
285 these CALL_EXPRs with tree nodes that will perform the cleanups. */
286
287 tree
288 break_out_cleanups (exp)
289 tree exp;
290 {
291 tree tmp = exp;
292
293 if (TREE_CODE (tmp) == CALL_EXPR
294 && TYPE_NEEDS_DESTRUCTOR (TREE_TYPE (tmp)))
295 return build_cplus_new (TREE_TYPE (tmp), tmp);
296
297 while (TREE_CODE (tmp) == NOP_EXPR
298 || TREE_CODE (tmp) == CONVERT_EXPR
299 || TREE_CODE (tmp) == NON_LVALUE_EXPR)
300 {
301 if (TREE_CODE (TREE_OPERAND (tmp, 0)) == CALL_EXPR
302 && TYPE_NEEDS_DESTRUCTOR (TREE_TYPE (TREE_OPERAND (tmp, 0))))
303 {
304 TREE_OPERAND (tmp, 0)
305 = build_cplus_new (TREE_TYPE (TREE_OPERAND (tmp, 0)),
306 TREE_OPERAND (tmp, 0));
307 break;
308 }
309 else
310 tmp = TREE_OPERAND (tmp, 0);
311 }
312 return exp;
313 }
314
315 /* Recursively perform a preorder search EXP for CALL_EXPRs, making
316 copies where they are found. Returns a deep copy all nodes transitively
317 containing CALL_EXPRs. */
318
319 tree
320 break_out_calls (exp)
321 tree exp;
322 {
323 register tree t1, t2 = NULL_TREE;
324 register enum tree_code code;
325 register int changed = 0;
326 register int i;
327
328 if (exp == NULL_TREE)
329 return exp;
330
331 code = TREE_CODE (exp);
332
333 if (code == CALL_EXPR)
334 return copy_node (exp);
335
336 /* Don't try and defeat a save_expr, as it should only be done once. */
337 if (code == SAVE_EXPR)
338 return exp;
339
340 switch (TREE_CODE_CLASS (code))
341 {
342 default:
343 abort ();
344
345 case 'c': /* a constant */
346 case 't': /* a type node */
347 case 'x': /* something random, like an identifier or an ERROR_MARK. */
348 return exp;
349
350 case 'd': /* A decl node */
351 #if 0 /* This is bogus. jason 9/21/94 */
352
353 t1 = break_out_calls (DECL_INITIAL (exp));
354 if (t1 != DECL_INITIAL (exp))
355 {
356 exp = copy_node (exp);
357 DECL_INITIAL (exp) = t1;
358 }
359 #endif
360 return exp;
361
362 case 'b': /* A block node */
363 {
364 /* Don't know how to handle these correctly yet. Must do a
365 break_out_calls on all DECL_INITIAL values for local variables,
366 and also break_out_calls on all sub-blocks and sub-statements. */
367 abort ();
368 }
369 return exp;
370
371 case 'e': /* an expression */
372 case 'r': /* a reference */
373 case 's': /* an expression with side effects */
374 for (i = tree_code_length[(int) code] - 1; i >= 0; i--)
375 {
376 t1 = break_out_calls (TREE_OPERAND (exp, i));
377 if (t1 != TREE_OPERAND (exp, i))
378 {
379 exp = copy_node (exp);
380 TREE_OPERAND (exp, i) = t1;
381 }
382 }
383 return exp;
384
385 case '<': /* a comparison expression */
386 case '2': /* a binary arithmetic expression */
387 t2 = break_out_calls (TREE_OPERAND (exp, 1));
388 if (t2 != TREE_OPERAND (exp, 1))
389 changed = 1;
390 case '1': /* a unary arithmetic expression */
391 t1 = break_out_calls (TREE_OPERAND (exp, 0));
392 if (t1 != TREE_OPERAND (exp, 0))
393 changed = 1;
394 if (changed)
395 {
396 if (tree_code_length[(int) code] == 1)
397 return build1 (code, TREE_TYPE (exp), t1);
398 else
399 return build (code, TREE_TYPE (exp), t1, t2);
400 }
401 return exp;
402 }
403
404 }
405 \f
406 extern struct obstack *current_obstack;
407 extern struct obstack permanent_obstack, class_obstack;
408 extern struct obstack *saveable_obstack;
409 extern struct obstack *expression_obstack;
410
411 /* Here is how primitive or already-canonicalized types' hash
412 codes are made. MUST BE CONSISTENT WITH tree.c !!! */
413 #define TYPE_HASH(TYPE) ((HOST_WIDE_INT) (TYPE) & 0777777)
414
415 /* Construct, lay out and return the type of methods belonging to class
416 BASETYPE and whose arguments are described by ARGTYPES and whose values
417 are described by RETTYPE. If each type exists already, reuse it. */
418
419 tree
420 build_cplus_method_type (basetype, rettype, argtypes)
421 tree basetype, rettype, argtypes;
422 {
423 register tree t;
424 tree ptype;
425 int hashcode;
426
427 /* Make a node of the sort we want. */
428 t = make_node (METHOD_TYPE);
429
430 TYPE_METHOD_BASETYPE (t) = TYPE_MAIN_VARIANT (basetype);
431 TREE_TYPE (t) = rettype;
432 if (IS_SIGNATURE (basetype))
433 ptype = build_signature_pointer_type (TYPE_MAIN_VARIANT (basetype),
434 TYPE_READONLY (basetype),
435 TYPE_VOLATILE (basetype));
436 else
437 ptype = build_pointer_type (basetype);
438
439 /* The actual arglist for this function includes a "hidden" argument
440 which is "this". Put it into the list of argument types. */
441
442 argtypes = tree_cons (NULL_TREE, ptype, argtypes);
443 TYPE_ARG_TYPES (t) = argtypes;
444 TREE_SIDE_EFFECTS (argtypes) = 1; /* Mark first argtype as "artificial". */
445
446 /* If we already have such a type, use the old one and free this one.
447 Note that it also frees up the above cons cell if found. */
448 hashcode = TYPE_HASH (basetype) + TYPE_HASH (rettype) + type_hash_list (argtypes);
449 t = type_hash_canon (hashcode, t);
450
451 if (TYPE_SIZE (t) == 0)
452 layout_type (t);
453
454 return t;
455 }
456
457 static tree
458 build_cplus_array_type_1 (elt_type, index_type)
459 tree elt_type;
460 tree index_type;
461 {
462 register struct obstack *ambient_obstack = current_obstack;
463 register struct obstack *ambient_saveable_obstack = saveable_obstack;
464 tree t;
465
466 /* We need a new one. If both ELT_TYPE and INDEX_TYPE are permanent,
467 make this permanent too. */
468 if (TREE_PERMANENT (elt_type)
469 && (index_type == 0 || TREE_PERMANENT (index_type)))
470 {
471 current_obstack = &permanent_obstack;
472 saveable_obstack = &permanent_obstack;
473 }
474
475 if (processing_template_decl)
476 {
477 t = make_node (ARRAY_TYPE);
478 TREE_TYPE (t) = elt_type;
479 TYPE_DOMAIN (t) = index_type;
480 }
481 else
482 t = build_array_type (elt_type, index_type);
483
484 /* Push these needs up so that initialization takes place
485 more easily. */
486 TYPE_NEEDS_CONSTRUCTING (t) = TYPE_NEEDS_CONSTRUCTING (TYPE_MAIN_VARIANT (elt_type));
487 TYPE_NEEDS_DESTRUCTOR (t) = TYPE_NEEDS_DESTRUCTOR (TYPE_MAIN_VARIANT (elt_type));
488 current_obstack = ambient_obstack;
489 saveable_obstack = ambient_saveable_obstack;
490 return t;
491 }
492
493 tree
494 build_cplus_array_type (elt_type, index_type)
495 tree elt_type;
496 tree index_type;
497 {
498 tree t;
499 int constp = TYPE_READONLY (elt_type);
500 int volatilep = TYPE_VOLATILE (elt_type);
501 elt_type = TYPE_MAIN_VARIANT (elt_type);
502
503 t = build_cplus_array_type_1 (elt_type, index_type);
504
505 if (constp || volatilep)
506 t = cp_build_type_variant (t, constp, volatilep);
507
508 return t;
509 }
510 \f
511 /* Make a variant type in the proper way for C/C++, propagating qualifiers
512 down to the element type of an array. */
513
514 tree
515 cp_build_type_variant (type, constp, volatilep)
516 tree type;
517 int constp, volatilep;
518 {
519 if (type == error_mark_node)
520 return type;
521
522 if (TREE_CODE (type) == ARRAY_TYPE)
523 {
524 tree real_main_variant = TYPE_MAIN_VARIANT (type);
525
526 push_obstacks (TYPE_OBSTACK (real_main_variant),
527 TYPE_OBSTACK (real_main_variant));
528 type = build_cplus_array_type_1 (cp_build_type_variant
529 (TREE_TYPE (type), constp, volatilep),
530 TYPE_DOMAIN (type));
531
532 /* TYPE must be on same obstack as REAL_MAIN_VARIANT. If not,
533 make a copy. (TYPE might have come from the hash table and
534 REAL_MAIN_VARIANT might be in some function's obstack.) */
535
536 if (TYPE_OBSTACK (type) != TYPE_OBSTACK (real_main_variant))
537 {
538 type = copy_node (type);
539 TYPE_POINTER_TO (type) = TYPE_REFERENCE_TO (type) = 0;
540 }
541
542 TYPE_MAIN_VARIANT (type) = real_main_variant;
543 pop_obstacks ();
544 return type;
545 }
546 return build_type_variant (type, constp, volatilep);
547 }
548 \f
549 /* Add OFFSET to all base types of T.
550
551 OFFSET, which is a type offset, is number of bytes.
552
553 Note that we don't have to worry about having two paths to the
554 same base type, since this type owns its association list. */
555
556 static void
557 propagate_binfo_offsets (binfo, offset)
558 tree binfo;
559 tree offset;
560 {
561 tree binfos = BINFO_BASETYPES (binfo);
562 int i, n_baselinks = binfos ? TREE_VEC_LENGTH (binfos) : 0;
563
564 for (i = 0; i < n_baselinks; /* note increment is done in the loop. */)
565 {
566 tree base_binfo = TREE_VEC_ELT (binfos, i);
567
568 if (TREE_VIA_VIRTUAL (base_binfo))
569 i += 1;
570 else
571 {
572 int j;
573 tree delta = NULL_TREE;
574
575 for (j = i+1; j < n_baselinks; j++)
576 if (! TREE_VIA_VIRTUAL (TREE_VEC_ELT (binfos, j)))
577 {
578 /* The next basetype offset must take into account the space
579 between the classes, not just the size of each class. */
580 delta = size_binop (MINUS_EXPR,
581 BINFO_OFFSET (TREE_VEC_ELT (binfos, j)),
582 BINFO_OFFSET (base_binfo));
583 break;
584 }
585
586 #if 0
587 if (BINFO_OFFSET_ZEROP (base_binfo))
588 BINFO_OFFSET (base_binfo) = offset;
589 else
590 BINFO_OFFSET (base_binfo)
591 = size_binop (PLUS_EXPR, BINFO_OFFSET (base_binfo), offset);
592 #else
593 BINFO_OFFSET (base_binfo) = offset;
594 #endif
595
596 unshare_base_binfos (base_binfo);
597
598 /* Go to our next class that counts for offset propagation. */
599 i = j;
600 if (i < n_baselinks)
601 offset = size_binop (PLUS_EXPR, offset, delta);
602 }
603 }
604 }
605
606 /* Makes new binfos for the indirect bases under BASE_BINFO, and updates
607 BINFO_OFFSET for them and their bases. */
608
609 static void
610 unshare_base_binfos (base_binfo)
611 tree base_binfo;
612 {
613 if (BINFO_BASETYPES (base_binfo))
614 {
615 tree base_binfos = BINFO_BASETYPES (base_binfo);
616 tree chain = NULL_TREE;
617 int j;
618
619 /* Now unshare the structure beneath BASE_BINFO. */
620 for (j = TREE_VEC_LENGTH (base_binfos)-1;
621 j >= 0; j--)
622 {
623 tree base_base_binfo = TREE_VEC_ELT (base_binfos, j);
624 if (! TREE_VIA_VIRTUAL (base_base_binfo))
625 TREE_VEC_ELT (base_binfos, j)
626 = make_binfo (BINFO_OFFSET (base_base_binfo),
627 base_base_binfo,
628 BINFO_VTABLE (base_base_binfo),
629 BINFO_VIRTUALS (base_base_binfo),
630 chain);
631 chain = TREE_VEC_ELT (base_binfos, j);
632 TREE_VIA_PUBLIC (chain) = TREE_VIA_PUBLIC (base_base_binfo);
633 TREE_VIA_PROTECTED (chain) = TREE_VIA_PROTECTED (base_base_binfo);
634 BINFO_INHERITANCE_CHAIN (chain) = base_binfo;
635 }
636
637 /* Completely unshare potentially shared data, and
638 update what is ours. */
639 propagate_binfo_offsets (base_binfo, BINFO_OFFSET (base_binfo));
640 }
641 }
642
643 /* Finish the work of layout_record, now taking virtual bases into account.
644 Also compute the actual offsets that our base classes will have.
645 This must be performed after the fields are laid out, since virtual
646 baseclasses must lay down at the end of the record.
647
648 Returns the maximum number of virtual functions any of the
649 baseclasses provide. */
650
651 int
652 layout_basetypes (rec, max)
653 tree rec;
654 int max;
655 {
656 tree binfos = TYPE_BINFO_BASETYPES (rec);
657 int i, n_baseclasses = binfos ? TREE_VEC_LENGTH (binfos) : 0;
658
659 /* Get all the virtual base types that this type uses.
660 The TREE_VALUE slot holds the virtual baseclass type. */
661 tree vbase_types = get_vbase_types (rec);
662
663 unsigned int record_align = MAX (BITS_PER_UNIT, TYPE_ALIGN (rec));
664 unsigned int desired_align;
665
666 /* Record size so far is CONST_SIZE bits, where CONST_SIZE is an integer. */
667 register unsigned int const_size = 0;
668 unsigned int nonvirtual_const_size;
669
670 #ifdef STRUCTURE_SIZE_BOUNDARY
671 /* Packed structures don't need to have minimum size. */
672 if (! TYPE_PACKED (rec))
673 record_align = MAX (record_align, STRUCTURE_SIZE_BOUNDARY);
674 #endif
675
676 CLASSTYPE_VBASECLASSES (rec) = vbase_types;
677
678 my_friendly_assert (TREE_CODE (TYPE_SIZE (rec)) == INTEGER_CST, 19970302);
679 const_size = TREE_INT_CST_LOW (TYPE_SIZE (rec));
680
681 nonvirtual_const_size = const_size;
682
683 while (vbase_types)
684 {
685 tree basetype = BINFO_TYPE (vbase_types);
686 tree offset;
687
688 desired_align = TYPE_ALIGN (basetype);
689 record_align = MAX (record_align, desired_align);
690
691 if (const_size == 0)
692 offset = integer_zero_node;
693 else
694 {
695 /* Give each virtual base type the alignment it wants. */
696 const_size = CEIL (const_size, desired_align) * desired_align;
697 offset = size_int (CEIL (const_size, BITS_PER_UNIT));
698 }
699
700 if (CLASSTYPE_VSIZE (basetype) > max)
701 max = CLASSTYPE_VSIZE (basetype);
702 BINFO_OFFSET (vbase_types) = offset;
703
704 /* Every virtual baseclass takes a least a UNIT, so that we can
705 take it's address and get something different for each base. */
706 const_size += MAX (BITS_PER_UNIT,
707 TREE_INT_CST_LOW (CLASSTYPE_SIZE (basetype)));
708
709 vbase_types = TREE_CHAIN (vbase_types);
710 }
711
712 if (const_size)
713 {
714 /* Because a virtual base might take a single byte above,
715 we have to re-adjust the total size to make sure it is
716 a multiple of the alignment. */
717 /* Give the whole object the alignment it wants. */
718 const_size = CEIL (const_size, record_align) * record_align;
719 }
720
721 /* Set the alignment in the complete type. We don't set CLASSTYPE_ALIGN
722 here, as that is for this class, without any virtual base classes. */
723 TYPE_ALIGN (rec) = record_align;
724 if (const_size != nonvirtual_const_size)
725 TYPE_SIZE (rec) = size_int (const_size);
726
727 /* Now propagate offset information throughout the lattice. */
728 for (i = 0; i < n_baseclasses; i++)
729 {
730 register tree base_binfo = TREE_VEC_ELT (binfos, i);
731 register tree basetype = BINFO_TYPE (base_binfo);
732 tree field = TYPE_FIELDS (rec);
733
734 if (TREE_VIA_VIRTUAL (base_binfo))
735 continue;
736
737 my_friendly_assert (TREE_TYPE (field) == basetype, 23897);
738 BINFO_OFFSET (base_binfo)
739 = size_int (CEIL (TREE_INT_CST_LOW (DECL_FIELD_BITPOS (field)),
740 BITS_PER_UNIT));
741 unshare_base_binfos (base_binfo);
742 TYPE_FIELDS (rec) = TREE_CHAIN (field);
743 }
744
745 for (vbase_types = CLASSTYPE_VBASECLASSES (rec); vbase_types;
746 vbase_types = TREE_CHAIN (vbase_types))
747 {
748 BINFO_INHERITANCE_CHAIN (vbase_types) = TYPE_BINFO (rec);
749 unshare_base_binfos (vbase_types);
750 }
751
752 return max;
753 }
754
755 /* If the empty base field in DECL overlaps with a base of the same type in
756 NEWDECL, which is either another base field or the first data field of
757 the class, pad the base just before NEWDECL and return 1. Otherwise,
758 return 0. */
759
760 static int
761 avoid_overlap (decl, newdecl)
762 tree decl, newdecl;
763 {
764 tree field;
765
766 if (newdecl == NULL_TREE
767 || ! types_overlap_p (TREE_TYPE (decl), TREE_TYPE (newdecl)))
768 return 0;
769
770 for (field = decl; TREE_CHAIN (field) && TREE_CHAIN (field) != newdecl;
771 field = TREE_CHAIN (field))
772 ;
773
774 DECL_SIZE (field) = integer_one_node;
775
776 return 1;
777 }
778
779 /* Returns a list of fields to stand in for the base class subobjects
780 of REC. These fields are later removed by layout_basetypes. */
781
782 tree
783 build_base_fields (rec)
784 tree rec;
785 {
786 /* Chain to hold all the new FIELD_DECLs which stand in for base class
787 subobjects. */
788 tree base_decls = NULL_TREE;
789 tree binfos = TYPE_BINFO_BASETYPES (rec);
790 int n_baseclasses = binfos ? TREE_VEC_LENGTH (binfos) : 0;
791 tree decl, nextdecl;
792 int i, saw_empty = 0;
793 unsigned int base_align = 0;
794
795 for (i = 0; i < n_baseclasses; ++i)
796 {
797 register tree base_binfo = TREE_VEC_ELT (binfos, i);
798 register tree basetype = BINFO_TYPE (base_binfo);
799
800 if (TYPE_SIZE (basetype) == 0)
801 /* This error is now reported in xref_tag, thus giving better
802 location information. */
803 continue;
804
805 if (TREE_VIA_VIRTUAL (base_binfo))
806 continue;
807
808 decl = build_lang_field_decl (FIELD_DECL, NULL_TREE, basetype);
809 DECL_ARTIFICIAL (decl) = 1;
810 DECL_FIELD_CONTEXT (decl) = DECL_CLASS_CONTEXT (decl) = rec;
811 DECL_SIZE (decl) = CLASSTYPE_SIZE (basetype);
812 DECL_ALIGN (decl) = CLASSTYPE_ALIGN (basetype);
813 TREE_CHAIN (decl) = base_decls;
814 base_decls = decl;
815
816 if (! flag_new_abi)
817 {
818 /* Brain damage for backwards compatibility. For no good reason,
819 the old layout_basetypes made every base at least as large as
820 the alignment for the bases up to that point, gratuitously
821 wasting space. So we do the same thing here. */
822 base_align = MAX (base_align, DECL_ALIGN (decl));
823 DECL_SIZE (decl)
824 = size_int (MAX (TREE_INT_CST_LOW (DECL_SIZE (decl)),
825 base_align));
826 }
827 else if (DECL_SIZE (decl) == integer_zero_node)
828 saw_empty = 1;
829 }
830
831 /* Reverse the list of fields so we allocate the bases in the proper
832 order. */
833 base_decls = nreverse (base_decls);
834
835 /* In the presence of empty base classes, we run the risk of allocating
836 two objects of the same class on top of one another. Avoid that. */
837 if (flag_new_abi && saw_empty)
838 for (decl = base_decls; decl; decl = TREE_CHAIN (decl))
839 {
840 if (DECL_SIZE (decl) == integer_zero_node)
841 {
842 /* First step through the following bases until we find
843 an overlap or a non-empty base. */
844 for (nextdecl = TREE_CHAIN (decl); nextdecl;
845 nextdecl = TREE_CHAIN (nextdecl))
846 {
847 if (avoid_overlap (decl, nextdecl)
848 || DECL_SIZE (nextdecl) != integer_zero_node)
849 goto nextbase;
850 }
851
852 /* If we're still looking, also check against the first
853 field. */
854 for (nextdecl = TYPE_FIELDS (rec);
855 nextdecl && TREE_CODE (nextdecl) != FIELD_DECL;
856 nextdecl = TREE_CHAIN (nextdecl))
857 /* keep looking */;
858 avoid_overlap (decl, nextdecl);
859 }
860 nextbase:;
861 }
862
863 return base_decls;
864 }
865
866 /* Returns list of virtual base class pointers in a FIELD_DECL chain. */
867
868 tree
869 build_vbase_pointer_fields (rec)
870 tree rec;
871 {
872 /* Chain to hold all the new FIELD_DECLs which point at virtual
873 base classes. */
874 tree vbase_decls = NULL_TREE;
875 tree binfos = TYPE_BINFO_BASETYPES (rec);
876 int n_baseclasses = binfos ? TREE_VEC_LENGTH (binfos) : 0;
877 tree decl;
878 int i;
879
880 /* Handle basetypes almost like fields, but record their
881 offsets differently. */
882
883 for (i = 0; i < n_baseclasses; i++)
884 {
885 register tree base_binfo = TREE_VEC_ELT (binfos, i);
886 register tree basetype = BINFO_TYPE (base_binfo);
887
888 if (TYPE_SIZE (basetype) == 0)
889 /* This error is now reported in xref_tag, thus giving better
890 location information. */
891 continue;
892
893 /* All basetypes are recorded in the association list of the
894 derived type. */
895
896 if (TREE_VIA_VIRTUAL (base_binfo))
897 {
898 int j;
899 char *name = (char *)alloca (TYPE_NAME_LENGTH (basetype)
900 + sizeof (VBASE_NAME) + 1);
901
902 /* The offset for a virtual base class is only used in computing
903 virtual function tables and for initializing virtual base
904 pointers. It is built once `get_vbase_types' is called. */
905
906 /* If this basetype can come from another vbase pointer
907 without an additional indirection, we will share
908 that pointer. If an indirection is involved, we
909 make our own pointer. */
910 for (j = 0; j < n_baseclasses; j++)
911 {
912 tree other_base_binfo = TREE_VEC_ELT (binfos, j);
913 if (! TREE_VIA_VIRTUAL (other_base_binfo)
914 && binfo_member (basetype,
915 CLASSTYPE_VBASECLASSES (BINFO_TYPE
916 (other_base_binfo))
917 ))
918 goto got_it;
919 }
920 sprintf (name, VBASE_NAME_FORMAT, TYPE_NAME_STRING (basetype));
921 decl = build_lang_field_decl (FIELD_DECL, get_identifier (name),
922 build_pointer_type (basetype));
923 /* If you change any of the below, take a look at all the
924 other VFIELD_BASEs and VTABLE_BASEs in the code, and change
925 them too. */
926 DECL_ASSEMBLER_NAME (decl) = get_identifier (VTABLE_BASE);
927 DECL_VIRTUAL_P (decl) = 1;
928 DECL_ARTIFICIAL (decl) = 1;
929 DECL_FIELD_CONTEXT (decl) = rec;
930 DECL_CLASS_CONTEXT (decl) = rec;
931 DECL_FCONTEXT (decl) = basetype;
932 DECL_SAVED_INSNS (decl) = NULL_RTX;
933 DECL_FIELD_SIZE (decl) = 0;
934 DECL_ALIGN (decl) = TYPE_ALIGN (ptr_type_node);
935 TREE_CHAIN (decl) = vbase_decls;
936 BINFO_VPTR_FIELD (base_binfo) = decl;
937 vbase_decls = decl;
938
939 got_it:
940 /* The space this decl occupies has already been accounted for. */
941 ;
942 }
943 }
944
945 return vbase_decls;
946 }
947 \f
948 /* Hashing of lists so that we don't make duplicates.
949 The entry point is `list_hash_canon'. */
950
951 /* Each hash table slot is a bucket containing a chain
952 of these structures. */
953
954 struct list_hash
955 {
956 struct list_hash *next; /* Next structure in the bucket. */
957 int hashcode; /* Hash code of this list. */
958 tree list; /* The list recorded here. */
959 };
960
961 /* Now here is the hash table. When recording a list, it is added
962 to the slot whose index is the hash code mod the table size.
963 Note that the hash table is used for several kinds of lists.
964 While all these live in the same table, they are completely independent,
965 and the hash code is computed differently for each of these. */
966
967 #define TYPE_HASH_SIZE 59
968 static struct list_hash *list_hash_table[TYPE_HASH_SIZE];
969
970 /* Compute a hash code for a list (chain of TREE_LIST nodes
971 with goodies in the TREE_PURPOSE, TREE_VALUE, and bits of the
972 TREE_COMMON slots), by adding the hash codes of the individual entries. */
973
974 static int
975 list_hash (purpose, value, chain)
976 tree purpose, value, chain;
977 {
978 register int hashcode = 0;
979
980 if (chain)
981 hashcode += TYPE_HASH (chain);
982
983 if (value)
984 hashcode += TYPE_HASH (value);
985 else
986 hashcode += 1007;
987 if (purpose)
988 hashcode += TYPE_HASH (purpose);
989 else
990 hashcode += 1009;
991 return hashcode;
992 }
993
994 /* Look in the type hash table for a type isomorphic to TYPE.
995 If one is found, return it. Otherwise return 0. */
996
997 static tree
998 list_hash_lookup (hashcode, via_public, via_protected, via_virtual,
999 purpose, value, chain)
1000 int hashcode, via_public, via_virtual, via_protected;
1001 tree purpose, value, chain;
1002 {
1003 register struct list_hash *h;
1004
1005 for (h = list_hash_table[hashcode % TYPE_HASH_SIZE]; h; h = h->next)
1006 if (h->hashcode == hashcode
1007 && TREE_VIA_VIRTUAL (h->list) == via_virtual
1008 && TREE_VIA_PUBLIC (h->list) == via_public
1009 && TREE_VIA_PROTECTED (h->list) == via_protected
1010 && TREE_PURPOSE (h->list) == purpose
1011 && TREE_VALUE (h->list) == value
1012 && TREE_CHAIN (h->list) == chain)
1013 return h->list;
1014 return 0;
1015 }
1016
1017 /* Add an entry to the list-hash-table
1018 for a list TYPE whose hash code is HASHCODE. */
1019
1020 static void
1021 list_hash_add (hashcode, list)
1022 int hashcode;
1023 tree list;
1024 {
1025 register struct list_hash *h;
1026
1027 h = (struct list_hash *) obstack_alloc (&class_obstack, sizeof (struct list_hash));
1028 h->hashcode = hashcode;
1029 h->list = list;
1030 h->next = list_hash_table[hashcode % TYPE_HASH_SIZE];
1031 list_hash_table[hashcode % TYPE_HASH_SIZE] = h;
1032 }
1033
1034 /* Given TYPE, and HASHCODE its hash code, return the canonical
1035 object for an identical list if one already exists.
1036 Otherwise, return TYPE, and record it as the canonical object
1037 if it is a permanent object.
1038
1039 To use this function, first create a list of the sort you want.
1040 Then compute its hash code from the fields of the list that
1041 make it different from other similar lists.
1042 Then call this function and use the value.
1043 This function frees the list you pass in if it is a duplicate. */
1044
1045 /* Set to 1 to debug without canonicalization. Never set by program. */
1046
1047 static int debug_no_list_hash = 0;
1048
1049 tree
1050 hash_tree_cons (via_public, via_virtual, via_protected, purpose, value, chain)
1051 int via_public, via_virtual, via_protected;
1052 tree purpose, value, chain;
1053 {
1054 struct obstack *ambient_obstack = current_obstack;
1055 tree t;
1056 int hashcode = 0;
1057
1058 if (! debug_no_list_hash)
1059 {
1060 hashcode = list_hash (purpose, value, chain);
1061 t = list_hash_lookup (hashcode, via_public, via_protected, via_virtual,
1062 purpose, value, chain);
1063 if (t)
1064 return t;
1065 }
1066
1067 current_obstack = &class_obstack;
1068
1069 t = tree_cons (purpose, value, chain);
1070 TREE_VIA_PUBLIC (t) = via_public;
1071 TREE_VIA_PROTECTED (t) = via_protected;
1072 TREE_VIA_VIRTUAL (t) = via_virtual;
1073
1074 /* If this is a new list, record it for later reuse. */
1075 if (! debug_no_list_hash)
1076 list_hash_add (hashcode, t);
1077
1078 current_obstack = ambient_obstack;
1079 return t;
1080 }
1081
1082 /* Constructor for hashed lists. */
1083
1084 tree
1085 hash_tree_chain (value, chain)
1086 tree value, chain;
1087 {
1088 return hash_tree_cons (0, 0, 0, NULL_TREE, value, chain);
1089 }
1090
1091 /* Similar, but used for concatenating two lists. */
1092
1093 tree
1094 hash_chainon (list1, list2)
1095 tree list1, list2;
1096 {
1097 if (list2 == 0)
1098 return list1;
1099 if (list1 == 0)
1100 return list2;
1101 if (TREE_CHAIN (list1) == NULL_TREE)
1102 return hash_tree_chain (TREE_VALUE (list1), list2);
1103 return hash_tree_chain (TREE_VALUE (list1),
1104 hash_chainon (TREE_CHAIN (list1), list2));
1105 }
1106
1107 static tree
1108 get_identifier_list (value)
1109 tree value;
1110 {
1111 tree list = IDENTIFIER_AS_LIST (value);
1112 if (list != NULL_TREE
1113 && (TREE_CODE (list) != TREE_LIST
1114 || TREE_VALUE (list) != value))
1115 list = NULL_TREE;
1116 else if (IDENTIFIER_HAS_TYPE_VALUE (value)
1117 && TREE_CODE (IDENTIFIER_TYPE_VALUE (value)) == RECORD_TYPE
1118 && IDENTIFIER_TYPE_VALUE (value)
1119 == TYPE_MAIN_VARIANT (IDENTIFIER_TYPE_VALUE (value)))
1120 {
1121 tree type = IDENTIFIER_TYPE_VALUE (value);
1122
1123 if (TYPE_PTRMEMFUNC_P (type))
1124 list = NULL_TREE;
1125 else if (type == current_class_type)
1126 /* Don't mess up the constructor name. */
1127 list = tree_cons (NULL_TREE, value, NULL_TREE);
1128 else
1129 {
1130 if (! CLASSTYPE_ID_AS_LIST (type))
1131 CLASSTYPE_ID_AS_LIST (type)
1132 = perm_tree_cons (NULL_TREE, TYPE_IDENTIFIER (type), NULL_TREE);
1133 list = CLASSTYPE_ID_AS_LIST (type);
1134 }
1135 }
1136 return list;
1137 }
1138
1139 tree
1140 get_decl_list (value)
1141 tree value;
1142 {
1143 tree list = NULL_TREE;
1144
1145 if (TREE_CODE (value) == IDENTIFIER_NODE)
1146 list = get_identifier_list (value);
1147 else if (TREE_CODE (value) == RECORD_TYPE
1148 && TYPE_LANG_SPECIFIC (value)
1149 && value == TYPE_MAIN_VARIANT (value))
1150 list = CLASSTYPE_AS_LIST (value);
1151
1152 if (list != NULL_TREE)
1153 {
1154 my_friendly_assert (TREE_CHAIN (list) == NULL_TREE, 301);
1155 return list;
1156 }
1157
1158 return build_decl_list (NULL_TREE, value);
1159 }
1160 \f
1161 /* Build an association between TYPE and some parameters:
1162
1163 OFFSET is the offset added to `this' to convert it to a pointer
1164 of type `TYPE *'
1165
1166 BINFO is the base binfo to use, if we are deriving from one. This
1167 is necessary, as we want specialized parent binfos from base
1168 classes, so that the VTABLE_NAMEs of bases are for the most derived
1169 type, instead of the simple type.
1170
1171 VTABLE is the virtual function table with which to initialize
1172 sub-objects of type TYPE.
1173
1174 VIRTUALS are the virtual functions sitting in VTABLE.
1175
1176 CHAIN are more associations we must retain. */
1177
1178 tree
1179 make_binfo (offset, binfo, vtable, virtuals, chain)
1180 tree offset, binfo;
1181 tree vtable, virtuals;
1182 tree chain;
1183 {
1184 tree new_binfo = make_tree_vec (6);
1185 tree type;
1186
1187 if (TREE_CODE (binfo) == TREE_VEC)
1188 type = BINFO_TYPE (binfo);
1189 else
1190 {
1191 type = binfo;
1192 binfo = TYPE_BINFO (binfo);
1193 }
1194
1195 TREE_CHAIN (new_binfo) = chain;
1196 if (chain)
1197 TREE_USED (new_binfo) = TREE_USED (chain);
1198
1199 TREE_TYPE (new_binfo) = TYPE_MAIN_VARIANT (type);
1200 BINFO_OFFSET (new_binfo) = offset;
1201 BINFO_VTABLE (new_binfo) = vtable;
1202 BINFO_VIRTUALS (new_binfo) = virtuals;
1203 BINFO_VPTR_FIELD (new_binfo) = NULL_TREE;
1204
1205 if (binfo && BINFO_BASETYPES (binfo) != NULL_TREE)
1206 BINFO_BASETYPES (new_binfo) = copy_node (BINFO_BASETYPES (binfo));
1207 return new_binfo;
1208 }
1209
1210 /* Return the binfo value for ELEM in TYPE. */
1211
1212 tree
1213 binfo_value (elem, type)
1214 tree elem;
1215 tree type;
1216 {
1217 if (get_base_distance (elem, type, 0, (tree *)0) == -2)
1218 compiler_error ("base class `%s' ambiguous in binfo_value",
1219 TYPE_NAME_STRING (elem));
1220 if (elem == type)
1221 return TYPE_BINFO (type);
1222 if (TREE_CODE (elem) == RECORD_TYPE && TYPE_BINFO (elem) == type)
1223 return type;
1224 return get_binfo (elem, type, 0);
1225 }
1226
1227 tree
1228 reverse_path (path)
1229 tree path;
1230 {
1231 register tree prev = 0, tmp, next;
1232 for (tmp = path; tmp; tmp = next)
1233 {
1234 next = BINFO_INHERITANCE_CHAIN (tmp);
1235 BINFO_INHERITANCE_CHAIN (tmp) = prev;
1236 prev = tmp;
1237 }
1238 return prev;
1239 }
1240
1241 void
1242 debug_binfo (elem)
1243 tree elem;
1244 {
1245 unsigned HOST_WIDE_INT n;
1246 tree virtuals;
1247
1248 fprintf (stderr, "type \"%s\"; offset = %d\n",
1249 TYPE_NAME_STRING (BINFO_TYPE (elem)),
1250 TREE_INT_CST_LOW (BINFO_OFFSET (elem)));
1251 fprintf (stderr, "vtable type:\n");
1252 debug_tree (BINFO_TYPE (elem));
1253 if (BINFO_VTABLE (elem))
1254 fprintf (stderr, "vtable decl \"%s\"\n", IDENTIFIER_POINTER (DECL_NAME (BINFO_VTABLE (elem))));
1255 else
1256 fprintf (stderr, "no vtable decl yet\n");
1257 fprintf (stderr, "virtuals:\n");
1258 virtuals = BINFO_VIRTUALS (elem);
1259
1260 n = skip_rtti_stuff (&virtuals);
1261
1262 while (virtuals)
1263 {
1264 tree fndecl = TREE_OPERAND (FNADDR_FROM_VTABLE_ENTRY (TREE_VALUE (virtuals)), 0);
1265 fprintf (stderr, "%s [%d =? %d]\n",
1266 IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (fndecl)),
1267 n, TREE_INT_CST_LOW (DECL_VINDEX (fndecl)));
1268 ++n;
1269 virtuals = TREE_CHAIN (virtuals);
1270 }
1271 }
1272
1273 /* Initialize an CPLUS_BINDING node that does not live on an obstack. */
1274
1275 tree
1276 binding_init (node)
1277 struct tree_binding* node;
1278 {
1279 static struct tree_binding* source;
1280 if (!source)
1281 {
1282 extern struct obstack permanent_obstack;
1283 push_obstacks (&permanent_obstack, &permanent_obstack);
1284 source = (struct tree_binding*)make_node (CPLUS_BINDING);
1285 pop_obstacks ();
1286 }
1287 *node = *source;
1288 TREE_PERMANENT ((tree)node) = 0;
1289 return (tree)node;
1290 }
1291
1292 int
1293 count_functions (t)
1294 tree t;
1295 {
1296 int i;
1297 if (TREE_CODE (t) == FUNCTION_DECL)
1298 return 1;
1299 else if (TREE_CODE (t) == OVERLOAD)
1300 {
1301 for (i=0; t; t = OVL_CHAIN (t))
1302 i++;
1303 return i;
1304 }
1305
1306 my_friendly_abort (359);
1307 return 0;
1308 }
1309
1310 int
1311 is_overloaded_fn (x)
1312 tree x;
1313 {
1314 /* XXX A baselink is also considered an overloaded function.
1315 As is a placeholder from push_class_decls. */
1316 if (TREE_CODE (x) == TREE_LIST)
1317 {
1318 my_friendly_assert (TREE_CODE (TREE_PURPOSE (x)) == TREE_VEC
1319 || TREE_CODE (TREE_PURPOSE (x)) == IDENTIFIER_NODE,
1320 388);
1321 x = TREE_VALUE (x);
1322 }
1323 return (TREE_CODE (x) == FUNCTION_DECL
1324 || TREE_CODE (x) == TEMPLATE_ID_EXPR
1325 || DECL_FUNCTION_TEMPLATE_P (x)
1326 || TREE_CODE (x) == OVERLOAD);
1327 }
1328
1329 int
1330 really_overloaded_fn (x)
1331 tree x;
1332 {
1333 /* A baselink is also considered an overloaded function.
1334 This might also be an ambiguous class member. */
1335 while (TREE_CODE (x) == TREE_LIST)
1336 x = TREE_VALUE (x);
1337 return (TREE_CODE (x) == OVERLOAD
1338 && (TREE_CHAIN (x) != NULL_TREE
1339 || DECL_FUNCTION_TEMPLATE_P (OVL_FUNCTION (x))));
1340 }
1341
1342 tree
1343 get_first_fn (from)
1344 tree from;
1345 {
1346 my_friendly_assert (is_overloaded_fn (from), 9);
1347 /* A baselink is also considered an overloaded function. */
1348 if (TREE_CODE (from) == TREE_LIST)
1349 from = TREE_VALUE (from);
1350 return OVL_CURRENT (from);
1351 }
1352
1353 /* Return a new OVL node, concatenating it with the old one. */
1354
1355 tree
1356 ovl_cons (decl, chain)
1357 tree decl;
1358 tree chain;
1359 {
1360 tree result = make_node (OVERLOAD);
1361 TREE_TYPE (result) = unknown_type_node;
1362 OVL_FUNCTION (result) = decl;
1363 TREE_CHAIN (result) = chain;
1364
1365 return result;
1366 }
1367
1368 /* Same as ovl_cons, but on the scratch_obstack. */
1369
1370 tree
1371 scratch_ovl_cons (value, chain)
1372 tree value, chain;
1373 {
1374 register tree node;
1375 register struct obstack *ambient_obstack = current_obstack;
1376 extern struct obstack *expression_obstack;
1377 current_obstack = expression_obstack;
1378 node = ovl_cons (value, chain);
1379 current_obstack = ambient_obstack;
1380 return node;
1381 }
1382
1383 /* Build a new overloaded function. If this is the first one,
1384 just return it; otherwise, ovl_cons the _DECLs */
1385
1386 tree
1387 build_overload (decl, chain)
1388 tree decl;
1389 tree chain;
1390 {
1391 if (!chain)
1392 return decl;
1393 if (TREE_CODE (chain) != OVERLOAD)
1394 chain = ovl_cons (chain, NULL_TREE);
1395 return ovl_cons (decl, chain);
1396 }
1397
1398 /* True if fn is in ovl. */
1399
1400 int
1401 ovl_member (fn, ovl)
1402 tree fn;
1403 tree ovl;
1404 {
1405 if (fn == ovl)
1406 return 1;
1407 if (!ovl || TREE_CODE (ovl) != OVERLOAD)
1408 return 0;
1409 for (; ovl; ovl = OVL_CHAIN (ovl))
1410 if (OVL_FUNCTION (ovl) == fn)
1411 return 1;
1412 return 0;
1413 }
1414
1415 int
1416 is_aggr_type_2 (t1, t2)
1417 tree t1, t2;
1418 {
1419 if (TREE_CODE (t1) != TREE_CODE (t2))
1420 return 0;
1421 return IS_AGGR_TYPE (t1) && IS_AGGR_TYPE (t2);
1422 }
1423 \f
1424 #define PRINT_RING_SIZE 4
1425
1426 char *
1427 lang_printable_name (decl, v)
1428 tree decl;
1429 int v;
1430 {
1431 static tree decl_ring[PRINT_RING_SIZE];
1432 static char *print_ring[PRINT_RING_SIZE];
1433 static int ring_counter;
1434 int i;
1435
1436 /* Only cache functions. */
1437 if (v < 2
1438 || TREE_CODE (decl) != FUNCTION_DECL
1439 || DECL_LANG_SPECIFIC (decl) == 0)
1440 return lang_decl_name (decl, v);
1441
1442 /* See if this print name is lying around. */
1443 for (i = 0; i < PRINT_RING_SIZE; i++)
1444 if (decl_ring[i] == decl)
1445 /* yes, so return it. */
1446 return print_ring[i];
1447
1448 if (++ring_counter == PRINT_RING_SIZE)
1449 ring_counter = 0;
1450
1451 if (current_function_decl != NULL_TREE)
1452 {
1453 if (decl_ring[ring_counter] == current_function_decl)
1454 ring_counter += 1;
1455 if (ring_counter == PRINT_RING_SIZE)
1456 ring_counter = 0;
1457 if (decl_ring[ring_counter] == current_function_decl)
1458 my_friendly_abort (106);
1459 }
1460
1461 if (print_ring[ring_counter])
1462 free (print_ring[ring_counter]);
1463
1464 print_ring[ring_counter] = xstrdup (lang_decl_name (decl, v));
1465 decl_ring[ring_counter] = decl;
1466 return print_ring[ring_counter];
1467 }
1468 \f
1469 /* Build the FUNCTION_TYPE or METHOD_TYPE which may throw exceptions
1470 listed in RAISES. */
1471
1472 tree
1473 build_exception_variant (type, raises)
1474 tree type;
1475 tree raises;
1476 {
1477 tree v = TYPE_MAIN_VARIANT (type);
1478 int constp = TYPE_READONLY (type);
1479 int volatilep = TYPE_VOLATILE (type);
1480
1481 for (; v; v = TYPE_NEXT_VARIANT (v))
1482 {
1483 if (TYPE_READONLY (v) != constp
1484 || TYPE_VOLATILE (v) != volatilep)
1485 continue;
1486
1487 /* @@ This should do set equality, not exact match. */
1488 if (simple_cst_list_equal (TYPE_RAISES_EXCEPTIONS (v), raises))
1489 /* List of exceptions raised matches previously found list.
1490
1491 @@ Nice to free up storage used in consing up the
1492 @@ list of exceptions raised. */
1493 return v;
1494 }
1495
1496 /* Need to build a new variant. */
1497 v = build_type_copy (type);
1498
1499 if (raises && ! TREE_PERMANENT (raises))
1500 {
1501 push_obstacks_nochange ();
1502 end_temporary_allocation ();
1503 raises = copy_list (raises);
1504 pop_obstacks ();
1505 }
1506
1507 TYPE_RAISES_EXCEPTIONS (v) = raises;
1508 return v;
1509 }
1510
1511 /* Given a TEMPLATE_TEMPLATE_PARM node T, create a new one together with its
1512 lang_specific field and its corresponding TEMPLATE_DECL node */
1513
1514 tree
1515 copy_template_template_parm (t)
1516 tree t;
1517 {
1518 tree template = TYPE_NAME (t);
1519 tree t2 = make_lang_type (TEMPLATE_TEMPLATE_PARM);
1520 template = copy_node (template);
1521 copy_lang_decl (template);
1522 TREE_TYPE (template) = t2;
1523 TYPE_NAME (t2) = template;
1524 TYPE_STUB_DECL (t2) = template;
1525
1526 /* No need to copy these */
1527 TYPE_FIELDS (t2) = TYPE_FIELDS (t);
1528 CLASSTYPE_TEMPLATE_INFO (t2) = CLASSTYPE_TEMPLATE_INFO (t);
1529 return t2;
1530 }
1531
1532 /* Subroutine of copy_to_permanent
1533
1534 Assuming T is a node build bottom-up, make it all exist on
1535 permanent obstack, if it is not permanent already. */
1536
1537 tree
1538 mapcar (t, func)
1539 tree t;
1540 tree (*func) PROTO((tree));
1541 {
1542 tree tmp;
1543
1544 if (t == NULL_TREE)
1545 return t;
1546
1547 if (tmp = func (t), tmp != NULL_TREE)
1548 return tmp;
1549
1550 switch (TREE_CODE (t))
1551 {
1552 case ERROR_MARK:
1553 return error_mark_node;
1554
1555 case VAR_DECL:
1556 case FUNCTION_DECL:
1557 case CONST_DECL:
1558 /* Rather than aborting, return error_mark_node. This allows us
1559 to report a sensible error message on code like this:
1560
1561 void g() { int i; f<i>(7); }
1562
1563 In a case like:
1564
1565 void g() { const int i = 7; f<i>(7); }
1566
1567 however, we must actually return the constant initializer. */
1568 tmp = decl_constant_value (t);
1569 if (tmp != t)
1570 return mapcar (tmp, func);
1571 else
1572 return error_mark_node;
1573
1574 case PARM_DECL:
1575 {
1576 tree chain = TREE_CHAIN (t);
1577 t = copy_node (t);
1578 TREE_CHAIN (t) = mapcar (chain, func);
1579 TREE_TYPE (t) = mapcar (TREE_TYPE (t), func);
1580 DECL_INITIAL (t) = mapcar (DECL_INITIAL (t), func);
1581 DECL_SIZE (t) = mapcar (DECL_SIZE (t), func);
1582 return t;
1583 }
1584
1585 case TREE_LIST:
1586 {
1587 tree chain = TREE_CHAIN (t);
1588 t = copy_node (t);
1589 TREE_PURPOSE (t) = mapcar (TREE_PURPOSE (t), func);
1590 TREE_VALUE (t) = mapcar (TREE_VALUE (t), func);
1591 TREE_CHAIN (t) = mapcar (chain, func);
1592 return t;
1593 }
1594
1595 case OVERLOAD:
1596 {
1597 tree chain = OVL_CHAIN (t);
1598 t = copy_node (t);
1599 OVL_FUNCTION (t) = mapcar (OVL_FUNCTION (t), func);
1600 OVL_CHAIN (t) = mapcar (chain, func);
1601 return t;
1602 }
1603
1604 case TREE_VEC:
1605 {
1606 int len = TREE_VEC_LENGTH (t);
1607
1608 t = copy_node (t);
1609 while (len--)
1610 TREE_VEC_ELT (t, len) = mapcar (TREE_VEC_ELT (t, len), func);
1611 return t;
1612 }
1613
1614 case INTEGER_CST:
1615 case REAL_CST:
1616 case STRING_CST:
1617 return copy_node (t);
1618
1619 case COND_EXPR:
1620 case TARGET_EXPR:
1621 case AGGR_INIT_EXPR:
1622 t = copy_node (t);
1623 TREE_OPERAND (t, 0) = mapcar (TREE_OPERAND (t, 0), func);
1624 TREE_OPERAND (t, 1) = mapcar (TREE_OPERAND (t, 1), func);
1625 TREE_OPERAND (t, 2) = mapcar (TREE_OPERAND (t, 2), func);
1626 return t;
1627
1628 case SAVE_EXPR:
1629 t = copy_node (t);
1630 TREE_OPERAND (t, 0) = mapcar (TREE_OPERAND (t, 0), func);
1631 return t;
1632
1633 case MODIFY_EXPR:
1634 case PLUS_EXPR:
1635 case MINUS_EXPR:
1636 case MULT_EXPR:
1637 case TRUNC_DIV_EXPR:
1638 case TRUNC_MOD_EXPR:
1639 case MIN_EXPR:
1640 case MAX_EXPR:
1641 case LSHIFT_EXPR:
1642 case RSHIFT_EXPR:
1643 case BIT_IOR_EXPR:
1644 case BIT_XOR_EXPR:
1645 case BIT_AND_EXPR:
1646 case BIT_ANDTC_EXPR:
1647 case TRUTH_ANDIF_EXPR:
1648 case TRUTH_ORIF_EXPR:
1649 case LT_EXPR:
1650 case LE_EXPR:
1651 case GT_EXPR:
1652 case GE_EXPR:
1653 case EQ_EXPR:
1654 case NE_EXPR:
1655 case CEIL_DIV_EXPR:
1656 case FLOOR_DIV_EXPR:
1657 case ROUND_DIV_EXPR:
1658 case CEIL_MOD_EXPR:
1659 case FLOOR_MOD_EXPR:
1660 case ROUND_MOD_EXPR:
1661 case COMPOUND_EXPR:
1662 case PREDECREMENT_EXPR:
1663 case PREINCREMENT_EXPR:
1664 case POSTDECREMENT_EXPR:
1665 case POSTINCREMENT_EXPR:
1666 case ARRAY_REF:
1667 case SCOPE_REF:
1668 case TRY_CATCH_EXPR:
1669 case WITH_CLEANUP_EXPR:
1670 t = copy_node (t);
1671 TREE_OPERAND (t, 0) = mapcar (TREE_OPERAND (t, 0), func);
1672 TREE_OPERAND (t, 1) = mapcar (TREE_OPERAND (t, 1), func);
1673 return t;
1674
1675 case CALL_EXPR:
1676 t = copy_node (t);
1677 TREE_TYPE (t) = mapcar (TREE_TYPE (t), func);
1678 TREE_OPERAND (t, 0) = mapcar (TREE_OPERAND (t, 0), func);
1679 TREE_OPERAND (t, 1) = mapcar (TREE_OPERAND (t, 1), func);
1680
1681 /* tree.def says that operand two is RTL, but
1682 build_call_declarator puts trees in there. */
1683 if (TREE_OPERAND (t, 2)
1684 && TREE_CODE (TREE_OPERAND (t, 2)) == TREE_LIST)
1685 TREE_OPERAND (t, 2) = mapcar (TREE_OPERAND (t, 2), func);
1686 else
1687 TREE_OPERAND (t, 2) = NULL_TREE;
1688 return t;
1689
1690 case CONVERT_EXPR:
1691 case ADDR_EXPR:
1692 case INDIRECT_REF:
1693 case NEGATE_EXPR:
1694 case BIT_NOT_EXPR:
1695 case TRUTH_NOT_EXPR:
1696 case NOP_EXPR:
1697 case COMPONENT_REF:
1698 case CLEANUP_POINT_EXPR:
1699 t = copy_node (t);
1700 TREE_OPERAND (t, 0) = mapcar (TREE_OPERAND (t, 0), func);
1701 return t;
1702
1703 case POINTER_TYPE:
1704 tmp = build_pointer_type (mapcar (TREE_TYPE (t), func));
1705 return cp_build_type_variant (tmp, TYPE_READONLY (t), TYPE_VOLATILE (t));
1706 case REFERENCE_TYPE:
1707 tmp = build_reference_type (mapcar (TREE_TYPE (t), func));
1708 return cp_build_type_variant (tmp, TYPE_READONLY (t), TYPE_VOLATILE (t));
1709 case FUNCTION_TYPE:
1710 tmp = build_function_type (mapcar (TREE_TYPE (t), func),
1711 mapcar (TYPE_ARG_TYPES (t), func));
1712 return cp_build_type_variant (tmp, TYPE_READONLY (t), TYPE_VOLATILE (t));
1713 case ARRAY_TYPE:
1714 tmp = build_cplus_array_type (mapcar (TREE_TYPE (t), func),
1715 mapcar (TYPE_DOMAIN (t), func));
1716 return cp_build_type_variant (tmp, TYPE_READONLY (t), TYPE_VOLATILE (t));
1717 case INTEGER_TYPE:
1718 tmp = build_index_type (mapcar (TYPE_MAX_VALUE (t), func));
1719 return cp_build_type_variant (tmp, TYPE_READONLY (t), TYPE_VOLATILE (t));
1720 case OFFSET_TYPE:
1721 tmp = build_offset_type (mapcar (TYPE_OFFSET_BASETYPE (t), func),
1722 mapcar (TREE_TYPE (t), func));
1723 return cp_build_type_variant (tmp, TYPE_READONLY (t), TYPE_VOLATILE (t));
1724 case METHOD_TYPE:
1725 tmp = build_cplus_method_type
1726 (mapcar (TREE_TYPE (TREE_VALUE (TYPE_ARG_TYPES (t))), func),
1727 mapcar (TREE_TYPE (t), func),
1728 mapcar (TREE_CHAIN (TYPE_ARG_TYPES (t)), func));
1729 return cp_build_type_variant (tmp, TYPE_READONLY (t), TYPE_VOLATILE (t));
1730
1731 case COMPLEX_CST:
1732 t = copy_node (t);
1733 TREE_REALPART (t) = mapcar (TREE_REALPART (t), func);
1734 TREE_IMAGPART (t) = mapcar (TREE_REALPART (t), func);
1735 return t;
1736
1737 case CONSTRUCTOR:
1738 t = copy_node (t);
1739 CONSTRUCTOR_ELTS (t) = mapcar (CONSTRUCTOR_ELTS (t), func);
1740 return t;
1741
1742 case TEMPLATE_TEMPLATE_PARM:
1743 return copy_template_template_parm (t);
1744
1745 case BIND_EXPR:
1746 t = copy_node (t);
1747 TREE_OPERAND (t, 0) = mapcar (TREE_OPERAND (t, 0), func);
1748 TREE_OPERAND (t, 1) = mapcar (TREE_OPERAND (t, 1), func);
1749 TREE_OPERAND (t, 2) = NULL_TREE;
1750 return t;
1751
1752 case RECORD_TYPE:
1753 if (TYPE_PTRMEMFUNC_P (t))
1754 return build_ptrmemfunc_type
1755 (mapcar (TYPE_PTRMEMFUNC_FN_TYPE (t), func));
1756 /* else fall through */
1757
1758 /* This list is incomplete, but should suffice for now.
1759 It is very important that `sorry' not call
1760 `report_error_function'. That could cause an infinite loop. */
1761 default:
1762 sorry ("initializer contains unrecognized tree code");
1763 return error_mark_node;
1764
1765 }
1766 my_friendly_abort (107);
1767 /* NOTREACHED */
1768 return NULL_TREE;
1769 }
1770
1771 static tree
1772 perm_manip (t)
1773 tree t;
1774 {
1775 if (TREE_PERMANENT (t))
1776 return t;
1777
1778 /* Support `void f () { extern int i; A<&i> a; }' */
1779 if ((TREE_CODE (t) == VAR_DECL || TREE_CODE (t) == FUNCTION_DECL)
1780 && TREE_PUBLIC (t))
1781 {
1782 t = copy_node (t);
1783
1784 /* copy_rtx won't make a new SYMBOL_REF, so call make_decl_rtl again. */
1785 DECL_RTL (t) = 0;
1786 make_decl_rtl (t, NULL_PTR, 1);
1787
1788 return t;
1789 }
1790 return NULL_TREE;
1791 }
1792
1793 /* Assuming T is a node built bottom-up, make it all exist on
1794 permanent obstack, if it is not permanent already. */
1795
1796 tree
1797 copy_to_permanent (t)
1798 tree t;
1799 {
1800 if (t == NULL_TREE || TREE_PERMANENT (t))
1801 return t;
1802
1803 push_obstacks_nochange ();
1804 end_temporary_allocation ();
1805
1806 t = mapcar (t, perm_manip);
1807
1808 pop_obstacks ();
1809
1810 return t;
1811 }
1812
1813 #ifdef GATHER_STATISTICS
1814 extern int depth_reached;
1815 #endif
1816
1817 void
1818 print_lang_statistics ()
1819 {
1820 extern struct obstack decl_obstack;
1821 print_obstack_statistics ("class_obstack", &class_obstack);
1822 print_obstack_statistics ("decl_obstack", &decl_obstack);
1823 print_search_statistics ();
1824 print_class_statistics ();
1825 #ifdef GATHER_STATISTICS
1826 fprintf (stderr, "maximum template instantiation depth reached: %d\n",
1827 depth_reached);
1828 #endif
1829 }
1830
1831 /* This is used by the `assert' macro. It is provided in libgcc.a,
1832 which `cc' doesn't know how to link. Note that the C++ front-end
1833 no longer actually uses the `assert' macro (instead, it calls
1834 my_friendly_assert). But all of the back-end files still need this. */
1835
1836 void
1837 __eprintf (string, expression, line, filename)
1838 #ifdef __STDC__
1839 const char *string;
1840 const char *expression;
1841 unsigned line;
1842 const char *filename;
1843 #else
1844 char *string;
1845 char *expression;
1846 unsigned line;
1847 char *filename;
1848 #endif
1849 {
1850 fprintf (stderr, string, expression, line, filename);
1851 fflush (stderr);
1852 abort ();
1853 }
1854
1855 /* Return, as an INTEGER_CST node, the number of elements for TYPE
1856 (which is an ARRAY_TYPE). This counts only elements of the top
1857 array. */
1858
1859 tree
1860 array_type_nelts_top (type)
1861 tree type;
1862 {
1863 return fold (build (PLUS_EXPR, sizetype,
1864 array_type_nelts (type),
1865 integer_one_node));
1866 }
1867
1868 /* Return, as an INTEGER_CST node, the number of elements for TYPE
1869 (which is an ARRAY_TYPE). This one is a recursive count of all
1870 ARRAY_TYPEs that are clumped together. */
1871
1872 tree
1873 array_type_nelts_total (type)
1874 tree type;
1875 {
1876 tree sz = array_type_nelts_top (type);
1877 type = TREE_TYPE (type);
1878 while (TREE_CODE (type) == ARRAY_TYPE)
1879 {
1880 tree n = array_type_nelts_top (type);
1881 sz = fold (build (MULT_EXPR, sizetype, sz, n));
1882 type = TREE_TYPE (type);
1883 }
1884 return sz;
1885 }
1886
1887 static
1888 tree
1889 bot_manip (t)
1890 tree t;
1891 {
1892 if (TREE_CODE (t) != TREE_LIST && ! TREE_SIDE_EFFECTS (t))
1893 return t;
1894 else if (TREE_CODE (t) == TARGET_EXPR)
1895 {
1896 if (TREE_CODE (TREE_OPERAND (t, 1)) == AGGR_INIT_EXPR)
1897 {
1898 mark_used (TREE_OPERAND (TREE_OPERAND (TREE_OPERAND (t, 1), 0), 0));
1899 return build_cplus_new
1900 (TREE_TYPE (t), break_out_target_exprs (TREE_OPERAND (t, 1)));
1901 }
1902 t = copy_node (t);
1903 TREE_OPERAND (t, 0) = build (VAR_DECL, TREE_TYPE (t));
1904 layout_decl (TREE_OPERAND (t, 0), 0);
1905 return t;
1906 }
1907 else if (TREE_CODE (t) == CALL_EXPR)
1908 mark_used (TREE_OPERAND (TREE_OPERAND (t, 0), 0));
1909
1910 return NULL_TREE;
1911 }
1912
1913 /* Actually, we'll just clean out the target exprs for the moment. */
1914
1915 tree
1916 break_out_target_exprs (t)
1917 tree t;
1918 {
1919 return mapcar (t, bot_manip);
1920 }
1921
1922 /* Obstack used for allocating nodes in template function and variable
1923 definitions. */
1924
1925 /* Similar to `build_nt', except we build
1926 on the permanent_obstack, regardless. */
1927
1928 tree
1929 build_min_nt VPROTO((enum tree_code code, ...))
1930 {
1931 #ifndef __STDC__
1932 enum tree_code code;
1933 #endif
1934 register struct obstack *ambient_obstack = expression_obstack;
1935 va_list p;
1936 register tree t;
1937 register int length;
1938 register int i;
1939
1940 VA_START (p, code);
1941
1942 #ifndef __STDC__
1943 code = va_arg (p, enum tree_code);
1944 #endif
1945
1946 expression_obstack = &permanent_obstack;
1947
1948 t = make_node (code);
1949 length = tree_code_length[(int) code];
1950 TREE_COMPLEXITY (t) = lineno;
1951
1952 for (i = 0; i < length; i++)
1953 {
1954 tree x = va_arg (p, tree);
1955 TREE_OPERAND (t, i) = copy_to_permanent (x);
1956 }
1957
1958 va_end (p);
1959 expression_obstack = ambient_obstack;
1960 return t;
1961 }
1962
1963 /* Similar to `build', except we build
1964 on the permanent_obstack, regardless. */
1965
1966 tree
1967 build_min VPROTO((enum tree_code code, tree tt, ...))
1968 {
1969 #ifndef __STDC__
1970 enum tree_code code;
1971 tree tt;
1972 #endif
1973 register struct obstack *ambient_obstack = expression_obstack;
1974 va_list p;
1975 register tree t;
1976 register int length;
1977 register int i;
1978
1979 VA_START (p, tt);
1980
1981 #ifndef __STDC__
1982 code = va_arg (p, enum tree_code);
1983 tt = va_arg (p, tree);
1984 #endif
1985
1986 expression_obstack = &permanent_obstack;
1987
1988 t = make_node (code);
1989 length = tree_code_length[(int) code];
1990 TREE_TYPE (t) = tt;
1991 TREE_COMPLEXITY (t) = lineno;
1992
1993 for (i = 0; i < length; i++)
1994 {
1995 tree x = va_arg (p, tree);
1996 TREE_OPERAND (t, i) = copy_to_permanent (x);
1997 }
1998
1999 va_end (p);
2000 expression_obstack = ambient_obstack;
2001 return t;
2002 }
2003
2004 /* Same as `tree_cons' but make a permanent object. */
2005
2006 tree
2007 min_tree_cons (purpose, value, chain)
2008 tree purpose, value, chain;
2009 {
2010 register tree node;
2011 register struct obstack *ambient_obstack = current_obstack;
2012 current_obstack = &permanent_obstack;
2013
2014 node = tree_cons (copy_to_permanent (purpose),
2015 copy_to_permanent (value), chain);
2016 current_obstack = ambient_obstack;
2017 return node;
2018 }
2019
2020 tree
2021 get_type_decl (t)
2022 tree t;
2023 {
2024 if (TREE_CODE (t) == TYPE_DECL)
2025 return t;
2026 if (TREE_CODE_CLASS (TREE_CODE (t)) == 't')
2027 return TYPE_STUB_DECL (t);
2028
2029 my_friendly_abort (42);
2030
2031 /* Stop compiler from complaining control reaches end of non-void function. */
2032 return 0;
2033 }
2034
2035 int
2036 can_free (obstack, t)
2037 struct obstack *obstack;
2038 tree t;
2039 {
2040 int size = 0;
2041
2042 if (TREE_CODE (t) == TREE_VEC)
2043 size = (TREE_VEC_LENGTH (t)-1) * sizeof (tree) + sizeof (struct tree_vec);
2044 else
2045 my_friendly_abort (42);
2046
2047 #define ROUND(x) ((x + obstack_alignment_mask (obstack)) \
2048 & ~ obstack_alignment_mask (obstack))
2049 if ((char *)t + ROUND (size) == obstack_next_free (obstack))
2050 return 1;
2051 #undef ROUND
2052
2053 return 0;
2054 }
2055
2056 /* Return first vector element whose BINFO_TYPE is ELEM.
2057 Return 0 if ELEM is not in VEC. VEC may be NULL_TREE. */
2058
2059 tree
2060 vec_binfo_member (elem, vec)
2061 tree elem, vec;
2062 {
2063 int i;
2064
2065 if (vec)
2066 for (i = 0; i < TREE_VEC_LENGTH (vec); ++i)
2067 if (comptypes (elem, BINFO_TYPE (TREE_VEC_ELT (vec, i)), 1))
2068 return TREE_VEC_ELT (vec, i);
2069
2070 return NULL_TREE;
2071 }
2072
2073 /* Kludge around the fact that DECL_CONTEXT for virtual functions returns
2074 the wrong thing for decl_function_context. Hopefully the uses in the
2075 backend won't matter, since we don't need a static chain for local class
2076 methods. FIXME! */
2077
2078 tree
2079 hack_decl_function_context (decl)
2080 tree decl;
2081 {
2082 if (TREE_CODE (decl) == FUNCTION_DECL && DECL_FUNCTION_MEMBER_P (decl))
2083 return decl_function_context (TYPE_MAIN_DECL (DECL_CLASS_CONTEXT (decl)));
2084 return decl_function_context (decl);
2085 }
2086
2087 /* Return truthvalue of whether T1 is the same tree structure as T2.
2088 Return 1 if they are the same.
2089 Return 0 if they are understandably different.
2090 Return -1 if either contains tree structure not understood by
2091 this function. */
2092
2093 int
2094 cp_tree_equal (t1, t2)
2095 tree t1, t2;
2096 {
2097 register enum tree_code code1, code2;
2098 int cmp;
2099
2100 if (t1 == t2)
2101 return 1;
2102 if (t1 == 0 || t2 == 0)
2103 return 0;
2104
2105 code1 = TREE_CODE (t1);
2106 code2 = TREE_CODE (t2);
2107
2108 if (code1 == NOP_EXPR || code1 == CONVERT_EXPR || code1 == NON_LVALUE_EXPR)
2109 {
2110 if (code2 == NOP_EXPR || code2 == CONVERT_EXPR || code2 == NON_LVALUE_EXPR)
2111 return cp_tree_equal (TREE_OPERAND (t1, 0), TREE_OPERAND (t2, 0));
2112 else
2113 return cp_tree_equal (TREE_OPERAND (t1, 0), t2);
2114 }
2115 else if (code2 == NOP_EXPR || code2 == CONVERT_EXPR
2116 || code2 == NON_LVALUE_EXPR)
2117 return cp_tree_equal (t1, TREE_OPERAND (t2, 0));
2118
2119 if (code1 != code2)
2120 return 0;
2121
2122 switch (code1)
2123 {
2124 case INTEGER_CST:
2125 return TREE_INT_CST_LOW (t1) == TREE_INT_CST_LOW (t2)
2126 && TREE_INT_CST_HIGH (t1) == TREE_INT_CST_HIGH (t2);
2127
2128 case REAL_CST:
2129 return REAL_VALUES_EQUAL (TREE_REAL_CST (t1), TREE_REAL_CST (t2));
2130
2131 case STRING_CST:
2132 return TREE_STRING_LENGTH (t1) == TREE_STRING_LENGTH (t2)
2133 && !bcmp (TREE_STRING_POINTER (t1), TREE_STRING_POINTER (t2),
2134 TREE_STRING_LENGTH (t1));
2135
2136 case CONSTRUCTOR:
2137 abort ();
2138
2139 case SAVE_EXPR:
2140 return cp_tree_equal (TREE_OPERAND (t1, 0), TREE_OPERAND (t2, 0));
2141
2142 case CALL_EXPR:
2143 cmp = cp_tree_equal (TREE_OPERAND (t1, 0), TREE_OPERAND (t2, 0));
2144 if (cmp <= 0)
2145 return cmp;
2146 return simple_cst_list_equal (TREE_OPERAND (t1, 1), TREE_OPERAND (t2, 1));
2147
2148 case TARGET_EXPR:
2149 /* Special case: if either target is an unallocated VAR_DECL,
2150 it means that it's going to be unified with whatever the
2151 TARGET_EXPR is really supposed to initialize, so treat it
2152 as being equivalent to anything. */
2153 if ((TREE_CODE (TREE_OPERAND (t1, 0)) == VAR_DECL
2154 && DECL_NAME (TREE_OPERAND (t1, 0)) == NULL_TREE
2155 && DECL_RTL (TREE_OPERAND (t1, 0)) == 0)
2156 || (TREE_CODE (TREE_OPERAND (t2, 0)) == VAR_DECL
2157 && DECL_NAME (TREE_OPERAND (t2, 0)) == NULL_TREE
2158 && DECL_RTL (TREE_OPERAND (t2, 0)) == 0))
2159 cmp = 1;
2160 else
2161 cmp = cp_tree_equal (TREE_OPERAND (t1, 0), TREE_OPERAND (t2, 0));
2162 if (cmp <= 0)
2163 return cmp;
2164 return cp_tree_equal (TREE_OPERAND (t1, 1), TREE_OPERAND (t2, 1));
2165
2166 case WITH_CLEANUP_EXPR:
2167 cmp = cp_tree_equal (TREE_OPERAND (t1, 0), TREE_OPERAND (t2, 0));
2168 if (cmp <= 0)
2169 return cmp;
2170 return cp_tree_equal (TREE_OPERAND (t1, 2), TREE_OPERAND (t1, 2));
2171
2172 case COMPONENT_REF:
2173 if (TREE_OPERAND (t1, 1) == TREE_OPERAND (t2, 1))
2174 return cp_tree_equal (TREE_OPERAND (t1, 0), TREE_OPERAND (t2, 0));
2175 return 0;
2176
2177 case VAR_DECL:
2178 case PARM_DECL:
2179 case CONST_DECL:
2180 case FUNCTION_DECL:
2181 return 0;
2182
2183 case TEMPLATE_PARM_INDEX:
2184 return TEMPLATE_PARM_IDX (t1) == TEMPLATE_PARM_IDX (t2)
2185 && TEMPLATE_PARM_LEVEL (t1) == TEMPLATE_PARM_LEVEL (t2);
2186
2187 case SIZEOF_EXPR:
2188 case ALIGNOF_EXPR:
2189 if (TREE_CODE (TREE_OPERAND (t1, 0)) != TREE_CODE (TREE_OPERAND (t2, 0)))
2190 return 0;
2191 if (TREE_CODE_CLASS (TREE_CODE (TREE_OPERAND (t1, 0))) == 't')
2192 return comptypes (TREE_OPERAND (t1, 0), TREE_OPERAND (t2, 0), 1);
2193 break;
2194
2195 default:
2196 break;
2197 }
2198
2199 switch (TREE_CODE_CLASS (code1))
2200 {
2201 int i;
2202 case '1':
2203 case '2':
2204 case '<':
2205 case 'e':
2206 case 'r':
2207 case 's':
2208 cmp = 1;
2209 for (i=0; i<tree_code_length[(int) code1]; ++i)
2210 {
2211 cmp = cp_tree_equal (TREE_OPERAND (t1, i), TREE_OPERAND (t2, i));
2212 if (cmp <= 0)
2213 return cmp;
2214 }
2215 return cmp;
2216 }
2217
2218 return -1;
2219 }
2220
2221 /* Similar to make_tree_vec, but build on a temporary obstack. */
2222
2223 tree
2224 make_temp_vec (len)
2225 int len;
2226 {
2227 register tree node;
2228 register struct obstack *ambient_obstack = current_obstack;
2229 current_obstack = expression_obstack;
2230 node = make_tree_vec (len);
2231 current_obstack = ambient_obstack;
2232 return node;
2233 }
2234
2235 /* Build a wrapper around some pointer PTR so we can use it as a tree. */
2236
2237 tree
2238 build_ptr_wrapper (ptr)
2239 void *ptr;
2240 {
2241 tree t = make_node (WRAPPER);
2242 WRAPPER_PTR (t) = ptr;
2243 return t;
2244 }
2245
2246 /* Same, but on the expression_obstack. */
2247
2248 tree
2249 build_expr_ptr_wrapper (ptr)
2250 void *ptr;
2251 {
2252 tree t;
2253 push_expression_obstack ();
2254 t = build_ptr_wrapper (ptr);
2255 pop_obstacks ();
2256 return t;
2257 }
2258
2259 /* Build a wrapper around some integer I so we can use it as a tree. */
2260
2261 tree
2262 build_int_wrapper (i)
2263 int i;
2264 {
2265 tree t = make_node (WRAPPER);
2266 WRAPPER_INT (t) = i;
2267 return t;
2268 }
2269
2270 tree
2271 build_srcloc (file, line)
2272 char *file;
2273 int line;
2274 {
2275 tree t = make_node (SRCLOC);
2276 SRCLOC_FILE (t) = file;
2277 SRCLOC_LINE (t) = line;
2278 return t;
2279 }
2280
2281 tree
2282 build_srcloc_here ()
2283 {
2284 return build_srcloc (input_filename, lineno);
2285 }
2286
2287 void
2288 push_expression_obstack ()
2289 {
2290 push_obstacks_nochange ();
2291 current_obstack = expression_obstack;
2292 }
2293
2294 /* The type of ARG when used as an lvalue. */
2295
2296 tree
2297 lvalue_type (arg)
2298 tree arg;
2299 {
2300 tree type = TREE_TYPE (arg);
2301 if (TREE_CODE (arg) == OVERLOAD)
2302 type = unknown_type_node;
2303 return cp_build_type_variant
2304 (type, TREE_READONLY (arg), TREE_THIS_VOLATILE (arg));
2305 }
2306
2307 /* The type of ARG for printing error messages; denote lvalues with
2308 reference types. */
2309
2310 tree
2311 error_type (arg)
2312 tree arg;
2313 {
2314 tree type = TREE_TYPE (arg);
2315 if (TREE_CODE (type) == ARRAY_TYPE)
2316 ;
2317 else if (real_lvalue_p (arg))
2318 type = build_reference_type (lvalue_type (arg));
2319 else if (IS_AGGR_TYPE (type))
2320 type = lvalue_type (arg);
2321
2322 return type;
2323 }
2324
2325 /* Does FUNCTION use a variable-length argument list? */
2326
2327 int
2328 varargs_function_p (function)
2329 tree function;
2330 {
2331 tree parm = TYPE_ARG_TYPES (TREE_TYPE (function));
2332 for (; parm; parm = TREE_CHAIN (parm))
2333 if (TREE_VALUE (parm) == void_type_node)
2334 return 0;
2335 return 1;
2336 }
2337
2338 /* Returns 1 if decl is a member of a class. */
2339
2340 int
2341 member_p (decl)
2342 tree decl;
2343 {
2344 tree ctx = DECL_CONTEXT (decl);
2345 return (ctx && TREE_CODE_CLASS (TREE_CODE (ctx)) == 't');
2346 }
This page took 0.13086 seconds and 5 git commands to generate.