]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/cp/rtti.c
* output.h (__gcc_host_wide_int__): Move to hwint.h.
[thirdparty/gcc.git] / gcc / cp / rtti.c
CommitLineData
c244687e 1/* RunTime Type Identification
f7ef2277 2 Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
62206d34 3 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012
902de8ed 4 Free Software Foundation, Inc.
3a8c5440 5 Mostly written by Jason Merrill (jason@cygnus.com).
c244687e 6
6f0d25a6 7This file is part of GCC.
c244687e 8
6f0d25a6 9GCC is free software; you can redistribute it and/or modify
c244687e 10it under the terms of the GNU General Public License as published by
aa139c3f 11the Free Software Foundation; either version 3, or (at your option)
c244687e 12any later version.
13
6f0d25a6 14GCC is distributed in the hope that it will be useful,
c244687e 15but WITHOUT ANY WARRANTY; without even the implied warranty of
16MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17GNU General Public License for more details.
18
19You should have received a copy of the GNU General Public License
aa139c3f 20along with GCC; see the file COPYING3. If not see
21<http://www.gnu.org/licenses/>. */
c244687e 22
c244687e 23#include "config.h"
b3ef7553 24#include "system.h"
5c892d4a 25#include "intl.h"
805e22b2 26#include "coretypes.h"
27#include "tm.h"
c244687e 28#include "tree.h"
29#include "cp-tree.h"
30#include "flags.h"
ee1ab431 31#include "convert.h"
60d9461b 32#include "target.h"
7bedc3a0 33#include "c-family/c-pragma.h"
3cc0b4b9 34
46f41950 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
c208c18e 64/* Auxiliary data we hold for each type_info derived object we need. */
fb1e4f4a 65typedef struct GTY (()) tinfo_s {
c208c18e 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
75DEF_VEC_O(tinfo_s);
76DEF_VEC_ALLOC_O(tinfo_s,gc);
77
78typedef enum tinfo_kind
79{
c782ab19 80 TK_TYPE_INFO_TYPE, /* abi::__type_info_pseudo */
c208c18e 81 TK_BASE_TYPE, /* abi::__base_class_type_info */
82 TK_BUILTIN_TYPE, /* abi::__fundamental_type_info */
83 TK_ARRAY_TYPE, /* abi::__array_type_info */
84 TK_FUNCTION_TYPE, /* abi::__function_type_info */
85 TK_ENUMERAL_TYPE, /* abi::__enum_type_info */
86 TK_POINTER_TYPE, /* abi::__pointer_type_info */
87 TK_POINTER_MEMBER_TYPE, /* abi::__pointer_to_member_type_info */
88 TK_CLASS_TYPE, /* abi::__class_type_info */
89 TK_SI_CLASS_TYPE, /* abi::__si_class_type_info */
074ab442 90 TK_FIXED /* end of fixed descriptors. */
91 /* ... abi::__vmi_type_info<I> */
c208c18e 92} tinfo_kind;
c244687e 93
2beb8f09 94/* A vector of all tinfo decls that haven't yet been emitted. */
046bfc77 95VEC(tree,gc) *unemitted_tinfo_decls;
981bab5c 96
c208c18e 97/* A vector of all type_info derived types we need. The first few are
98 fixed and created early. The remainder are for multiple inheritance
99 and are generated as needed. */
100static GTY (()) VEC(tinfo_s,gc) *tinfo_descs;
101
749beb82 102static tree ifnonnull (tree, tree);
ec46af50 103static tree tinfo_name (tree, bool);
ebd21de4 104static tree build_dynamic_cast_1 (tree, tree, tsubst_flags_t);
749beb82 105static tree throw_bad_cast (void);
106static tree throw_bad_typeid (void);
107static tree get_tinfo_decl_dynamic (tree);
108static tree get_tinfo_ptr (tree);
109static bool typeid_ok_p (void);
110static int qualifier_flags (tree);
26ac6687 111static bool target_incomplete_p (tree);
c208c18e 112static tree tinfo_base_init (tinfo_s *, tree);
113static tree generic_initializer (tinfo_s *, tree);
114static tree ptr_initializer (tinfo_s *, tree);
115static tree ptm_initializer (tinfo_s *, tree);
fd1164d3 116static tree class_initializer (tinfo_s *, tree, unsigned, ...);
70b44d38 117static void create_pseudo_type_info (int, const char *, ...);
c208c18e 118static tree get_pseudo_ti_init (tree, unsigned);
119static unsigned get_pseudo_ti_index (tree);
749beb82 120static void create_tinfo_types (void);
26ac6687 121static bool typeinfo_in_lib_p (tree);
6d318c49 122
123static int doing_runtime = 0;
c244687e 124\f
9af93fe5 125static void
126push_abi_namespace (void)
127{
128 push_nested_namespace (abi_node);
f1658ae0 129 push_visibility ("default", 2);
9af93fe5 130}
131
132static void
133pop_abi_namespace (void)
134{
f1658ae0 135 pop_visibility (2);
9af93fe5 136 pop_nested_namespace (abi_node);
137}
46f41950 138
139/* Declare language defined type_info type and a pointer to const
140 type_info. This is incomplete here, and will be completed when
141 the user #includes <typeinfo>. There are language defined
142 restrictions on what can be done until that is included. Create
143 the internal versions of the ABI types. */
144
3a8c5440 145void
26ac6687 146init_rtti_processing (void)
3a8c5440 147{
729f89ff 148 tree type_info_type;
9031d10b 149
eaf45f93 150 push_namespace (std_identifier);
729f89ff 151 type_info_type = xref_tag (class_type, get_identifier ("type_info"),
3f3fa556 152 /*tag_scope=*/ts_current, false);
eaf45f93 153 pop_namespace ();
729f89ff 154 const_type_info_type_node
ce494fcf 155 = cp_build_qualified_type (type_info_type, TYPE_QUAL_CONST);
729f89ff 156 type_info_ptr_type = build_pointer_type (const_type_info_type_node);
46f41950 157
046bfc77 158 unemitted_tinfo_decls = VEC_alloc (tree, gc, 124);
9031d10b 159
46f41950 160 create_tinfo_types ();
3a8c5440 161}
162
3a8c5440 163/* Given the expression EXP of type `class *', return the head of the
164 object pointed to by EXP with type cv void*, if the class has any
1d6228f0 165 virtual functions (TYPE_POLYMORPHIC_P), else just return the
3a8c5440 166 expression. */
96624a9e 167
56a58a8c 168tree
26ac6687 169build_headof (tree exp)
c244687e 170{
171 tree type = TREE_TYPE (exp);
1adc02a5 172 tree offset;
5d634e85 173 tree index;
c244687e 174
b4df430b 175 gcc_assert (TREE_CODE (type) == POINTER_TYPE);
c244687e 176 type = TREE_TYPE (type);
177
1d6228f0 178 if (!TYPE_POLYMORPHIC_P (type))
c244687e 179 return exp;
180
3a8c5440 181 /* We use this a couple of times below, protect it. */
182 exp = save_expr (exp);
183
5ad590ad 184 /* The offset-to-top field is at index -2 from the vptr. */
7c446c95 185 index = build_int_cst (NULL_TREE,
7016c612 186 -2 * TARGET_VTABLE_DATA_ENTRY_DISTANCE);
5d634e85 187
f08923b3 188 offset = build_vtbl_ref (cp_build_indirect_ref (exp, RO_NULL,
ebd21de4 189 tf_warning_or_error),
190 index);
c244687e 191
ce494fcf 192 type = cp_build_qualified_type (ptr_type_node,
193 cp_type_quals (TREE_TYPE (exp)));
2cc66f2a 194 return fold_build_pointer_plus (exp, offset);
c244687e 195}
3cc0b4b9 196
3cc0b4b9 197/* Get a bad_cast node for the program to throw...
198
199 See libstdc++/exception.cc for __throw_bad_cast */
200
201static tree
26ac6687 202throw_bad_cast (void)
3cc0b4b9 203{
606b494c 204 tree fn = get_identifier ("__cxa_bad_cast");
df2c7ecb 205 if (!get_global_value_if_present (fn, &fn))
fb83f216 206 fn = push_throw_library_fn (fn, build_function_type_list (ptr_type_node,
207 NULL_TREE));
9031d10b 208
d01f58f9 209 return build_cxx_call (fn, 0, NULL);
3cc0b4b9 210}
211
b3c48b5d 212/* Return an expression for "__cxa_bad_typeid()". The expression
213 returned is an lvalue of type "const std::type_info". */
214
3cc0b4b9 215static tree
26ac6687 216throw_bad_typeid (void)
3cc0b4b9 217{
606b494c 218 tree fn = get_identifier ("__cxa_bad_typeid");
df2c7ecb 219 if (!get_global_value_if_present (fn, &fn))
93d6541c 220 {
729f89ff 221 tree t;
222
223 t = build_reference_type (const_type_info_type_node);
fb83f216 224 t = build_function_type_list (t, NULL_TREE);
93d6541c 225 fn = push_throw_library_fn (fn, t);
226 }
71792355 227
d01f58f9 228 return build_cxx_call (fn, 0, NULL);
3cc0b4b9 229}
c244687e 230\f
b3c48b5d 231/* Return an lvalue expression whose type is "const std::type_info"
232 and whose value indicates the type of the expression EXP. If EXP
233 is a reference to a polymorphic class, return the dynamic type;
3cc0b4b9 234 otherwise return the static type of the expression. */
96624a9e 235
f469fd15 236static tree
26ac6687 237get_tinfo_decl_dynamic (tree exp)
c244687e 238{
239 tree type;
b3c48b5d 240 tree t;
9031d10b 241
44bad7e7 242 if (error_operand_p (exp))
c244687e 243 return error_mark_node;
244
c5d33fc0 245 exp = resolve_nondeduced_context (exp);
246
96624a9e 247 /* peel back references, so they match. */
ef4534a3 248 type = non_reference (TREE_TYPE (exp));
c244687e 249
96624a9e 250 /* Peel off cv qualifiers. */
c244687e 251 type = TYPE_MAIN_VARIANT (type);
9031d10b 252
9898c6b2 253 /* For UNKNOWN_TYPEs call complete_type_or_else to get diagnostics. */
4fdaf896 254 if (CLASS_TYPE_P (type) || type == unknown_type_node
255 || type == init_list_type_node)
f469fd15 256 type = complete_type_or_else (type, exp);
9031d10b 257
f469fd15 258 if (!type)
259 return error_mark_node;
be295d1f 260
c244687e 261 /* If exp is a reference to polymorphic type, get the real type_info. */
1d6228f0 262 if (TYPE_POLYMORPHIC_P (type) && ! resolves_to_fixed_type_p (exp, 0))
c244687e 263 {
264 /* build reference to type_info from vtable. */
5d634e85 265 tree index;
c244687e 266
1631c87f 267 /* The RTTI information is at index -1. */
7c446c95 268 index = build_int_cst (NULL_TREE,
7016c612 269 -1 * TARGET_VTABLE_DATA_ENTRY_DISTANCE);
815e356d 270 t = build_vtbl_ref (exp, index);
4ee9c684 271 t = convert (type_info_ptr_type, t);
c244687e 272 }
b3c48b5d 273 else
274 /* Otherwise return the type_info for the static type of the expr. */
275 t = get_tinfo_ptr (TYPE_MAIN_VARIANT (type));
c244687e 276
f08923b3 277 return cp_build_indirect_ref (t, RO_NULL, tf_warning_or_error);
3cc0b4b9 278}
279
aaf2d6f6 280static bool
26ac6687 281typeid_ok_p (void)
3cc0b4b9 282{
c782ab19 283 tree pseudo_type_info, type_info_type;
284
dcff6334 285 if (! flag_rtti)
286 {
287 error ("cannot use typeid with -fno-rtti");
aaf2d6f6 288 return false;
dcff6334 289 }
9031d10b 290
729f89ff 291 if (!COMPLETE_TYPE_P (const_type_info_type_node))
be295d1f 292 {
293 error ("must #include <typeinfo> before using typeid");
aaf2d6f6 294 return false;
be295d1f 295 }
9031d10b 296
c782ab19 297 pseudo_type_info
298 = VEC_index (tinfo_s, tinfo_descs, TK_TYPE_INFO_TYPE)->type;
299 type_info_type = TYPE_MAIN_VARIANT (const_type_info_type_node);
300
301 /* Make sure abi::__type_info_pseudo has the same alias set
302 as std::type_info. */
303 if (! TYPE_ALIAS_SET_KNOWN_P (pseudo_type_info))
304 TYPE_ALIAS_SET (pseudo_type_info) = get_alias_set (type_info_type);
305 else
306 gcc_assert (TYPE_ALIAS_SET (pseudo_type_info)
307 == get_alias_set (type_info_type));
308
aaf2d6f6 309 return true;
310}
311
b3c48b5d 312/* Return an expression for "typeid(EXP)". The expression returned is
313 an lvalue of type "const std::type_info". */
314
aaf2d6f6 315tree
26ac6687 316build_typeid (tree exp)
aaf2d6f6 317{
fbb73d9b 318 tree cond = NULL_TREE, initial_expr = exp;
aaf2d6f6 319 int nonnull = 0;
320
321 if (exp == error_mark_node || !typeid_ok_p ())
322 return error_mark_node;
323
3cc0b4b9 324 if (processing_template_decl)
729f89ff 325 return build_min (TYPEID_EXPR, const_type_info_type_node, exp);
3cc0b4b9 326
ce984e5e 327 /* FIXME when integrating with c_fully_fold, mark
328 resolves_to_fixed_type_p case as a non-constant expression. */
3cc0b4b9 329 if (TREE_CODE (exp) == INDIRECT_REF
330 && TREE_CODE (TREE_TYPE (TREE_OPERAND (exp, 0))) == POINTER_TYPE
1d6228f0 331 && TYPE_POLYMORPHIC_P (TREE_TYPE (exp))
3cc0b4b9 332 && ! resolves_to_fixed_type_p (exp, &nonnull)
333 && ! nonnull)
334 {
fbb73d9b 335 /* So we need to look into the vtable of the type of exp.
336 This is an lvalue use of expr then. */
337 exp = mark_lvalue_use (exp);
3cc0b4b9 338 exp = stabilize_reference (exp);
c4a8ac95 339 cond = cp_convert (boolean_type_node, TREE_OPERAND (exp, 0));
3cc0b4b9 340 }
341
f469fd15 342 exp = get_tinfo_decl_dynamic (exp);
38281c46 343
344 if (exp == error_mark_node)
345 return error_mark_node;
346
3cc0b4b9 347 if (cond)
348 {
349 tree bad = throw_bad_typeid ();
350
831d52a2 351 exp = build3 (COND_EXPR, TREE_TYPE (exp), cond, exp, bad);
3cc0b4b9 352 }
fbb73d9b 353 else
354 mark_type_use (initial_expr);
3cc0b4b9 355
b3c48b5d 356 return exp;
c244687e 357}
358
ec46af50 359/* Generate the NTBS name of a type. If MARK_PRIVATE, put a '*' in front so that
360 comparisons will be done by pointer rather than string comparison. */
73a07fbc 361static tree
ec46af50 362tinfo_name (tree type, bool mark_private)
73a07fbc 363{
98eaf693 364 const char *name;
ec46af50 365 int length;
98eaf693 366 tree name_string;
367
ec46af50 368 name = mangle_type_string (type);
369 length = strlen (name);
370
371 if (mark_private)
372 {
373 /* Inject '*' at beginning of name to force pointer comparison. */
a561df93 374 char* buf = (char*) XALLOCAVEC (char, length + 2);
ec46af50 375 buf[0] = '*';
a561df93 376 memcpy (buf + 1, name, length + 1);
377 name_string = build_string (length + 2, buf);
ec46af50 378 }
379 else
380 name_string = build_string (length + 1, name);
381
382 return fix_string_type (name_string);
73a07fbc 383}
384
46f41950 385/* Return a VAR_DECL for the internal ABI defined type_info object for
386 TYPE. You must arrange that the decl is mark_used, if actually use
9031d10b 387 it --- decls in vtables are only used if the vtable is output. */
73aad9b9 388
3a8c5440 389tree
26ac6687 390get_tinfo_decl (tree type)
3a8c5440 391{
38281c46 392 tree name;
3a8c5440 393 tree d;
394
79c835c9 395 if (variably_modified_type_p (type, /*fn=*/NULL_TREE))
c5144efa 396 {
03d6ca9e 397 error ("cannot create type information for type %qT because "
79c835c9 398 "it involves types of variable size",
46f41950 399 type);
c5144efa 400 return error_mark_node;
401 }
402
38281c46 403 if (TREE_CODE (type) == METHOD_TYPE)
404 type = build_function_type (TREE_TYPE (type),
405 TREE_CHAIN (TYPE_ARG_TYPES (type)));
406
1f37296e 407 type = complete_type (type);
408
d085a847 409 /* For a class type, the variable is cached in the type node
410 itself. */
411 if (CLASS_TYPE_P (type))
412 {
413 d = CLASSTYPE_TYPEINFO_VAR (TYPE_MAIN_VARIANT (type));
414 if (d)
415 return d;
416 }
9031d10b 417
606b494c 418 name = mangle_typeinfo_for_type (type);
442fd60a 419
6d318c49 420 d = IDENTIFIER_GLOBAL_VALUE (name);
46f41950 421 if (!d)
6d318c49 422 {
70b44d38 423 int ix = get_pseudo_ti_index (type);
424 tinfo_s *ti = VEC_index (tinfo_s, tinfo_descs, ix);
46f41950 425
c208c18e 426 d = build_lang_decl (VAR_DECL, name, ti->type);
caa6fdce 427 SET_DECL_ASSEMBLER_NAME (d, name);
91caa6ca 428 /* Remember the type it is for. */
429 TREE_TYPE (name) = type;
caa6fdce 430 DECL_TINFO_P (d) = 1;
6d318c49 431 DECL_ARTIFICIAL (d) = 1;
553acd9c 432 DECL_IGNORED_P (d) = 1;
6d318c49 433 TREE_READONLY (d) = 1;
434 TREE_STATIC (d) = 1;
caa6fdce 435 /* Mark the variable as undefined -- but remember that we can
436 define it later if we need to do so. */
6d318c49 437 DECL_EXTERNAL (d) = 1;
caa6fdce 438 DECL_NOT_REALLY_EXTERN (d) = 1;
50eb3e1a 439 set_linkage_according_to_type (type, d);
440
441 d = pushdecl_top_level_and_finish (d, NULL_TREE);
91caa6ca 442 if (CLASS_TYPE_P (type))
443 CLASSTYPE_TYPEINFO_VAR (TYPE_MAIN_VARIANT (type)) = d;
46f41950 444
6beb3f76 445 /* Add decl to the global array of tinfo decls. */
046bfc77 446 VEC_safe_push (tree, gc, unemitted_tinfo_decls, d);
6d318c49 447 }
46f41950 448
3a8c5440 449 return d;
450}
451
46f41950 452/* Return a pointer to a type_info object describing TYPE, suitably
453 cast to the language defined type. */
454
455static tree
26ac6687 456get_tinfo_ptr (tree type)
46f41950 457{
b04d4dc3 458 tree decl = get_tinfo_decl (type);
459
460 mark_used (decl);
9031d10b 461 return build_nop (type_info_ptr_type,
b04d4dc3 462 build_address (decl));
46f41950 463}
464
f469fd15 465/* Return the type_info object for TYPE. */
96624a9e 466
c244687e 467tree
26ac6687 468get_typeid (tree type)
c244687e 469{
aaf2d6f6 470 if (type == error_mark_node || !typeid_ok_p ())
c244687e 471 return error_mark_node;
9031d10b 472
d6d05907 473 if (processing_template_decl)
729f89ff 474 return build_min (TYPEID_EXPR, const_type_info_type_node, type);
d6d05907 475
3a8c5440 476 /* If the type of the type-id is a reference type, the result of the
477 typeid expression refers to a type_info object representing the
478 referenced type. */
ef4534a3 479 type = non_reference (type);
c244687e 480
3a8c5440 481 /* The top-level cv-qualifiers of the lvalue expression or the type-id
96624a9e 482 that is the operand of typeid are always ignored. */
3a8c5440 483 type = TYPE_MAIN_VARIANT (type);
c244687e 484
9898c6b2 485 /* For UNKNOWN_TYPEs call complete_type_or_else to get diagnostics. */
4fdaf896 486 if (CLASS_TYPE_P (type) || type == unknown_type_node
487 || type == init_list_type_node)
f469fd15 488 type = complete_type_or_else (type, NULL_TREE);
9031d10b 489
f469fd15 490 if (!type)
491 return error_mark_node;
be295d1f 492
f08923b3 493 return cp_build_indirect_ref (get_tinfo_ptr (type), RO_NULL,
ebd21de4 494 tf_warning_or_error);
c244687e 495}
496
bccffb3a 497/* Check whether TEST is null before returning RESULT. If TEST is used in
498 RESULT, it must have previously had a save_expr applied to it. */
499
02d7f858 500static tree
26ac6687 501ifnonnull (tree test, tree result)
bccffb3a 502{
831d52a2 503 return build3 (COND_EXPR, TREE_TYPE (result),
9031d10b 504 build2 (EQ_EXPR, boolean_type_node, test,
339ad7ca 505 cp_convert (TREE_TYPE (test), nullptr_node)),
506 cp_convert (TREE_TYPE (result), nullptr_node),
831d52a2 507 result);
bccffb3a 508}
509
c244687e 510/* Execute a dynamic cast, as described in section 5.2.6 of the 9/93 working
511 paper. */
3a8c5440 512
03db3ebd 513static tree
ebd21de4 514build_dynamic_cast_1 (tree type, tree expr, tsubst_flags_t complain)
c244687e 515{
516 enum tree_code tc = TREE_CODE (type);
9b569e36 517 tree exprtype;
3a8c5440 518 tree dcast_fn;
be295d1f 519 tree old_expr = expr;
201fed6e 520 const char *errstr = NULL;
c244687e 521
35df6eb4 522 /* Save casted types in the function's used types hash table. */
523 used_types_insert (type);
524
fd056a98 525 /* T shall be a pointer or reference to a complete class type, or
526 `pointer to cv void''. */
c244687e 527 switch (tc)
528 {
529 case POINTER_TYPE:
fd056a98 530 if (TREE_CODE (TREE_TYPE (type)) == VOID_TYPE)
c244687e 531 break;
729f89ff 532 /* Fall through. */
c244687e 533 case REFERENCE_TYPE:
95397ff9 534 if (! MAYBE_CLASS_TYPE_P (TREE_TYPE (type)))
fd056a98 535 {
5c892d4a 536 errstr = _("target is not pointer or reference to class");
fd056a98 537 goto fail;
538 }
4b72716d 539 if (!COMPLETE_TYPE_P (complete_type (TREE_TYPE (type))))
fd056a98 540 {
5c892d4a 541 errstr = _("target is not pointer or reference to complete type");
fd056a98 542 goto fail;
543 }
bae9fce7 544 break;
fd056a98 545
c244687e 546 default:
5c892d4a 547 errstr = _("target is not pointer or reference");
c244687e 548 goto fail;
549 }
550
fd056a98 551 if (tc == POINTER_TYPE)
c244687e 552 {
4405c1ad 553 expr = decay_conversion (expr, complain);
9b569e36 554 exprtype = TREE_TYPE (expr);
555
fd056a98 556 /* If T is a pointer type, v shall be an rvalue of a pointer to
557 complete class type, and the result is an rvalue of type T. */
558
fbb73d9b 559 expr = mark_rvalue_use (expr);
560
fd056a98 561 if (TREE_CODE (exprtype) != POINTER_TYPE)
562 {
5c892d4a 563 errstr = _("source is not a pointer");
fd056a98 564 goto fail;
565 }
95397ff9 566 if (! MAYBE_CLASS_TYPE_P (TREE_TYPE (exprtype)))
fd056a98 567 {
5c892d4a 568 errstr = _("source is not a pointer to class");
fd056a98 569 goto fail;
570 }
4b72716d 571 if (!COMPLETE_TYPE_P (complete_type (TREE_TYPE (exprtype))))
fd056a98 572 {
5c892d4a 573 errstr = _("source is a pointer to incomplete type");
fd056a98 574 goto fail;
575 }
576 }
577 else
578 {
fbb73d9b 579 expr = mark_lvalue_use (expr);
580
9b569e36 581 exprtype = build_reference_type (TREE_TYPE (expr));
729f89ff 582
fd056a98 583 /* T is a reference type, v shall be an lvalue of a complete class
584 type, and the result is an lvalue of the type referred to by T. */
585
95397ff9 586 if (! MAYBE_CLASS_TYPE_P (TREE_TYPE (exprtype)))
fd056a98 587 {
5c892d4a 588 errstr = _("source is not of class type");
fd056a98 589 goto fail;
590 }
4b72716d 591 if (!COMPLETE_TYPE_P (complete_type (TREE_TYPE (exprtype))))
fd056a98 592 {
5c892d4a 593 errstr = _("source is of incomplete class type");
fd056a98 594 goto fail;
595 }
9031d10b 596
ab12ed55 597 /* Apply trivial conversion T -> T& for dereferenced ptrs. */
598 expr = convert_to_reference (exprtype, expr, CONV_IMPLICIT,
599 LOOKUP_NORMAL, NULL_TREE);
fd056a98 600 }
601
602 /* The dynamic_cast operator shall not cast away constness. */
603 if (!at_least_as_qualified_p (TREE_TYPE (type),
604 TREE_TYPE (exprtype)))
605 {
5c892d4a 606 errstr = _("conversion casts away constness");
fd056a98 607 goto fail;
c244687e 608 }
609
610 /* If *type is an unambiguous accessible base class of *exprtype,
611 convert statically. */
612 {
4a2680fc 613 tree binfo;
c244687e 614
4a2680fc 615 binfo = lookup_base (TREE_TYPE (exprtype), TREE_TYPE (type),
ada40935 616 ba_check, NULL);
be295d1f 617
4a2680fc 618 if (binfo)
be295d1f 619 {
4a2680fc 620 expr = build_base_path (PLUS_EXPR, convert_from_reference (expr),
1e74225a 621 binfo, 0, complain);
d9f88785 622 if (TREE_CODE (exprtype) == POINTER_TYPE)
fcb3f76e 623 expr = rvalue (expr);
d9f88785 624 return expr;
625 }
c244687e 626 }
627
628 /* Otherwise *exprtype must be a polymorphic class (have a vtbl). */
1d6228f0 629 if (TYPE_POLYMORPHIC_P (TREE_TYPE (exprtype)))
c244687e 630 {
bccffb3a 631 tree expr1;
c244687e 632 /* if TYPE is `void *', return pointer to complete object. */
e3cfe3ce 633 if (tc == POINTER_TYPE && VOID_TYPE_P (TREE_TYPE (type)))
c244687e 634 {
635 /* if b is an object, dynamic_cast<void *>(&b) == (void *)&b. */
636 if (TREE_CODE (expr) == ADDR_EXPR
637 && TREE_CODE (TREE_OPERAND (expr, 0)) == VAR_DECL
638 && TREE_CODE (TREE_TYPE (TREE_OPERAND (expr, 0))) == RECORD_TYPE)
639 return build1 (NOP_EXPR, type, expr);
640
bccffb3a 641 /* Since expr is used twice below, save it. */
642 expr = save_expr (expr);
643
644 expr1 = build_headof (expr);
645 if (TREE_TYPE (expr1) != type)
646 expr1 = build1 (NOP_EXPR, type, expr1);
647 return ifnonnull (expr, expr1);
c244687e 648 }
649 else
650 {
651 tree retval;
d01f58f9 652 tree result, td2, td3;
653 tree elems[4];
653e5405 654 tree static_type, target_type, boff;
c244687e 655
653e5405 656 /* If we got here, we can't convert statically. Therefore,
c244687e 657 dynamic_cast<D&>(b) (b an object) cannot succeed. */
fd056a98 658 if (tc == REFERENCE_TYPE)
c244687e 659 {
be295d1f 660 if (TREE_CODE (old_expr) == VAR_DECL
661 && TREE_CODE (TREE_TYPE (old_expr)) == RECORD_TYPE)
c244687e 662 {
653e5405 663 tree expr = throw_bad_cast ();
ebd21de4 664 if (complain & tf_warning)
665 warning (0, "dynamic_cast of %q#D to %q#T can never succeed",
666 old_expr, type);
653e5405 667 /* Bash it to the expected type. */
668 TREE_TYPE (expr) = type;
71792355 669 return expr;
c244687e 670 }
671 }
672 /* Ditto for dynamic_cast<D*>(&b). */
673 else if (TREE_CODE (expr) == ADDR_EXPR)
674 {
675 tree op = TREE_OPERAND (expr, 0);
676 if (TREE_CODE (op) == VAR_DECL
677 && TREE_CODE (TREE_TYPE (op)) == RECORD_TYPE)
678 {
ebd21de4 679 if (complain & tf_warning)
680 warning (0, "dynamic_cast of %q#D to %q#T can never succeed",
681 op, type);
9031d10b 682 retval = build_int_cst (type, 0);
c244687e 683 return retval;
684 }
685 }
686
54864ec6 687 /* Use of dynamic_cast when -fno-rtti is prohibited. */
688 if (!flag_rtti)
689 {
ebd21de4 690 if (complain & tf_error)
691 error ("%<dynamic_cast%> not permitted with -fno-rtti");
54864ec6 692 return error_mark_node;
693 }
694
6d318c49 695 target_type = TYPE_MAIN_VARIANT (TREE_TYPE (type));
696 static_type = TYPE_MAIN_VARIANT (TREE_TYPE (exprtype));
b04d4dc3 697 td2 = get_tinfo_decl (target_type);
698 mark_used (td2);
d6fbd579 699 td2 = cp_build_addr_expr (td2, complain);
b04d4dc3 700 td3 = get_tinfo_decl (static_type);
701 mark_used (td3);
d6fbd579 702 td3 = cp_build_addr_expr (td3, complain);
6d318c49 703
653e5405 704 /* Determine how T and V are related. */
705 boff = dcast_base_hint (static_type, target_type);
9031d10b 706
3a8c5440 707 /* Since expr is used twice below, save it. */
708 expr = save_expr (expr);
709
c244687e 710 expr1 = expr;
711 if (tc == REFERENCE_TYPE)
d6fbd579 712 expr1 = cp_build_addr_expr (expr1, complain);
c244687e 713
d01f58f9 714 elems[0] = expr1;
715 elems[1] = td3;
716 elems[2] = td2;
717 elems[3] = boff;
3a8c5440 718
71792355 719 dcast_fn = dynamic_cast_node;
720 if (!dcast_fn)
3a8c5440 721 {
722 tree tmp;
6d318c49 723 tree tinfo_ptr;
6d318c49 724 const char *name;
9031d10b 725
9af93fe5 726 push_abi_namespace ();
160175b4 727 tinfo_ptr = xref_tag (class_type,
1631c87f 728 get_identifier ("__class_type_info"),
3f3fa556 729 /*tag_scope=*/ts_current, false);
9031d10b 730
1631c87f 731 tinfo_ptr = build_pointer_type
ce494fcf 732 (cp_build_qualified_type
1631c87f 733 (tinfo_ptr, TYPE_QUAL_CONST));
734 name = "__dynamic_cast";
fb83f216 735 tmp = build_function_type_list (ptr_type_node,
736 const_ptr_type_node,
737 tinfo_ptr, tinfo_ptr,
738 ptrdiff_type_node, NULL_TREE);
35b7a3f5 739 dcast_fn = build_library_fn_ptr (name, tmp);
9c2a0c05 740 DECL_PURE_P (dcast_fn) = 1;
9af93fe5 741 pop_abi_namespace ();
653e5405 742 dynamic_cast_node = dcast_fn;
3a8c5440 743 }
d01f58f9 744 result = build_cxx_call (dcast_fn, 4, elems);
c244687e 745
746 if (tc == REFERENCE_TYPE)
747 {
6d318c49 748 tree bad = throw_bad_cast ();
7565d3e7 749 tree neq;
9031d10b 750
c244687e 751 result = save_expr (result);
339ad7ca 752 neq = cp_truthvalue_conversion (result);
448e9bee 753 return cp_convert (type,
754 build3 (COND_EXPR, TREE_TYPE (result),
755 neq, result, bad));
c244687e 756 }
757
96624a9e 758 /* Now back to the type we want from a void*. */
c4a8ac95 759 result = cp_convert (type, result);
653e5405 760 return ifnonnull (expr, result);
c244687e 761 }
762 }
fd056a98 763 else
5c892d4a 764 errstr = _("source type is not polymorphic");
3d121546 765
c244687e 766 fail:
ebd21de4 767 if (complain & tf_error)
768 error ("cannot dynamic_cast %qE (of type %q#T) to type %q#T (%s)",
9b569e36 769 old_expr, TREE_TYPE (old_expr), type, errstr);
c244687e 770 return error_mark_node;
771}
03db3ebd 772
773tree
ebd21de4 774build_dynamic_cast (tree type, tree expr, tsubst_flags_t complain)
03db3ebd 775{
62206d34 776 tree r;
777
d2e8d7dc 778 if (type == error_mark_node || expr == error_mark_node)
779 return error_mark_node;
9031d10b 780
d2e8d7dc 781 if (processing_template_decl)
b6691ff5 782 {
783 expr = build_min (DYNAMIC_CAST_EXPR, type, expr);
784 TREE_SIDE_EFFECTS (expr) = 1;
002dd6c6 785 return convert_from_reference (expr);
b6691ff5 786 }
d2e8d7dc 787
62206d34 788 r = convert_from_reference (build_dynamic_cast_1 (type, expr, complain));
789 if (r != error_mark_node)
790 maybe_warn_about_useless_cast (type, expr, complain);
791 return r;
03db3ebd 792}
62206d34 793
6d318c49 794/* Return the runtime bit mask encoding the qualifiers of TYPE. */
795
796static int
26ac6687 797qualifier_flags (tree type)
6d318c49 798{
799 int flags = 0;
b112d873 800 int quals = cp_type_quals (type);
9031d10b 801
6d318c49 802 if (quals & TYPE_QUAL_CONST)
803 flags |= 1;
804 if (quals & TYPE_QUAL_VOLATILE)
805 flags |= 2;
30b54f80 806 if (quals & TYPE_QUAL_RESTRICT)
807 flags |= 4;
6d318c49 808 return flags;
809}
810
26ac6687 811/* Return true, if the pointer chain TYPE ends at an incomplete type, or
bafaec53 812 contains a pointer to member of an incomplete class. */
813
26ac6687 814static bool
815target_incomplete_p (tree type)
bafaec53 816{
1bc16cab 817 while (true)
05765a91 818 if (TYPE_PTRDATAMEM_P (type))
bafaec53 819 {
1bc16cab 820 if (!COMPLETE_TYPE_P (TYPE_PTRMEM_CLASS_TYPE (type)))
821 return true;
822 type = TYPE_PTRMEM_POINTED_TO_TYPE (type);
bafaec53 823 }
1bc16cab 824 else if (TREE_CODE (type) == POINTER_TYPE)
bafaec53 825 type = TREE_TYPE (type);
1bc16cab 826 else
827 return !COMPLETE_OR_VOID_TYPE_P (type);
bafaec53 828}
829
caa6fdce 830/* Returns true if TYPE involves an incomplete class type; in that
831 case, typeinfo variables for TYPE should be emitted with internal
832 linkage. */
833
834static bool
835involves_incomplete_p (tree type)
836{
837 switch (TREE_CODE (type))
838 {
839 case POINTER_TYPE:
840 return target_incomplete_p (TREE_TYPE (type));
841
842 case OFFSET_TYPE:
843 ptrmem:
9031d10b 844 return
caa6fdce 845 (target_incomplete_p (TYPE_PTRMEM_POINTED_TO_TYPE (type))
846 || !COMPLETE_TYPE_P (TYPE_PTRMEM_CLASS_TYPE (type)));
847
848 case RECORD_TYPE:
849 if (TYPE_PTRMEMFUNC_P (type))
850 goto ptrmem;
851 /* Fall through. */
852 case UNION_TYPE:
853 if (!COMPLETE_TYPE_P (type))
854 return true;
855
856 default:
857 /* All other types do not involve incomplete class types. */
858 return false;
859 }
860}
861
6d318c49 862/* Return a CONSTRUCTOR for the common part of the type_info objects. This
bafaec53 863 is the vtable pointer and NTBS name. The NTBS name is emitted as a
864 comdat const char array, so it becomes a unique key for the type. Generate
865 and emit that VAR_DECL here. (We can't always emit the type_info itself
866 as comdat, because of pointers to incomplete.) */
6d318c49 867
868static tree
c208c18e 869tinfo_base_init (tinfo_s *ti, tree target)
6d318c49 870{
fd1164d3 871 tree init;
bafaec53 872 tree name_decl;
46f41950 873 tree vtable_ptr;
fd1164d3 874 VEC(constructor_elt,gc) *v;
9031d10b 875
bafaec53 876 {
ec46af50 877 tree name_name, name_string;
9031d10b 878
bafaec53 879 /* Generate the NTBS array variable. */
bafaec53 880 tree name_type = build_cplus_array_type
ce494fcf 881 (cp_build_qualified_type (char_type_node, TYPE_QUAL_CONST),
653e5405 882 NULL_TREE);
98eaf693 883
caa6fdce 884 /* Determine the name of the variable -- and remember with which
885 type it is associated. */
606b494c 886 name_name = mangle_typeinfo_string_for_type (target);
caa6fdce 887 TREE_TYPE (name_name) = target;
888
bafaec53 889 name_decl = build_lang_decl (VAR_DECL, name_name, name_type);
91caa6ca 890 SET_DECL_ASSEMBLER_NAME (name_decl, name_name);
bafaec53 891 DECL_ARTIFICIAL (name_decl) = 1;
553acd9c 892 DECL_IGNORED_P (name_decl) = 1;
bafaec53 893 TREE_READONLY (name_decl) = 1;
894 TREE_STATIC (name_decl) = 1;
895 DECL_EXTERNAL (name_decl) = 0;
caa6fdce 896 DECL_TINFO_P (name_decl) = 1;
8da875f3 897 set_linkage_according_to_type (target, name_decl);
caa6fdce 898 import_export_decl (name_decl);
ec46af50 899 name_string = tinfo_name (target, !TREE_PUBLIC (name_decl));
bafaec53 900 DECL_INITIAL (name_decl) = name_string;
b04d4dc3 901 mark_used (name_decl);
ce0c3b07 902 pushdecl_top_level_and_finish (name_decl, name_string);
bafaec53 903 }
46f41950 904
c208c18e 905 vtable_ptr = ti->vtable;
46f41950 906 if (!vtable_ptr)
6d318c49 907 {
46f41950 908 tree real_type;
9af93fe5 909 push_abi_namespace ();
c208c18e 910 real_type = xref_tag (class_type, ti->name,
3f3fa556 911 /*tag_scope=*/ts_current, false);
9af93fe5 912 pop_abi_namespace ();
9031d10b 913
46f41950 914 if (!COMPLETE_TYPE_P (real_type))
915 {
653e5405 916 /* We never saw a definition of this type, so we need to
46f41950 917 tell the compiler that this is an exported class, as
918 indeed all of the __*_type_info classes are. */
919 SET_CLASSTYPE_INTERFACE_KNOWN (real_type);
920 CLASSTYPE_INTERFACE_ONLY (real_type) = 1;
921 }
922
923 vtable_ptr = get_vtable_decl (real_type, /*complete=*/1);
d6fbd579 924 vtable_ptr = cp_build_addr_expr (vtable_ptr, tf_warning_or_error);
46f41950 925
926 /* We need to point into the middle of the vtable. */
2cc66f2a 927 vtable_ptr = fold_build_pointer_plus
928 (vtable_ptr,
46f41950 929 size_binop (MULT_EXPR,
930 size_int (2 * TARGET_VTABLE_DATA_ENTRY_DISTANCE),
931 TYPE_SIZE_UNIT (vtable_entry_type)));
074ab442 932
c208c18e 933 ti->vtable = vtable_ptr;
6d318c49 934 }
46f41950 935
fd1164d3 936 v = VEC_alloc (constructor_elt, gc, 2);
937 CONSTRUCTOR_APPEND_ELT (v, NULL_TREE, vtable_ptr);
4405c1ad 938 CONSTRUCTOR_APPEND_ELT (v, NULL_TREE,
939 decay_conversion (name_decl, tf_warning_or_error));
9031d10b 940
fd1164d3 941 init = build_constructor (init_list_type_node, v);
4ee9c684 942 TREE_CONSTANT (init) = 1;
4ee9c684 943 TREE_STATIC (init) = 1;
9031d10b 944
6d318c49 945 return init;
946}
947
c208c18e 948/* Return the CONSTRUCTOR expr for a type_info of TYPE. TI provides the
6d318c49 949 information about the particular type_info derivation, which adds no
950 additional fields to the type_info base. */
951
952static tree
c208c18e 953generic_initializer (tinfo_s *ti, tree target)
6d318c49 954{
c208c18e 955 tree init = tinfo_base_init (ti, target);
074ab442 956
fd1164d3 957 init = build_constructor_single (init_list_type_node, NULL_TREE, init);
4ee9c684 958 TREE_CONSTANT (init) = 1;
4ee9c684 959 TREE_STATIC (init) = 1;
6d318c49 960 return init;
961}
962
378e5add 963/* Return the CONSTRUCTOR expr for a type_info of pointer TYPE.
c208c18e 964 TI provides information about the particular type_info derivation,
6d318c49 965 which adds target type and qualifier flags members to the type_info base. */
966
967static tree
c208c18e 968ptr_initializer (tinfo_s *ti, tree target)
6d318c49 969{
c208c18e 970 tree init = tinfo_base_init (ti, target);
6d318c49 971 tree to = TREE_TYPE (target);
972 int flags = qualifier_flags (to);
26ac6687 973 bool incomplete = target_incomplete_p (to);
fd1164d3 974 VEC(constructor_elt,gc) *v = VEC_alloc (constructor_elt, gc, 3);
9031d10b 975
bafaec53 976 if (incomplete)
caa6fdce 977 flags |= 8;
fd1164d3 978 CONSTRUCTOR_APPEND_ELT (v, NULL_TREE, init);
979 CONSTRUCTOR_APPEND_ELT (v, NULL_TREE, build_int_cst (NULL_TREE, flags));
980 CONSTRUCTOR_APPEND_ELT (v, NULL_TREE,
981 get_tinfo_ptr (TYPE_MAIN_VARIANT (to)));
9031d10b 982
fd1164d3 983 init = build_constructor (init_list_type_node, v);
4ee9c684 984 TREE_CONSTANT (init) = 1;
4ee9c684 985 TREE_STATIC (init) = 1;
6d318c49 986 return init;
987}
988
378e5add 989/* Return the CONSTRUCTOR expr for a type_info of pointer to member data TYPE.
c208c18e 990 TI provides information about the particular type_info derivation,
bafaec53 991 which adds class, target type and qualifier flags members to the type_info
992 base. */
6d318c49 993
994static tree
c208c18e 995ptm_initializer (tinfo_s *ti, tree target)
6d318c49 996{
c208c18e 997 tree init = tinfo_base_init (ti, target);
6d318c49 998 tree to = TYPE_PTRMEM_POINTED_TO_TYPE (target);
999 tree klass = TYPE_PTRMEM_CLASS_TYPE (target);
1000 int flags = qualifier_flags (to);
26ac6687 1001 bool incomplete = target_incomplete_p (to);
fd1164d3 1002 VEC(constructor_elt,gc) *v = VEC_alloc (constructor_elt, gc, 4);
9031d10b 1003
bafaec53 1004 if (incomplete)
caa6fdce 1005 flags |= 0x8;
bafaec53 1006 if (!COMPLETE_TYPE_P (klass))
caa6fdce 1007 flags |= 0x10;
fd1164d3 1008 CONSTRUCTOR_APPEND_ELT (v, NULL_TREE, init);
1009 CONSTRUCTOR_APPEND_ELT (v, NULL_TREE, build_int_cst (NULL_TREE, flags));
1010 CONSTRUCTOR_APPEND_ELT (v, NULL_TREE,
1011 get_tinfo_ptr (TYPE_MAIN_VARIANT (to)));
1012 CONSTRUCTOR_APPEND_ELT (v, NULL_TREE, get_tinfo_ptr (klass));
1013
1014 init = build_constructor (init_list_type_node, v);
4ee9c684 1015 TREE_CONSTANT (init) = 1;
4ee9c684 1016 TREE_STATIC (init) = 1;
9031d10b 1017 return init;
6d318c49 1018}
1019
6d318c49 1020/* Return the CONSTRUCTOR expr for a type_info of class TYPE.
c208c18e 1021 TI provides information about the particular __class_type_info derivation,
fd1164d3 1022 which adds hint flags and N extra initializers to the type_info base. */
6d318c49 1023
1024static tree
fd1164d3 1025class_initializer (tinfo_s *ti, tree target, unsigned n, ...)
6d318c49 1026{
c208c18e 1027 tree init = tinfo_base_init (ti, target);
fd1164d3 1028 va_list extra_inits;
1029 unsigned i;
1030 VEC(constructor_elt,gc) *v = VEC_alloc (constructor_elt, gc, n+1);
1031
1032 CONSTRUCTOR_APPEND_ELT (v, NULL_TREE, init);
1033 va_start (extra_inits, n);
1034 for (i = 0; i < n; i++)
1035 CONSTRUCTOR_APPEND_ELT (v, NULL_TREE, va_arg (extra_inits, tree));
1036 va_end (extra_inits);
9031d10b 1037
fd1164d3 1038 init = build_constructor (init_list_type_node, v);
4ee9c684 1039 TREE_CONSTANT (init) = 1;
4ee9c684 1040 TREE_STATIC (init) = 1;
9031d10b 1041 return init;
6d318c49 1042}
1043
26ac6687 1044/* Returns true if the typeinfo for type should be placed in
20e29201 1045 the runtime library. */
1046
26ac6687 1047static bool
1048typeinfo_in_lib_p (tree type)
20e29201 1049{
1050 /* The typeinfo objects for `T*' and `const T*' are in the runtime
1051 library for simple types T. */
1052 if (TREE_CODE (type) == POINTER_TYPE
3119c950 1053 && (cp_type_quals (TREE_TYPE (type)) == TYPE_QUAL_CONST
1054 || cp_type_quals (TREE_TYPE (type)) == TYPE_UNQUALIFIED))
20e29201 1055 type = TREE_TYPE (type);
1056
1057 switch (TREE_CODE (type))
1058 {
1059 case INTEGER_TYPE:
1060 case BOOLEAN_TYPE:
20e29201 1061 case REAL_TYPE:
1062 case VOID_TYPE:
fa67d8e8 1063 case NULLPTR_TYPE:
26ac6687 1064 return true;
9031d10b 1065
c7ca48ea 1066 case LANG_TYPE:
fa67d8e8 1067 /* fall through. */
c7ca48ea 1068
20e29201 1069 default:
26ac6687 1070 return false;
20e29201 1071 }
1072}
1073
c208c18e 1074/* Generate the initializer for the type info describing TYPE. TK_INDEX is
1075 the index of the descriptor in the tinfo_desc vector. */
6d318c49 1076
1077static tree
c208c18e 1078get_pseudo_ti_init (tree type, unsigned tk_index)
6d318c49 1079{
c208c18e 1080 tinfo_s *ti = VEC_index (tinfo_s, tinfo_descs, tk_index);
074ab442 1081
b4df430b 1082 gcc_assert (at_eof);
c208c18e 1083 switch (tk_index)
6d318c49 1084 {
c208c18e 1085 case TK_POINTER_MEMBER_TYPE:
1086 return ptm_initializer (ti, type);
074ab442 1087
c208c18e 1088 case TK_POINTER_TYPE:
1089 return ptr_initializer (ti, type);
074ab442 1090
c208c18e 1091 case TK_BUILTIN_TYPE:
1092 case TK_ENUMERAL_TYPE:
1093 case TK_FUNCTION_TYPE:
1094 case TK_ARRAY_TYPE:
1095 return generic_initializer (ti, type);
1096
1097 case TK_CLASS_TYPE:
fd1164d3 1098 return class_initializer (ti, type, 0);
c208c18e 1099
1100 case TK_SI_CLASS_TYPE:
1101 {
1102 tree base_binfo = BINFO_BASE_BINFO (TYPE_BINFO (type), 0);
1103 tree tinfo = get_tinfo_ptr (BINFO_TYPE (base_binfo));
11318ee4 1104
1105 /* get_tinfo_ptr might have reallocated the tinfo_descs vector. */
1106 ti = VEC_index (tinfo_s, tinfo_descs, tk_index);
fd1164d3 1107 return class_initializer (ti, type, 1, tinfo);
c208c18e 1108 }
20e29201 1109
6d318c49 1110 default:
c208c18e 1111 {
1112 int hint = ((CLASSTYPE_REPEATED_BASE_P (type) << 0)
1113 | (CLASSTYPE_DIAMOND_SHAPED_P (type) << 1));
1114 tree binfo = TYPE_BINFO (type);
1115 int nbases = BINFO_N_BASE_BINFOS (binfo);
1116 VEC(tree,gc) *base_accesses = BINFO_BASE_ACCESSES (binfo);
00f39591 1117 tree offset_type = integer_types[itk_long];
c208c18e 1118 tree base_inits = NULL_TREE;
1119 int ix;
fd1164d3 1120 VEC(constructor_elt,gc) *init_vec = NULL;
1121 constructor_elt *e;
074ab442 1122
c208c18e 1123 gcc_assert (tk_index >= TK_FIXED);
074ab442 1124
fd1164d3 1125 VEC_safe_grow (constructor_elt, gc, init_vec, nbases);
c208c18e 1126 /* Generate the base information initializer. */
1127 for (ix = nbases; ix--;)
1128 {
1129 tree base_binfo = BINFO_BASE_BINFO (binfo, ix);
fd1164d3 1130 tree base_init;
c208c18e 1131 int flags = 0;
1132 tree tinfo;
1133 tree offset;
fd1164d3 1134 VEC(constructor_elt,gc) *v;
074ab442 1135
c208c18e 1136 if (VEC_index (tree, base_accesses, ix) == access_public_node)
1137 flags |= 2;
1138 tinfo = get_tinfo_ptr (BINFO_TYPE (base_binfo));
1139 if (BINFO_VIRTUAL_P (base_binfo))
1140 {
1141 /* We store the vtable offset at which the virtual
074ab442 1142 base offset can be found. */
c208c18e 1143 offset = BINFO_VPTR_FIELD (base_binfo);
c208c18e 1144 flags |= 1;
1145 }
1146 else
1147 offset = BINFO_OFFSET (base_binfo);
074ab442 1148
c208c18e 1149 /* Combine offset and flags into one field. */
00f39591 1150 offset = fold_convert (offset_type, offset);
389dd41b 1151 offset = fold_build2_loc (input_location,
1152 LSHIFT_EXPR, offset_type, offset,
00f39591 1153 build_int_cst (offset_type, 8));
389dd41b 1154 offset = fold_build2_loc (input_location,
1155 BIT_IOR_EXPR, offset_type, offset,
00f39591 1156 build_int_cst (offset_type, flags));
fd1164d3 1157 v = VEC_alloc (constructor_elt, gc, 2);
1158 CONSTRUCTOR_APPEND_ELT (v, NULL_TREE, tinfo);
1159 CONSTRUCTOR_APPEND_ELT (v, NULL_TREE, offset);
1160 base_init = build_constructor (init_list_type_node, v);
1161 e = VEC_index (constructor_elt, init_vec, ix);
1162 e->index = NULL_TREE;
1163 e->value = base_init;
c208c18e 1164 }
fd1164d3 1165 base_inits = build_constructor (init_list_type_node, init_vec);
11318ee4 1166
1167 /* get_tinfo_ptr might have reallocated the tinfo_descs vector. */
1168 ti = VEC_index (tinfo_s, tinfo_descs, tk_index);
fd1164d3 1169 return class_initializer (ti, type, 3,
1170 build_int_cst (NULL_TREE, hint),
1171 build_int_cst (NULL_TREE, nbases),
1172 base_inits);
c208c18e 1173 }
6d318c49 1174 }
6d318c49 1175}
1176
1177/* Generate the RECORD_TYPE containing the data layout of a type_info
1178 derivative as used by the runtime. This layout must be consistent with
1179 that defined in the runtime support. Also generate the VAR_DECL for the
1180 type's vtable. We explicitly manage the vtable member, and name it for
1181 real type as used in the runtime. The RECORD type has a different name,
1182 to avoid collisions. Return a TREE_LIST who's TINFO_PSEUDO_TYPE
46f41950 1183 is the generated type and TINFO_VTABLE_NAME is the name of the
1184 vtable. We have to delay generating the VAR_DECL of the vtable
1185 until the end of the translation, when we'll have seen the library
1186 definition, if there was one.
9031d10b 1187
6d318c49 1188 REAL_NAME is the runtime's name of the type. Trailing arguments are
1189 additional FIELD_DECL's for the structure. The final argument must be
1190 NULL. */
1191
c208c18e 1192static void
70b44d38 1193create_pseudo_type_info (int tk, const char *real_name, ...)
6d318c49 1194{
c208c18e 1195 tinfo_s *ti;
46f41950 1196 tree pseudo_type;
6d318c49 1197 char *pseudo_name;
805e22b2 1198 tree fields;
6d318c49 1199 tree field_decl;
ee582a61 1200 va_list ap;
0903457a 1201
c208c18e 1202 va_start (ap, real_name);
6d318c49 1203
47cd6605 1204 /* Generate the pseudo type name. */
cc52f165 1205 pseudo_name = (char *) alloca (strlen (real_name) + 30);
6d318c49 1206 strcpy (pseudo_name, real_name);
1207 strcat (pseudo_name, "_pseudo");
c208c18e 1208 if (tk >= TK_FIXED)
1209 sprintf (pseudo_name + strlen (pseudo_name), "%d", tk - TK_FIXED);
9031d10b 1210
47cd6605 1211 /* First field is the pseudo type_info base class. */
e60a6f7b 1212 fields = build_decl (input_location,
1213 FIELD_DECL, NULL_TREE,
c208c18e 1214 VEC_index (tinfo_s, tinfo_descs,
1215 TK_TYPE_INFO_TYPE)->type);
9031d10b 1216
6d318c49 1217 /* Now add the derived fields. */
805e22b2 1218 while ((field_decl = va_arg (ap, tree)))
1219 {
1767a056 1220 DECL_CHAIN (field_decl) = fields;
805e22b2 1221 fields = field_decl;
1222 }
9031d10b 1223
47cd6605 1224 /* Create the pseudo type. */
95397ff9 1225 pseudo_type = make_class_type (RECORD_TYPE);
805e22b2 1226 finish_builtin_struct (pseudo_type, pseudo_name, fields, NULL_TREE);
2437a99c 1227 CLASSTYPE_AS_BASE (pseudo_type) = pseudo_type;
0903457a 1228
c208c18e 1229 ti = VEC_index (tinfo_s, tinfo_descs, tk);
1230 ti->type = cp_build_qualified_type (pseudo_type, TYPE_QUAL_CONST);
1231 ti->name = get_identifier (real_name);
1232 ti->vtable = NULL_TREE;
9031d10b 1233
4a2849cb 1234 /* Pretend this is public so determine_visibility doesn't give vtables
1235 internal linkage. */
1236 TREE_PUBLIC (TYPE_MAIN_DECL (ti->type)) = 1;
1237
ee582a61 1238 va_end (ap);
6d318c49 1239}
1240
c208c18e 1241/* Return the index of a pseudo type info type node used to describe
1242 TYPE. TYPE must be a complete type (or cv void), except at the end
1243 of the translation unit. */
6d318c49 1244
c208c18e 1245static unsigned
1246get_pseudo_ti_index (tree type)
6d318c49 1247{
c208c18e 1248 unsigned ix;
074ab442 1249
46f41950 1250 switch (TREE_CODE (type))
6d318c49 1251 {
1bc16cab 1252 case OFFSET_TYPE:
c208c18e 1253 ix = TK_POINTER_MEMBER_TYPE;
1254 break;
074ab442 1255
46f41950 1256 case POINTER_TYPE:
c208c18e 1257 ix = TK_POINTER_TYPE;
1258 break;
074ab442 1259
46f41950 1260 case ENUMERAL_TYPE:
c208c18e 1261 ix = TK_ENUMERAL_TYPE;
1262 break;
074ab442 1263
46f41950 1264 case FUNCTION_TYPE:
c208c18e 1265 ix = TK_FUNCTION_TYPE;
1266 break;
074ab442 1267
46f41950 1268 case ARRAY_TYPE:
c208c18e 1269 ix = TK_ARRAY_TYPE;
1270 break;
074ab442 1271
46f41950 1272 case UNION_TYPE:
1273 case RECORD_TYPE:
1274 if (TYPE_PTRMEMFUNC_P (type))
c208c18e 1275 {
1276 ix = TK_POINTER_MEMBER_TYPE;
1277 break;
1278 }
46f41950 1279 else if (!COMPLETE_TYPE_P (type))
1280 {
6fee0737 1281 if (!at_eof)
1282 cxx_incomplete_type_error (NULL_TREE, type);
c208c18e 1283 ix = TK_CLASS_TYPE;
1284 break;
46f41950 1285 }
2cfde4f3 1286 else if (!BINFO_N_BASE_BINFOS (TYPE_BINFO (type)))
c208c18e 1287 {
1288 ix = TK_CLASS_TYPE;
1289 break;
1290 }
46f41950 1291 else
1292 {
95f3173a 1293 tree binfo = TYPE_BINFO (type);
046bfc77 1294 VEC(tree,gc) *base_accesses = BINFO_BASE_ACCESSES (binfo);
f6cc6a08 1295 tree base_binfo = BINFO_BASE_BINFO (binfo, 0);
1296 int num_bases = BINFO_N_BASE_BINFOS (binfo);
9031d10b 1297
46f41950 1298 if (num_bases == 1
db77fe17 1299 && VEC_index (tree, base_accesses, 0) == access_public_node
57c28194 1300 && !BINFO_VIRTUAL_P (base_binfo)
46f41950 1301 && integer_zerop (BINFO_OFFSET (base_binfo)))
c208c18e 1302 {
1303 /* single non-virtual public. */
1304 ix = TK_SI_CLASS_TYPE;
1305 break;
1306 }
46f41950 1307 else
1308 {
c208c18e 1309 tinfo_s *ti;
46f41950 1310 tree array_domain, base_array;
9031d10b 1311
c208c18e 1312 ix = TK_FIXED + num_bases;
1313 if (VEC_length (tinfo_s, tinfo_descs) <= ix)
46f41950 1314 {
c208c18e 1315 /* too short, extend. */
1316 unsigned len = VEC_length (tinfo_s, tinfo_descs);
074ab442 1317
c208c18e 1318 VEC_safe_grow (tinfo_s, gc, tinfo_descs, ix + 1);
1319 while (VEC_iterate (tinfo_s, tinfo_descs, len++, ti))
1320 ti->type = ti->vtable = ti->name = NULL_TREE;
46f41950 1321 }
c208c18e 1322 else if (VEC_index (tinfo_s, tinfo_descs, ix)->type)
1323 /* already created. */
1324 break;
9031d10b 1325
8c1f65e6 1326 /* Create the array of __base_class_type_info entries.
1327 G++ 3.2 allocated an array that had one too many
1328 entries, and then filled that extra entries with
1329 zeros. */
1330 if (abi_version_at_least (2))
1331 array_domain = build_index_type (size_int (num_bases - 1));
1332 else
1333 array_domain = build_index_type (size_int (num_bases));
46f41950 1334 base_array =
c208c18e 1335 build_array_type (VEC_index (tinfo_s, tinfo_descs,
1336 TK_BASE_TYPE)->type,
1337 array_domain);
46f41950 1338
9af93fe5 1339 push_abi_namespace ();
c208c18e 1340 create_pseudo_type_info
1341 (ix, "__vmi_class_type_info",
e60a6f7b 1342 build_decl (input_location,
1343 FIELD_DECL, NULL_TREE, integer_type_node),
1344 build_decl (input_location,
1345 FIELD_DECL, NULL_TREE, integer_type_node),
1346 build_decl (input_location,
1347 FIELD_DECL, NULL_TREE, base_array),
46f41950 1348 NULL);
9af93fe5 1349 pop_abi_namespace ();
c208c18e 1350 break;
46f41950 1351 }
1352 }
1353 default:
c208c18e 1354 ix = TK_BUILTIN_TYPE;
1355 break;
46f41950 1356 }
c208c18e 1357 return ix;
6d318c49 1358}
1359
1360/* Make sure the required builtin types exist for generating the type_info
f5f73833 1361 variable definitions. */
6d318c49 1362
1363static void
26ac6687 1364create_tinfo_types (void)
6d318c49 1365{
c208c18e 1366 tinfo_s *ti;
074ab442 1367
c208c18e 1368 gcc_assert (!tinfo_descs);
6d318c49 1369
c208c18e 1370 VEC_safe_grow (tinfo_s, gc, tinfo_descs, TK_FIXED);
074ab442 1371
9af93fe5 1372 push_abi_namespace ();
9031d10b 1373
6d318c49 1374 /* Create the internal type_info structure. This is used as a base for
1375 the other structures. */
1376 {
805e22b2 1377 tree field, fields;
6d318c49 1378
e60a6f7b 1379 field = build_decl (BUILTINS_LOCATION,
1380 FIELD_DECL, NULL_TREE, const_ptr_type_node);
805e22b2 1381 fields = field;
9031d10b 1382
e60a6f7b 1383 field = build_decl (BUILTINS_LOCATION,
1384 FIELD_DECL, NULL_TREE, const_string_type_node);
1767a056 1385 DECL_CHAIN (field) = fields;
805e22b2 1386 fields = field;
9031d10b 1387
c208c18e 1388 ti = VEC_index (tinfo_s, tinfo_descs, TK_TYPE_INFO_TYPE);
95397ff9 1389 ti->type = make_class_type (RECORD_TYPE);
c208c18e 1390 ti->vtable = NULL_TREE;
1391 ti->name = NULL_TREE;
1392 finish_builtin_struct (ti->type, "__type_info_pseudo",
805e22b2 1393 fields, NULL_TREE);
6d318c49 1394 }
9031d10b 1395
6d318c49 1396 /* Fundamental type_info */
c208c18e 1397 create_pseudo_type_info (TK_BUILTIN_TYPE, "__fundamental_type_info", NULL);
6d318c49 1398
47cd6605 1399 /* Array, function and enum type_info. No additional fields. */
c208c18e 1400 create_pseudo_type_info (TK_ARRAY_TYPE, "__array_type_info", NULL);
1401 create_pseudo_type_info (TK_FUNCTION_TYPE, "__function_type_info", NULL);
1402 create_pseudo_type_info (TK_ENUMERAL_TYPE, "__enum_type_info", NULL);
074ab442 1403
c208c18e 1404 /* Class type_info. No additional fields. */
1405 create_pseudo_type_info (TK_CLASS_TYPE, "__class_type_info", NULL);
074ab442 1406
1407 /* Single public non-virtual base class. Add pointer to base class.
30b54f80 1408 This is really a descendant of __class_type_info. */
c208c18e 1409 create_pseudo_type_info (TK_SI_CLASS_TYPE, "__si_class_type_info",
e60a6f7b 1410 build_decl (BUILTINS_LOCATION,
1411 FIELD_DECL, NULL_TREE, type_info_ptr_type),
074ab442 1412 NULL);
9031d10b 1413
6d318c49 1414 /* Base class internal helper. Pointer to base type, offset to base,
47cd6605 1415 flags. */
6d318c49 1416 {
805e22b2 1417 tree field, fields;
9031d10b 1418
e60a6f7b 1419 field = build_decl (BUILTINS_LOCATION,
1420 FIELD_DECL, NULL_TREE, type_info_ptr_type);
805e22b2 1421 fields = field;
9031d10b 1422
e60a6f7b 1423 field = build_decl (BUILTINS_LOCATION,
1424 FIELD_DECL, NULL_TREE, integer_types[itk_long]);
1767a056 1425 DECL_CHAIN (field) = fields;
805e22b2 1426 fields = field;
074ab442 1427
c208c18e 1428 ti = VEC_index (tinfo_s, tinfo_descs, TK_BASE_TYPE);
074ab442 1429
95397ff9 1430 ti->type = make_class_type (RECORD_TYPE);
c208c18e 1431 ti->vtable = NULL_TREE;
1432 ti->name = NULL_TREE;
1433 finish_builtin_struct (ti->type, "__base_class_type_info_pseudo",
805e22b2 1434 fields, NULL_TREE);
6d318c49 1435 }
9031d10b 1436
15acd583 1437 /* Pointer type_info. Adds two fields, qualification mask
1438 and pointer to the pointed to type. This is really a descendant of
47cd6605 1439 __pbase_type_info. */
c208c18e 1440 create_pseudo_type_info (TK_POINTER_TYPE, "__pointer_type_info",
e60a6f7b 1441 build_decl (BUILTINS_LOCATION,
1442 FIELD_DECL, NULL_TREE, integer_type_node),
1443 build_decl (BUILTINS_LOCATION,
1444 FIELD_DECL, NULL_TREE, type_info_ptr_type),
15acd583 1445 NULL);
1446
30b54f80 1447 /* Pointer to member data type_info. Add qualifications flags,
1448 pointer to the member's type info and pointer to the class.
15acd583 1449 This is really a descendant of __pbase_type_info. */
c208c18e 1450 create_pseudo_type_info (TK_POINTER_MEMBER_TYPE,
1451 "__pointer_to_member_type_info",
e60a6f7b 1452 build_decl (BUILTINS_LOCATION,
1453 FIELD_DECL, NULL_TREE, integer_type_node),
1454 build_decl (BUILTINS_LOCATION,
1455 FIELD_DECL, NULL_TREE, type_info_ptr_type),
1456 build_decl (BUILTINS_LOCATION,
1457 FIELD_DECL, NULL_TREE, type_info_ptr_type),
074ab442 1458 NULL);
6d318c49 1459
9af93fe5 1460 pop_abi_namespace ();
6d318c49 1461}
1462
1463/* Emit the type_info descriptors which are guaranteed to be in the runtime
1464 support. Generating them here guarantees consistency with the other
1465 structures. We use the following heuristic to determine when the runtime
aaf2d6f6 1466 is being generated. If std::__fundamental_type_info is defined, and its
6d318c49 1467 destructor is defined, then the runtime is being built. */
1468
1469void
26ac6687 1470emit_support_tinfos (void)
6d318c49 1471{
6fe11077 1472 /* Dummy static variable so we can put nullptr in the array; it will be
1473 set before we actually start to walk the array. */
6d318c49 1474 static tree *const fundamentals[] =
1475 {
1476 &void_type_node,
1477 &boolean_type_node,
b0726616 1478 &wchar_type_node, &char16_type_node, &char32_type_node,
6d318c49 1479 &char_type_node, &signed_char_type_node, &unsigned_char_type_node,
1480 &short_integer_type_node, &short_unsigned_type_node,
1481 &integer_type_node, &unsigned_type_node,
1482 &long_integer_type_node, &long_unsigned_type_node,
1483 &long_long_integer_type_node, &long_long_unsigned_type_node,
6388cfe2 1484 &int128_integer_type_node, &int128_unsigned_type_node,
6d318c49 1485 &float_type_node, &double_type_node, &long_double_type_node,
b7f26334 1486 &dfloat32_type_node, &dfloat64_type_node, &dfloat128_type_node,
6fe11077 1487 &nullptr_type_node,
6d318c49 1488 0
1489 };
1490 int ix;
1491 tree bltn_type, dtor;
9031d10b 1492
9af93fe5 1493 push_abi_namespace ();
160175b4 1494 bltn_type = xref_tag (class_type,
9031d10b 1495 get_identifier ("__fundamental_type_info"),
3f3fa556 1496 /*tag_scope=*/ts_current, false);
9af93fe5 1497 pop_abi_namespace ();
4b72716d 1498 if (!COMPLETE_TYPE_P (bltn_type))
6d318c49 1499 return;
de5ab3f1 1500 dtor = CLASSTYPE_DESTRUCTORS (bltn_type);
ed36f1cf 1501 if (!dtor || DECL_EXTERNAL (dtor))
6d318c49 1502 return;
1503 doing_runtime = 1;
1504 for (ix = 0; fundamentals[ix]; ix++)
1505 {
1506 tree bltn = *fundamentals[ix];
f1b37438 1507 tree types[3];
1fe46df1 1508 int i;
1509
890d0caa 1510 if (bltn == NULL_TREE)
1511 continue;
f1b37438 1512 types[0] = bltn;
1513 types[1] = build_pointer_type (bltn);
ce494fcf 1514 types[2] = build_pointer_type (cp_build_qualified_type (bltn,
1515 TYPE_QUAL_CONST));
9031d10b 1516
1fe46df1 1517 for (i = 0; i < 3; ++i)
1518 {
1519 tree tinfo;
f1b37438 1520
1fe46df1 1521 tinfo = get_tinfo_decl (types[i]);
1522 TREE_USED (tinfo) = 1;
1523 mark_needed (tinfo);
1524 /* The C++ ABI requires that these objects be COMDAT. But,
9031d10b 1525 On systems without weak symbols, initialized COMDAT
1fe46df1 1526 objects are emitted with internal linkage. (See
1527 comdat_linkage for details.) Since we want these objects
1528 to have external linkage so that copies do not have to be
1529 emitted in code outside the runtime library, we make them
60d9461b 1530 non-COMDAT here.
1531
1532 It might also not be necessary to follow this detail of the
1533 ABI. */
1534 if (!flag_weak || ! targetm.cxx.library_rtti_comdat ())
1fe46df1 1535 {
1536 gcc_assert (TREE_PUBLIC (tinfo) && !DECL_COMDAT (tinfo));
1537 DECL_INTERFACE_KNOWN (tinfo) = 1;
1538 }
1539 }
6d318c49 1540 }
1541}
1542
46f41950 1543/* Finish a type info decl. DECL_PTR is a pointer to an unemitted
1544 tinfo decl. Determine whether it needs emitting, and if so
1545 generate the initializer. */
6d318c49 1546
26ac6687 1547bool
981bab5c 1548emit_tinfo_decl (tree decl)
6d318c49 1549{
46f41950 1550 tree type = TREE_TYPE (DECL_NAME (decl));
6a7638c9 1551 int in_library = typeinfo_in_lib_p (type);
981bab5c 1552
9031d10b 1553 gcc_assert (DECL_TINFO_P (decl));
1554
caa6fdce 1555 if (in_library)
1556 {
1557 if (doing_runtime)
1558 DECL_EXTERNAL (decl) = 0;
1559 else
1560 {
1561 /* If we're not in the runtime, then DECL (which is already
1562 DECL_EXTERNAL) will not be defined here. */
1563 DECL_INTERFACE_KNOWN (decl) = 1;
1564 return false;
1565 }
1566 }
1567 else if (involves_incomplete_p (type))
1568 {
1569 if (!decl_needed_p (decl))
1570 return false;
1571 /* If TYPE involves an incomplete class type, then the typeinfo
1572 object will be emitted with internal linkage. There is no
1573 way to know whether or not types are incomplete until the end
1574 of the compilation, so this determination must be deferred
1575 until this point. */
1576 TREE_PUBLIC (decl) = 0;
1577 DECL_EXTERNAL (decl) = 0;
1578 DECL_INTERFACE_KNOWN (decl) = 1;
1579 }
277f8387 1580
caa6fdce 1581 import_export_decl (decl);
1582 if (DECL_NOT_REALLY_EXTERN (decl) && decl_needed_p (decl))
1583 {
c208c18e 1584 tree init;
074ab442 1585
caa6fdce 1586 DECL_EXTERNAL (decl) = 0;
c208c18e 1587 init = get_pseudo_ti_init (type, get_pseudo_ti_index (type));
1588 DECL_INITIAL (decl) = init;
caa6fdce 1589 mark_used (decl);
7f78414b 1590 cp_finish_decl (decl, init, false, NULL_TREE, 0);
caa6fdce 1591 return true;
1592 }
1593 else
26ac6687 1594 return false;
6d318c49 1595}
c208c18e 1596
1597#include "gt-cp-rtti.h"