c-common.c: Include c-common.h, not c-lex.h or c-tree.h.
[gcc.git] / gcc / cp / rtti.c
1 /* RunTime Type Identification
2 Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000
3 Free Software Foundation, Inc.
4 Mostly written by Jason Merrill (jason@cygnus.com).
5
6 This file is part of GNU CC.
7
8 GNU CC is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2, or (at your option)
11 any later version.
12
13 GNU CC is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with GNU CC; see the file COPYING. If not, write to
20 the Free Software Foundation, 59 Temple Place - Suite 330,
21 Boston, MA 02111-1307, USA. */
22
23
24 #include "config.h"
25 #include "system.h"
26 #include "tree.h"
27 #include "cp-tree.h"
28 #include "flags.h"
29 #include "output.h"
30 #include "assert.h"
31 #include "toplev.h"
32
33 #ifndef INT_TYPE_SIZE
34 #define INT_TYPE_SIZE BITS_PER_WORD
35 #endif
36
37 /* Accessors for the type_info objects. We need to remember several things
38 about each of the type_info types. The global tree nodes such as
39 bltn_desc_type_node are TREE_LISTs, and these macros are used to access
40 the required information. */
41 /* The RECORD_TYPE of a type_info derived class. */
42 #define TINFO_PSEUDO_TYPE(NODE) TREE_TYPE (NODE)
43 /* The VAR_DECL of the vtable for the type_info derived class. */
44 #define TINFO_VTABLE_DECL(NODE) TREE_VALUE (NODE)
45
46 extern struct obstack permanent_obstack;
47
48 static tree build_headof_sub PARAMS((tree));
49 static tree build_headof PARAMS((tree));
50 static tree get_tinfo_var PARAMS((tree));
51 static tree ifnonnull PARAMS((tree, tree));
52 static tree tinfo_name PARAMS((tree));
53 static tree get_base_offset PARAMS((tree, tree));
54 static tree build_dynamic_cast_1 PARAMS((tree, tree));
55 static void expand_si_desc PARAMS((tree, tree));
56 static void expand_class_desc PARAMS((tree, tree));
57 static void expand_attr_desc PARAMS((tree, tree));
58 static void expand_ptr_desc PARAMS((tree, tree));
59 static void expand_generic_desc PARAMS((tree, tree, const char *));
60 static tree throw_bad_cast PARAMS((void));
61 static tree throw_bad_typeid PARAMS((void));
62 static tree get_tinfo_decl_dynamic PARAMS((tree));
63 static tree tinfo_from_decl PARAMS((tree));
64 static int qualifier_flags PARAMS((tree));
65 static int target_incomplete_p PARAMS((tree));
66 static tree tinfo_base_init PARAMS((tree, tree));
67 static tree generic_initializer PARAMS((tree, tree));
68 static tree ptr_initializer PARAMS((tree, tree, int *));
69 static tree ptm_initializer PARAMS((tree, tree, int *));
70 static tree dfs_class_hint_mark PARAMS ((tree, void *));
71 static tree dfs_class_hint_unmark PARAMS ((tree, void *));
72 static int class_hint_flags PARAMS((tree));
73 static tree class_initializer PARAMS((tree, tree, tree));
74 static tree synthesize_tinfo_var PARAMS((tree, tree));
75 static tree create_real_tinfo_var PARAMS((tree, tree, tree, int));
76 static tree create_pseudo_type_info PARAMS((const char *, int, ...));
77 static tree get_vmi_pseudo_type_info PARAMS((int));
78 static void create_tinfo_types PARAMS((void));
79
80 static int doing_runtime = 0;
81 \f
82 void
83 init_rtti_processing ()
84 {
85 if (flag_honor_std)
86 push_namespace (get_identifier ("std"));
87 type_info_type_node = xref_tag
88 (class_type_node, get_identifier ("type_info"), 1);
89 if (flag_honor_std)
90 pop_namespace ();
91 if (!new_abi_rtti_p ())
92 {
93 tinfo_decl_id = get_identifier ("__tf");
94 tinfo_decl_type = build_function_type
95 (build_reference_type
96 (build_qualified_type
97 (type_info_type_node, TYPE_QUAL_CONST)),
98 void_list_node);
99 tinfo_var_id = get_identifier ("__ti");
100 }
101 else
102 {
103 /* FIXME: These identifier prefixes are not set in stone yet. */
104 tinfo_decl_id = get_identifier ("__ti");
105 tinfo_var_id = get_identifier ("__tn");
106 tinfo_decl_type = build_qualified_type
107 (type_info_type_node, TYPE_QUAL_CONST);
108 }
109 }
110
111 /* Given a pointer to an object with at least one virtual table
112 pointer somewhere, return a pointer to a possible sub-object that
113 has a virtual table pointer in it that is the vtable parent for
114 that sub-object. */
115
116 static tree
117 build_headof_sub (exp)
118 tree exp;
119 {
120 tree type = TREE_TYPE (TREE_TYPE (exp));
121 tree basetype = CLASSTYPE_RTTI (type);
122 tree binfo = get_binfo (basetype, type, 0);
123
124 exp = convert_pointer_to_real (binfo, exp);
125 return exp;
126 }
127
128 /* Given the expression EXP of type `class *', return the head of the
129 object pointed to by EXP with type cv void*, if the class has any
130 virtual functions (TYPE_POLYMORPHIC_P), else just return the
131 expression. */
132
133 static tree
134 build_headof (exp)
135 tree exp;
136 {
137 tree type = TREE_TYPE (exp);
138 tree aref;
139 tree offset;
140 tree index;
141
142 my_friendly_assert (TREE_CODE (type) == POINTER_TYPE, 20000112);
143 type = TREE_TYPE (type);
144
145 if (!TYPE_POLYMORPHIC_P (type))
146 return exp;
147 if (CLASSTYPE_COM_INTERFACE (type))
148 {
149 cp_error ("RTTI not supported for COM interface type `%T'", type);
150 return error_mark_node;
151 }
152
153 /* If we don't have rtti stuff, get to a sub-object that does. */
154 if (!CLASSTYPE_VFIELDS (TREE_TYPE (TREE_TYPE (exp))))
155 exp = build_headof_sub (exp);
156
157 /* We use this a couple of times below, protect it. */
158 exp = save_expr (exp);
159
160 /* Under the new ABI, the offset-to-top field is at index -2 from
161 the vptr. */
162 if (new_abi_rtti_p ())
163 index = build_int_2 (-2, -1);
164 /* But under the old ABI, it is at offset zero. */
165 else
166 index = integer_zero_node;
167
168 aref = build_vtbl_ref (build_indirect_ref (exp, NULL_PTR), index);
169
170 if (flag_vtable_thunks)
171 offset = aref;
172 else
173 offset = build_component_ref (aref, delta_identifier, NULL_TREE, 0);
174
175 type = build_qualified_type (ptr_type_node,
176 CP_TYPE_QUALS (TREE_TYPE (exp)));
177 return build (PLUS_EXPR, type, exp,
178 cp_convert (ptrdiff_type_node, offset));
179 }
180
181 /* Get a bad_cast node for the program to throw...
182
183 See libstdc++/exception.cc for __throw_bad_cast */
184
185 static tree
186 throw_bad_cast ()
187 {
188 tree fn = get_identifier ("__throw_bad_cast");
189 if (IDENTIFIER_GLOBAL_VALUE (fn))
190 fn = IDENTIFIER_GLOBAL_VALUE (fn);
191 else
192 fn = push_throw_library_fn (fn, build_function_type (ptr_type_node,
193 void_list_node));
194
195 return build_call (fn, NULL_TREE);
196 }
197
198 static tree
199 throw_bad_typeid ()
200 {
201 tree fn = get_identifier ("__throw_bad_typeid");
202 if (IDENTIFIER_GLOBAL_VALUE (fn))
203 fn = IDENTIFIER_GLOBAL_VALUE (fn);
204 else
205 {
206 tree t = build_qualified_type (type_info_type_node, TYPE_QUAL_CONST);
207 t = build_function_type (build_reference_type (t), void_list_node);
208 fn = push_throw_library_fn (fn, t);
209 }
210
211 return build_call (fn, NULL_TREE);
212 }
213 \f
214 /* Return a pointer to type_info function associated with the expression EXP.
215 If EXP is a reference to a polymorphic class, return the dynamic type;
216 otherwise return the static type of the expression. */
217
218 static tree
219 get_tinfo_decl_dynamic (exp)
220 tree exp;
221 {
222 tree type;
223
224 if (exp == error_mark_node)
225 return error_mark_node;
226
227 type = TREE_TYPE (exp);
228
229 /* peel back references, so they match. */
230 if (TREE_CODE (type) == REFERENCE_TYPE)
231 type = TREE_TYPE (type);
232
233 /* Peel off cv qualifiers. */
234 type = TYPE_MAIN_VARIANT (type);
235
236 if (!VOID_TYPE_P (type))
237 type = complete_type_or_else (type, exp);
238
239 if (!type)
240 return error_mark_node;
241
242 /* If exp is a reference to polymorphic type, get the real type_info. */
243 if (TYPE_POLYMORPHIC_P (type) && ! resolves_to_fixed_type_p (exp, 0))
244 {
245 /* build reference to type_info from vtable. */
246 tree t;
247 tree index;
248
249 if (! flag_rtti)
250 error ("taking dynamic typeid of object with -fno-rtti");
251 if (CLASSTYPE_COM_INTERFACE (type))
252 {
253 cp_error ("RTTI not supported for COM interface type `%T'", type);
254 return error_mark_node;
255 }
256
257 /* If we don't have rtti stuff, get to a sub-object that does. */
258 if (! CLASSTYPE_VFIELDS (type))
259 {
260 exp = build_unary_op (ADDR_EXPR, exp, 0);
261 exp = build_headof_sub (exp);
262 exp = build_indirect_ref (exp, NULL_PTR);
263 }
264
265 /* The RTTI information is always in the vtable, but it's at
266 different indices depending on the ABI. */
267 if (new_abi_rtti_p ())
268 index = minus_one_node;
269 else if (flag_vtable_thunks)
270 index = integer_one_node;
271 else
272 index = integer_zero_node;
273 t = build_vfn_ref ((tree *) 0, exp, index);
274 TREE_TYPE (t) = build_pointer_type (tinfo_decl_type);
275 return t;
276 }
277
278 /* otherwise return the type_info for the static type of the expr. */
279 exp = get_tinfo_decl (TYPE_MAIN_VARIANT (type));
280 return build_unary_op (ADDR_EXPR, exp, 0);
281 }
282
283 tree
284 build_typeid (exp)
285 tree exp;
286 {
287 tree cond = NULL_TREE;
288 int nonnull = 0;
289
290 if (! flag_rtti)
291 {
292 error ("cannot use typeid with -fno-rtti");
293 return error_mark_node;
294 }
295
296 if (!COMPLETE_TYPE_P (type_info_type_node))
297 {
298 error ("must #include <typeinfo> before using typeid");
299 return error_mark_node;
300 }
301
302 if (processing_template_decl)
303 return build_min_nt (TYPEID_EXPR, exp);
304
305 if (TREE_CODE (exp) == INDIRECT_REF
306 && TREE_CODE (TREE_TYPE (TREE_OPERAND (exp, 0))) == POINTER_TYPE
307 && TYPE_POLYMORPHIC_P (TREE_TYPE (exp))
308 && ! resolves_to_fixed_type_p (exp, &nonnull)
309 && ! nonnull)
310 {
311 exp = stabilize_reference (exp);
312 cond = cp_convert (boolean_type_node, TREE_OPERAND (exp, 0));
313 }
314
315 exp = get_tinfo_decl_dynamic (exp);
316
317 if (exp == error_mark_node)
318 return error_mark_node;
319
320 exp = tinfo_from_decl (exp);
321
322 if (cond)
323 {
324 tree bad = throw_bad_typeid ();
325
326 exp = build (COND_EXPR, TREE_TYPE (exp), cond, exp, bad);
327 }
328
329 return convert_from_reference (exp);
330 }
331
332 static tree
333 get_tinfo_var (type)
334 tree type;
335 {
336 tree tname = build_overload_with_type (tinfo_var_id, type);
337 tree arrtype;
338 int size;
339
340 my_friendly_assert (!new_abi_rtti_p (), 20000118);
341 if (IDENTIFIER_GLOBAL_VALUE (tname))
342 return IDENTIFIER_GLOBAL_VALUE (tname);
343
344 /* Figure out how much space we need to allocate for the type_info object.
345 If our struct layout or the type_info classes are changed, this will
346 need to be modified. */
347 if (TYPE_QUALS (type) != TYPE_UNQUALIFIED)
348 size = 3 * POINTER_SIZE + INT_TYPE_SIZE;
349 else if (TREE_CODE (type) == POINTER_TYPE
350 && ! (TREE_CODE (TREE_TYPE (type)) == OFFSET_TYPE
351 || TREE_CODE (TREE_TYPE (type)) == METHOD_TYPE))
352 size = 3 * POINTER_SIZE;
353 else if (IS_AGGR_TYPE (type))
354 {
355 if (CLASSTYPE_N_BASECLASSES (type) == 0)
356 size = 2 * POINTER_SIZE;
357 else if (! TYPE_BASE_CONVS_MAY_REQUIRE_CODE_P (type)
358 && (TREE_VIA_PUBLIC
359 (TREE_VEC_ELT (TYPE_BINFO_BASETYPES (type), 0))))
360 size = 3 * POINTER_SIZE;
361 else
362 size = 3 * POINTER_SIZE + TYPE_PRECISION (sizetype);
363 }
364 else
365 size = 2 * POINTER_SIZE;
366
367 /* The type for a character array of the appropriate size. */
368 arrtype = build_cplus_array_type
369 (unsigned_char_type_node,
370 build_index_type (size_int (size / BITS_PER_UNIT - 1)));
371
372 return declare_global_var (tname, arrtype);
373 }
374
375 /* Generate the NTBS name of a type. */
376 static tree
377 tinfo_name (type)
378 tree type;
379 {
380 const char *name;
381 tree name_string;
382
383 if (flag_new_abi)
384 name = mangle_type_string (type);
385 else
386 name = build_overload_name (type, 1, 1);
387 name_string = combine_strings (build_string (strlen (name) + 1, name));
388 return name_string;
389 }
390
391 /* Returns a decl for a function or variable which can be used to obtain a
392 type_info object for TYPE. The old-abi uses functions, the new-abi
393 uses the type_info object directly. You can take the address of the
394 returned decl, to save the decl. To use the decl call
395 tinfo_from_decl. You must arrange that the decl is mark_used, if
396 actually use it --- decls in vtables are only used if the vtable is
397 output. */
398
399 tree
400 get_tinfo_decl (type)
401 tree type;
402 {
403 tree name;
404 tree d;
405
406 if (TREE_CODE (type) == OFFSET_TYPE)
407 type = TREE_TYPE (type);
408 if (TREE_CODE (type) == METHOD_TYPE)
409 type = build_function_type (TREE_TYPE (type),
410 TREE_CHAIN (TYPE_ARG_TYPES (type)));
411
412 if (flag_new_abi)
413 name = mangle_typeinfo_for_type (type);
414 else
415 name = build_overload_with_type (tinfo_decl_id, type);
416
417 d = IDENTIFIER_GLOBAL_VALUE (name);
418 if (d)
419 /* OK */;
420 else if (!new_abi_rtti_p ())
421 {
422 /* The tinfo decl is a function returning a reference to the
423 type_info object. */
424 d = push_library_fn (name, tinfo_decl_type);
425 DECL_NOT_REALLY_EXTERN (d) = 1;
426 SET_DECL_TINFO_FN_P (d);
427 TREE_TYPE (name) = type;
428 defer_fn (d);
429 }
430 else
431 {
432 /* The tinfo decl is the type_info object itself. We make all
433 tinfo objects look as type_info, even though they will end up
434 being a subclass of that when emitted. This means the we'll
435 erroneously think we know the dynamic type -- be careful in the
436 runtime. */
437 d = build_lang_decl (VAR_DECL, name, tinfo_decl_type);
438
439 DECL_ARTIFICIAL (d) = 1;
440 DECL_ALIGN (d) = TYPE_ALIGN (ptr_type_node);
441 DECL_USER_ALIGN (d) = 0;
442 TREE_READONLY (d) = 1;
443 TREE_STATIC (d) = 1;
444 DECL_EXTERNAL (d) = 1;
445 TREE_PUBLIC (d) = 1;
446 comdat_linkage (d);
447 DECL_ASSEMBLER_NAME (d) = DECL_NAME (d);
448 cp_finish_decl (d, NULL_TREE, NULL_TREE, 0);
449
450 pushdecl_top_level (d);
451 /* Remember the type it is for. */
452 TREE_TYPE (name) = type;
453 TREE_USED (name) = 1;
454 }
455 return d;
456 }
457
458 /* Given an expr produced by get_tinfo_decl, return an expr which
459 produces a reference to the type_info object. */
460
461 static tree
462 tinfo_from_decl (expr)
463 tree expr;
464 {
465 tree t;
466
467 if (!new_abi_rtti_p ())
468 t = build_call (expr, NULL_TREE);
469 else if (TREE_CODE (TREE_TYPE (expr)) == POINTER_TYPE)
470 t = build_indirect_ref (expr, NULL);
471 else
472 t = expr;
473
474 return t;
475 }
476
477 tree
478 get_typeid_1 (type)
479 tree type;
480 {
481 tree t;
482
483 t = get_tinfo_decl (type);
484 t = tinfo_from_decl (t);
485 return convert_from_reference (t);
486 }
487
488 /* Return the type_info object for TYPE. */
489
490 tree
491 get_typeid (type)
492 tree type;
493 {
494 if (type == error_mark_node)
495 return error_mark_node;
496
497 if (!COMPLETE_TYPE_P (type_info_type_node))
498 {
499 error ("must #include <typeinfo> before using typeid");
500 return error_mark_node;
501 }
502
503 if (processing_template_decl)
504 return build_min_nt (TYPEID_EXPR, type);
505
506 /* If the type of the type-id is a reference type, the result of the
507 typeid expression refers to a type_info object representing the
508 referenced type. */
509 if (TREE_CODE (type) == REFERENCE_TYPE)
510 type = TREE_TYPE (type);
511
512 /* The top-level cv-qualifiers of the lvalue expression or the type-id
513 that is the operand of typeid are always ignored. */
514 type = TYPE_MAIN_VARIANT (type);
515
516 if (!VOID_TYPE_P (type))
517 type = complete_type_or_else (type, NULL_TREE);
518
519 if (!type)
520 return error_mark_node;
521
522 return get_typeid_1 (type);
523 }
524
525 /* Check whether TEST is null before returning RESULT. If TEST is used in
526 RESULT, it must have previously had a save_expr applied to it. */
527
528 static tree
529 ifnonnull (test, result)
530 tree test, result;
531 {
532 return build (COND_EXPR, TREE_TYPE (result),
533 build (EQ_EXPR, boolean_type_node, test, integer_zero_node),
534 cp_convert (TREE_TYPE (result), integer_zero_node),
535 result);
536 }
537
538 /* Generate the constant expression describing where direct base BINFO
539 appears within the PARENT. How to interpret this expression depends on
540 details of the ABI, which the runtime must be aware of. */
541
542 static tree
543 get_base_offset (binfo, parent)
544 tree binfo;
545 tree parent;
546 {
547 if (! TREE_VIA_VIRTUAL (binfo))
548 return BINFO_OFFSET (binfo);
549 else if (! vbase_offsets_in_vtable_p ())
550 {
551 const char *name;
552 tree result;
553 tree field;
554
555 FORMAT_VBASE_NAME (name, BINFO_TYPE (binfo));
556 field = lookup_field (parent, get_identifier (name), 0, 0);
557 result = byte_position (field);
558
559 if (DECL_CONTEXT (field) != parent)
560 {
561 /* The vbase pointer might be in a non-virtual base of PARENT.
562 * Adjust for the offset of that base in PARENT. */
563 tree path;
564
565 get_base_distance (DECL_CONTEXT (field), parent, -1, &path);
566 result = build (PLUS_EXPR, TREE_TYPE (result),
567 result, BINFO_OFFSET (path));
568 result = fold (result);
569 }
570 return result;
571 }
572 else
573 /* Under the new ABI, we store the vtable offset at which
574 the virtual base offset can be found. */
575 return convert (sizetype,
576 BINFO_VPTR_FIELD (binfo_for_vbase (BINFO_TYPE (binfo),
577 parent)));
578
579 }
580
581 /* Execute a dynamic cast, as described in section 5.2.6 of the 9/93 working
582 paper. */
583
584 static tree
585 build_dynamic_cast_1 (type, expr)
586 tree type, expr;
587 {
588 enum tree_code tc = TREE_CODE (type);
589 tree exprtype = TREE_TYPE (expr);
590 tree dcast_fn;
591 tree old_expr = expr;
592 const char *errstr = NULL;
593
594 /* T shall be a pointer or reference to a complete class type, or
595 `pointer to cv void''. */
596 switch (tc)
597 {
598 case POINTER_TYPE:
599 if (TREE_CODE (TREE_TYPE (type)) == VOID_TYPE)
600 break;
601 case REFERENCE_TYPE:
602 if (! IS_AGGR_TYPE (TREE_TYPE (type)))
603 {
604 errstr = "target is not pointer or reference to class";
605 goto fail;
606 }
607 if (!COMPLETE_TYPE_P (complete_type (TREE_TYPE (type))))
608 {
609 errstr = "target is not pointer or reference to complete type";
610 goto fail;
611 }
612 break;
613
614 default:
615 errstr = "target is not pointer or reference";
616 goto fail;
617 }
618
619 if (TREE_CODE (expr) == OFFSET_REF)
620 {
621 expr = resolve_offset_ref (expr);
622 exprtype = TREE_TYPE (expr);
623 }
624
625 if (tc == POINTER_TYPE)
626 expr = convert_from_reference (expr);
627 else if (TREE_CODE (exprtype) != REFERENCE_TYPE)
628 {
629 /* Apply trivial conversion T -> T& for dereferenced ptrs. */
630 exprtype = build_reference_type (exprtype);
631 expr = convert_to_reference (exprtype, expr, CONV_IMPLICIT,
632 LOOKUP_NORMAL, NULL_TREE);
633 }
634
635 exprtype = TREE_TYPE (expr);
636
637 if (tc == POINTER_TYPE)
638 {
639 /* If T is a pointer type, v shall be an rvalue of a pointer to
640 complete class type, and the result is an rvalue of type T. */
641
642 if (TREE_CODE (exprtype) != POINTER_TYPE)
643 {
644 errstr = "source is not a pointer";
645 goto fail;
646 }
647 if (! IS_AGGR_TYPE (TREE_TYPE (exprtype)))
648 {
649 errstr = "source is not a pointer to class";
650 goto fail;
651 }
652 if (!COMPLETE_TYPE_P (complete_type (TREE_TYPE (exprtype))))
653 {
654 errstr = "source is a pointer to incomplete type";
655 goto fail;
656 }
657 }
658 else
659 {
660 /* T is a reference type, v shall be an lvalue of a complete class
661 type, and the result is an lvalue of the type referred to by T. */
662
663 if (! IS_AGGR_TYPE (TREE_TYPE (exprtype)))
664 {
665 errstr = "source is not of class type";
666 goto fail;
667 }
668 if (!COMPLETE_TYPE_P (complete_type (TREE_TYPE (exprtype))))
669 {
670 errstr = "source is of incomplete class type";
671 goto fail;
672 }
673
674 }
675
676 /* The dynamic_cast operator shall not cast away constness. */
677 if (!at_least_as_qualified_p (TREE_TYPE (type),
678 TREE_TYPE (exprtype)))
679 {
680 errstr = "conversion casts away constness";
681 goto fail;
682 }
683
684 /* If *type is an unambiguous accessible base class of *exprtype,
685 convert statically. */
686 {
687 int distance;
688 tree path;
689
690 distance = get_base_distance (TREE_TYPE (type), TREE_TYPE (exprtype), 1,
691 &path);
692
693 if (distance == -2)
694 {
695 cp_error ("dynamic_cast from `%T' to ambiguous base class `%T'",
696 TREE_TYPE (exprtype), TREE_TYPE (type));
697 return error_mark_node;
698 }
699 if (distance == -3)
700 {
701 cp_error ("dynamic_cast from `%T' to private base class `%T'",
702 TREE_TYPE (exprtype), TREE_TYPE (type));
703 return error_mark_node;
704 }
705
706 if (distance >= 0)
707 {
708 expr = build_vbase_path (PLUS_EXPR, type, expr, path, 0);
709 if (TREE_CODE (exprtype) == POINTER_TYPE)
710 expr = non_lvalue (expr);
711 return expr;
712 }
713 }
714
715 /* Otherwise *exprtype must be a polymorphic class (have a vtbl). */
716 if (TYPE_POLYMORPHIC_P (TREE_TYPE (exprtype)))
717 {
718 tree expr1;
719 /* if TYPE is `void *', return pointer to complete object. */
720 if (tc == POINTER_TYPE && VOID_TYPE_P (TREE_TYPE (type)))
721 {
722 /* if b is an object, dynamic_cast<void *>(&b) == (void *)&b. */
723 if (TREE_CODE (expr) == ADDR_EXPR
724 && TREE_CODE (TREE_OPERAND (expr, 0)) == VAR_DECL
725 && TREE_CODE (TREE_TYPE (TREE_OPERAND (expr, 0))) == RECORD_TYPE)
726 return build1 (NOP_EXPR, type, expr);
727
728 /* Since expr is used twice below, save it. */
729 expr = save_expr (expr);
730
731 expr1 = build_headof (expr);
732 if (TREE_TYPE (expr1) != type)
733 expr1 = build1 (NOP_EXPR, type, expr1);
734 return ifnonnull (expr, expr1);
735 }
736 else
737 {
738 tree retval;
739 tree result, td2, td3, elems;
740 tree static_type, target_type, boff;
741
742 /* If we got here, we can't convert statically. Therefore,
743 dynamic_cast<D&>(b) (b an object) cannot succeed. */
744 if (tc == REFERENCE_TYPE)
745 {
746 if (TREE_CODE (old_expr) == VAR_DECL
747 && TREE_CODE (TREE_TYPE (old_expr)) == RECORD_TYPE)
748 {
749 tree expr = throw_bad_cast ();
750 cp_warning ("dynamic_cast of `%#D' to `%#T' can never succeed",
751 old_expr, type);
752 /* Bash it to the expected type. */
753 TREE_TYPE (expr) = type;
754 return expr;
755 }
756 }
757 /* Ditto for dynamic_cast<D*>(&b). */
758 else if (TREE_CODE (expr) == ADDR_EXPR)
759 {
760 tree op = TREE_OPERAND (expr, 0);
761 if (TREE_CODE (op) == VAR_DECL
762 && TREE_CODE (TREE_TYPE (op)) == RECORD_TYPE)
763 {
764 cp_warning ("dynamic_cast of `%#D' to `%#T' can never succeed",
765 op, type);
766 retval = build_int_2 (0, 0);
767 TREE_TYPE (retval) = type;
768 return retval;
769 }
770 }
771
772 target_type = TYPE_MAIN_VARIANT (TREE_TYPE (type));
773 static_type = TYPE_MAIN_VARIANT (TREE_TYPE (exprtype));
774 td2 = build_unary_op (ADDR_EXPR, get_tinfo_decl (target_type), 0);
775 td3 = build_unary_op (ADDR_EXPR, get_tinfo_decl (static_type), 0);
776
777 /* Determine how T and V are related. */
778 boff = get_dynamic_cast_base_type (static_type, target_type);
779
780 /* Since expr is used twice below, save it. */
781 expr = save_expr (expr);
782
783 expr1 = expr;
784 if (tc == REFERENCE_TYPE)
785 expr1 = build_unary_op (ADDR_EXPR, expr1, 0);
786
787 if (!new_abi_rtti_p ())
788 {
789 tree expr2 = build_headof (expr1);
790 tree td1 = expr;
791
792 if (tc == POINTER_TYPE)
793 td1 = build_indirect_ref (td1, NULL_PTR);
794 td1 = get_tinfo_decl_dynamic (td1);
795
796 elems = tree_cons
797 (NULL_TREE, td1, tree_cons
798 (NULL_TREE, td2, tree_cons
799 (NULL_TREE, boff, tree_cons
800 (NULL_TREE, expr2, tree_cons
801 (NULL_TREE, td3, tree_cons
802 (NULL_TREE, expr1, NULL_TREE))))));
803 }
804 else
805 elems = tree_cons
806 (NULL_TREE, expr1, tree_cons
807 (NULL_TREE, td3, tree_cons
808 (NULL_TREE, td2, tree_cons
809 (NULL_TREE, boff, NULL_TREE))));
810
811 dcast_fn = dynamic_cast_node;
812 if (!dcast_fn)
813 {
814 tree tmp;
815 tree tinfo_ptr;
816 tree ns = new_abi_rtti_p () ? abi_node : global_namespace;
817 const char *name;
818
819 push_nested_namespace (ns);
820 if (!new_abi_rtti_p ())
821 {
822 tinfo_ptr = build_pointer_type (tinfo_decl_type);
823 name = "__dynamic_cast_2";
824 tmp = tree_cons
825 (NULL_TREE, tinfo_ptr, tree_cons
826 (NULL_TREE, tinfo_ptr, tree_cons
827 (NULL_TREE, integer_type_node, tree_cons
828 (NULL_TREE, ptr_type_node, tree_cons
829 (NULL_TREE, tinfo_ptr, tree_cons
830 (NULL_TREE, ptr_type_node, void_list_node))))));
831 }
832 else
833 {
834 tinfo_ptr = xref_tag (class_type_node,
835 get_identifier ("__class_type_info"),
836 1);
837
838 tinfo_ptr = build_pointer_type
839 (build_qualified_type
840 (tinfo_ptr, TYPE_QUAL_CONST));
841 name = "__dynamic_cast";
842 tmp = tree_cons
843 (NULL_TREE, const_ptr_type_node, tree_cons
844 (NULL_TREE, tinfo_ptr, tree_cons
845 (NULL_TREE, tinfo_ptr, tree_cons
846 (NULL_TREE, ptrdiff_type_node, void_list_node))));
847 }
848 tmp = build_function_type (ptr_type_node, tmp);
849 if (new_abi_rtti_p ())
850 /* We want its name mangling. */
851 dcast_fn = build_cp_library_fn_ptr (name, tmp);
852 else
853 dcast_fn = build_library_fn_ptr (name, tmp);
854 pop_nested_namespace (ns);
855 dynamic_cast_node = dcast_fn;
856 }
857 result = build_call (dcast_fn, elems);
858
859 if (tc == REFERENCE_TYPE)
860 {
861 tree bad = throw_bad_cast ();
862
863 result = save_expr (result);
864 return build (COND_EXPR, type, result, result, bad);
865 }
866
867 /* Now back to the type we want from a void*. */
868 result = cp_convert (type, result);
869 return ifnonnull (expr, result);
870 }
871 }
872 else
873 errstr = "source type is not polymorphic";
874
875 fail:
876 cp_error ("cannot dynamic_cast `%E' (of type `%#T') to type `%#T' (%s)",
877 expr, exprtype, type, errstr);
878 return error_mark_node;
879 }
880
881 tree
882 build_dynamic_cast (type, expr)
883 tree type, expr;
884 {
885 if (type == error_mark_node || expr == error_mark_node)
886 return error_mark_node;
887
888 if (processing_template_decl)
889 return build_min (DYNAMIC_CAST_EXPR, type, expr);
890
891 return convert_from_reference (build_dynamic_cast_1 (type, expr));
892 }
893 \f
894 /* Build and initialize various sorts of descriptors. Every descriptor
895 node has a name associated with it (the name created by mangling).
896 For this reason, we use the identifier as our access to the __*_desc
897 nodes, instead of sticking them directly in the types. Otherwise we
898 would burden all built-in types (and pointer types) with slots that
899 we don't necessarily want to use.
900
901 For each descriptor we build, we build a variable that contains
902 the descriptor's information. When we need this info at runtime,
903 all we need is access to these variables.
904
905 Note: these constructors always return the address of the descriptor
906 info, since that is simplest for their mutual interaction. */
907
908 /* Build an initializer for a __si_type_info node. */
909
910 static void
911 expand_si_desc (tdecl, type)
912 tree tdecl;
913 tree type;
914 {
915 tree t, elems, fn;
916 tree name_string = tinfo_name (type);
917
918 type = BINFO_TYPE (TREE_VEC_ELT (TYPE_BINFO_BASETYPES (type), 0));
919 finish_expr_stmt (get_typeid_1 (type));
920 t = decay_conversion (get_tinfo_var (type));
921 elems = tree_cons
922 (NULL_TREE, decay_conversion (tdecl), tree_cons
923 (NULL_TREE, decay_conversion (name_string), tree_cons
924 (NULL_TREE, t, NULL_TREE)));
925
926 fn = get_identifier ("__rtti_si");
927 if (IDENTIFIER_GLOBAL_VALUE (fn))
928 fn = IDENTIFIER_GLOBAL_VALUE (fn);
929 else
930 {
931 tree tmp;
932 tmp = tree_cons
933 (NULL_TREE, ptr_type_node, tree_cons
934 (NULL_TREE, const_string_type_node, tree_cons
935 (NULL_TREE, build_pointer_type (type_info_type_node),
936 void_list_node)));
937 fn = push_void_library_fn (fn, tmp);
938 }
939
940 fn = build_call (fn, elems);
941 finish_expr_stmt (fn);
942 }
943
944 /* Build an initializer for a __class_type_info node. */
945
946 static void
947 expand_class_desc (tdecl, type)
948 tree tdecl;
949 tree type;
950 {
951 tree name_string;
952 tree fn, tmp;
953
954 int i = CLASSTYPE_N_BASECLASSES (type);
955 int base_cnt = 0;
956 tree binfos = TYPE_BINFO_BASETYPES (type);
957 tree base, elems, access, offset, isvir;
958 tree elt, elts = NULL_TREE;
959
960 if (base_desc_type_node == NULL_TREE)
961 {
962 tree fields [4];
963
964 /* A reasonably close approximation of __class_type_info::base_info */
965
966 base_desc_type_node = make_aggr_type (RECORD_TYPE);
967
968 /* Actually const __user_type_info * */
969 fields [0] = build_decl
970 (FIELD_DECL, NULL_TREE,
971 build_pointer_type (build_qualified_type
972 (type_info_type_node,
973 TYPE_QUAL_CONST)));
974 fields [1] = build_decl
975 (FIELD_DECL, NULL_TREE,
976 flag_new_abi ? intSI_type_node : unsigned_intSI_type_node);
977 DECL_BIT_FIELD (fields[1]) = 1;
978 DECL_SIZE (fields[1]) = bitsize_int (29);
979
980 fields [2] = build_decl (FIELD_DECL, NULL_TREE, boolean_type_node);
981 DECL_BIT_FIELD (fields[2]) = 1;
982 DECL_SIZE (fields[2]) = bitsize_one_node;
983
984 /* Actually enum access */
985 fields [3] = build_decl (FIELD_DECL, NULL_TREE, integer_type_node);
986 DECL_BIT_FIELD (fields[3]) = 1;
987 DECL_SIZE (fields[3]) = bitsize_int (2);
988
989 finish_builtin_type (base_desc_type_node, "__base_info", fields,
990 3, ptr_type_node);
991 }
992
993 while (--i >= 0)
994 {
995 tree binfo = TREE_VEC_ELT (binfos, i);
996
997 finish_expr_stmt (get_typeid_1 (BINFO_TYPE (binfo)));
998 base = decay_conversion (get_tinfo_var (BINFO_TYPE (binfo)));
999 offset = get_base_offset (binfo, type);
1000
1001 if (TREE_VIA_PUBLIC (binfo))
1002 access = access_public_node;
1003 else if (TREE_VIA_PROTECTED (binfo))
1004 access = access_protected_node;
1005 else
1006 access = access_private_node;
1007 if (TREE_VIA_VIRTUAL (binfo))
1008 isvir = boolean_true_node;
1009 else
1010 isvir = boolean_false_node;
1011
1012 elt = build
1013 (CONSTRUCTOR, base_desc_type_node, NULL_TREE, tree_cons
1014 (NULL_TREE, base, tree_cons
1015 (NULL_TREE, offset, tree_cons
1016 (NULL_TREE, isvir, tree_cons
1017 (NULL_TREE, access, NULL_TREE)))));
1018 TREE_HAS_CONSTRUCTOR (elt) = TREE_CONSTANT (elt) = TREE_STATIC (elt) = 1;
1019 elts = tree_cons (NULL_TREE, elt, elts);
1020 base_cnt++;
1021 }
1022
1023 name_string = tinfo_name (type);
1024
1025 {
1026 tree arrtype = build_array_type (base_desc_type_node, NULL_TREE);
1027 elts = build (CONSTRUCTOR, arrtype, NULL_TREE, elts);
1028 TREE_HAS_CONSTRUCTOR (elts) = TREE_CONSTANT (elts)
1029 = TREE_STATIC (elts) = 1;
1030 complete_array_type (arrtype, elts, 1);
1031 }
1032
1033 elems = tree_cons
1034 (NULL_TREE, decay_conversion (tdecl), tree_cons
1035 (NULL_TREE, decay_conversion (name_string), tree_cons
1036 (NULL_TREE, decay_conversion (elts), tree_cons
1037 (NULL_TREE, cp_convert (sizetype, build_int_2 (base_cnt, 0)),
1038 NULL_TREE))));
1039
1040 fn = get_identifier ("__rtti_class");
1041 if (IDENTIFIER_GLOBAL_VALUE (fn))
1042 fn = IDENTIFIER_GLOBAL_VALUE (fn);
1043 else
1044 {
1045 tmp = tree_cons
1046 (NULL_TREE, ptr_type_node, tree_cons
1047 (NULL_TREE, const_string_type_node, tree_cons
1048 (NULL_TREE, build_pointer_type (base_desc_type_node), tree_cons
1049 (NULL_TREE, sizetype, void_list_node))));
1050
1051 fn = push_void_library_fn (fn, tmp);
1052 }
1053
1054 fn = build_call (fn, elems);
1055 finish_expr_stmt (fn);
1056 }
1057
1058 /* Build an initializer for a __pointer_type_info node. */
1059
1060 static void
1061 expand_ptr_desc (tdecl, type)
1062 tree tdecl;
1063 tree type;
1064 {
1065 tree t, elems, fn;
1066 tree name_string = tinfo_name (type);
1067
1068 type = TREE_TYPE (type);
1069 finish_expr_stmt (get_typeid_1 (type));
1070 t = decay_conversion (get_tinfo_var (type));
1071 elems = tree_cons
1072 (NULL_TREE, decay_conversion (tdecl), tree_cons
1073 (NULL_TREE, decay_conversion (name_string), tree_cons
1074 (NULL_TREE, t, NULL_TREE)));
1075
1076 fn = get_identifier ("__rtti_ptr");
1077 if (IDENTIFIER_GLOBAL_VALUE (fn))
1078 fn = IDENTIFIER_GLOBAL_VALUE (fn);
1079 else
1080 {
1081 tree tmp;
1082 tmp = tree_cons
1083 (NULL_TREE, ptr_type_node, tree_cons
1084 (NULL_TREE, const_string_type_node, tree_cons
1085 (NULL_TREE, build_pointer_type (type_info_type_node),
1086 void_list_node)));
1087 fn = push_void_library_fn (fn, tmp);
1088 }
1089
1090 fn = build_call (fn, elems);
1091 finish_expr_stmt (fn);
1092 }
1093
1094 /* Build an initializer for a __attr_type_info node. */
1095
1096 static void
1097 expand_attr_desc (tdecl, type)
1098 tree tdecl;
1099 tree type;
1100 {
1101 tree elems, t, fn;
1102 tree name_string = tinfo_name (type);
1103 tree attrval = build_int_2 (TYPE_QUALS (type), 0);
1104
1105 finish_expr_stmt (get_typeid_1 (TYPE_MAIN_VARIANT (type)));
1106 t = decay_conversion (get_tinfo_var (TYPE_MAIN_VARIANT (type)));
1107 elems = tree_cons
1108 (NULL_TREE, decay_conversion (tdecl), tree_cons
1109 (NULL_TREE, decay_conversion (name_string), tree_cons
1110 (NULL_TREE, attrval, tree_cons (NULL_TREE, t, NULL_TREE))));
1111
1112 fn = get_identifier ("__rtti_attr");
1113 if (IDENTIFIER_GLOBAL_VALUE (fn))
1114 fn = IDENTIFIER_GLOBAL_VALUE (fn);
1115 else
1116 {
1117 tree tmp;
1118 tmp = tree_cons
1119 (NULL_TREE, ptr_type_node, tree_cons
1120 (NULL_TREE, const_string_type_node, tree_cons
1121 (NULL_TREE, integer_type_node, tree_cons
1122 (NULL_TREE, build_pointer_type (type_info_type_node),
1123 void_list_node))));
1124 fn = push_void_library_fn (fn, tmp);
1125 }
1126
1127 fn = build_call (fn, elems);
1128 finish_expr_stmt (fn);
1129 }
1130
1131 /* Build an initializer for a type_info node that just has a name. */
1132
1133 static void
1134 expand_generic_desc (tdecl, type, fnname)
1135 tree tdecl;
1136 tree type;
1137 const char *fnname;
1138 {
1139 tree name_string = tinfo_name (type);
1140 tree elems = tree_cons
1141 (NULL_TREE, decay_conversion (tdecl), tree_cons
1142 (NULL_TREE, decay_conversion (name_string), NULL_TREE));
1143
1144 tree fn = get_identifier (fnname);
1145 if (IDENTIFIER_GLOBAL_VALUE (fn))
1146 fn = IDENTIFIER_GLOBAL_VALUE (fn);
1147 else
1148 {
1149 tree tmp;
1150 tmp = tree_cons
1151 (NULL_TREE, ptr_type_node, tree_cons
1152 (NULL_TREE, const_string_type_node, void_list_node));
1153 fn = push_void_library_fn (fn, tmp);
1154 }
1155
1156 fn = build_call (fn, elems);
1157 finish_expr_stmt (fn);
1158 }
1159
1160 /* Generate the code for a type_info initialization function.
1161 Note that we take advantage of the passage
1162
1163 5.2.7 Type identification [expr.typeid]
1164
1165 Whether or not the destructor is called for the type_info object at the
1166 end of the program is unspecified.
1167
1168 and don't bother to arrange for these objects to be destroyed. It
1169 doesn't matter, anyway, since the destructors don't do anything.
1170
1171 This must only be called from toplevel (i.e. from finish_file)! */
1172
1173 void
1174 synthesize_tinfo_fn (fndecl)
1175 tree fndecl;
1176 {
1177 tree type = TREE_TYPE (DECL_NAME (fndecl));
1178 tree tmp, addr, tdecl;
1179 tree compound_stmt;
1180 tree if_stmt;
1181 tree then_clause;
1182
1183 my_friendly_assert (!new_abi_rtti_p (), 20000118);
1184 if (at_eof)
1185 {
1186 import_export_decl (fndecl);
1187 if (DECL_REALLY_EXTERN (fndecl))
1188 return;
1189 }
1190
1191 /* Declare the static typeinfo variable. */
1192 tdecl = get_tinfo_var (type);
1193 DECL_EXTERNAL (tdecl) = 0;
1194 TREE_STATIC (tdecl) = 1;
1195 DECL_COMMON (tdecl) = 1;
1196 TREE_USED (tdecl) = 1;
1197 DECL_ALIGN (tdecl) = TYPE_ALIGN (ptr_type_node);
1198 DECL_USER_ALIGN (tdecl) = 0;
1199 cp_finish_decl (tdecl, NULL_TREE, NULL_TREE, 0);
1200
1201 /* Begin processing the function. */
1202 start_function (NULL_TREE, fndecl, NULL_TREE,
1203 SF_DEFAULT | SF_PRE_PARSED);
1204 DECL_DEFER_OUTPUT (fndecl) = 1;
1205 store_parm_decls ();
1206 clear_last_expr ();
1207
1208 /* Begin the body of the function. */
1209 compound_stmt = begin_compound_stmt (/*has_no_scope=*/0);
1210
1211 /* For convenience, we save away the address of the static
1212 variable. */
1213 addr = decay_conversion (tdecl);
1214
1215 /* If the first word of the array (the vtable) is non-zero, we've already
1216 initialized the object, so don't do it again. */
1217 if_stmt = begin_if_stmt ();
1218 tmp = cp_convert (build_pointer_type (ptr_type_node), addr);
1219 tmp = build_indirect_ref (tmp, 0);
1220 tmp = cp_build_binary_op (EQ_EXPR, tmp, integer_zero_node);
1221 finish_if_stmt_cond (tmp, if_stmt);
1222 then_clause = begin_compound_stmt (/*has_no_scope=*/0);
1223
1224 if (TREE_CODE (type) == FUNCTION_TYPE)
1225 expand_generic_desc (tdecl, type, "__rtti_func");
1226 else if (TREE_CODE (type) == ARRAY_TYPE)
1227 expand_generic_desc (tdecl, type, "__rtti_array");
1228 else if (TYPE_QUALS (type) != TYPE_UNQUALIFIED)
1229 expand_attr_desc (tdecl, type);
1230 else if (TREE_CODE (type) == POINTER_TYPE)
1231 {
1232 if (TREE_CODE (TREE_TYPE (type)) == OFFSET_TYPE)
1233 expand_generic_desc (tdecl, type, "__rtti_ptmd");
1234 else if (TREE_CODE (TREE_TYPE (type)) == METHOD_TYPE)
1235 expand_generic_desc (tdecl, type, "__rtti_ptmf");
1236 else
1237 expand_ptr_desc (tdecl, type);
1238 }
1239 else if (TYPE_PTRMEMFUNC_P (type))
1240 expand_generic_desc (tdecl, type, "__rtti_ptmf");
1241 else if (IS_AGGR_TYPE (type))
1242 {
1243 if (CLASSTYPE_N_BASECLASSES (type) == 0)
1244 expand_generic_desc (tdecl, type, "__rtti_user");
1245 else if (! TYPE_BASE_CONVS_MAY_REQUIRE_CODE_P (type)
1246 && (TREE_VIA_PUBLIC
1247 (TREE_VEC_ELT (TYPE_BINFO_BASETYPES (type), 0))))
1248 expand_si_desc (tdecl, type);
1249 else
1250 expand_class_desc (tdecl, type);
1251 }
1252 else if (TREE_CODE (type) == ENUMERAL_TYPE)
1253 expand_generic_desc (tdecl, type, "__rtti_user");
1254 else
1255 my_friendly_abort (252);
1256
1257 finish_compound_stmt (/*has_no_scope=*/0, then_clause);
1258 finish_then_clause (if_stmt);
1259 finish_if_stmt ();
1260
1261 /* OK, now return the type_info object. */
1262 tmp = cp_convert (build_pointer_type (type_info_type_node), addr);
1263 tmp = build_indirect_ref (tmp, 0);
1264 finish_return_stmt (tmp);
1265 /* Finish the function body. */
1266 finish_compound_stmt (/*has_no_scope=*/0, compound_stmt);
1267 expand_body (finish_function (0));
1268 }
1269
1270 /* Return the runtime bit mask encoding the qualifiers of TYPE. */
1271
1272 static int
1273 qualifier_flags (type)
1274 tree type;
1275 {
1276 int flags = 0;
1277 /* we want the qualifiers on this type, not any array core, it might have */
1278 int quals = TYPE_QUALS (type);
1279
1280 if (quals & TYPE_QUAL_CONST)
1281 flags |= 1;
1282 if (quals & TYPE_QUAL_VOLATILE)
1283 flags |= 2;
1284 if (quals & TYPE_QUAL_RESTRICT)
1285 flags |= 4;
1286 return flags;
1287 }
1288
1289 /* Return non-zero, if the pointer chain TYPE ends at an incomplete type, or
1290 contains a pointer to member of an incomplete class. */
1291
1292 static int
1293 target_incomplete_p (type)
1294 tree type;
1295 {
1296 while (TREE_CODE (type) == POINTER_TYPE)
1297 if (TYPE_PTRMEM_P (type))
1298 {
1299 if (!COMPLETE_TYPE_P (TYPE_PTRMEM_CLASS_TYPE (type)))
1300 return 1;
1301 type = TYPE_PTRMEM_POINTED_TO_TYPE (type);
1302 }
1303 else
1304 type = TREE_TYPE (type);
1305 if (!COMPLETE_OR_VOID_TYPE_P (type))
1306 return 1;
1307
1308 return 0;
1309 }
1310
1311 /* Return a CONSTRUCTOR for the common part of the type_info objects. This
1312 is the vtable pointer and NTBS name. The NTBS name is emitted as a
1313 comdat const char array, so it becomes a unique key for the type. Generate
1314 and emit that VAR_DECL here. (We can't always emit the type_info itself
1315 as comdat, because of pointers to incomplete.) */
1316
1317 static tree
1318 tinfo_base_init (desc, target)
1319 tree desc;
1320 tree target;
1321 {
1322 tree init = NULL_TREE;
1323 tree name_decl;
1324
1325 {
1326 tree name_name;
1327
1328 /* Generate the NTBS array variable. */
1329 tree name_type = build_cplus_array_type
1330 (build_qualified_type (char_type_node, TYPE_QUAL_CONST),
1331 NULL_TREE);
1332 tree name_string = tinfo_name (target);
1333
1334 if (flag_new_abi)
1335 name_name = mangle_typeinfo_for_type (target);
1336 else
1337 name_name = build_overload_with_type (tinfo_var_id, target);
1338 name_decl = build_lang_decl (VAR_DECL, name_name, name_type);
1339
1340 DECL_ARTIFICIAL (name_decl) = 1;
1341 TREE_READONLY (name_decl) = 1;
1342 TREE_STATIC (name_decl) = 1;
1343 DECL_EXTERNAL (name_decl) = 0;
1344 TREE_PUBLIC (name_decl) = 1;
1345 comdat_linkage (name_decl);
1346 if (flag_new_abi)
1347 /* The new ABI specifies the external name of the string
1348 containing the type's name. */
1349 DECL_ASSEMBLER_NAME (name_decl)
1350 = mangle_typeinfo_string_for_type (target);
1351 else
1352 DECL_ASSEMBLER_NAME (name_decl) = DECL_NAME (name_decl);
1353 DECL_INITIAL (name_decl) = name_string;
1354 cp_finish_decl (name_decl, name_string, NULL_TREE, 0);
1355 }
1356
1357 if (TINFO_VTABLE_DECL (desc))
1358 {
1359 tree vtbl_ptr = TINFO_VTABLE_DECL (desc);
1360 init = tree_cons (NULL_TREE, vtbl_ptr, init);
1361 }
1362
1363 init = tree_cons (NULL_TREE, decay_conversion (name_decl), init);
1364
1365 init = build (CONSTRUCTOR, NULL_TREE, NULL_TREE, nreverse (init));
1366 TREE_HAS_CONSTRUCTOR (init) = TREE_CONSTANT (init) = TREE_STATIC (init) = 1;
1367 init = tree_cons (NULL_TREE, init, NULL_TREE);
1368
1369 return init;
1370 }
1371
1372 /* Return the CONSTRUCTOR expr for a type_info of TYPE. DESC provides the
1373 information about the particular type_info derivation, which adds no
1374 additional fields to the type_info base. */
1375
1376 static tree
1377 generic_initializer (desc, target)
1378 tree desc;
1379 tree target;
1380 {
1381 tree init = tinfo_base_init (desc, target);
1382
1383 init = build (CONSTRUCTOR, NULL_TREE, NULL_TREE, init);
1384 TREE_HAS_CONSTRUCTOR (init) = TREE_CONSTANT (init) = TREE_STATIC (init) = 1;
1385 return init;
1386 }
1387
1388 /* Return the CONSTRUCTOR expr for a type_info of pointer TYPE.
1389 DESC provides information about the particular type_info derivation,
1390 which adds target type and qualifier flags members to the type_info base. */
1391
1392 static tree
1393 ptr_initializer (desc, target, non_public_ptr)
1394 tree desc;
1395 tree target;
1396 int *non_public_ptr;
1397 {
1398 tree init = tinfo_base_init (desc, target);
1399 tree to = TREE_TYPE (target);
1400 int flags = qualifier_flags (to);
1401 int incomplete = target_incomplete_p (to);
1402
1403 if (incomplete)
1404 {
1405 flags |= 8;
1406 *non_public_ptr = 1;
1407 }
1408 init = tree_cons (NULL_TREE, build_int_2 (flags, 0), init);
1409 init = tree_cons (NULL_TREE,
1410 build_unary_op (ADDR_EXPR,
1411 get_tinfo_decl (TYPE_MAIN_VARIANT (to)), 0),
1412 init);
1413
1414 init = build (CONSTRUCTOR, NULL_TREE, NULL_TREE, nreverse (init));
1415 TREE_HAS_CONSTRUCTOR (init) = TREE_CONSTANT (init) = TREE_STATIC (init) = 1;
1416 return init;
1417 }
1418
1419 /* Return the CONSTRUCTOR expr for a type_info of pointer to member data TYPE.
1420 DESC provides information about the particular type_info derivation,
1421 which adds class, target type and qualifier flags members to the type_info
1422 base. */
1423
1424 static tree
1425 ptm_initializer (desc, target, non_public_ptr)
1426 tree desc;
1427 tree target;
1428 int *non_public_ptr;
1429 {
1430 tree init = tinfo_base_init (desc, target);
1431 tree to = TYPE_PTRMEM_POINTED_TO_TYPE (target);
1432 tree klass = TYPE_PTRMEM_CLASS_TYPE (target);
1433 int flags = qualifier_flags (to);
1434 int incomplete = target_incomplete_p (to);
1435
1436 if (incomplete)
1437 {
1438 flags |= 0x8;
1439 *non_public_ptr = 1;
1440 }
1441 if (!COMPLETE_TYPE_P (klass))
1442 {
1443 flags |= 0x10;
1444 *non_public_ptr = 1;
1445 }
1446 init = tree_cons (NULL_TREE, build_int_2 (flags, 0), init);
1447 init = tree_cons (NULL_TREE,
1448 build_unary_op (ADDR_EXPR,
1449 get_tinfo_decl (TYPE_MAIN_VARIANT (to)), 0),
1450 init);
1451 init = tree_cons (NULL_TREE,
1452 build_unary_op (ADDR_EXPR, get_tinfo_decl (klass), 0),
1453 init);
1454
1455 init = build (CONSTRUCTOR, NULL_TREE, NULL_TREE, nreverse (init));
1456 TREE_HAS_CONSTRUCTOR (init) = TREE_CONSTANT (init) = TREE_STATIC (init) = 1;
1457 return init;
1458 }
1459
1460 /* Check base BINFO to set hint flags in *DATA, which is really an int.
1461 We use CLASSTYPE_MARKED to tag types we've found as non-virtual bases and
1462 CLASSTYPE_MARKED2 to tag those which are virtual bases. Remember it is
1463 possible for a type to be both a virtual and non-virtual base. */
1464
1465 static tree
1466 dfs_class_hint_mark (binfo, data)
1467 tree binfo;
1468 void *data;
1469 {
1470 tree basetype = BINFO_TYPE (binfo);
1471 int *hint = (int *) data;
1472
1473 if (TREE_VIA_VIRTUAL (binfo))
1474 {
1475 if (CLASSTYPE_MARKED (basetype))
1476 *hint |= 1;
1477 if (CLASSTYPE_MARKED2 (basetype))
1478 *hint |= 2;
1479 SET_CLASSTYPE_MARKED2 (basetype);
1480 }
1481 else
1482 {
1483 if (CLASSTYPE_MARKED (basetype) || CLASSTYPE_MARKED2 (basetype))
1484 *hint |= 1;
1485 SET_CLASSTYPE_MARKED (basetype);
1486 }
1487 if (!TREE_VIA_PUBLIC (binfo) && TYPE_BINFO (basetype) != binfo)
1488 *hint |= 4;
1489 return NULL_TREE;
1490 };
1491
1492 /* Clear the base's dfs marks, after searching for duplicate bases. */
1493
1494 static tree
1495 dfs_class_hint_unmark (binfo, data)
1496 tree binfo;
1497 void *data ATTRIBUTE_UNUSED;
1498 {
1499 tree basetype = BINFO_TYPE (binfo);
1500
1501 CLEAR_CLASSTYPE_MARKED (basetype);
1502 CLEAR_CLASSTYPE_MARKED2 (basetype);
1503 return NULL_TREE;
1504 }
1505
1506 /* Determine the hint flags describing the features of a class's heirarchy. */
1507
1508 static int
1509 class_hint_flags (type)
1510 tree type;
1511 {
1512 int hint_flags = 0;
1513 int i;
1514
1515 dfs_walk (TYPE_BINFO (type), dfs_class_hint_mark, NULL, &hint_flags);
1516 dfs_walk (TYPE_BINFO (type), dfs_class_hint_unmark, NULL, NULL);
1517
1518 for (i = 0; i < CLASSTYPE_N_BASECLASSES (type); ++i)
1519 {
1520 tree base_binfo = BINFO_BASETYPE (TYPE_BINFO (type), i);
1521
1522 if (TREE_VIA_PUBLIC (base_binfo))
1523 hint_flags |= 0x8;
1524 }
1525 return hint_flags;
1526 }
1527
1528 /* Return the CONSTRUCTOR expr for a type_info of class TYPE.
1529 DESC provides information about the particular __class_type_info derivation,
1530 which adds hint flags and TRAIL initializers to the type_info base. */
1531
1532 static tree
1533 class_initializer (desc, target, trail)
1534 tree desc;
1535 tree target;
1536 tree trail;
1537 {
1538 tree init = tinfo_base_init (desc, target);
1539
1540 TREE_CHAIN (init) = trail;
1541 init = build (CONSTRUCTOR, NULL_TREE, NULL_TREE, init);
1542 TREE_HAS_CONSTRUCTOR (init) = TREE_CONSTANT (init) = TREE_STATIC (init) = 1;
1543 return init;
1544 }
1545
1546 /* Generate a pseudo_type_info VAR_DECL suitable for the supplied
1547 TARGET_TYPE and given the REAL_NAME. This is the structure expected by
1548 the runtime, and therefore has additional fields. If we need not emit a
1549 definition (because the runtime must contain it), return NULL_TREE,
1550 otherwise return the VAR_DECL. */
1551
1552 static tree
1553 synthesize_tinfo_var (target_type, real_name)
1554 tree target_type;
1555 tree real_name;
1556 {
1557 tree var_init = NULL_TREE;
1558 tree var_type = NULL_TREE;
1559 int non_public = 0;
1560
1561 my_friendly_assert (new_abi_rtti_p (), 20000118);
1562
1563 switch (TREE_CODE (target_type))
1564 {
1565 case POINTER_TYPE:
1566 if (TYPE_PTRMEM_P (target_type))
1567 {
1568 var_type = ptm_desc_type_node;
1569 var_init = ptm_initializer (var_type, target_type, &non_public);
1570 }
1571 else
1572 {
1573 int code = TREE_CODE (TREE_TYPE (target_type));
1574
1575 if ((CP_TYPE_QUALS (TREE_TYPE (target_type)) | TYPE_QUAL_CONST)
1576 == TYPE_QUAL_CONST
1577 && (code == INTEGER_TYPE || code == BOOLEAN_TYPE
1578 || code == CHAR_TYPE || code == REAL_TYPE
1579 || code == VOID_TYPE)
1580 && !doing_runtime)
1581 /* These are in the runtime. */
1582 return NULL_TREE;
1583 var_type = ptr_desc_type_node;
1584 var_init = ptr_initializer (var_type, target_type, &non_public);
1585 }
1586 break;
1587 case ENUMERAL_TYPE:
1588 var_type = enum_desc_type_node;
1589 var_init = generic_initializer (var_type, target_type);
1590 break;
1591 case FUNCTION_TYPE:
1592 var_type = func_desc_type_node;
1593 var_init = generic_initializer (var_type, target_type);
1594 break;
1595 case ARRAY_TYPE:
1596 var_type = ary_desc_type_node;
1597 var_init = generic_initializer (var_type, target_type);
1598 break;
1599 case UNION_TYPE:
1600 case RECORD_TYPE:
1601 if (TYPE_PTRMEMFUNC_P (target_type))
1602 {
1603 var_type = ptm_desc_type_node;
1604 var_init = ptm_initializer (var_type, target_type, &non_public);
1605 }
1606 else if (!COMPLETE_TYPE_P (target_type))
1607 {
1608 /* Emit a non-public class_type_info. */
1609 non_public = 1;
1610 var_type = class_desc_type_node;
1611 var_init = class_initializer (var_type, target_type, NULL_TREE);
1612 }
1613 else if (!CLASSTYPE_N_BASECLASSES (target_type))
1614 {
1615 var_type = class_desc_type_node;
1616 var_init = class_initializer (var_type, target_type, NULL_TREE);
1617 }
1618 else
1619 {
1620 /* if this has a single public non-virtual base, it's easier */
1621 tree binfo = TYPE_BINFO (target_type);
1622 int nbases = BINFO_N_BASETYPES (binfo);
1623 tree base_binfos = BINFO_BASETYPES (binfo);
1624 tree base_inits = NULL_TREE;
1625 int is_simple = nbases == 1;
1626 int ix;
1627
1628 /* Generate the base information initializer. */
1629 for (ix = nbases; ix--;)
1630 {
1631 tree base_binfo = TREE_VEC_ELT (base_binfos, ix);
1632 tree base_init = NULL_TREE;
1633 int flags = 0;
1634 tree tinfo;
1635 tree offset;
1636
1637 if (TREE_VIA_VIRTUAL (base_binfo))
1638 flags |= 1;
1639 if (TREE_PUBLIC (base_binfo))
1640 flags |= 2;
1641 tinfo = get_tinfo_decl (BINFO_TYPE (base_binfo));
1642 tinfo = build_unary_op (ADDR_EXPR, tinfo, 0);
1643 offset = get_base_offset (base_binfo, target_type);
1644
1645 /* is it a single public inheritance? */
1646 if (is_simple && flags == 2 && integer_zerop (offset))
1647 {
1648 base_inits = tree_cons (NULL_TREE, tinfo, NULL_TREE);
1649 break;
1650 }
1651 is_simple = 0;
1652
1653 /* combine offset and flags into one field */
1654 offset = cp_build_binary_op (LSHIFT_EXPR, offset,
1655 build_int_2 (8, 0));
1656 offset = cp_build_binary_op (BIT_IOR_EXPR, offset,
1657 build_int_2 (flags, 0));
1658 base_init = tree_cons (NULL_TREE, offset, base_init);
1659 base_init = tree_cons (NULL_TREE, tinfo, base_init);
1660 base_init = build (CONSTRUCTOR, NULL_TREE, NULL_TREE, base_init);
1661 base_inits = tree_cons (NULL_TREE, base_init, base_inits);
1662 }
1663
1664 if (is_simple)
1665 var_type = si_class_desc_type_node;
1666 else
1667 {
1668 int hint = class_hint_flags (target_type);
1669
1670 base_inits = build (CONSTRUCTOR, NULL_TREE, NULL_TREE, base_inits);
1671 base_inits = tree_cons (NULL_TREE, base_inits, NULL_TREE);
1672 /* Prepend the number of bases. */
1673 base_inits = tree_cons (NULL_TREE,
1674 build_int_2 (nbases, 0), base_inits);
1675 /* Prepend the hint flags. */
1676 base_inits = tree_cons (NULL_TREE,
1677 build_int_2 (hint, 0), base_inits);
1678 var_type = get_vmi_pseudo_type_info (nbases);
1679 }
1680 var_init = class_initializer (var_type, target_type, base_inits);
1681 }
1682 break;
1683 case INTEGER_TYPE:
1684 case BOOLEAN_TYPE:
1685 case CHAR_TYPE:
1686 case REAL_TYPE:
1687 case VOID_TYPE:
1688 if (!doing_runtime)
1689 /* These are guaranteed to be in the runtime. */
1690 return NULL_TREE;
1691 var_type = bltn_desc_type_node;
1692 var_init = generic_initializer (var_type, target_type);
1693 break;
1694 default:
1695 my_friendly_abort (20000117);
1696 }
1697
1698
1699 return create_real_tinfo_var (real_name, TINFO_PSEUDO_TYPE (var_type),
1700 var_init, non_public);
1701 }
1702
1703 /* Create the real typeinfo variable. NON_PUBLIC indicates that we cannot
1704 make this variable public (comdat). */
1705
1706 static tree
1707 create_real_tinfo_var (name, type, init, non_public)
1708 tree name;
1709 tree type;
1710 tree init;
1711 int non_public;
1712 {
1713 static int count = 0;
1714 tree decl;
1715 tree hidden_name;
1716 char hidden[30];
1717
1718 sprintf (hidden, "%.*s_%d",
1719 IDENTIFIER_LENGTH (tinfo_decl_id), IDENTIFIER_POINTER (tinfo_decl_id),
1720 count++);
1721 hidden_name = get_identifier (hidden);
1722
1723 decl = build_lang_decl (VAR_DECL, hidden_name,
1724 build_qualified_type (type, TYPE_QUAL_CONST));
1725 DECL_ARTIFICIAL (decl) = 1;
1726 TREE_READONLY (decl) = 1;
1727 TREE_STATIC (decl) = 1;
1728 DECL_EXTERNAL (decl) = 0;
1729
1730 if (!non_public)
1731 {
1732 TREE_PUBLIC (decl) = 1;
1733 comdat_linkage (decl);
1734 }
1735 DECL_ASSEMBLER_NAME (decl) = name;
1736 DECL_INITIAL (decl) = init;
1737 cp_finish_decl (decl, init, NULL_TREE, 0);
1738 pushdecl_top_level (decl);
1739 TREE_USED (decl) = 1;
1740 return decl;
1741 }
1742
1743 /* Generate the RECORD_TYPE containing the data layout of a type_info
1744 derivative as used by the runtime. This layout must be consistent with
1745 that defined in the runtime support. Also generate the VAR_DECL for the
1746 type's vtable. We explicitly manage the vtable member, and name it for
1747 real type as used in the runtime. The RECORD type has a different name,
1748 to avoid collisions. Return a TREE_LIST who's TINFO_PSEUDO_TYPE
1749 is the generated type and TINFO_VTABLE_DECL is the vtable decl.
1750
1751 REAL_NAME is the runtime's name of the type. Trailing arguments are
1752 additional FIELD_DECL's for the structure. The final argument must be
1753 NULL. */
1754
1755 static tree
1756 create_pseudo_type_info VPARAMS((const char *real_name, int ident, ...))
1757 {
1758 #ifndef ANSI_PROTOTYPES
1759 char const *real_name;
1760 int ident;
1761 #endif
1762 va_list ap;
1763 tree real_type, pseudo_type;
1764 char *pseudo_name;
1765 tree vtable_decl;
1766 int ix;
1767 tree fields[10];
1768 tree field_decl;
1769 tree result;
1770
1771 VA_START (ap, ident);
1772 #ifndef ANSI_PROTOTYPES
1773 real_name = va_arg (ap, char const *);
1774 ident = va_arg (app, int);
1775 #endif
1776
1777 /* Generate the pseudo type name. */
1778 pseudo_name = (char *)alloca (strlen (real_name) + 30);
1779 strcpy (pseudo_name, real_name);
1780 strcat (pseudo_name, "_pseudo");
1781 if (ident)
1782 sprintf (pseudo_name + strlen (pseudo_name), "%d", ident);
1783
1784 /* Get the vtable decl. */
1785 real_type = xref_tag (class_type_node, get_identifier (real_name), 1);
1786 vtable_decl = get_vtable_decl (real_type, /*complete=*/1);
1787 vtable_decl = build_unary_op (ADDR_EXPR, vtable_decl, 0);
1788
1789 /* Under the new ABI, we need to point into the middle of the
1790 vtable. */
1791 if (flag_new_abi)
1792 {
1793 vtable_decl = build (PLUS_EXPR,
1794 TREE_TYPE (vtable_decl),
1795 vtable_decl,
1796 size_binop (MULT_EXPR,
1797 size_int (2),
1798 TYPE_SIZE_UNIT (vtable_entry_type)));
1799 TREE_CONSTANT (vtable_decl) = 1;
1800 }
1801
1802 /* First field is the pseudo type_info base class. */
1803 fields[0] = build_decl (FIELD_DECL, NULL_TREE, ti_desc_type_node);
1804
1805 /* Now add the derived fields. */
1806 for (ix = 0; (field_decl = va_arg (ap, tree));)
1807 fields[++ix] = field_decl;
1808
1809 /* Create the pseudo type. */
1810 pseudo_type = make_aggr_type (RECORD_TYPE);
1811 finish_builtin_type (pseudo_type, pseudo_name, fields, ix, ptr_type_node);
1812 TYPE_HAS_CONSTRUCTOR (pseudo_type) = 1;
1813 va_end (ap);
1814
1815 result = tree_cons (NULL_TREE, NULL_TREE, NULL_TREE);
1816 TINFO_VTABLE_DECL (result) = vtable_decl;
1817 TINFO_PSEUDO_TYPE (result) = pseudo_type;
1818
1819 return result;
1820 }
1821
1822 /* Return a descriptor for a vmi type with NUM_BASES bases. */
1823
1824 static tree
1825 get_vmi_pseudo_type_info (num_bases)
1826 int num_bases;
1827 {
1828 tree desc;
1829 tree array_domain, base_array;
1830
1831 if (TREE_VEC_LENGTH (vmi_class_desc_type_node) <= num_bases)
1832 {
1833 int ix;
1834 tree extend = make_tree_vec (num_bases + 5);
1835
1836 for (ix = TREE_VEC_LENGTH (vmi_class_desc_type_node); ix--;)
1837 TREE_VEC_ELT (extend, ix) = TREE_VEC_ELT (vmi_class_desc_type_node, ix);
1838 vmi_class_desc_type_node = extend;
1839 }
1840 desc = TREE_VEC_ELT (vmi_class_desc_type_node, num_bases);
1841
1842 if (desc)
1843 return desc;
1844
1845 /* Add number of bases and trailing array of base_class_type_info. */
1846 array_domain = build_index_type (build_int_2 (num_bases, 0));
1847 base_array = build_array_type (base_desc_type_node, array_domain);
1848
1849 push_nested_namespace (abi_node);
1850
1851 desc = create_pseudo_type_info
1852 ("__vmi_class_type_info", num_bases,
1853 build_decl (FIELD_DECL, NULL_TREE, integer_type_node),
1854 build_decl (FIELD_DECL, NULL_TREE, integer_type_node),
1855 build_decl (FIELD_DECL, NULL_TREE, base_array),
1856 NULL);
1857
1858 pop_nested_namespace (abi_node);
1859
1860 TREE_VEC_ELT (vmi_class_desc_type_node, num_bases) = desc;
1861 return desc;
1862 }
1863
1864 /* Make sure the required builtin types exist for generating the type_info
1865 varable definitions. */
1866
1867 static void
1868 create_tinfo_types ()
1869 {
1870 tree ptr_type_info;
1871
1872 if (bltn_desc_type_node)
1873 return;
1874 push_nested_namespace (abi_node);
1875
1876 ptr_type_info = build_pointer_type
1877 (build_qualified_type
1878 (type_info_type_node, TYPE_QUAL_CONST));
1879
1880 /* Create the internal type_info structure. This is used as a base for
1881 the other structures. */
1882 {
1883 tree fields[2];
1884
1885 ti_desc_type_node = make_aggr_type (RECORD_TYPE);
1886 fields[0] = build_decl (FIELD_DECL, NULL_TREE, const_ptr_type_node);
1887 fields[1] = build_decl (FIELD_DECL, NULL_TREE, const_string_type_node);
1888 finish_builtin_type (ti_desc_type_node, "__type_info_pseudo",
1889 fields, 1, ptr_type_node);
1890 TYPE_HAS_CONSTRUCTOR (ti_desc_type_node) = 1;
1891 }
1892
1893 /* Fundamental type_info */
1894 bltn_desc_type_node = create_pseudo_type_info
1895 ("__fundamental_type_info", 0,
1896 NULL);
1897
1898 /* Array, function and enum type_info. No additional fields. */
1899 ary_desc_type_node = create_pseudo_type_info
1900 ("__array_type_info", 0,
1901 NULL);
1902 func_desc_type_node = create_pseudo_type_info
1903 ("__function_type_info", 0,
1904 NULL);
1905 enum_desc_type_node = create_pseudo_type_info
1906 ("__enum_type_info", 0,
1907 NULL);
1908
1909 /* Class type_info. Add a flags field. */
1910 class_desc_type_node = create_pseudo_type_info
1911 ("__class_type_info", 0,
1912 NULL);
1913
1914 /* Single public non-virtual base class. Add pointer to base class.
1915 This is really a descendant of __class_type_info. */
1916 si_class_desc_type_node = create_pseudo_type_info
1917 ("__si_class_type_info", 0,
1918 build_decl (FIELD_DECL, NULL_TREE, ptr_type_info),
1919 NULL);
1920
1921 /* Base class internal helper. Pointer to base type, offset to base,
1922 flags. */
1923 {
1924 tree fields[2];
1925
1926 fields[0] = build_decl (FIELD_DECL, NULL_TREE, ptr_type_info);
1927 fields[1] = build_decl (FIELD_DECL, NULL_TREE, integer_types[itk_long]);
1928 base_desc_type_node = make_aggr_type (RECORD_TYPE);
1929 finish_builtin_type (base_desc_type_node, "__base_class_type_info_pseudo",
1930 fields, 1, ptr_type_node);
1931 TYPE_HAS_CONSTRUCTOR (base_desc_type_node) = 1;
1932 }
1933
1934 /* General heirarchy is created as necessary in this vector. */
1935 vmi_class_desc_type_node = make_tree_vec (10);
1936
1937 /* Pointer type_info. Adds two fields, qualification mask
1938 and pointer to the pointed to type. This is really a descendant of
1939 __pbase_type_info. */
1940 ptr_desc_type_node = create_pseudo_type_info
1941 ("__pointer_type_info", 0,
1942 build_decl (FIELD_DECL, NULL_TREE, integer_type_node),
1943 build_decl (FIELD_DECL, NULL_TREE, ptr_type_info),
1944 NULL);
1945
1946 /* Pointer to member data type_info. Add qualifications flags,
1947 pointer to the member's type info and pointer to the class.
1948 This is really a descendant of __pbase_type_info. */
1949 ptm_desc_type_node = create_pseudo_type_info
1950 ("__pointer_to_member_type_info", 0,
1951 build_decl (FIELD_DECL, NULL_TREE, integer_type_node),
1952 build_decl (FIELD_DECL, NULL_TREE, ptr_type_info),
1953 build_decl (FIELD_DECL, NULL_TREE, ptr_type_info),
1954 NULL);
1955
1956 pop_nested_namespace (abi_node);
1957 }
1958
1959 /* Emit the type_info descriptors which are guaranteed to be in the runtime
1960 support. Generating them here guarantees consistency with the other
1961 structures. We use the following heuristic to determine when the runtime
1962 is being generated. If std::__fundamental_type_info is defined, and it's
1963 destructor is defined, then the runtime is being built. */
1964
1965 void
1966 emit_support_tinfos ()
1967 {
1968 static tree *const fundamentals[] =
1969 {
1970 &void_type_node,
1971 &boolean_type_node,
1972 &wchar_type_node,
1973 #if 0
1974 &signed_wchar_type_node, &unsigned_wchar_type_node,
1975 #endif
1976 &char_type_node, &signed_char_type_node, &unsigned_char_type_node,
1977 &short_integer_type_node, &short_unsigned_type_node,
1978 &integer_type_node, &unsigned_type_node,
1979 &long_integer_type_node, &long_unsigned_type_node,
1980 &long_long_integer_type_node, &long_long_unsigned_type_node,
1981 &float_type_node, &double_type_node, &long_double_type_node,
1982
1983 /* GCC extension types */
1984 #if 0
1985 &complex_integer_type_node,
1986 &complex_float_type_node, &complex_double_type_node,
1987 &complex_long_double_type_node,
1988 #endif
1989
1990 0
1991 };
1992 int ix;
1993 tree bltn_type, dtor;
1994
1995 push_nested_namespace (abi_node);
1996 bltn_type = xref_tag (class_type_node,
1997 get_identifier ("__fundamental_type_info"), 1);
1998 pop_nested_namespace (abi_node);
1999 if (!COMPLETE_TYPE_P (bltn_type))
2000 return;
2001 dtor = TREE_VEC_ELT (CLASSTYPE_METHOD_VEC (bltn_type), 1);
2002 if (DECL_EXTERNAL (dtor))
2003 return;
2004 doing_runtime = 1;
2005 for (ix = 0; fundamentals[ix]; ix++)
2006 {
2007 tree bltn = *fundamentals[ix];
2008 tree bltn_ptr = build_pointer_type (bltn);
2009 tree bltn_const_ptr = build_pointer_type
2010 (build_qualified_type (bltn, TYPE_QUAL_CONST));
2011 tree tinfo;
2012
2013 tinfo = get_tinfo_decl (bltn);
2014 TREE_USED (tinfo) = 1;
2015 TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (tinfo)) = 1;
2016
2017 tinfo = get_tinfo_decl (bltn_ptr);
2018 TREE_USED (tinfo) = 1;
2019 TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (tinfo)) = 1;
2020
2021 tinfo = get_tinfo_decl (bltn_const_ptr);
2022 TREE_USED (tinfo) = 1;
2023 TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (tinfo)) = 1;
2024 }
2025 }
2026
2027 /* Return non-zero, iff T is a type_info variable which has not had a
2028 definition emitted for it. */
2029
2030 int
2031 tinfo_decl_p (t, data)
2032 tree t;
2033 void *data ATTRIBUTE_UNUSED;
2034 {
2035 return TREE_CODE (t) == VAR_DECL
2036 && IDENTIFIER_GLOBAL_VALUE (DECL_NAME (t)) == (t)
2037 && TREE_TYPE (t) == tinfo_decl_type
2038 && TREE_TYPE (DECL_NAME (t));
2039 }
2040
2041 /* Emit a suitable type_info definition for the type_info decl pointed to by
2042 DECL_PTR. We emit a completely new variable, of the correct type for the
2043 actual type this is describing. The DECL_ASSEMBLER_NAME of the generated
2044 definition is set to that of the supplied decl, so that they can be tied
2045 up. Mark the supplied decl as having been dealt with. Emitting one
2046 definition might cause other definitions to be required.
2047
2048 We need to do things this way, because we're trying to do something like
2049
2050 struct B : A {
2051 ...
2052 };
2053
2054 extern const A tinfo_var;
2055
2056 const B tinfo_var = {...};
2057
2058 which is not permitted. Also, we've not necessarily seen the definition of B.
2059 So we do something like the following,
2060
2061 extern const A tinfo_var;
2062
2063 struct pseudo_A {
2064 const void *vtable_ptr;
2065 const char *name;
2066 };
2067 struct pseudo_B {
2068 pseudo_A base;
2069 ...
2070 };
2071
2072 const pseudo_B proxy_tinfo_var attribute((assembler_name="tinfo_var")) =
2073 {
2074 {&B::vtable, "..."},
2075 ...
2076 };
2077
2078 pseudo_A and pseudo_B must be layout equivalent to the real definitions in
2079 the runtime. */
2080
2081 int
2082 emit_tinfo_decl (decl_ptr, data)
2083 tree *decl_ptr;
2084 void *data ATTRIBUTE_UNUSED;
2085 {
2086 tree tinfo_decl = *decl_ptr;
2087 tree tinfo_type, decl;
2088
2089 my_friendly_assert (TREE_TYPE (tinfo_decl) == tinfo_decl_type, 20000121);
2090 tinfo_type = TREE_TYPE (DECL_NAME (tinfo_decl));
2091 my_friendly_assert (tinfo_type != NULL_TREE, 20000120);
2092
2093 if (!DECL_NEEDED_P (tinfo_decl))
2094 return 0;
2095 /* Say we've dealt with it. */
2096 TREE_TYPE (DECL_NAME (tinfo_decl)) = NULL_TREE;
2097
2098 create_tinfo_types ();
2099 decl = synthesize_tinfo_var (tinfo_type, DECL_ASSEMBLER_NAME (tinfo_decl));
2100
2101 return decl != 0;
2102 }