3510cc10b380f3eeebb7574c6cd079aaa9af91da
[gcc.git] / gcc / cp / rtti.c
1 /* RunTime Type Identification
2 Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001
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 /* Accessors for the type_info objects. We need to remember several things
34 about each of the type_info types. The global tree nodes such as
35 bltn_desc_type_node are TREE_LISTs, and these macros are used to access
36 the required information. */
37 /* The RECORD_TYPE of a type_info derived class. */
38 #define TINFO_PSEUDO_TYPE(NODE) TREE_TYPE (NODE)
39 /* The VAR_DECL of the vtable for the type_info derived class. */
40 #define TINFO_VTABLE_DECL(NODE) TREE_VALUE (NODE)
41
42 extern struct obstack permanent_obstack;
43
44 static tree build_headof PARAMS((tree));
45 static tree ifnonnull PARAMS((tree, tree));
46 static tree tinfo_name PARAMS((tree));
47 static tree build_dynamic_cast_1 PARAMS((tree, tree));
48 static tree throw_bad_cast PARAMS((void));
49 static tree throw_bad_typeid PARAMS((void));
50 static tree get_tinfo_decl_dynamic PARAMS((tree));
51 static bool typeid_ok_p PARAMS ((void));
52 static int qualifier_flags PARAMS((tree));
53 static int target_incomplete_p PARAMS((tree));
54 static tree tinfo_base_init PARAMS((tree, tree));
55 static tree generic_initializer PARAMS((tree, tree));
56 static tree ptr_initializer PARAMS((tree, tree, int *));
57 static tree ptm_initializer PARAMS((tree, tree, int *));
58 static tree dfs_class_hint_mark PARAMS ((tree, void *));
59 static tree dfs_class_hint_unmark PARAMS ((tree, void *));
60 static int class_hint_flags PARAMS((tree));
61 static tree class_initializer PARAMS((tree, tree, tree));
62 static tree synthesize_tinfo_var PARAMS((tree, tree));
63 static tree create_real_tinfo_var PARAMS((tree, tree, tree, tree, int));
64 static tree create_pseudo_type_info PARAMS((const char *, int, ...));
65 static tree get_vmi_pseudo_type_info PARAMS((int));
66 static void create_tinfo_types PARAMS((void));
67 static int typeinfo_in_lib_p PARAMS((tree));
68
69 static int doing_runtime = 0;
70 \f
71 void
72 init_rtti_processing ()
73 {
74 push_namespace (std_identifier);
75 type_info_type_node = xref_tag
76 (class_type_node, get_identifier ("type_info"), 1);
77 pop_namespace ();
78 tinfo_decl_type =
79 build_qualified_type (type_info_type_node, TYPE_QUAL_CONST);
80 }
81
82 /* Given the expression EXP of type `class *', return the head of the
83 object pointed to by EXP with type cv void*, if the class has any
84 virtual functions (TYPE_POLYMORPHIC_P), else just return the
85 expression. */
86
87 static tree
88 build_headof (exp)
89 tree exp;
90 {
91 tree type = TREE_TYPE (exp);
92 tree offset;
93 tree index;
94
95 my_friendly_assert (TREE_CODE (type) == POINTER_TYPE, 20000112);
96 type = TREE_TYPE (type);
97
98 if (!TYPE_POLYMORPHIC_P (type))
99 return exp;
100
101 /* We use this a couple of times below, protect it. */
102 exp = save_expr (exp);
103
104 /* The offset-to-top field is at index -2 from the vptr. */
105 index = build_int_2 (-2, -1);
106
107 offset = build_vtbl_ref (build_indirect_ref (exp, NULL), index);
108
109 type = build_qualified_type (ptr_type_node,
110 cp_type_quals (TREE_TYPE (exp)));
111 return build (PLUS_EXPR, type, exp,
112 cp_convert (ptrdiff_type_node, offset));
113 }
114
115 /* Get a bad_cast node for the program to throw...
116
117 See libstdc++/exception.cc for __throw_bad_cast */
118
119 static tree
120 throw_bad_cast ()
121 {
122 tree fn = get_identifier ("__cxa_bad_cast");
123 if (IDENTIFIER_GLOBAL_VALUE (fn))
124 fn = IDENTIFIER_GLOBAL_VALUE (fn);
125 else
126 fn = push_throw_library_fn (fn, build_function_type (ptr_type_node,
127 void_list_node));
128
129 return build_call (fn, NULL_TREE);
130 }
131
132 static tree
133 throw_bad_typeid ()
134 {
135 tree fn = get_identifier ("__cxa_bad_typeid");
136 if (IDENTIFIER_GLOBAL_VALUE (fn))
137 fn = IDENTIFIER_GLOBAL_VALUE (fn);
138 else
139 {
140 tree t = build_qualified_type (type_info_type_node, TYPE_QUAL_CONST);
141 t = build_function_type (build_reference_type (t), void_list_node);
142 fn = push_throw_library_fn (fn, t);
143 }
144
145 return build_call (fn, NULL_TREE);
146 }
147 \f
148 /* Return a pointer to type_info function associated with the expression EXP.
149 If EXP is a reference to a polymorphic class, return the dynamic type;
150 otherwise return the static type of the expression. */
151
152 static tree
153 get_tinfo_decl_dynamic (exp)
154 tree exp;
155 {
156 tree type;
157
158 if (exp == error_mark_node)
159 return error_mark_node;
160
161 type = TREE_TYPE (exp);
162
163 /* peel back references, so they match. */
164 if (TREE_CODE (type) == REFERENCE_TYPE)
165 type = TREE_TYPE (type);
166
167 /* Peel off cv qualifiers. */
168 type = TYPE_MAIN_VARIANT (type);
169
170 if (!VOID_TYPE_P (type))
171 type = complete_type_or_else (type, exp);
172
173 if (!type)
174 return error_mark_node;
175
176 /* If exp is a reference to polymorphic type, get the real type_info. */
177 if (TYPE_POLYMORPHIC_P (type) && ! resolves_to_fixed_type_p (exp, 0))
178 {
179 /* build reference to type_info from vtable. */
180 tree t;
181 tree index;
182
183 /* The RTTI information is at index -1. */
184 index = integer_minus_one_node;
185 t = build_vtbl_ref (exp, index);
186 TREE_TYPE (t) = build_pointer_type (tinfo_decl_type);
187 return t;
188 }
189
190 /* otherwise return the type_info for the static type of the expr. */
191 exp = get_tinfo_decl (TYPE_MAIN_VARIANT (type));
192 return build_unary_op (ADDR_EXPR, exp, 0);
193 }
194
195 static bool
196 typeid_ok_p ()
197 {
198 if (! flag_rtti)
199 {
200 error ("cannot use typeid with -fno-rtti");
201 return false;
202 }
203
204 if (!COMPLETE_TYPE_P (type_info_type_node))
205 {
206 error ("must #include <typeinfo> before using typeid");
207 return false;
208 }
209
210 return true;
211 }
212
213 tree
214 build_typeid (exp)
215 tree exp;
216 {
217 tree cond = NULL_TREE;
218 int nonnull = 0;
219
220 if (exp == error_mark_node || !typeid_ok_p ())
221 return error_mark_node;
222
223 if (processing_template_decl)
224 return build_min_nt (TYPEID_EXPR, exp);
225
226 if (TREE_CODE (exp) == INDIRECT_REF
227 && TREE_CODE (TREE_TYPE (TREE_OPERAND (exp, 0))) == POINTER_TYPE
228 && TYPE_POLYMORPHIC_P (TREE_TYPE (exp))
229 && ! resolves_to_fixed_type_p (exp, &nonnull)
230 && ! nonnull)
231 {
232 exp = stabilize_reference (exp);
233 cond = cp_convert (boolean_type_node, TREE_OPERAND (exp, 0));
234 }
235
236 exp = get_tinfo_decl_dynamic (exp);
237
238 if (exp == error_mark_node)
239 return error_mark_node;
240
241 exp = build_indirect_ref (exp, NULL);
242
243 if (cond)
244 {
245 tree bad = throw_bad_typeid ();
246
247 exp = build (COND_EXPR, TREE_TYPE (exp), cond, exp, bad);
248 }
249
250 return convert_from_reference (exp);
251 }
252
253 /* Generate the NTBS name of a type. */
254 static tree
255 tinfo_name (type)
256 tree type;
257 {
258 const char *name;
259 tree name_string;
260
261 name = mangle_type_string (type);
262 name_string = combine_strings (build_string (strlen (name) + 1, name));
263 return name_string;
264 }
265
266 /* Returns a decl for the type_info variable for TYPE. You must
267 arrange that the decl is mark_used, if actually use it --- decls in
268 vtables are only used if the vtable is output. */
269
270 tree
271 get_tinfo_decl (type)
272 tree type;
273 {
274 tree name;
275 tree d;
276
277 if (COMPLETE_TYPE_P (type)
278 && TREE_CODE (TYPE_SIZE (type)) != INTEGER_CST)
279 {
280 cp_error ("cannot create type information for type `%T' because its size is variable",
281 type);
282 return error_mark_node;
283 }
284
285 if (TREE_CODE (type) == OFFSET_TYPE)
286 type = TREE_TYPE (type);
287 if (TREE_CODE (type) == METHOD_TYPE)
288 type = build_function_type (TREE_TYPE (type),
289 TREE_CHAIN (TYPE_ARG_TYPES (type)));
290
291 name = mangle_typeinfo_for_type (type);
292
293 d = IDENTIFIER_GLOBAL_VALUE (name);
294 if (d)
295 /* OK */;
296 else
297 {
298 /* The tinfo decl is the type_info object itself. We make all
299 tinfo objects look as type_info, even though they will end up
300 being a subclass of that when emitted. This means that we'll
301 erroneously think we know the dynamic type -- be careful in the
302 runtime. */
303 d = build_lang_decl (VAR_DECL, name, tinfo_decl_type);
304
305 DECL_ARTIFICIAL (d) = 1;
306 DECL_ALIGN (d) = TYPE_ALIGN (ptr_type_node);
307 DECL_USER_ALIGN (d) = 0;
308 TREE_READONLY (d) = 1;
309 TREE_STATIC (d) = 1;
310 DECL_EXTERNAL (d) = 1;
311 TREE_PUBLIC (d) = 1;
312 if (flag_weak || !typeinfo_in_lib_p (type))
313 comdat_linkage (d);
314 SET_DECL_ASSEMBLER_NAME (d, name);
315 cp_finish_decl (d, NULL_TREE, NULL_TREE, 0);
316
317 pushdecl_top_level (d);
318 /* Remember the type it is for. */
319 TREE_TYPE (name) = type;
320 TREE_USED (name) = 1;
321 }
322 return d;
323 }
324
325 /* Return the type_info object for TYPE. */
326
327 tree
328 get_typeid (type)
329 tree type;
330 {
331 if (type == error_mark_node || !typeid_ok_p ())
332 return error_mark_node;
333
334 if (processing_template_decl)
335 return build_min_nt (TYPEID_EXPR, type);
336
337 /* If the type of the type-id is a reference type, the result of the
338 typeid expression refers to a type_info object representing the
339 referenced type. */
340 if (TREE_CODE (type) == REFERENCE_TYPE)
341 type = TREE_TYPE (type);
342
343 /* The top-level cv-qualifiers of the lvalue expression or the type-id
344 that is the operand of typeid are always ignored. */
345 type = TYPE_MAIN_VARIANT (type);
346
347 if (!VOID_TYPE_P (type))
348 type = complete_type_or_else (type, NULL_TREE);
349
350 if (!type)
351 return error_mark_node;
352
353 return get_tinfo_decl (type);
354 }
355
356 /* Check whether TEST is null before returning RESULT. If TEST is used in
357 RESULT, it must have previously had a save_expr applied to it. */
358
359 static tree
360 ifnonnull (test, result)
361 tree test, result;
362 {
363 return build (COND_EXPR, TREE_TYPE (result),
364 build (EQ_EXPR, boolean_type_node, test, integer_zero_node),
365 cp_convert (TREE_TYPE (result), integer_zero_node),
366 result);
367 }
368
369 /* Execute a dynamic cast, as described in section 5.2.6 of the 9/93 working
370 paper. */
371
372 static tree
373 build_dynamic_cast_1 (type, expr)
374 tree type, expr;
375 {
376 enum tree_code tc = TREE_CODE (type);
377 tree exprtype = TREE_TYPE (expr);
378 tree dcast_fn;
379 tree old_expr = expr;
380 const char *errstr = NULL;
381
382 /* T shall be a pointer or reference to a complete class type, or
383 `pointer to cv void''. */
384 switch (tc)
385 {
386 case POINTER_TYPE:
387 if (TREE_CODE (TREE_TYPE (type)) == VOID_TYPE)
388 break;
389 case REFERENCE_TYPE:
390 if (! IS_AGGR_TYPE (TREE_TYPE (type)))
391 {
392 errstr = "target is not pointer or reference to class";
393 goto fail;
394 }
395 if (!COMPLETE_TYPE_P (complete_type (TREE_TYPE (type))))
396 {
397 errstr = "target is not pointer or reference to complete type";
398 goto fail;
399 }
400 break;
401
402 default:
403 errstr = "target is not pointer or reference";
404 goto fail;
405 }
406
407 if (TREE_CODE (expr) == OFFSET_REF)
408 {
409 expr = resolve_offset_ref (expr);
410 exprtype = TREE_TYPE (expr);
411 }
412
413 if (tc == POINTER_TYPE)
414 expr = convert_from_reference (expr);
415 else if (TREE_CODE (exprtype) != REFERENCE_TYPE)
416 {
417 /* Apply trivial conversion T -> T& for dereferenced ptrs. */
418 exprtype = build_reference_type (exprtype);
419 expr = convert_to_reference (exprtype, expr, CONV_IMPLICIT,
420 LOOKUP_NORMAL, NULL_TREE);
421 }
422
423 exprtype = TREE_TYPE (expr);
424
425 if (tc == POINTER_TYPE)
426 {
427 /* If T is a pointer type, v shall be an rvalue of a pointer to
428 complete class type, and the result is an rvalue of type T. */
429
430 if (TREE_CODE (exprtype) != POINTER_TYPE)
431 {
432 errstr = "source is not a pointer";
433 goto fail;
434 }
435 if (! IS_AGGR_TYPE (TREE_TYPE (exprtype)))
436 {
437 errstr = "source is not a pointer to class";
438 goto fail;
439 }
440 if (!COMPLETE_TYPE_P (complete_type (TREE_TYPE (exprtype))))
441 {
442 errstr = "source is a pointer to incomplete type";
443 goto fail;
444 }
445 }
446 else
447 {
448 /* T is a reference type, v shall be an lvalue of a complete class
449 type, and the result is an lvalue of the type referred to by T. */
450
451 if (! IS_AGGR_TYPE (TREE_TYPE (exprtype)))
452 {
453 errstr = "source is not of class type";
454 goto fail;
455 }
456 if (!COMPLETE_TYPE_P (complete_type (TREE_TYPE (exprtype))))
457 {
458 errstr = "source is of incomplete class type";
459 goto fail;
460 }
461
462 }
463
464 /* The dynamic_cast operator shall not cast away constness. */
465 if (!at_least_as_qualified_p (TREE_TYPE (type),
466 TREE_TYPE (exprtype)))
467 {
468 errstr = "conversion casts away constness";
469 goto fail;
470 }
471
472 /* If *type is an unambiguous accessible base class of *exprtype,
473 convert statically. */
474 {
475 tree binfo;
476
477 binfo = lookup_base (TREE_TYPE (exprtype), TREE_TYPE (type),
478 ba_not_special, NULL);
479
480 if (binfo)
481 {
482 expr = build_base_path (PLUS_EXPR, convert_from_reference (expr),
483 binfo, 0);
484 if (TREE_CODE (exprtype) == POINTER_TYPE)
485 expr = non_lvalue (expr);
486 return expr;
487 }
488 }
489
490 /* Otherwise *exprtype must be a polymorphic class (have a vtbl). */
491 if (TYPE_POLYMORPHIC_P (TREE_TYPE (exprtype)))
492 {
493 tree expr1;
494 /* if TYPE is `void *', return pointer to complete object. */
495 if (tc == POINTER_TYPE && VOID_TYPE_P (TREE_TYPE (type)))
496 {
497 /* if b is an object, dynamic_cast<void *>(&b) == (void *)&b. */
498 if (TREE_CODE (expr) == ADDR_EXPR
499 && TREE_CODE (TREE_OPERAND (expr, 0)) == VAR_DECL
500 && TREE_CODE (TREE_TYPE (TREE_OPERAND (expr, 0))) == RECORD_TYPE)
501 return build1 (NOP_EXPR, type, expr);
502
503 /* Since expr is used twice below, save it. */
504 expr = save_expr (expr);
505
506 expr1 = build_headof (expr);
507 if (TREE_TYPE (expr1) != type)
508 expr1 = build1 (NOP_EXPR, type, expr1);
509 return ifnonnull (expr, expr1);
510 }
511 else
512 {
513 tree retval;
514 tree result, td2, td3, elems;
515 tree static_type, target_type, boff;
516
517 /* If we got here, we can't convert statically. Therefore,
518 dynamic_cast<D&>(b) (b an object) cannot succeed. */
519 if (tc == REFERENCE_TYPE)
520 {
521 if (TREE_CODE (old_expr) == VAR_DECL
522 && TREE_CODE (TREE_TYPE (old_expr)) == RECORD_TYPE)
523 {
524 tree expr = throw_bad_cast ();
525 cp_warning ("dynamic_cast of `%#D' to `%#T' can never succeed",
526 old_expr, type);
527 /* Bash it to the expected type. */
528 TREE_TYPE (expr) = type;
529 return expr;
530 }
531 }
532 /* Ditto for dynamic_cast<D*>(&b). */
533 else if (TREE_CODE (expr) == ADDR_EXPR)
534 {
535 tree op = TREE_OPERAND (expr, 0);
536 if (TREE_CODE (op) == VAR_DECL
537 && TREE_CODE (TREE_TYPE (op)) == RECORD_TYPE)
538 {
539 cp_warning ("dynamic_cast of `%#D' to `%#T' can never succeed",
540 op, type);
541 retval = build_int_2 (0, 0);
542 TREE_TYPE (retval) = type;
543 return retval;
544 }
545 }
546
547 target_type = TYPE_MAIN_VARIANT (TREE_TYPE (type));
548 static_type = TYPE_MAIN_VARIANT (TREE_TYPE (exprtype));
549 td2 = build_unary_op (ADDR_EXPR, get_tinfo_decl (target_type), 0);
550 td3 = build_unary_op (ADDR_EXPR, get_tinfo_decl (static_type), 0);
551
552 /* Determine how T and V are related. */
553 boff = get_dynamic_cast_base_type (static_type, target_type);
554
555 /* Since expr is used twice below, save it. */
556 expr = save_expr (expr);
557
558 expr1 = expr;
559 if (tc == REFERENCE_TYPE)
560 expr1 = build_unary_op (ADDR_EXPR, expr1, 0);
561
562 elems = tree_cons
563 (NULL_TREE, expr1, tree_cons
564 (NULL_TREE, td3, tree_cons
565 (NULL_TREE, td2, tree_cons
566 (NULL_TREE, boff, NULL_TREE))));
567
568 dcast_fn = dynamic_cast_node;
569 if (!dcast_fn)
570 {
571 tree tmp;
572 tree tinfo_ptr;
573 tree ns = abi_node;
574 const char *name;
575
576 push_nested_namespace (ns);
577 tinfo_ptr = xref_tag (class_type_node,
578 get_identifier ("__class_type_info"),
579 1);
580
581 tinfo_ptr = build_pointer_type
582 (build_qualified_type
583 (tinfo_ptr, TYPE_QUAL_CONST));
584 name = "__dynamic_cast";
585 tmp = tree_cons
586 (NULL_TREE, const_ptr_type_node, tree_cons
587 (NULL_TREE, tinfo_ptr, tree_cons
588 (NULL_TREE, tinfo_ptr, tree_cons
589 (NULL_TREE, ptrdiff_type_node, void_list_node))));
590 tmp = build_function_type (ptr_type_node, tmp);
591 dcast_fn = build_library_fn_ptr (name, tmp);
592 pop_nested_namespace (ns);
593 dynamic_cast_node = dcast_fn;
594 }
595 result = build_call (dcast_fn, elems);
596
597 if (tc == REFERENCE_TYPE)
598 {
599 tree bad = throw_bad_cast ();
600
601 result = save_expr (result);
602 return build (COND_EXPR, type, result, result, bad);
603 }
604
605 /* Now back to the type we want from a void*. */
606 result = cp_convert (type, result);
607 return ifnonnull (expr, result);
608 }
609 }
610 else
611 errstr = "source type is not polymorphic";
612
613 fail:
614 cp_error ("cannot dynamic_cast `%E' (of type `%#T') to type `%#T' (%s)",
615 expr, exprtype, type, errstr);
616 return error_mark_node;
617 }
618
619 tree
620 build_dynamic_cast (type, expr)
621 tree type, expr;
622 {
623 if (type == error_mark_node || expr == error_mark_node)
624 return error_mark_node;
625
626 if (processing_template_decl)
627 return build_min (DYNAMIC_CAST_EXPR, type, expr);
628
629 return convert_from_reference (build_dynamic_cast_1 (type, expr));
630 }
631 \f
632 /* Return the runtime bit mask encoding the qualifiers of TYPE. */
633
634 static int
635 qualifier_flags (type)
636 tree type;
637 {
638 int flags = 0;
639 /* we want the qualifiers on this type, not any array core, it might have */
640 int quals = TYPE_QUALS (type);
641
642 if (quals & TYPE_QUAL_CONST)
643 flags |= 1;
644 if (quals & TYPE_QUAL_VOLATILE)
645 flags |= 2;
646 if (quals & TYPE_QUAL_RESTRICT)
647 flags |= 4;
648 return flags;
649 }
650
651 /* Return non-zero, if the pointer chain TYPE ends at an incomplete type, or
652 contains a pointer to member of an incomplete class. */
653
654 static int
655 target_incomplete_p (type)
656 tree type;
657 {
658 while (TREE_CODE (type) == POINTER_TYPE)
659 if (TYPE_PTRMEM_P (type))
660 {
661 if (!COMPLETE_TYPE_P (TYPE_PTRMEM_CLASS_TYPE (type)))
662 return 1;
663 type = TYPE_PTRMEM_POINTED_TO_TYPE (type);
664 }
665 else
666 type = TREE_TYPE (type);
667 if (!COMPLETE_OR_VOID_TYPE_P (type))
668 return 1;
669
670 return 0;
671 }
672
673 /* Return a CONSTRUCTOR for the common part of the type_info objects. This
674 is the vtable pointer and NTBS name. The NTBS name is emitted as a
675 comdat const char array, so it becomes a unique key for the type. Generate
676 and emit that VAR_DECL here. (We can't always emit the type_info itself
677 as comdat, because of pointers to incomplete.) */
678
679 static tree
680 tinfo_base_init (desc, target)
681 tree desc;
682 tree target;
683 {
684 tree init = NULL_TREE;
685 tree name_decl;
686
687 {
688 tree name_name;
689
690 /* Generate the NTBS array variable. */
691 tree name_type = build_cplus_array_type
692 (build_qualified_type (char_type_node, TYPE_QUAL_CONST),
693 NULL_TREE);
694 tree name_string = tinfo_name (target);
695
696 name_name = mangle_typeinfo_string_for_type (target);
697 name_decl = build_lang_decl (VAR_DECL, name_name, name_type);
698
699 DECL_ARTIFICIAL (name_decl) = 1;
700 TREE_READONLY (name_decl) = 1;
701 TREE_STATIC (name_decl) = 1;
702 DECL_EXTERNAL (name_decl) = 0;
703 TREE_PUBLIC (name_decl) = 1;
704 comdat_linkage (name_decl);
705 /* External name of the string containing the type's name has a
706 special name. */
707 SET_DECL_ASSEMBLER_NAME (name_decl,
708 mangle_typeinfo_string_for_type (target));
709 DECL_INITIAL (name_decl) = name_string;
710 cp_finish_decl (name_decl, name_string, NULL_TREE, 0);
711 pushdecl_top_level (name_decl);
712 }
713
714 if (TINFO_VTABLE_DECL (desc))
715 {
716 tree vtbl_ptr = TINFO_VTABLE_DECL (desc);
717 init = tree_cons (NULL_TREE, vtbl_ptr, init);
718 }
719
720 init = tree_cons (NULL_TREE, decay_conversion (name_decl), init);
721
722 init = build (CONSTRUCTOR, NULL_TREE, NULL_TREE, nreverse (init));
723 TREE_HAS_CONSTRUCTOR (init) = TREE_CONSTANT (init) = TREE_STATIC (init) = 1;
724 init = tree_cons (NULL_TREE, init, NULL_TREE);
725
726 return init;
727 }
728
729 /* Return the CONSTRUCTOR expr for a type_info of TYPE. DESC provides the
730 information about the particular type_info derivation, which adds no
731 additional fields to the type_info base. */
732
733 static tree
734 generic_initializer (desc, target)
735 tree desc;
736 tree target;
737 {
738 tree init = tinfo_base_init (desc, target);
739
740 init = build (CONSTRUCTOR, NULL_TREE, NULL_TREE, init);
741 TREE_HAS_CONSTRUCTOR (init) = TREE_CONSTANT (init) = TREE_STATIC (init) = 1;
742 return init;
743 }
744
745 /* Return the CONSTRUCTOR expr for a type_info of pointer TYPE.
746 DESC provides information about the particular type_info derivation,
747 which adds target type and qualifier flags members to the type_info base. */
748
749 static tree
750 ptr_initializer (desc, target, non_public_ptr)
751 tree desc;
752 tree target;
753 int *non_public_ptr;
754 {
755 tree init = tinfo_base_init (desc, target);
756 tree to = TREE_TYPE (target);
757 int flags = qualifier_flags (to);
758 int incomplete = target_incomplete_p (to);
759
760 if (incomplete)
761 {
762 flags |= 8;
763 *non_public_ptr = 1;
764 }
765 init = tree_cons (NULL_TREE, build_int_2 (flags, 0), init);
766 init = tree_cons (NULL_TREE,
767 build_unary_op (ADDR_EXPR,
768 get_tinfo_decl (TYPE_MAIN_VARIANT (to)), 0),
769 init);
770
771 init = build (CONSTRUCTOR, NULL_TREE, NULL_TREE, nreverse (init));
772 TREE_HAS_CONSTRUCTOR (init) = TREE_CONSTANT (init) = TREE_STATIC (init) = 1;
773 return init;
774 }
775
776 /* Return the CONSTRUCTOR expr for a type_info of pointer to member data TYPE.
777 DESC provides information about the particular type_info derivation,
778 which adds class, target type and qualifier flags members to the type_info
779 base. */
780
781 static tree
782 ptm_initializer (desc, target, non_public_ptr)
783 tree desc;
784 tree target;
785 int *non_public_ptr;
786 {
787 tree init = tinfo_base_init (desc, target);
788 tree to = TYPE_PTRMEM_POINTED_TO_TYPE (target);
789 tree klass = TYPE_PTRMEM_CLASS_TYPE (target);
790 int flags = qualifier_flags (to);
791 int incomplete = target_incomplete_p (to);
792
793 if (incomplete)
794 {
795 flags |= 0x8;
796 *non_public_ptr = 1;
797 }
798 if (!COMPLETE_TYPE_P (klass))
799 {
800 flags |= 0x10;
801 *non_public_ptr = 1;
802 }
803 init = tree_cons (NULL_TREE, build_int_2 (flags, 0), init);
804 init = tree_cons (NULL_TREE,
805 build_unary_op (ADDR_EXPR,
806 get_tinfo_decl (TYPE_MAIN_VARIANT (to)), 0),
807 init);
808 init = tree_cons (NULL_TREE,
809 build_unary_op (ADDR_EXPR, get_tinfo_decl (klass), 0),
810 init);
811
812 init = build (CONSTRUCTOR, NULL_TREE, NULL_TREE, nreverse (init));
813 TREE_HAS_CONSTRUCTOR (init) = TREE_CONSTANT (init) = TREE_STATIC (init) = 1;
814 return init;
815 }
816
817 /* Check base BINFO to set hint flags in *DATA, which is really an int.
818 We use CLASSTYPE_MARKED to tag types we've found as non-virtual bases and
819 CLASSTYPE_MARKED2 to tag those which are virtual bases. Remember it is
820 possible for a type to be both a virtual and non-virtual base. */
821
822 static tree
823 dfs_class_hint_mark (binfo, data)
824 tree binfo;
825 void *data;
826 {
827 tree basetype = BINFO_TYPE (binfo);
828 int *hint = (int *) data;
829
830 if (TREE_VIA_VIRTUAL (binfo))
831 {
832 if (CLASSTYPE_MARKED (basetype))
833 *hint |= 1;
834 if (CLASSTYPE_MARKED2 (basetype))
835 *hint |= 2;
836 SET_CLASSTYPE_MARKED2 (basetype);
837 }
838 else
839 {
840 if (CLASSTYPE_MARKED (basetype) || CLASSTYPE_MARKED2 (basetype))
841 *hint |= 1;
842 SET_CLASSTYPE_MARKED (basetype);
843 }
844 if (!TREE_VIA_PUBLIC (binfo) && TYPE_BINFO (basetype) != binfo)
845 *hint |= 4;
846 return NULL_TREE;
847 };
848
849 /* Clear the base's dfs marks, after searching for duplicate bases. */
850
851 static tree
852 dfs_class_hint_unmark (binfo, data)
853 tree binfo;
854 void *data ATTRIBUTE_UNUSED;
855 {
856 tree basetype = BINFO_TYPE (binfo);
857
858 CLEAR_CLASSTYPE_MARKED (basetype);
859 CLEAR_CLASSTYPE_MARKED2 (basetype);
860 return NULL_TREE;
861 }
862
863 /* Determine the hint flags describing the features of a class's heirarchy. */
864
865 static int
866 class_hint_flags (type)
867 tree type;
868 {
869 int hint_flags = 0;
870 int i;
871
872 dfs_walk (TYPE_BINFO (type), dfs_class_hint_mark, NULL, &hint_flags);
873 dfs_walk (TYPE_BINFO (type), dfs_class_hint_unmark, NULL, NULL);
874
875 for (i = 0; i < CLASSTYPE_N_BASECLASSES (type); ++i)
876 {
877 tree base_binfo = BINFO_BASETYPE (TYPE_BINFO (type), i);
878
879 if (TREE_VIA_PUBLIC (base_binfo))
880 hint_flags |= 0x8;
881 }
882 return hint_flags;
883 }
884
885 /* Return the CONSTRUCTOR expr for a type_info of class TYPE.
886 DESC provides information about the particular __class_type_info derivation,
887 which adds hint flags and TRAIL initializers to the type_info base. */
888
889 static tree
890 class_initializer (desc, target, trail)
891 tree desc;
892 tree target;
893 tree trail;
894 {
895 tree init = tinfo_base_init (desc, target);
896
897 TREE_CHAIN (init) = trail;
898 init = build (CONSTRUCTOR, NULL_TREE, NULL_TREE, init);
899 TREE_HAS_CONSTRUCTOR (init) = TREE_CONSTANT (init) = TREE_STATIC (init) = 1;
900 return init;
901 }
902
903 /* Returns non-zero if the typeinfo for type should be placed in
904 the runtime library. */
905
906 static int
907 typeinfo_in_lib_p (type)
908 tree type;
909 {
910 /* The typeinfo objects for `T*' and `const T*' are in the runtime
911 library for simple types T. */
912 if (TREE_CODE (type) == POINTER_TYPE
913 && (cp_type_quals (TREE_TYPE (type)) == TYPE_QUAL_CONST
914 || cp_type_quals (TREE_TYPE (type)) == TYPE_UNQUALIFIED))
915 type = TREE_TYPE (type);
916
917 switch (TREE_CODE (type))
918 {
919 case INTEGER_TYPE:
920 case BOOLEAN_TYPE:
921 case CHAR_TYPE:
922 case REAL_TYPE:
923 case VOID_TYPE:
924 return 1;
925
926 default:
927 return 0;
928 }
929 }
930
931 /* Generate a pseudo_type_info VAR_DECL suitable for the supplied
932 TARGET_TYPE and given the REAL_NAME. This is the structure expected by
933 the runtime, and therefore has additional fields. If we need not emit a
934 definition (because the runtime must contain it), return NULL_TREE,
935 otherwise return the VAR_DECL. */
936
937 static tree
938 synthesize_tinfo_var (target_type, real_name)
939 tree target_type;
940 tree real_name;
941 {
942 tree var_init = NULL_TREE;
943 tree var_type = NULL_TREE;
944 int non_public = 0;
945
946 switch (TREE_CODE (target_type))
947 {
948 case POINTER_TYPE:
949 if (TYPE_PTRMEM_P (target_type))
950 {
951 var_type = ptm_desc_type_node;
952 var_init = ptm_initializer (var_type, target_type, &non_public);
953 }
954 else
955 {
956 if (typeinfo_in_lib_p (target_type) && !doing_runtime)
957 /* These are in the runtime. */
958 return NULL_TREE;
959 var_type = ptr_desc_type_node;
960 var_init = ptr_initializer (var_type, target_type, &non_public);
961 }
962 break;
963 case ENUMERAL_TYPE:
964 var_type = enum_desc_type_node;
965 var_init = generic_initializer (var_type, target_type);
966 break;
967 case FUNCTION_TYPE:
968 var_type = func_desc_type_node;
969 var_init = generic_initializer (var_type, target_type);
970 break;
971 case ARRAY_TYPE:
972 var_type = ary_desc_type_node;
973 var_init = generic_initializer (var_type, target_type);
974 break;
975 case UNION_TYPE:
976 case RECORD_TYPE:
977 if (TYPE_PTRMEMFUNC_P (target_type))
978 {
979 var_type = ptm_desc_type_node;
980 var_init = ptm_initializer (var_type, target_type, &non_public);
981 }
982 else if (!COMPLETE_TYPE_P (target_type))
983 {
984 /* Emit a non-public class_type_info. */
985 non_public = 1;
986 var_type = class_desc_type_node;
987 var_init = class_initializer (var_type, target_type, NULL_TREE);
988 }
989 else if (!CLASSTYPE_N_BASECLASSES (target_type))
990 {
991 var_type = class_desc_type_node;
992 var_init = class_initializer (var_type, target_type, NULL_TREE);
993 }
994 else
995 {
996 /* if this has a single public non-virtual base, it's easier */
997 tree binfo = TYPE_BINFO (target_type);
998 int nbases = BINFO_N_BASETYPES (binfo);
999 tree base_binfos = BINFO_BASETYPES (binfo);
1000 tree base_inits = NULL_TREE;
1001 int is_simple = nbases == 1;
1002 int ix;
1003
1004 /* Generate the base information initializer. */
1005 for (ix = nbases; ix--;)
1006 {
1007 tree base_binfo = TREE_VEC_ELT (base_binfos, ix);
1008 tree base_init = NULL_TREE;
1009 int flags = 0;
1010 tree tinfo;
1011 tree offset;
1012
1013 if (TREE_PUBLIC (base_binfo))
1014 flags |= 2;
1015 tinfo = get_tinfo_decl (BINFO_TYPE (base_binfo));
1016 tinfo = build_unary_op (ADDR_EXPR, tinfo, 0);
1017 if (TREE_VIA_VIRTUAL (base_binfo))
1018 {
1019 /* We store the vtable offset at which the virtual
1020 base offset can be found. */
1021 offset = BINFO_VPTR_FIELD (binfo_for_vbase (BINFO_TYPE (base_binfo),
1022 target_type));
1023 offset = convert (sizetype, offset);
1024 flags |= 1;
1025 }
1026 else
1027 offset = BINFO_OFFSET (base_binfo);
1028
1029 /* is it a single public inheritance? */
1030 if (is_simple && flags == 2 && integer_zerop (offset))
1031 {
1032 base_inits = tree_cons (NULL_TREE, tinfo, NULL_TREE);
1033 break;
1034 }
1035 is_simple = 0;
1036
1037 /* combine offset and flags into one field */
1038 offset = cp_build_binary_op (LSHIFT_EXPR, offset,
1039 build_int_2 (8, 0));
1040 offset = cp_build_binary_op (BIT_IOR_EXPR, offset,
1041 build_int_2 (flags, 0));
1042 base_init = tree_cons (NULL_TREE, offset, base_init);
1043 base_init = tree_cons (NULL_TREE, tinfo, base_init);
1044 base_init = build (CONSTRUCTOR, NULL_TREE, NULL_TREE, base_init);
1045 base_inits = tree_cons (NULL_TREE, base_init, base_inits);
1046 }
1047
1048 if (is_simple)
1049 var_type = si_class_desc_type_node;
1050 else
1051 {
1052 int hint = class_hint_flags (target_type);
1053
1054 base_inits = build (CONSTRUCTOR, NULL_TREE, NULL_TREE, base_inits);
1055 base_inits = tree_cons (NULL_TREE, base_inits, NULL_TREE);
1056 /* Prepend the number of bases. */
1057 base_inits = tree_cons (NULL_TREE,
1058 build_int_2 (nbases, 0), base_inits);
1059 /* Prepend the hint flags. */
1060 base_inits = tree_cons (NULL_TREE,
1061 build_int_2 (hint, 0), base_inits);
1062 var_type = get_vmi_pseudo_type_info (nbases);
1063 }
1064 var_init = class_initializer (var_type, target_type, base_inits);
1065 }
1066 break;
1067
1068 default:
1069 if (typeinfo_in_lib_p (target_type))
1070 {
1071 if (!doing_runtime)
1072 /* These are guaranteed to be in the runtime. */
1073 return NULL_TREE;
1074 var_type = bltn_desc_type_node;
1075 var_init = generic_initializer (var_type, target_type);
1076 break;
1077 }
1078 my_friendly_abort (20000117);
1079 }
1080
1081 return create_real_tinfo_var (target_type,
1082 real_name, TINFO_PSEUDO_TYPE (var_type),
1083 var_init, non_public);
1084 }
1085
1086 /* Create the real typeinfo variable. NON_PUBLIC indicates that we cannot
1087 make this variable public (comdat). */
1088
1089 static tree
1090 create_real_tinfo_var (target_type, name, type, init, non_public)
1091 tree target_type;
1092 tree name;
1093 tree type;
1094 tree init;
1095 int non_public;
1096 {
1097 static int count = 0;
1098 tree decl;
1099 tree hidden_name;
1100 char hidden[30];
1101
1102 /* We cannot give this the name NAME, as that already is globally
1103 bound to the tinfo_decl we originally created for this type in
1104 get_tinfo_decl. */
1105 sprintf (hidden, "__ti_%d", count++);
1106 hidden_name = get_identifier (hidden);
1107
1108 decl = build_lang_decl (VAR_DECL, hidden_name,
1109 build_qualified_type (type, TYPE_QUAL_CONST));
1110 DECL_ARTIFICIAL (decl) = 1;
1111 TREE_READONLY (decl) = 1;
1112 TREE_STATIC (decl) = 1;
1113 DECL_EXTERNAL (decl) = 0;
1114
1115 if (!non_public)
1116 {
1117 TREE_PUBLIC (decl) = 1;
1118 if (flag_weak || !typeinfo_in_lib_p (target_type))
1119 comdat_linkage (decl);
1120 }
1121 SET_DECL_ASSEMBLER_NAME (decl, name);
1122 DECL_INITIAL (decl) = init;
1123 cp_finish_decl (decl, init, NULL_TREE, 0);
1124 pushdecl_top_level (decl);
1125 TREE_USED (decl) = 1;
1126 return decl;
1127 }
1128
1129 /* Generate the RECORD_TYPE containing the data layout of a type_info
1130 derivative as used by the runtime. This layout must be consistent with
1131 that defined in the runtime support. Also generate the VAR_DECL for the
1132 type's vtable. We explicitly manage the vtable member, and name it for
1133 real type as used in the runtime. The RECORD type has a different name,
1134 to avoid collisions. Return a TREE_LIST who's TINFO_PSEUDO_TYPE
1135 is the generated type and TINFO_VTABLE_DECL is the vtable decl.
1136
1137 REAL_NAME is the runtime's name of the type. Trailing arguments are
1138 additional FIELD_DECL's for the structure. The final argument must be
1139 NULL. */
1140
1141 static tree
1142 create_pseudo_type_info VPARAMS((const char *real_name, int ident, ...))
1143 {
1144 tree real_type, pseudo_type;
1145 char *pseudo_name;
1146 tree vtable_decl;
1147 int ix;
1148 tree fields[10];
1149 tree field_decl;
1150 tree result;
1151
1152 VA_OPEN (ap, ident);
1153 VA_FIXEDARG (ap, const char *, real_name);
1154 VA_FIXEDARG (ap, int, ident);
1155
1156 /* Generate the pseudo type name. */
1157 pseudo_name = (char *)alloca (strlen (real_name) + 30);
1158 strcpy (pseudo_name, real_name);
1159 strcat (pseudo_name, "_pseudo");
1160 if (ident)
1161 sprintf (pseudo_name + strlen (pseudo_name), "%d", ident);
1162
1163 /* Get the vtable decl. */
1164 real_type = xref_tag (class_type_node, get_identifier (real_name), 1);
1165 vtable_decl = get_vtable_decl (real_type, /*complete=*/1);
1166 vtable_decl = build_unary_op (ADDR_EXPR, vtable_decl, 0);
1167
1168 /* We need to point into the middle of the vtable. */
1169 vtable_decl = build (PLUS_EXPR,
1170 TREE_TYPE (vtable_decl),
1171 vtable_decl,
1172 size_binop (MULT_EXPR,
1173 size_int (2),
1174 TYPE_SIZE_UNIT (vtable_entry_type)));
1175 TREE_CONSTANT (vtable_decl) = 1;
1176
1177 /* First field is the pseudo type_info base class. */
1178 fields[0] = build_decl (FIELD_DECL, NULL_TREE, ti_desc_type_node);
1179
1180 /* Now add the derived fields. */
1181 for (ix = 0; (field_decl = va_arg (ap, tree));)
1182 fields[++ix] = field_decl;
1183
1184 /* Create the pseudo type. */
1185 pseudo_type = make_aggr_type (RECORD_TYPE);
1186 finish_builtin_type (pseudo_type, pseudo_name, fields, ix, ptr_type_node);
1187 TYPE_HAS_CONSTRUCTOR (pseudo_type) = 1;
1188 VA_CLOSE (ap);
1189
1190 result = tree_cons (NULL_TREE, NULL_TREE, NULL_TREE);
1191 TINFO_VTABLE_DECL (result) = vtable_decl;
1192 TINFO_PSEUDO_TYPE (result) = pseudo_type;
1193
1194 return result;
1195 }
1196
1197 /* Return a descriptor for a vmi type with NUM_BASES bases. */
1198
1199 static tree
1200 get_vmi_pseudo_type_info (num_bases)
1201 int num_bases;
1202 {
1203 tree desc;
1204 tree array_domain, base_array;
1205
1206 if (TREE_VEC_LENGTH (vmi_class_desc_type_node) <= num_bases)
1207 {
1208 int ix;
1209 tree extend = make_tree_vec (num_bases + 5);
1210
1211 for (ix = TREE_VEC_LENGTH (vmi_class_desc_type_node); ix--;)
1212 TREE_VEC_ELT (extend, ix) = TREE_VEC_ELT (vmi_class_desc_type_node, ix);
1213 vmi_class_desc_type_node = extend;
1214 }
1215 desc = TREE_VEC_ELT (vmi_class_desc_type_node, num_bases);
1216
1217 if (desc)
1218 return desc;
1219
1220 /* Add number of bases and trailing array of base_class_type_info. */
1221 array_domain = build_index_type (size_int (num_bases));
1222 base_array = build_array_type (base_desc_type_node, array_domain);
1223
1224 push_nested_namespace (abi_node);
1225
1226 desc = create_pseudo_type_info
1227 ("__vmi_class_type_info", num_bases,
1228 build_decl (FIELD_DECL, NULL_TREE, integer_type_node),
1229 build_decl (FIELD_DECL, NULL_TREE, integer_type_node),
1230 build_decl (FIELD_DECL, NULL_TREE, base_array),
1231 NULL);
1232
1233 pop_nested_namespace (abi_node);
1234
1235 TREE_VEC_ELT (vmi_class_desc_type_node, num_bases) = desc;
1236 return desc;
1237 }
1238
1239 /* Make sure the required builtin types exist for generating the type_info
1240 varable definitions. */
1241
1242 static void
1243 create_tinfo_types ()
1244 {
1245 tree ptr_type_info;
1246
1247 if (bltn_desc_type_node)
1248 return;
1249 push_nested_namespace (abi_node);
1250
1251 ptr_type_info = build_pointer_type
1252 (build_qualified_type
1253 (type_info_type_node, TYPE_QUAL_CONST));
1254
1255 /* Create the internal type_info structure. This is used as a base for
1256 the other structures. */
1257 {
1258 tree fields[2];
1259
1260 ti_desc_type_node = make_aggr_type (RECORD_TYPE);
1261 fields[0] = build_decl (FIELD_DECL, NULL_TREE, const_ptr_type_node);
1262 fields[1] = build_decl (FIELD_DECL, NULL_TREE, const_string_type_node);
1263 finish_builtin_type (ti_desc_type_node, "__type_info_pseudo",
1264 fields, 1, ptr_type_node);
1265 TYPE_HAS_CONSTRUCTOR (ti_desc_type_node) = 1;
1266 }
1267
1268 /* Fundamental type_info */
1269 bltn_desc_type_node = create_pseudo_type_info
1270 ("__fundamental_type_info", 0,
1271 NULL);
1272
1273 /* Array, function and enum type_info. No additional fields. */
1274 ary_desc_type_node = create_pseudo_type_info
1275 ("__array_type_info", 0,
1276 NULL);
1277 func_desc_type_node = create_pseudo_type_info
1278 ("__function_type_info", 0,
1279 NULL);
1280 enum_desc_type_node = create_pseudo_type_info
1281 ("__enum_type_info", 0,
1282 NULL);
1283
1284 /* Class type_info. Add a flags field. */
1285 class_desc_type_node = create_pseudo_type_info
1286 ("__class_type_info", 0,
1287 NULL);
1288
1289 /* Single public non-virtual base class. Add pointer to base class.
1290 This is really a descendant of __class_type_info. */
1291 si_class_desc_type_node = create_pseudo_type_info
1292 ("__si_class_type_info", 0,
1293 build_decl (FIELD_DECL, NULL_TREE, ptr_type_info),
1294 NULL);
1295
1296 /* Base class internal helper. Pointer to base type, offset to base,
1297 flags. */
1298 {
1299 tree fields[2];
1300
1301 fields[0] = build_decl (FIELD_DECL, NULL_TREE, ptr_type_info);
1302 fields[1] = build_decl (FIELD_DECL, NULL_TREE, integer_types[itk_long]);
1303 base_desc_type_node = make_aggr_type (RECORD_TYPE);
1304 finish_builtin_type (base_desc_type_node, "__base_class_type_info_pseudo",
1305 fields, 1, ptr_type_node);
1306 TYPE_HAS_CONSTRUCTOR (base_desc_type_node) = 1;
1307 }
1308
1309 /* General heirarchy is created as necessary in this vector. */
1310 vmi_class_desc_type_node = make_tree_vec (10);
1311
1312 /* Pointer type_info. Adds two fields, qualification mask
1313 and pointer to the pointed to type. This is really a descendant of
1314 __pbase_type_info. */
1315 ptr_desc_type_node = create_pseudo_type_info
1316 ("__pointer_type_info", 0,
1317 build_decl (FIELD_DECL, NULL_TREE, integer_type_node),
1318 build_decl (FIELD_DECL, NULL_TREE, ptr_type_info),
1319 NULL);
1320
1321 /* Pointer to member data type_info. Add qualifications flags,
1322 pointer to the member's type info and pointer to the class.
1323 This is really a descendant of __pbase_type_info. */
1324 ptm_desc_type_node = create_pseudo_type_info
1325 ("__pointer_to_member_type_info", 0,
1326 build_decl (FIELD_DECL, NULL_TREE, integer_type_node),
1327 build_decl (FIELD_DECL, NULL_TREE, ptr_type_info),
1328 build_decl (FIELD_DECL, NULL_TREE, ptr_type_info),
1329 NULL);
1330
1331 pop_nested_namespace (abi_node);
1332 }
1333
1334 /* Emit the type_info descriptors which are guaranteed to be in the runtime
1335 support. Generating them here guarantees consistency with the other
1336 structures. We use the following heuristic to determine when the runtime
1337 is being generated. If std::__fundamental_type_info is defined, and its
1338 destructor is defined, then the runtime is being built. */
1339
1340 void
1341 emit_support_tinfos ()
1342 {
1343 static tree *const fundamentals[] =
1344 {
1345 &void_type_node,
1346 &boolean_type_node,
1347 &wchar_type_node,
1348 &char_type_node, &signed_char_type_node, &unsigned_char_type_node,
1349 &short_integer_type_node, &short_unsigned_type_node,
1350 &integer_type_node, &unsigned_type_node,
1351 &long_integer_type_node, &long_unsigned_type_node,
1352 &long_long_integer_type_node, &long_long_unsigned_type_node,
1353 &float_type_node, &double_type_node, &long_double_type_node,
1354 0
1355 };
1356 int ix;
1357 tree bltn_type, dtor;
1358
1359 push_nested_namespace (abi_node);
1360 bltn_type = xref_tag (class_type_node,
1361 get_identifier ("__fundamental_type_info"), 1);
1362 pop_nested_namespace (abi_node);
1363 if (!COMPLETE_TYPE_P (bltn_type))
1364 return;
1365 dtor = TREE_VEC_ELT (CLASSTYPE_METHOD_VEC (bltn_type), 1);
1366 if (DECL_EXTERNAL (dtor))
1367 return;
1368 doing_runtime = 1;
1369 for (ix = 0; fundamentals[ix]; ix++)
1370 {
1371 tree bltn = *fundamentals[ix];
1372 tree bltn_ptr = build_pointer_type (bltn);
1373 tree bltn_const_ptr = build_pointer_type
1374 (build_qualified_type (bltn, TYPE_QUAL_CONST));
1375 tree tinfo;
1376
1377 tinfo = get_tinfo_decl (bltn);
1378 TREE_USED (tinfo) = 1;
1379 TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (tinfo)) = 1;
1380
1381 tinfo = get_tinfo_decl (bltn_ptr);
1382 TREE_USED (tinfo) = 1;
1383 TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (tinfo)) = 1;
1384
1385 tinfo = get_tinfo_decl (bltn_const_ptr);
1386 TREE_USED (tinfo) = 1;
1387 TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (tinfo)) = 1;
1388 }
1389 }
1390
1391 /* Return non-zero, iff T is a type_info variable which has not had a
1392 definition emitted for it. */
1393
1394 int
1395 tinfo_decl_p (t, data)
1396 tree t;
1397 void *data ATTRIBUTE_UNUSED;
1398 {
1399 return TREE_CODE (t) == VAR_DECL
1400 && IDENTIFIER_GLOBAL_VALUE (DECL_NAME (t)) == (t)
1401 && TREE_TYPE (t) == tinfo_decl_type
1402 && TREE_TYPE (DECL_NAME (t));
1403 }
1404
1405 /* Emit a suitable type_info definition for the type_info decl pointed to by
1406 DECL_PTR. We emit a completely new variable, of the correct type for the
1407 actual type this is describing. The DECL_ASSEMBLER_NAME of the generated
1408 definition is set to that of the supplied decl, so that they can be tied
1409 up. Mark the supplied decl as having been dealt with. Emitting one
1410 definition might cause other definitions to be required.
1411
1412 We need to do things this way, because we're trying to do something like
1413
1414 struct B : A {
1415 ...
1416 };
1417
1418 extern const A tinfo_var;
1419
1420 const B tinfo_var = {...};
1421
1422 which is not permitted. Also, we've not necessarily seen the definition of B.
1423 So we do something like the following,
1424
1425 extern const A tinfo_var;
1426
1427 struct pseudo_A {
1428 const void *vtable_ptr;
1429 const char *name;
1430 };
1431 struct pseudo_B {
1432 pseudo_A base;
1433 ...
1434 };
1435
1436 const pseudo_B proxy_tinfo_var attribute((assembler_name="tinfo_var")) =
1437 {
1438 {&B::vtable, "..."},
1439 ...
1440 };
1441
1442 pseudo_A and pseudo_B must be layout equivalent to the real definitions in
1443 the runtime. */
1444
1445 int
1446 emit_tinfo_decl (decl_ptr, data)
1447 tree *decl_ptr;
1448 void *data ATTRIBUTE_UNUSED;
1449 {
1450 tree tinfo_decl = *decl_ptr;
1451 tree tinfo_type, decl;
1452
1453 my_friendly_assert (TREE_TYPE (tinfo_decl) == tinfo_decl_type, 20000121);
1454 tinfo_type = TREE_TYPE (DECL_NAME (tinfo_decl));
1455 my_friendly_assert (tinfo_type != NULL_TREE, 20000120);
1456
1457 if (!DECL_NEEDED_P (tinfo_decl))
1458 return 0;
1459 /* Say we've dealt with it. */
1460 TREE_TYPE (DECL_NAME (tinfo_decl)) = NULL_TREE;
1461
1462 create_tinfo_types ();
1463 decl = synthesize_tinfo_var (tinfo_type, DECL_ASSEMBLER_NAME (tinfo_decl));
1464
1465 return decl != 0;
1466 }