]> gcc.gnu.org Git - gcc.git/blob - gcc/cp/tree.c
class.c (finish_struct_1): Use OVL_CURRENT on TREE_VEC_ELT.
[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 base_binfos = BINFO_BASETYPES (base_binfo);
574 tree delta = NULL_TREE;
575
576 for (j = i+1; j < n_baselinks; j++)
577 if (! TREE_VIA_VIRTUAL (TREE_VEC_ELT (binfos, j)))
578 {
579 /* The next basetype offset must take into account the space
580 between the classes, not just the size of each class. */
581 delta = size_binop (MINUS_EXPR,
582 BINFO_OFFSET (TREE_VEC_ELT (binfos, j)),
583 BINFO_OFFSET (base_binfo));
584 break;
585 }
586
587 #if 0
588 if (BINFO_OFFSET_ZEROP (base_binfo))
589 BINFO_OFFSET (base_binfo) = offset;
590 else
591 BINFO_OFFSET (base_binfo)
592 = size_binop (PLUS_EXPR, BINFO_OFFSET (base_binfo), offset);
593 #else
594 BINFO_OFFSET (base_binfo) = offset;
595 #endif
596
597 unshare_base_binfos (base_binfo);
598
599 /* Go to our next class that counts for offset propagation. */
600 i = j;
601 if (i < n_baselinks)
602 offset = size_binop (PLUS_EXPR, offset, delta);
603 }
604 }
605 }
606
607 /* Makes new binfos for the indirect bases under BASE_BINFO, and updates
608 BINFO_OFFSET for them and their bases. */
609
610 static void
611 unshare_base_binfos (base_binfo)
612 tree base_binfo;
613 {
614 if (BINFO_BASETYPES (base_binfo))
615 {
616 tree base_binfos = BINFO_BASETYPES (base_binfo);
617 tree chain = NULL_TREE;
618 int j;
619
620 /* Now unshare the structure beneath BASE_BINFO. */
621 for (j = TREE_VEC_LENGTH (base_binfos)-1;
622 j >= 0; j--)
623 {
624 tree base_base_binfo = TREE_VEC_ELT (base_binfos, j);
625 if (! TREE_VIA_VIRTUAL (base_base_binfo))
626 TREE_VEC_ELT (base_binfos, j)
627 = make_binfo (BINFO_OFFSET (base_base_binfo),
628 base_base_binfo,
629 BINFO_VTABLE (base_base_binfo),
630 BINFO_VIRTUALS (base_base_binfo),
631 chain);
632 chain = TREE_VEC_ELT (base_binfos, j);
633 TREE_VIA_PUBLIC (chain) = TREE_VIA_PUBLIC (base_base_binfo);
634 TREE_VIA_PROTECTED (chain) = TREE_VIA_PROTECTED (base_base_binfo);
635 BINFO_INHERITANCE_CHAIN (chain) = base_binfo;
636 }
637
638 /* Completely unshare potentially shared data, and
639 update what is ours. */
640 propagate_binfo_offsets (base_binfo, BINFO_OFFSET (base_binfo));
641 }
642 }
643
644 /* Finish the work of layout_record, now taking virtual bases into account.
645 Also compute the actual offsets that our base classes will have.
646 This must be performed after the fields are laid out, since virtual
647 baseclasses must lay down at the end of the record.
648
649 Returns the maximum number of virtual functions any of the
650 baseclasses provide. */
651
652 int
653 layout_basetypes (rec, max)
654 tree rec;
655 int max;
656 {
657 tree binfos = TYPE_BINFO_BASETYPES (rec);
658 int i, n_baseclasses = binfos ? TREE_VEC_LENGTH (binfos) : 0;
659
660 /* Get all the virtual base types that this type uses.
661 The TREE_VALUE slot holds the virtual baseclass type. */
662 tree vbase_types = get_vbase_types (rec);
663
664 unsigned int record_align = MAX (BITS_PER_UNIT, TYPE_ALIGN (rec));
665 unsigned int desired_align;
666
667 /* Record size so far is CONST_SIZE bits, where CONST_SIZE is an integer. */
668 register unsigned int const_size = 0;
669 unsigned int nonvirtual_const_size;
670
671 #ifdef STRUCTURE_SIZE_BOUNDARY
672 /* Packed structures don't need to have minimum size. */
673 if (! TYPE_PACKED (rec))
674 record_align = MAX (record_align, STRUCTURE_SIZE_BOUNDARY);
675 #endif
676
677 CLASSTYPE_VBASECLASSES (rec) = vbase_types;
678
679 my_friendly_assert (TREE_CODE (TYPE_SIZE (rec)) == INTEGER_CST, 19970302);
680 const_size = TREE_INT_CST_LOW (TYPE_SIZE (rec));
681
682 nonvirtual_const_size = const_size;
683
684 while (vbase_types)
685 {
686 tree basetype = BINFO_TYPE (vbase_types);
687 tree offset;
688
689 desired_align = TYPE_ALIGN (basetype);
690 record_align = MAX (record_align, desired_align);
691
692 if (const_size == 0)
693 offset = integer_zero_node;
694 else
695 {
696 /* Give each virtual base type the alignment it wants. */
697 const_size = CEIL (const_size, desired_align) * desired_align;
698 offset = size_int (CEIL (const_size, BITS_PER_UNIT));
699 }
700
701 if (CLASSTYPE_VSIZE (basetype) > max)
702 max = CLASSTYPE_VSIZE (basetype);
703 BINFO_OFFSET (vbase_types) = offset;
704
705 /* Every virtual baseclass takes a least a UNIT, so that we can
706 take it's address and get something different for each base. */
707 const_size += MAX (BITS_PER_UNIT,
708 TREE_INT_CST_LOW (CLASSTYPE_SIZE (basetype)));
709
710 vbase_types = TREE_CHAIN (vbase_types);
711 }
712
713 if (const_size)
714 {
715 /* Because a virtual base might take a single byte above,
716 we have to re-adjust the total size to make sure it is
717 a multiple of the alignment. */
718 /* Give the whole object the alignment it wants. */
719 const_size = CEIL (const_size, record_align) * record_align;
720 }
721
722 /* Set the alignment in the complete type. We don't set CLASSTYPE_ALIGN
723 here, as that is for this class, without any virtual base classes. */
724 TYPE_ALIGN (rec) = record_align;
725 if (const_size != nonvirtual_const_size)
726 TYPE_SIZE (rec) = size_int (const_size);
727
728 /* Now propagate offset information throughout the lattice. */
729 for (i = 0; i < n_baseclasses; i++)
730 {
731 register tree base_binfo = TREE_VEC_ELT (binfos, i);
732 register tree basetype = BINFO_TYPE (base_binfo);
733 tree field = TYPE_FIELDS (rec);
734
735 if (TREE_VIA_VIRTUAL (base_binfo))
736 continue;
737
738 my_friendly_assert (TREE_TYPE (field) == basetype, 23897);
739 BINFO_OFFSET (base_binfo)
740 = size_int (CEIL (TREE_INT_CST_LOW (DECL_FIELD_BITPOS (field)),
741 BITS_PER_UNIT));
742 unshare_base_binfos (base_binfo);
743 TYPE_FIELDS (rec) = TREE_CHAIN (field);
744 }
745
746 for (vbase_types = CLASSTYPE_VBASECLASSES (rec); vbase_types;
747 vbase_types = TREE_CHAIN (vbase_types))
748 {
749 BINFO_INHERITANCE_CHAIN (vbase_types) = TYPE_BINFO (rec);
750 unshare_base_binfos (vbase_types);
751 }
752
753 return max;
754 }
755
756 /* If the empty base field in DECL overlaps with a base of the same type in
757 NEWDECL, which is either another base field or the first data field of
758 the class, pad the base just before NEWDECL and return 1. Otherwise,
759 return 0. */
760
761 static int
762 avoid_overlap (decl, newdecl)
763 tree decl, newdecl;
764 {
765 tree field;
766
767 if (newdecl == NULL_TREE
768 || ! types_overlap_p (TREE_TYPE (decl), TREE_TYPE (newdecl)))
769 return 0;
770
771 for (field = decl; TREE_CHAIN (field) && TREE_CHAIN (field) != newdecl;
772 field = TREE_CHAIN (field))
773 ;
774
775 DECL_SIZE (field) = integer_one_node;
776
777 return 1;
778 }
779
780 /* Returns a list of fields to stand in for the base class subobjects
781 of REC. These fields are later removed by layout_basetypes. */
782
783 tree
784 build_base_fields (rec)
785 tree rec;
786 {
787 /* Chain to hold all the new FIELD_DECLs which stand in for base class
788 subobjects. */
789 tree base_decls = NULL_TREE;
790 tree binfos = TYPE_BINFO_BASETYPES (rec);
791 int n_baseclasses = binfos ? TREE_VEC_LENGTH (binfos) : 0;
792 tree decl, nextdecl;
793 int i, saw_empty = 0;
794 unsigned int base_align = 0;
795
796 for (i = 0; i < n_baseclasses; ++i)
797 {
798 register tree base_binfo = TREE_VEC_ELT (binfos, i);
799 register tree basetype = BINFO_TYPE (base_binfo);
800
801 if (TYPE_SIZE (basetype) == 0)
802 /* This error is now reported in xref_tag, thus giving better
803 location information. */
804 continue;
805
806 if (TREE_VIA_VIRTUAL (base_binfo))
807 continue;
808
809 decl = build_lang_field_decl (FIELD_DECL, NULL_TREE, basetype);
810 DECL_ARTIFICIAL (decl) = 1;
811 DECL_FIELD_CONTEXT (decl) = DECL_CLASS_CONTEXT (decl) = rec;
812 DECL_SIZE (decl) = CLASSTYPE_SIZE (basetype);
813 DECL_ALIGN (decl) = CLASSTYPE_ALIGN (basetype);
814 TREE_CHAIN (decl) = base_decls;
815 base_decls = decl;
816
817 if (! flag_new_abi)
818 {
819 /* Brain damage for backwards compatibility. For no good reason,
820 the old layout_basetypes made every base at least as large as
821 the alignment for the bases up to that point, gratuitously
822 wasting space. So we do the same thing here. */
823 base_align = MAX (base_align, DECL_ALIGN (decl));
824 DECL_SIZE (decl)
825 = size_int (MAX (TREE_INT_CST_LOW (DECL_SIZE (decl)),
826 base_align));
827 }
828 else if (DECL_SIZE (decl) == integer_zero_node)
829 saw_empty = 1;
830 }
831
832 /* Reverse the list of fields so we allocate the bases in the proper
833 order. */
834 base_decls = nreverse (base_decls);
835
836 /* In the presence of empty base classes, we run the risk of allocating
837 two objects of the same class on top of one another. Avoid that. */
838 if (flag_new_abi && saw_empty)
839 for (decl = base_decls; decl; decl = TREE_CHAIN (decl))
840 {
841 if (DECL_SIZE (decl) == integer_zero_node)
842 {
843 /* First step through the following bases until we find
844 an overlap or a non-empty base. */
845 for (nextdecl = TREE_CHAIN (decl); nextdecl;
846 nextdecl = TREE_CHAIN (nextdecl))
847 {
848 if (avoid_overlap (decl, nextdecl)
849 || DECL_SIZE (nextdecl) != integer_zero_node)
850 goto nextbase;
851 }
852
853 /* If we're still looking, also check against the first
854 field. */
855 for (nextdecl = TYPE_FIELDS (rec);
856 nextdecl && TREE_CODE (nextdecl) != FIELD_DECL;
857 nextdecl = TREE_CHAIN (nextdecl))
858 /* keep looking */;
859 avoid_overlap (decl, nextdecl);
860 }
861 nextbase:;
862 }
863
864 return base_decls;
865 }
866
867 /* Returns list of virtual base class pointers in a FIELD_DECL chain. */
868
869 tree
870 build_vbase_pointer_fields (rec)
871 tree rec;
872 {
873 /* Chain to hold all the new FIELD_DECLs which point at virtual
874 base classes. */
875 tree vbase_decls = NULL_TREE;
876 tree binfos = TYPE_BINFO_BASETYPES (rec);
877 int n_baseclasses = binfos ? TREE_VEC_LENGTH (binfos) : 0;
878 tree decl;
879 int i;
880
881 /* Handle basetypes almost like fields, but record their
882 offsets differently. */
883
884 for (i = 0; i < n_baseclasses; i++)
885 {
886 register tree base_binfo = TREE_VEC_ELT (binfos, i);
887 register tree basetype = BINFO_TYPE (base_binfo);
888
889 if (TYPE_SIZE (basetype) == 0)
890 /* This error is now reported in xref_tag, thus giving better
891 location information. */
892 continue;
893
894 /* All basetypes are recorded in the association list of the
895 derived type. */
896
897 if (TREE_VIA_VIRTUAL (base_binfo))
898 {
899 int j;
900 char *name = (char *)alloca (TYPE_NAME_LENGTH (basetype)
901 + sizeof (VBASE_NAME) + 1);
902
903 /* The offset for a virtual base class is only used in computing
904 virtual function tables and for initializing virtual base
905 pointers. It is built once `get_vbase_types' is called. */
906
907 /* If this basetype can come from another vbase pointer
908 without an additional indirection, we will share
909 that pointer. If an indirection is involved, we
910 make our own pointer. */
911 for (j = 0; j < n_baseclasses; j++)
912 {
913 tree other_base_binfo = TREE_VEC_ELT (binfos, j);
914 if (! TREE_VIA_VIRTUAL (other_base_binfo)
915 && binfo_member (basetype,
916 CLASSTYPE_VBASECLASSES (BINFO_TYPE
917 (other_base_binfo))
918 ))
919 goto got_it;
920 }
921 sprintf (name, VBASE_NAME_FORMAT, TYPE_NAME_STRING (basetype));
922 decl = build_lang_field_decl (FIELD_DECL, get_identifier (name),
923 build_pointer_type (basetype));
924 /* If you change any of the below, take a look at all the
925 other VFIELD_BASEs and VTABLE_BASEs in the code, and change
926 them too. */
927 DECL_ASSEMBLER_NAME (decl) = get_identifier (VTABLE_BASE);
928 DECL_VIRTUAL_P (decl) = 1;
929 DECL_ARTIFICIAL (decl) = 1;
930 DECL_FIELD_CONTEXT (decl) = rec;
931 DECL_CLASS_CONTEXT (decl) = rec;
932 DECL_FCONTEXT (decl) = basetype;
933 DECL_SAVED_INSNS (decl) = NULL_RTX;
934 DECL_FIELD_SIZE (decl) = 0;
935 DECL_ALIGN (decl) = TYPE_ALIGN (ptr_type_node);
936 TREE_CHAIN (decl) = vbase_decls;
937 BINFO_VPTR_FIELD (base_binfo) = decl;
938 vbase_decls = decl;
939
940 got_it:
941 /* The space this decl occupies has already been accounted for. */
942 ;
943 }
944 }
945
946 return vbase_decls;
947 }
948 \f
949 /* Hashing of lists so that we don't make duplicates.
950 The entry point is `list_hash_canon'. */
951
952 /* Each hash table slot is a bucket containing a chain
953 of these structures. */
954
955 struct list_hash
956 {
957 struct list_hash *next; /* Next structure in the bucket. */
958 int hashcode; /* Hash code of this list. */
959 tree list; /* The list recorded here. */
960 };
961
962 /* Now here is the hash table. When recording a list, it is added
963 to the slot whose index is the hash code mod the table size.
964 Note that the hash table is used for several kinds of lists.
965 While all these live in the same table, they are completely independent,
966 and the hash code is computed differently for each of these. */
967
968 #define TYPE_HASH_SIZE 59
969 static struct list_hash *list_hash_table[TYPE_HASH_SIZE];
970
971 /* Compute a hash code for a list (chain of TREE_LIST nodes
972 with goodies in the TREE_PURPOSE, TREE_VALUE, and bits of the
973 TREE_COMMON slots), by adding the hash codes of the individual entries. */
974
975 static int
976 list_hash (purpose, value, chain)
977 tree purpose, value, chain;
978 {
979 register int hashcode = 0;
980
981 if (chain)
982 hashcode += TYPE_HASH (chain);
983
984 if (value)
985 hashcode += TYPE_HASH (value);
986 else
987 hashcode += 1007;
988 if (purpose)
989 hashcode += TYPE_HASH (purpose);
990 else
991 hashcode += 1009;
992 return hashcode;
993 }
994
995 /* Look in the type hash table for a type isomorphic to TYPE.
996 If one is found, return it. Otherwise return 0. */
997
998 static tree
999 list_hash_lookup (hashcode, via_public, via_protected, via_virtual,
1000 purpose, value, chain)
1001 int hashcode, via_public, via_virtual, via_protected;
1002 tree purpose, value, chain;
1003 {
1004 register struct list_hash *h;
1005
1006 for (h = list_hash_table[hashcode % TYPE_HASH_SIZE]; h; h = h->next)
1007 if (h->hashcode == hashcode
1008 && TREE_VIA_VIRTUAL (h->list) == via_virtual
1009 && TREE_VIA_PUBLIC (h->list) == via_public
1010 && TREE_VIA_PROTECTED (h->list) == via_protected
1011 && TREE_PURPOSE (h->list) == purpose
1012 && TREE_VALUE (h->list) == value
1013 && TREE_CHAIN (h->list) == chain)
1014 return h->list;
1015 return 0;
1016 }
1017
1018 /* Add an entry to the list-hash-table
1019 for a list TYPE whose hash code is HASHCODE. */
1020
1021 static void
1022 list_hash_add (hashcode, list)
1023 int hashcode;
1024 tree list;
1025 {
1026 register struct list_hash *h;
1027
1028 h = (struct list_hash *) obstack_alloc (&class_obstack, sizeof (struct list_hash));
1029 h->hashcode = hashcode;
1030 h->list = list;
1031 h->next = list_hash_table[hashcode % TYPE_HASH_SIZE];
1032 list_hash_table[hashcode % TYPE_HASH_SIZE] = h;
1033 }
1034
1035 /* Given TYPE, and HASHCODE its hash code, return the canonical
1036 object for an identical list if one already exists.
1037 Otherwise, return TYPE, and record it as the canonical object
1038 if it is a permanent object.
1039
1040 To use this function, first create a list of the sort you want.
1041 Then compute its hash code from the fields of the list that
1042 make it different from other similar lists.
1043 Then call this function and use the value.
1044 This function frees the list you pass in if it is a duplicate. */
1045
1046 /* Set to 1 to debug without canonicalization. Never set by program. */
1047
1048 static int debug_no_list_hash = 0;
1049
1050 tree
1051 hash_tree_cons (via_public, via_virtual, via_protected, purpose, value, chain)
1052 int via_public, via_virtual, via_protected;
1053 tree purpose, value, chain;
1054 {
1055 struct obstack *ambient_obstack = current_obstack;
1056 tree t;
1057 int hashcode = 0;
1058
1059 if (! debug_no_list_hash)
1060 {
1061 hashcode = list_hash (purpose, value, chain);
1062 t = list_hash_lookup (hashcode, via_public, via_protected, via_virtual,
1063 purpose, value, chain);
1064 if (t)
1065 return t;
1066 }
1067
1068 current_obstack = &class_obstack;
1069
1070 t = tree_cons (purpose, value, chain);
1071 TREE_VIA_PUBLIC (t) = via_public;
1072 TREE_VIA_PROTECTED (t) = via_protected;
1073 TREE_VIA_VIRTUAL (t) = via_virtual;
1074
1075 /* If this is a new list, record it for later reuse. */
1076 if (! debug_no_list_hash)
1077 list_hash_add (hashcode, t);
1078
1079 current_obstack = ambient_obstack;
1080 return t;
1081 }
1082
1083 /* Constructor for hashed lists. */
1084
1085 tree
1086 hash_tree_chain (value, chain)
1087 tree value, chain;
1088 {
1089 return hash_tree_cons (0, 0, 0, NULL_TREE, value, chain);
1090 }
1091
1092 /* Similar, but used for concatenating two lists. */
1093
1094 tree
1095 hash_chainon (list1, list2)
1096 tree list1, list2;
1097 {
1098 if (list2 == 0)
1099 return list1;
1100 if (list1 == 0)
1101 return list2;
1102 if (TREE_CHAIN (list1) == NULL_TREE)
1103 return hash_tree_chain (TREE_VALUE (list1), list2);
1104 return hash_tree_chain (TREE_VALUE (list1),
1105 hash_chainon (TREE_CHAIN (list1), list2));
1106 }
1107
1108 static tree
1109 get_identifier_list (value)
1110 tree value;
1111 {
1112 tree list = IDENTIFIER_AS_LIST (value);
1113 if (list != NULL_TREE
1114 && (TREE_CODE (list) != TREE_LIST
1115 || TREE_VALUE (list) != value))
1116 list = NULL_TREE;
1117 else if (IDENTIFIER_HAS_TYPE_VALUE (value)
1118 && TREE_CODE (IDENTIFIER_TYPE_VALUE (value)) == RECORD_TYPE
1119 && IDENTIFIER_TYPE_VALUE (value)
1120 == TYPE_MAIN_VARIANT (IDENTIFIER_TYPE_VALUE (value)))
1121 {
1122 tree type = IDENTIFIER_TYPE_VALUE (value);
1123
1124 if (TYPE_PTRMEMFUNC_P (type))
1125 list = NULL_TREE;
1126 else if (type == current_class_type)
1127 /* Don't mess up the constructor name. */
1128 list = tree_cons (NULL_TREE, value, NULL_TREE);
1129 else
1130 {
1131 if (! CLASSTYPE_ID_AS_LIST (type))
1132 CLASSTYPE_ID_AS_LIST (type)
1133 = perm_tree_cons (NULL_TREE, TYPE_IDENTIFIER (type), NULL_TREE);
1134 list = CLASSTYPE_ID_AS_LIST (type);
1135 }
1136 }
1137 return list;
1138 }
1139
1140 tree
1141 get_decl_list (value)
1142 tree value;
1143 {
1144 tree list = NULL_TREE;
1145
1146 if (TREE_CODE (value) == IDENTIFIER_NODE)
1147 list = get_identifier_list (value);
1148 else if (TREE_CODE (value) == RECORD_TYPE
1149 && TYPE_LANG_SPECIFIC (value)
1150 && value == TYPE_MAIN_VARIANT (value))
1151 list = CLASSTYPE_AS_LIST (value);
1152
1153 if (list != NULL_TREE)
1154 {
1155 my_friendly_assert (TREE_CHAIN (list) == NULL_TREE, 301);
1156 return list;
1157 }
1158
1159 return build_decl_list (NULL_TREE, value);
1160 }
1161 \f
1162 /* Build an association between TYPE and some parameters:
1163
1164 OFFSET is the offset added to `this' to convert it to a pointer
1165 of type `TYPE *'
1166
1167 BINFO is the base binfo to use, if we are deriving from one. This
1168 is necessary, as we want specialized parent binfos from base
1169 classes, so that the VTABLE_NAMEs of bases are for the most derived
1170 type, instead of the simple type.
1171
1172 VTABLE is the virtual function table with which to initialize
1173 sub-objects of type TYPE.
1174
1175 VIRTUALS are the virtual functions sitting in VTABLE.
1176
1177 CHAIN are more associations we must retain. */
1178
1179 tree
1180 make_binfo (offset, binfo, vtable, virtuals, chain)
1181 tree offset, binfo;
1182 tree vtable, virtuals;
1183 tree chain;
1184 {
1185 tree new_binfo = make_tree_vec (6);
1186 tree type;
1187
1188 if (TREE_CODE (binfo) == TREE_VEC)
1189 type = BINFO_TYPE (binfo);
1190 else
1191 {
1192 type = binfo;
1193 binfo = TYPE_BINFO (binfo);
1194 }
1195
1196 TREE_CHAIN (new_binfo) = chain;
1197 if (chain)
1198 TREE_USED (new_binfo) = TREE_USED (chain);
1199
1200 TREE_TYPE (new_binfo) = TYPE_MAIN_VARIANT (type);
1201 BINFO_OFFSET (new_binfo) = offset;
1202 BINFO_VTABLE (new_binfo) = vtable;
1203 BINFO_VIRTUALS (new_binfo) = virtuals;
1204 BINFO_VPTR_FIELD (new_binfo) = NULL_TREE;
1205
1206 if (binfo && BINFO_BASETYPES (binfo) != NULL_TREE)
1207 BINFO_BASETYPES (new_binfo) = copy_node (BINFO_BASETYPES (binfo));
1208 return new_binfo;
1209 }
1210
1211 /* Return the binfo value for ELEM in TYPE. */
1212
1213 tree
1214 binfo_value (elem, type)
1215 tree elem;
1216 tree type;
1217 {
1218 if (get_base_distance (elem, type, 0, (tree *)0) == -2)
1219 compiler_error ("base class `%s' ambiguous in binfo_value",
1220 TYPE_NAME_STRING (elem));
1221 if (elem == type)
1222 return TYPE_BINFO (type);
1223 if (TREE_CODE (elem) == RECORD_TYPE && TYPE_BINFO (elem) == type)
1224 return type;
1225 return get_binfo (elem, type, 0);
1226 }
1227
1228 tree
1229 reverse_path (path)
1230 tree path;
1231 {
1232 register tree prev = 0, tmp, next;
1233 for (tmp = path; tmp; tmp = next)
1234 {
1235 next = BINFO_INHERITANCE_CHAIN (tmp);
1236 BINFO_INHERITANCE_CHAIN (tmp) = prev;
1237 prev = tmp;
1238 }
1239 return prev;
1240 }
1241
1242 void
1243 debug_binfo (elem)
1244 tree elem;
1245 {
1246 unsigned HOST_WIDE_INT n;
1247 tree virtuals;
1248
1249 fprintf (stderr, "type \"%s\"; offset = %d\n",
1250 TYPE_NAME_STRING (BINFO_TYPE (elem)),
1251 TREE_INT_CST_LOW (BINFO_OFFSET (elem)));
1252 fprintf (stderr, "vtable type:\n");
1253 debug_tree (BINFO_TYPE (elem));
1254 if (BINFO_VTABLE (elem))
1255 fprintf (stderr, "vtable decl \"%s\"\n", IDENTIFIER_POINTER (DECL_NAME (BINFO_VTABLE (elem))));
1256 else
1257 fprintf (stderr, "no vtable decl yet\n");
1258 fprintf (stderr, "virtuals:\n");
1259 virtuals = BINFO_VIRTUALS (elem);
1260
1261 n = skip_rtti_stuff (&virtuals);
1262
1263 while (virtuals)
1264 {
1265 tree fndecl = TREE_OPERAND (FNADDR_FROM_VTABLE_ENTRY (TREE_VALUE (virtuals)), 0);
1266 fprintf (stderr, "%s [%d =? %d]\n",
1267 IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (fndecl)),
1268 n, TREE_INT_CST_LOW (DECL_VINDEX (fndecl)));
1269 ++n;
1270 virtuals = TREE_CHAIN (virtuals);
1271 }
1272 }
1273
1274 /* Initialize an CPLUS_BINDING node that does not live on an obstack. */
1275
1276 tree
1277 binding_init (node)
1278 struct tree_binding* node;
1279 {
1280 static struct tree_binding* source;
1281 if (!source)
1282 {
1283 extern struct obstack permanent_obstack;
1284 push_obstacks (&permanent_obstack, &permanent_obstack);
1285 source = (struct tree_binding*)make_node (CPLUS_BINDING);
1286 pop_obstacks ();
1287 }
1288 *node = *source;
1289 TREE_PERMANENT ((tree)node) = 0;
1290 return (tree)node;
1291 }
1292
1293 int
1294 count_functions (t)
1295 tree t;
1296 {
1297 int i;
1298 if (TREE_CODE (t) == FUNCTION_DECL)
1299 return 1;
1300 else if (TREE_CODE (t) == OVERLOAD)
1301 {
1302 for (i=0; t; t = OVL_CHAIN (t))
1303 i++;
1304 return i;
1305 }
1306
1307 my_friendly_abort (359);
1308 return 0;
1309 }
1310
1311 int
1312 is_overloaded_fn (x)
1313 tree x;
1314 {
1315 /* XXX A baselink is also considered an overloaded function. */
1316 if (TREE_CODE (x) == TREE_LIST)
1317 {
1318 my_friendly_assert (TREE_CODE (TREE_PURPOSE (x)) == TREE_VEC, 388);
1319 x = TREE_VALUE (x);
1320 }
1321 return (TREE_CODE (x) == FUNCTION_DECL
1322 || TREE_CODE (x) == TEMPLATE_ID_EXPR
1323 || DECL_FUNCTION_TEMPLATE_P (x)
1324 || TREE_CODE (x) == OVERLOAD);
1325 }
1326
1327 int
1328 really_overloaded_fn (x)
1329 tree x;
1330 {
1331 /* A baselink is also considered an overloaded function.
1332 This might also be an ambiguous class member. */
1333 while (TREE_CODE (x) == TREE_LIST)
1334 x = TREE_VALUE (x);
1335 return (TREE_CODE (x) == OVERLOAD
1336 && (TREE_CHAIN (x) != NULL_TREE
1337 || DECL_FUNCTION_TEMPLATE_P (OVL_FUNCTION (x))));
1338 }
1339
1340 tree
1341 get_first_fn (from)
1342 tree from;
1343 {
1344 my_friendly_assert (is_overloaded_fn (from), 9);
1345 /* A baselink is also considered an overloaded function. */
1346 if (TREE_CODE (from) == TREE_LIST)
1347 from = TREE_VALUE (from);
1348 return OVL_CURRENT (from);
1349 }
1350
1351 /* Return a new OVL node, concatenating it with the old one. */
1352
1353 tree
1354 ovl_cons (decl, chain)
1355 tree decl;
1356 tree chain;
1357 {
1358 tree result = make_node (OVERLOAD);
1359 TREE_TYPE (result) = unknown_type_node;
1360 OVL_FUNCTION (result) = decl;
1361 TREE_CHAIN (result) = chain;
1362
1363 return result;
1364 }
1365
1366 /* Same as ovl_cons, but on the scratch_obstack. */
1367
1368 tree
1369 scratch_ovl_cons (value, chain)
1370 tree value, chain;
1371 {
1372 register tree node;
1373 register struct obstack *ambient_obstack = current_obstack;
1374 extern struct obstack *expression_obstack;
1375 current_obstack = expression_obstack;
1376 node = ovl_cons (value, chain);
1377 current_obstack = ambient_obstack;
1378 return node;
1379 }
1380
1381 /* Build a new overloaded function. If this is the first one,
1382 just return it; otherwise, ovl_cons the _DECLs */
1383
1384 tree
1385 build_overload (decl, chain)
1386 tree decl;
1387 tree chain;
1388 {
1389 if (!chain)
1390 return decl;
1391 if (TREE_CODE (chain) != OVERLOAD)
1392 chain = ovl_cons (chain, NULL_TREE);
1393 return ovl_cons (decl, chain);
1394 }
1395
1396 /* True if fn is in ovl. */
1397
1398 int
1399 ovl_member (fn, ovl)
1400 tree fn;
1401 tree ovl;
1402 {
1403 if (fn == ovl)
1404 return 1;
1405 if (!ovl || TREE_CODE (ovl) != OVERLOAD)
1406 return 0;
1407 for (; ovl; ovl = OVL_CHAIN (ovl))
1408 if (OVL_FUNCTION (ovl) == fn)
1409 return 1;
1410 return 0;
1411 }
1412
1413 int
1414 is_aggr_type_2 (t1, t2)
1415 tree t1, t2;
1416 {
1417 if (TREE_CODE (t1) != TREE_CODE (t2))
1418 return 0;
1419 return IS_AGGR_TYPE (t1) && IS_AGGR_TYPE (t2);
1420 }
1421 \f
1422 #define PRINT_RING_SIZE 4
1423
1424 char *
1425 lang_printable_name (decl, v)
1426 tree decl;
1427 int v;
1428 {
1429 static tree decl_ring[PRINT_RING_SIZE];
1430 static char *print_ring[PRINT_RING_SIZE];
1431 static int ring_counter;
1432 int i;
1433
1434 /* Only cache functions. */
1435 if (v < 2
1436 || TREE_CODE (decl) != FUNCTION_DECL
1437 || DECL_LANG_SPECIFIC (decl) == 0)
1438 return lang_decl_name (decl, v);
1439
1440 /* See if this print name is lying around. */
1441 for (i = 0; i < PRINT_RING_SIZE; i++)
1442 if (decl_ring[i] == decl)
1443 /* yes, so return it. */
1444 return print_ring[i];
1445
1446 if (++ring_counter == PRINT_RING_SIZE)
1447 ring_counter = 0;
1448
1449 if (current_function_decl != NULL_TREE)
1450 {
1451 if (decl_ring[ring_counter] == current_function_decl)
1452 ring_counter += 1;
1453 if (ring_counter == PRINT_RING_SIZE)
1454 ring_counter = 0;
1455 if (decl_ring[ring_counter] == current_function_decl)
1456 my_friendly_abort (106);
1457 }
1458
1459 if (print_ring[ring_counter])
1460 free (print_ring[ring_counter]);
1461
1462 print_ring[ring_counter] = xstrdup (lang_decl_name (decl, v));
1463 decl_ring[ring_counter] = decl;
1464 return print_ring[ring_counter];
1465 }
1466 \f
1467 /* Build the FUNCTION_TYPE or METHOD_TYPE which may throw exceptions
1468 listed in RAISES. */
1469
1470 tree
1471 build_exception_variant (type, raises)
1472 tree type;
1473 tree raises;
1474 {
1475 tree v = TYPE_MAIN_VARIANT (type);
1476 int constp = TYPE_READONLY (type);
1477 int volatilep = TYPE_VOLATILE (type);
1478
1479 for (; v; v = TYPE_NEXT_VARIANT (v))
1480 {
1481 if (TYPE_READONLY (v) != constp
1482 || TYPE_VOLATILE (v) != volatilep)
1483 continue;
1484
1485 /* @@ This should do set equality, not exact match. */
1486 if (simple_cst_list_equal (TYPE_RAISES_EXCEPTIONS (v), raises))
1487 /* List of exceptions raised matches previously found list.
1488
1489 @@ Nice to free up storage used in consing up the
1490 @@ list of exceptions raised. */
1491 return v;
1492 }
1493
1494 /* Need to build a new variant. */
1495 v = build_type_copy (type);
1496
1497 if (raises && ! TREE_PERMANENT (raises))
1498 {
1499 push_obstacks_nochange ();
1500 end_temporary_allocation ();
1501 raises = copy_list (raises);
1502 pop_obstacks ();
1503 }
1504
1505 TYPE_RAISES_EXCEPTIONS (v) = raises;
1506 return v;
1507 }
1508
1509 /* Given a TEMPLATE_TEMPLATE_PARM node T, create a new one together with its
1510 lang_specific field and its corresponding TEMPLATE_DECL node */
1511
1512 tree
1513 copy_template_template_parm (t)
1514 tree t;
1515 {
1516 tree template = TYPE_NAME (t);
1517 tree t2 = make_lang_type (TEMPLATE_TEMPLATE_PARM);
1518 template = copy_node (template);
1519 copy_lang_decl (template);
1520 TREE_TYPE (template) = t2;
1521 TYPE_NAME (t2) = template;
1522 TYPE_STUB_DECL (t2) = template;
1523
1524 /* No need to copy these */
1525 TYPE_FIELDS (t2) = TYPE_FIELDS (t);
1526 CLASSTYPE_TEMPLATE_INFO (t2) = CLASSTYPE_TEMPLATE_INFO (t);
1527 return t2;
1528 }
1529
1530 /* Subroutine of copy_to_permanent
1531
1532 Assuming T is a node build bottom-up, make it all exist on
1533 permanent obstack, if it is not permanent already. */
1534
1535 tree
1536 mapcar (t, func)
1537 tree t;
1538 tree (*func) PROTO((tree));
1539 {
1540 tree tmp;
1541
1542 if (t == NULL_TREE)
1543 return t;
1544
1545 if (tmp = func (t), tmp != NULL_TREE)
1546 return tmp;
1547
1548 switch (TREE_CODE (t))
1549 {
1550 case ERROR_MARK:
1551 return error_mark_node;
1552
1553 case VAR_DECL:
1554 case FUNCTION_DECL:
1555 case CONST_DECL:
1556 /* Rather than aborting, return error_mark_node. This allows us
1557 to report a sensible error message on code like this:
1558
1559 void g() { int i; f<i>(7); }
1560
1561 In a case like:
1562
1563 void g() { const int i = 7; f<i>(7); }
1564
1565 however, we must actually return the constant initializer. */
1566 tmp = decl_constant_value (t);
1567 if (tmp != t)
1568 return mapcar (tmp, func);
1569 else
1570 return error_mark_node;
1571
1572 case PARM_DECL:
1573 {
1574 tree chain = TREE_CHAIN (t);
1575 t = copy_node (t);
1576 TREE_CHAIN (t) = mapcar (chain, func);
1577 TREE_TYPE (t) = mapcar (TREE_TYPE (t), func);
1578 DECL_INITIAL (t) = mapcar (DECL_INITIAL (t), func);
1579 DECL_SIZE (t) = mapcar (DECL_SIZE (t), func);
1580 return t;
1581 }
1582
1583 case TREE_LIST:
1584 {
1585 tree chain = TREE_CHAIN (t);
1586 t = copy_node (t);
1587 TREE_PURPOSE (t) = mapcar (TREE_PURPOSE (t), func);
1588 TREE_VALUE (t) = mapcar (TREE_VALUE (t), func);
1589 TREE_CHAIN (t) = mapcar (chain, func);
1590 return t;
1591 }
1592
1593 case OVERLOAD:
1594 {
1595 tree chain = OVL_CHAIN (t);
1596 t = copy_node (t);
1597 OVL_FUNCTION (t) = mapcar (OVL_FUNCTION (t), func);
1598 OVL_CHAIN (t) = mapcar (chain, func);
1599 return t;
1600 }
1601
1602 case TREE_VEC:
1603 {
1604 int len = TREE_VEC_LENGTH (t);
1605
1606 t = copy_node (t);
1607 while (len--)
1608 TREE_VEC_ELT (t, len) = mapcar (TREE_VEC_ELT (t, len), func);
1609 return t;
1610 }
1611
1612 case INTEGER_CST:
1613 case REAL_CST:
1614 case STRING_CST:
1615 return copy_node (t);
1616
1617 case COND_EXPR:
1618 case TARGET_EXPR:
1619 case AGGR_INIT_EXPR:
1620 t = copy_node (t);
1621 TREE_OPERAND (t, 0) = mapcar (TREE_OPERAND (t, 0), func);
1622 TREE_OPERAND (t, 1) = mapcar (TREE_OPERAND (t, 1), func);
1623 TREE_OPERAND (t, 2) = mapcar (TREE_OPERAND (t, 2), func);
1624 return t;
1625
1626 case SAVE_EXPR:
1627 t = copy_node (t);
1628 TREE_OPERAND (t, 0) = mapcar (TREE_OPERAND (t, 0), func);
1629 return t;
1630
1631 case MODIFY_EXPR:
1632 case PLUS_EXPR:
1633 case MINUS_EXPR:
1634 case MULT_EXPR:
1635 case TRUNC_DIV_EXPR:
1636 case TRUNC_MOD_EXPR:
1637 case MIN_EXPR:
1638 case MAX_EXPR:
1639 case LSHIFT_EXPR:
1640 case RSHIFT_EXPR:
1641 case BIT_IOR_EXPR:
1642 case BIT_XOR_EXPR:
1643 case BIT_AND_EXPR:
1644 case BIT_ANDTC_EXPR:
1645 case TRUTH_ANDIF_EXPR:
1646 case TRUTH_ORIF_EXPR:
1647 case LT_EXPR:
1648 case LE_EXPR:
1649 case GT_EXPR:
1650 case GE_EXPR:
1651 case EQ_EXPR:
1652 case NE_EXPR:
1653 case CEIL_DIV_EXPR:
1654 case FLOOR_DIV_EXPR:
1655 case ROUND_DIV_EXPR:
1656 case CEIL_MOD_EXPR:
1657 case FLOOR_MOD_EXPR:
1658 case ROUND_MOD_EXPR:
1659 case COMPOUND_EXPR:
1660 case PREDECREMENT_EXPR:
1661 case PREINCREMENT_EXPR:
1662 case POSTDECREMENT_EXPR:
1663 case POSTINCREMENT_EXPR:
1664 case ARRAY_REF:
1665 case SCOPE_REF:
1666 case TRY_CATCH_EXPR:
1667 case WITH_CLEANUP_EXPR:
1668 t = copy_node (t);
1669 TREE_OPERAND (t, 0) = mapcar (TREE_OPERAND (t, 0), func);
1670 TREE_OPERAND (t, 1) = mapcar (TREE_OPERAND (t, 1), func);
1671 return t;
1672
1673 case CALL_EXPR:
1674 t = copy_node (t);
1675 TREE_TYPE (t) = mapcar (TREE_TYPE (t), func);
1676 TREE_OPERAND (t, 0) = mapcar (TREE_OPERAND (t, 0), func);
1677 TREE_OPERAND (t, 1) = mapcar (TREE_OPERAND (t, 1), func);
1678
1679 /* tree.def says that operand two is RTL, but
1680 build_call_declarator puts trees in there. */
1681 if (TREE_OPERAND (t, 2)
1682 && TREE_CODE (TREE_OPERAND (t, 2)) == TREE_LIST)
1683 TREE_OPERAND (t, 2) = mapcar (TREE_OPERAND (t, 2), func);
1684 else
1685 TREE_OPERAND (t, 2) = NULL_TREE;
1686 return t;
1687
1688 case CONVERT_EXPR:
1689 case ADDR_EXPR:
1690 case INDIRECT_REF:
1691 case NEGATE_EXPR:
1692 case BIT_NOT_EXPR:
1693 case TRUTH_NOT_EXPR:
1694 case NOP_EXPR:
1695 case COMPONENT_REF:
1696 case CLEANUP_POINT_EXPR:
1697 t = copy_node (t);
1698 TREE_OPERAND (t, 0) = mapcar (TREE_OPERAND (t, 0), func);
1699 return t;
1700
1701 case POINTER_TYPE:
1702 tmp = build_pointer_type (mapcar (TREE_TYPE (t), func));
1703 return cp_build_type_variant (tmp, TYPE_READONLY (t), TYPE_VOLATILE (t));
1704 case REFERENCE_TYPE:
1705 tmp = build_reference_type (mapcar (TREE_TYPE (t), func));
1706 return cp_build_type_variant (tmp, TYPE_READONLY (t), TYPE_VOLATILE (t));
1707 case FUNCTION_TYPE:
1708 tmp = build_function_type (mapcar (TREE_TYPE (t), func),
1709 mapcar (TYPE_ARG_TYPES (t), func));
1710 return cp_build_type_variant (tmp, TYPE_READONLY (t), TYPE_VOLATILE (t));
1711 case ARRAY_TYPE:
1712 tmp = build_cplus_array_type (mapcar (TREE_TYPE (t), func),
1713 mapcar (TYPE_DOMAIN (t), func));
1714 return cp_build_type_variant (tmp, TYPE_READONLY (t), TYPE_VOLATILE (t));
1715 case INTEGER_TYPE:
1716 tmp = build_index_type (mapcar (TYPE_MAX_VALUE (t), func));
1717 return cp_build_type_variant (tmp, TYPE_READONLY (t), TYPE_VOLATILE (t));
1718 case OFFSET_TYPE:
1719 tmp = build_offset_type (mapcar (TYPE_OFFSET_BASETYPE (t), func),
1720 mapcar (TREE_TYPE (t), func));
1721 return cp_build_type_variant (tmp, TYPE_READONLY (t), TYPE_VOLATILE (t));
1722 case METHOD_TYPE:
1723 tmp = build_cplus_method_type
1724 (mapcar (TREE_TYPE (TREE_VALUE (TYPE_ARG_TYPES (t))), func),
1725 mapcar (TREE_TYPE (t), func),
1726 mapcar (TREE_CHAIN (TYPE_ARG_TYPES (t)), func));
1727 return cp_build_type_variant (tmp, TYPE_READONLY (t), TYPE_VOLATILE (t));
1728
1729 case COMPLEX_CST:
1730 t = copy_node (t);
1731 TREE_REALPART (t) = mapcar (TREE_REALPART (t), func);
1732 TREE_IMAGPART (t) = mapcar (TREE_REALPART (t), func);
1733 return t;
1734
1735 case CONSTRUCTOR:
1736 t = copy_node (t);
1737 CONSTRUCTOR_ELTS (t) = mapcar (CONSTRUCTOR_ELTS (t), func);
1738 return t;
1739
1740 case TEMPLATE_TEMPLATE_PARM:
1741 return copy_template_template_parm (t);
1742
1743 case BIND_EXPR:
1744 t = copy_node (t);
1745 TREE_OPERAND (t, 0) = mapcar (TREE_OPERAND (t, 0), func);
1746 TREE_OPERAND (t, 1) = mapcar (TREE_OPERAND (t, 1), func);
1747 TREE_OPERAND (t, 2) = NULL_TREE;
1748 return t;
1749
1750 case RECORD_TYPE:
1751 if (TYPE_PTRMEMFUNC_P (t))
1752 return build_ptrmemfunc_type
1753 (mapcar (TYPE_PTRMEMFUNC_FN_TYPE (t), func));
1754 /* else fall through */
1755
1756 /* This list is incomplete, but should suffice for now.
1757 It is very important that `sorry' not call
1758 `report_error_function'. That could cause an infinite loop. */
1759 default:
1760 sorry ("initializer contains unrecognized tree code");
1761 return error_mark_node;
1762
1763 }
1764 my_friendly_abort (107);
1765 /* NOTREACHED */
1766 return NULL_TREE;
1767 }
1768
1769 static tree
1770 perm_manip (t)
1771 tree t;
1772 {
1773 if (TREE_PERMANENT (t))
1774 return t;
1775
1776 /* Support `void f () { extern int i; A<&i> a; }' */
1777 if ((TREE_CODE (t) == VAR_DECL || TREE_CODE (t) == FUNCTION_DECL)
1778 && TREE_PUBLIC (t))
1779 {
1780 t = copy_node (t);
1781
1782 /* copy_rtx won't make a new SYMBOL_REF, so call make_decl_rtl again. */
1783 DECL_RTL (t) = 0;
1784 make_decl_rtl (t, NULL_PTR, 1);
1785
1786 return t;
1787 }
1788 return NULL_TREE;
1789 }
1790
1791 /* Assuming T is a node built bottom-up, make it all exist on
1792 permanent obstack, if it is not permanent already. */
1793
1794 tree
1795 copy_to_permanent (t)
1796 tree t;
1797 {
1798 if (t == NULL_TREE || TREE_PERMANENT (t))
1799 return t;
1800
1801 push_obstacks_nochange ();
1802 end_temporary_allocation ();
1803
1804 t = mapcar (t, perm_manip);
1805
1806 pop_obstacks ();
1807
1808 return t;
1809 }
1810
1811 #ifdef GATHER_STATISTICS
1812 extern int depth_reached;
1813 #endif
1814
1815 void
1816 print_lang_statistics ()
1817 {
1818 extern struct obstack decl_obstack;
1819 print_obstack_statistics ("class_obstack", &class_obstack);
1820 print_obstack_statistics ("decl_obstack", &decl_obstack);
1821 print_search_statistics ();
1822 print_class_statistics ();
1823 #ifdef GATHER_STATISTICS
1824 fprintf (stderr, "maximum template instantiation depth reached: %d\n",
1825 depth_reached);
1826 #endif
1827 }
1828
1829 /* This is used by the `assert' macro. It is provided in libgcc.a,
1830 which `cc' doesn't know how to link. Note that the C++ front-end
1831 no longer actually uses the `assert' macro (instead, it calls
1832 my_friendly_assert). But all of the back-end files still need this. */
1833
1834 void
1835 __eprintf (string, expression, line, filename)
1836 #ifdef __STDC__
1837 const char *string;
1838 const char *expression;
1839 unsigned line;
1840 const char *filename;
1841 #else
1842 char *string;
1843 char *expression;
1844 unsigned line;
1845 char *filename;
1846 #endif
1847 {
1848 fprintf (stderr, string, expression, line, filename);
1849 fflush (stderr);
1850 abort ();
1851 }
1852
1853 /* Return, as an INTEGER_CST node, the number of elements for TYPE
1854 (which is an ARRAY_TYPE). This counts only elements of the top
1855 array. */
1856
1857 tree
1858 array_type_nelts_top (type)
1859 tree type;
1860 {
1861 return fold (build (PLUS_EXPR, sizetype,
1862 array_type_nelts (type),
1863 integer_one_node));
1864 }
1865
1866 /* Return, as an INTEGER_CST node, the number of elements for TYPE
1867 (which is an ARRAY_TYPE). This one is a recursive count of all
1868 ARRAY_TYPEs that are clumped together. */
1869
1870 tree
1871 array_type_nelts_total (type)
1872 tree type;
1873 {
1874 tree sz = array_type_nelts_top (type);
1875 type = TREE_TYPE (type);
1876 while (TREE_CODE (type) == ARRAY_TYPE)
1877 {
1878 tree n = array_type_nelts_top (type);
1879 sz = fold (build (MULT_EXPR, sizetype, sz, n));
1880 type = TREE_TYPE (type);
1881 }
1882 return sz;
1883 }
1884
1885 static
1886 tree
1887 bot_manip (t)
1888 tree t;
1889 {
1890 if (TREE_CODE (t) != TREE_LIST && ! TREE_SIDE_EFFECTS (t))
1891 return t;
1892 else if (TREE_CODE (t) == TARGET_EXPR)
1893 {
1894 if (TREE_CODE (TREE_OPERAND (t, 1)) == AGGR_INIT_EXPR)
1895 {
1896 mark_used (TREE_OPERAND (TREE_OPERAND (TREE_OPERAND (t, 1), 0), 0));
1897 return build_cplus_new
1898 (TREE_TYPE (t), break_out_target_exprs (TREE_OPERAND (t, 1)));
1899 }
1900 t = copy_node (t);
1901 TREE_OPERAND (t, 0) = build (VAR_DECL, TREE_TYPE (t));
1902 layout_decl (TREE_OPERAND (t, 0), 0);
1903 return t;
1904 }
1905 else if (TREE_CODE (t) == CALL_EXPR)
1906 mark_used (TREE_OPERAND (TREE_OPERAND (t, 0), 0));
1907
1908 return NULL_TREE;
1909 }
1910
1911 /* Actually, we'll just clean out the target exprs for the moment. */
1912
1913 tree
1914 break_out_target_exprs (t)
1915 tree t;
1916 {
1917 return mapcar (t, bot_manip);
1918 }
1919
1920 /* Obstack used for allocating nodes in template function and variable
1921 definitions. */
1922
1923 /* Similar to `build_nt', except we build
1924 on the permanent_obstack, regardless. */
1925
1926 tree
1927 build_min_nt VPROTO((enum tree_code code, ...))
1928 {
1929 #ifndef __STDC__
1930 enum tree_code code;
1931 #endif
1932 register struct obstack *ambient_obstack = expression_obstack;
1933 va_list p;
1934 register tree t;
1935 register int length;
1936 register int i;
1937
1938 VA_START (p, code);
1939
1940 #ifndef __STDC__
1941 code = va_arg (p, enum tree_code);
1942 #endif
1943
1944 expression_obstack = &permanent_obstack;
1945
1946 t = make_node (code);
1947 length = tree_code_length[(int) code];
1948 TREE_COMPLEXITY (t) = lineno;
1949
1950 for (i = 0; i < length; i++)
1951 {
1952 tree x = va_arg (p, tree);
1953 TREE_OPERAND (t, i) = copy_to_permanent (x);
1954 }
1955
1956 va_end (p);
1957 expression_obstack = ambient_obstack;
1958 return t;
1959 }
1960
1961 /* Similar to `build', except we build
1962 on the permanent_obstack, regardless. */
1963
1964 tree
1965 build_min VPROTO((enum tree_code code, tree tt, ...))
1966 {
1967 #ifndef __STDC__
1968 enum tree_code code;
1969 tree tt;
1970 #endif
1971 register struct obstack *ambient_obstack = expression_obstack;
1972 va_list p;
1973 register tree t;
1974 register int length;
1975 register int i;
1976
1977 VA_START (p, tt);
1978
1979 #ifndef __STDC__
1980 code = va_arg (p, enum tree_code);
1981 tt = va_arg (p, tree);
1982 #endif
1983
1984 expression_obstack = &permanent_obstack;
1985
1986 t = make_node (code);
1987 length = tree_code_length[(int) code];
1988 TREE_TYPE (t) = tt;
1989 TREE_COMPLEXITY (t) = lineno;
1990
1991 for (i = 0; i < length; i++)
1992 {
1993 tree x = va_arg (p, tree);
1994 TREE_OPERAND (t, i) = copy_to_permanent (x);
1995 }
1996
1997 va_end (p);
1998 expression_obstack = ambient_obstack;
1999 return t;
2000 }
2001
2002 /* Same as `tree_cons' but make a permanent object. */
2003
2004 tree
2005 min_tree_cons (purpose, value, chain)
2006 tree purpose, value, chain;
2007 {
2008 register tree node;
2009 register struct obstack *ambient_obstack = current_obstack;
2010 current_obstack = &permanent_obstack;
2011
2012 node = tree_cons (copy_to_permanent (purpose),
2013 copy_to_permanent (value), chain);
2014 current_obstack = ambient_obstack;
2015 return node;
2016 }
2017
2018 tree
2019 get_type_decl (t)
2020 tree t;
2021 {
2022 if (TREE_CODE (t) == TYPE_DECL)
2023 return t;
2024 if (TREE_CODE_CLASS (TREE_CODE (t)) == 't')
2025 return TYPE_STUB_DECL (t);
2026
2027 my_friendly_abort (42);
2028
2029 /* Stop compiler from complaining control reaches end of non-void function. */
2030 return 0;
2031 }
2032
2033 int
2034 can_free (obstack, t)
2035 struct obstack *obstack;
2036 tree t;
2037 {
2038 int size = 0;
2039
2040 if (TREE_CODE (t) == TREE_VEC)
2041 size = (TREE_VEC_LENGTH (t)-1) * sizeof (tree) + sizeof (struct tree_vec);
2042 else
2043 my_friendly_abort (42);
2044
2045 #define ROUND(x) ((x + obstack_alignment_mask (obstack)) \
2046 & ~ obstack_alignment_mask (obstack))
2047 if ((char *)t + ROUND (size) == obstack_next_free (obstack))
2048 return 1;
2049 #undef ROUND
2050
2051 return 0;
2052 }
2053
2054 /* Return first vector element whose BINFO_TYPE is ELEM.
2055 Return 0 if ELEM is not in VEC. VEC may be NULL_TREE. */
2056
2057 tree
2058 vec_binfo_member (elem, vec)
2059 tree elem, vec;
2060 {
2061 int i;
2062
2063 if (vec)
2064 for (i = 0; i < TREE_VEC_LENGTH (vec); ++i)
2065 if (comptypes (elem, BINFO_TYPE (TREE_VEC_ELT (vec, i)), 1))
2066 return TREE_VEC_ELT (vec, i);
2067
2068 return NULL_TREE;
2069 }
2070
2071 /* Kludge around the fact that DECL_CONTEXT for virtual functions returns
2072 the wrong thing for decl_function_context. Hopefully the uses in the
2073 backend won't matter, since we don't need a static chain for local class
2074 methods. FIXME! */
2075
2076 tree
2077 hack_decl_function_context (decl)
2078 tree decl;
2079 {
2080 if (TREE_CODE (decl) == FUNCTION_DECL && DECL_FUNCTION_MEMBER_P (decl))
2081 return decl_function_context (TYPE_MAIN_DECL (DECL_CLASS_CONTEXT (decl)));
2082 return decl_function_context (decl);
2083 }
2084
2085 /* Return truthvalue of whether T1 is the same tree structure as T2.
2086 Return 1 if they are the same.
2087 Return 0 if they are understandably different.
2088 Return -1 if either contains tree structure not understood by
2089 this function. */
2090
2091 int
2092 cp_tree_equal (t1, t2)
2093 tree t1, t2;
2094 {
2095 register enum tree_code code1, code2;
2096 int cmp;
2097
2098 if (t1 == t2)
2099 return 1;
2100 if (t1 == 0 || t2 == 0)
2101 return 0;
2102
2103 code1 = TREE_CODE (t1);
2104 code2 = TREE_CODE (t2);
2105
2106 if (code1 == NOP_EXPR || code1 == CONVERT_EXPR || code1 == NON_LVALUE_EXPR)
2107 {
2108 if (code2 == NOP_EXPR || code2 == CONVERT_EXPR || code2 == NON_LVALUE_EXPR)
2109 return cp_tree_equal (TREE_OPERAND (t1, 0), TREE_OPERAND (t2, 0));
2110 else
2111 return cp_tree_equal (TREE_OPERAND (t1, 0), t2);
2112 }
2113 else if (code2 == NOP_EXPR || code2 == CONVERT_EXPR
2114 || code2 == NON_LVALUE_EXPR)
2115 return cp_tree_equal (t1, TREE_OPERAND (t2, 0));
2116
2117 if (code1 != code2)
2118 return 0;
2119
2120 switch (code1)
2121 {
2122 case INTEGER_CST:
2123 return TREE_INT_CST_LOW (t1) == TREE_INT_CST_LOW (t2)
2124 && TREE_INT_CST_HIGH (t1) == TREE_INT_CST_HIGH (t2);
2125
2126 case REAL_CST:
2127 return REAL_VALUES_EQUAL (TREE_REAL_CST (t1), TREE_REAL_CST (t2));
2128
2129 case STRING_CST:
2130 return TREE_STRING_LENGTH (t1) == TREE_STRING_LENGTH (t2)
2131 && !bcmp (TREE_STRING_POINTER (t1), TREE_STRING_POINTER (t2),
2132 TREE_STRING_LENGTH (t1));
2133
2134 case CONSTRUCTOR:
2135 abort ();
2136
2137 case SAVE_EXPR:
2138 return cp_tree_equal (TREE_OPERAND (t1, 0), TREE_OPERAND (t2, 0));
2139
2140 case CALL_EXPR:
2141 cmp = cp_tree_equal (TREE_OPERAND (t1, 0), TREE_OPERAND (t2, 0));
2142 if (cmp <= 0)
2143 return cmp;
2144 return simple_cst_list_equal (TREE_OPERAND (t1, 1), TREE_OPERAND (t2, 1));
2145
2146 case TARGET_EXPR:
2147 /* Special case: if either target is an unallocated VAR_DECL,
2148 it means that it's going to be unified with whatever the
2149 TARGET_EXPR is really supposed to initialize, so treat it
2150 as being equivalent to anything. */
2151 if ((TREE_CODE (TREE_OPERAND (t1, 0)) == VAR_DECL
2152 && DECL_NAME (TREE_OPERAND (t1, 0)) == NULL_TREE
2153 && DECL_RTL (TREE_OPERAND (t1, 0)) == 0)
2154 || (TREE_CODE (TREE_OPERAND (t2, 0)) == VAR_DECL
2155 && DECL_NAME (TREE_OPERAND (t2, 0)) == NULL_TREE
2156 && DECL_RTL (TREE_OPERAND (t2, 0)) == 0))
2157 cmp = 1;
2158 else
2159 cmp = cp_tree_equal (TREE_OPERAND (t1, 0), TREE_OPERAND (t2, 0));
2160 if (cmp <= 0)
2161 return cmp;
2162 return cp_tree_equal (TREE_OPERAND (t1, 1), TREE_OPERAND (t2, 1));
2163
2164 case WITH_CLEANUP_EXPR:
2165 cmp = cp_tree_equal (TREE_OPERAND (t1, 0), TREE_OPERAND (t2, 0));
2166 if (cmp <= 0)
2167 return cmp;
2168 return cp_tree_equal (TREE_OPERAND (t1, 2), TREE_OPERAND (t1, 2));
2169
2170 case COMPONENT_REF:
2171 if (TREE_OPERAND (t1, 1) == TREE_OPERAND (t2, 1))
2172 return cp_tree_equal (TREE_OPERAND (t1, 0), TREE_OPERAND (t2, 0));
2173 return 0;
2174
2175 case VAR_DECL:
2176 case PARM_DECL:
2177 case CONST_DECL:
2178 case FUNCTION_DECL:
2179 return 0;
2180
2181 case TEMPLATE_PARM_INDEX:
2182 return TEMPLATE_PARM_IDX (t1) == TEMPLATE_PARM_IDX (t2)
2183 && TEMPLATE_PARM_LEVEL (t1) == TEMPLATE_PARM_LEVEL (t2);
2184
2185 case SIZEOF_EXPR:
2186 case ALIGNOF_EXPR:
2187 if (TREE_CODE (TREE_OPERAND (t1, 0)) != TREE_CODE (TREE_OPERAND (t2, 0)))
2188 return 0;
2189 if (TREE_CODE_CLASS (TREE_CODE (TREE_OPERAND (t1, 0))) == 't')
2190 return comptypes (TREE_OPERAND (t1, 0), TREE_OPERAND (t2, 0), 1);
2191 break;
2192
2193 default:
2194 break;
2195 }
2196
2197 switch (TREE_CODE_CLASS (code1))
2198 {
2199 int i;
2200 case '1':
2201 case '2':
2202 case '<':
2203 case 'e':
2204 case 'r':
2205 case 's':
2206 cmp = 1;
2207 for (i=0; i<tree_code_length[(int) code1]; ++i)
2208 {
2209 cmp = cp_tree_equal (TREE_OPERAND (t1, i), TREE_OPERAND (t2, i));
2210 if (cmp <= 0)
2211 return cmp;
2212 }
2213 return cmp;
2214 }
2215
2216 return -1;
2217 }
2218
2219 /* Similar to make_tree_vec, but build on a temporary obstack. */
2220
2221 tree
2222 make_temp_vec (len)
2223 int len;
2224 {
2225 register tree node;
2226 register struct obstack *ambient_obstack = current_obstack;
2227 current_obstack = expression_obstack;
2228 node = make_tree_vec (len);
2229 current_obstack = ambient_obstack;
2230 return node;
2231 }
2232
2233 /* Build a wrapper around some pointer PTR so we can use it as a tree. */
2234
2235 tree
2236 build_ptr_wrapper (ptr)
2237 void *ptr;
2238 {
2239 tree t = make_node (WRAPPER);
2240 WRAPPER_PTR (t) = ptr;
2241 return t;
2242 }
2243
2244 /* Same, but on the expression_obstack. */
2245
2246 tree
2247 build_expr_ptr_wrapper (ptr)
2248 void *ptr;
2249 {
2250 tree t;
2251 push_expression_obstack ();
2252 t = build_ptr_wrapper (ptr);
2253 pop_obstacks ();
2254 return t;
2255 }
2256
2257 /* Build a wrapper around some integer I so we can use it as a tree. */
2258
2259 tree
2260 build_int_wrapper (i)
2261 int i;
2262 {
2263 tree t = make_node (WRAPPER);
2264 WRAPPER_INT (t) = i;
2265 return t;
2266 }
2267
2268 void
2269 push_expression_obstack ()
2270 {
2271 push_obstacks_nochange ();
2272 current_obstack = expression_obstack;
2273 }
2274
2275 /* The type of ARG when used as an lvalue. */
2276
2277 tree
2278 lvalue_type (arg)
2279 tree arg;
2280 {
2281 tree type = TREE_TYPE (arg);
2282 if (TREE_CODE (arg) == OVERLOAD)
2283 type = unknown_type_node;
2284 return cp_build_type_variant
2285 (type, TREE_READONLY (arg), TREE_THIS_VOLATILE (arg));
2286 }
2287
2288 /* The type of ARG for printing error messages; denote lvalues with
2289 reference types. */
2290
2291 tree
2292 error_type (arg)
2293 tree arg;
2294 {
2295 tree type = TREE_TYPE (arg);
2296 if (TREE_CODE (type) == ARRAY_TYPE)
2297 ;
2298 else if (real_lvalue_p (arg))
2299 type = build_reference_type (lvalue_type (arg));
2300 else if (IS_AGGR_TYPE (type))
2301 type = lvalue_type (arg);
2302
2303 return type;
2304 }
2305
2306 /* Does FUNCTION use a variable-length argument list? */
2307
2308 int
2309 varargs_function_p (function)
2310 tree function;
2311 {
2312 tree parm = TYPE_ARG_TYPES (TREE_TYPE (function));
2313 for (; parm; parm = TREE_CHAIN (parm))
2314 if (TREE_VALUE (parm) == void_type_node)
2315 return 0;
2316 return 1;
2317 }
2318
2319 /* Returns 1 if decl is a member of a class. */
2320
2321 int
2322 member_p (decl)
2323 tree decl;
2324 {
2325 tree ctx = DECL_CONTEXT (decl);
2326 return (ctx && TREE_CODE_CLASS (TREE_CODE (ctx)) == 't');
2327 }
This page took 0.140547 seconds and 5 git commands to generate.