OSDN Git Service

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