OSDN Git Service

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