OSDN Git Service

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