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