]> gcc.gnu.org Git - gcc.git/blame - gcc/cp/tree.c
Wed May 6 22:32:37 CDT 1998 Robert Lipe <robertl@dgii.com>
[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;
573 tree base_binfos = BINFO_BASETYPES (base_binfo);
a703fb38 574 tree delta = NULL_TREE;
8d08fdba
MS
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
9a71c18b
JM
596
597 unshare_base_binfos (base_binfo);
8d08fdba
MS
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
9a71c18b
JM
607/* Makes new binfos for the indirect bases under BASE_BINFO, and updates
608 BINFO_OFFSET for them and their bases. */
609
610static void
611unshare_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.
8d08fdba 648
9a71c18b 649 Returns the maximum number of virtual functions any of the
8d08fdba 650 baseclasses provide. */
e92cc029 651
8d08fdba 652int
9a71c18b 653layout_basetypes (rec, max)
8d08fdba
MS
654 tree rec;
655 int max;
656{
9a71c18b
JM
657 tree binfos = TYPE_BINFO_BASETYPES (rec);
658 int i, n_baseclasses = binfos ? TREE_VEC_LENGTH (binfos) : 0;
659
8d08fdba
MS
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
f8344bea 664 unsigned int record_align = MAX (BITS_PER_UNIT, TYPE_ALIGN (rec));
f8344bea 665 unsigned int desired_align;
8d08fdba 666
0b41abe6 667 /* Record size so far is CONST_SIZE bits, where CONST_SIZE is an integer. */
f8344bea 668 register unsigned int const_size = 0;
f8344bea 669 unsigned int nonvirtual_const_size;
8d08fdba 670
0b41abe6
JM
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
8d08fdba
MS
677 CLASSTYPE_VBASECLASSES (rec) = vbase_types;
678
0b41abe6
JM
679 my_friendly_assert (TREE_CODE (TYPE_SIZE (rec)) == INTEGER_CST, 19970302);
680 const_size = TREE_INT_CST_LOW (TYPE_SIZE (rec));
8d08fdba
MS
681
682 nonvirtual_const_size = const_size;
8d08fdba
MS
683
684 while (vbase_types)
685 {
686 tree basetype = BINFO_TYPE (vbase_types);
687 tree offset;
688
f0e01782
MS
689 desired_align = TYPE_ALIGN (basetype);
690 record_align = MAX (record_align, desired_align);
691
8d08fdba
MS
692 if (const_size == 0)
693 offset = integer_zero_node;
694 else
f0e01782
MS
695 {
696 /* Give each virtual base type the alignment it wants. */
9a71c18b 697 const_size = CEIL (const_size, desired_align) * desired_align;
f0e01782
MS
698 offset = size_int (CEIL (const_size, BITS_PER_UNIT));
699 }
8d08fdba
MS
700
701 if (CLASSTYPE_VSIZE (basetype) > max)
702 max = CLASSTYPE_VSIZE (basetype);
703 BINFO_OFFSET (vbase_types) = offset;
704
0b41abe6
JM
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)));
8d08fdba
MS
709
710 vbase_types = TREE_CHAIN (vbase_types);
711 }
712
e1cd6e56
MS
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 it
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
f0e01782
MS
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;
8d08fdba 725 if (const_size != nonvirtual_const_size)
0b41abe6 726 TYPE_SIZE (rec) = size_int (const_size);
8d08fdba 727
9a71c18b
JM
728 /* Now propagate offset information throughout the lattice. */
729 for (i = 0; i < n_baseclasses; i++)
8d08fdba 730 {
9a71c18b
JM
731 register tree base_binfo = TREE_VEC_ELT (binfos, i);
732 register tree basetype = BINFO_TYPE (base_binfo);
733 tree field = TYPE_FIELDS (rec);
8ccc31eb 734
9a71c18b
JM
735 if (TREE_VIA_VIRTUAL (base_binfo))
736 continue;
8d08fdba 737
9a71c18b
JM
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 }
8d08fdba 745
9a71c18b
JM
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);
8d08fdba
MS
751 }
752
753 return max;
754}
755
732dcb6f
JM
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
761static int
762avoid_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;
80cd3eca
JM
776
777 return 1;
732dcb6f
JM
778}
779
9a71c18b
JM
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
783tree
784build_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;
732dcb6f
JM
792 tree decl, nextdecl;
793 int i, saw_empty = 0;
9a71c18b
JM
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;
8d08fdba 808
9a71c18b
JM
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
732dcb6f
JM
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;
9a71c18b 830 }
8d08fdba 831
9a71c18b
JM
832 /* Reverse the list of fields so we allocate the bases in the proper
833 order. */
732dcb6f
JM
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;
9a71c18b 865}
7177d104 866
9a71c18b 867/* Returns list of virtual base class pointers in a FIELD_DECL chain. */
e92cc029 868
8d08fdba 869tree
9a71c18b
JM
870build_vbase_pointer_fields (rec)
871 tree rec;
8d08fdba
MS
872{
873 /* Chain to hold all the new FIELD_DECLs which point at virtual
874 base classes. */
875 tree vbase_decls = NULL_TREE;
9a71c18b
JM
876 tree binfos = TYPE_BINFO_BASETYPES (rec);
877 int n_baseclasses = binfos ? TREE_VEC_LENGTH (binfos) : 0;
878 tree decl;
879 int i;
0b41abe6 880
8d08fdba
MS
881 /* Handle basetypes almost like fields, but record their
882 offsets differently. */
883
884 for (i = 0; i < n_baseclasses; i++)
885 {
8d08fdba
MS
886 register tree base_binfo = TREE_VEC_ELT (binfos, i);
887 register tree basetype = BINFO_TYPE (base_binfo);
8d08fdba
MS
888
889 if (TYPE_SIZE (basetype) == 0)
0b41abe6
JM
890 /* This error is now reported in xref_tag, thus giving better
891 location information. */
892 continue;
8d08fdba
MS
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,
9a71c18b
JM
916 CLASSTYPE_VBASECLASSES (BINFO_TYPE
917 (other_base_binfo))
918 ))
8d08fdba
MS
919 goto got_it;
920 }
921 sprintf (name, VBASE_NAME_FORMAT, TYPE_NAME_STRING (basetype));
be99da77
MS
922 decl = build_lang_field_decl (FIELD_DECL, get_identifier (name),
923 build_pointer_type (basetype));
8d08fdba
MS
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
e92cc029 926 them too. */
8d08fdba
MS
927 DECL_ASSEMBLER_NAME (decl) = get_identifier (VTABLE_BASE);
928 DECL_VIRTUAL_P (decl) = 1;
d2e5ee5c 929 DECL_ARTIFICIAL (decl) = 1;
8d08fdba
MS
930 DECL_FIELD_CONTEXT (decl) = rec;
931 DECL_CLASS_CONTEXT (decl) = rec;
932 DECL_FCONTEXT (decl) = basetype;
28cbf42c 933 DECL_SAVED_INSNS (decl) = NULL_RTX;
8d08fdba
MS
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
8d08fdba
MS
940 got_it:
941 /* The space this decl occupies has already been accounted for. */
9a71c18b 942 ;
8d08fdba 943 }
8d08fdba
MS
944 }
945
8d08fdba
MS
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
955struct 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
37c46b43 969static struct list_hash *list_hash_table[TYPE_HASH_SIZE];
8d08fdba
MS
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
37c46b43
MS
975static int
976list_hash (purpose, value, chain)
977 tree purpose, value, chain;
8d08fdba
MS
978{
979 register int hashcode = 0;
980
37c46b43
MS
981 if (chain)
982 hashcode += TYPE_HASH (chain);
8d08fdba 983
37c46b43
MS
984 if (value)
985 hashcode += TYPE_HASH (value);
8d08fdba
MS
986 else
987 hashcode += 1007;
37c46b43
MS
988 if (purpose)
989 hashcode += TYPE_HASH (purpose);
8d08fdba
MS
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
37c46b43
MS
998static tree
999list_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;
8d08fdba
MS
1003{
1004 register struct list_hash *h;
37c46b43 1005
8d08fdba
MS
1006 for (h = list_hash_table[hashcode % TYPE_HASH_SIZE]; h; h = h->next)
1007 if (h->hashcode == hashcode
37c46b43
MS
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;
8d08fdba
MS
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
37c46b43 1021static void
8d08fdba
MS
1022list_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. */
e92cc029 1047
a0a33927 1048static int debug_no_list_hash = 0;
8d08fdba 1049
8d08fdba
MS
1050tree
1051hash_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;
a703fb38 1057 int hashcode = 0;
8d08fdba 1058
37c46b43
MS
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
8d08fdba 1068 current_obstack = &class_obstack;
37c46b43 1069
8d08fdba
MS
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;
37c46b43
MS
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
8d08fdba
MS
1079 current_obstack = ambient_obstack;
1080 return t;
1081}
1082
1083/* Constructor for hashed lists. */
e92cc029 1084
8d08fdba
MS
1085tree
1086hash_tree_chain (value, chain)
1087 tree value, chain;
1088{
37c46b43 1089 return hash_tree_cons (0, 0, 0, NULL_TREE, value, chain);
8d08fdba
MS
1090}
1091
1092/* Similar, but used for concatenating two lists. */
e92cc029 1093
8d08fdba
MS
1094tree
1095hash_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
51c184be
MS
1108static tree
1109get_identifier_list (value)
8d08fdba
MS
1110 tree value;
1111{
51c184be
MS
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)
8926095f
MS
1118 && TREE_CODE (IDENTIFIER_TYPE_VALUE (value)) == RECORD_TYPE
1119 && IDENTIFIER_TYPE_VALUE (value)
1120 == TYPE_MAIN_VARIANT (IDENTIFIER_TYPE_VALUE (value)))
8d08fdba 1121 {
51c184be
MS
1122 tree type = IDENTIFIER_TYPE_VALUE (value);
1123
1124 if (TYPE_PTRMEMFUNC_P (type))
8d08fdba 1125 list = NULL_TREE;
51c184be
MS
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
8d08fdba 1130 {
a80e4195 1131 if (! CLASSTYPE_ID_AS_LIST (type))
51c184be 1132 CLASSTYPE_ID_AS_LIST (type)
a80e4195 1133 = perm_tree_cons (NULL_TREE, TYPE_IDENTIFIER (type), NULL_TREE);
51c184be 1134 list = CLASSTYPE_ID_AS_LIST (type);
8d08fdba
MS
1135 }
1136 }
51c184be
MS
1137 return list;
1138}
1139
1140tree
1141get_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);
8d08fdba 1148 else if (TREE_CODE (value) == RECORD_TYPE
be99da77
MS
1149 && TYPE_LANG_SPECIFIC (value)
1150 && value == TYPE_MAIN_VARIANT (value))
8d08fdba
MS
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}
8d08fdba
MS
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
8926095f
MS
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 of the simple type.
1171
8d08fdba
MS
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
1179tree
8926095f
MS
1180make_binfo (offset, binfo, vtable, virtuals, chain)
1181 tree offset, binfo;
8d08fdba
MS
1182 tree vtable, virtuals;
1183 tree chain;
1184{
8926095f
MS
1185 tree new_binfo = make_tree_vec (6);
1186 tree type;
8d08fdba 1187
8926095f
MS
1188 if (TREE_CODE (binfo) == TREE_VEC)
1189 type = BINFO_TYPE (binfo);
1190 else
1191 {
1192 type = binfo;
1193 binfo = TYPE_BINFO (binfo);
1194 }
8d08fdba 1195
8926095f
MS
1196 TREE_CHAIN (new_binfo) = chain;
1197 if (chain)
1198 TREE_USED (new_binfo) = TREE_USED (chain);
8d08fdba 1199
8926095f
MS
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;
8d08fdba 1205
8926095f
MS
1206 if (binfo && BINFO_BASETYPES (binfo) != NULL_TREE)
1207 BINFO_BASETYPES (new_binfo) = copy_node (BINFO_BASETYPES (binfo));
1208 return new_binfo;
8d08fdba
MS
1209}
1210
8d08fdba
MS
1211/* Return the binfo value for ELEM in TYPE. */
1212
1213tree
1214binfo_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
1228tree
1229reverse_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
8d08fdba
MS
1242void
1243debug_binfo (elem)
1244 tree elem;
1245{
f30432d7 1246 unsigned HOST_WIDE_INT n;
8d08fdba
MS
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);
f30432d7
MS
1260
1261 n = skip_rtti_stuff (&virtuals);
1262
8d08fdba
MS
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)),
f30432d7
MS
1268 n, TREE_INT_CST_LOW (DECL_VINDEX (fndecl)));
1269 ++n;
8d08fdba 1270 virtuals = TREE_CHAIN (virtuals);
8d08fdba
MS
1271 }
1272}
1273
1274/* Return the length of a chain of nodes chained through DECL_CHAIN.
1275 We expect a null pointer to mark the end of the chain.
1276 This is the Lisp primitive `length'. */
1277
1278int
1279decl_list_length (t)
1280 tree t;
1281{
1282 register tree tail;
1283 register int len = 0;
1284
1285 my_friendly_assert (TREE_CODE (t) == FUNCTION_DECL
1286 || TREE_CODE (t) == TEMPLATE_DECL, 300);
1287 for (tail = t; tail; tail = DECL_CHAIN (tail))
1288 len++;
1289
1290 return len;
1291}
1292
1293int
1294count_functions (t)
1295 tree t;
1296{
1297 if (TREE_CODE (t) == FUNCTION_DECL)
1298 return 1;
5b605f68
MS
1299 else if (TREE_CODE (t) == TREE_LIST)
1300 return decl_list_length (TREE_VALUE (t));
8d08fdba 1301
5b605f68 1302 my_friendly_abort (359);
0d16d68e 1303 return 0;
8d08fdba
MS
1304}
1305
8d08fdba
MS
1306int
1307is_overloaded_fn (x)
1308 tree x;
1309{
06ab59df
MM
1310 return (TREE_CODE (x) == FUNCTION_DECL
1311 || TREE_CODE (x) == TEMPLATE_ID_EXPR
1312 || DECL_FUNCTION_TEMPLATE_P (x)
1313 || really_overloaded_fn (x));
8d08fdba
MS
1314}
1315
8926095f
MS
1316int
1317really_overloaded_fn (x)
1318 tree x;
1319{
06ab59df
MM
1320 return (TREE_CODE (x) == TREE_LIST
1321 && (TREE_CODE (TREE_VALUE (x)) == FUNCTION_DECL
1322 || DECL_FUNCTION_TEMPLATE_P (TREE_VALUE (x))));
8926095f
MS
1323}
1324
8d08fdba
MS
1325tree
1326get_first_fn (from)
1327 tree from;
1328{
06ab59df 1329 my_friendly_assert (is_overloaded_fn (from), 9);
8d08fdba 1330
06ab59df
MM
1331 if (really_overloaded_fn (from))
1332 return TREE_VALUE (from);
1333 else
1334 return from;
8d08fdba
MS
1335}
1336
8d08fdba
MS
1337int
1338is_aggr_type_2 (t1, t2)
1339 tree t1, t2;
1340{
1341 if (TREE_CODE (t1) != TREE_CODE (t2))
1342 return 0;
1343 return IS_AGGR_TYPE (t1) && IS_AGGR_TYPE (t2);
1344}
8d08fdba
MS
1345\f
1346#define PRINT_RING_SIZE 4
1347
1348char *
2ba25f50 1349lang_printable_name (decl, v)
8d08fdba 1350 tree decl;
2ba25f50 1351 int v;
8d08fdba
MS
1352{
1353 static tree decl_ring[PRINT_RING_SIZE];
1354 static char *print_ring[PRINT_RING_SIZE];
1355 static int ring_counter;
1356 int i;
1357
1358 /* Only cache functions. */
2ba25f50
MS
1359 if (v < 2
1360 || TREE_CODE (decl) != FUNCTION_DECL
8d08fdba 1361 || DECL_LANG_SPECIFIC (decl) == 0)
2ba25f50 1362 return lang_decl_name (decl, v);
8d08fdba
MS
1363
1364 /* See if this print name is lying around. */
1365 for (i = 0; i < PRINT_RING_SIZE; i++)
1366 if (decl_ring[i] == decl)
1367 /* yes, so return it. */
1368 return print_ring[i];
1369
1370 if (++ring_counter == PRINT_RING_SIZE)
1371 ring_counter = 0;
1372
1373 if (current_function_decl != NULL_TREE)
1374 {
1375 if (decl_ring[ring_counter] == current_function_decl)
1376 ring_counter += 1;
1377 if (ring_counter == PRINT_RING_SIZE)
1378 ring_counter = 0;
1379 if (decl_ring[ring_counter] == current_function_decl)
1380 my_friendly_abort (106);
1381 }
1382
1383 if (print_ring[ring_counter])
1384 free (print_ring[ring_counter]);
1385
2ba25f50
MS
1386 print_ring[ring_counter] = xstrdup (lang_decl_name (decl, v));
1387 decl_ring[ring_counter] = decl;
8d08fdba
MS
1388 return print_ring[ring_counter];
1389}
1390\f
f30432d7 1391/* Build the FUNCTION_TYPE or METHOD_TYPE which may throw exceptions
8d08fdba 1392 listed in RAISES. */
e92cc029 1393
8d08fdba 1394tree
f30432d7
MS
1395build_exception_variant (type, raises)
1396 tree type;
8d08fdba
MS
1397 tree raises;
1398{
8d08fdba 1399 tree v = TYPE_MAIN_VARIANT (type);
8d08fdba
MS
1400 int constp = TYPE_READONLY (type);
1401 int volatilep = TYPE_VOLATILE (type);
1402
45537677 1403 for (; v; v = TYPE_NEXT_VARIANT (v))
8d08fdba
MS
1404 {
1405 if (TYPE_READONLY (v) != constp
1406 || TYPE_VOLATILE (v) != volatilep)
1407 continue;
1408
e92cc029 1409 /* @@ This should do set equality, not exact match. */
6060a796
MS
1410 if (simple_cst_list_equal (TYPE_RAISES_EXCEPTIONS (v), raises))
1411 /* List of exceptions raised matches previously found list.
8d08fdba 1412
6060a796
MS
1413 @@ Nice to free up storage used in consing up the
1414 @@ list of exceptions raised. */
1415 return v;
8d08fdba
MS
1416 }
1417
1418 /* Need to build a new variant. */
45537677
MS
1419 v = build_type_copy (type);
1420
8d08fdba
MS
1421 if (raises && ! TREE_PERMANENT (raises))
1422 {
1423 push_obstacks_nochange ();
1424 end_temporary_allocation ();
1425 raises = copy_list (raises);
1426 pop_obstacks ();
1427 }
5566b478 1428
8d08fdba
MS
1429 TYPE_RAISES_EXCEPTIONS (v) = raises;
1430 return v;
1431}
1432
73b0fce8
KL
1433/* Given a TEMPLATE_TEMPLATE_PARM node T, create a new one together with its
1434 lang_specific field and its corresponding TEMPLATE_DECL node */
1435
1436tree
1437copy_template_template_parm (t)
1438 tree t;
1439{
1440 tree template = TYPE_NAME (t);
1441 tree t2 = make_lang_type (TEMPLATE_TEMPLATE_PARM);
1442 template = copy_node (template);
1443 copy_lang_decl (template);
1444 TREE_TYPE (template) = t2;
1445 TYPE_NAME (t2) = template;
1446 TYPE_STUB_DECL (t2) = template;
1447
1448 /* No need to copy these */
1449 TYPE_FIELDS (t2) = TYPE_FIELDS (t);
1450 CLASSTYPE_TEMPLATE_INFO (t2) = CLASSTYPE_TEMPLATE_INFO (t);
1451 return t2;
1452}
1453
8d08fdba
MS
1454/* Subroutine of copy_to_permanent
1455
1456 Assuming T is a node build bottom-up, make it all exist on
1457 permanent obstack, if it is not permanent already. */
878cd289
MS
1458
1459tree
1460mapcar (t, func)
8d08fdba 1461 tree t;
49c249e1 1462 tree (*func) PROTO((tree));
8d08fdba 1463{
878cd289 1464 tree tmp;
8d08fdba 1465
878cd289 1466 if (t == NULL_TREE)
8d08fdba
MS
1467 return t;
1468
878cd289
MS
1469 if (tmp = func (t), tmp != NULL_TREE)
1470 return tmp;
1471
5566b478 1472 switch (TREE_CODE (t))
8d08fdba
MS
1473 {
1474 case ERROR_MARK:
1475 return error_mark_node;
1476
1477 case VAR_DECL:
1478 case FUNCTION_DECL:
1479 case CONST_DECL:
75650646
MM
1480 /* Rather than aborting, return error_mark_node. This allows us
1481 to report a sensible error message on code like this:
1482
ae16ec5f
MM
1483 void g() { int i; f<i>(7); }
1484
1485 In a case like:
1486
1487 void g() { const int i = 7; f<i>(7); }
1488
1489 however, we must actually return the constant initializer. */
1490 tmp = decl_constant_value (t);
1491 if (tmp != t)
1492 return mapcar (tmp, func);
1493 else
1494 return error_mark_node;
8d08fdba
MS
1495
1496 case PARM_DECL:
1497 {
1498 tree chain = TREE_CHAIN (t);
1499 t = copy_node (t);
878cd289
MS
1500 TREE_CHAIN (t) = mapcar (chain, func);
1501 TREE_TYPE (t) = mapcar (TREE_TYPE (t), func);
1502 DECL_INITIAL (t) = mapcar (DECL_INITIAL (t), func);
1503 DECL_SIZE (t) = mapcar (DECL_SIZE (t), func);
8d08fdba
MS
1504 return t;
1505 }
1506
1507 case TREE_LIST:
1508 {
1509 tree chain = TREE_CHAIN (t);
1510 t = copy_node (t);
878cd289
MS
1511 TREE_PURPOSE (t) = mapcar (TREE_PURPOSE (t), func);
1512 TREE_VALUE (t) = mapcar (TREE_VALUE (t), func);
1513 TREE_CHAIN (t) = mapcar (chain, func);
8d08fdba
MS
1514 return t;
1515 }
1516
1517 case TREE_VEC:
1518 {
1519 int len = TREE_VEC_LENGTH (t);
1520
1521 t = copy_node (t);
1522 while (len--)
878cd289 1523 TREE_VEC_ELT (t, len) = mapcar (TREE_VEC_ELT (t, len), func);
8d08fdba
MS
1524 return t;
1525 }
1526
1527 case INTEGER_CST:
1528 case REAL_CST:
1529 case STRING_CST:
1530 return copy_node (t);
1531
1532 case COND_EXPR:
1533 case TARGET_EXPR:
02531345 1534 case AGGR_INIT_EXPR:
8d08fdba 1535 t = copy_node (t);
878cd289
MS
1536 TREE_OPERAND (t, 0) = mapcar (TREE_OPERAND (t, 0), func);
1537 TREE_OPERAND (t, 1) = mapcar (TREE_OPERAND (t, 1), func);
1538 TREE_OPERAND (t, 2) = mapcar (TREE_OPERAND (t, 2), func);
8d08fdba
MS
1539 return t;
1540
1541 case SAVE_EXPR:
1542 t = copy_node (t);
878cd289 1543 TREE_OPERAND (t, 0) = mapcar (TREE_OPERAND (t, 0), func);
8d08fdba
MS
1544 return t;
1545
1546 case MODIFY_EXPR:
1547 case PLUS_EXPR:
1548 case MINUS_EXPR:
1549 case MULT_EXPR:
1550 case TRUNC_DIV_EXPR:
1551 case TRUNC_MOD_EXPR:
1552 case MIN_EXPR:
1553 case MAX_EXPR:
1554 case LSHIFT_EXPR:
1555 case RSHIFT_EXPR:
1556 case BIT_IOR_EXPR:
1557 case BIT_XOR_EXPR:
1558 case BIT_AND_EXPR:
1559 case BIT_ANDTC_EXPR:
1560 case TRUTH_ANDIF_EXPR:
1561 case TRUTH_ORIF_EXPR:
1562 case LT_EXPR:
1563 case LE_EXPR:
1564 case GT_EXPR:
1565 case GE_EXPR:
1566 case EQ_EXPR:
1567 case NE_EXPR:
1568 case CEIL_DIV_EXPR:
1569 case FLOOR_DIV_EXPR:
1570 case ROUND_DIV_EXPR:
1571 case CEIL_MOD_EXPR:
1572 case FLOOR_MOD_EXPR:
1573 case ROUND_MOD_EXPR:
1574 case COMPOUND_EXPR:
1575 case PREDECREMENT_EXPR:
1576 case PREINCREMENT_EXPR:
1577 case POSTDECREMENT_EXPR:
1578 case POSTINCREMENT_EXPR:
5566b478
MS
1579 case ARRAY_REF:
1580 case SCOPE_REF:
6748b643
JM
1581 case TRY_CATCH_EXPR:
1582 case WITH_CLEANUP_EXPR:
8d08fdba 1583 t = copy_node (t);
878cd289
MS
1584 TREE_OPERAND (t, 0) = mapcar (TREE_OPERAND (t, 0), func);
1585 TREE_OPERAND (t, 1) = mapcar (TREE_OPERAND (t, 1), func);
8d08fdba
MS
1586 return t;
1587
7834ab39
MS
1588 case CALL_EXPR:
1589 t = copy_node (t);
1590 TREE_TYPE (t) = mapcar (TREE_TYPE (t), func);
1591 TREE_OPERAND (t, 0) = mapcar (TREE_OPERAND (t, 0), func);
1592 TREE_OPERAND (t, 1) = mapcar (TREE_OPERAND (t, 1), func);
1593
1594 /* tree.def says that operand two is RTL, but
1595 build_call_declarator puts trees in there. */
1596 if (TREE_OPERAND (t, 2)
1597 && TREE_CODE (TREE_OPERAND (t, 2)) == TREE_LIST)
1598 TREE_OPERAND (t, 2) = mapcar (TREE_OPERAND (t, 2), func);
1599 else
1600 TREE_OPERAND (t, 2) = NULL_TREE;
1601 return t;
1602
8d08fdba
MS
1603 case CONVERT_EXPR:
1604 case ADDR_EXPR:
1605 case INDIRECT_REF:
1606 case NEGATE_EXPR:
1607 case BIT_NOT_EXPR:
1608 case TRUTH_NOT_EXPR:
1609 case NOP_EXPR:
1610 case COMPONENT_REF:
6748b643 1611 case CLEANUP_POINT_EXPR:
8d08fdba 1612 t = copy_node (t);
878cd289 1613 TREE_OPERAND (t, 0) = mapcar (TREE_OPERAND (t, 0), func);
8d08fdba
MS
1614 return t;
1615
00595019 1616 case POINTER_TYPE:
e76a2646
MS
1617 tmp = build_pointer_type (mapcar (TREE_TYPE (t), func));
1618 return cp_build_type_variant (tmp, TYPE_READONLY (t), TYPE_VOLATILE (t));
00595019 1619 case REFERENCE_TYPE:
e76a2646
MS
1620 tmp = build_reference_type (mapcar (TREE_TYPE (t), func));
1621 return cp_build_type_variant (tmp, TYPE_READONLY (t), TYPE_VOLATILE (t));
00595019 1622 case FUNCTION_TYPE:
e76a2646
MS
1623 tmp = build_function_type (mapcar (TREE_TYPE (t), func),
1624 mapcar (TYPE_ARG_TYPES (t), func));
1625 return cp_build_type_variant (tmp, TYPE_READONLY (t), TYPE_VOLATILE (t));
00595019 1626 case ARRAY_TYPE:
5156628f
MS
1627 tmp = build_cplus_array_type (mapcar (TREE_TYPE (t), func),
1628 mapcar (TYPE_DOMAIN (t), func));
e76a2646 1629 return cp_build_type_variant (tmp, TYPE_READONLY (t), TYPE_VOLATILE (t));
b7484fbe 1630 case INTEGER_TYPE:
e76a2646
MS
1631 tmp = build_index_type (mapcar (TYPE_MAX_VALUE (t), func));
1632 return cp_build_type_variant (tmp, TYPE_READONLY (t), TYPE_VOLATILE (t));
00595019 1633 case OFFSET_TYPE:
e76a2646
MS
1634 tmp = build_offset_type (mapcar (TYPE_OFFSET_BASETYPE (t), func),
1635 mapcar (TREE_TYPE (t), func));
1636 return cp_build_type_variant (tmp, TYPE_READONLY (t), TYPE_VOLATILE (t));
00595019 1637 case METHOD_TYPE:
e76a2646
MS
1638 tmp = build_cplus_method_type
1639 (mapcar (TREE_TYPE (TREE_VALUE (TYPE_ARG_TYPES (t))), func),
1640 mapcar (TREE_TYPE (t), func),
1641 mapcar (TREE_CHAIN (TYPE_ARG_TYPES (t)), func));
1642 return cp_build_type_variant (tmp, TYPE_READONLY (t), TYPE_VOLATILE (t));
b7484fbe 1643
37c46b43
MS
1644 case COMPLEX_CST:
1645 t = copy_node (t);
1646 TREE_REALPART (t) = mapcar (TREE_REALPART (t), func);
1647 TREE_IMAGPART (t) = mapcar (TREE_REALPART (t), func);
1648 return t;
1649
5156628f
MS
1650 case CONSTRUCTOR:
1651 t = copy_node (t);
1652 CONSTRUCTOR_ELTS (t) = mapcar (CONSTRUCTOR_ELTS (t), func);
1653 return t;
1654
73b0fce8
KL
1655 case TEMPLATE_TEMPLATE_PARM:
1656 return copy_template_template_parm (t);
1657
67da3287
MM
1658 case BIND_EXPR:
1659 t = copy_node (t);
1660 TREE_OPERAND (t, 0) = mapcar (TREE_OPERAND (t, 0), func);
1661 TREE_OPERAND (t, 1) = mapcar (TREE_OPERAND (t, 1), func);
1662 TREE_OPERAND (t, 2) = NULL_TREE;
1663 return t;
1664
00595019
MS
1665 case RECORD_TYPE:
1666 if (TYPE_PTRMEMFUNC_P (t))
1667 return build_ptrmemfunc_type
878cd289 1668 (mapcar (TYPE_PTRMEMFUNC_FN_TYPE (t), func));
00595019
MS
1669 /* else fall through */
1670
8d08fdba 1671 /* This list is incomplete, but should suffice for now.
e76a2646 1672 It is very important that `sorry' not call
8d08fdba
MS
1673 `report_error_function'. That could cause an infinite loop. */
1674 default:
1675 sorry ("initializer contains unrecognized tree code");
1676 return error_mark_node;
1677
1678 }
1679 my_friendly_abort (107);
1680 /* NOTREACHED */
1681 return NULL_TREE;
1682}
1683
878cd289
MS
1684static tree
1685perm_manip (t)
1686 tree t;
1687{
1688 if (TREE_PERMANENT (t))
1689 return t;
73c9f270 1690
ec255269
MS
1691 /* Support `void f () { extern int i; A<&i> a; }' */
1692 if ((TREE_CODE (t) == VAR_DECL || TREE_CODE (t) == FUNCTION_DECL)
1693 && TREE_PUBLIC (t))
73c9f270
JM
1694 {
1695 t = copy_node (t);
1696
1697 /* copy_rtx won't make a new SYMBOL_REF, so call make_decl_rtl again. */
1698 DECL_RTL (t) = 0;
1699 make_decl_rtl (t, NULL_PTR, 1);
1700
1701 return t;
1702 }
878cd289
MS
1703 return NULL_TREE;
1704}
1705
8d08fdba
MS
1706/* Assuming T is a node built bottom-up, make it all exist on
1707 permanent obstack, if it is not permanent already. */
e92cc029 1708
8d08fdba
MS
1709tree
1710copy_to_permanent (t)
1711 tree t;
1712{
8d08fdba
MS
1713 if (t == NULL_TREE || TREE_PERMANENT (t))
1714 return t;
1715
73c9f270
JM
1716 push_obstacks_nochange ();
1717 end_temporary_allocation ();
8d08fdba 1718
878cd289 1719 t = mapcar (t, perm_manip);
8d08fdba 1720
73c9f270 1721 pop_obstacks ();
8d08fdba
MS
1722
1723 return t;
1724}
1725
5566b478
MS
1726#ifdef GATHER_STATISTICS
1727extern int depth_reached;
1728#endif
1729
8d08fdba
MS
1730void
1731print_lang_statistics ()
1732{
e66d884e 1733 extern struct obstack decl_obstack;
8d08fdba 1734 print_obstack_statistics ("class_obstack", &class_obstack);
5566b478 1735 print_obstack_statistics ("decl_obstack", &decl_obstack);
8d08fdba
MS
1736 print_search_statistics ();
1737 print_class_statistics ();
5566b478
MS
1738#ifdef GATHER_STATISTICS
1739 fprintf (stderr, "maximum template instantiation depth reached: %d\n",
1740 depth_reached);
1741#endif
8d08fdba
MS
1742}
1743
1744/* This is used by the `assert' macro. It is provided in libgcc.a,
1745 which `cc' doesn't know how to link. Note that the C++ front-end
1746 no longer actually uses the `assert' macro (instead, it calls
1747 my_friendly_assert). But all of the back-end files still need this. */
e92cc029 1748
8d08fdba
MS
1749void
1750__eprintf (string, expression, line, filename)
1751#ifdef __STDC__
1752 const char *string;
1753 const char *expression;
1754 unsigned line;
1755 const char *filename;
1756#else
1757 char *string;
1758 char *expression;
1759 unsigned line;
1760 char *filename;
1761#endif
1762{
1763 fprintf (stderr, string, expression, line, filename);
1764 fflush (stderr);
1765 abort ();
1766}
1767
e92cc029
MS
1768/* Return, as an INTEGER_CST node, the number of elements for TYPE
1769 (which is an ARRAY_TYPE). This counts only elements of the top
1770 array. */
8d08fdba
MS
1771
1772tree
1773array_type_nelts_top (type)
1774 tree type;
1775{
eae89e04 1776 return fold (build (PLUS_EXPR, sizetype,
8d08fdba
MS
1777 array_type_nelts (type),
1778 integer_one_node));
1779}
1780
e92cc029
MS
1781/* Return, as an INTEGER_CST node, the number of elements for TYPE
1782 (which is an ARRAY_TYPE). This one is a recursive count of all
1783 ARRAY_TYPEs that are clumped together. */
8d08fdba
MS
1784
1785tree
1786array_type_nelts_total (type)
1787 tree type;
1788{
1789 tree sz = array_type_nelts_top (type);
1790 type = TREE_TYPE (type);
1791 while (TREE_CODE (type) == ARRAY_TYPE)
1792 {
1793 tree n = array_type_nelts_top (type);
eae89e04 1794 sz = fold (build (MULT_EXPR, sizetype, sz, n));
8d08fdba
MS
1795 type = TREE_TYPE (type);
1796 }
1797 return sz;
1798}
878cd289
MS
1799
1800static
1801tree
1802bot_manip (t)
1803 tree t;
1804{
1805 if (TREE_CODE (t) != TREE_LIST && ! TREE_SIDE_EFFECTS (t))
1806 return t;
1807 else if (TREE_CODE (t) == TARGET_EXPR)
73aad9b9 1808 {
02531345 1809 if (TREE_CODE (TREE_OPERAND (t, 1)) == AGGR_INIT_EXPR)
73aad9b9
JM
1810 {
1811 mark_used (TREE_OPERAND (TREE_OPERAND (TREE_OPERAND (t, 1), 0), 0));
1812 return build_cplus_new
1813 (TREE_TYPE (t), break_out_target_exprs (TREE_OPERAND (t, 1)));
1814 }
1815 t = copy_node (t);
1816 TREE_OPERAND (t, 0) = build (VAR_DECL, TREE_TYPE (t));
1817 layout_decl (TREE_OPERAND (t, 0), 0);
1818 return t;
1819 }
1820 else if (TREE_CODE (t) == CALL_EXPR)
1821 mark_used (TREE_OPERAND (TREE_OPERAND (t, 0), 0));
1822
878cd289
MS
1823 return NULL_TREE;
1824}
1825
1826/* Actually, we'll just clean out the target exprs for the moment. */
e92cc029 1827
878cd289
MS
1828tree
1829break_out_target_exprs (t)
1830 tree t;
1831{
1832 return mapcar (t, bot_manip);
1833}
f30432d7 1834
5566b478
MS
1835/* Obstack used for allocating nodes in template function and variable
1836 definitions. */
1837
5566b478
MS
1838/* Similar to `build_nt', except we build
1839 on the permanent_obstack, regardless. */
1840
1841tree
1842build_min_nt VPROTO((enum tree_code code, ...))
1843{
1844#ifndef __STDC__
1845 enum tree_code code;
1846#endif
1847 register struct obstack *ambient_obstack = expression_obstack;
1848 va_list p;
1849 register tree t;
1850 register int length;
1851 register int i;
1852
1853 VA_START (p, code);
1854
1855#ifndef __STDC__
1856 code = va_arg (p, enum tree_code);
1857#endif
1858
1859 expression_obstack = &permanent_obstack;
1860
1861 t = make_node (code);
1862 length = tree_code_length[(int) code];
1863 TREE_COMPLEXITY (t) = lineno;
1864
1865 for (i = 0; i < length; i++)
1866 {
1867 tree x = va_arg (p, tree);
1868 TREE_OPERAND (t, i) = copy_to_permanent (x);
1869 }
1870
1871 va_end (p);
1872 expression_obstack = ambient_obstack;
1873 return t;
1874}
1875
1876/* Similar to `build', except we build
1877 on the permanent_obstack, regardless. */
1878
1879tree
1880build_min VPROTO((enum tree_code code, tree tt, ...))
1881{
1882#ifndef __STDC__
1883 enum tree_code code;
1884 tree tt;
1885#endif
1886 register struct obstack *ambient_obstack = expression_obstack;
1887 va_list p;
1888 register tree t;
1889 register int length;
1890 register int i;
1891
1892 VA_START (p, tt);
1893
1894#ifndef __STDC__
1895 code = va_arg (p, enum tree_code);
1896 tt = va_arg (p, tree);
1897#endif
1898
1899 expression_obstack = &permanent_obstack;
1900
1901 t = make_node (code);
1902 length = tree_code_length[(int) code];
1903 TREE_TYPE (t) = tt;
1904 TREE_COMPLEXITY (t) = lineno;
1905
1906 for (i = 0; i < length; i++)
1907 {
1908 tree x = va_arg (p, tree);
1909 TREE_OPERAND (t, i) = copy_to_permanent (x);
1910 }
1911
1912 va_end (p);
1913 expression_obstack = ambient_obstack;
1914 return t;
1915}
1916
1917/* Same as `tree_cons' but make a permanent object. */
1918
1919tree
1920min_tree_cons (purpose, value, chain)
1921 tree purpose, value, chain;
1922{
1923 register tree node;
1924 register struct obstack *ambient_obstack = current_obstack;
1925 current_obstack = &permanent_obstack;
1926
fc378698
MS
1927 node = tree_cons (copy_to_permanent (purpose),
1928 copy_to_permanent (value), chain);
5566b478
MS
1929 current_obstack = ambient_obstack;
1930 return node;
1931}
1932
1933tree
1934get_type_decl (t)
1935 tree t;
1936{
5566b478
MS
1937 if (TREE_CODE (t) == TYPE_DECL)
1938 return t;
1939 if (TREE_CODE_CLASS (TREE_CODE (t)) == 't')
1940 return TYPE_STUB_DECL (t);
1941
1942 my_friendly_abort (42);
4e1e2064
MH
1943
1944 /* Stop compiler from complaining control reaches end of non-void function. */
1945 return 0;
5566b478
MS
1946}
1947
1948int
1949can_free (obstack, t)
1950 struct obstack *obstack;
1951 tree t;
1952{
a703fb38 1953 int size = 0;
5566b478
MS
1954
1955 if (TREE_CODE (t) == TREE_VEC)
1956 size = (TREE_VEC_LENGTH (t)-1) * sizeof (tree) + sizeof (struct tree_vec);
1957 else
1958 my_friendly_abort (42);
1959
1960#define ROUND(x) ((x + obstack_alignment_mask (obstack)) \
1961 & ~ obstack_alignment_mask (obstack))
1962 if ((char *)t + ROUND (size) == obstack_next_free (obstack))
1963 return 1;
1964#undef ROUND
1965
1966 return 0;
1967}
1968
1969/* Return first vector element whose BINFO_TYPE is ELEM.
934c6b13 1970 Return 0 if ELEM is not in VEC. VEC may be NULL_TREE. */
5566b478
MS
1971
1972tree
1973vec_binfo_member (elem, vec)
1974 tree elem, vec;
1975{
1976 int i;
934c6b13
MS
1977
1978 if (vec)
1979 for (i = 0; i < TREE_VEC_LENGTH (vec); ++i)
e92cc029 1980 if (comptypes (elem, BINFO_TYPE (TREE_VEC_ELT (vec, i)), 1))
934c6b13
MS
1981 return TREE_VEC_ELT (vec, i);
1982
5566b478
MS
1983 return NULL_TREE;
1984}
e76a2646
MS
1985
1986/* Kludge around the fact that DECL_CONTEXT for virtual functions returns
1987 the wrong thing for decl_function_context. Hopefully the uses in the
1988 backend won't matter, since we don't need a static chain for local class
1989 methods. FIXME! */
1990
1991tree
1992hack_decl_function_context (decl)
1993 tree decl;
1994{
1995 if (TREE_CODE (decl) == FUNCTION_DECL && DECL_FUNCTION_MEMBER_P (decl))
1996 return decl_function_context (TYPE_MAIN_DECL (DECL_CLASS_CONTEXT (decl)));
1997 return decl_function_context (decl);
1998}
67d743fe
MS
1999
2000/* Return truthvalue of whether T1 is the same tree structure as T2.
2001 Return 1 if they are the same.
2002 Return 0 if they are understandably different.
2003 Return -1 if either contains tree structure not understood by
2004 this function. */
2005
2006int
2007cp_tree_equal (t1, t2)
2008 tree t1, t2;
2009{
2010 register enum tree_code code1, code2;
2011 int cmp;
2012
2013 if (t1 == t2)
2014 return 1;
2015 if (t1 == 0 || t2 == 0)
2016 return 0;
2017
2018 code1 = TREE_CODE (t1);
2019 code2 = TREE_CODE (t2);
2020
2021 if (code1 == NOP_EXPR || code1 == CONVERT_EXPR || code1 == NON_LVALUE_EXPR)
a703fb38
KG
2022 {
2023 if (code2 == NOP_EXPR || code2 == CONVERT_EXPR || code2 == NON_LVALUE_EXPR)
2024 return cp_tree_equal (TREE_OPERAND (t1, 0), TREE_OPERAND (t2, 0));
2025 else
2026 return cp_tree_equal (TREE_OPERAND (t1, 0), t2);
2027 }
67d743fe
MS
2028 else if (code2 == NOP_EXPR || code2 == CONVERT_EXPR
2029 || code2 == NON_LVALUE_EXPR)
2030 return cp_tree_equal (t1, TREE_OPERAND (t2, 0));
2031
2032 if (code1 != code2)
2033 return 0;
2034
2035 switch (code1)
2036 {
2037 case INTEGER_CST:
2038 return TREE_INT_CST_LOW (t1) == TREE_INT_CST_LOW (t2)
2039 && TREE_INT_CST_HIGH (t1) == TREE_INT_CST_HIGH (t2);
2040
2041 case REAL_CST:
2042 return REAL_VALUES_EQUAL (TREE_REAL_CST (t1), TREE_REAL_CST (t2));
2043
2044 case STRING_CST:
2045 return TREE_STRING_LENGTH (t1) == TREE_STRING_LENGTH (t2)
2046 && !bcmp (TREE_STRING_POINTER (t1), TREE_STRING_POINTER (t2),
2047 TREE_STRING_LENGTH (t1));
2048
2049 case CONSTRUCTOR:
2050 abort ();
2051
2052 case SAVE_EXPR:
2053 return cp_tree_equal (TREE_OPERAND (t1, 0), TREE_OPERAND (t2, 0));
2054
2055 case CALL_EXPR:
2056 cmp = cp_tree_equal (TREE_OPERAND (t1, 0), TREE_OPERAND (t2, 0));
2057 if (cmp <= 0)
2058 return cmp;
2059 return simple_cst_list_equal (TREE_OPERAND (t1, 1), TREE_OPERAND (t2, 1));
2060
2061 case TARGET_EXPR:
2062 /* Special case: if either target is an unallocated VAR_DECL,
2063 it means that it's going to be unified with whatever the
2064 TARGET_EXPR is really supposed to initialize, so treat it
2065 as being equivalent to anything. */
2066 if ((TREE_CODE (TREE_OPERAND (t1, 0)) == VAR_DECL
2067 && DECL_NAME (TREE_OPERAND (t1, 0)) == NULL_TREE
2068 && DECL_RTL (TREE_OPERAND (t1, 0)) == 0)
2069 || (TREE_CODE (TREE_OPERAND (t2, 0)) == VAR_DECL
2070 && DECL_NAME (TREE_OPERAND (t2, 0)) == NULL_TREE
2071 && DECL_RTL (TREE_OPERAND (t2, 0)) == 0))
2072 cmp = 1;
2073 else
2074 cmp = cp_tree_equal (TREE_OPERAND (t1, 0), TREE_OPERAND (t2, 0));
2075 if (cmp <= 0)
2076 return cmp;
2077 return cp_tree_equal (TREE_OPERAND (t1, 1), TREE_OPERAND (t2, 1));
2078
2079 case WITH_CLEANUP_EXPR:
2080 cmp = cp_tree_equal (TREE_OPERAND (t1, 0), TREE_OPERAND (t2, 0));
2081 if (cmp <= 0)
2082 return cmp;
2083 return cp_tree_equal (TREE_OPERAND (t1, 2), TREE_OPERAND (t1, 2));
2084
2085 case COMPONENT_REF:
2086 if (TREE_OPERAND (t1, 1) == TREE_OPERAND (t2, 1))
2087 return cp_tree_equal (TREE_OPERAND (t1, 0), TREE_OPERAND (t2, 0));
2088 return 0;
2089
2090 case VAR_DECL:
2091 case PARM_DECL:
2092 case CONST_DECL:
2093 case FUNCTION_DECL:
2094 return 0;
2095
f84b4be9
JM
2096 case TEMPLATE_PARM_INDEX:
2097 return TEMPLATE_PARM_IDX (t1) == TEMPLATE_PARM_IDX (t2)
2098 && TEMPLATE_PARM_LEVEL (t1) == TEMPLATE_PARM_LEVEL (t2);
67d743fe
MS
2099
2100 case SIZEOF_EXPR:
abff8e06 2101 case ALIGNOF_EXPR:
67d743fe
MS
2102 if (TREE_CODE (TREE_OPERAND (t1, 0)) != TREE_CODE (TREE_OPERAND (t2, 0)))
2103 return 0;
2104 if (TREE_CODE_CLASS (TREE_CODE (TREE_OPERAND (t1, 0))) == 't')
2105 return comptypes (TREE_OPERAND (t1, 0), TREE_OPERAND (t2, 0), 1);
2106 break;
7f85441b
KG
2107
2108 default:
2109 break;
67d743fe
MS
2110 }
2111
2112 switch (TREE_CODE_CLASS (code1))
2113 {
2114 int i;
2115 case '1':
2116 case '2':
2117 case '<':
2118 case 'e':
2119 case 'r':
2120 case 's':
2121 cmp = 1;
2122 for (i=0; i<tree_code_length[(int) code1]; ++i)
2123 {
2124 cmp = cp_tree_equal (TREE_OPERAND (t1, i), TREE_OPERAND (t2, i));
2125 if (cmp <= 0)
2126 return cmp;
2127 }
2128 return cmp;
2129 }
2130
2131 return -1;
2132}
73aad9b9
JM
2133
2134/* Similar to make_tree_vec, but build on a temporary obstack. */
2135
2136tree
2137make_temp_vec (len)
2138 int len;
2139{
2140 register tree node;
e66d884e
JM
2141 register struct obstack *ambient_obstack = current_obstack;
2142 current_obstack = expression_obstack;
73aad9b9 2143 node = make_tree_vec (len);
e66d884e 2144 current_obstack = ambient_obstack;
73aad9b9
JM
2145 return node;
2146}
d11ad92e 2147
5ffe581d
JM
2148/* Build a wrapper around some pointer PTR so we can use it as a tree. */
2149
2150tree
2151build_ptr_wrapper (ptr)
2152 void *ptr;
2153{
2154 tree t = make_node (WRAPPER);
2155 WRAPPER_PTR (t) = ptr;
2156 return t;
2157}
2158
2159/* Same, but on the expression_obstack. */
2160
2161tree
2162build_expr_ptr_wrapper (ptr)
2163 void *ptr;
2164{
2165 tree t;
2166 push_expression_obstack ();
2167 t = build_ptr_wrapper (ptr);
2168 pop_obstacks ();
2169 return t;
2170}
2171
2172/* Build a wrapper around some integer I so we can use it as a tree. */
2173
2174tree
2175build_int_wrapper (i)
2176 int i;
2177{
2178 tree t = make_node (WRAPPER);
2179 WRAPPER_INT (t) = i;
2180 return t;
2181}
2182
e66d884e
JM
2183void
2184push_expression_obstack ()
2185{
2186 push_obstacks_nochange ();
2187 current_obstack = expression_obstack;
2188}
2189
d11ad92e
MS
2190/* The type of ARG when used as an lvalue. */
2191
2192tree
2193lvalue_type (arg)
2194 tree arg;
2195{
2196 return cp_build_type_variant
2197 (TREE_TYPE (arg), TREE_READONLY (arg), TREE_THIS_VOLATILE (arg));
2198}
2199
2200/* The type of ARG for printing error messages; denote lvalues with
2201 reference types. */
2202
2203tree
2204error_type (arg)
2205 tree arg;
2206{
2207 tree type = TREE_TYPE (arg);
2208 if (TREE_CODE (type) == ARRAY_TYPE)
2209 ;
2210 else if (real_lvalue_p (arg))
2211 type = build_reference_type (lvalue_type (arg));
2212 else if (IS_AGGR_TYPE (type))
2213 type = lvalue_type (arg);
2214
2215 return type;
2216}
eb66be0e
MS
2217
2218/* Does FUNCTION use a variable-length argument list? */
2219
2220int
2221varargs_function_p (function)
2222 tree function;
2223{
2224 tree parm = TYPE_ARG_TYPES (TREE_TYPE (function));
2225 for (; parm; parm = TREE_CHAIN (parm))
2226 if (TREE_VALUE (parm) == void_type_node)
2227 return 0;
2228 return 1;
2229}
f94ae2f5
JM
2230
2231/* Returns 1 if decl is a member of a class. */
2232
2233int
2234member_p (decl)
2235 tree decl;
2236{
2237 tree ctx = DECL_CONTEXT (decl);
2238 return (ctx && TREE_CODE_CLASS (TREE_CODE (ctx)) == 't');
2239}
This page took 0.522747 seconds and 5 git commands to generate.