OSDN Git Service

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