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