PR target/6641
[official-gcc.git] / gcc / cp / rtti.c
blobd01de92ef8a6b2e0fa5bc3dc11a0a6784109f951
1 /* RunTime Type Identification
2 Copyright (C) 1995-2015 Free Software Foundation, Inc.
3 Mostly written by Jason Merrill (jason@cygnus.com).
5 This file is part of GCC.
7 GCC is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3, or (at your option)
10 any later version.
12 GCC is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING3. If not see
19 <http://www.gnu.org/licenses/>. */
21 #include "config.h"
22 #include "system.h"
23 #include "intl.h"
24 #include "coretypes.h"
25 #include "tm.h"
26 #include "hash-set.h"
27 #include "vec.h"
28 #include "input.h"
29 #include "alias.h"
30 #include "symtab.h"
31 #include "inchash.h"
32 #include "tree.h"
33 #include "tm_p.h"
34 #include "stringpool.h"
35 #include "stor-layout.h"
36 #include "cp-tree.h"
37 #include "flags.h"
38 #include "convert.h"
39 #include "target.h"
40 #include "c-family/c-pragma.h"
42 /* C++ returns type information to the user in struct type_info
43 objects. We also use type information to implement dynamic_cast and
44 exception handlers. Type information for a particular type is
45 indicated with an ABI defined structure derived from type_info.
46 This would all be very straight forward, but for the fact that the
47 runtime library provides the definitions of the type_info structure
48 and the ABI defined derived classes. We cannot build declarations
49 of them directly in the compiler, but we need to layout objects of
50 their type. Somewhere we have to lie.
52 We define layout compatible POD-structs with compiler-defined names
53 and generate the appropriate initializations for them (complete
54 with explicit mention of their vtable). When we have to provide a
55 type_info to the user we reinterpret_cast the internal compiler
56 type to type_info. A well formed program can only explicitly refer
57 to the type_infos of complete types (& cv void). However, we chain
58 pointer type_infos to the pointed-to-type, and that can be
59 incomplete. We only need the addresses of such incomplete
60 type_info objects for static initialization.
62 The type information VAR_DECL of a type is held on the
63 IDENTIFIER_GLOBAL_VALUE of the type's mangled name. That VAR_DECL
64 will be the internal type. It will usually have the correct
65 internal type reflecting the kind of type it represents (pointer,
66 array, function, class, inherited class, etc). When the type it
67 represents is incomplete, it will have the internal type
68 corresponding to type_info. That will only happen at the end of
69 translation, when we are emitting the type info objects. */
71 /* Auxiliary data we hold for each type_info derived object we need. */
72 typedef struct GTY (()) tinfo_s {
73 tree type; /* The RECORD_TYPE for this type_info object */
75 tree vtable; /* The VAR_DECL of the vtable. Only filled at end of
76 translation. */
78 tree name; /* IDENTIFIER_NODE for the ABI specified name of
79 the type_info derived type. */
80 } tinfo_s;
83 typedef enum tinfo_kind
85 TK_TYPE_INFO_TYPE, /* abi::__type_info_pseudo */
86 TK_BASE_TYPE, /* abi::__base_class_type_info */
87 TK_BUILTIN_TYPE, /* abi::__fundamental_type_info */
88 TK_ARRAY_TYPE, /* abi::__array_type_info */
89 TK_FUNCTION_TYPE, /* abi::__function_type_info */
90 TK_ENUMERAL_TYPE, /* abi::__enum_type_info */
91 TK_POINTER_TYPE, /* abi::__pointer_type_info */
92 TK_POINTER_MEMBER_TYPE, /* abi::__pointer_to_member_type_info */
93 TK_CLASS_TYPE, /* abi::__class_type_info */
94 TK_SI_CLASS_TYPE, /* abi::__si_class_type_info */
95 TK_FIXED /* end of fixed descriptors. */
96 /* ... abi::__vmi_type_info<I> */
97 } tinfo_kind;
99 /* Helper macro to get maximum scalar-width of pointer or of the 'long'-type.
100 This of interest for llp64 targets. */
101 #define LONGPTR_T \
102 integer_types[(POINTER_SIZE <= TYPE_PRECISION (integer_types[itk_long]) \
103 ? itk_long : itk_long_long)]
105 /* A vector of all tinfo decls that haven't yet been emitted. */
106 vec<tree, va_gc> *unemitted_tinfo_decls;
108 /* A vector of all type_info derived types we need. The first few are
109 fixed and created early. The remainder are for multiple inheritance
110 and are generated as needed. */
111 static GTY (()) vec<tinfo_s, va_gc> *tinfo_descs;
113 static tree ifnonnull (tree, tree, tsubst_flags_t);
114 static tree tinfo_name (tree, bool);
115 static tree build_dynamic_cast_1 (tree, tree, tsubst_flags_t);
116 static tree throw_bad_cast (void);
117 static tree throw_bad_typeid (void);
118 static tree get_tinfo_ptr (tree);
119 static bool typeid_ok_p (void);
120 static int qualifier_flags (tree);
121 static bool target_incomplete_p (tree);
122 static tree tinfo_base_init (tinfo_s *, tree);
123 static tree generic_initializer (tinfo_s *, tree);
124 static tree ptr_initializer (tinfo_s *, tree);
125 static tree ptm_initializer (tinfo_s *, tree);
126 static tree class_initializer (tinfo_s *, tree, unsigned, ...);
127 static void create_pseudo_type_info (int, const char *, ...);
128 static tree get_pseudo_ti_init (tree, unsigned);
129 static unsigned get_pseudo_ti_index (tree);
130 static void create_tinfo_types (void);
131 static bool typeinfo_in_lib_p (tree);
133 static int doing_runtime = 0;
135 static void
136 push_abi_namespace (void)
138 push_nested_namespace (abi_node);
139 push_visibility ("default", 2);
142 static void
143 pop_abi_namespace (void)
145 pop_visibility (2);
146 pop_nested_namespace (abi_node);
149 /* Declare language defined type_info type and a pointer to const
150 type_info. This is incomplete here, and will be completed when
151 the user #includes <typeinfo>. There are language defined
152 restrictions on what can be done until that is included. Create
153 the internal versions of the ABI types. */
155 void
156 init_rtti_processing (void)
158 tree type_info_type;
160 push_namespace (std_identifier);
161 type_info_type = xref_tag (class_type, get_identifier ("type_info"),
162 /*tag_scope=*/ts_current, false);
163 pop_namespace ();
164 const_type_info_type_node
165 = cp_build_qualified_type (type_info_type, TYPE_QUAL_CONST);
166 type_info_ptr_type = build_pointer_type (const_type_info_type_node);
168 vec_alloc (unemitted_tinfo_decls, 124);
170 create_tinfo_types ();
173 /* Given the expression EXP of type `class *', return the head of the
174 object pointed to by EXP with type cv void*, if the class has any
175 virtual functions (TYPE_POLYMORPHIC_P), else just return the
176 expression. */
178 tree
179 build_headof (tree exp)
181 tree type = TREE_TYPE (exp);
182 tree offset;
183 tree index;
185 gcc_assert (TYPE_PTR_P (type));
186 type = TREE_TYPE (type);
188 if (!TYPE_POLYMORPHIC_P (type))
189 return exp;
191 /* We use this a couple of times below, protect it. */
192 exp = save_expr (exp);
194 /* The offset-to-top field is at index -2 from the vptr. */
195 index = build_int_cst (NULL_TREE,
196 -2 * TARGET_VTABLE_DATA_ENTRY_DISTANCE);
198 offset = build_vtbl_ref (cp_build_indirect_ref (exp, RO_NULL,
199 tf_warning_or_error),
200 index);
202 type = cp_build_qualified_type (ptr_type_node,
203 cp_type_quals (TREE_TYPE (exp)));
204 return fold_build_pointer_plus (exp, offset);
207 /* Get a bad_cast node for the program to throw...
209 See libstdc++/exception.cc for __throw_bad_cast */
211 static tree
212 throw_bad_cast (void)
214 tree fn = get_identifier ("__cxa_bad_cast");
215 if (!get_global_value_if_present (fn, &fn))
216 fn = push_throw_library_fn (fn, build_function_type_list (ptr_type_node,
217 NULL_TREE));
219 return build_cxx_call (fn, 0, NULL, tf_warning_or_error);
222 /* Return an expression for "__cxa_bad_typeid()". The expression
223 returned is an lvalue of type "const std::type_info". */
225 static tree
226 throw_bad_typeid (void)
228 tree fn = get_identifier ("__cxa_bad_typeid");
229 if (!get_global_value_if_present (fn, &fn))
231 tree t;
233 t = build_reference_type (const_type_info_type_node);
234 t = build_function_type_list (t, NULL_TREE);
235 fn = push_throw_library_fn (fn, t);
238 return build_cxx_call (fn, 0, NULL, tf_warning_or_error);
241 /* Return an lvalue expression whose type is "const std::type_info"
242 and whose value indicates the type of the expression EXP. If EXP
243 is a reference to a polymorphic class, return the dynamic type;
244 otherwise return the static type of the expression. */
246 static tree
247 get_tinfo_decl_dynamic (tree exp, tsubst_flags_t complain)
249 tree type;
250 tree t;
252 if (error_operand_p (exp))
253 return error_mark_node;
255 exp = resolve_nondeduced_context (exp);
257 /* peel back references, so they match. */
258 type = non_reference (TREE_TYPE (exp));
260 /* Peel off cv qualifiers. */
261 type = TYPE_MAIN_VARIANT (type);
263 /* For UNKNOWN_TYPEs call complete_type_or_else to get diagnostics. */
264 if (CLASS_TYPE_P (type) || type == unknown_type_node
265 || type == init_list_type_node)
266 type = complete_type_or_maybe_complain (type, exp, complain);
268 if (!type)
269 return error_mark_node;
271 /* If exp is a reference to polymorphic type, get the real type_info. */
272 if (TYPE_POLYMORPHIC_P (type) && ! resolves_to_fixed_type_p (exp, 0))
274 /* build reference to type_info from vtable. */
275 tree index;
277 /* The RTTI information is at index -1. */
278 index = build_int_cst (NULL_TREE,
279 -1 * TARGET_VTABLE_DATA_ENTRY_DISTANCE);
280 t = build_vtbl_ref (exp, index);
281 t = convert (type_info_ptr_type, t);
283 else
284 /* Otherwise return the type_info for the static type of the expr. */
285 t = get_tinfo_ptr (TYPE_MAIN_VARIANT (type));
287 return cp_build_indirect_ref (t, RO_NULL, complain);
290 static bool
291 typeid_ok_p (void)
293 tree pseudo_type_info, type_info_type;
295 if (! flag_rtti)
297 error ("cannot use typeid with -fno-rtti");
298 return false;
301 if (!COMPLETE_TYPE_P (const_type_info_type_node))
303 error ("must #include <typeinfo> before using typeid");
304 return false;
307 pseudo_type_info = (*tinfo_descs)[TK_TYPE_INFO_TYPE].type;
308 type_info_type = TYPE_MAIN_VARIANT (const_type_info_type_node);
310 /* Make sure abi::__type_info_pseudo has the same alias set
311 as std::type_info. */
312 if (! TYPE_ALIAS_SET_KNOWN_P (pseudo_type_info))
313 TYPE_ALIAS_SET (pseudo_type_info) = get_alias_set (type_info_type);
314 else
315 gcc_assert (TYPE_ALIAS_SET (pseudo_type_info)
316 == get_alias_set (type_info_type));
318 return true;
321 /* Return an expression for "typeid(EXP)". The expression returned is
322 an lvalue of type "const std::type_info". */
324 tree
325 build_typeid (tree exp, tsubst_flags_t complain)
327 tree cond = NULL_TREE, initial_expr = exp;
328 int nonnull = 0;
330 if (exp == error_mark_node || !typeid_ok_p ())
331 return error_mark_node;
333 if (processing_template_decl)
334 return build_min (TYPEID_EXPR, const_type_info_type_node, exp);
336 /* FIXME when integrating with c_fully_fold, mark
337 resolves_to_fixed_type_p case as a non-constant expression. */
338 if (TYPE_POLYMORPHIC_P (TREE_TYPE (exp))
339 && ! resolves_to_fixed_type_p (exp, &nonnull)
340 && ! nonnull)
342 /* So we need to look into the vtable of the type of exp.
343 Make sure it isn't a null lvalue. */
344 exp = cp_build_addr_expr (exp, complain);
345 exp = stabilize_reference (exp);
346 cond = cp_convert (boolean_type_node, exp, complain);
347 exp = cp_build_indirect_ref (exp, RO_NULL, complain);
350 exp = get_tinfo_decl_dynamic (exp, complain);
352 if (exp == error_mark_node)
353 return error_mark_node;
355 if (cond)
357 tree bad = throw_bad_typeid ();
359 exp = build3 (COND_EXPR, TREE_TYPE (exp), cond, exp, bad);
361 else
362 mark_type_use (initial_expr);
364 return exp;
367 /* Generate the NTBS name of a type. If MARK_PRIVATE, put a '*' in front so that
368 comparisons will be done by pointer rather than string comparison. */
369 static tree
370 tinfo_name (tree type, bool mark_private)
372 const char *name;
373 int length;
374 tree name_string;
376 name = mangle_type_string (type);
377 length = strlen (name);
379 if (mark_private)
381 /* Inject '*' at beginning of name to force pointer comparison. */
382 char* buf = (char*) XALLOCAVEC (char, length + 2);
383 buf[0] = '*';
384 memcpy (buf + 1, name, length + 1);
385 name_string = build_string (length + 2, buf);
387 else
388 name_string = build_string (length + 1, name);
390 return fix_string_type (name_string);
393 /* Return a VAR_DECL for the internal ABI defined type_info object for
394 TYPE. You must arrange that the decl is mark_used, if actually use
395 it --- decls in vtables are only used if the vtable is output. */
397 tree
398 get_tinfo_decl (tree type)
400 tree name;
401 tree d;
403 if (variably_modified_type_p (type, /*fn=*/NULL_TREE))
405 error ("cannot create type information for type %qT because "
406 "it involves types of variable size",
407 type);
408 return error_mark_node;
411 if (TREE_CODE (type) == METHOD_TYPE)
412 type = build_function_type (TREE_TYPE (type),
413 TREE_CHAIN (TYPE_ARG_TYPES (type)));
415 type = complete_type (type);
417 /* For a class type, the variable is cached in the type node
418 itself. */
419 if (CLASS_TYPE_P (type))
421 d = CLASSTYPE_TYPEINFO_VAR (TYPE_MAIN_VARIANT (type));
422 if (d)
423 return d;
426 name = mangle_typeinfo_for_type (type);
428 d = IDENTIFIER_GLOBAL_VALUE (name);
429 if (!d)
431 int ix = get_pseudo_ti_index (type);
432 tinfo_s *ti = &(*tinfo_descs)[ix];
434 d = build_lang_decl (VAR_DECL, name, ti->type);
435 SET_DECL_ASSEMBLER_NAME (d, name);
436 /* Remember the type it is for. */
437 TREE_TYPE (name) = type;
438 DECL_TINFO_P (d) = 1;
439 DECL_ARTIFICIAL (d) = 1;
440 DECL_IGNORED_P (d) = 1;
441 TREE_READONLY (d) = 1;
442 TREE_STATIC (d) = 1;
443 /* Mark the variable as undefined -- but remember that we can
444 define it later if we need to do so. */
445 DECL_EXTERNAL (d) = 1;
446 DECL_NOT_REALLY_EXTERN (d) = 1;
447 set_linkage_according_to_type (type, d);
449 d = pushdecl_top_level_and_finish (d, NULL_TREE);
450 if (CLASS_TYPE_P (type))
451 CLASSTYPE_TYPEINFO_VAR (TYPE_MAIN_VARIANT (type)) = d;
453 /* Add decl to the global array of tinfo decls. */
454 vec_safe_push (unemitted_tinfo_decls, d);
457 return d;
460 /* Return a pointer to a type_info object describing TYPE, suitably
461 cast to the language defined type. */
463 static tree
464 get_tinfo_ptr (tree type)
466 tree decl = get_tinfo_decl (type);
468 mark_used (decl);
469 return build_nop (type_info_ptr_type,
470 build_address (decl));
473 /* Return the type_info object for TYPE. */
475 tree
476 get_typeid (tree type, tsubst_flags_t complain)
478 if (type == error_mark_node || !typeid_ok_p ())
479 return error_mark_node;
481 if (processing_template_decl)
482 return build_min (TYPEID_EXPR, const_type_info_type_node, type);
484 /* If the type of the type-id is a reference type, the result of the
485 typeid expression refers to a type_info object representing the
486 referenced type. */
487 type = non_reference (type);
489 /* This is not one of the uses of a qualified function type in 8.3.5. */
490 if (TREE_CODE (type) == FUNCTION_TYPE
491 && (type_memfn_quals (type) != TYPE_UNQUALIFIED
492 || type_memfn_rqual (type) != REF_QUAL_NONE))
494 if (complain & tf_error)
495 error ("typeid of qualified function type %qT", type);
496 return error_mark_node;
499 /* The top-level cv-qualifiers of the lvalue expression or the type-id
500 that is the operand of typeid are always ignored. */
501 type = TYPE_MAIN_VARIANT (type);
503 /* For UNKNOWN_TYPEs call complete_type_or_else to get diagnostics. */
504 if (CLASS_TYPE_P (type) || type == unknown_type_node
505 || type == init_list_type_node)
506 type = complete_type_or_maybe_complain (type, NULL_TREE, complain);
508 if (!type)
509 return error_mark_node;
511 return cp_build_indirect_ref (get_tinfo_ptr (type), RO_NULL, complain);
514 /* Check whether TEST is null before returning RESULT. If TEST is used in
515 RESULT, it must have previously had a save_expr applied to it. */
517 static tree
518 ifnonnull (tree test, tree result, tsubst_flags_t complain)
520 return build3 (COND_EXPR, TREE_TYPE (result),
521 build2 (EQ_EXPR, boolean_type_node, test,
522 cp_convert (TREE_TYPE (test), nullptr_node,
523 complain)),
524 cp_convert (TREE_TYPE (result), nullptr_node, complain),
525 result);
528 /* Execute a dynamic cast, as described in section 5.2.6 of the 9/93 working
529 paper. */
531 static tree
532 build_dynamic_cast_1 (tree type, tree expr, tsubst_flags_t complain)
534 enum tree_code tc = TREE_CODE (type);
535 tree exprtype;
536 tree dcast_fn;
537 tree old_expr = expr;
538 const char *errstr = NULL;
540 /* Save casted types in the function's used types hash table. */
541 used_types_insert (type);
543 /* T shall be a pointer or reference to a complete class type, or
544 `pointer to cv void''. */
545 switch (tc)
547 case POINTER_TYPE:
548 if (VOID_TYPE_P (TREE_TYPE (type)))
549 break;
550 /* Fall through. */
551 case REFERENCE_TYPE:
552 if (! MAYBE_CLASS_TYPE_P (TREE_TYPE (type)))
554 errstr = _("target is not pointer or reference to class");
555 goto fail;
557 if (!COMPLETE_TYPE_P (complete_type (TREE_TYPE (type))))
559 errstr = _("target is not pointer or reference to complete type");
560 goto fail;
562 break;
564 default:
565 errstr = _("target is not pointer or reference");
566 goto fail;
569 if (tc == POINTER_TYPE)
571 expr = decay_conversion (expr, complain);
572 exprtype = TREE_TYPE (expr);
574 /* If T is a pointer type, v shall be an rvalue of a pointer to
575 complete class type, and the result is an rvalue of type T. */
577 expr = mark_rvalue_use (expr);
579 if (!TYPE_PTR_P (exprtype))
581 errstr = _("source is not a pointer");
582 goto fail;
584 if (! MAYBE_CLASS_TYPE_P (TREE_TYPE (exprtype)))
586 errstr = _("source is not a pointer to class");
587 goto fail;
589 if (!COMPLETE_TYPE_P (complete_type (TREE_TYPE (exprtype))))
591 errstr = _("source is a pointer to incomplete type");
592 goto fail;
595 else
597 expr = mark_lvalue_use (expr);
599 exprtype = build_reference_type (TREE_TYPE (expr));
601 /* T is a reference type, v shall be an lvalue of a complete class
602 type, and the result is an lvalue of the type referred to by T. */
604 if (! MAYBE_CLASS_TYPE_P (TREE_TYPE (exprtype)))
606 errstr = _("source is not of class type");
607 goto fail;
609 if (!COMPLETE_TYPE_P (complete_type (TREE_TYPE (exprtype))))
611 errstr = _("source is of incomplete class type");
612 goto fail;
616 /* The dynamic_cast operator shall not cast away constness. */
617 if (!at_least_as_qualified_p (TREE_TYPE (type),
618 TREE_TYPE (exprtype)))
620 errstr = _("conversion casts away constness");
621 goto fail;
624 /* If *type is an unambiguous accessible base class of *exprtype,
625 convert statically. */
627 tree binfo = lookup_base (TREE_TYPE (exprtype), TREE_TYPE (type),
628 ba_check, NULL, complain);
629 if (binfo)
630 return build_static_cast (type, expr, complain);
633 /* Apply trivial conversion T -> T& for dereferenced ptrs. */
634 if (tc == REFERENCE_TYPE)
635 expr = convert_to_reference (exprtype, expr, CONV_IMPLICIT,
636 LOOKUP_NORMAL, NULL_TREE, complain);
638 /* Otherwise *exprtype must be a polymorphic class (have a vtbl). */
639 if (TYPE_POLYMORPHIC_P (TREE_TYPE (exprtype)))
641 tree expr1;
642 /* if TYPE is `void *', return pointer to complete object. */
643 if (tc == POINTER_TYPE && VOID_TYPE_P (TREE_TYPE (type)))
645 /* if b is an object, dynamic_cast<void *>(&b) == (void *)&b. */
646 if (TREE_CODE (expr) == ADDR_EXPR
647 && VAR_P (TREE_OPERAND (expr, 0))
648 && TREE_CODE (TREE_TYPE (TREE_OPERAND (expr, 0))) == RECORD_TYPE)
649 return build1 (NOP_EXPR, type, expr);
651 /* Since expr is used twice below, save it. */
652 expr = save_expr (expr);
654 expr1 = build_headof (expr);
655 if (TREE_TYPE (expr1) != type)
656 expr1 = build1 (NOP_EXPR, type, expr1);
657 return ifnonnull (expr, expr1, complain);
659 else
661 tree retval;
662 tree result, td2, td3;
663 tree elems[4];
664 tree static_type, target_type, boff;
666 /* If we got here, we can't convert statically. Therefore,
667 dynamic_cast<D&>(b) (b an object) cannot succeed. */
668 if (tc == REFERENCE_TYPE)
670 if (VAR_P (old_expr)
671 && TREE_CODE (TREE_TYPE (old_expr)) == RECORD_TYPE)
673 tree expr = throw_bad_cast ();
674 if (complain & tf_warning)
675 warning (0, "dynamic_cast of %q#D to %q#T can never succeed",
676 old_expr, type);
677 /* Bash it to the expected type. */
678 TREE_TYPE (expr) = type;
679 return expr;
682 /* Ditto for dynamic_cast<D*>(&b). */
683 else if (TREE_CODE (expr) == ADDR_EXPR)
685 tree op = TREE_OPERAND (expr, 0);
686 if (VAR_P (op)
687 && TREE_CODE (TREE_TYPE (op)) == RECORD_TYPE)
689 if (complain & tf_warning)
690 warning (0, "dynamic_cast of %q#D to %q#T can never succeed",
691 op, type);
692 retval = build_int_cst (type, 0);
693 return retval;
697 /* Use of dynamic_cast when -fno-rtti is prohibited. */
698 if (!flag_rtti)
700 if (complain & tf_error)
701 error ("%<dynamic_cast%> not permitted with -fno-rtti");
702 return error_mark_node;
705 target_type = TYPE_MAIN_VARIANT (TREE_TYPE (type));
706 static_type = TYPE_MAIN_VARIANT (TREE_TYPE (exprtype));
707 td2 = get_tinfo_decl (target_type);
708 if (!mark_used (td2, complain) && !(complain & tf_error))
709 return error_mark_node;
710 td2 = cp_build_addr_expr (td2, complain);
711 td3 = get_tinfo_decl (static_type);
712 if (!mark_used (td3, complain) && !(complain & tf_error))
713 return error_mark_node;
714 td3 = cp_build_addr_expr (td3, complain);
716 /* Determine how T and V are related. */
717 boff = dcast_base_hint (static_type, target_type);
719 /* Since expr is used twice below, save it. */
720 expr = save_expr (expr);
722 expr1 = expr;
723 if (tc == REFERENCE_TYPE)
724 expr1 = cp_build_addr_expr (expr1, complain);
726 elems[0] = expr1;
727 elems[1] = td3;
728 elems[2] = td2;
729 elems[3] = boff;
731 dcast_fn = dynamic_cast_node;
732 if (!dcast_fn)
734 tree tmp;
735 tree tinfo_ptr;
736 const char *name;
738 push_abi_namespace ();
739 tinfo_ptr = xref_tag (class_type,
740 get_identifier ("__class_type_info"),
741 /*tag_scope=*/ts_current, false);
743 tinfo_ptr = build_pointer_type
744 (cp_build_qualified_type
745 (tinfo_ptr, TYPE_QUAL_CONST));
746 name = "__dynamic_cast";
747 tmp = build_function_type_list (ptr_type_node,
748 const_ptr_type_node,
749 tinfo_ptr, tinfo_ptr,
750 ptrdiff_type_node, NULL_TREE);
751 dcast_fn = build_library_fn_ptr (name, tmp,
752 ECF_LEAF | ECF_PURE | ECF_NOTHROW);
753 pop_abi_namespace ();
754 dynamic_cast_node = dcast_fn;
756 result = build_cxx_call (dcast_fn, 4, elems, complain);
758 if (tc == REFERENCE_TYPE)
760 tree bad = throw_bad_cast ();
761 tree neq;
763 result = save_expr (result);
764 neq = cp_truthvalue_conversion (result);
765 return cp_convert (type,
766 build3 (COND_EXPR, TREE_TYPE (result),
767 neq, result, bad), complain);
770 /* Now back to the type we want from a void*. */
771 result = cp_convert (type, result, complain);
772 return ifnonnull (expr, result, complain);
775 else
776 errstr = _("source type is not polymorphic");
778 fail:
779 if (complain & tf_error)
780 error ("cannot dynamic_cast %qE (of type %q#T) to type %q#T (%s)",
781 old_expr, TREE_TYPE (old_expr), type, errstr);
782 return error_mark_node;
785 tree
786 build_dynamic_cast (tree type, tree expr, tsubst_flags_t complain)
788 tree r;
790 if (type == error_mark_node || expr == error_mark_node)
791 return error_mark_node;
793 if (processing_template_decl)
795 expr = build_min (DYNAMIC_CAST_EXPR, type, expr);
796 TREE_SIDE_EFFECTS (expr) = 1;
797 return convert_from_reference (expr);
800 r = convert_from_reference (build_dynamic_cast_1 (type, expr, complain));
801 if (r != error_mark_node)
802 maybe_warn_about_useless_cast (type, expr, complain);
803 return r;
806 /* Return the runtime bit mask encoding the qualifiers of TYPE. */
808 static int
809 qualifier_flags (tree type)
811 int flags = 0;
812 int quals = cp_type_quals (type);
814 if (quals & TYPE_QUAL_CONST)
815 flags |= 1;
816 if (quals & TYPE_QUAL_VOLATILE)
817 flags |= 2;
818 if (quals & TYPE_QUAL_RESTRICT)
819 flags |= 4;
820 return flags;
823 /* Return true, if the pointer chain TYPE ends at an incomplete type, or
824 contains a pointer to member of an incomplete class. */
826 static bool
827 target_incomplete_p (tree type)
829 while (true)
830 if (TYPE_PTRDATAMEM_P (type))
832 if (!COMPLETE_TYPE_P (TYPE_PTRMEM_CLASS_TYPE (type)))
833 return true;
834 type = TYPE_PTRMEM_POINTED_TO_TYPE (type);
836 else if (TYPE_PTR_P (type))
837 type = TREE_TYPE (type);
838 else
839 return !COMPLETE_OR_VOID_TYPE_P (type);
842 /* Returns true if TYPE involves an incomplete class type; in that
843 case, typeinfo variables for TYPE should be emitted with internal
844 linkage. */
846 static bool
847 involves_incomplete_p (tree type)
849 switch (TREE_CODE (type))
851 case POINTER_TYPE:
852 return target_incomplete_p (TREE_TYPE (type));
854 case OFFSET_TYPE:
855 ptrmem:
856 return
857 (target_incomplete_p (TYPE_PTRMEM_POINTED_TO_TYPE (type))
858 || !COMPLETE_TYPE_P (TYPE_PTRMEM_CLASS_TYPE (type)));
860 case RECORD_TYPE:
861 if (TYPE_PTRMEMFUNC_P (type))
862 goto ptrmem;
863 /* Fall through. */
864 case UNION_TYPE:
865 if (!COMPLETE_TYPE_P (type))
866 return true;
868 default:
869 /* All other types do not involve incomplete class types. */
870 return false;
874 /* Return a CONSTRUCTOR for the common part of the type_info objects. This
875 is the vtable pointer and NTBS name. The NTBS name is emitted as a
876 comdat const char array, so it becomes a unique key for the type. Generate
877 and emit that VAR_DECL here. (We can't always emit the type_info itself
878 as comdat, because of pointers to incomplete.) */
880 static tree
881 tinfo_base_init (tinfo_s *ti, tree target)
883 tree init;
884 tree name_decl;
885 tree vtable_ptr;
886 vec<constructor_elt, va_gc> *v;
889 tree name_name, name_string;
891 /* Generate the NTBS array variable. */
892 tree name_type = build_cplus_array_type
893 (cp_build_qualified_type (char_type_node, TYPE_QUAL_CONST),
894 NULL_TREE);
896 /* Determine the name of the variable -- and remember with which
897 type it is associated. */
898 name_name = mangle_typeinfo_string_for_type (target);
899 TREE_TYPE (name_name) = target;
901 name_decl = build_lang_decl (VAR_DECL, name_name, name_type);
902 SET_DECL_ASSEMBLER_NAME (name_decl, name_name);
903 DECL_ARTIFICIAL (name_decl) = 1;
904 DECL_IGNORED_P (name_decl) = 1;
905 TREE_READONLY (name_decl) = 1;
906 TREE_STATIC (name_decl) = 1;
907 DECL_EXTERNAL (name_decl) = 0;
908 DECL_TINFO_P (name_decl) = 1;
909 set_linkage_according_to_type (target, name_decl);
910 import_export_decl (name_decl);
911 name_string = tinfo_name (target, !TREE_PUBLIC (name_decl));
912 DECL_INITIAL (name_decl) = name_string;
913 mark_used (name_decl);
914 pushdecl_top_level_and_finish (name_decl, name_string);
917 vtable_ptr = ti->vtable;
918 if (!vtable_ptr)
920 tree real_type;
921 push_abi_namespace ();
922 real_type = xref_tag (class_type, ti->name,
923 /*tag_scope=*/ts_current, false);
924 pop_abi_namespace ();
926 if (!COMPLETE_TYPE_P (real_type))
928 /* We never saw a definition of this type, so we need to
929 tell the compiler that this is an exported class, as
930 indeed all of the __*_type_info classes are. */
931 SET_CLASSTYPE_INTERFACE_KNOWN (real_type);
932 CLASSTYPE_INTERFACE_ONLY (real_type) = 1;
935 vtable_ptr = get_vtable_decl (real_type, /*complete=*/1);
936 vtable_ptr = cp_build_addr_expr (vtable_ptr, tf_warning_or_error);
938 /* We need to point into the middle of the vtable. */
939 vtable_ptr = fold_build_pointer_plus
940 (vtable_ptr,
941 size_binop (MULT_EXPR,
942 size_int (2 * TARGET_VTABLE_DATA_ENTRY_DISTANCE),
943 TYPE_SIZE_UNIT (vtable_entry_type)));
945 ti->vtable = vtable_ptr;
948 vec_alloc (v, 2);
949 CONSTRUCTOR_APPEND_ELT (v, NULL_TREE, vtable_ptr);
950 CONSTRUCTOR_APPEND_ELT (v, NULL_TREE,
951 decay_conversion (name_decl, tf_warning_or_error));
953 init = build_constructor (init_list_type_node, v);
954 TREE_CONSTANT (init) = 1;
955 TREE_STATIC (init) = 1;
957 return init;
960 /* Return the CONSTRUCTOR expr for a type_info of TYPE. TI provides the
961 information about the particular type_info derivation, which adds no
962 additional fields to the type_info base. */
964 static tree
965 generic_initializer (tinfo_s *ti, tree target)
967 tree init = tinfo_base_init (ti, target);
969 init = build_constructor_single (init_list_type_node, NULL_TREE, init);
970 TREE_CONSTANT (init) = 1;
971 TREE_STATIC (init) = 1;
972 return init;
975 /* Return the CONSTRUCTOR expr for a type_info of pointer TYPE.
976 TI provides information about the particular type_info derivation,
977 which adds target type and qualifier flags members to the type_info base. */
979 static tree
980 ptr_initializer (tinfo_s *ti, tree target)
982 tree init = tinfo_base_init (ti, target);
983 tree to = TREE_TYPE (target);
984 int flags = qualifier_flags (to);
985 bool incomplete = target_incomplete_p (to);
986 vec<constructor_elt, va_gc> *v;
987 vec_alloc (v, 3);
989 if (incomplete)
990 flags |= 8;
991 CONSTRUCTOR_APPEND_ELT (v, NULL_TREE, init);
992 CONSTRUCTOR_APPEND_ELT (v, NULL_TREE, build_int_cst (NULL_TREE, flags));
993 CONSTRUCTOR_APPEND_ELT (v, NULL_TREE,
994 get_tinfo_ptr (TYPE_MAIN_VARIANT (to)));
996 init = build_constructor (init_list_type_node, v);
997 TREE_CONSTANT (init) = 1;
998 TREE_STATIC (init) = 1;
999 return init;
1002 /* Return the CONSTRUCTOR expr for a type_info of pointer to member data TYPE.
1003 TI provides information about the particular type_info derivation,
1004 which adds class, target type and qualifier flags members to the type_info
1005 base. */
1007 static tree
1008 ptm_initializer (tinfo_s *ti, tree target)
1010 tree init = tinfo_base_init (ti, target);
1011 tree to = TYPE_PTRMEM_POINTED_TO_TYPE (target);
1012 tree klass = TYPE_PTRMEM_CLASS_TYPE (target);
1013 int flags = qualifier_flags (to);
1014 bool incomplete = target_incomplete_p (to);
1015 vec<constructor_elt, va_gc> *v;
1016 vec_alloc (v, 4);
1018 if (incomplete)
1019 flags |= 0x8;
1020 if (!COMPLETE_TYPE_P (klass))
1021 flags |= 0x10;
1022 CONSTRUCTOR_APPEND_ELT (v, NULL_TREE, init);
1023 CONSTRUCTOR_APPEND_ELT (v, NULL_TREE, build_int_cst (NULL_TREE, flags));
1024 CONSTRUCTOR_APPEND_ELT (v, NULL_TREE,
1025 get_tinfo_ptr (TYPE_MAIN_VARIANT (to)));
1026 CONSTRUCTOR_APPEND_ELT (v, NULL_TREE, get_tinfo_ptr (klass));
1028 init = build_constructor (init_list_type_node, v);
1029 TREE_CONSTANT (init) = 1;
1030 TREE_STATIC (init) = 1;
1031 return init;
1034 /* Return the CONSTRUCTOR expr for a type_info of class TYPE.
1035 TI provides information about the particular __class_type_info derivation,
1036 which adds hint flags and N extra initializers to the type_info base. */
1038 static tree
1039 class_initializer (tinfo_s *ti, tree target, unsigned n, ...)
1041 tree init = tinfo_base_init (ti, target);
1042 va_list extra_inits;
1043 unsigned i;
1044 vec<constructor_elt, va_gc> *v;
1045 vec_alloc (v, n+1);
1047 CONSTRUCTOR_APPEND_ELT (v, NULL_TREE, init);
1048 va_start (extra_inits, n);
1049 for (i = 0; i < n; i++)
1050 CONSTRUCTOR_APPEND_ELT (v, NULL_TREE, va_arg (extra_inits, tree));
1051 va_end (extra_inits);
1053 init = build_constructor (init_list_type_node, v);
1054 TREE_CONSTANT (init) = 1;
1055 TREE_STATIC (init) = 1;
1056 return init;
1059 /* Returns true if the typeinfo for type should be placed in
1060 the runtime library. */
1062 static bool
1063 typeinfo_in_lib_p (tree type)
1065 /* The typeinfo objects for `T*' and `const T*' are in the runtime
1066 library for simple types T. */
1067 if (TYPE_PTR_P (type)
1068 && (cp_type_quals (TREE_TYPE (type)) == TYPE_QUAL_CONST
1069 || cp_type_quals (TREE_TYPE (type)) == TYPE_UNQUALIFIED))
1070 type = TREE_TYPE (type);
1072 switch (TREE_CODE (type))
1074 case INTEGER_TYPE:
1075 case BOOLEAN_TYPE:
1076 case REAL_TYPE:
1077 case VOID_TYPE:
1078 case NULLPTR_TYPE:
1079 return true;
1081 case LANG_TYPE:
1082 /* fall through. */
1084 default:
1085 return false;
1089 /* Generate the initializer for the type info describing TYPE. TK_INDEX is
1090 the index of the descriptor in the tinfo_desc vector. */
1092 static tree
1093 get_pseudo_ti_init (tree type, unsigned tk_index)
1095 tinfo_s *ti = &(*tinfo_descs)[tk_index];
1097 gcc_assert (at_eof);
1098 switch (tk_index)
1100 case TK_POINTER_MEMBER_TYPE:
1101 return ptm_initializer (ti, type);
1103 case TK_POINTER_TYPE:
1104 return ptr_initializer (ti, type);
1106 case TK_BUILTIN_TYPE:
1107 case TK_ENUMERAL_TYPE:
1108 case TK_FUNCTION_TYPE:
1109 case TK_ARRAY_TYPE:
1110 return generic_initializer (ti, type);
1112 case TK_CLASS_TYPE:
1113 return class_initializer (ti, type, 0);
1115 case TK_SI_CLASS_TYPE:
1117 tree base_binfo = BINFO_BASE_BINFO (TYPE_BINFO (type), 0);
1118 tree tinfo = get_tinfo_ptr (BINFO_TYPE (base_binfo));
1120 /* get_tinfo_ptr might have reallocated the tinfo_descs vector. */
1121 ti = &(*tinfo_descs)[tk_index];
1122 return class_initializer (ti, type, 1, tinfo);
1125 default:
1127 int hint = ((CLASSTYPE_REPEATED_BASE_P (type) << 0)
1128 | (CLASSTYPE_DIAMOND_SHAPED_P (type) << 1));
1129 tree binfo = TYPE_BINFO (type);
1130 int nbases = BINFO_N_BASE_BINFOS (binfo);
1131 vec<tree, va_gc> *base_accesses = BINFO_BASE_ACCESSES (binfo);
1132 tree offset_type = LONGPTR_T;
1133 tree base_inits = NULL_TREE;
1134 int ix;
1135 vec<constructor_elt, va_gc> *init_vec = NULL;
1136 constructor_elt *e;
1138 gcc_assert (tk_index >= TK_FIXED);
1140 vec_safe_grow (init_vec, nbases);
1141 /* Generate the base information initializer. */
1142 for (ix = nbases; ix--;)
1144 tree base_binfo = BINFO_BASE_BINFO (binfo, ix);
1145 tree base_init;
1146 int flags = 0;
1147 tree tinfo;
1148 tree offset;
1149 vec<constructor_elt, va_gc> *v;
1151 if ((*base_accesses)[ix] == access_public_node)
1152 flags |= 2;
1153 tinfo = get_tinfo_ptr (BINFO_TYPE (base_binfo));
1154 if (BINFO_VIRTUAL_P (base_binfo))
1156 /* We store the vtable offset at which the virtual
1157 base offset can be found. */
1158 offset = BINFO_VPTR_FIELD (base_binfo);
1159 flags |= 1;
1161 else
1162 offset = BINFO_OFFSET (base_binfo);
1164 /* Combine offset and flags into one field. */
1165 offset = fold_convert (offset_type, offset);
1166 offset = fold_build2_loc (input_location,
1167 LSHIFT_EXPR, offset_type, offset,
1168 build_int_cst (offset_type, 8));
1169 offset = fold_build2_loc (input_location,
1170 BIT_IOR_EXPR, offset_type, offset,
1171 build_int_cst (offset_type, flags));
1172 vec_alloc (v, 2);
1173 CONSTRUCTOR_APPEND_ELT (v, NULL_TREE, tinfo);
1174 CONSTRUCTOR_APPEND_ELT (v, NULL_TREE, offset);
1175 base_init = build_constructor (init_list_type_node, v);
1176 e = &(*init_vec)[ix];
1177 e->index = NULL_TREE;
1178 e->value = base_init;
1180 base_inits = build_constructor (init_list_type_node, init_vec);
1182 /* get_tinfo_ptr might have reallocated the tinfo_descs vector. */
1183 ti = &(*tinfo_descs)[tk_index];
1184 return class_initializer (ti, type, 3,
1185 build_int_cst (NULL_TREE, hint),
1186 build_int_cst (NULL_TREE, nbases),
1187 base_inits);
1192 /* Generate the RECORD_TYPE containing the data layout of a type_info
1193 derivative as used by the runtime. This layout must be consistent with
1194 that defined in the runtime support. Also generate the VAR_DECL for the
1195 type's vtable. We explicitly manage the vtable member, and name it for
1196 real type as used in the runtime. The RECORD type has a different name,
1197 to avoid collisions. Return a TREE_LIST who's TINFO_PSEUDO_TYPE
1198 is the generated type and TINFO_VTABLE_NAME is the name of the
1199 vtable. We have to delay generating the VAR_DECL of the vtable
1200 until the end of the translation, when we'll have seen the library
1201 definition, if there was one.
1203 REAL_NAME is the runtime's name of the type. Trailing arguments are
1204 additional FIELD_DECL's for the structure. The final argument must be
1205 NULL. */
1207 static void
1208 create_pseudo_type_info (int tk, const char *real_name, ...)
1210 tinfo_s *ti;
1211 tree pseudo_type;
1212 char *pseudo_name;
1213 tree fields;
1214 tree field_decl;
1215 va_list ap;
1217 va_start (ap, real_name);
1219 /* Generate the pseudo type name. */
1220 pseudo_name = (char *) alloca (strlen (real_name) + 30);
1221 strcpy (pseudo_name, real_name);
1222 strcat (pseudo_name, "_pseudo");
1223 if (tk >= TK_FIXED)
1224 sprintf (pseudo_name + strlen (pseudo_name), "%d", tk - TK_FIXED);
1226 /* First field is the pseudo type_info base class. */
1227 fields = build_decl (input_location,
1228 FIELD_DECL, NULL_TREE,
1229 (*tinfo_descs)[TK_TYPE_INFO_TYPE].type);
1231 /* Now add the derived fields. */
1232 while ((field_decl = va_arg (ap, tree)))
1234 DECL_CHAIN (field_decl) = fields;
1235 fields = field_decl;
1238 /* Create the pseudo type. */
1239 pseudo_type = make_class_type (RECORD_TYPE);
1240 finish_builtin_struct (pseudo_type, pseudo_name, fields, NULL_TREE);
1241 CLASSTYPE_AS_BASE (pseudo_type) = pseudo_type;
1243 ti = &(*tinfo_descs)[tk];
1244 ti->type = cp_build_qualified_type (pseudo_type, TYPE_QUAL_CONST);
1245 ti->name = get_identifier (real_name);
1246 ti->vtable = NULL_TREE;
1248 /* Pretend this is public so determine_visibility doesn't give vtables
1249 internal linkage. */
1250 TREE_PUBLIC (TYPE_MAIN_DECL (ti->type)) = 1;
1252 va_end (ap);
1255 /* Return the index of a pseudo type info type node used to describe
1256 TYPE. TYPE must be a complete type (or cv void), except at the end
1257 of the translation unit. */
1259 static unsigned
1260 get_pseudo_ti_index (tree type)
1262 unsigned ix;
1264 switch (TREE_CODE (type))
1266 case OFFSET_TYPE:
1267 ix = TK_POINTER_MEMBER_TYPE;
1268 break;
1270 case POINTER_TYPE:
1271 ix = TK_POINTER_TYPE;
1272 break;
1274 case ENUMERAL_TYPE:
1275 ix = TK_ENUMERAL_TYPE;
1276 break;
1278 case FUNCTION_TYPE:
1279 ix = TK_FUNCTION_TYPE;
1280 break;
1282 case ARRAY_TYPE:
1283 ix = TK_ARRAY_TYPE;
1284 break;
1286 case UNION_TYPE:
1287 case RECORD_TYPE:
1288 if (TYPE_PTRMEMFUNC_P (type))
1290 ix = TK_POINTER_MEMBER_TYPE;
1291 break;
1293 else if (!COMPLETE_TYPE_P (type))
1295 if (!at_eof)
1296 cxx_incomplete_type_error (NULL_TREE, type);
1297 ix = TK_CLASS_TYPE;
1298 break;
1300 else if (!BINFO_N_BASE_BINFOS (TYPE_BINFO (type)))
1302 ix = TK_CLASS_TYPE;
1303 break;
1305 else
1307 tree binfo = TYPE_BINFO (type);
1308 vec<tree, va_gc> *base_accesses = BINFO_BASE_ACCESSES (binfo);
1309 tree base_binfo = BINFO_BASE_BINFO (binfo, 0);
1310 int num_bases = BINFO_N_BASE_BINFOS (binfo);
1312 if (num_bases == 1
1313 && (*base_accesses)[0] == access_public_node
1314 && !BINFO_VIRTUAL_P (base_binfo)
1315 && integer_zerop (BINFO_OFFSET (base_binfo)))
1317 /* single non-virtual public. */
1318 ix = TK_SI_CLASS_TYPE;
1319 break;
1321 else
1323 tinfo_s *ti;
1324 tree array_domain, base_array;
1326 ix = TK_FIXED + num_bases;
1327 if (vec_safe_length (tinfo_descs) <= ix)
1329 /* too short, extend. */
1330 unsigned len = vec_safe_length (tinfo_descs);
1332 vec_safe_grow (tinfo_descs, ix + 1);
1333 while (tinfo_descs->iterate (len++, &ti))
1334 ti->type = ti->vtable = ti->name = NULL_TREE;
1336 else if ((*tinfo_descs)[ix].type)
1337 /* already created. */
1338 break;
1340 /* Create the array of __base_class_type_info entries. */
1341 array_domain = build_index_type (size_int (num_bases - 1));
1342 base_array = build_array_type ((*tinfo_descs)[TK_BASE_TYPE].type,
1343 array_domain);
1345 push_abi_namespace ();
1346 create_pseudo_type_info
1347 (ix, "__vmi_class_type_info",
1348 build_decl (input_location,
1349 FIELD_DECL, NULL_TREE, integer_type_node),
1350 build_decl (input_location,
1351 FIELD_DECL, NULL_TREE, integer_type_node),
1352 build_decl (input_location,
1353 FIELD_DECL, NULL_TREE, base_array),
1354 NULL);
1355 pop_abi_namespace ();
1356 break;
1359 default:
1360 ix = TK_BUILTIN_TYPE;
1361 break;
1363 return ix;
1366 /* Make sure the required builtin types exist for generating the type_info
1367 variable definitions. */
1369 static void
1370 create_tinfo_types (void)
1372 tinfo_s *ti;
1374 gcc_assert (!tinfo_descs);
1376 vec_safe_grow (tinfo_descs, TK_FIXED);
1378 push_abi_namespace ();
1380 /* Create the internal type_info structure. This is used as a base for
1381 the other structures. */
1383 tree field, fields;
1385 field = build_decl (BUILTINS_LOCATION,
1386 FIELD_DECL, NULL_TREE, const_ptr_type_node);
1387 fields = field;
1389 field = build_decl (BUILTINS_LOCATION,
1390 FIELD_DECL, NULL_TREE, const_string_type_node);
1391 DECL_CHAIN (field) = fields;
1392 fields = field;
1394 ti = &(*tinfo_descs)[TK_TYPE_INFO_TYPE];
1395 ti->type = make_class_type (RECORD_TYPE);
1396 ti->vtable = NULL_TREE;
1397 ti->name = NULL_TREE;
1398 finish_builtin_struct (ti->type, "__type_info_pseudo",
1399 fields, NULL_TREE);
1402 /* Fundamental type_info */
1403 create_pseudo_type_info (TK_BUILTIN_TYPE, "__fundamental_type_info", NULL);
1405 /* Array, function and enum type_info. No additional fields. */
1406 create_pseudo_type_info (TK_ARRAY_TYPE, "__array_type_info", NULL);
1407 create_pseudo_type_info (TK_FUNCTION_TYPE, "__function_type_info", NULL);
1408 create_pseudo_type_info (TK_ENUMERAL_TYPE, "__enum_type_info", NULL);
1410 /* Class type_info. No additional fields. */
1411 create_pseudo_type_info (TK_CLASS_TYPE, "__class_type_info", NULL);
1413 /* Single public non-virtual base class. Add pointer to base class.
1414 This is really a descendant of __class_type_info. */
1415 create_pseudo_type_info (TK_SI_CLASS_TYPE, "__si_class_type_info",
1416 build_decl (BUILTINS_LOCATION,
1417 FIELD_DECL, NULL_TREE, type_info_ptr_type),
1418 NULL);
1420 /* Base class internal helper. Pointer to base type, offset to base,
1421 flags. */
1423 tree field, fields;
1425 field = build_decl (BUILTINS_LOCATION,
1426 FIELD_DECL, NULL_TREE, type_info_ptr_type);
1427 fields = field;
1429 field = build_decl (BUILTINS_LOCATION,
1430 FIELD_DECL, NULL_TREE, LONGPTR_T);
1431 DECL_CHAIN (field) = fields;
1432 fields = field;
1434 ti = &(*tinfo_descs)[TK_BASE_TYPE];
1436 ti->type = make_class_type (RECORD_TYPE);
1437 ti->vtable = NULL_TREE;
1438 ti->name = NULL_TREE;
1439 finish_builtin_struct (ti->type, "__base_class_type_info_pseudo",
1440 fields, NULL_TREE);
1443 /* Pointer type_info. Adds two fields, qualification mask
1444 and pointer to the pointed to type. This is really a descendant of
1445 __pbase_type_info. */
1446 create_pseudo_type_info (TK_POINTER_TYPE, "__pointer_type_info",
1447 build_decl (BUILTINS_LOCATION,
1448 FIELD_DECL, NULL_TREE, integer_type_node),
1449 build_decl (BUILTINS_LOCATION,
1450 FIELD_DECL, NULL_TREE, type_info_ptr_type),
1451 NULL);
1453 /* Pointer to member data type_info. Add qualifications flags,
1454 pointer to the member's type info and pointer to the class.
1455 This is really a descendant of __pbase_type_info. */
1456 create_pseudo_type_info (TK_POINTER_MEMBER_TYPE,
1457 "__pointer_to_member_type_info",
1458 build_decl (BUILTINS_LOCATION,
1459 FIELD_DECL, NULL_TREE, integer_type_node),
1460 build_decl (BUILTINS_LOCATION,
1461 FIELD_DECL, NULL_TREE, type_info_ptr_type),
1462 build_decl (BUILTINS_LOCATION,
1463 FIELD_DECL, NULL_TREE, type_info_ptr_type),
1464 NULL);
1466 pop_abi_namespace ();
1469 /* Helper for emit_support_tinfos. Emits the type_info descriptor of
1470 a single type. */
1472 void
1473 emit_support_tinfo_1 (tree bltn)
1475 tree types[3];
1477 if (bltn == NULL_TREE)
1478 return;
1479 types[0] = bltn;
1480 types[1] = build_pointer_type (bltn);
1481 types[2] = build_pointer_type (cp_build_qualified_type (bltn,
1482 TYPE_QUAL_CONST));
1484 for (int i = 0; i < 3; ++i)
1486 tree tinfo = get_tinfo_decl (types[i]);
1487 TREE_USED (tinfo) = 1;
1488 mark_needed (tinfo);
1489 /* The C++ ABI requires that these objects be COMDAT. But,
1490 On systems without weak symbols, initialized COMDAT
1491 objects are emitted with internal linkage. (See
1492 comdat_linkage for details.) Since we want these objects
1493 to have external linkage so that copies do not have to be
1494 emitted in code outside the runtime library, we make them
1495 non-COMDAT here.
1497 It might also not be necessary to follow this detail of the
1498 ABI. */
1499 if (!flag_weak || ! targetm.cxx.library_rtti_comdat ())
1501 gcc_assert (TREE_PUBLIC (tinfo) && !DECL_COMDAT (tinfo));
1502 DECL_INTERFACE_KNOWN (tinfo) = 1;
1507 /* Emit the type_info descriptors which are guaranteed to be in the runtime
1508 support. Generating them here guarantees consistency with the other
1509 structures. We use the following heuristic to determine when the runtime
1510 is being generated. If std::__fundamental_type_info is defined, and its
1511 destructor is defined, then the runtime is being built. */
1513 void
1514 emit_support_tinfos (void)
1516 /* Dummy static variable so we can put nullptr in the array; it will be
1517 set before we actually start to walk the array. */
1518 static tree *const fundamentals[] =
1520 &void_type_node,
1521 &boolean_type_node,
1522 &wchar_type_node, &char16_type_node, &char32_type_node,
1523 &char_type_node, &signed_char_type_node, &unsigned_char_type_node,
1524 &short_integer_type_node, &short_unsigned_type_node,
1525 &integer_type_node, &unsigned_type_node,
1526 &long_integer_type_node, &long_unsigned_type_node,
1527 &long_long_integer_type_node, &long_long_unsigned_type_node,
1528 &float_type_node, &double_type_node, &long_double_type_node,
1529 &dfloat32_type_node, &dfloat64_type_node, &dfloat128_type_node,
1530 &nullptr_type_node,
1533 int ix;
1534 tree bltn_type, dtor;
1536 push_abi_namespace ();
1537 bltn_type = xref_tag (class_type,
1538 get_identifier ("__fundamental_type_info"),
1539 /*tag_scope=*/ts_current, false);
1540 pop_abi_namespace ();
1541 if (!COMPLETE_TYPE_P (bltn_type))
1542 return;
1543 dtor = CLASSTYPE_DESTRUCTORS (bltn_type);
1544 if (!dtor || DECL_EXTERNAL (dtor))
1545 return;
1546 doing_runtime = 1;
1547 for (ix = 0; fundamentals[ix]; ix++)
1548 emit_support_tinfo_1 (*fundamentals[ix]);
1549 for (ix = 0; ix < NUM_INT_N_ENTS; ix ++)
1550 if (int_n_enabled_p[ix])
1552 emit_support_tinfo_1 (int_n_trees[ix].signed_type);
1553 emit_support_tinfo_1 (int_n_trees[ix].unsigned_type);
1555 for (tree t = registered_builtin_types; t; t = TREE_CHAIN (t))
1556 emit_support_tinfo_1 (TREE_VALUE (t));
1559 /* Finish a type info decl. DECL_PTR is a pointer to an unemitted
1560 tinfo decl. Determine whether it needs emitting, and if so
1561 generate the initializer. */
1563 bool
1564 emit_tinfo_decl (tree decl)
1566 tree type = TREE_TYPE (DECL_NAME (decl));
1567 int in_library = typeinfo_in_lib_p (type);
1569 gcc_assert (DECL_TINFO_P (decl));
1571 if (in_library)
1573 if (doing_runtime)
1574 DECL_EXTERNAL (decl) = 0;
1575 else
1577 /* If we're not in the runtime, then DECL (which is already
1578 DECL_EXTERNAL) will not be defined here. */
1579 DECL_INTERFACE_KNOWN (decl) = 1;
1580 return false;
1583 else if (involves_incomplete_p (type))
1585 if (!decl_needed_p (decl))
1586 return false;
1587 /* If TYPE involves an incomplete class type, then the typeinfo
1588 object will be emitted with internal linkage. There is no
1589 way to know whether or not types are incomplete until the end
1590 of the compilation, so this determination must be deferred
1591 until this point. */
1592 TREE_PUBLIC (decl) = 0;
1593 DECL_EXTERNAL (decl) = 0;
1594 DECL_INTERFACE_KNOWN (decl) = 1;
1597 import_export_decl (decl);
1598 if (DECL_NOT_REALLY_EXTERN (decl) && decl_needed_p (decl))
1600 tree init;
1602 DECL_EXTERNAL (decl) = 0;
1603 init = get_pseudo_ti_init (type, get_pseudo_ti_index (type));
1604 DECL_INITIAL (decl) = init;
1605 mark_used (decl);
1606 cp_finish_decl (decl, init, false, NULL_TREE, 0);
1607 /* Avoid targets optionally bumping up the alignment to improve
1608 vector instruction accesses, tinfo are never accessed this way. */
1609 #ifdef DATA_ABI_ALIGNMENT
1610 DECL_ALIGN (decl) = DATA_ABI_ALIGNMENT (decl, TYPE_ALIGN (TREE_TYPE (decl)));
1611 DECL_USER_ALIGN (decl) = true;
1612 #endif
1613 return true;
1615 else
1616 return false;
1619 #include "gt-cp-rtti.h"