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