]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/cp/rtti.c
c++: More simplification of name_lookup api
[thirdparty/gcc.git] / gcc / cp / rtti.c
CommitLineData
84a43794 1/* RunTime Type Identification
8d9254fc 2 Copyright (C) 1995-2020 Free Software Foundation, Inc.
6b5fbb55 3 Mostly written by Jason Merrill (jason@cygnus.com).
84a43794 4
f5adbb8d 5This file is part of GCC.
84a43794 6
f5adbb8d 7GCC is free software; you can redistribute it and/or modify
84a43794 8it under the terms of the GNU General Public License as published by
e77f031d 9the Free Software Foundation; either version 3, or (at your option)
84a43794
MS
10any later version.
11
f5adbb8d 12GCC is distributed in the hope that it will be useful,
84a43794
MS
13but WITHOUT ANY WARRANTY; without even the implied warranty of
14MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15GNU General Public License for more details.
16
17You should have received a copy of the GNU General Public License
e77f031d
NC
18along with GCC; see the file COPYING3. If not see
19<http://www.gnu.org/licenses/>. */
84a43794 20
84a43794 21#include "config.h"
8d052bc7 22#include "system.h"
4977bab6 23#include "coretypes.h"
2adfab87 24#include "target.h"
2adfab87 25#include "cp-tree.h"
4d0cdd0c 26#include "memmodel.h"
c517fc92 27#include "tm_p.h"
d8a2d370 28#include "stringpool.h"
2adfab87 29#include "intl.h"
d8a2d370 30#include "stor-layout.h"
39dabefd 31#include "c-family/c-pragma.h"
eea77d1f 32#include "gcc-rich-location.h"
5156628f 33
d689a8f1
NS
34/* C++ returns type information to the user in struct type_info
35 objects. We also use type information to implement dynamic_cast and
36 exception handlers. Type information for a particular type is
37 indicated with an ABI defined structure derived from type_info.
38 This would all be very straight forward, but for the fact that the
39 runtime library provides the definitions of the type_info structure
40 and the ABI defined derived classes. We cannot build declarations
41 of them directly in the compiler, but we need to layout objects of
42 their type. Somewhere we have to lie.
43
44 We define layout compatible POD-structs with compiler-defined names
45 and generate the appropriate initializations for them (complete
46 with explicit mention of their vtable). When we have to provide a
47 type_info to the user we reinterpret_cast the internal compiler
48 type to type_info. A well formed program can only explicitly refer
49 to the type_infos of complete types (& cv void). However, we chain
50 pointer type_infos to the pointed-to-type, and that can be
51 incomplete. We only need the addresses of such incomplete
52 type_info objects for static initialization.
53
54 The type information VAR_DECL of a type is held on the
87e3d7cf 55 get_global_binding of the type's mangled name. That VAR_DECL
d689a8f1
NS
56 will be the internal type. It will usually have the correct
57 internal type reflecting the kind of type it represents (pointer,
58 array, function, class, inherited class, etc). When the type it
59 represents is incomplete, it will have the internal type
60 corresponding to type_info. That will only happen at the end of
61 translation, when we are emitting the type info objects. */
62
1bf5fc34 63/* Auxiliary data we hold for each type_info derived object we need. */
a79683d5 64struct GTY (()) tinfo_s {
31dbaab5 65 tree type; /* The (const-qualified) RECORD_TYPE for this type_info object */
1bf5fc34
NS
66
67 tree vtable; /* The VAR_DECL of the vtable. Only filled at end of
68 translation. */
69
70 tree name; /* IDENTIFIER_NODE for the ABI specified name of
71 the type_info derived type. */
a79683d5 72};
1bf5fc34 73
1bf5fc34 74
a79683d5 75enum tinfo_kind
1bf5fc34 76{
3a44f395 77 TK_TYPE_INFO_TYPE, /* abi::__type_info_pseudo */
1bf5fc34 78 TK_BASE_TYPE, /* abi::__base_class_type_info */
ac9a1c7e
NS
79 TK_DERIVED_TYPES, /* Start of types derived from abi::__type_info */
80 TK_BUILTIN_TYPE = TK_DERIVED_TYPES, /* abi::__fundamental_type_info */
1bf5fc34
NS
81 TK_ARRAY_TYPE, /* abi::__array_type_info */
82 TK_FUNCTION_TYPE, /* abi::__function_type_info */
83 TK_ENUMERAL_TYPE, /* abi::__enum_type_info */
84 TK_POINTER_TYPE, /* abi::__pointer_type_info */
85 TK_POINTER_MEMBER_TYPE, /* abi::__pointer_to_member_type_info */
86 TK_CLASS_TYPE, /* abi::__class_type_info */
87 TK_SI_CLASS_TYPE, /* abi::__si_class_type_info */
ac9a1c7e
NS
88 TK_VMI_CLASS_TYPES, /* abi::__vmi_class_type_info<int> */
89 TK_MAX
90};
91
92/* Names of the tinfo types. Must be same order as TK enumeration
93 above. */
94
95static const char *const tinfo_names[TK_MAX] =
96{
97 "__type_info",
98 "__base_class_type_info",
99 "__fundamental_type_info",
100 "__array_type_info",
101 "__function_type_info",
102 "__enum_type_info",
103 "__pointer_type_info",
104 "__pointer_to_member_type_info",
105 "__class_type_info",
106 "__si_class_type_info",
107 "__vmi_class_type_info"
a79683d5 108};
84a43794 109
1c773c7a
KT
110/* Helper macro to get maximum scalar-width of pointer or of the 'long'-type.
111 This of interest for llp64 targets. */
112#define LONGPTR_T \
113 integer_types[(POINTER_SIZE <= TYPE_PRECISION (integer_types[itk_long]) \
114 ? itk_long : itk_long_long)]
115
94214953 116/* A vector of all tinfo decls that haven't yet been emitted. */
9771b263 117vec<tree, va_gc> *unemitted_tinfo_decls;
a260bce6 118
1bf5fc34
NS
119/* A vector of all type_info derived types we need. The first few are
120 fixed and created early. The remainder are for multiple inheritance
121 and are generated as needed. */
9771b263 122static GTY (()) vec<tinfo_s, va_gc> *tinfo_descs;
1bf5fc34 123
4b978f96 124static tree ifnonnull (tree, tree, tsubst_flags_t);
52669d59 125static tree tinfo_name (tree, bool);
ca6932ad 126static tree build_dynamic_cast_1 (location_t, tree, tree, tsubst_flags_t);
cec57f72
NN
127static tree throw_bad_cast (void);
128static tree throw_bad_typeid (void);
cec57f72
NN
129static tree get_tinfo_ptr (tree);
130static bool typeid_ok_p (void);
131static int qualifier_flags (tree);
848eed92 132static bool target_incomplete_p (tree);
1bf5fc34
NS
133static tree tinfo_base_init (tinfo_s *, tree);
134static tree generic_initializer (tinfo_s *, tree);
135static tree ptr_initializer (tinfo_s *, tree);
136static tree ptm_initializer (tinfo_s *, tree);
e20463aa 137static tree class_initializer (tinfo_s *, tree, unsigned, ...);
1bf5fc34
NS
138static tree get_pseudo_ti_init (tree, unsigned);
139static unsigned get_pseudo_ti_index (tree);
ac9a1c7e 140static tinfo_s *get_tinfo_desc (unsigned);
cec57f72 141static void create_tinfo_types (void);
848eed92 142static bool typeinfo_in_lib_p (tree);
7267d692
NS
143
144static int doing_runtime = 0;
84a43794 145\f
a15f0fd0
JJ
146static void
147push_abi_namespace (void)
148{
149 push_nested_namespace (abi_node);
9789ba46 150 push_visibility ("default", 2);
a15f0fd0
JJ
151}
152
153static void
154pop_abi_namespace (void)
155{
9789ba46 156 pop_visibility (2);
a15f0fd0
JJ
157 pop_nested_namespace (abi_node);
158}
d689a8f1
NS
159
160/* Declare language defined type_info type and a pointer to const
161 type_info. This is incomplete here, and will be completed when
162 the user #includes <typeinfo>. There are language defined
163 restrictions on what can be done until that is included. Create
164 the internal versions of the ABI types. */
165
6b5fbb55 166void
848eed92 167init_rtti_processing (void)
6b5fbb55 168{
db24eb1f 169 tree type_info_type;
c8094d83 170
5a7c4505 171 push_nested_namespace (std_node);
db24eb1f 172 type_info_type = xref_tag (class_type, get_identifier ("type_info"),
bd3d082e 173 /*tag_scope=*/ts_current, false);
5a7c4505 174 pop_nested_namespace (std_node);
db24eb1f 175 const_type_info_type_node
a3360e77 176 = cp_build_qualified_type (type_info_type, TYPE_QUAL_CONST);
db24eb1f 177 type_info_ptr_type = build_pointer_type (const_type_info_type_node);
d689a8f1 178
9771b263 179 vec_alloc (unemitted_tinfo_decls, 124);
c8094d83 180
d689a8f1 181 create_tinfo_types ();
6b5fbb55
MS
182}
183
6b5fbb55
MS
184/* Given the expression EXP of type `class *', return the head of the
185 object pointed to by EXP with type cv void*, if the class has any
4c6b7393 186 virtual functions (TYPE_POLYMORPHIC_P), else just return the
6b5fbb55 187 expression. */
e92cc029 188
6f06d231 189tree
848eed92 190build_headof (tree exp)
84a43794
MS
191{
192 tree type = TREE_TYPE (exp);
de22184b 193 tree offset;
da3d4dfa 194 tree index;
84a43794 195
50e10fa8 196 gcc_assert (TYPE_PTR_P (type));
84a43794
MS
197 type = TREE_TYPE (type);
198
4c6b7393 199 if (!TYPE_POLYMORPHIC_P (type))
84a43794
MS
200 return exp;
201
6b5fbb55
MS
202 /* We use this a couple of times below, protect it. */
203 exp = save_expr (exp);
204
3461fba7 205 /* The offset-to-top field is at index -2 from the vptr. */
4a90aeeb 206 index = build_int_cst (NULL_TREE,
7d60be94 207 -2 * TARGET_VTABLE_DATA_ENTRY_DISTANCE);
da3d4dfa 208
04757a2a 209 offset = build_vtbl_ref (cp_build_fold_indirect_ref (exp),
5ade1ed2 210 index);
84a43794 211
45309d28
ML
212 cp_build_qualified_type (ptr_type_node,
213 cp_type_quals (TREE_TYPE (exp)));
5d49b6a7 214 return fold_build_pointer_plus (exp, offset);
84a43794 215}
5156628f 216
5156628f
MS
217/* Get a bad_cast node for the program to throw...
218
219 See libstdc++/exception.cc for __throw_bad_cast */
220
221static tree
848eed92 222throw_bad_cast (void)
5156628f 223{
4b4b2e58
NS
224 static tree fn;
225 if (!fn)
226 {
227 tree name = get_identifier ("__cxa_bad_cast");
87e3d7cf 228 fn = get_global_binding (name);
4b4b2e58
NS
229 if (!fn)
230 fn = push_throw_library_fn
231 (name, build_function_type_list (ptr_type_node, NULL_TREE));
232 }
c8094d83 233
e2e03032 234 return build_cxx_call (fn, 0, NULL, tf_warning_or_error);
5156628f
MS
235}
236
2050a1bb
MM
237/* Return an expression for "__cxa_bad_typeid()". The expression
238 returned is an lvalue of type "const std::type_info". */
239
5156628f 240static tree
848eed92 241throw_bad_typeid (void)
5156628f 242{
4b4b2e58
NS
243 static tree fn;
244 if (!fn)
cf74fb86 245 {
4b4b2e58 246 tree name = get_identifier ("__cxa_bad_typeid");
87e3d7cf 247 fn = get_global_binding (name);
4b4b2e58
NS
248 if (!fn)
249 {
250 tree t = build_reference_type (const_type_info_type_node);
251 t = build_function_type_list (t, NULL_TREE);
252 fn = push_throw_library_fn (name, t);
253 }
cf74fb86 254 }
059fa5e7 255
e2e03032 256 return build_cxx_call (fn, 0, NULL, tf_warning_or_error);
5156628f 257}
84a43794 258\f
2050a1bb
MM
259/* Return an lvalue expression whose type is "const std::type_info"
260 and whose value indicates the type of the expression EXP. If EXP
261 is a reference to a polymorphic class, return the dynamic type;
5156628f 262 otherwise return the static type of the expression. */
e92cc029 263
e5f614d7 264static tree
795801d6 265get_tinfo_decl_dynamic (tree exp, tsubst_flags_t complain)
84a43794
MS
266{
267 tree type;
2050a1bb 268 tree t;
c8094d83 269
717f8053 270 if (error_operand_p (exp))
84a43794
MS
271 return error_mark_node;
272
46f0d909 273 exp = resolve_nondeduced_context (exp, complain);
6780e186 274
debf1662 275 /* Peel back references, so they match. */
f7904392 276 type = non_reference (unlowered_expr_type (exp));
84a43794 277
e92cc029 278 /* Peel off cv qualifiers. */
debf1662 279 type = cv_unqualified (type);
c8094d83 280
41b059f3 281 /* For UNKNOWN_TYPEs call complete_type_or_else to get diagnostics. */
fbfc8363
JM
282 if (CLASS_TYPE_P (type) || type == unknown_type_node
283 || type == init_list_type_node)
795801d6 284 type = complete_type_or_maybe_complain (type, exp, complain);
c8094d83 285
e5f614d7
NS
286 if (!type)
287 return error_mark_node;
6a8f78d5 288
84a43794 289 /* If exp is a reference to polymorphic type, get the real type_info. */
4c6b7393 290 if (TYPE_POLYMORPHIC_P (type) && ! resolves_to_fixed_type_p (exp, 0))
84a43794
MS
291 {
292 /* build reference to type_info from vtable. */
da3d4dfa 293 tree index;
84a43794 294
8fa33dfa 295 /* The RTTI information is at index -1. */
4a90aeeb 296 index = build_int_cst (NULL_TREE,
7d60be94 297 -1 * TARGET_VTABLE_DATA_ENTRY_DISTANCE);
b5d1cbd2 298 t = build_vtbl_ref (exp, index);
6de9cd9a 299 t = convert (type_info_ptr_type, t);
84a43794 300 }
2050a1bb
MM
301 else
302 /* Otherwise return the type_info for the static type of the expr. */
debf1662 303 t = get_tinfo_ptr (type);
84a43794 304
04757a2a 305 return cp_build_fold_indirect_ref (t);
5156628f
MS
306}
307
7f54a851 308static bool
848eed92 309typeid_ok_p (void)
5156628f 310{
f915e937
NS
311 if (! flag_rtti)
312 {
a3f9f006 313 error ("cannot use %<typeid%> with %<-fno-rtti%>");
7f54a851 314 return false;
f915e937 315 }
c8094d83 316
db24eb1f 317 if (!COMPLETE_TYPE_P (const_type_info_type_node))
6a8f78d5 318 {
eea77d1f 319 gcc_rich_location richloc (input_location);
85204e23 320 maybe_add_include_fixit (&richloc, "<typeinfo>", false);
64a5912c
DM
321 error_at (&richloc,
322 "must %<#include <typeinfo>%> before using"
323 " %<typeid%>");
eea77d1f 324
7f54a851 325 return false;
6a8f78d5 326 }
c8094d83 327
ac9a1c7e
NS
328 tree pseudo = TYPE_MAIN_VARIANT (get_tinfo_desc (TK_TYPE_INFO_TYPE)->type);
329 tree real = TYPE_MAIN_VARIANT (const_type_info_type_node);
3a44f395
JJ
330
331 /* Make sure abi::__type_info_pseudo has the same alias set
332 as std::type_info. */
ac9a1c7e
NS
333 if (! TYPE_ALIAS_SET_KNOWN_P (pseudo))
334 TYPE_ALIAS_SET (pseudo) = get_alias_set (real);
3a44f395 335 else
ac9a1c7e 336 gcc_assert (TYPE_ALIAS_SET (pseudo) == get_alias_set (real));
3a44f395 337
7f54a851
NS
338 return true;
339}
340
2050a1bb
MM
341/* Return an expression for "typeid(EXP)". The expression returned is
342 an lvalue of type "const std::type_info". */
343
7f54a851 344tree
795801d6 345build_typeid (tree exp, tsubst_flags_t complain)
7f54a851 346{
03a904b5 347 tree cond = NULL_TREE, initial_expr = exp;
7f54a851
NS
348 int nonnull = 0;
349
350 if (exp == error_mark_node || !typeid_ok_p ())
351 return error_mark_node;
352
5156628f 353 if (processing_template_decl)
db24eb1f 354 return build_min (TYPEID_EXPR, const_type_info_type_node, exp);
5156628f 355
c87e82a6 356 if (TYPE_POLYMORPHIC_P (TREE_TYPE (exp))
5156628f
MS
357 && ! resolves_to_fixed_type_p (exp, &nonnull)
358 && ! nonnull)
359 {
03a904b5 360 /* So we need to look into the vtable of the type of exp.
c87e82a6
JM
361 Make sure it isn't a null lvalue. */
362 exp = cp_build_addr_expr (exp, complain);
6ef15591 363 exp = save_expr (exp);
c87e82a6 364 cond = cp_convert (boolean_type_node, exp, complain);
04757a2a 365 exp = cp_build_fold_indirect_ref (exp);
5156628f
MS
366 }
367
795801d6 368 exp = get_tinfo_decl_dynamic (exp, complain);
9a3b49ac
MS
369
370 if (exp == error_mark_node)
371 return error_mark_node;
372
5156628f
MS
373 if (cond)
374 {
375 tree bad = throw_bad_typeid ();
376
f293ce4b 377 exp = build3 (COND_EXPR, TREE_TYPE (exp), cond, exp, bad);
5156628f 378 }
03a904b5
JJ
379 else
380 mark_type_use (initial_expr);
5156628f 381
2050a1bb 382 return exp;
84a43794
MS
383}
384
52669d59
JQ
385/* Generate the NTBS name of a type. If MARK_PRIVATE, put a '*' in front so that
386 comparisons will be done by pointer rather than string comparison. */
db1147b2 387static tree
52669d59 388tinfo_name (tree type, bool mark_private)
db1147b2 389{
1f6e1acc 390 const char *name;
52669d59 391 int length;
1f6e1acc
AS
392 tree name_string;
393
52669d59
JQ
394 name = mangle_type_string (type);
395 length = strlen (name);
396
397 if (mark_private)
398 {
399 /* Inject '*' at beginning of name to force pointer comparison. */
c86f25e8 400 char* buf = (char*) XALLOCAVEC (char, length + 2);
52669d59 401 buf[0] = '*';
c86f25e8
JM
402 memcpy (buf + 1, name, length + 1);
403 name_string = build_string (length + 2, buf);
52669d59
JQ
404 }
405 else
406 name_string = build_string (length + 1, name);
407
408 return fix_string_type (name_string);
db1147b2
NS
409}
410
d689a8f1
NS
411/* Return a VAR_DECL for the internal ABI defined type_info object for
412 TYPE. You must arrange that the decl is mark_used, if actually use
c8094d83 413 it --- decls in vtables are only used if the vtable is output. */
794d4a61 414
6b5fbb55 415tree
848eed92 416get_tinfo_decl (tree type)
6b5fbb55 417{
9a3b49ac 418 tree name;
6b5fbb55
MS
419 tree d;
420
f19218e5 421 if (variably_modified_type_p (type, /*fn=*/NULL_TREE))
0c918ce5 422 {
94a073b2
JM
423 error ("cannot create type information for type %qT because "
424 "it involves types of variable size",
425 type);
0c918ce5
MM
426 return error_mark_node;
427 }
428
9a3b49ac
MS
429 if (TREE_CODE (type) == METHOD_TYPE)
430 type = build_function_type (TREE_TYPE (type),
431 TREE_CHAIN (TYPE_ARG_TYPES (type)));
432
17d208b5
JM
433 type = complete_type (type);
434
a82d6da5
MM
435 /* For a class type, the variable is cached in the type node
436 itself. */
437 if (CLASS_TYPE_P (type))
438 {
439 d = CLASSTYPE_TYPEINFO_VAR (TYPE_MAIN_VARIANT (type));
440 if (d)
441 return d;
442 }
c8094d83 443
1f84ec23 444 name = mangle_typeinfo_for_type (type);
669ec2b4 445
87e3d7cf 446 d = get_global_binding (name);
d689a8f1 447 if (!d)
7267d692 448 {
fe93f42f 449 int ix = get_pseudo_ti_index (type);
ac9a1c7e
NS
450 const tinfo_s *ti = get_tinfo_desc (ix);
451
1bf5fc34 452 d = build_lang_decl (VAR_DECL, name, ti->type);
4684cd27 453 SET_DECL_ASSEMBLER_NAME (d, name);
73a8adb6
MM
454 /* Remember the type it is for. */
455 TREE_TYPE (name) = type;
4684cd27 456 DECL_TINFO_P (d) = 1;
7267d692 457 DECL_ARTIFICIAL (d) = 1;
78e0d62b 458 DECL_IGNORED_P (d) = 1;
7267d692
NS
459 TREE_READONLY (d) = 1;
460 TREE_STATIC (d) = 1;
31dbaab5 461
4684cd27
MM
462 /* Mark the variable as undefined -- but remember that we can
463 define it later if we need to do so. */
7267d692 464 DECL_EXTERNAL (d) = 1;
4684cd27 465 DECL_NOT_REALLY_EXTERN (d) = 1;
d71176b6
GK
466 set_linkage_according_to_type (type, d);
467
2e3757e7 468 d = pushdecl_top_level_and_finish (d, NULL_TREE);
73a8adb6
MM
469 if (CLASS_TYPE_P (type))
470 CLASSTYPE_TYPEINFO_VAR (TYPE_MAIN_VARIANT (type)) = d;
d689a8f1 471
9bcb9aae 472 /* Add decl to the global array of tinfo decls. */
9771b263 473 vec_safe_push (unemitted_tinfo_decls, d);
7267d692 474 }
d689a8f1 475
6b5fbb55
MS
476 return d;
477}
478
d689a8f1
NS
479/* Return a pointer to a type_info object describing TYPE, suitably
480 cast to the language defined type. */
481
482static tree
848eed92 483get_tinfo_ptr (tree type)
d689a8f1 484{
bb4f6e6b
JH
485 tree decl = get_tinfo_decl (type);
486
487 mark_used (decl);
c8094d83 488 return build_nop (type_info_ptr_type,
bb4f6e6b 489 build_address (decl));
d689a8f1
NS
490}
491
e5f614d7 492/* Return the type_info object for TYPE. */
e92cc029 493
84a43794 494tree
795801d6 495get_typeid (tree type, tsubst_flags_t complain)
84a43794 496{
7f54a851 497 if (type == error_mark_node || !typeid_ok_p ())
84a43794 498 return error_mark_node;
c8094d83 499
e9f32eb5 500 if (processing_template_decl)
db24eb1f 501 return build_min (TYPEID_EXPR, const_type_info_type_node, type);
e9f32eb5 502
6b5fbb55
MS
503 /* If the type of the type-id is a reference type, the result of the
504 typeid expression refers to a type_info object representing the
505 referenced type. */
ee76b931 506 type = non_reference (type);
84a43794 507
80f7a782
JM
508 /* This is not one of the uses of a qualified function type in 8.3.5. */
509 if (TREE_CODE (type) == FUNCTION_TYPE
510 && (type_memfn_quals (type) != TYPE_UNQUALIFIED
511 || type_memfn_rqual (type) != REF_QUAL_NONE))
512 {
513 if (complain & tf_error)
a9c697b8 514 error ("%<typeid%> of qualified function type %qT", type);
80f7a782
JM
515 return error_mark_node;
516 }
517
6b5fbb55 518 /* The top-level cv-qualifiers of the lvalue expression or the type-id
e92cc029 519 that is the operand of typeid are always ignored. */
debf1662 520 type = cv_unqualified (type);
84a43794 521
41b059f3 522 /* For UNKNOWN_TYPEs call complete_type_or_else to get diagnostics. */
fbfc8363
JM
523 if (CLASS_TYPE_P (type) || type == unknown_type_node
524 || type == init_list_type_node)
795801d6 525 type = complete_type_or_maybe_complain (type, NULL_TREE, complain);
c8094d83 526
e5f614d7
NS
527 if (!type)
528 return error_mark_node;
6a8f78d5 529
04757a2a 530 return cp_build_fold_indirect_ref (get_tinfo_ptr (type));
84a43794
MS
531}
532
a80e4195
MS
533/* Check whether TEST is null before returning RESULT. If TEST is used in
534 RESULT, it must have previously had a save_expr applied to it. */
535
824b9a4c 536static tree
4b978f96 537ifnonnull (tree test, tree result, tsubst_flags_t complain)
a80e4195 538{
7a965d51
JJ
539 tree cond = build2 (NE_EXPR, boolean_type_node, test,
540 cp_convert (TREE_TYPE (test), nullptr_node, complain));
541 /* This is a compiler generated comparison, don't emit
542 e.g. -Wnonnull-compare warning for it. */
543 TREE_NO_WARNING (cond) = 1;
544 return build3 (COND_EXPR, TREE_TYPE (result), cond, result,
545 cp_convert (TREE_TYPE (result), nullptr_node, complain));
a80e4195
MS
546}
547
84a43794
MS
548/* Execute a dynamic cast, as described in section 5.2.6 of the 9/93 working
549 paper. */
6b5fbb55 550
42976354 551static tree
ca6932ad
PC
552build_dynamic_cast_1 (location_t loc, tree type, tree expr,
553 tsubst_flags_t complain)
84a43794
MS
554{
555 enum tree_code tc = TREE_CODE (type);
63891ba2 556 tree exprtype;
6b5fbb55 557 tree dcast_fn;
6a8f78d5 558 tree old_expr = expr;
c2e407f1 559 const char *errstr = NULL;
84a43794 560
8d8d1a28
AH
561 /* Save casted types in the function's used types hash table. */
562 used_types_insert (type);
563
64b83f2a
SG
564 /* T shall be a pointer or reference to a complete class type, or
565 `pointer to cv void''. */
84a43794
MS
566 switch (tc)
567 {
568 case POINTER_TYPE:
50e10fa8 569 if (VOID_TYPE_P (TREE_TYPE (type)))
84a43794 570 break;
db24eb1f 571 /* Fall through. */
84a43794 572 case REFERENCE_TYPE:
9e1e64ec 573 if (! MAYBE_CLASS_TYPE_P (TREE_TYPE (type)))
64b83f2a 574 {
4cd5a50a 575 errstr = _("target is not pointer or reference to class");
64b83f2a
SG
576 goto fail;
577 }
d0f062fb 578 if (!COMPLETE_TYPE_P (complete_type (TREE_TYPE (type))))
64b83f2a 579 {
4cd5a50a 580 errstr = _("target is not pointer or reference to complete type");
64b83f2a
SG
581 goto fail;
582 }
cdf5b885 583 break;
64b83f2a 584
84a43794 585 default:
4cd5a50a 586 errstr = _("target is not pointer or reference");
84a43794
MS
587 goto fail;
588 }
589
64b83f2a 590 if (tc == POINTER_TYPE)
84a43794 591 {
89fcabaf 592 expr = decay_conversion (expr, complain);
63891ba2
PC
593 exprtype = TREE_TYPE (expr);
594
64b83f2a
SG
595 /* If T is a pointer type, v shall be an rvalue of a pointer to
596 complete class type, and the result is an rvalue of type T. */
597
03a904b5
JJ
598 expr = mark_rvalue_use (expr);
599
50e10fa8 600 if (!TYPE_PTR_P (exprtype))
64b83f2a 601 {
4cd5a50a 602 errstr = _("source is not a pointer");
64b83f2a
SG
603 goto fail;
604 }
9e1e64ec 605 if (! MAYBE_CLASS_TYPE_P (TREE_TYPE (exprtype)))
64b83f2a 606 {
4cd5a50a 607 errstr = _("source is not a pointer to class");
64b83f2a
SG
608 goto fail;
609 }
d0f062fb 610 if (!COMPLETE_TYPE_P (complete_type (TREE_TYPE (exprtype))))
64b83f2a 611 {
4cd5a50a 612 errstr = _("source is a pointer to incomplete type");
64b83f2a
SG
613 goto fail;
614 }
615 }
616 else
617 {
03a904b5 618 expr = mark_lvalue_use (expr);
a347241b 619 exprtype = TREE_TYPE (expr);
db24eb1f 620
64b83f2a
SG
621 /* T is a reference type, v shall be an lvalue of a complete class
622 type, and the result is an lvalue of the type referred to by T. */
a347241b 623 if (! MAYBE_CLASS_TYPE_P (exprtype))
64b83f2a 624 {
4cd5a50a 625 errstr = _("source is not of class type");
64b83f2a
SG
626 goto fail;
627 }
a347241b 628 if (!COMPLETE_TYPE_P (complete_type (exprtype)))
64b83f2a 629 {
4cd5a50a 630 errstr = _("source is of incomplete class type");
64b83f2a
SG
631 goto fail;
632 }
a347241b
JM
633
634 exprtype = cp_build_reference_type (exprtype, !lvalue_p (expr));
64b83f2a
SG
635 }
636
637 /* The dynamic_cast operator shall not cast away constness. */
638 if (!at_least_as_qualified_p (TREE_TYPE (type),
639 TREE_TYPE (exprtype)))
640 {
4cd5a50a 641 errstr = _("conversion casts away constness");
64b83f2a 642 goto fail;
84a43794
MS
643 }
644
645 /* If *type is an unambiguous accessible base class of *exprtype,
646 convert statically. */
647 {
ffe7516f
PC
648 tree binfo = lookup_base (TREE_TYPE (exprtype), TREE_TYPE (type),
649 ba_check, NULL, complain);
338d90b8 650 if (binfo)
ca6932ad 651 return build_static_cast (loc, type, expr, complain);
84a43794
MS
652 }
653
d1522e8f
JM
654 /* Apply trivial conversion T -> T& for dereferenced ptrs. */
655 if (tc == REFERENCE_TYPE)
656 expr = convert_to_reference (exprtype, expr, CONV_IMPLICIT,
657 LOOKUP_NORMAL, NULL_TREE, complain);
658
84a43794 659 /* Otherwise *exprtype must be a polymorphic class (have a vtbl). */
4c6b7393 660 if (TYPE_POLYMORPHIC_P (TREE_TYPE (exprtype)))
84a43794 661 {
a80e4195 662 tree expr1;
84a43794 663 /* if TYPE is `void *', return pointer to complete object. */
b72801e2 664 if (tc == POINTER_TYPE && VOID_TYPE_P (TREE_TYPE (type)))
84a43794
MS
665 {
666 /* if b is an object, dynamic_cast<void *>(&b) == (void *)&b. */
667 if (TREE_CODE (expr) == ADDR_EXPR
5a6ccc94 668 && VAR_P (TREE_OPERAND (expr, 0))
84a43794
MS
669 && TREE_CODE (TREE_TYPE (TREE_OPERAND (expr, 0))) == RECORD_TYPE)
670 return build1 (NOP_EXPR, type, expr);
671
a80e4195
MS
672 /* Since expr is used twice below, save it. */
673 expr = save_expr (expr);
674
675 expr1 = build_headof (expr);
676 if (TREE_TYPE (expr1) != type)
677 expr1 = build1 (NOP_EXPR, type, expr1);
4b978f96 678 return ifnonnull (expr, expr1, complain);
84a43794
MS
679 }
680 else
681 {
682 tree retval;
94a0dd7b
SL
683 tree result, td2, td3;
684 tree elems[4];
0cbd7506 685 tree static_type, target_type, boff;
84a43794 686
0cbd7506 687 /* If we got here, we can't convert statically. Therefore,
84a43794 688 dynamic_cast<D&>(b) (b an object) cannot succeed. */
64b83f2a 689 if (tc == REFERENCE_TYPE)
84a43794 690 {
5a6ccc94 691 if (VAR_P (old_expr)
6a8f78d5 692 && TREE_CODE (TREE_TYPE (old_expr)) == RECORD_TYPE)
84a43794 693 {
0cbd7506 694 tree expr = throw_bad_cast ();
5ade1ed2 695 if (complain & tf_warning)
ca6932ad
PC
696 warning_at (loc, 0,
697 "%<dynamic_cast<%#T>(%#D)%> can never succeed",
698 type, old_expr);
0cbd7506
MS
699 /* Bash it to the expected type. */
700 TREE_TYPE (expr) = type;
059fa5e7 701 return expr;
84a43794
MS
702 }
703 }
704 /* Ditto for dynamic_cast<D*>(&b). */
705 else if (TREE_CODE (expr) == ADDR_EXPR)
706 {
707 tree op = TREE_OPERAND (expr, 0);
5a6ccc94 708 if (VAR_P (op)
84a43794
MS
709 && TREE_CODE (TREE_TYPE (op)) == RECORD_TYPE)
710 {
5ade1ed2 711 if (complain & tf_warning)
ca6932ad
PC
712 warning_at (loc, 0,
713 "%<dynamic_cast<%#T>(%#D)%> can never succeed",
714 type, op);
c8094d83 715 retval = build_int_cst (type, 0);
84a43794
MS
716 return retval;
717 }
718 }
719
6c9384c3
BS
720 /* Use of dynamic_cast when -fno-rtti is prohibited. */
721 if (!flag_rtti)
722 {
5ade1ed2 723 if (complain & tf_error)
ca6932ad
PC
724 error_at (loc,
725 "%<dynamic_cast%> not permitted with %<-fno-rtti%>");
6c9384c3
BS
726 return error_mark_node;
727 }
728
7267d692
NS
729 target_type = TYPE_MAIN_VARIANT (TREE_TYPE (type));
730 static_type = TYPE_MAIN_VARIANT (TREE_TYPE (exprtype));
bb4f6e6b 731 td2 = get_tinfo_decl (target_type);
9f635aba
PC
732 if (!mark_used (td2, complain) && !(complain & tf_error))
733 return error_mark_node;
93c0e0bb 734 td2 = cp_build_addr_expr (td2, complain);
bb4f6e6b 735 td3 = get_tinfo_decl (static_type);
9f635aba
PC
736 if (!mark_used (td3, complain) && !(complain & tf_error))
737 return error_mark_node;
93c0e0bb 738 td3 = cp_build_addr_expr (td3, complain);
7267d692 739
0cbd7506
MS
740 /* Determine how T and V are related. */
741 boff = dcast_base_hint (static_type, target_type);
c8094d83 742
6b5fbb55
MS
743 /* Since expr is used twice below, save it. */
744 expr = save_expr (expr);
745
84a43794
MS
746 expr1 = expr;
747 if (tc == REFERENCE_TYPE)
93c0e0bb 748 expr1 = cp_build_addr_expr (expr1, complain);
84a43794 749
94a0dd7b
SL
750 elems[0] = expr1;
751 elems[1] = td3;
752 elems[2] = td2;
753 elems[3] = boff;
6b5fbb55 754
059fa5e7
NS
755 dcast_fn = dynamic_cast_node;
756 if (!dcast_fn)
6b5fbb55
MS
757 {
758 tree tmp;
7267d692 759 tree tinfo_ptr;
7267d692 760 const char *name;
c8094d83 761
a15f0fd0 762 push_abi_namespace ();
88e5899c 763 tinfo_ptr = xref_tag (class_type,
8fa33dfa 764 get_identifier ("__class_type_info"),
bd3d082e 765 /*tag_scope=*/ts_current, false);
c8094d83 766
8fa33dfa 767 tinfo_ptr = build_pointer_type
a3360e77 768 (cp_build_qualified_type
8fa33dfa
MM
769 (tinfo_ptr, TYPE_QUAL_CONST));
770 name = "__dynamic_cast";
0244e6f7
NF
771 tmp = build_function_type_list (ptr_type_node,
772 const_ptr_type_node,
773 tinfo_ptr, tinfo_ptr,
774 ptrdiff_type_node, NULL_TREE);
fafa0521
JH
775 dcast_fn = build_library_fn_ptr (name, tmp,
776 ECF_LEAF | ECF_PURE | ECF_NOTHROW);
a15f0fd0 777 pop_abi_namespace ();
0cbd7506 778 dynamic_cast_node = dcast_fn;
6b5fbb55 779 }
e2e03032 780 result = build_cxx_call (dcast_fn, 4, elems, complain);
22edf943 781 SET_EXPR_LOCATION (result, loc);
84a43794
MS
782
783 if (tc == REFERENCE_TYPE)
784 {
7267d692 785 tree bad = throw_bad_cast ();
a0c04f8e 786 tree neq;
c8094d83 787
84a43794 788 result = save_expr (result);
2ab340fe 789 neq = cp_truthvalue_conversion (result, complain);
c74147d2
RG
790 return cp_convert (type,
791 build3 (COND_EXPR, TREE_TYPE (result),
4b978f96 792 neq, result, bad), complain);
84a43794
MS
793 }
794
e92cc029 795 /* Now back to the type we want from a void*. */
4b978f96
PC
796 result = cp_convert (type, result, complain);
797 return ifnonnull (expr, result, complain);
84a43794
MS
798 }
799 }
64b83f2a 800 else
4cd5a50a 801 errstr = _("source type is not polymorphic");
0f4d5c1c 802
84a43794 803 fail:
5ade1ed2 804 if (complain & tf_error)
ca6932ad
PC
805 error_at (loc, "cannot %<dynamic_cast%> %qE (of type %q#T) "
806 "to type %q#T (%s)",
807 old_expr, TREE_TYPE (old_expr), type, errstr);
84a43794
MS
808 return error_mark_node;
809}
42976354
BK
810
811tree
ca6932ad
PC
812build_dynamic_cast (location_t loc, tree type, tree expr,
813 tsubst_flags_t complain)
42976354 814{
04398fa8
PC
815 tree r;
816
328d03d7
JM
817 if (type == error_mark_node || expr == error_mark_node)
818 return error_mark_node;
c8094d83 819
328d03d7 820 if (processing_template_decl)
8e1daa34
NS
821 {
822 expr = build_min (DYNAMIC_CAST_EXPR, type, expr);
823 TREE_SIDE_EFFECTS (expr) = 1;
ca6932ad
PC
824 r = convert_from_reference (expr);
825 protected_set_expr_location (r, loc);
826 return r;
8e1daa34 827 }
328d03d7 828
ca6932ad
PC
829 r = convert_from_reference (build_dynamic_cast_1 (loc, type, expr,
830 complain));
04398fa8 831 if (r != error_mark_node)
ca6932ad
PC
832 maybe_warn_about_useless_cast (loc, type, expr, complain);
833 protected_set_expr_location (r, loc);
04398fa8 834 return r;
42976354 835}
04398fa8 836
7267d692
NS
837/* Return the runtime bit mask encoding the qualifiers of TYPE. */
838
839static int
848eed92 840qualifier_flags (tree type)
7267d692
NS
841{
842 int flags = 0;
05abed76 843 int quals = cp_type_quals (type);
c8094d83 844
7267d692
NS
845 if (quals & TYPE_QUAL_CONST)
846 flags |= 1;
847 if (quals & TYPE_QUAL_VOLATILE)
848 flags |= 2;
6d61f400
NS
849 if (quals & TYPE_QUAL_RESTRICT)
850 flags |= 4;
7267d692
NS
851 return flags;
852}
853
848eed92 854/* Return true, if the pointer chain TYPE ends at an incomplete type, or
0a240972
NS
855 contains a pointer to member of an incomplete class. */
856
848eed92
GDR
857static bool
858target_incomplete_p (tree type)
0a240972 859{
a5ac359a 860 while (true)
66b1156a 861 if (TYPE_PTRDATAMEM_P (type))
0a240972 862 {
a5ac359a
MM
863 if (!COMPLETE_TYPE_P (TYPE_PTRMEM_CLASS_TYPE (type)))
864 return true;
865 type = TYPE_PTRMEM_POINTED_TO_TYPE (type);
0a240972 866 }
50e10fa8 867 else if (TYPE_PTR_P (type))
0a240972 868 type = TREE_TYPE (type);
a5ac359a
MM
869 else
870 return !COMPLETE_OR_VOID_TYPE_P (type);
0a240972
NS
871}
872
4684cd27
MM
873/* Returns true if TYPE involves an incomplete class type; in that
874 case, typeinfo variables for TYPE should be emitted with internal
875 linkage. */
876
877static bool
878involves_incomplete_p (tree type)
879{
880 switch (TREE_CODE (type))
881 {
882 case POINTER_TYPE:
883 return target_incomplete_p (TREE_TYPE (type));
884
885 case OFFSET_TYPE:
886 ptrmem:
c8094d83 887 return
4684cd27
MM
888 (target_incomplete_p (TYPE_PTRMEM_POINTED_TO_TYPE (type))
889 || !COMPLETE_TYPE_P (TYPE_PTRMEM_CLASS_TYPE (type)));
890
891 case RECORD_TYPE:
892 if (TYPE_PTRMEMFUNC_P (type))
893 goto ptrmem;
894 /* Fall through. */
895 case UNION_TYPE:
896 if (!COMPLETE_TYPE_P (type))
897 return true;
0b4b9552 898 /* Fall through. */
4684cd27
MM
899 default:
900 /* All other types do not involve incomplete class types. */
901 return false;
902 }
903}
904
7267d692 905/* Return a CONSTRUCTOR for the common part of the type_info objects. This
0a240972
NS
906 is the vtable pointer and NTBS name. The NTBS name is emitted as a
907 comdat const char array, so it becomes a unique key for the type. Generate
908 and emit that VAR_DECL here. (We can't always emit the type_info itself
909 as comdat, because of pointers to incomplete.) */
7267d692
NS
910
911static tree
1bf5fc34 912tinfo_base_init (tinfo_s *ti, tree target)
7267d692 913{
e20463aa 914 tree init;
0a240972 915 tree name_decl;
d689a8f1 916 tree vtable_ptr;
9771b263 917 vec<constructor_elt, va_gc> *v;
c8094d83 918
0a240972 919 {
52669d59 920 tree name_name, name_string;
c8094d83 921
0a240972 922 /* Generate the NTBS array variable. */
0a240972 923 tree name_type = build_cplus_array_type
a3360e77 924 (cp_build_qualified_type (char_type_node, TYPE_QUAL_CONST),
0cbd7506 925 NULL_TREE);
1f6e1acc 926
4684cd27
MM
927 /* Determine the name of the variable -- and remember with which
928 type it is associated. */
1f84ec23 929 name_name = mangle_typeinfo_string_for_type (target);
4684cd27
MM
930 TREE_TYPE (name_name) = target;
931
0a240972 932 name_decl = build_lang_decl (VAR_DECL, name_name, name_type);
73a8adb6 933 SET_DECL_ASSEMBLER_NAME (name_decl, name_name);
0a240972 934 DECL_ARTIFICIAL (name_decl) = 1;
78e0d62b 935 DECL_IGNORED_P (name_decl) = 1;
0a240972
NS
936 TREE_READONLY (name_decl) = 1;
937 TREE_STATIC (name_decl) = 1;
938 DECL_EXTERNAL (name_decl) = 0;
4684cd27 939 DECL_TINFO_P (name_decl) = 1;
6e4be1fa 940 set_linkage_according_to_type (target, name_decl);
4684cd27 941 import_export_decl (name_decl);
52669d59 942 name_string = tinfo_name (target, !TREE_PUBLIC (name_decl));
0a240972 943 DECL_INITIAL (name_decl) = name_string;
bb4f6e6b 944 mark_used (name_decl);
2e3757e7 945 pushdecl_top_level_and_finish (name_decl, name_string);
0a240972 946 }
d689a8f1 947
1bf5fc34 948 vtable_ptr = ti->vtable;
d689a8f1 949 if (!vtable_ptr)
7267d692 950 {
d689a8f1 951 tree real_type;
a15f0fd0 952 push_abi_namespace ();
1bf5fc34 953 real_type = xref_tag (class_type, ti->name,
bd3d082e 954 /*tag_scope=*/ts_current, false);
a15f0fd0 955 pop_abi_namespace ();
c8094d83 956
d689a8f1
NS
957 if (!COMPLETE_TYPE_P (real_type))
958 {
0cbd7506 959 /* We never saw a definition of this type, so we need to
d689a8f1
NS
960 tell the compiler that this is an exported class, as
961 indeed all of the __*_type_info classes are. */
962 SET_CLASSTYPE_INTERFACE_KNOWN (real_type);
963 CLASSTYPE_INTERFACE_ONLY (real_type) = 1;
964 }
965
966 vtable_ptr = get_vtable_decl (real_type, /*complete=*/1);
93c0e0bb 967 vtable_ptr = cp_build_addr_expr (vtable_ptr, tf_warning_or_error);
d689a8f1
NS
968
969 /* We need to point into the middle of the vtable. */
5d49b6a7
RG
970 vtable_ptr = fold_build_pointer_plus
971 (vtable_ptr,
d689a8f1
NS
972 size_binop (MULT_EXPR,
973 size_int (2 * TARGET_VTABLE_DATA_ENTRY_DISTANCE),
974 TYPE_SIZE_UNIT (vtable_entry_type)));
3db45ab5 975
1bf5fc34 976 ti->vtable = vtable_ptr;
7267d692 977 }
d689a8f1 978
9771b263 979 vec_alloc (v, 2);
e20463aa 980 CONSTRUCTOR_APPEND_ELT (v, NULL_TREE, vtable_ptr);
89fcabaf
PC
981 CONSTRUCTOR_APPEND_ELT (v, NULL_TREE,
982 decay_conversion (name_decl, tf_warning_or_error));
c8094d83 983
e20463aa 984 init = build_constructor (init_list_type_node, v);
6de9cd9a 985 TREE_CONSTANT (init) = 1;
6de9cd9a 986 TREE_STATIC (init) = 1;
c8094d83 987
7267d692
NS
988 return init;
989}
990
1bf5fc34 991/* Return the CONSTRUCTOR expr for a type_info of TYPE. TI provides the
7267d692
NS
992 information about the particular type_info derivation, which adds no
993 additional fields to the type_info base. */
994
995static tree
1bf5fc34 996generic_initializer (tinfo_s *ti, tree target)
7267d692 997{
1bf5fc34 998 tree init = tinfo_base_init (ti, target);
3db45ab5 999
e20463aa 1000 init = build_constructor_single (init_list_type_node, NULL_TREE, init);
6de9cd9a 1001 TREE_CONSTANT (init) = 1;
6de9cd9a 1002 TREE_STATIC (init) = 1;
7267d692
NS
1003 return init;
1004}
1005
1f4cb92b 1006/* Return the CONSTRUCTOR expr for a type_info of pointer TYPE.
1bf5fc34 1007 TI provides information about the particular type_info derivation,
7267d692
NS
1008 which adds target type and qualifier flags members to the type_info base. */
1009
1010static tree
1bf5fc34 1011ptr_initializer (tinfo_s *ti, tree target)
7267d692 1012{
1bf5fc34 1013 tree init = tinfo_base_init (ti, target);
7267d692
NS
1014 tree to = TREE_TYPE (target);
1015 int flags = qualifier_flags (to);
848eed92 1016 bool incomplete = target_incomplete_p (to);
9771b263
DN
1017 vec<constructor_elt, va_gc> *v;
1018 vec_alloc (v, 3);
c8094d83 1019
0a240972 1020 if (incomplete)
4684cd27 1021 flags |= 8;
b8fd7909
JM
1022 if (tx_safe_fn_type_p (to))
1023 {
1024 flags |= 0x20;
1025 to = tx_unsafe_fn_variant (to);
1026 }
51dc6603 1027 if (flag_noexcept_type
7bdc7e06 1028 && FUNC_OR_METHOD_TYPE_P (to)
51dc6603
JM
1029 && TYPE_NOTHROW_P (to))
1030 {
1031 flags |= 0x40;
1032 to = build_exception_variant (to, NULL_TREE);
1033 }
e20463aa
NF
1034 CONSTRUCTOR_APPEND_ELT (v, NULL_TREE, init);
1035 CONSTRUCTOR_APPEND_ELT (v, NULL_TREE, build_int_cst (NULL_TREE, flags));
1036 CONSTRUCTOR_APPEND_ELT (v, NULL_TREE,
1037 get_tinfo_ptr (TYPE_MAIN_VARIANT (to)));
c8094d83 1038
e20463aa 1039 init = build_constructor (init_list_type_node, v);
6de9cd9a 1040 TREE_CONSTANT (init) = 1;
6de9cd9a 1041 TREE_STATIC (init) = 1;
7267d692
NS
1042 return init;
1043}
1044
1f4cb92b 1045/* Return the CONSTRUCTOR expr for a type_info of pointer to member data TYPE.
1bf5fc34 1046 TI provides information about the particular type_info derivation,
0a240972
NS
1047 which adds class, target type and qualifier flags members to the type_info
1048 base. */
7267d692
NS
1049
1050static tree
1bf5fc34 1051ptm_initializer (tinfo_s *ti, tree target)
7267d692 1052{
1bf5fc34 1053 tree init = tinfo_base_init (ti, target);
7267d692
NS
1054 tree to = TYPE_PTRMEM_POINTED_TO_TYPE (target);
1055 tree klass = TYPE_PTRMEM_CLASS_TYPE (target);
1056 int flags = qualifier_flags (to);
848eed92 1057 bool incomplete = target_incomplete_p (to);
9771b263
DN
1058 vec<constructor_elt, va_gc> *v;
1059 vec_alloc (v, 4);
c8094d83 1060
0a240972 1061 if (incomplete)
4684cd27 1062 flags |= 0x8;
0a240972 1063 if (!COMPLETE_TYPE_P (klass))
4684cd27 1064 flags |= 0x10;
e20463aa
NF
1065 CONSTRUCTOR_APPEND_ELT (v, NULL_TREE, init);
1066 CONSTRUCTOR_APPEND_ELT (v, NULL_TREE, build_int_cst (NULL_TREE, flags));
1067 CONSTRUCTOR_APPEND_ELT (v, NULL_TREE,
1068 get_tinfo_ptr (TYPE_MAIN_VARIANT (to)));
1069 CONSTRUCTOR_APPEND_ELT (v, NULL_TREE, get_tinfo_ptr (klass));
1070
1071 init = build_constructor (init_list_type_node, v);
6de9cd9a 1072 TREE_CONSTANT (init) = 1;
6de9cd9a 1073 TREE_STATIC (init) = 1;
c8094d83 1074 return init;
7267d692
NS
1075}
1076
7267d692 1077/* Return the CONSTRUCTOR expr for a type_info of class TYPE.
1bf5fc34 1078 TI provides information about the particular __class_type_info derivation,
e20463aa 1079 which adds hint flags and N extra initializers to the type_info base. */
7267d692
NS
1080
1081static tree
e20463aa 1082class_initializer (tinfo_s *ti, tree target, unsigned n, ...)
7267d692 1083{
1bf5fc34 1084 tree init = tinfo_base_init (ti, target);
e20463aa
NF
1085 va_list extra_inits;
1086 unsigned i;
9771b263
DN
1087 vec<constructor_elt, va_gc> *v;
1088 vec_alloc (v, n+1);
e20463aa
NF
1089
1090 CONSTRUCTOR_APPEND_ELT (v, NULL_TREE, init);
1091 va_start (extra_inits, n);
1092 for (i = 0; i < n; i++)
1093 CONSTRUCTOR_APPEND_ELT (v, NULL_TREE, va_arg (extra_inits, tree));
1094 va_end (extra_inits);
c8094d83 1095
e20463aa 1096 init = build_constructor (init_list_type_node, v);
6de9cd9a 1097 TREE_CONSTANT (init) = 1;
6de9cd9a 1098 TREE_STATIC (init) = 1;
c8094d83 1099 return init;
7267d692
NS
1100}
1101
848eed92 1102/* Returns true if the typeinfo for type should be placed in
97458258
MM
1103 the runtime library. */
1104
848eed92
GDR
1105static bool
1106typeinfo_in_lib_p (tree type)
97458258
MM
1107{
1108 /* The typeinfo objects for `T*' and `const T*' are in the runtime
1109 library for simple types T. */
50e10fa8 1110 if (TYPE_PTR_P (type)
89d684bb
BM
1111 && (cp_type_quals (TREE_TYPE (type)) == TYPE_QUAL_CONST
1112 || cp_type_quals (TREE_TYPE (type)) == TYPE_UNQUALIFIED))
97458258
MM
1113 type = TREE_TYPE (type);
1114
1115 switch (TREE_CODE (type))
1116 {
1117 case INTEGER_TYPE:
1118 case BOOLEAN_TYPE:
97458258
MM
1119 case REAL_TYPE:
1120 case VOID_TYPE:
1e85e720 1121 case NULLPTR_TYPE:
848eed92 1122 return true;
c8094d83 1123
5116acc6 1124 case LANG_TYPE:
1e85e720 1125 /* fall through. */
5116acc6 1126
97458258 1127 default:
848eed92 1128 return false;
97458258
MM
1129 }
1130}
1131
1bf5fc34
NS
1132/* Generate the initializer for the type info describing TYPE. TK_INDEX is
1133 the index of the descriptor in the tinfo_desc vector. */
7267d692
NS
1134
1135static tree
1bf5fc34 1136get_pseudo_ti_init (tree type, unsigned tk_index)
7267d692 1137{
ac9a1c7e 1138 tinfo_s *ti = get_tinfo_desc (tk_index);
3db45ab5 1139
50bc768d 1140 gcc_assert (at_eof);
1bf5fc34 1141 switch (tk_index)
7267d692 1142 {
1bf5fc34
NS
1143 case TK_POINTER_MEMBER_TYPE:
1144 return ptm_initializer (ti, type);
3db45ab5 1145
1bf5fc34
NS
1146 case TK_POINTER_TYPE:
1147 return ptr_initializer (ti, type);
3db45ab5 1148
1bf5fc34
NS
1149 case TK_BUILTIN_TYPE:
1150 case TK_ENUMERAL_TYPE:
1151 case TK_FUNCTION_TYPE:
1152 case TK_ARRAY_TYPE:
1153 return generic_initializer (ti, type);
1154
1155 case TK_CLASS_TYPE:
e20463aa 1156 return class_initializer (ti, type, 0);
1bf5fc34
NS
1157
1158 case TK_SI_CLASS_TYPE:
1159 {
1160 tree base_binfo = BINFO_BASE_BINFO (TYPE_BINFO (type), 0);
1161 tree tinfo = get_tinfo_ptr (BINFO_TYPE (base_binfo));
96d84476
JJ
1162
1163 /* get_tinfo_ptr might have reallocated the tinfo_descs vector. */
9771b263 1164 ti = &(*tinfo_descs)[tk_index];
e20463aa 1165 return class_initializer (ti, type, 1, tinfo);
1bf5fc34 1166 }
97458258 1167
7267d692 1168 default:
1bf5fc34
NS
1169 {
1170 int hint = ((CLASSTYPE_REPEATED_BASE_P (type) << 0)
1171 | (CLASSTYPE_DIAMOND_SHAPED_P (type) << 1));
1172 tree binfo = TYPE_BINFO (type);
ac9a1c7e 1173 unsigned nbases = BINFO_N_BASE_BINFOS (binfo);
9771b263 1174 vec<tree, va_gc> *base_accesses = BINFO_BASE_ACCESSES (binfo);
1c773c7a 1175 tree offset_type = LONGPTR_T;
9771b263 1176 vec<constructor_elt, va_gc> *init_vec = NULL;
3db45ab5 1177
ac9a1c7e 1178 gcc_assert (tk_index - TK_VMI_CLASS_TYPES + 1 == nbases);
3db45ab5 1179
9771b263 1180 vec_safe_grow (init_vec, nbases);
1bf5fc34 1181 /* Generate the base information initializer. */
ac9a1c7e 1182 for (unsigned ix = nbases; ix--;)
1bf5fc34
NS
1183 {
1184 tree base_binfo = BINFO_BASE_BINFO (binfo, ix);
1bf5fc34
NS
1185 int flags = 0;
1186 tree tinfo;
1187 tree offset;
9771b263 1188 vec<constructor_elt, va_gc> *v;
3db45ab5 1189
9771b263 1190 if ((*base_accesses)[ix] == access_public_node)
1bf5fc34
NS
1191 flags |= 2;
1192 tinfo = get_tinfo_ptr (BINFO_TYPE (base_binfo));
1193 if (BINFO_VIRTUAL_P (base_binfo))
1194 {
1195 /* We store the vtable offset at which the virtual
3db45ab5 1196 base offset can be found. */
1bf5fc34 1197 offset = BINFO_VPTR_FIELD (base_binfo);
1bf5fc34
NS
1198 flags |= 1;
1199 }
1200 else
1201 offset = BINFO_OFFSET (base_binfo);
3db45ab5 1202
1bf5fc34 1203 /* Combine offset and flags into one field. */
07b183fd 1204 offset = fold_convert (offset_type, offset);
db3927fb
AH
1205 offset = fold_build2_loc (input_location,
1206 LSHIFT_EXPR, offset_type, offset,
07b183fd 1207 build_int_cst (offset_type, 8));
db3927fb
AH
1208 offset = fold_build2_loc (input_location,
1209 BIT_IOR_EXPR, offset_type, offset,
07b183fd 1210 build_int_cst (offset_type, flags));
9771b263 1211 vec_alloc (v, 2);
e20463aa
NF
1212 CONSTRUCTOR_APPEND_ELT (v, NULL_TREE, tinfo);
1213 CONSTRUCTOR_APPEND_ELT (v, NULL_TREE, offset);
ac9a1c7e
NS
1214 tree base_init = build_constructor (init_list_type_node, v);
1215 constructor_elt *e = &(*init_vec)[ix];
e20463aa
NF
1216 e->index = NULL_TREE;
1217 e->value = base_init;
1bf5fc34 1218 }
ac9a1c7e 1219 tree base_inits = build_constructor (init_list_type_node, init_vec);
96d84476
JJ
1220
1221 /* get_tinfo_ptr might have reallocated the tinfo_descs vector. */
9771b263 1222 ti = &(*tinfo_descs)[tk_index];
e20463aa
NF
1223 return class_initializer (ti, type, 3,
1224 build_int_cst (NULL_TREE, hint),
1225 build_int_cst (NULL_TREE, nbases),
1226 base_inits);
1bf5fc34 1227 }
7267d692 1228 }
7267d692
NS
1229}
1230
1bf5fc34
NS
1231/* Return the index of a pseudo type info type node used to describe
1232 TYPE. TYPE must be a complete type (or cv void), except at the end
1233 of the translation unit. */
7267d692 1234
1bf5fc34
NS
1235static unsigned
1236get_pseudo_ti_index (tree type)
7267d692 1237{
1bf5fc34 1238 unsigned ix;
3db45ab5 1239
d689a8f1 1240 switch (TREE_CODE (type))
7267d692 1241 {
a5ac359a 1242 case OFFSET_TYPE:
1bf5fc34
NS
1243 ix = TK_POINTER_MEMBER_TYPE;
1244 break;
3db45ab5 1245
d689a8f1 1246 case POINTER_TYPE:
1bf5fc34
NS
1247 ix = TK_POINTER_TYPE;
1248 break;
3db45ab5 1249
d689a8f1 1250 case ENUMERAL_TYPE:
1bf5fc34
NS
1251 ix = TK_ENUMERAL_TYPE;
1252 break;
3db45ab5 1253
d689a8f1 1254 case FUNCTION_TYPE:
1bf5fc34
NS
1255 ix = TK_FUNCTION_TYPE;
1256 break;
3db45ab5 1257
d689a8f1 1258 case ARRAY_TYPE:
1bf5fc34
NS
1259 ix = TK_ARRAY_TYPE;
1260 break;
3db45ab5 1261
d689a8f1
NS
1262 case UNION_TYPE:
1263 case RECORD_TYPE:
1264 if (TYPE_PTRMEMFUNC_P (type))
ac9a1c7e 1265 ix = TK_POINTER_MEMBER_TYPE;
d689a8f1
NS
1266 else if (!COMPLETE_TYPE_P (type))
1267 {
5aa3396c
JM
1268 if (!at_eof)
1269 cxx_incomplete_type_error (NULL_TREE, type);
1bf5fc34 1270 ix = TK_CLASS_TYPE;
d689a8f1 1271 }
cadec7ca
JJ
1272 else if (!TYPE_BINFO (type)
1273 || !BINFO_N_BASE_BINFOS (TYPE_BINFO (type)))
ac9a1c7e 1274 ix = TK_CLASS_TYPE;
d689a8f1
NS
1275 else
1276 {
dbbf88d1 1277 tree binfo = TYPE_BINFO (type);
9771b263 1278 vec<tree, va_gc> *base_accesses = BINFO_BASE_ACCESSES (binfo);
fa743e8c
NS
1279 tree base_binfo = BINFO_BASE_BINFO (binfo, 0);
1280 int num_bases = BINFO_N_BASE_BINFOS (binfo);
c8094d83 1281
d689a8f1 1282 if (num_bases == 1
9771b263 1283 && (*base_accesses)[0] == access_public_node
809e3e7f 1284 && !BINFO_VIRTUAL_P (base_binfo)
d689a8f1 1285 && integer_zerop (BINFO_OFFSET (base_binfo)))
ac9a1c7e
NS
1286 /* single non-virtual public. */
1287 ix = TK_SI_CLASS_TYPE;
d689a8f1 1288 else
ac9a1c7e 1289 ix = TK_VMI_CLASS_TYPES + num_bases - 1;
d689a8f1 1290 }
ac9a1c7e
NS
1291 break;
1292
d689a8f1 1293 default:
1bf5fc34
NS
1294 ix = TK_BUILTIN_TYPE;
1295 break;
d689a8f1 1296 }
1bf5fc34 1297 return ix;
7267d692
NS
1298}
1299
ac9a1c7e
NS
1300/* Return pointer to tinfo descriptor. Possibly creating the tinfo
1301 descriptor in the first place. */
7267d692 1302
ac9a1c7e
NS
1303static tinfo_s *
1304get_tinfo_desc (unsigned ix)
7267d692 1305{
ac9a1c7e 1306 unsigned len = tinfo_descs->length ();
3db45ab5 1307
ac9a1c7e
NS
1308 if (len <= ix)
1309 {
1310 /* too short, extend. */
1311 len = ix + 1 - len;
1312 vec_safe_reserve (tinfo_descs, len);
1313 tinfo_s elt;
1314 elt.type = elt.vtable = elt.name = NULL_TREE;
1315 while (len--)
1316 tinfo_descs->quick_push (elt);
1317 }
7267d692 1318
ac9a1c7e 1319 tinfo_s *res = &(*tinfo_descs)[ix];
3db45ab5 1320
ac9a1c7e
NS
1321 if (res->type)
1322 return res;
c8094d83 1323
ac9a1c7e
NS
1324 /* Ok, we have to create it. This layout must be consistent with
1325 that defined in the runtime support. We explicitly manage the
1326 vtable member, and name it for real type as used in the runtime.
1327 The RECORD type has a different name, to avoid collisions. We
1328 have to delay generating the VAR_DECL of the vtable until the end
1329 of the translation, when we'll have seen the library definition,
1330 if there was one. */
c8094d83 1331
ac9a1c7e
NS
1332 /* Fields to add, chained in reverse order. */
1333 tree fields = NULL_TREE;
7267d692 1334
ac9a1c7e
NS
1335 if (ix >= TK_DERIVED_TYPES)
1336 {
1337 /* First field is the pseudo type_info base class. */
1338 tree fld_base = build_decl (BUILTINS_LOCATION, FIELD_DECL, NULL_TREE,
1339 get_tinfo_desc (TK_TYPE_INFO_TYPE)->type);
3db45ab5 1340
ac9a1c7e
NS
1341 DECL_CHAIN (fld_base) = fields;
1342 fields = fld_base;
1343 }
3db45ab5 1344
ac9a1c7e
NS
1345 switch (ix)
1346 {
1347 case TK_TYPE_INFO_TYPE:
1348 {
1349 tree fld_ptr = build_decl (BUILTINS_LOCATION, FIELD_DECL,
1350 NULL_TREE, const_ptr_type_node);
1351 fields = fld_ptr;
1352
1353 tree fld_str = build_decl (BUILTINS_LOCATION, FIELD_DECL,
1354 NULL_TREE, const_string_type_node);
1355 DECL_CHAIN (fld_str) = fields;
1356 fields = fld_str;
1357 break;
1358 }
c8094d83 1359
ac9a1c7e
NS
1360 case TK_BASE_TYPE:
1361 {
1362 /* Base class internal helper. Pointer to base type, offset to
1363 base, flags. */
1364 tree fld_ptr = build_decl (BUILTINS_LOCATION, FIELD_DECL,
1365 NULL_TREE, type_info_ptr_type);
1366 DECL_CHAIN (fld_ptr) = fields;
1367 fields = fld_ptr;
1368
1369 tree fld_flag = build_decl (BUILTINS_LOCATION, FIELD_DECL,
1370 NULL_TREE, LONGPTR_T);
1371 DECL_CHAIN (fld_flag) = fields;
1372 fields = fld_flag;
1373 break;
1374 }
c8094d83 1375
ac9a1c7e
NS
1376 case TK_BUILTIN_TYPE:
1377 /* Fundamental type_info */
1378 break;
c8094d83 1379
ac9a1c7e
NS
1380 case TK_ARRAY_TYPE:
1381 break;
3db45ab5 1382
ac9a1c7e
NS
1383 case TK_FUNCTION_TYPE:
1384 break;
3db45ab5 1385
ac9a1c7e
NS
1386 case TK_ENUMERAL_TYPE:
1387 break;
1388
1389 case TK_POINTER_TYPE:
1390 case TK_POINTER_MEMBER_TYPE:
1391 {
1392 /* Pointer type_info. Adds two fields, qualification mask and
1393 pointer to the pointed to type. This is really a
1394 descendant of __pbase_type_info. */
1395 tree fld_mask = build_decl (BUILTINS_LOCATION, FIELD_DECL,
1396 NULL_TREE, integer_type_node);
1397 DECL_CHAIN (fld_mask) = fields;
1398 fields = fld_mask;
1399
1400 tree fld_ptr = build_decl (BUILTINS_LOCATION, FIELD_DECL,
1401 NULL_TREE, type_info_ptr_type);
1402 DECL_CHAIN (fld_ptr) = fields;
1403 fields = fld_ptr;
1404
1405 if (ix == TK_POINTER_MEMBER_TYPE)
1406 {
1407 /* Add a pointer to the class too. */
1408 tree fld_cls = build_decl (BUILTINS_LOCATION, FIELD_DECL,
1409 NULL_TREE, type_info_ptr_type);
1410 DECL_CHAIN (fld_cls) = fields;
1411 fields = fld_cls;
1412 }
1413 break;
1414 }
1415
1416 case TK_CLASS_TYPE:
1417 /* Class type_info. No additional fields. */
1418 break;
1419
1420 case TK_SI_CLASS_TYPE:
1421 {
1422 /* Single public non-virtual base class. Add pointer to base
1423 class. This is really a descendant of
1424 __class_type_info. */
1425 tree fld_ptr = build_decl (BUILTINS_LOCATION, FIELD_DECL,
1426 NULL_TREE, type_info_ptr_type);
1427 DECL_CHAIN (fld_ptr) = fields;
1428 fields = fld_ptr;
1429 break;
1430 }
1431
1432 default: /* Multiple inheritance. */
1433 {
1434 unsigned num_bases = ix - TK_VMI_CLASS_TYPES + 1;
1435
1436 tree fld_flg = build_decl (BUILTINS_LOCATION, FIELD_DECL,
1437 NULL_TREE, integer_type_node);
1438 DECL_CHAIN (fld_flg) = fields;
1439 fields = fld_flg;
1440
1441 tree fld_cnt = build_decl (BUILTINS_LOCATION, FIELD_DECL,
1442 NULL_TREE, integer_type_node);
1443 DECL_CHAIN (fld_cnt) = fields;
1444 fields = fld_cnt;
1445
1446 /* Create the array of __base_class_type_info entries. */
1447 tree domain = build_index_type (size_int (num_bases - 1));
1448 tree array = build_array_type (get_tinfo_desc (TK_BASE_TYPE)->type,
1449 domain);
1450 tree fld_ary = build_decl (BUILTINS_LOCATION, FIELD_DECL,
1451 NULL_TREE, array);
1452 DECL_CHAIN (fld_ary) = fields;
1453 fields = fld_ary;
1454 break;
1455 }
1456 }
1457
1458 push_abi_namespace ();
1459
1460 /* Generate the pseudo type name. */
1461 const char *real_name = tinfo_names[ix < TK_VMI_CLASS_TYPES
1462 ? ix : unsigned (TK_VMI_CLASS_TYPES)];
1463 size_t name_len = strlen (real_name);
1464 char *pseudo_name = (char *) alloca (name_len + 30);
1465 memcpy (pseudo_name, real_name, name_len);
1466 /* Those >= TK_VMI_CLASS_TYPES need a discriminator, may as well
1467 apply it to all. See get_peudo_tinfo_index where we make use of
1468 this. */
1469 sprintf (pseudo_name + name_len, "_pseudo_%d", ix);
c8094d83 1470
ac9a1c7e
NS
1471 /* Create the pseudo type. */
1472 tree pseudo_type = make_class_type (RECORD_TYPE);
1473 /* Pass the fields chained in reverse. */
1474 finish_builtin_struct (pseudo_type, pseudo_name, fields, NULL_TREE);
1475 CLASSTYPE_AS_BASE (pseudo_type) = pseudo_type;
80de0002 1476 xref_basetypes (pseudo_type, /*bases=*/NULL_TREE);
ac9a1c7e
NS
1477
1478 res->type = cp_build_qualified_type (pseudo_type, TYPE_QUAL_CONST);
1479 res->name = get_identifier (real_name);
1480
1481 /* Pretend this is public so determine_visibility doesn't give vtables
1482 internal linkage. */
1483 TREE_PUBLIC (TYPE_MAIN_DECL (res->type)) = 1;
7267d692 1484
a15f0fd0 1485 pop_abi_namespace ();
ac9a1c7e
NS
1486 return res;
1487}
1488
1489/* We lazily create the type info types. */
1490
1491static void
1492create_tinfo_types (void)
1493{
1494 gcc_assert (!tinfo_descs);
1495
1496 vec_alloc (tinfo_descs, TK_MAX + 20);
7267d692
NS
1497}
1498
793c625f
MG
1499/* Helper for emit_support_tinfos. Emits the type_info descriptor of
1500 a single type. */
1501
1502void
1503emit_support_tinfo_1 (tree bltn)
1504{
1505 tree types[3];
1506
1507 if (bltn == NULL_TREE)
1508 return;
1509 types[0] = bltn;
1510 types[1] = build_pointer_type (bltn);
1511 types[2] = build_pointer_type (cp_build_qualified_type (bltn,
1512 TYPE_QUAL_CONST));
1513
1514 for (int i = 0; i < 3; ++i)
1515 {
1516 tree tinfo = get_tinfo_decl (types[i]);
1517 TREE_USED (tinfo) = 1;
1518 mark_needed (tinfo);
1519 /* The C++ ABI requires that these objects be COMDAT. But,
1520 On systems without weak symbols, initialized COMDAT
1521 objects are emitted with internal linkage. (See
1522 comdat_linkage for details.) Since we want these objects
1523 to have external linkage so that copies do not have to be
1524 emitted in code outside the runtime library, we make them
1525 non-COMDAT here.
1526
1527 It might also not be necessary to follow this detail of the
1528 ABI. */
1529 if (!flag_weak || ! targetm.cxx.library_rtti_comdat ())
1530 {
1531 gcc_assert (TREE_PUBLIC (tinfo) && !DECL_COMDAT (tinfo));
1532 DECL_INTERFACE_KNOWN (tinfo) = 1;
1533 }
1534 }
1535}
1536
7267d692
NS
1537/* Emit the type_info descriptors which are guaranteed to be in the runtime
1538 support. Generating them here guarantees consistency with the other
1539 structures. We use the following heuristic to determine when the runtime
7f54a851 1540 is being generated. If std::__fundamental_type_info is defined, and its
7267d692
NS
1541 destructor is defined, then the runtime is being built. */
1542
1543void
848eed92 1544emit_support_tinfos (void)
7267d692 1545{
14c2101d
JM
1546 /* Dummy static variable so we can put nullptr in the array; it will be
1547 set before we actually start to walk the array. */
7267d692
NS
1548 static tree *const fundamentals[] =
1549 {
1550 &void_type_node,
1551 &boolean_type_node,
2d91f79d 1552 &wchar_type_node, &char8_type_node, &char16_type_node, &char32_type_node,
7267d692
NS
1553 &char_type_node, &signed_char_type_node, &unsigned_char_type_node,
1554 &short_integer_type_node, &short_unsigned_type_node,
1555 &integer_type_node, &unsigned_type_node,
1556 &long_integer_type_node, &long_unsigned_type_node,
1557 &long_long_integer_type_node, &long_long_unsigned_type_node,
1558 &float_type_node, &double_type_node, &long_double_type_node,
fae927d3 1559 &dfloat32_type_node, &dfloat64_type_node, &dfloat128_type_node,
14c2101d 1560 &nullptr_type_node,
7267d692
NS
1561 0
1562 };
1563 int ix;
c8094d83 1564
ac9a1c7e
NS
1565 /* Look for a defined class. */
1566 tree bltn_type = lookup_qualified_name
4c58a32f 1567 (abi_node, "__fundamental_type_info", LOOK_want::TYPE, false);
ac9a1c7e
NS
1568 if (TREE_CODE (bltn_type) != TYPE_DECL)
1569 return;
1570
1571 bltn_type = TREE_TYPE (bltn_type);
d0f062fb 1572 if (!COMPLETE_TYPE_P (bltn_type))
7267d692 1573 return;
b2cf76f3 1574 tree dtor = CLASSTYPE_DESTRUCTOR (bltn_type);
9f4faeae 1575 if (!dtor || DECL_EXTERNAL (dtor))
7267d692 1576 return;
ac9a1c7e
NS
1577
1578 /* All these are really builtins. So set the location. */
1579 location_t saved_loc = input_location;
1580 input_location = BUILTINS_LOCATION;
7267d692
NS
1581 doing_runtime = 1;
1582 for (ix = 0; fundamentals[ix]; ix++)
793c625f 1583 emit_support_tinfo_1 (*fundamentals[ix]);
78a7c317
DD
1584 for (ix = 0; ix < NUM_INT_N_ENTS; ix ++)
1585 if (int_n_enabled_p[ix])
1586 {
1587 emit_support_tinfo_1 (int_n_trees[ix].signed_type);
1588 emit_support_tinfo_1 (int_n_trees[ix].unsigned_type);
1589 }
bb59f396
MG
1590 for (tree t = registered_builtin_types; t; t = TREE_CHAIN (t))
1591 emit_support_tinfo_1 (TREE_VALUE (t));
994e0ad4
JJ
1592 /* For compatibility, emit DFP typeinfos even when DFP isn't enabled,
1593 because we've emitted that in the past. */
1594 if (!targetm.decimal_float_supported_p ())
1595 {
1596 gcc_assert (dfloat32_type_node == NULL_TREE
1597 && dfloat64_type_node == NULL_TREE
1598 && dfloat128_type_node == NULL_TREE);
1599 fallback_dfloat32_type = make_node (REAL_TYPE);
1600 fallback_dfloat64_type = make_node (REAL_TYPE);
1601 fallback_dfloat128_type = make_node (REAL_TYPE);
1602 emit_support_tinfo_1 (fallback_dfloat32_type);
1603 emit_support_tinfo_1 (fallback_dfloat64_type);
1604 emit_support_tinfo_1 (fallback_dfloat128_type);
1605 }
ac9a1c7e 1606 input_location = saved_loc;
7267d692
NS
1607}
1608
d689a8f1
NS
1609/* Finish a type info decl. DECL_PTR is a pointer to an unemitted
1610 tinfo decl. Determine whether it needs emitting, and if so
1611 generate the initializer. */
7267d692 1612
848eed92 1613bool
a260bce6 1614emit_tinfo_decl (tree decl)
7267d692 1615{
d689a8f1 1616 tree type = TREE_TYPE (DECL_NAME (decl));
c6f553d1 1617 int in_library = typeinfo_in_lib_p (type);
a260bce6 1618
c8094d83
MS
1619 gcc_assert (DECL_TINFO_P (decl));
1620
4684cd27
MM
1621 if (in_library)
1622 {
1623 if (doing_runtime)
1624 DECL_EXTERNAL (decl) = 0;
1625 else
1626 {
1627 /* If we're not in the runtime, then DECL (which is already
1628 DECL_EXTERNAL) will not be defined here. */
1629 DECL_INTERFACE_KNOWN (decl) = 1;
1630 return false;
1631 }
1632 }
1633 else if (involves_incomplete_p (type))
1634 {
1635 if (!decl_needed_p (decl))
1636 return false;
1637 /* If TYPE involves an incomplete class type, then the typeinfo
1638 object will be emitted with internal linkage. There is no
1639 way to know whether or not types are incomplete until the end
1640 of the compilation, so this determination must be deferred
1641 until this point. */
1642 TREE_PUBLIC (decl) = 0;
1643 DECL_EXTERNAL (decl) = 0;
1644 DECL_INTERFACE_KNOWN (decl) = 1;
8c1ca7ee 1645 }
ff48be5c 1646
4684cd27
MM
1647 import_export_decl (decl);
1648 if (DECL_NOT_REALLY_EXTERN (decl) && decl_needed_p (decl))
1649 {
1bf5fc34 1650 tree init;
3db45ab5 1651
4684cd27 1652 DECL_EXTERNAL (decl) = 0;
1bf5fc34
NS
1653 init = get_pseudo_ti_init (type, get_pseudo_ti_index (type));
1654 DECL_INITIAL (decl) = init;
4684cd27 1655 mark_used (decl);
3600f678 1656 cp_finish_decl (decl, init, false, NULL_TREE, 0);
c517fc92
JH
1657 /* Avoid targets optionally bumping up the alignment to improve
1658 vector instruction accesses, tinfo are never accessed this way. */
1659#ifdef DATA_ABI_ALIGNMENT
fe37c7af 1660 SET_DECL_ALIGN (decl, DATA_ABI_ALIGNMENT (decl, TYPE_ALIGN (TREE_TYPE (decl))));
c517fc92
JH
1661 DECL_USER_ALIGN (decl) = true;
1662#endif
4684cd27
MM
1663 return true;
1664 }
1665 else
848eed92 1666 return false;
7267d692 1667}
1bf5fc34
NS
1668
1669#include "gt-cp-rtti.h"