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