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