OSDN Git Service

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