PR c++/80384 - ICE with dependent noexcept-specifier
[official-gcc.git] / gcc / cp / rtti.c
blob89d18914adfe6d87d80225ce250fab3aec483b70
1 /* RunTime Type Identification
2 Copyright (C) 1995-2017 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 "coretypes.h"
24 #include "target.h"
25 #include "cp-tree.h"
26 #include "memmodel.h"
27 #include "tm_p.h"
28 #include "stringpool.h"
29 #include "intl.h"
30 #include "stor-layout.h"
31 #include "c-family/c-pragma.h"
33 /* C++ returns type information to the user in struct type_info
34 objects. We also use type information to implement dynamic_cast and
35 exception handlers. Type information for a particular type is
36 indicated with an ABI defined structure derived from type_info.
37 This would all be very straight forward, but for the fact that the
38 runtime library provides the definitions of the type_info structure
39 and the ABI defined derived classes. We cannot build declarations
40 of them directly in the compiler, but we need to layout objects of
41 their type. Somewhere we have to lie.
43 We define layout compatible POD-structs with compiler-defined names
44 and generate the appropriate initializations for them (complete
45 with explicit mention of their vtable). When we have to provide a
46 type_info to the user we reinterpret_cast the internal compiler
47 type to type_info. A well formed program can only explicitly refer
48 to the type_infos of complete types (& cv void). However, we chain
49 pointer type_infos to the pointed-to-type, and that can be
50 incomplete. We only need the addresses of such incomplete
51 type_info objects for static initialization.
53 The type information VAR_DECL of a type is held on the
54 IDENTIFIER_GLOBAL_VALUE of the type's mangled name. That VAR_DECL
55 will be the internal type. It will usually have the correct
56 internal type reflecting the kind of type it represents (pointer,
57 array, function, class, inherited class, etc). When the type it
58 represents is incomplete, it will have the internal type
59 corresponding to type_info. That will only happen at the end of
60 translation, when we are emitting the type info objects. */
62 /* Auxiliary data we hold for each type_info derived object we need. */
63 struct GTY (()) tinfo_s {
64 tree type; /* The RECORD_TYPE for this type_info object */
66 tree vtable; /* The VAR_DECL of the vtable. Only filled at end of
67 translation. */
69 tree name; /* IDENTIFIER_NODE for the ABI specified name of
70 the type_info derived type. */
74 enum tinfo_kind
76 TK_TYPE_INFO_TYPE, /* abi::__type_info_pseudo */
77 TK_BASE_TYPE, /* abi::__base_class_type_info */
78 TK_BUILTIN_TYPE, /* abi::__fundamental_type_info */
79 TK_ARRAY_TYPE, /* abi::__array_type_info */
80 TK_FUNCTION_TYPE, /* abi::__function_type_info */
81 TK_ENUMERAL_TYPE, /* abi::__enum_type_info */
82 TK_POINTER_TYPE, /* abi::__pointer_type_info */
83 TK_POINTER_MEMBER_TYPE, /* abi::__pointer_to_member_type_info */
84 TK_CLASS_TYPE, /* abi::__class_type_info */
85 TK_SI_CLASS_TYPE, /* abi::__si_class_type_info */
86 TK_FIXED /* end of fixed descriptors. */
87 /* ... abi::__vmi_type_info<I> */
90 /* Helper macro to get maximum scalar-width of pointer or of the 'long'-type.
91 This of interest for llp64 targets. */
92 #define LONGPTR_T \
93 integer_types[(POINTER_SIZE <= TYPE_PRECISION (integer_types[itk_long]) \
94 ? itk_long : itk_long_long)]
96 /* A vector of all tinfo decls that haven't yet been emitted. */
97 vec<tree, va_gc> *unemitted_tinfo_decls;
99 /* A vector of all type_info derived types we need. The first few are
100 fixed and created early. The remainder are for multiple inheritance
101 and are generated as needed. */
102 static GTY (()) vec<tinfo_s, va_gc> *tinfo_descs;
104 static tree ifnonnull (tree, tree, tsubst_flags_t);
105 static tree tinfo_name (tree, bool);
106 static tree build_dynamic_cast_1 (tree, tree, tsubst_flags_t);
107 static tree throw_bad_cast (void);
108 static tree throw_bad_typeid (void);
109 static tree get_tinfo_ptr (tree);
110 static bool typeid_ok_p (void);
111 static int qualifier_flags (tree);
112 static bool target_incomplete_p (tree);
113 static tree tinfo_base_init (tinfo_s *, tree);
114 static tree generic_initializer (tinfo_s *, tree);
115 static tree ptr_initializer (tinfo_s *, tree);
116 static tree ptm_initializer (tinfo_s *, tree);
117 static tree class_initializer (tinfo_s *, tree, unsigned, ...);
118 static void create_pseudo_type_info (int, const char *, ...);
119 static tree get_pseudo_ti_init (tree, unsigned);
120 static unsigned get_pseudo_ti_index (tree);
121 static void create_tinfo_types (void);
122 static bool typeinfo_in_lib_p (tree);
124 static int doing_runtime = 0;
126 static void
127 push_abi_namespace (void)
129 push_nested_namespace (abi_node);
130 push_visibility ("default", 2);
133 static void
134 pop_abi_namespace (void)
136 pop_visibility (2);
137 pop_nested_namespace (abi_node);
140 /* Declare language defined type_info type and a pointer to const
141 type_info. This is incomplete here, and will be completed when
142 the user #includes <typeinfo>. There are language defined
143 restrictions on what can be done until that is included. Create
144 the internal versions of the ABI types. */
146 void
147 init_rtti_processing (void)
149 tree type_info_type;
151 push_namespace (std_identifier);
152 type_info_type = xref_tag (class_type, get_identifier ("type_info"),
153 /*tag_scope=*/ts_current, false);
154 pop_namespace ();
155 const_type_info_type_node
156 = cp_build_qualified_type (type_info_type, TYPE_QUAL_CONST);
157 type_info_ptr_type = build_pointer_type (const_type_info_type_node);
159 vec_alloc (unemitted_tinfo_decls, 124);
161 create_tinfo_types ();
164 /* Given the expression EXP of type `class *', return the head of the
165 object pointed to by EXP with type cv void*, if the class has any
166 virtual functions (TYPE_POLYMORPHIC_P), else just return the
167 expression. */
169 tree
170 build_headof (tree exp)
172 tree type = TREE_TYPE (exp);
173 tree offset;
174 tree index;
176 gcc_assert (TYPE_PTR_P (type));
177 type = TREE_TYPE (type);
179 if (!TYPE_POLYMORPHIC_P (type))
180 return exp;
182 /* We use this a couple of times below, protect it. */
183 exp = save_expr (exp);
185 /* The offset-to-top field is at index -2 from the vptr. */
186 index = build_int_cst (NULL_TREE,
187 -2 * TARGET_VTABLE_DATA_ENTRY_DISTANCE);
189 offset = build_vtbl_ref (cp_build_indirect_ref (exp, RO_NULL,
190 tf_warning_or_error),
191 index);
193 type = cp_build_qualified_type (ptr_type_node,
194 cp_type_quals (TREE_TYPE (exp)));
195 return fold_build_pointer_plus (exp, offset);
198 /* Get a bad_cast node for the program to throw...
200 See libstdc++/exception.cc for __throw_bad_cast */
202 static tree
203 throw_bad_cast (void)
205 static tree fn;
206 if (!fn)
208 tree name = get_identifier ("__cxa_bad_cast");
209 fn = IDENTIFIER_GLOBAL_VALUE (name);
210 if (!fn)
211 fn = push_throw_library_fn
212 (name, build_function_type_list (ptr_type_node, NULL_TREE));
215 return build_cxx_call (fn, 0, NULL, tf_warning_or_error);
218 /* Return an expression for "__cxa_bad_typeid()". The expression
219 returned is an lvalue of type "const std::type_info". */
221 static tree
222 throw_bad_typeid (void)
224 static tree fn;
225 if (!fn)
227 tree name = get_identifier ("__cxa_bad_typeid");
228 fn = IDENTIFIER_GLOBAL_VALUE (name);
229 if (!fn)
231 tree t = build_reference_type (const_type_info_type_node);
232 t = build_function_type_list (t, NULL_TREE);
233 fn = push_throw_library_fn (name, t);
237 return build_cxx_call (fn, 0, NULL, tf_warning_or_error);
240 /* Return an lvalue expression whose type is "const std::type_info"
241 and whose value indicates the type of the expression EXP. If EXP
242 is a reference to a polymorphic class, return the dynamic type;
243 otherwise return the static type of the expression. */
245 static tree
246 get_tinfo_decl_dynamic (tree exp, tsubst_flags_t complain)
248 tree type;
249 tree t;
251 if (error_operand_p (exp))
252 return error_mark_node;
254 exp = resolve_nondeduced_context (exp, complain);
256 /* peel back references, so they match. */
257 type = non_reference (TREE_TYPE (exp));
259 /* Peel off cv qualifiers. */
260 type = TYPE_MAIN_VARIANT (type);
262 /* For UNKNOWN_TYPEs call complete_type_or_else to get diagnostics. */
263 if (CLASS_TYPE_P (type) || type == unknown_type_node
264 || type == init_list_type_node)
265 type = complete_type_or_maybe_complain (type, exp, complain);
267 if (!type)
268 return error_mark_node;
270 /* If exp is a reference to polymorphic type, get the real type_info. */
271 if (TYPE_POLYMORPHIC_P (type) && ! resolves_to_fixed_type_p (exp, 0))
273 /* build reference to type_info from vtable. */
274 tree index;
276 /* The RTTI information is at index -1. */
277 index = build_int_cst (NULL_TREE,
278 -1 * TARGET_VTABLE_DATA_ENTRY_DISTANCE);
279 t = build_vtbl_ref (exp, index);
280 t = convert (type_info_ptr_type, t);
282 else
283 /* Otherwise return the type_info for the static type of the expr. */
284 t = get_tinfo_ptr (TYPE_MAIN_VARIANT (type));
286 return cp_build_indirect_ref (t, RO_NULL, complain);
289 static bool
290 typeid_ok_p (void)
292 tree pseudo_type_info, type_info_type;
294 if (! flag_rtti)
296 error ("cannot use typeid with -fno-rtti");
297 return false;
300 if (!COMPLETE_TYPE_P (const_type_info_type_node))
302 error ("must #include <typeinfo> before using typeid");
303 return false;
306 pseudo_type_info = (*tinfo_descs)[TK_TYPE_INFO_TYPE].type;
307 type_info_type = TYPE_MAIN_VARIANT (const_type_info_type_node);
309 /* Make sure abi::__type_info_pseudo has the same alias set
310 as std::type_info. */
311 if (! TYPE_ALIAS_SET_KNOWN_P (pseudo_type_info))
312 TYPE_ALIAS_SET (pseudo_type_info) = get_alias_set (type_info_type);
313 else
314 gcc_assert (TYPE_ALIAS_SET (pseudo_type_info)
315 == get_alias_set (type_info_type));
317 return true;
320 /* Return an expression for "typeid(EXP)". The expression returned is
321 an lvalue of type "const std::type_info". */
323 tree
324 build_typeid (tree exp, tsubst_flags_t complain)
326 tree cond = NULL_TREE, initial_expr = exp;
327 int nonnull = 0;
329 if (exp == error_mark_node || !typeid_ok_p ())
330 return error_mark_node;
332 if (processing_template_decl)
333 return build_min (TYPEID_EXPR, const_type_info_type_node, exp);
335 /* FIXME when integrating with c_fully_fold, mark
336 resolves_to_fixed_type_p case as a non-constant expression. */
337 if (TYPE_POLYMORPHIC_P (TREE_TYPE (exp))
338 && ! resolves_to_fixed_type_p (exp, &nonnull)
339 && ! nonnull)
341 /* So we need to look into the vtable of the type of exp.
342 Make sure it isn't a null lvalue. */
343 exp = cp_build_addr_expr (exp, complain);
344 exp = save_expr (exp);
345 cond = cp_convert (boolean_type_node, exp, complain);
346 exp = cp_build_indirect_ref (exp, RO_NULL, complain);
349 exp = get_tinfo_decl_dynamic (exp, complain);
351 if (exp == error_mark_node)
352 return error_mark_node;
354 if (cond)
356 tree bad = throw_bad_typeid ();
358 exp = build3 (COND_EXPR, TREE_TYPE (exp), cond, exp, bad);
360 else
361 mark_type_use (initial_expr);
363 return exp;
366 /* Generate the NTBS name of a type. If MARK_PRIVATE, put a '*' in front so that
367 comparisons will be done by pointer rather than string comparison. */
368 static tree
369 tinfo_name (tree type, bool mark_private)
371 const char *name;
372 int length;
373 tree name_string;
375 name = mangle_type_string (type);
376 length = strlen (name);
378 if (mark_private)
380 /* Inject '*' at beginning of name to force pointer comparison. */
381 char* buf = (char*) XALLOCAVEC (char, length + 2);
382 buf[0] = '*';
383 memcpy (buf + 1, name, length + 1);
384 name_string = build_string (length + 2, buf);
386 else
387 name_string = build_string (length + 1, name);
389 return fix_string_type (name_string);
392 /* Return a VAR_DECL for the internal ABI defined type_info object for
393 TYPE. You must arrange that the decl is mark_used, if actually use
394 it --- decls in vtables are only used if the vtable is output. */
396 tree
397 get_tinfo_decl (tree type)
399 tree name;
400 tree d;
402 if (variably_modified_type_p (type, /*fn=*/NULL_TREE))
404 error ("cannot create type information for type %qT because "
405 "it involves types of variable size",
406 type);
407 return error_mark_node;
410 if (TREE_CODE (type) == METHOD_TYPE)
411 type = build_function_type (TREE_TYPE (type),
412 TREE_CHAIN (TYPE_ARG_TYPES (type)));
414 type = complete_type (type);
416 /* For a class type, the variable is cached in the type node
417 itself. */
418 if (CLASS_TYPE_P (type))
420 d = CLASSTYPE_TYPEINFO_VAR (TYPE_MAIN_VARIANT (type));
421 if (d)
422 return d;
425 name = mangle_typeinfo_for_type (type);
427 d = IDENTIFIER_GLOBAL_VALUE (name);
428 if (!d)
430 int ix = get_pseudo_ti_index (type);
431 tinfo_s *ti = &(*tinfo_descs)[ix];
433 d = build_lang_decl (VAR_DECL, name, ti->type);
434 SET_DECL_ASSEMBLER_NAME (d, name);
435 /* Remember the type it is for. */
436 TREE_TYPE (name) = type;
437 DECL_TINFO_P (d) = 1;
438 DECL_ARTIFICIAL (d) = 1;
439 DECL_IGNORED_P (d) = 1;
440 TREE_READONLY (d) = 1;
441 TREE_STATIC (d) = 1;
442 /* Mark the variable as undefined -- but remember that we can
443 define it later if we need to do so. */
444 DECL_EXTERNAL (d) = 1;
445 DECL_NOT_REALLY_EXTERN (d) = 1;
446 set_linkage_according_to_type (type, d);
448 d = pushdecl_top_level_and_finish (d, NULL_TREE);
449 if (CLASS_TYPE_P (type))
450 CLASSTYPE_TYPEINFO_VAR (TYPE_MAIN_VARIANT (type)) = d;
452 /* Add decl to the global array of tinfo decls. */
453 vec_safe_push (unemitted_tinfo_decls, d);
456 return d;
459 /* Return a pointer to a type_info object describing TYPE, suitably
460 cast to the language defined type. */
462 static tree
463 get_tinfo_ptr (tree type)
465 tree decl = get_tinfo_decl (type);
467 mark_used (decl);
468 return build_nop (type_info_ptr_type,
469 build_address (decl));
472 /* Return the type_info object for TYPE. */
474 tree
475 get_typeid (tree type, tsubst_flags_t complain)
477 if (type == error_mark_node || !typeid_ok_p ())
478 return error_mark_node;
480 if (processing_template_decl)
481 return build_min (TYPEID_EXPR, const_type_info_type_node, type);
483 /* If the type of the type-id is a reference type, the result of the
484 typeid expression refers to a type_info object representing the
485 referenced type. */
486 type = non_reference (type);
488 /* This is not one of the uses of a qualified function type in 8.3.5. */
489 if (TREE_CODE (type) == FUNCTION_TYPE
490 && (type_memfn_quals (type) != TYPE_UNQUALIFIED
491 || type_memfn_rqual (type) != REF_QUAL_NONE))
493 if (complain & tf_error)
494 error ("typeid of qualified function type %qT", type);
495 return error_mark_node;
498 /* The top-level cv-qualifiers of the lvalue expression or the type-id
499 that is the operand of typeid are always ignored. */
500 type = TYPE_MAIN_VARIANT (type);
502 /* For UNKNOWN_TYPEs call complete_type_or_else to get diagnostics. */
503 if (CLASS_TYPE_P (type) || type == unknown_type_node
504 || type == init_list_type_node)
505 type = complete_type_or_maybe_complain (type, NULL_TREE, complain);
507 if (!type)
508 return error_mark_node;
510 return cp_build_indirect_ref (get_tinfo_ptr (type), RO_NULL, complain);
513 /* Check whether TEST is null before returning RESULT. If TEST is used in
514 RESULT, it must have previously had a save_expr applied to it. */
516 static tree
517 ifnonnull (tree test, tree result, tsubst_flags_t complain)
519 tree cond = build2 (NE_EXPR, boolean_type_node, test,
520 cp_convert (TREE_TYPE (test), nullptr_node, complain));
521 /* This is a compiler generated comparison, don't emit
522 e.g. -Wnonnull-compare warning for it. */
523 TREE_NO_WARNING (cond) = 1;
524 return build3 (COND_EXPR, TREE_TYPE (result), cond, result,
525 cp_convert (TREE_TYPE (result), nullptr_node, complain));
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;
867 /* Fall through. */
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 if (tx_safe_fn_type_p (to))
993 flags |= 0x20;
994 to = tx_unsafe_fn_variant (to);
996 if (flag_noexcept_type
997 && (TREE_CODE (to) == FUNCTION_TYPE
998 || TREE_CODE (to) == METHOD_TYPE)
999 && TYPE_NOTHROW_P (to))
1001 flags |= 0x40;
1002 to = build_exception_variant (to, NULL_TREE);
1004 CONSTRUCTOR_APPEND_ELT (v, NULL_TREE, init);
1005 CONSTRUCTOR_APPEND_ELT (v, NULL_TREE, build_int_cst (NULL_TREE, flags));
1006 CONSTRUCTOR_APPEND_ELT (v, NULL_TREE,
1007 get_tinfo_ptr (TYPE_MAIN_VARIANT (to)));
1009 init = build_constructor (init_list_type_node, v);
1010 TREE_CONSTANT (init) = 1;
1011 TREE_STATIC (init) = 1;
1012 return init;
1015 /* Return the CONSTRUCTOR expr for a type_info of pointer to member data TYPE.
1016 TI provides information about the particular type_info derivation,
1017 which adds class, target type and qualifier flags members to the type_info
1018 base. */
1020 static tree
1021 ptm_initializer (tinfo_s *ti, tree target)
1023 tree init = tinfo_base_init (ti, target);
1024 tree to = TYPE_PTRMEM_POINTED_TO_TYPE (target);
1025 tree klass = TYPE_PTRMEM_CLASS_TYPE (target);
1026 int flags = qualifier_flags (to);
1027 bool incomplete = target_incomplete_p (to);
1028 vec<constructor_elt, va_gc> *v;
1029 vec_alloc (v, 4);
1031 if (incomplete)
1032 flags |= 0x8;
1033 if (!COMPLETE_TYPE_P (klass))
1034 flags |= 0x10;
1035 CONSTRUCTOR_APPEND_ELT (v, NULL_TREE, init);
1036 CONSTRUCTOR_APPEND_ELT (v, NULL_TREE, build_int_cst (NULL_TREE, flags));
1037 CONSTRUCTOR_APPEND_ELT (v, NULL_TREE,
1038 get_tinfo_ptr (TYPE_MAIN_VARIANT (to)));
1039 CONSTRUCTOR_APPEND_ELT (v, NULL_TREE, get_tinfo_ptr (klass));
1041 init = build_constructor (init_list_type_node, v);
1042 TREE_CONSTANT (init) = 1;
1043 TREE_STATIC (init) = 1;
1044 return init;
1047 /* Return the CONSTRUCTOR expr for a type_info of class TYPE.
1048 TI provides information about the particular __class_type_info derivation,
1049 which adds hint flags and N extra initializers to the type_info base. */
1051 static tree
1052 class_initializer (tinfo_s *ti, tree target, unsigned n, ...)
1054 tree init = tinfo_base_init (ti, target);
1055 va_list extra_inits;
1056 unsigned i;
1057 vec<constructor_elt, va_gc> *v;
1058 vec_alloc (v, n+1);
1060 CONSTRUCTOR_APPEND_ELT (v, NULL_TREE, init);
1061 va_start (extra_inits, n);
1062 for (i = 0; i < n; i++)
1063 CONSTRUCTOR_APPEND_ELT (v, NULL_TREE, va_arg (extra_inits, tree));
1064 va_end (extra_inits);
1066 init = build_constructor (init_list_type_node, v);
1067 TREE_CONSTANT (init) = 1;
1068 TREE_STATIC (init) = 1;
1069 return init;
1072 /* Returns true if the typeinfo for type should be placed in
1073 the runtime library. */
1075 static bool
1076 typeinfo_in_lib_p (tree type)
1078 /* The typeinfo objects for `T*' and `const T*' are in the runtime
1079 library for simple types T. */
1080 if (TYPE_PTR_P (type)
1081 && (cp_type_quals (TREE_TYPE (type)) == TYPE_QUAL_CONST
1082 || cp_type_quals (TREE_TYPE (type)) == TYPE_UNQUALIFIED))
1083 type = TREE_TYPE (type);
1085 switch (TREE_CODE (type))
1087 case INTEGER_TYPE:
1088 case BOOLEAN_TYPE:
1089 case REAL_TYPE:
1090 case VOID_TYPE:
1091 case NULLPTR_TYPE:
1092 return true;
1094 case LANG_TYPE:
1095 /* fall through. */
1097 default:
1098 return false;
1102 /* Generate the initializer for the type info describing TYPE. TK_INDEX is
1103 the index of the descriptor in the tinfo_desc vector. */
1105 static tree
1106 get_pseudo_ti_init (tree type, unsigned tk_index)
1108 tinfo_s *ti = &(*tinfo_descs)[tk_index];
1110 gcc_assert (at_eof);
1111 switch (tk_index)
1113 case TK_POINTER_MEMBER_TYPE:
1114 return ptm_initializer (ti, type);
1116 case TK_POINTER_TYPE:
1117 return ptr_initializer (ti, type);
1119 case TK_BUILTIN_TYPE:
1120 case TK_ENUMERAL_TYPE:
1121 case TK_FUNCTION_TYPE:
1122 case TK_ARRAY_TYPE:
1123 return generic_initializer (ti, type);
1125 case TK_CLASS_TYPE:
1126 return class_initializer (ti, type, 0);
1128 case TK_SI_CLASS_TYPE:
1130 tree base_binfo = BINFO_BASE_BINFO (TYPE_BINFO (type), 0);
1131 tree tinfo = get_tinfo_ptr (BINFO_TYPE (base_binfo));
1133 /* get_tinfo_ptr might have reallocated the tinfo_descs vector. */
1134 ti = &(*tinfo_descs)[tk_index];
1135 return class_initializer (ti, type, 1, tinfo);
1138 default:
1140 int hint = ((CLASSTYPE_REPEATED_BASE_P (type) << 0)
1141 | (CLASSTYPE_DIAMOND_SHAPED_P (type) << 1));
1142 tree binfo = TYPE_BINFO (type);
1143 int nbases = BINFO_N_BASE_BINFOS (binfo);
1144 vec<tree, va_gc> *base_accesses = BINFO_BASE_ACCESSES (binfo);
1145 tree offset_type = LONGPTR_T;
1146 tree base_inits = NULL_TREE;
1147 int ix;
1148 vec<constructor_elt, va_gc> *init_vec = NULL;
1149 constructor_elt *e;
1151 gcc_assert (tk_index >= TK_FIXED);
1153 vec_safe_grow (init_vec, nbases);
1154 /* Generate the base information initializer. */
1155 for (ix = nbases; ix--;)
1157 tree base_binfo = BINFO_BASE_BINFO (binfo, ix);
1158 tree base_init;
1159 int flags = 0;
1160 tree tinfo;
1161 tree offset;
1162 vec<constructor_elt, va_gc> *v;
1164 if ((*base_accesses)[ix] == access_public_node)
1165 flags |= 2;
1166 tinfo = get_tinfo_ptr (BINFO_TYPE (base_binfo));
1167 if (BINFO_VIRTUAL_P (base_binfo))
1169 /* We store the vtable offset at which the virtual
1170 base offset can be found. */
1171 offset = BINFO_VPTR_FIELD (base_binfo);
1172 flags |= 1;
1174 else
1175 offset = BINFO_OFFSET (base_binfo);
1177 /* Combine offset and flags into one field. */
1178 offset = fold_convert (offset_type, offset);
1179 offset = fold_build2_loc (input_location,
1180 LSHIFT_EXPR, offset_type, offset,
1181 build_int_cst (offset_type, 8));
1182 offset = fold_build2_loc (input_location,
1183 BIT_IOR_EXPR, offset_type, offset,
1184 build_int_cst (offset_type, flags));
1185 vec_alloc (v, 2);
1186 CONSTRUCTOR_APPEND_ELT (v, NULL_TREE, tinfo);
1187 CONSTRUCTOR_APPEND_ELT (v, NULL_TREE, offset);
1188 base_init = build_constructor (init_list_type_node, v);
1189 e = &(*init_vec)[ix];
1190 e->index = NULL_TREE;
1191 e->value = base_init;
1193 base_inits = build_constructor (init_list_type_node, init_vec);
1195 /* get_tinfo_ptr might have reallocated the tinfo_descs vector. */
1196 ti = &(*tinfo_descs)[tk_index];
1197 return class_initializer (ti, type, 3,
1198 build_int_cst (NULL_TREE, hint),
1199 build_int_cst (NULL_TREE, nbases),
1200 base_inits);
1205 /* Generate the RECORD_TYPE containing the data layout of a type_info
1206 derivative as used by the runtime. This layout must be consistent with
1207 that defined in the runtime support. Also generate the VAR_DECL for the
1208 type's vtable. We explicitly manage the vtable member, and name it for
1209 real type as used in the runtime. The RECORD type has a different name,
1210 to avoid collisions. Return a TREE_LIST who's TINFO_PSEUDO_TYPE
1211 is the generated type and TINFO_VTABLE_NAME is the name of the
1212 vtable. We have to delay generating the VAR_DECL of the vtable
1213 until the end of the translation, when we'll have seen the library
1214 definition, if there was one.
1216 REAL_NAME is the runtime's name of the type. Trailing arguments are
1217 additional FIELD_DECL's for the structure. The final argument must be
1218 NULL. */
1220 static void
1221 create_pseudo_type_info (int tk, const char *real_name, ...)
1223 tinfo_s *ti;
1224 tree pseudo_type;
1225 char *pseudo_name;
1226 tree fields;
1227 tree field_decl;
1228 va_list ap;
1230 va_start (ap, real_name);
1232 /* Generate the pseudo type name. */
1233 pseudo_name = (char *) alloca (strlen (real_name) + 30);
1234 strcpy (pseudo_name, real_name);
1235 strcat (pseudo_name, "_pseudo");
1236 if (tk >= TK_FIXED)
1237 sprintf (pseudo_name + strlen (pseudo_name), "%d", tk - TK_FIXED);
1239 /* First field is the pseudo type_info base class. */
1240 fields = build_decl (input_location,
1241 FIELD_DECL, NULL_TREE,
1242 (*tinfo_descs)[TK_TYPE_INFO_TYPE].type);
1244 /* Now add the derived fields. */
1245 while ((field_decl = va_arg (ap, tree)))
1247 DECL_CHAIN (field_decl) = fields;
1248 fields = field_decl;
1251 /* Create the pseudo type. */
1252 pseudo_type = make_class_type (RECORD_TYPE);
1253 finish_builtin_struct (pseudo_type, pseudo_name, fields, NULL_TREE);
1254 CLASSTYPE_AS_BASE (pseudo_type) = pseudo_type;
1256 ti = &(*tinfo_descs)[tk];
1257 ti->type = cp_build_qualified_type (pseudo_type, TYPE_QUAL_CONST);
1258 ti->name = get_identifier (real_name);
1259 ti->vtable = NULL_TREE;
1261 /* Pretend this is public so determine_visibility doesn't give vtables
1262 internal linkage. */
1263 TREE_PUBLIC (TYPE_MAIN_DECL (ti->type)) = 1;
1265 va_end (ap);
1268 /* Return the index of a pseudo type info type node used to describe
1269 TYPE. TYPE must be a complete type (or cv void), except at the end
1270 of the translation unit. */
1272 static unsigned
1273 get_pseudo_ti_index (tree type)
1275 unsigned ix;
1277 switch (TREE_CODE (type))
1279 case OFFSET_TYPE:
1280 ix = TK_POINTER_MEMBER_TYPE;
1281 break;
1283 case POINTER_TYPE:
1284 ix = TK_POINTER_TYPE;
1285 break;
1287 case ENUMERAL_TYPE:
1288 ix = TK_ENUMERAL_TYPE;
1289 break;
1291 case FUNCTION_TYPE:
1292 ix = TK_FUNCTION_TYPE;
1293 break;
1295 case ARRAY_TYPE:
1296 ix = TK_ARRAY_TYPE;
1297 break;
1299 case UNION_TYPE:
1300 case RECORD_TYPE:
1301 if (TYPE_PTRMEMFUNC_P (type))
1303 ix = TK_POINTER_MEMBER_TYPE;
1304 break;
1306 else if (!COMPLETE_TYPE_P (type))
1308 if (!at_eof)
1309 cxx_incomplete_type_error (NULL_TREE, type);
1310 ix = TK_CLASS_TYPE;
1311 break;
1313 else if (!TYPE_BINFO (type)
1314 || !BINFO_N_BASE_BINFOS (TYPE_BINFO (type)))
1316 ix = TK_CLASS_TYPE;
1317 break;
1319 else
1321 tree binfo = TYPE_BINFO (type);
1322 vec<tree, va_gc> *base_accesses = BINFO_BASE_ACCESSES (binfo);
1323 tree base_binfo = BINFO_BASE_BINFO (binfo, 0);
1324 int num_bases = BINFO_N_BASE_BINFOS (binfo);
1326 if (num_bases == 1
1327 && (*base_accesses)[0] == access_public_node
1328 && !BINFO_VIRTUAL_P (base_binfo)
1329 && integer_zerop (BINFO_OFFSET (base_binfo)))
1331 /* single non-virtual public. */
1332 ix = TK_SI_CLASS_TYPE;
1333 break;
1335 else
1337 tinfo_s *ti;
1338 tree array_domain, base_array;
1340 ix = TK_FIXED + num_bases;
1341 if (vec_safe_length (tinfo_descs) <= ix)
1343 /* too short, extend. */
1344 unsigned len = vec_safe_length (tinfo_descs);
1346 vec_safe_grow (tinfo_descs, ix + 1);
1347 while (tinfo_descs->iterate (len++, &ti))
1348 ti->type = ti->vtable = ti->name = NULL_TREE;
1350 else if ((*tinfo_descs)[ix].type)
1351 /* already created. */
1352 break;
1354 /* Create the array of __base_class_type_info entries. */
1355 array_domain = build_index_type (size_int (num_bases - 1));
1356 base_array = build_array_type ((*tinfo_descs)[TK_BASE_TYPE].type,
1357 array_domain);
1359 push_abi_namespace ();
1360 create_pseudo_type_info
1361 (ix, "__vmi_class_type_info",
1362 build_decl (input_location,
1363 FIELD_DECL, NULL_TREE, integer_type_node),
1364 build_decl (input_location,
1365 FIELD_DECL, NULL_TREE, integer_type_node),
1366 build_decl (input_location,
1367 FIELD_DECL, NULL_TREE, base_array),
1368 NULL);
1369 pop_abi_namespace ();
1370 break;
1373 default:
1374 ix = TK_BUILTIN_TYPE;
1375 break;
1377 return ix;
1380 /* Make sure the required builtin types exist for generating the type_info
1381 variable definitions. */
1383 static void
1384 create_tinfo_types (void)
1386 tinfo_s *ti;
1388 gcc_assert (!tinfo_descs);
1390 vec_safe_grow (tinfo_descs, TK_FIXED);
1392 push_abi_namespace ();
1394 /* Create the internal type_info structure. This is used as a base for
1395 the other structures. */
1397 tree field, fields;
1399 field = build_decl (BUILTINS_LOCATION,
1400 FIELD_DECL, NULL_TREE, const_ptr_type_node);
1401 fields = field;
1403 field = build_decl (BUILTINS_LOCATION,
1404 FIELD_DECL, NULL_TREE, const_string_type_node);
1405 DECL_CHAIN (field) = fields;
1406 fields = field;
1408 ti = &(*tinfo_descs)[TK_TYPE_INFO_TYPE];
1409 ti->type = make_class_type (RECORD_TYPE);
1410 ti->vtable = NULL_TREE;
1411 ti->name = NULL_TREE;
1412 finish_builtin_struct (ti->type, "__type_info_pseudo",
1413 fields, NULL_TREE);
1416 /* Fundamental type_info */
1417 create_pseudo_type_info (TK_BUILTIN_TYPE, "__fundamental_type_info", NULL);
1419 /* Array, function and enum type_info. No additional fields. */
1420 create_pseudo_type_info (TK_ARRAY_TYPE, "__array_type_info", NULL);
1421 create_pseudo_type_info (TK_FUNCTION_TYPE, "__function_type_info", NULL);
1422 create_pseudo_type_info (TK_ENUMERAL_TYPE, "__enum_type_info", NULL);
1424 /* Class type_info. No additional fields. */
1425 create_pseudo_type_info (TK_CLASS_TYPE, "__class_type_info", NULL);
1427 /* Single public non-virtual base class. Add pointer to base class.
1428 This is really a descendant of __class_type_info. */
1429 create_pseudo_type_info (TK_SI_CLASS_TYPE, "__si_class_type_info",
1430 build_decl (BUILTINS_LOCATION,
1431 FIELD_DECL, NULL_TREE, type_info_ptr_type),
1432 NULL);
1434 /* Base class internal helper. Pointer to base type, offset to base,
1435 flags. */
1437 tree field, fields;
1439 field = build_decl (BUILTINS_LOCATION,
1440 FIELD_DECL, NULL_TREE, type_info_ptr_type);
1441 fields = field;
1443 field = build_decl (BUILTINS_LOCATION,
1444 FIELD_DECL, NULL_TREE, LONGPTR_T);
1445 DECL_CHAIN (field) = fields;
1446 fields = field;
1448 ti = &(*tinfo_descs)[TK_BASE_TYPE];
1450 ti->type = make_class_type (RECORD_TYPE);
1451 ti->vtable = NULL_TREE;
1452 ti->name = NULL_TREE;
1453 finish_builtin_struct (ti->type, "__base_class_type_info_pseudo",
1454 fields, NULL_TREE);
1457 /* Pointer type_info. Adds two fields, qualification mask
1458 and pointer to the pointed to type. This is really a descendant of
1459 __pbase_type_info. */
1460 create_pseudo_type_info (TK_POINTER_TYPE, "__pointer_type_info",
1461 build_decl (BUILTINS_LOCATION,
1462 FIELD_DECL, NULL_TREE, integer_type_node),
1463 build_decl (BUILTINS_LOCATION,
1464 FIELD_DECL, NULL_TREE, type_info_ptr_type),
1465 NULL);
1467 /* Pointer to member data type_info. Add qualifications flags,
1468 pointer to the member's type info and pointer to the class.
1469 This is really a descendant of __pbase_type_info. */
1470 create_pseudo_type_info (TK_POINTER_MEMBER_TYPE,
1471 "__pointer_to_member_type_info",
1472 build_decl (BUILTINS_LOCATION,
1473 FIELD_DECL, NULL_TREE, integer_type_node),
1474 build_decl (BUILTINS_LOCATION,
1475 FIELD_DECL, NULL_TREE, type_info_ptr_type),
1476 build_decl (BUILTINS_LOCATION,
1477 FIELD_DECL, NULL_TREE, type_info_ptr_type),
1478 NULL);
1480 pop_abi_namespace ();
1483 /* Helper for emit_support_tinfos. Emits the type_info descriptor of
1484 a single type. */
1486 void
1487 emit_support_tinfo_1 (tree bltn)
1489 tree types[3];
1491 if (bltn == NULL_TREE)
1492 return;
1493 types[0] = bltn;
1494 types[1] = build_pointer_type (bltn);
1495 types[2] = build_pointer_type (cp_build_qualified_type (bltn,
1496 TYPE_QUAL_CONST));
1498 for (int i = 0; i < 3; ++i)
1500 tree tinfo = get_tinfo_decl (types[i]);
1501 TREE_USED (tinfo) = 1;
1502 mark_needed (tinfo);
1503 /* The C++ ABI requires that these objects be COMDAT. But,
1504 On systems without weak symbols, initialized COMDAT
1505 objects are emitted with internal linkage. (See
1506 comdat_linkage for details.) Since we want these objects
1507 to have external linkage so that copies do not have to be
1508 emitted in code outside the runtime library, we make them
1509 non-COMDAT here.
1511 It might also not be necessary to follow this detail of the
1512 ABI. */
1513 if (!flag_weak || ! targetm.cxx.library_rtti_comdat ())
1515 gcc_assert (TREE_PUBLIC (tinfo) && !DECL_COMDAT (tinfo));
1516 DECL_INTERFACE_KNOWN (tinfo) = 1;
1521 /* Emit the type_info descriptors which are guaranteed to be in the runtime
1522 support. Generating them here guarantees consistency with the other
1523 structures. We use the following heuristic to determine when the runtime
1524 is being generated. If std::__fundamental_type_info is defined, and its
1525 destructor is defined, then the runtime is being built. */
1527 void
1528 emit_support_tinfos (void)
1530 /* Dummy static variable so we can put nullptr in the array; it will be
1531 set before we actually start to walk the array. */
1532 static tree *const fundamentals[] =
1534 &void_type_node,
1535 &boolean_type_node,
1536 &wchar_type_node, &char16_type_node, &char32_type_node,
1537 &char_type_node, &signed_char_type_node, &unsigned_char_type_node,
1538 &short_integer_type_node, &short_unsigned_type_node,
1539 &integer_type_node, &unsigned_type_node,
1540 &long_integer_type_node, &long_unsigned_type_node,
1541 &long_long_integer_type_node, &long_long_unsigned_type_node,
1542 &float_type_node, &double_type_node, &long_double_type_node,
1543 &dfloat32_type_node, &dfloat64_type_node, &dfloat128_type_node,
1544 &nullptr_type_node,
1547 int ix;
1548 tree bltn_type, dtor;
1550 push_abi_namespace ();
1551 bltn_type = xref_tag (class_type,
1552 get_identifier ("__fundamental_type_info"),
1553 /*tag_scope=*/ts_current, false);
1554 pop_abi_namespace ();
1555 if (!COMPLETE_TYPE_P (bltn_type))
1556 return;
1557 dtor = CLASSTYPE_DESTRUCTORS (bltn_type);
1558 if (!dtor || DECL_EXTERNAL (dtor))
1559 return;
1560 doing_runtime = 1;
1561 for (ix = 0; fundamentals[ix]; ix++)
1562 emit_support_tinfo_1 (*fundamentals[ix]);
1563 for (ix = 0; ix < NUM_INT_N_ENTS; ix ++)
1564 if (int_n_enabled_p[ix])
1566 emit_support_tinfo_1 (int_n_trees[ix].signed_type);
1567 emit_support_tinfo_1 (int_n_trees[ix].unsigned_type);
1569 for (tree t = registered_builtin_types; t; t = TREE_CHAIN (t))
1570 emit_support_tinfo_1 (TREE_VALUE (t));
1573 /* Finish a type info decl. DECL_PTR is a pointer to an unemitted
1574 tinfo decl. Determine whether it needs emitting, and if so
1575 generate the initializer. */
1577 bool
1578 emit_tinfo_decl (tree decl)
1580 tree type = TREE_TYPE (DECL_NAME (decl));
1581 int in_library = typeinfo_in_lib_p (type);
1583 gcc_assert (DECL_TINFO_P (decl));
1585 if (in_library)
1587 if (doing_runtime)
1588 DECL_EXTERNAL (decl) = 0;
1589 else
1591 /* If we're not in the runtime, then DECL (which is already
1592 DECL_EXTERNAL) will not be defined here. */
1593 DECL_INTERFACE_KNOWN (decl) = 1;
1594 return false;
1597 else if (involves_incomplete_p (type))
1599 if (!decl_needed_p (decl))
1600 return false;
1601 /* If TYPE involves an incomplete class type, then the typeinfo
1602 object will be emitted with internal linkage. There is no
1603 way to know whether or not types are incomplete until the end
1604 of the compilation, so this determination must be deferred
1605 until this point. */
1606 TREE_PUBLIC (decl) = 0;
1607 DECL_EXTERNAL (decl) = 0;
1608 DECL_INTERFACE_KNOWN (decl) = 1;
1611 import_export_decl (decl);
1612 if (DECL_NOT_REALLY_EXTERN (decl) && decl_needed_p (decl))
1614 tree init;
1616 DECL_EXTERNAL (decl) = 0;
1617 init = get_pseudo_ti_init (type, get_pseudo_ti_index (type));
1618 DECL_INITIAL (decl) = init;
1619 mark_used (decl);
1620 cp_finish_decl (decl, init, false, NULL_TREE, 0);
1621 /* Avoid targets optionally bumping up the alignment to improve
1622 vector instruction accesses, tinfo are never accessed this way. */
1623 #ifdef DATA_ABI_ALIGNMENT
1624 SET_DECL_ALIGN (decl, DATA_ABI_ALIGNMENT (decl, TYPE_ALIGN (TREE_TYPE (decl))));
1625 DECL_USER_ALIGN (decl) = true;
1626 #endif
1627 return true;
1629 else
1630 return false;
1633 #include "gt-cp-rtti.h"