OSDN Git Service

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