* varasm.c: Fix formatting.
[official-gcc.git] / gcc / cp / rtti.c
blobaf401299adb3de1daf5d7ab25e7032c68d4bada7
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).
6 This file is part of GNU CC.
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.
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.
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. */
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"
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)
42 extern struct obstack permanent_obstack;
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));
69 static int doing_runtime = 0;
71 void
72 init_rtti_processing ()
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);
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. */
87 static tree
88 build_headof (exp)
89 tree exp;
91 tree type = TREE_TYPE (exp);
92 tree offset;
93 tree index;
95 my_friendly_assert (TREE_CODE (type) == POINTER_TYPE, 20000112);
96 type = TREE_TYPE (type);
98 if (!TYPE_POLYMORPHIC_P (type))
99 return exp;
101 /* We use this a couple of times below, protect it. */
102 exp = save_expr (exp);
104 /* The offset-to-top field is at index -2 from the vptr. */
105 index = build_int_2 (-2, -1);
107 offset = build_vtbl_ref (build_indirect_ref (exp, NULL), index);
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));
115 /* Get a bad_cast node for the program to throw...
117 See libstdc++/exception.cc for __throw_bad_cast */
119 static tree
120 throw_bad_cast ()
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));
129 return build_call (fn, NULL_TREE);
132 static tree
133 throw_bad_typeid ()
135 tree fn = get_identifier ("__cxa_bad_typeid");
136 if (IDENTIFIER_GLOBAL_VALUE (fn))
137 fn = IDENTIFIER_GLOBAL_VALUE (fn);
138 else
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);
145 return build_call (fn, NULL_TREE);
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. */
152 static tree
153 get_tinfo_decl_dynamic (exp)
154 tree exp;
156 tree type;
158 if (exp == error_mark_node)
159 return error_mark_node;
161 type = TREE_TYPE (exp);
163 /* peel back references, so they match. */
164 if (TREE_CODE (type) == REFERENCE_TYPE)
165 type = TREE_TYPE (type);
167 /* Peel off cv qualifiers. */
168 type = TYPE_MAIN_VARIANT (type);
170 if (!VOID_TYPE_P (type))
171 type = complete_type_or_else (type, exp);
173 if (!type)
174 return error_mark_node;
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))
179 /* build reference to type_info from vtable. */
180 tree t;
181 tree index;
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;
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);
195 static bool
196 typeid_ok_p ()
198 if (! flag_rtti)
200 error ("cannot use typeid with -fno-rtti");
201 return false;
204 if (!COMPLETE_TYPE_P (type_info_type_node))
206 error ("must #include <typeinfo> before using typeid");
207 return false;
210 return true;
213 tree
214 build_typeid (exp)
215 tree exp;
217 tree cond = NULL_TREE;
218 int nonnull = 0;
220 if (exp == error_mark_node || !typeid_ok_p ())
221 return error_mark_node;
223 if (processing_template_decl)
224 return build_min_nt (TYPEID_EXPR, exp);
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)
232 exp = stabilize_reference (exp);
233 cond = cp_convert (boolean_type_node, TREE_OPERAND (exp, 0));
236 exp = get_tinfo_decl_dynamic (exp);
238 if (exp == error_mark_node)
239 return error_mark_node;
241 exp = build_indirect_ref (exp, NULL);
243 if (cond)
245 tree bad = throw_bad_typeid ();
247 exp = build (COND_EXPR, TREE_TYPE (exp), cond, exp, bad);
250 return convert_from_reference (exp);
253 /* Generate the NTBS name of a type. */
254 static tree
255 tinfo_name (type)
256 tree type;
258 const char *name;
259 tree name_string;
261 name = mangle_type_string (type);
262 name_string = combine_strings (build_string (strlen (name) + 1, name));
263 return name_string;
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. */
270 tree
271 get_tinfo_decl (type)
272 tree type;
274 tree name;
275 tree d;
277 if (COMPLETE_TYPE_P (type)
278 && TREE_CODE (TYPE_SIZE (type)) != INTEGER_CST)
280 error ("cannot create type information for type `%T' because its size is variable",
281 type);
282 return error_mark_node;
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)));
291 name = mangle_typeinfo_for_type (type);
293 d = IDENTIFIER_GLOBAL_VALUE (name);
294 if (d)
295 /* OK */;
296 else
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);
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);
317 pushdecl_top_level (d);
318 /* Remember the type it is for. */
319 TREE_TYPE (name) = type;
320 TREE_USED (name) = 1;
322 return d;
325 /* Return the type_info object for TYPE. */
327 tree
328 get_typeid (type)
329 tree type;
331 if (type == error_mark_node || !typeid_ok_p ())
332 return error_mark_node;
334 if (processing_template_decl)
335 return build_min_nt (TYPEID_EXPR, type);
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);
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);
347 if (!VOID_TYPE_P (type))
348 type = complete_type_or_else (type, NULL_TREE);
350 if (!type)
351 return error_mark_node;
353 return get_tinfo_decl (type);
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. */
359 static tree
360 ifnonnull (test, result)
361 tree test, result;
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);
369 /* Execute a dynamic cast, as described in section 5.2.6 of the 9/93 working
370 paper. */
372 static tree
373 build_dynamic_cast_1 (type, expr)
374 tree type, expr;
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;
382 /* T shall be a pointer or reference to a complete class type, or
383 `pointer to cv void''. */
384 switch (tc)
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)))
392 errstr = "target is not pointer or reference to class";
393 goto fail;
395 if (!COMPLETE_TYPE_P (complete_type (TREE_TYPE (type))))
397 errstr = "target is not pointer or reference to complete type";
398 goto fail;
400 break;
402 default:
403 errstr = "target is not pointer or reference";
404 goto fail;
407 if (TREE_CODE (expr) == OFFSET_REF)
409 expr = resolve_offset_ref (expr);
410 exprtype = TREE_TYPE (expr);
413 if (tc == POINTER_TYPE)
414 expr = convert_from_reference (expr);
415 else if (TREE_CODE (exprtype) != REFERENCE_TYPE)
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);
423 exprtype = TREE_TYPE (expr);
425 if (tc == POINTER_TYPE)
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. */
430 if (TREE_CODE (exprtype) != POINTER_TYPE)
432 errstr = "source is not a pointer";
433 goto fail;
435 if (! IS_AGGR_TYPE (TREE_TYPE (exprtype)))
437 errstr = "source is not a pointer to class";
438 goto fail;
440 if (!COMPLETE_TYPE_P (complete_type (TREE_TYPE (exprtype))))
442 errstr = "source is a pointer to incomplete type";
443 goto fail;
446 else
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. */
451 if (! IS_AGGR_TYPE (TREE_TYPE (exprtype)))
453 errstr = "source is not of class type";
454 goto fail;
456 if (!COMPLETE_TYPE_P (complete_type (TREE_TYPE (exprtype))))
458 errstr = "source is of incomplete class type";
459 goto fail;
464 /* The dynamic_cast operator shall not cast away constness. */
465 if (!at_least_as_qualified_p (TREE_TYPE (type),
466 TREE_TYPE (exprtype)))
468 errstr = "conversion casts away constness";
469 goto fail;
472 /* If *type is an unambiguous accessible base class of *exprtype,
473 convert statically. */
475 tree binfo;
477 binfo = lookup_base (TREE_TYPE (exprtype), TREE_TYPE (type),
478 ba_not_special, NULL);
480 if (binfo)
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;
490 /* Otherwise *exprtype must be a polymorphic class (have a vtbl). */
491 if (TYPE_POLYMORPHIC_P (TREE_TYPE (exprtype)))
493 tree expr1;
494 /* if TYPE is `void *', return pointer to complete object. */
495 if (tc == POINTER_TYPE && VOID_TYPE_P (TREE_TYPE (type)))
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);
503 /* Since expr is used twice below, save it. */
504 expr = save_expr (expr);
506 expr1 = build_headof (expr);
507 if (TREE_TYPE (expr1) != type)
508 expr1 = build1 (NOP_EXPR, type, expr1);
509 return ifnonnull (expr, expr1);
511 else
513 tree retval;
514 tree result, td2, td3, elems;
515 tree static_type, target_type, boff;
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)
521 if (TREE_CODE (old_expr) == VAR_DECL
522 && TREE_CODE (TREE_TYPE (old_expr)) == RECORD_TYPE)
524 tree expr = throw_bad_cast ();
525 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;
532 /* Ditto for dynamic_cast<D*>(&b). */
533 else if (TREE_CODE (expr) == ADDR_EXPR)
535 tree op = TREE_OPERAND (expr, 0);
536 if (TREE_CODE (op) == VAR_DECL
537 && TREE_CODE (TREE_TYPE (op)) == RECORD_TYPE)
539 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;
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);
552 /* Determine how T and V are related. */
553 boff = get_dynamic_cast_base_type (static_type, target_type);
555 /* Since expr is used twice below, save it. */
556 expr = save_expr (expr);
558 expr1 = expr;
559 if (tc == REFERENCE_TYPE)
560 expr1 = build_unary_op (ADDR_EXPR, expr1, 0);
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))));
568 dcast_fn = dynamic_cast_node;
569 if (!dcast_fn)
571 tree tmp;
572 tree tinfo_ptr;
573 tree ns = abi_node;
574 const char *name;
576 push_nested_namespace (ns);
577 tinfo_ptr = xref_tag (class_type_node,
578 get_identifier ("__class_type_info"),
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;
595 result = build_call (dcast_fn, elems);
597 if (tc == REFERENCE_TYPE)
599 tree bad = throw_bad_cast ();
601 result = save_expr (result);
602 return build (COND_EXPR, type, result, result, bad);
605 /* Now back to the type we want from a void*. */
606 result = cp_convert (type, result);
607 return ifnonnull (expr, result);
610 else
611 errstr = "source type is not polymorphic";
613 fail:
614 error ("cannot dynamic_cast `%E' (of type `%#T') to type `%#T' (%s)",
615 expr, exprtype, type, errstr);
616 return error_mark_node;
619 tree
620 build_dynamic_cast (type, expr)
621 tree type, expr;
623 if (type == error_mark_node || expr == error_mark_node)
624 return error_mark_node;
626 if (processing_template_decl)
627 return build_min (DYNAMIC_CAST_EXPR, type, expr);
629 return convert_from_reference (build_dynamic_cast_1 (type, expr));
632 /* Return the runtime bit mask encoding the qualifiers of TYPE. */
634 static int
635 qualifier_flags (type)
636 tree type;
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);
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;
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. */
654 static int
655 target_incomplete_p (type)
656 tree type;
658 while (TREE_CODE (type) == POINTER_TYPE)
659 if (TYPE_PTRMEM_P (type))
661 if (!COMPLETE_TYPE_P (TYPE_PTRMEM_CLASS_TYPE (type)))
662 return 1;
663 type = TYPE_PTRMEM_POINTED_TO_TYPE (type);
665 else
666 type = TREE_TYPE (type);
667 if (!COMPLETE_OR_VOID_TYPE_P (type))
668 return 1;
670 return 0;
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.) */
679 static tree
680 tinfo_base_init (desc, target)
681 tree desc;
682 tree target;
684 tree init = NULL_TREE;
685 tree name_decl;
688 tree name_name;
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);
696 name_name = mangle_typeinfo_string_for_type (target);
697 name_decl = build_lang_decl (VAR_DECL, name_name, name_type);
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);
714 if (TINFO_VTABLE_DECL (desc))
716 tree vtbl_ptr = TINFO_VTABLE_DECL (desc);
717 init = tree_cons (NULL_TREE, vtbl_ptr, init);
720 init = tree_cons (NULL_TREE, decay_conversion (name_decl), init);
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);
726 return init;
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. */
733 static tree
734 generic_initializer (desc, target)
735 tree desc;
736 tree target;
738 tree init = tinfo_base_init (desc, target);
740 init = build (CONSTRUCTOR, NULL_TREE, NULL_TREE, init);
741 TREE_HAS_CONSTRUCTOR (init) = TREE_CONSTANT (init) = TREE_STATIC (init) = 1;
742 return init;
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. */
749 static tree
750 ptr_initializer (desc, target, non_public_ptr)
751 tree desc;
752 tree target;
753 int *non_public_ptr;
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);
760 if (incomplete)
762 flags |= 8;
763 *non_public_ptr = 1;
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);
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;
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. */
781 static tree
782 ptm_initializer (desc, target, non_public_ptr)
783 tree desc;
784 tree target;
785 int *non_public_ptr;
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);
793 if (incomplete)
795 flags |= 0x8;
796 *non_public_ptr = 1;
798 if (!COMPLETE_TYPE_P (klass))
800 flags |= 0x10;
801 *non_public_ptr = 1;
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);
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;
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. */
822 static tree
823 dfs_class_hint_mark (binfo, data)
824 tree binfo;
825 void *data;
827 tree basetype = BINFO_TYPE (binfo);
828 int *hint = (int *) data;
830 if (TREE_VIA_VIRTUAL (binfo))
832 if (CLASSTYPE_MARKED (basetype))
833 *hint |= 1;
834 if (CLASSTYPE_MARKED2 (basetype))
835 *hint |= 2;
836 SET_CLASSTYPE_MARKED2 (basetype);
838 else
840 if (CLASSTYPE_MARKED (basetype) || CLASSTYPE_MARKED2 (basetype))
841 *hint |= 1;
842 SET_CLASSTYPE_MARKED (basetype);
844 if (!TREE_VIA_PUBLIC (binfo) && TYPE_BINFO (basetype) != binfo)
845 *hint |= 4;
846 return NULL_TREE;
849 /* Clear the base's dfs marks, after searching for duplicate bases. */
851 static tree
852 dfs_class_hint_unmark (binfo, data)
853 tree binfo;
854 void *data ATTRIBUTE_UNUSED;
856 tree basetype = BINFO_TYPE (binfo);
858 CLEAR_CLASSTYPE_MARKED (basetype);
859 CLEAR_CLASSTYPE_MARKED2 (basetype);
860 return NULL_TREE;
863 /* Determine the hint flags describing the features of a class's hierarchy. */
865 static int
866 class_hint_flags (type)
867 tree type;
869 int hint_flags = 0;
870 int i;
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);
875 for (i = 0; i < CLASSTYPE_N_BASECLASSES (type); ++i)
877 tree base_binfo = BINFO_BASETYPE (TYPE_BINFO (type), i);
879 if (TREE_VIA_PUBLIC (base_binfo))
880 hint_flags |= 0x8;
882 return hint_flags;
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. */
889 static tree
890 class_initializer (desc, target, trail)
891 tree desc;
892 tree target;
893 tree trail;
895 tree init = tinfo_base_init (desc, target);
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;
903 /* Returns non-zero if the typeinfo for type should be placed in
904 the runtime library. */
906 static int
907 typeinfo_in_lib_p (type)
908 tree type;
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);
917 switch (TREE_CODE (type))
919 case INTEGER_TYPE:
920 case BOOLEAN_TYPE:
921 case CHAR_TYPE:
922 case REAL_TYPE:
923 case VOID_TYPE:
924 return 1;
926 default:
927 return 0;
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. */
937 static tree
938 synthesize_tinfo_var (target_type, real_name)
939 tree target_type;
940 tree real_name;
942 tree var_init = NULL_TREE;
943 tree var_type = NULL_TREE;
944 int non_public = 0;
946 switch (TREE_CODE (target_type))
948 case POINTER_TYPE:
949 if (TYPE_PTRMEM_P (target_type))
951 var_type = ptm_desc_type_node;
952 var_init = ptm_initializer (var_type, target_type, &non_public);
954 else
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);
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))
979 var_type = ptm_desc_type_node;
980 var_init = ptm_initializer (var_type, target_type, &non_public);
982 else if (!COMPLETE_TYPE_P (target_type))
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);
989 else if (!CLASSTYPE_N_BASECLASSES (target_type))
991 var_type = class_desc_type_node;
992 var_init = class_initializer (var_type, target_type, NULL_TREE);
994 else
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;
1004 /* Generate the base information initializer. */
1005 for (ix = nbases; ix--;)
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;
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))
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;
1026 else
1027 offset = BINFO_OFFSET (base_binfo);
1029 /* is it a single public inheritance? */
1030 if (is_simple && flags == 2 && integer_zerop (offset))
1032 base_inits = tree_cons (NULL_TREE, tinfo, NULL_TREE);
1033 break;
1035 is_simple = 0;
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);
1048 if (is_simple)
1049 var_type = si_class_desc_type_node;
1050 else
1052 int hint = class_hint_flags (target_type);
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);
1064 var_init = class_initializer (var_type, target_type, base_inits);
1066 break;
1068 default:
1069 if (typeinfo_in_lib_p (target_type))
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;
1078 my_friendly_abort (20000117);
1081 return create_real_tinfo_var (target_type,
1082 real_name, TINFO_PSEUDO_TYPE (var_type),
1083 var_init, non_public);
1086 /* Create the real typeinfo variable. NON_PUBLIC indicates that we cannot
1087 make this variable public (comdat). */
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;
1097 static int count = 0;
1098 tree decl;
1099 tree hidden_name;
1100 char hidden[30];
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);
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;
1115 if (!non_public)
1117 TREE_PUBLIC (decl) = 1;
1118 if (flag_weak || !typeinfo_in_lib_p (target_type))
1119 comdat_linkage (decl);
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;
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.
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. */
1141 static tree
1142 create_pseudo_type_info VPARAMS((const char *real_name, int ident, ...))
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;
1152 VA_OPEN (ap, ident);
1153 VA_FIXEDARG (ap, const char *, real_name);
1154 VA_FIXEDARG (ap, int, ident);
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);
1163 /* Get the vtable decl. */
1164 real_type = xref_tag (class_type_node, get_identifier (real_name), 1);
1165 if (! TYPE_SIZE (real_type))
1167 /* We never saw a definition of this type, so we need to tell the
1168 compiler that this is an exported class, as indeed all of the
1169 __*_type_info classes are. */
1170 SET_CLASSTYPE_INTERFACE_KNOWN (real_type);
1171 CLASSTYPE_INTERFACE_ONLY (real_type) = 1;
1174 vtable_decl = get_vtable_decl (real_type, /*complete=*/1);
1175 vtable_decl = build_unary_op (ADDR_EXPR, vtable_decl, 0);
1177 /* We need to point into the middle of the vtable. */
1178 vtable_decl = build (PLUS_EXPR,
1179 TREE_TYPE (vtable_decl),
1180 vtable_decl,
1181 size_binop (MULT_EXPR,
1182 size_int (2),
1183 TYPE_SIZE_UNIT (vtable_entry_type)));
1184 TREE_CONSTANT (vtable_decl) = 1;
1186 /* First field is the pseudo type_info base class. */
1187 fields[0] = build_decl (FIELD_DECL, NULL_TREE, ti_desc_type_node);
1189 /* Now add the derived fields. */
1190 for (ix = 0; (field_decl = va_arg (ap, tree));)
1191 fields[++ix] = field_decl;
1193 /* Create the pseudo type. */
1194 pseudo_type = make_aggr_type (RECORD_TYPE);
1195 finish_builtin_type (pseudo_type, pseudo_name, fields, ix, ptr_type_node);
1196 TYPE_HAS_CONSTRUCTOR (pseudo_type) = 1;
1198 result = tree_cons (NULL_TREE, NULL_TREE, NULL_TREE);
1199 TINFO_VTABLE_DECL (result) = vtable_decl;
1200 TINFO_PSEUDO_TYPE (result) = pseudo_type;
1202 VA_CLOSE (ap);
1203 return result;
1206 /* Return a descriptor for a vmi type with NUM_BASES bases. */
1208 static tree
1209 get_vmi_pseudo_type_info (num_bases)
1210 int num_bases;
1212 tree desc;
1213 tree array_domain, base_array;
1215 if (TREE_VEC_LENGTH (vmi_class_desc_type_node) <= num_bases)
1217 int ix;
1218 tree extend = make_tree_vec (num_bases + 5);
1220 for (ix = TREE_VEC_LENGTH (vmi_class_desc_type_node); ix--;)
1221 TREE_VEC_ELT (extend, ix) = TREE_VEC_ELT (vmi_class_desc_type_node, ix);
1222 vmi_class_desc_type_node = extend;
1224 desc = TREE_VEC_ELT (vmi_class_desc_type_node, num_bases);
1226 if (desc)
1227 return desc;
1229 /* Add number of bases and trailing array of base_class_type_info. */
1230 array_domain = build_index_type (size_int (num_bases));
1231 base_array = build_array_type (base_desc_type_node, array_domain);
1233 push_nested_namespace (abi_node);
1235 desc = create_pseudo_type_info
1236 ("__vmi_class_type_info", num_bases,
1237 build_decl (FIELD_DECL, NULL_TREE, integer_type_node),
1238 build_decl (FIELD_DECL, NULL_TREE, integer_type_node),
1239 build_decl (FIELD_DECL, NULL_TREE, base_array),
1240 NULL);
1242 pop_nested_namespace (abi_node);
1244 TREE_VEC_ELT (vmi_class_desc_type_node, num_bases) = desc;
1245 return desc;
1248 /* Make sure the required builtin types exist for generating the type_info
1249 varable definitions. */
1251 static void
1252 create_tinfo_types ()
1254 tree ptr_type_info;
1256 if (bltn_desc_type_node)
1257 return;
1258 push_nested_namespace (abi_node);
1260 ptr_type_info = build_pointer_type
1261 (build_qualified_type
1262 (type_info_type_node, TYPE_QUAL_CONST));
1264 /* Create the internal type_info structure. This is used as a base for
1265 the other structures. */
1267 tree fields[2];
1269 ti_desc_type_node = make_aggr_type (RECORD_TYPE);
1270 fields[0] = build_decl (FIELD_DECL, NULL_TREE, const_ptr_type_node);
1271 fields[1] = build_decl (FIELD_DECL, NULL_TREE, const_string_type_node);
1272 finish_builtin_type (ti_desc_type_node, "__type_info_pseudo",
1273 fields, 1, ptr_type_node);
1274 TYPE_HAS_CONSTRUCTOR (ti_desc_type_node) = 1;
1277 /* Fundamental type_info */
1278 bltn_desc_type_node = create_pseudo_type_info
1279 ("__fundamental_type_info", 0,
1280 NULL);
1282 /* Array, function and enum type_info. No additional fields. */
1283 ary_desc_type_node = create_pseudo_type_info
1284 ("__array_type_info", 0,
1285 NULL);
1286 func_desc_type_node = create_pseudo_type_info
1287 ("__function_type_info", 0,
1288 NULL);
1289 enum_desc_type_node = create_pseudo_type_info
1290 ("__enum_type_info", 0,
1291 NULL);
1293 /* Class type_info. Add a flags field. */
1294 class_desc_type_node = create_pseudo_type_info
1295 ("__class_type_info", 0,
1296 NULL);
1298 /* Single public non-virtual base class. Add pointer to base class.
1299 This is really a descendant of __class_type_info. */
1300 si_class_desc_type_node = create_pseudo_type_info
1301 ("__si_class_type_info", 0,
1302 build_decl (FIELD_DECL, NULL_TREE, ptr_type_info),
1303 NULL);
1305 /* Base class internal helper. Pointer to base type, offset to base,
1306 flags. */
1308 tree fields[2];
1310 fields[0] = build_decl (FIELD_DECL, NULL_TREE, ptr_type_info);
1311 fields[1] = build_decl (FIELD_DECL, NULL_TREE, integer_types[itk_long]);
1312 base_desc_type_node = make_aggr_type (RECORD_TYPE);
1313 finish_builtin_type (base_desc_type_node, "__base_class_type_info_pseudo",
1314 fields, 1, ptr_type_node);
1315 TYPE_HAS_CONSTRUCTOR (base_desc_type_node) = 1;
1318 /* General hierarchy is created as necessary in this vector. */
1319 vmi_class_desc_type_node = make_tree_vec (10);
1321 /* Pointer type_info. Adds two fields, qualification mask
1322 and pointer to the pointed to type. This is really a descendant of
1323 __pbase_type_info. */
1324 ptr_desc_type_node = create_pseudo_type_info
1325 ("__pointer_type_info", 0,
1326 build_decl (FIELD_DECL, NULL_TREE, integer_type_node),
1327 build_decl (FIELD_DECL, NULL_TREE, ptr_type_info),
1328 NULL);
1330 /* Pointer to member data type_info. Add qualifications flags,
1331 pointer to the member's type info and pointer to the class.
1332 This is really a descendant of __pbase_type_info. */
1333 ptm_desc_type_node = create_pseudo_type_info
1334 ("__pointer_to_member_type_info", 0,
1335 build_decl (FIELD_DECL, NULL_TREE, integer_type_node),
1336 build_decl (FIELD_DECL, NULL_TREE, ptr_type_info),
1337 build_decl (FIELD_DECL, NULL_TREE, ptr_type_info),
1338 NULL);
1340 pop_nested_namespace (abi_node);
1343 /* Emit the type_info descriptors which are guaranteed to be in the runtime
1344 support. Generating them here guarantees consistency with the other
1345 structures. We use the following heuristic to determine when the runtime
1346 is being generated. If std::__fundamental_type_info is defined, and its
1347 destructor is defined, then the runtime is being built. */
1349 void
1350 emit_support_tinfos ()
1352 static tree *const fundamentals[] =
1354 &void_type_node,
1355 &boolean_type_node,
1356 &wchar_type_node,
1357 &char_type_node, &signed_char_type_node, &unsigned_char_type_node,
1358 &short_integer_type_node, &short_unsigned_type_node,
1359 &integer_type_node, &unsigned_type_node,
1360 &long_integer_type_node, &long_unsigned_type_node,
1361 &long_long_integer_type_node, &long_long_unsigned_type_node,
1362 &float_type_node, &double_type_node, &long_double_type_node,
1365 int ix;
1366 tree bltn_type, dtor;
1368 push_nested_namespace (abi_node);
1369 bltn_type = xref_tag (class_type_node,
1370 get_identifier ("__fundamental_type_info"), 1);
1371 pop_nested_namespace (abi_node);
1372 if (!COMPLETE_TYPE_P (bltn_type))
1373 return;
1374 dtor = TREE_VEC_ELT (CLASSTYPE_METHOD_VEC (bltn_type), 1);
1375 if (DECL_EXTERNAL (dtor))
1376 return;
1377 doing_runtime = 1;
1378 for (ix = 0; fundamentals[ix]; ix++)
1380 tree bltn = *fundamentals[ix];
1381 tree bltn_ptr = build_pointer_type (bltn);
1382 tree bltn_const_ptr = build_pointer_type
1383 (build_qualified_type (bltn, TYPE_QUAL_CONST));
1384 tree tinfo;
1386 tinfo = get_tinfo_decl (bltn);
1387 TREE_USED (tinfo) = 1;
1388 TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (tinfo)) = 1;
1390 tinfo = get_tinfo_decl (bltn_ptr);
1391 TREE_USED (tinfo) = 1;
1392 TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (tinfo)) = 1;
1394 tinfo = get_tinfo_decl (bltn_const_ptr);
1395 TREE_USED (tinfo) = 1;
1396 TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (tinfo)) = 1;
1400 /* Return non-zero, iff T is a type_info variable which has not had a
1401 definition emitted for it. */
1404 tinfo_decl_p (t, data)
1405 tree t;
1406 void *data ATTRIBUTE_UNUSED;
1408 return TREE_CODE (t) == VAR_DECL
1409 && IDENTIFIER_GLOBAL_VALUE (DECL_NAME (t)) == (t)
1410 && TREE_TYPE (t) == tinfo_decl_type
1411 && TREE_TYPE (DECL_NAME (t));
1414 /* Emit a suitable type_info definition for the type_info decl pointed to by
1415 DECL_PTR. We emit a completely new variable, of the correct type for the
1416 actual type this is describing. The DECL_ASSEMBLER_NAME of the generated
1417 definition is set to that of the supplied decl, so that they can be tied
1418 up. Mark the supplied decl as having been dealt with. Emitting one
1419 definition might cause other definitions to be required.
1421 We need to do things this way, because we're trying to do something like
1423 struct B : A {
1427 extern const A tinfo_var;
1429 const B tinfo_var = {...};
1431 which is not permitted. Also, we've not necessarily seen the definition of B.
1432 So we do something like the following,
1434 extern const A tinfo_var;
1436 struct pseudo_A {
1437 const void *vtable_ptr;
1438 const char *name;
1440 struct pseudo_B {
1441 pseudo_A base;
1445 const pseudo_B proxy_tinfo_var attribute((assembler_name="tinfo_var")) =
1447 {&B::vtable, "..."},
1451 pseudo_A and pseudo_B must be layout equivalent to the real definitions in
1452 the runtime. */
1455 emit_tinfo_decl (decl_ptr, data)
1456 tree *decl_ptr;
1457 void *data ATTRIBUTE_UNUSED;
1459 tree tinfo_decl = *decl_ptr;
1460 tree tinfo_type, decl;
1462 my_friendly_assert (TREE_TYPE (tinfo_decl) == tinfo_decl_type, 20000121);
1463 tinfo_type = TREE_TYPE (DECL_NAME (tinfo_decl));
1464 my_friendly_assert (tinfo_type != NULL_TREE, 20000120);
1466 if (!DECL_NEEDED_P (tinfo_decl))
1467 return 0;
1468 /* Say we've dealt with it. */
1469 TREE_TYPE (DECL_NAME (tinfo_decl)) = NULL_TREE;
1471 create_tinfo_types ();
1472 decl = synthesize_tinfo_var (tinfo_type, DECL_ASSEMBLER_NAME (tinfo_decl));
1474 return decl != 0;