OSDN Git Service

* decl.c (grokdeclarator): Don't bother checking for CHAR_TYPE.
[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
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 prohibited.  */
703   if (!flag_rtti)
704     {
705       error ("%<dynamic_cast%> not permitted with -fno-rtti");
706       return error_mark_node;
707     }
708
709   if (processing_template_decl)
710     {
711       expr = build_min (DYNAMIC_CAST_EXPR, type, expr);
712       TREE_SIDE_EFFECTS (expr) = 1;
713
714       return expr;
715     }
716
717   return convert_from_reference (build_dynamic_cast_1 (type, expr));
718 }
719 \f
720 /* Return the runtime bit mask encoding the qualifiers of TYPE.  */
721
722 static int
723 qualifier_flags (tree type)
724 {
725   int flags = 0;
726   int quals = cp_type_quals (type);
727
728   if (quals & TYPE_QUAL_CONST)
729     flags |= 1;
730   if (quals & TYPE_QUAL_VOLATILE)
731     flags |= 2;
732   if (quals & TYPE_QUAL_RESTRICT)
733     flags |= 4;
734   return flags;
735 }
736
737 /* Return true, if the pointer chain TYPE ends at an incomplete type, or
738    contains a pointer to member of an incomplete class.  */
739
740 static bool
741 target_incomplete_p (tree type)
742 {
743   while (true)
744     if (TYPE_PTRMEM_P (type))
745       {
746         if (!COMPLETE_TYPE_P (TYPE_PTRMEM_CLASS_TYPE (type)))
747           return true;
748         type = TYPE_PTRMEM_POINTED_TO_TYPE (type);
749       }
750     else if (TREE_CODE (type) == POINTER_TYPE)
751       type = TREE_TYPE (type);
752     else
753       return !COMPLETE_OR_VOID_TYPE_P (type);
754 }
755
756 /* Returns true if TYPE involves an incomplete class type; in that
757    case, typeinfo variables for TYPE should be emitted with internal
758    linkage.  */
759
760 static bool
761 involves_incomplete_p (tree type)
762 {
763   switch (TREE_CODE (type))
764     {
765     case POINTER_TYPE:
766       return target_incomplete_p (TREE_TYPE (type));
767
768     case OFFSET_TYPE:
769     ptrmem:
770       return
771         (target_incomplete_p (TYPE_PTRMEM_POINTED_TO_TYPE (type))
772          || !COMPLETE_TYPE_P (TYPE_PTRMEM_CLASS_TYPE (type)));
773
774     case RECORD_TYPE:
775       if (TYPE_PTRMEMFUNC_P (type))
776         goto ptrmem;
777       /* Fall through.  */
778     case UNION_TYPE:
779       if (!COMPLETE_TYPE_P (type))
780         return true;
781
782     default:
783       /* All other types do not involve incomplete class types.  */
784       return false;
785     }
786 }
787
788 /* Return a CONSTRUCTOR for the common part of the type_info objects. This
789    is the vtable pointer and NTBS name.  The NTBS name is emitted as a
790    comdat const char array, so it becomes a unique key for the type. Generate
791    and emit that VAR_DECL here.  (We can't always emit the type_info itself
792    as comdat, because of pointers to incomplete.) */
793
794 static tree
795 tinfo_base_init (tinfo_s *ti, tree target)
796 {
797   tree init = NULL_TREE;
798   tree name_decl;
799   tree vtable_ptr;
800
801   {
802     tree name_name;
803
804     /* Generate the NTBS array variable.  */
805     tree name_type = build_cplus_array_type
806                      (build_qualified_type (char_type_node, TYPE_QUAL_CONST),
807                      NULL_TREE);
808     tree name_string = tinfo_name (target);
809
810     /* Determine the name of the variable -- and remember with which
811        type it is associated.  */
812     name_name = mangle_typeinfo_string_for_type (target);
813     TREE_TYPE (name_name) = target;
814
815     name_decl = build_lang_decl (VAR_DECL, name_name, name_type);
816     SET_DECL_ASSEMBLER_NAME (name_decl, name_name);
817     DECL_ARTIFICIAL (name_decl) = 1;
818     DECL_IGNORED_P (name_decl) = 1;
819     TREE_READONLY (name_decl) = 1;
820     TREE_STATIC (name_decl) = 1;
821     DECL_EXTERNAL (name_decl) = 0;
822     DECL_TINFO_P (name_decl) = 1;
823     if (involves_incomplete_p (target))
824       {
825         TREE_PUBLIC (name_decl) = 0;
826         DECL_INTERFACE_KNOWN (name_decl) = 1;
827       }
828     else
829       set_linkage_according_to_type (target, name_decl);
830     import_export_decl (name_decl);
831     DECL_INITIAL (name_decl) = name_string;
832     mark_used (name_decl);
833     pushdecl_top_level_and_finish (name_decl, name_string);
834   }
835
836   vtable_ptr = ti->vtable;
837   if (!vtable_ptr)
838     {
839       tree real_type;
840       push_nested_namespace (abi_node);
841       real_type = xref_tag (class_type, ti->name,
842                             /*tag_scope=*/ts_current, false);
843       pop_nested_namespace (abi_node);
844
845       if (!COMPLETE_TYPE_P (real_type))
846         {
847           /* We never saw a definition of this type, so we need to
848              tell the compiler that this is an exported class, as
849              indeed all of the __*_type_info classes are.  */
850           SET_CLASSTYPE_INTERFACE_KNOWN (real_type);
851           CLASSTYPE_INTERFACE_ONLY (real_type) = 1;
852         }
853
854       vtable_ptr = get_vtable_decl (real_type, /*complete=*/1);
855       vtable_ptr = build_unary_op (ADDR_EXPR, vtable_ptr, 0);
856
857       /* We need to point into the middle of the vtable.  */
858       vtable_ptr = build2
859         (PLUS_EXPR, TREE_TYPE (vtable_ptr), vtable_ptr,
860          size_binop (MULT_EXPR,
861                      size_int (2 * TARGET_VTABLE_DATA_ENTRY_DISTANCE),
862                      TYPE_SIZE_UNIT (vtable_entry_type)));
863       
864       ti->vtable = vtable_ptr;
865     }
866
867   init = tree_cons (NULL_TREE, vtable_ptr, init);
868
869   init = tree_cons (NULL_TREE, decay_conversion (name_decl), init);
870
871   init = build_constructor_from_list (NULL_TREE, nreverse (init));
872   TREE_CONSTANT (init) = 1;
873   TREE_INVARIANT (init) = 1;
874   TREE_STATIC (init) = 1;
875   init = tree_cons (NULL_TREE, init, NULL_TREE);
876
877   return init;
878 }
879
880 /* Return the CONSTRUCTOR expr for a type_info of TYPE. TI provides the
881    information about the particular type_info derivation, which adds no
882    additional fields to the type_info base.  */
883
884 static tree
885 generic_initializer (tinfo_s *ti, tree target)
886 {
887   tree init = tinfo_base_init (ti, target);
888   
889   init = build_constructor_from_list (NULL_TREE, init);
890   TREE_CONSTANT (init) = 1;
891   TREE_INVARIANT (init) = 1;
892   TREE_STATIC (init) = 1;
893   return init;
894 }
895
896 /* Return the CONSTRUCTOR expr for a type_info of pointer TYPE.
897    TI provides information about the particular type_info derivation,
898    which adds target type and qualifier flags members to the type_info base.  */
899
900 static tree
901 ptr_initializer (tinfo_s *ti, tree target)
902 {
903   tree init = tinfo_base_init (ti, target);
904   tree to = TREE_TYPE (target);
905   int flags = qualifier_flags (to);
906   bool incomplete = target_incomplete_p (to);
907
908   if (incomplete)
909     flags |= 8;
910   init = tree_cons (NULL_TREE, build_int_cst (NULL_TREE, flags), init);
911   init = tree_cons (NULL_TREE,
912                     get_tinfo_ptr (TYPE_MAIN_VARIANT (to)),
913                     init);
914
915   init = build_constructor_from_list (NULL_TREE, nreverse (init));
916   TREE_CONSTANT (init) = 1;
917   TREE_INVARIANT (init) = 1;
918   TREE_STATIC (init) = 1;
919   return init;
920 }
921
922 /* Return the CONSTRUCTOR expr for a type_info of pointer to member data TYPE.
923    TI provides information about the particular type_info derivation,
924    which adds class, target type and qualifier flags members to the type_info
925    base.  */
926
927 static tree
928 ptm_initializer (tinfo_s *ti, tree target)
929 {
930   tree init = tinfo_base_init (ti, target);
931   tree to = TYPE_PTRMEM_POINTED_TO_TYPE (target);
932   tree klass = TYPE_PTRMEM_CLASS_TYPE (target);
933   int flags = qualifier_flags (to);
934   bool incomplete = target_incomplete_p (to);
935
936   if (incomplete)
937     flags |= 0x8;
938   if (!COMPLETE_TYPE_P (klass))
939     flags |= 0x10;
940   init = tree_cons (NULL_TREE, build_int_cst (NULL_TREE, flags), init);
941   init = tree_cons (NULL_TREE,
942                     get_tinfo_ptr (TYPE_MAIN_VARIANT (to)),
943                     init);
944   init = tree_cons (NULL_TREE,
945                     get_tinfo_ptr (klass),
946                     init);
947   
948   init = build_constructor_from_list (NULL_TREE, nreverse (init));
949   TREE_CONSTANT (init) = 1;
950   TREE_INVARIANT (init) = 1;
951   TREE_STATIC (init) = 1;
952   return init;
953 }
954
955 /* Return the CONSTRUCTOR expr for a type_info of class TYPE.
956    TI provides information about the particular __class_type_info derivation,
957    which adds hint flags and TRAIL initializers to the type_info base.  */
958
959 static tree
960 class_initializer (tinfo_s *ti, tree target, tree trail)
961 {
962   tree init = tinfo_base_init (ti, target);
963
964   TREE_CHAIN (init) = trail;
965   init = build_constructor_from_list (NULL_TREE, init);
966   TREE_CONSTANT (init) = 1;
967   TREE_INVARIANT (init) = 1;
968   TREE_STATIC (init) = 1;
969   return init;
970 }
971
972 /* Returns true if the typeinfo for type should be placed in
973    the runtime library.  */
974
975 static bool
976 typeinfo_in_lib_p (tree type)
977 {
978   /* The typeinfo objects for `T*' and `const T*' are in the runtime
979      library for simple types T.  */
980   if (TREE_CODE (type) == POINTER_TYPE
981       && (cp_type_quals (TREE_TYPE (type)) == TYPE_QUAL_CONST
982           || cp_type_quals (TREE_TYPE (type)) == TYPE_UNQUALIFIED))
983     type = TREE_TYPE (type);
984
985   switch (TREE_CODE (type))
986     {
987     case INTEGER_TYPE:
988     case BOOLEAN_TYPE:
989     case REAL_TYPE:
990     case VOID_TYPE:
991       return true;
992
993     default:
994       return false;
995     }
996 }
997
998 /* Generate the initializer for the type info describing TYPE.  TK_INDEX is
999    the index of the descriptor in the tinfo_desc vector. */
1000
1001 static tree
1002 get_pseudo_ti_init (tree type, unsigned tk_index)
1003 {
1004   tinfo_s *ti = VEC_index (tinfo_s, tinfo_descs, tk_index);
1005   
1006   gcc_assert (at_eof);
1007   switch (tk_index)
1008     {
1009     case TK_POINTER_MEMBER_TYPE:
1010       return ptm_initializer (ti, type);
1011       
1012     case TK_POINTER_TYPE:
1013       return ptr_initializer (ti, type);
1014       
1015     case TK_BUILTIN_TYPE:
1016     case TK_ENUMERAL_TYPE:
1017     case TK_FUNCTION_TYPE:
1018     case TK_ARRAY_TYPE:
1019       return generic_initializer (ti, type);
1020
1021     case TK_CLASS_TYPE:
1022       return class_initializer (ti, type, NULL_TREE);
1023
1024     case TK_SI_CLASS_TYPE:
1025       {
1026         tree base_binfo = BINFO_BASE_BINFO (TYPE_BINFO (type), 0);
1027         tree tinfo = get_tinfo_ptr (BINFO_TYPE (base_binfo));
1028         tree base_inits = tree_cons (NULL_TREE, tinfo, NULL_TREE);
1029
1030         /* get_tinfo_ptr might have reallocated the tinfo_descs vector.  */
1031         ti = VEC_index (tinfo_s, tinfo_descs, tk_index);
1032         return class_initializer (ti, type, base_inits);
1033       }
1034
1035     default:
1036       {
1037         int hint = ((CLASSTYPE_REPEATED_BASE_P (type) << 0)
1038                     | (CLASSTYPE_DIAMOND_SHAPED_P (type) << 1));
1039         tree binfo = TYPE_BINFO (type);
1040         int nbases = BINFO_N_BASE_BINFOS (binfo);
1041         VEC(tree,gc) *base_accesses = BINFO_BASE_ACCESSES (binfo);
1042         tree base_inits = NULL_TREE;
1043         int ix;
1044           
1045         gcc_assert (tk_index >= TK_FIXED);
1046       
1047         /* Generate the base information initializer.  */
1048         for (ix = nbases; ix--;)
1049           {
1050             tree base_binfo = BINFO_BASE_BINFO (binfo, ix);
1051             tree base_init = NULL_TREE;
1052             int flags = 0;
1053             tree tinfo;
1054             tree offset;
1055             
1056             if (VEC_index (tree, base_accesses, ix) == access_public_node)
1057               flags |= 2;
1058             tinfo = get_tinfo_ptr (BINFO_TYPE (base_binfo));
1059             if (BINFO_VIRTUAL_P (base_binfo))
1060               {
1061                 /* We store the vtable offset at which the virtual
1062                    base offset can be found.  */
1063                 offset = BINFO_VPTR_FIELD (base_binfo);
1064                 offset = convert (sizetype, offset);
1065                 flags |= 1;
1066               }
1067             else
1068               offset = BINFO_OFFSET (base_binfo);
1069             
1070             /* Combine offset and flags into one field.  */
1071             offset = cp_build_binary_op (LSHIFT_EXPR, offset,
1072                                          build_int_cst (NULL_TREE, 8));
1073             offset = cp_build_binary_op (BIT_IOR_EXPR, offset,
1074                                          build_int_cst (NULL_TREE, flags));
1075             base_init = tree_cons (NULL_TREE, offset, base_init);
1076             base_init = tree_cons (NULL_TREE, tinfo, base_init);
1077             base_init = build_constructor_from_list (NULL_TREE, base_init);
1078             base_inits = tree_cons (NULL_TREE, base_init, base_inits);
1079           }
1080         base_inits = build_constructor_from_list (NULL_TREE, base_inits);
1081         base_inits = tree_cons (NULL_TREE, base_inits, NULL_TREE);
1082         /* Prepend the number of bases.  */
1083         base_inits = tree_cons (NULL_TREE,
1084                                 build_int_cst (NULL_TREE, nbases),
1085                                 base_inits);
1086         /* Prepend the hint flags.  */
1087         base_inits = tree_cons (NULL_TREE,
1088                                 build_int_cst (NULL_TREE, hint),
1089                                 base_inits);
1090
1091         /* get_tinfo_ptr might have reallocated the tinfo_descs vector.  */
1092         ti = VEC_index (tinfo_s, tinfo_descs, tk_index);
1093         return class_initializer (ti, type, base_inits);
1094       }
1095     }
1096 }
1097
1098 /* Generate the RECORD_TYPE containing the data layout of a type_info
1099    derivative as used by the runtime. This layout must be consistent with
1100    that defined in the runtime support. Also generate the VAR_DECL for the
1101    type's vtable. We explicitly manage the vtable member, and name it for
1102    real type as used in the runtime. The RECORD type has a different name,
1103    to avoid collisions.  Return a TREE_LIST who's TINFO_PSEUDO_TYPE
1104    is the generated type and TINFO_VTABLE_NAME is the name of the
1105    vtable.  We have to delay generating the VAR_DECL of the vtable
1106    until the end of the translation, when we'll have seen the library
1107    definition, if there was one.
1108
1109    REAL_NAME is the runtime's name of the type. Trailing arguments are
1110    additional FIELD_DECL's for the structure. The final argument must be
1111    NULL.  */
1112
1113 static void
1114 create_pseudo_type_info (int tk, const char *real_name, ...)
1115 {
1116   tinfo_s *ti;
1117   tree pseudo_type;
1118   char *pseudo_name;
1119   tree fields;
1120   tree field_decl;
1121   va_list ap;
1122
1123   va_start (ap, real_name);
1124
1125   /* Generate the pseudo type name.  */
1126   pseudo_name = (char *) alloca (strlen (real_name) + 30);
1127   strcpy (pseudo_name, real_name);
1128   strcat (pseudo_name, "_pseudo");
1129   if (tk >= TK_FIXED)
1130     sprintf (pseudo_name + strlen (pseudo_name), "%d", tk - TK_FIXED);
1131
1132   /* First field is the pseudo type_info base class.  */
1133   fields = build_decl (FIELD_DECL, NULL_TREE,
1134                        VEC_index (tinfo_s, tinfo_descs,
1135                                   TK_TYPE_INFO_TYPE)->type);
1136
1137   /* Now add the derived fields.  */
1138   while ((field_decl = va_arg (ap, tree)))
1139     {
1140       TREE_CHAIN (field_decl) = fields;
1141       fields = field_decl;
1142     }
1143
1144   /* Create the pseudo type.  */
1145   pseudo_type = make_aggr_type (RECORD_TYPE);
1146   finish_builtin_struct (pseudo_type, pseudo_name, fields, NULL_TREE);
1147   CLASSTYPE_AS_BASE (pseudo_type) = pseudo_type;
1148
1149   ti = VEC_index (tinfo_s, tinfo_descs, tk);
1150   ti->type = cp_build_qualified_type (pseudo_type, TYPE_QUAL_CONST);
1151   ti->name = get_identifier (real_name);
1152   ti->vtable = NULL_TREE;
1153
1154   va_end (ap);
1155 }
1156
1157 /* Return the index of a pseudo type info type node used to describe
1158    TYPE.  TYPE must be a complete type (or cv void), except at the end
1159    of the translation unit.  */
1160
1161 static unsigned
1162 get_pseudo_ti_index (tree type)
1163 {
1164   unsigned ix;
1165   
1166   switch (TREE_CODE (type))
1167     {
1168     case OFFSET_TYPE:
1169       ix = TK_POINTER_MEMBER_TYPE;
1170       break;
1171       
1172     case POINTER_TYPE:
1173       ix = TK_POINTER_TYPE;
1174       break;
1175       
1176     case ENUMERAL_TYPE:
1177       ix = TK_ENUMERAL_TYPE;
1178       break;
1179       
1180     case FUNCTION_TYPE:
1181       ix = TK_FUNCTION_TYPE;
1182       break;
1183       
1184     case ARRAY_TYPE:
1185       ix = TK_ARRAY_TYPE;
1186       break;
1187       
1188     case UNION_TYPE:
1189     case RECORD_TYPE:
1190       if (TYPE_PTRMEMFUNC_P (type))
1191         {
1192           ix = TK_POINTER_MEMBER_TYPE;
1193           break;
1194         }
1195       else if (!COMPLETE_TYPE_P (type))
1196         {
1197           if (!at_eof)
1198             cxx_incomplete_type_error (NULL_TREE, type);
1199           ix = TK_CLASS_TYPE;
1200           break;
1201         }
1202       else if (!BINFO_N_BASE_BINFOS (TYPE_BINFO (type)))
1203         {
1204           ix = TK_CLASS_TYPE;
1205           break;
1206         }
1207       else
1208         {
1209           tree binfo = TYPE_BINFO (type);
1210           VEC(tree,gc) *base_accesses = BINFO_BASE_ACCESSES (binfo);
1211           tree base_binfo = BINFO_BASE_BINFO (binfo, 0);
1212           int num_bases = BINFO_N_BASE_BINFOS (binfo);
1213
1214           if (num_bases == 1
1215               && VEC_index (tree, base_accesses, 0) == access_public_node
1216               && !BINFO_VIRTUAL_P (base_binfo)
1217               && integer_zerop (BINFO_OFFSET (base_binfo)))
1218             {
1219               /* single non-virtual public.  */
1220               ix = TK_SI_CLASS_TYPE;
1221               break;
1222             }
1223           else
1224             {
1225               tinfo_s *ti;
1226               tree array_domain, base_array;
1227
1228               ix = TK_FIXED + num_bases;
1229               if (VEC_length (tinfo_s, tinfo_descs) <= ix)
1230                 {
1231                   /* too short, extend.  */
1232                   unsigned len = VEC_length (tinfo_s, tinfo_descs);
1233                   
1234                   VEC_safe_grow (tinfo_s, gc, tinfo_descs, ix + 1);
1235                   while (VEC_iterate (tinfo_s, tinfo_descs, len++, ti))
1236                     ti->type = ti->vtable = ti->name = NULL_TREE;
1237                 }
1238               else if (VEC_index (tinfo_s, tinfo_descs, ix)->type)
1239                 /* already created.  */
1240                 break;
1241
1242               /* Create the array of __base_class_type_info entries.
1243                  G++ 3.2 allocated an array that had one too many
1244                  entries, and then filled that extra entries with
1245                  zeros.  */
1246               if (abi_version_at_least (2))
1247                 array_domain = build_index_type (size_int (num_bases - 1));
1248               else
1249                 array_domain = build_index_type (size_int (num_bases));
1250               base_array =
1251                 build_array_type (VEC_index (tinfo_s, tinfo_descs,
1252                                              TK_BASE_TYPE)->type,
1253                                   array_domain);
1254
1255               push_nested_namespace (abi_node);
1256               create_pseudo_type_info
1257                 (ix, "__vmi_class_type_info",
1258                  build_decl (FIELD_DECL, NULL_TREE, integer_type_node),
1259                  build_decl (FIELD_DECL, NULL_TREE, integer_type_node),
1260                  build_decl (FIELD_DECL, NULL_TREE, base_array),
1261                  NULL);
1262               pop_nested_namespace (abi_node);
1263               break;
1264             }
1265         }
1266     default:
1267       ix = TK_BUILTIN_TYPE;
1268       break;
1269     }
1270   return ix;
1271 }
1272
1273 /* Make sure the required builtin types exist for generating the type_info
1274    variable definitions.  */
1275
1276 static void
1277 create_tinfo_types (void)
1278 {
1279   tinfo_s *ti;
1280   
1281   gcc_assert (!tinfo_descs);
1282
1283   VEC_safe_grow (tinfo_s, gc, tinfo_descs, TK_FIXED);
1284   
1285   push_nested_namespace (abi_node);
1286
1287   /* Create the internal type_info structure. This is used as a base for
1288      the other structures.  */
1289   {
1290     tree field, fields;
1291
1292     field = build_decl (FIELD_DECL, NULL_TREE, const_ptr_type_node);
1293     fields = field;
1294
1295     field = build_decl (FIELD_DECL, NULL_TREE, const_string_type_node);
1296     TREE_CHAIN (field) = fields;
1297     fields = field;
1298
1299     ti = VEC_index (tinfo_s, tinfo_descs, TK_TYPE_INFO_TYPE);
1300     ti->type = make_aggr_type (RECORD_TYPE);
1301     ti->vtable = NULL_TREE;
1302     ti->name = NULL_TREE;
1303     finish_builtin_struct (ti->type, "__type_info_pseudo",
1304                            fields, NULL_TREE);
1305     TYPE_HAS_CONSTRUCTOR (ti->type) = 1;
1306   }
1307
1308   /* Fundamental type_info */
1309   create_pseudo_type_info (TK_BUILTIN_TYPE, "__fundamental_type_info", NULL);
1310
1311   /* Array, function and enum type_info. No additional fields.  */
1312   create_pseudo_type_info (TK_ARRAY_TYPE, "__array_type_info", NULL);
1313   create_pseudo_type_info (TK_FUNCTION_TYPE, "__function_type_info", NULL);
1314   create_pseudo_type_info (TK_ENUMERAL_TYPE, "__enum_type_info", NULL);
1315   
1316   /* Class type_info.  No additional fields.  */
1317   create_pseudo_type_info (TK_CLASS_TYPE, "__class_type_info", NULL);
1318   
1319   /* Single public non-virtual base class. Add pointer to base class. 
1320      This is really a descendant of __class_type_info.  */
1321   create_pseudo_type_info (TK_SI_CLASS_TYPE, "__si_class_type_info",
1322             build_decl (FIELD_DECL, NULL_TREE, type_info_ptr_type),
1323             NULL);
1324
1325   /* Base class internal helper. Pointer to base type, offset to base,
1326      flags.  */
1327   {
1328     tree field, fields;
1329
1330     field = build_decl (FIELD_DECL, NULL_TREE, type_info_ptr_type);
1331     fields = field;
1332
1333     field = build_decl (FIELD_DECL, NULL_TREE, integer_types[itk_long]);
1334     TREE_CHAIN (field) = fields;
1335     fields = field;
1336   
1337     ti = VEC_index (tinfo_s, tinfo_descs, TK_BASE_TYPE);
1338     
1339     ti->type = make_aggr_type (RECORD_TYPE);
1340     ti->vtable = NULL_TREE;
1341     ti->name = NULL_TREE;
1342     finish_builtin_struct (ti->type, "__base_class_type_info_pseudo",
1343                            fields, NULL_TREE);
1344     TYPE_HAS_CONSTRUCTOR (ti->type) = 1;
1345   }
1346
1347   /* Pointer type_info. Adds two fields, qualification mask
1348      and pointer to the pointed to type.  This is really a descendant of
1349      __pbase_type_info.  */
1350   create_pseudo_type_info (TK_POINTER_TYPE, "__pointer_type_info",
1351        build_decl (FIELD_DECL, NULL_TREE, integer_type_node),
1352        build_decl (FIELD_DECL, NULL_TREE, type_info_ptr_type),
1353        NULL);
1354
1355   /* Pointer to member data type_info.  Add qualifications flags,
1356      pointer to the member's type info and pointer to the class.
1357      This is really a descendant of __pbase_type_info.  */
1358   create_pseudo_type_info (TK_POINTER_MEMBER_TYPE,
1359        "__pointer_to_member_type_info",
1360         build_decl (FIELD_DECL, NULL_TREE, integer_type_node),
1361         build_decl (FIELD_DECL, NULL_TREE, type_info_ptr_type),
1362         build_decl (FIELD_DECL, NULL_TREE, type_info_ptr_type),
1363         NULL);
1364
1365   pop_nested_namespace (abi_node);
1366 }
1367
1368 /* Emit the type_info descriptors which are guaranteed to be in the runtime
1369    support.  Generating them here guarantees consistency with the other
1370    structures.  We use the following heuristic to determine when the runtime
1371    is being generated.  If std::__fundamental_type_info is defined, and its
1372    destructor is defined, then the runtime is being built.  */
1373
1374 void
1375 emit_support_tinfos (void)
1376 {
1377   static tree *const fundamentals[] =
1378   {
1379     &void_type_node,
1380     &boolean_type_node,
1381     &wchar_type_node,
1382     &char_type_node, &signed_char_type_node, &unsigned_char_type_node,
1383     &short_integer_type_node, &short_unsigned_type_node,
1384     &integer_type_node, &unsigned_type_node,
1385     &long_integer_type_node, &long_unsigned_type_node,
1386     &long_long_integer_type_node, &long_long_unsigned_type_node,
1387     &float_type_node, &double_type_node, &long_double_type_node,
1388     0
1389   };
1390   int ix;
1391   tree bltn_type, dtor;
1392
1393   push_nested_namespace (abi_node);
1394   bltn_type = xref_tag (class_type,
1395                         get_identifier ("__fundamental_type_info"),
1396                         /*tag_scope=*/ts_current, false);
1397   pop_nested_namespace (abi_node);
1398   if (!COMPLETE_TYPE_P (bltn_type))
1399     return;
1400   dtor = CLASSTYPE_DESTRUCTORS (bltn_type);
1401   if (!dtor || DECL_EXTERNAL (dtor))
1402     return;
1403   doing_runtime = 1;
1404   for (ix = 0; fundamentals[ix]; ix++)
1405     {
1406       tree bltn = *fundamentals[ix];
1407       tree types[3];
1408       int i;
1409
1410       types[0] = bltn;
1411       types[1] = build_pointer_type (bltn);
1412       types[2] = build_pointer_type (build_qualified_type (bltn,
1413                                                            TYPE_QUAL_CONST));
1414
1415       for (i = 0; i < 3; ++i)
1416         {
1417           tree tinfo;
1418
1419           tinfo = get_tinfo_decl (types[i]);
1420           TREE_USED (tinfo) = 1;
1421           mark_needed (tinfo);
1422           /* The C++ ABI requires that these objects be COMDAT.  But,
1423              On systems without weak symbols, initialized COMDAT
1424              objects are emitted with internal linkage.  (See
1425              comdat_linkage for details.)  Since we want these objects
1426              to have external linkage so that copies do not have to be
1427              emitted in code outside the runtime library, we make them
1428              non-COMDAT here.  */
1429           if (!flag_weak)
1430             {
1431               gcc_assert (TREE_PUBLIC (tinfo) && !DECL_COMDAT (tinfo));
1432               DECL_INTERFACE_KNOWN (tinfo) = 1;
1433             }
1434         }
1435     }
1436 }
1437
1438 /* Finish a type info decl. DECL_PTR is a pointer to an unemitted
1439    tinfo decl.  Determine whether it needs emitting, and if so
1440    generate the initializer.  */
1441
1442 bool
1443 emit_tinfo_decl (tree decl)
1444 {
1445   tree type = TREE_TYPE (DECL_NAME (decl));
1446   int in_library = typeinfo_in_lib_p (type);
1447
1448   gcc_assert (DECL_TINFO_P (decl));
1449
1450   if (in_library)
1451     {
1452       if (doing_runtime)
1453         DECL_EXTERNAL (decl) = 0;
1454       else
1455         {
1456           /* If we're not in the runtime, then DECL (which is already
1457              DECL_EXTERNAL) will not be defined here.  */
1458           DECL_INTERFACE_KNOWN (decl) = 1;
1459           return false;
1460         }
1461     }
1462   else if (involves_incomplete_p (type))
1463     {
1464       if (!decl_needed_p (decl))
1465         return false;
1466       /* If TYPE involves an incomplete class type, then the typeinfo
1467          object will be emitted with internal linkage.  There is no
1468          way to know whether or not types are incomplete until the end
1469          of the compilation, so this determination must be deferred
1470          until this point.  */
1471       TREE_PUBLIC (decl) = 0;
1472       DECL_EXTERNAL (decl) = 0;
1473       DECL_INTERFACE_KNOWN (decl) = 1;
1474     }
1475
1476   import_export_decl (decl);
1477   if (DECL_NOT_REALLY_EXTERN (decl) && decl_needed_p (decl))
1478     {
1479       tree init;
1480       
1481       DECL_EXTERNAL (decl) = 0;
1482       init = get_pseudo_ti_init (type, get_pseudo_ti_index (type));
1483       DECL_INITIAL (decl) = init;
1484       mark_used (decl);
1485       cp_finish_decl (decl, init, NULL_TREE, 0);
1486       return true;
1487     }
1488   else
1489     return false;
1490 }
1491
1492 #include "gt-cp-rtti.h"