rtti.c revision 169689
150397Sobrien/* RunTime Type Identification
2169689Skan   Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
3169689Skan   2005, 2006
490075Sobrien   Free Software Foundation, Inc.
550397Sobrien   Mostly written by Jason Merrill (jason@cygnus.com).
650397Sobrien
7132718SkanThis file is part of GCC.
850397Sobrien
9132718SkanGCC is free software; you can redistribute it and/or modify
1050397Sobrienit under the terms of the GNU General Public License as published by
1150397Sobrienthe Free Software Foundation; either version 2, or (at your option)
1250397Sobrienany later version.
1350397Sobrien
14132718SkanGCC is distributed in the hope that it will be useful,
1550397Sobrienbut WITHOUT ANY WARRANTY; without even the implied warranty of
1650397SobrienMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
1750397SobrienGNU General Public License for more details.
1850397Sobrien
1950397SobrienYou should have received a copy of the GNU General Public License
20132718Skanalong with GCC; see the file COPYING.  If not, write to
21169689Skanthe Free Software Foundation, 51 Franklin Street, Fifth Floor,
22169689SkanBoston, MA 02110-1301, USA.  */
2350397Sobrien
2450397Sobrien#include "config.h"
2550397Sobrien#include "system.h"
26132718Skan#include "coretypes.h"
27132718Skan#include "tm.h"
2850397Sobrien#include "tree.h"
2950397Sobrien#include "cp-tree.h"
3050397Sobrien#include "flags.h"
3150397Sobrien#include "output.h"
3250397Sobrien#include "assert.h"
3350397Sobrien#include "toplev.h"
34132718Skan#include "convert.h"
3550397Sobrien
36102780Skan/* C++ returns type information to the user in struct type_info
37102780Skan   objects. We also use type information to implement dynamic_cast and
38102780Skan   exception handlers. Type information for a particular type is
39102780Skan   indicated with an ABI defined structure derived from type_info.
40102780Skan   This would all be very straight forward, but for the fact that the
41102780Skan   runtime library provides the definitions of the type_info structure
42102780Skan   and the ABI defined derived classes. We cannot build declarations
43102780Skan   of them directly in the compiler, but we need to layout objects of
44102780Skan   their type.  Somewhere we have to lie.
45102780Skan
46102780Skan   We define layout compatible POD-structs with compiler-defined names
47102780Skan   and generate the appropriate initializations for them (complete
48102780Skan   with explicit mention of their vtable). When we have to provide a
49102780Skan   type_info to the user we reinterpret_cast the internal compiler
50102780Skan   type to type_info.  A well formed program can only explicitly refer
51102780Skan   to the type_infos of complete types (& cv void).  However, we chain
52102780Skan   pointer type_infos to the pointed-to-type, and that can be
53102780Skan   incomplete.  We only need the addresses of such incomplete
54102780Skan   type_info objects for static initialization.
55102780Skan
56102780Skan   The type information VAR_DECL of a type is held on the
57102780Skan   IDENTIFIER_GLOBAL_VALUE of the type's mangled name. That VAR_DECL
58102780Skan   will be the internal type.  It will usually have the correct
59102780Skan   internal type reflecting the kind of type it represents (pointer,
60102780Skan   array, function, class, inherited class, etc).  When the type it
61102780Skan   represents is incomplete, it will have the internal type
62102780Skan   corresponding to type_info.  That will only happen at the end of
63102780Skan   translation, when we are emitting the type info objects.  */
64102780Skan
65169689Skan/* Auxiliary data we hold for each type_info derived object we need.  */
66169689Skantypedef struct tinfo_s GTY (())
67169689Skan{
68169689Skan  tree type;  /* The RECORD_TYPE for this type_info object */
6950397Sobrien
70169689Skan  tree vtable; /* The VAR_DECL of the vtable.  Only filled at end of
71169689Skan		  translation.  */
7250397Sobrien
73169689Skan  tree name;  /* IDENTIFIER_NODE for the ABI specified name of
74169689Skan		 the type_info derived type.  */
75169689Skan} tinfo_s;
76169689Skan
77169689SkanDEF_VEC_O(tinfo_s);
78169689SkanDEF_VEC_ALLOC_O(tinfo_s,gc);
79169689Skan
80169689Skantypedef enum tinfo_kind
81169689Skan{
82169689Skan  TK_TYPE_INFO_TYPE,    /* std::type_info */
83169689Skan  TK_BASE_TYPE,		/* abi::__base_class_type_info */
84169689Skan  TK_BUILTIN_TYPE,	/* abi::__fundamental_type_info */
85169689Skan  TK_ARRAY_TYPE,	/* abi::__array_type_info */
86169689Skan  TK_FUNCTION_TYPE,	/* abi::__function_type_info */
87169689Skan  TK_ENUMERAL_TYPE,	/* abi::__enum_type_info */
88169689Skan  TK_POINTER_TYPE,	/* abi::__pointer_type_info */
89169689Skan  TK_POINTER_MEMBER_TYPE, /* abi::__pointer_to_member_type_info */
90169689Skan  TK_CLASS_TYPE,	/* abi::__class_type_info */
91169689Skan  TK_SI_CLASS_TYPE,	/* abi::__si_class_type_info */
92169689Skan  TK_FIXED		/* end of fixed descriptors. */
93169689Skan  /* ...		   abi::__vmi_type_info<I> */
94169689Skan} tinfo_kind;
95169689Skan
96169689Skan/* A vector of all tinfo decls that haven't yet been emitted.  */
97169689SkanVEC(tree,gc) *unemitted_tinfo_decls;
98169689Skan
99169689Skan/* A vector of all type_info derived types we need.  The first few are
100169689Skan   fixed and created early. The remainder are for multiple inheritance
101169689Skan   and are generated as needed. */
102169689Skanstatic GTY (()) VEC(tinfo_s,gc) *tinfo_descs;
103169689Skan
104132718Skanstatic tree build_headof (tree);
105132718Skanstatic tree ifnonnull (tree, tree);
106132718Skanstatic tree tinfo_name (tree);
107132718Skanstatic tree build_dynamic_cast_1 (tree, tree);
108132718Skanstatic tree throw_bad_cast (void);
109132718Skanstatic tree throw_bad_typeid (void);
110132718Skanstatic tree get_tinfo_decl_dynamic (tree);
111132718Skanstatic tree get_tinfo_ptr (tree);
112132718Skanstatic bool typeid_ok_p (void);
113132718Skanstatic int qualifier_flags (tree);
114132718Skanstatic bool target_incomplete_p (tree);
115169689Skanstatic tree tinfo_base_init (tinfo_s *, tree);
116169689Skanstatic tree generic_initializer (tinfo_s *, tree);
117169689Skanstatic tree ptr_initializer (tinfo_s *, tree);
118169689Skanstatic tree ptm_initializer (tinfo_s *, tree);
119169689Skanstatic tree class_initializer (tinfo_s *, tree, tree);
120169689Skanstatic void create_pseudo_type_info (int, const char *, ...);
121169689Skanstatic tree get_pseudo_ti_init (tree, unsigned);
122169689Skanstatic unsigned get_pseudo_ti_index (tree);
123132718Skanstatic void create_tinfo_types (void);
124132718Skanstatic bool typeinfo_in_lib_p (tree);
125132718Skan
12690075Sobrienstatic int doing_runtime = 0;
12750397Sobrien
128102780Skan
129102780Skan/* Declare language defined type_info type and a pointer to const
130102780Skan   type_info.  This is incomplete here, and will be completed when
131102780Skan   the user #includes <typeinfo>.  There are language defined
132102780Skan   restrictions on what can be done until that is included.  Create
133102780Skan   the internal versions of the ABI types.  */
134102780Skan
13550397Sobrienvoid
136132718Skaninit_rtti_processing (void)
13750397Sobrien{
138169689Skan  tree type_info_type;
139132718Skan
14090075Sobrien  push_namespace (std_identifier);
141169689Skan  type_info_type = xref_tag (class_type, get_identifier ("type_info"),
142169689Skan			     /*tag_scope=*/ts_current, false);
14390075Sobrien  pop_namespace ();
144169689Skan  const_type_info_type_node
145169689Skan    = build_qualified_type (type_info_type, TYPE_QUAL_CONST);
146169689Skan  type_info_ptr_type = build_pointer_type (const_type_info_type_node);
147102780Skan
148169689Skan  unemitted_tinfo_decls = VEC_alloc (tree, gc, 124);
149132718Skan
150102780Skan  create_tinfo_types ();
15150397Sobrien}
15250397Sobrien
15350397Sobrien/* Given the expression EXP of type `class *', return the head of the
15450397Sobrien   object pointed to by EXP with type cv void*, if the class has any
15590075Sobrien   virtual functions (TYPE_POLYMORPHIC_P), else just return the
15650397Sobrien   expression.  */
15750397Sobrien
15850397Sobrienstatic tree
159132718Skanbuild_headof (tree exp)
16050397Sobrien{
16150397Sobrien  tree type = TREE_TYPE (exp);
16250397Sobrien  tree offset;
16390075Sobrien  tree index;
16450397Sobrien
165169689Skan  gcc_assert (TREE_CODE (type) == POINTER_TYPE);
16650397Sobrien  type = TREE_TYPE (type);
16750397Sobrien
16890075Sobrien  if (!TYPE_POLYMORPHIC_P (type))
16950397Sobrien    return exp;
17050397Sobrien
17150397Sobrien  /* We use this a couple of times below, protect it.  */
17250397Sobrien  exp = save_expr (exp);
17350397Sobrien
17490075Sobrien  /* The offset-to-top field is at index -2 from the vptr.  */
175169689Skan  index = build_int_cst (NULL_TREE,
176169689Skan			 -2 * TARGET_VTABLE_DATA_ENTRY_DISTANCE);
17750397Sobrien
17890075Sobrien  offset = build_vtbl_ref (build_indirect_ref (exp, NULL), index);
17950397Sobrien
180169689Skan  type = build_qualified_type (ptr_type_node,
18190075Sobrien			       cp_type_quals (TREE_TYPE (exp)));
182169689Skan  return build2 (PLUS_EXPR, type, exp,
183169689Skan		 convert_to_integer (ptrdiff_type_node, offset));
18450397Sobrien}
18550397Sobrien
18650397Sobrien/* Get a bad_cast node for the program to throw...
18750397Sobrien
18850397Sobrien   See libstdc++/exception.cc for __throw_bad_cast */
18950397Sobrien
19050397Sobrienstatic tree
191132718Skanthrow_bad_cast (void)
19250397Sobrien{
19390075Sobrien  tree fn = get_identifier ("__cxa_bad_cast");
194132718Skan  if (!get_global_value_if_present (fn, &fn))
19590075Sobrien    fn = push_throw_library_fn (fn, build_function_type (ptr_type_node,
19690075Sobrien							 void_list_node));
197169689Skan
198169689Skan  return build_cxx_call (fn, NULL_TREE);
19950397Sobrien}
20050397Sobrien
201132718Skan/* Return an expression for "__cxa_bad_typeid()".  The expression
202132718Skan   returned is an lvalue of type "const std::type_info".  */
203132718Skan
20450397Sobrienstatic tree
205132718Skanthrow_bad_typeid (void)
20650397Sobrien{
20790075Sobrien  tree fn = get_identifier ("__cxa_bad_typeid");
208132718Skan  if (!get_global_value_if_present (fn, &fn))
20990075Sobrien    {
210169689Skan      tree t;
211169689Skan
212169689Skan      t = build_reference_type (const_type_info_type_node);
213169689Skan      t = build_function_type (t, void_list_node);
21490075Sobrien      fn = push_throw_library_fn (fn, t);
21590075Sobrien    }
21690075Sobrien
217169689Skan  return build_cxx_call (fn, NULL_TREE);
21850397Sobrien}
21950397Sobrien
220132718Skan/* Return an lvalue expression whose type is "const std::type_info"
221132718Skan   and whose value indicates the type of the expression EXP.  If EXP
222132718Skan   is a reference to a polymorphic class, return the dynamic type;
22350397Sobrien   otherwise return the static type of the expression.  */
22450397Sobrien
22590075Sobrienstatic tree
226132718Skanget_tinfo_decl_dynamic (tree exp)
22750397Sobrien{
22850397Sobrien  tree type;
229132718Skan  tree t;
230169689Skan
231169689Skan  if (error_operand_p (exp))
23250397Sobrien    return error_mark_node;
23350397Sobrien
23450397Sobrien  /* peel back references, so they match.  */
235132718Skan  type = non_reference (TREE_TYPE (exp));
23650397Sobrien
23750397Sobrien  /* Peel off cv qualifiers.  */
23850397Sobrien  type = TYPE_MAIN_VARIANT (type);
239169689Skan
24090075Sobrien  if (!VOID_TYPE_P (type))
24190075Sobrien    type = complete_type_or_else (type, exp);
242169689Skan
24390075Sobrien  if (!type)
24490075Sobrien    return error_mark_node;
24550397Sobrien
24650397Sobrien  /* If exp is a reference to polymorphic type, get the real type_info.  */
24790075Sobrien  if (TYPE_POLYMORPHIC_P (type) && ! resolves_to_fixed_type_p (exp, 0))
24850397Sobrien    {
24950397Sobrien      /* build reference to type_info from vtable.  */
25090075Sobrien      tree index;
25150397Sobrien
25290075Sobrien      /* The RTTI information is at index -1.  */
253169689Skan      index = build_int_cst (NULL_TREE,
254169689Skan			     -1 * TARGET_VTABLE_DATA_ENTRY_DISTANCE);
25590075Sobrien      t = build_vtbl_ref (exp, index);
256169689Skan      t = convert (type_info_ptr_type, t);
25750397Sobrien    }
258132718Skan  else
259132718Skan    /* Otherwise return the type_info for the static type of the expr.  */
260132718Skan    t = get_tinfo_ptr (TYPE_MAIN_VARIANT (type));
26150397Sobrien
262132718Skan  return build_indirect_ref (t, NULL);
26350397Sobrien}
26450397Sobrien
26590075Sobrienstatic bool
266132718Skantypeid_ok_p (void)
26750397Sobrien{
26852284Sobrien  if (! flag_rtti)
26952284Sobrien    {
27052284Sobrien      error ("cannot use typeid with -fno-rtti");
27190075Sobrien      return false;
27252284Sobrien    }
273169689Skan
274169689Skan  if (!COMPLETE_TYPE_P (const_type_info_type_node))
27552284Sobrien    {
27652284Sobrien      error ("must #include <typeinfo> before using typeid");
27790075Sobrien      return false;
27852284Sobrien    }
279169689Skan
28090075Sobrien  return true;
28190075Sobrien}
28290075Sobrien
283132718Skan/* Return an expression for "typeid(EXP)".  The expression returned is
284132718Skan   an lvalue of type "const std::type_info".  */
285132718Skan
28690075Sobrientree
287132718Skanbuild_typeid (tree exp)
28890075Sobrien{
28990075Sobrien  tree cond = NULL_TREE;
29090075Sobrien  int nonnull = 0;
29190075Sobrien
29290075Sobrien  if (exp == error_mark_node || !typeid_ok_p ())
29390075Sobrien    return error_mark_node;
29490075Sobrien
29550397Sobrien  if (processing_template_decl)
296169689Skan    return build_min (TYPEID_EXPR, const_type_info_type_node, exp);
29750397Sobrien
29850397Sobrien  if (TREE_CODE (exp) == INDIRECT_REF
29950397Sobrien      && TREE_CODE (TREE_TYPE (TREE_OPERAND (exp, 0))) == POINTER_TYPE
30090075Sobrien      && TYPE_POLYMORPHIC_P (TREE_TYPE (exp))
30150397Sobrien      && ! resolves_to_fixed_type_p (exp, &nonnull)
30250397Sobrien      && ! nonnull)
30350397Sobrien    {
30450397Sobrien      exp = stabilize_reference (exp);
30550397Sobrien      cond = cp_convert (boolean_type_node, TREE_OPERAND (exp, 0));
30650397Sobrien    }
30750397Sobrien
30890075Sobrien  exp = get_tinfo_decl_dynamic (exp);
30950397Sobrien
31050397Sobrien  if (exp == error_mark_node)
31150397Sobrien    return error_mark_node;
31250397Sobrien
31350397Sobrien  if (cond)
31450397Sobrien    {
31550397Sobrien      tree bad = throw_bad_typeid ();
31650397Sobrien
317169689Skan      exp = build3 (COND_EXPR, TREE_TYPE (exp), cond, exp, bad);
31850397Sobrien    }
31950397Sobrien
320132718Skan  return exp;
32150397Sobrien}
32250397Sobrien
32390075Sobrien/* Generate the NTBS name of a type.  */
32450397Sobrienstatic tree
325132718Skantinfo_name (tree type)
32650397Sobrien{
32790075Sobrien  const char *name;
32890075Sobrien  tree name_string;
32950397Sobrien
33090075Sobrien  name = mangle_type_string (type);
331117395Skan  name_string = fix_string_type (build_string (strlen (name) + 1, name));
33290075Sobrien  return name_string;
33350397Sobrien}
33450397Sobrien
335102780Skan/* Return a VAR_DECL for the internal ABI defined type_info object for
336102780Skan   TYPE. You must arrange that the decl is mark_used, if actually use
337169689Skan   it --- decls in vtables are only used if the vtable is output.  */
33860967Sobrien
33950397Sobrientree
340132718Skanget_tinfo_decl (tree type)
34150397Sobrien{
34250397Sobrien  tree name;
34350397Sobrien  tree d;
34450397Sobrien
345169689Skan  if (variably_modified_type_p (type, /*fn=*/NULL_TREE))
34690075Sobrien    {
347169689Skan      error ("cannot create type information for type %qT because "
348169689Skan	     "it involves types of variable size",
349102780Skan	     type);
35090075Sobrien      return error_mark_node;
35190075Sobrien    }
35290075Sobrien
35350397Sobrien  if (TREE_CODE (type) == METHOD_TYPE)
35450397Sobrien    type = build_function_type (TREE_TYPE (type),
35550397Sobrien				TREE_CHAIN (TYPE_ARG_TYPES (type)));
35650397Sobrien
357110611Skan  /* For a class type, the variable is cached in the type node
358110611Skan     itself.  */
359110611Skan  if (CLASS_TYPE_P (type))
360110611Skan    {
361110611Skan      d = CLASSTYPE_TYPEINFO_VAR (TYPE_MAIN_VARIANT (type));
362110611Skan      if (d)
363110611Skan	return d;
364110611Skan    }
365169689Skan
36690075Sobrien  name = mangle_typeinfo_for_type (type);
36750397Sobrien
36890075Sobrien  d = IDENTIFIER_GLOBAL_VALUE (name);
369102780Skan  if (!d)
37090075Sobrien    {
371169689Skan      int ix = get_pseudo_ti_index (type);
372169689Skan      tinfo_s *ti = VEC_index (tinfo_s, tinfo_descs, ix);
373102780Skan
374169689Skan      d = build_lang_decl (VAR_DECL, name, ti->type);
375169689Skan      SET_DECL_ASSEMBLER_NAME (d, name);
376169689Skan      /* Remember the type it is for.  */
377169689Skan      TREE_TYPE (name) = type;
378169689Skan      DECL_TINFO_P (d) = 1;
37990075Sobrien      DECL_ARTIFICIAL (d) = 1;
380169689Skan      DECL_IGNORED_P (d) = 1;
38190075Sobrien      TREE_READONLY (d) = 1;
38290075Sobrien      TREE_STATIC (d) = 1;
383169689Skan      /* Mark the variable as undefined -- but remember that we can
384169689Skan	 define it later if we need to do so.  */
38590075Sobrien      DECL_EXTERNAL (d) = 1;
386169689Skan      DECL_NOT_REALLY_EXTERN (d) = 1;
387110611Skan      if (CLASS_TYPE_P (type))
388110611Skan	CLASSTYPE_TYPEINFO_VAR (TYPE_MAIN_VARIANT (type)) = d;
389169689Skan      set_linkage_according_to_type (type, d);
390169689Skan      pushdecl_top_level_and_finish (d, NULL_TREE);
391110611Skan
392132718Skan      /* Add decl to the global array of tinfo decls.  */
393169689Skan      VEC_safe_push (tree, gc, unemitted_tinfo_decls, d);
39490075Sobrien    }
395102780Skan
39650397Sobrien  return d;
39750397Sobrien}
39850397Sobrien
399102780Skan/* Return a pointer to a type_info object describing TYPE, suitably
400102780Skan   cast to the language defined type.  */
401102780Skan
402102780Skanstatic tree
403132718Skanget_tinfo_ptr (tree type)
404102780Skan{
405132718Skan  tree decl = get_tinfo_decl (type);
406102780Skan
407132718Skan  mark_used (decl);
408169689Skan  return build_nop (type_info_ptr_type,
409132718Skan		    build_address (decl));
410102780Skan}
411102780Skan
41290075Sobrien/* Return the type_info object for TYPE.  */
41360967Sobrien
41452284Sobrientree
415132718Skanget_typeid (tree type)
41650397Sobrien{
41790075Sobrien  if (type == error_mark_node || !typeid_ok_p ())
41850397Sobrien    return error_mark_node;
419169689Skan
42050397Sobrien  if (processing_template_decl)
421169689Skan    return build_min (TYPEID_EXPR, const_type_info_type_node, type);
42250397Sobrien
42350397Sobrien  /* If the type of the type-id is a reference type, the result of the
42450397Sobrien     typeid expression refers to a type_info object representing the
42550397Sobrien     referenced type.  */
426132718Skan  type = non_reference (type);
42750397Sobrien
42850397Sobrien  /* The top-level cv-qualifiers of the lvalue expression or the type-id
42950397Sobrien     that is the operand of typeid are always ignored.  */
43050397Sobrien  type = TYPE_MAIN_VARIANT (type);
43150397Sobrien
43290075Sobrien  if (!VOID_TYPE_P (type))
43390075Sobrien    type = complete_type_or_else (type, NULL_TREE);
434169689Skan
43590075Sobrien  if (!type)
43690075Sobrien    return error_mark_node;
43752284Sobrien
438102780Skan  return build_indirect_ref (get_tinfo_ptr (type), NULL);
43950397Sobrien}
44050397Sobrien
44150397Sobrien/* Check whether TEST is null before returning RESULT.  If TEST is used in
44250397Sobrien   RESULT, it must have previously had a save_expr applied to it.  */
44350397Sobrien
44450397Sobrienstatic tree
445132718Skanifnonnull (tree test, tree result)
44650397Sobrien{
447169689Skan  return build3 (COND_EXPR, TREE_TYPE (result),
448169689Skan		 build2 (EQ_EXPR, boolean_type_node, test,
449169689Skan			 cp_convert (TREE_TYPE (test), integer_zero_node)),
450169689Skan		 cp_convert (TREE_TYPE (result), integer_zero_node),
451169689Skan		 result);
45250397Sobrien}
45350397Sobrien
45450397Sobrien/* Execute a dynamic cast, as described in section 5.2.6 of the 9/93 working
45550397Sobrien   paper.  */
45650397Sobrien
45750397Sobrienstatic tree
458132718Skanbuild_dynamic_cast_1 (tree type, tree expr)
45950397Sobrien{
46050397Sobrien  enum tree_code tc = TREE_CODE (type);
46190075Sobrien  tree exprtype = TREE_TYPE (expr);
46250397Sobrien  tree dcast_fn;
46352284Sobrien  tree old_expr = expr;
46490075Sobrien  const char *errstr = NULL;
46550397Sobrien
466169689Skan  /* Save casted types in the function's used types hash table.  */
467169689Skan  used_types_insert (type);
468169689Skan
46990075Sobrien  /* T shall be a pointer or reference to a complete class type, or
47090075Sobrien     `pointer to cv void''.  */
47150397Sobrien  switch (tc)
47250397Sobrien    {
47350397Sobrien    case POINTER_TYPE:
47490075Sobrien      if (TREE_CODE (TREE_TYPE (type)) == VOID_TYPE)
47590075Sobrien	break;
476169689Skan      /* Fall through.  */
47790075Sobrien    case REFERENCE_TYPE:
47890075Sobrien      if (! IS_AGGR_TYPE (TREE_TYPE (type)))
47950397Sobrien	{
48090075Sobrien	  errstr = "target is not pointer or reference to class";
48190075Sobrien	  goto fail;
48250397Sobrien	}
48390075Sobrien      if (!COMPLETE_TYPE_P (complete_type (TREE_TYPE (type))))
48490075Sobrien	{
48590075Sobrien	  errstr = "target is not pointer or reference to complete type";
48690075Sobrien	  goto fail;
48790075Sobrien	}
48850397Sobrien      break;
48990075Sobrien
49050397Sobrien    default:
49190075Sobrien      errstr = "target is not pointer or reference";
49250397Sobrien      goto fail;
49350397Sobrien    }
49450397Sobrien
49590075Sobrien  if (tc == POINTER_TYPE)
49690075Sobrien    {
49790075Sobrien      /* If T is a pointer type, v shall be an rvalue of a pointer to
49890075Sobrien	 complete class type, and the result is an rvalue of type T.  */
49990075Sobrien
50090075Sobrien      if (TREE_CODE (exprtype) != POINTER_TYPE)
50190075Sobrien	{
50290075Sobrien	  errstr = "source is not a pointer";
50390075Sobrien	  goto fail;
50490075Sobrien	}
50590075Sobrien      if (! IS_AGGR_TYPE (TREE_TYPE (exprtype)))
50690075Sobrien	{
50790075Sobrien	  errstr = "source is not a pointer to class";
50890075Sobrien	  goto fail;
50990075Sobrien	}
51090075Sobrien      if (!COMPLETE_TYPE_P (complete_type (TREE_TYPE (exprtype))))
51190075Sobrien	{
51290075Sobrien	  errstr = "source is a pointer to incomplete type";
51390075Sobrien	  goto fail;
51490075Sobrien	}
51550397Sobrien    }
51690075Sobrien  else
51790075Sobrien    {
518169689Skan      exprtype = build_reference_type (exprtype);
519169689Skan
52090075Sobrien      /* T is a reference type, v shall be an lvalue of a complete class
52190075Sobrien	 type, and the result is an lvalue of the type referred to by T.  */
52250397Sobrien
52390075Sobrien      if (! IS_AGGR_TYPE (TREE_TYPE (exprtype)))
52490075Sobrien	{
52590075Sobrien	  errstr = "source is not of class type";
52690075Sobrien	  goto fail;
52790075Sobrien	}
52890075Sobrien      if (!COMPLETE_TYPE_P (complete_type (TREE_TYPE (exprtype))))
52990075Sobrien	{
53090075Sobrien	  errstr = "source is of incomplete class type";
53190075Sobrien	  goto fail;
53290075Sobrien	}
533169689Skan
534169689Skan      /* Apply trivial conversion T -> T& for dereferenced ptrs.  */
535169689Skan      expr = convert_to_reference (exprtype, expr, CONV_IMPLICIT,
536169689Skan				   LOOKUP_NORMAL, NULL_TREE);
53790075Sobrien    }
53890075Sobrien
53990075Sobrien  /* The dynamic_cast operator shall not cast away constness.  */
54090075Sobrien  if (!at_least_as_qualified_p (TREE_TYPE (type),
54190075Sobrien				TREE_TYPE (exprtype)))
54290075Sobrien    {
54390075Sobrien      errstr = "conversion casts away constness";
54490075Sobrien      goto fail;
54590075Sobrien    }
54690075Sobrien
54750397Sobrien  /* If *type is an unambiguous accessible base class of *exprtype,
54850397Sobrien     convert statically.  */
54950397Sobrien  {
55090075Sobrien    tree binfo;
55150397Sobrien
55290075Sobrien    binfo = lookup_base (TREE_TYPE (exprtype), TREE_TYPE (type),
553169689Skan			 ba_check, NULL);
55452284Sobrien
55590075Sobrien    if (binfo)
55652284Sobrien      {
55790075Sobrien	expr = build_base_path (PLUS_EXPR, convert_from_reference (expr),
55890075Sobrien				binfo, 0);
55990075Sobrien	if (TREE_CODE (exprtype) == POINTER_TYPE)
560169689Skan	  expr = rvalue (expr);
56190075Sobrien	return expr;
56252284Sobrien      }
56350397Sobrien  }
56450397Sobrien
56550397Sobrien  /* Otherwise *exprtype must be a polymorphic class (have a vtbl).  */
56690075Sobrien  if (TYPE_POLYMORPHIC_P (TREE_TYPE (exprtype)))
56750397Sobrien    {
56850397Sobrien      tree expr1;
56950397Sobrien      /* if TYPE is `void *', return pointer to complete object.  */
57090075Sobrien      if (tc == POINTER_TYPE && VOID_TYPE_P (TREE_TYPE (type)))
57150397Sobrien	{
57250397Sobrien	  /* if b is an object, dynamic_cast<void *>(&b) == (void *)&b.  */
57350397Sobrien	  if (TREE_CODE (expr) == ADDR_EXPR
57450397Sobrien	      && TREE_CODE (TREE_OPERAND (expr, 0)) == VAR_DECL
57550397Sobrien	      && TREE_CODE (TREE_TYPE (TREE_OPERAND (expr, 0))) == RECORD_TYPE)
57650397Sobrien	    return build1 (NOP_EXPR, type, expr);
57750397Sobrien
57850397Sobrien	  /* Since expr is used twice below, save it.  */
57950397Sobrien	  expr = save_expr (expr);
58050397Sobrien
58150397Sobrien	  expr1 = build_headof (expr);
58250397Sobrien	  if (TREE_TYPE (expr1) != type)
58350397Sobrien	    expr1 = build1 (NOP_EXPR, type, expr1);
58450397Sobrien	  return ifnonnull (expr, expr1);
58550397Sobrien	}
58650397Sobrien      else
58750397Sobrien	{
58850397Sobrien	  tree retval;
589169689Skan	  tree result, td2, td3, elems;
590169689Skan	  tree static_type, target_type, boff;
59150397Sobrien
592169689Skan	  /* If we got here, we can't convert statically.  Therefore,
59350397Sobrien	     dynamic_cast<D&>(b) (b an object) cannot succeed.  */
59490075Sobrien	  if (tc == REFERENCE_TYPE)
59550397Sobrien	    {
59652284Sobrien	      if (TREE_CODE (old_expr) == VAR_DECL
59752284Sobrien		  && TREE_CODE (TREE_TYPE (old_expr)) == RECORD_TYPE)
59850397Sobrien		{
599169689Skan		  tree expr = throw_bad_cast ();
600169689Skan		  warning (0, "dynamic_cast of %q#D to %q#T can never succeed",
601169689Skan			   old_expr, type);
602169689Skan		  /* Bash it to the expected type.  */
603169689Skan		  TREE_TYPE (expr) = type;
60490075Sobrien		  return expr;
60550397Sobrien		}
60650397Sobrien	    }
60750397Sobrien	  /* Ditto for dynamic_cast<D*>(&b).  */
60850397Sobrien	  else if (TREE_CODE (expr) == ADDR_EXPR)
60950397Sobrien	    {
61050397Sobrien	      tree op = TREE_OPERAND (expr, 0);
61150397Sobrien	      if (TREE_CODE (op) == VAR_DECL
61250397Sobrien		  && TREE_CODE (TREE_TYPE (op)) == RECORD_TYPE)
61350397Sobrien		{
614169689Skan		  warning (0, "dynamic_cast of %q#D to %q#T can never succeed",
615169689Skan			   op, type);
616169689Skan		  retval = build_int_cst (type, 0);
61750397Sobrien		  return retval;
61850397Sobrien		}
61950397Sobrien	    }
62050397Sobrien
621169689Skan	  /* Use of dynamic_cast when -fno-rtti is prohibited.  */
622169689Skan	  if (!flag_rtti)
623169689Skan	    {
624169689Skan	      error ("%<dynamic_cast%> not permitted with -fno-rtti");
625169689Skan	      return error_mark_node;
626169689Skan	    }
627169689Skan
62890075Sobrien	  target_type = TYPE_MAIN_VARIANT (TREE_TYPE (type));
62990075Sobrien	  static_type = TYPE_MAIN_VARIANT (TREE_TYPE (exprtype));
630132718Skan	  td2 = get_tinfo_decl (target_type);
631132718Skan	  mark_used (td2);
632132718Skan	  td2 = build_unary_op (ADDR_EXPR, td2, 0);
633132718Skan	  td3 = get_tinfo_decl (static_type);
634132718Skan	  mark_used (td3);
635132718Skan	  td3 = build_unary_op (ADDR_EXPR, td3, 0);
63690075Sobrien
637169689Skan	  /* Determine how T and V are related.  */
638169689Skan	  boff = dcast_base_hint (static_type, target_type);
639169689Skan
64050397Sobrien	  /* Since expr is used twice below, save it.  */
64150397Sobrien	  expr = save_expr (expr);
64250397Sobrien
64350397Sobrien	  expr1 = expr;
64450397Sobrien	  if (tc == REFERENCE_TYPE)
64550397Sobrien	    expr1 = build_unary_op (ADDR_EXPR, expr1, 0);
64650397Sobrien
64790075Sobrien	  elems = tree_cons
64890075Sobrien	    (NULL_TREE, expr1, tree_cons
64990075Sobrien	     (NULL_TREE, td3, tree_cons
65090075Sobrien	      (NULL_TREE, td2, tree_cons
65190075Sobrien	       (NULL_TREE, boff, NULL_TREE))));
65250397Sobrien
65390075Sobrien	  dcast_fn = dynamic_cast_node;
65490075Sobrien	  if (!dcast_fn)
65550397Sobrien	    {
65650397Sobrien	      tree tmp;
65790075Sobrien	      tree tinfo_ptr;
65890075Sobrien	      tree ns = abi_node;
65990075Sobrien	      const char *name;
660169689Skan
66190075Sobrien	      push_nested_namespace (ns);
662117395Skan	      tinfo_ptr = xref_tag (class_type,
66390075Sobrien				    get_identifier ("__class_type_info"),
664169689Skan				    /*tag_scope=*/ts_current, false);
665169689Skan
66690075Sobrien	      tinfo_ptr = build_pointer_type
66790075Sobrien		(build_qualified_type
66890075Sobrien		 (tinfo_ptr, TYPE_QUAL_CONST));
66990075Sobrien	      name = "__dynamic_cast";
67050397Sobrien	      tmp = tree_cons
67190075Sobrien		(NULL_TREE, const_ptr_type_node, tree_cons
67290075Sobrien		 (NULL_TREE, tinfo_ptr, tree_cons
67390075Sobrien		  (NULL_TREE, tinfo_ptr, tree_cons
67490075Sobrien		   (NULL_TREE, ptrdiff_type_node, void_list_node))));
67550397Sobrien	      tmp = build_function_type (ptr_type_node, tmp);
67690075Sobrien	      dcast_fn = build_library_fn_ptr (name, tmp);
677132718Skan	      DECL_IS_PURE (dcast_fn) = 1;
678169689Skan	      pop_nested_namespace (ns);
679169689Skan	      dynamic_cast_node = dcast_fn;
68050397Sobrien	    }
681169689Skan	  result = build_cxx_call (dcast_fn, elems);
68250397Sobrien
68350397Sobrien	  if (tc == REFERENCE_TYPE)
68450397Sobrien	    {
68590075Sobrien	      tree bad = throw_bad_cast ();
686169689Skan	      tree neq;
687169689Skan
68850397Sobrien	      result = save_expr (result);
689169689Skan	      neq = c_common_truthvalue_conversion (result);
690169689Skan	      return build3 (COND_EXPR, type, neq, result, bad);
69150397Sobrien	    }
69250397Sobrien
69350397Sobrien	  /* Now back to the type we want from a void*.  */
69450397Sobrien	  result = cp_convert (type, result);
695169689Skan	  return ifnonnull (expr, result);
69650397Sobrien	}
69750397Sobrien    }
69890075Sobrien  else
69990075Sobrien    errstr = "source type is not polymorphic";
70050397Sobrien
70150397Sobrien fail:
702169689Skan  error ("cannot dynamic_cast %qE (of type %q#T) to type %q#T (%s)",
703169689Skan	 expr, exprtype, type, errstr);
70450397Sobrien  return error_mark_node;
70550397Sobrien}
70650397Sobrien
70750397Sobrientree
708132718Skanbuild_dynamic_cast (tree type, tree expr)
70950397Sobrien{
71050397Sobrien  if (type == error_mark_node || expr == error_mark_node)
71150397Sobrien    return error_mark_node;
712169689Skan
71350397Sobrien  if (processing_template_decl)
714132718Skan    {
715132718Skan      expr = build_min (DYNAMIC_CAST_EXPR, type, expr);
716132718Skan      TREE_SIDE_EFFECTS (expr) = 1;
717169689Skan
718132718Skan      return expr;
719132718Skan    }
72050397Sobrien
72150397Sobrien  return convert_from_reference (build_dynamic_cast_1 (type, expr));
72250397Sobrien}
72350397Sobrien
72490075Sobrien/* Return the runtime bit mask encoding the qualifiers of TYPE.  */
72550397Sobrien
72690075Sobrienstatic int
727132718Skanqualifier_flags (tree type)
72890075Sobrien{
72990075Sobrien  int flags = 0;
730117395Skan  int quals = cp_type_quals (type);
731169689Skan
73290075Sobrien  if (quals & TYPE_QUAL_CONST)
73390075Sobrien    flags |= 1;
73490075Sobrien  if (quals & TYPE_QUAL_VOLATILE)
73590075Sobrien    flags |= 2;
73690075Sobrien  if (quals & TYPE_QUAL_RESTRICT)
73790075Sobrien    flags |= 4;
73890075Sobrien  return flags;
73990075Sobrien}
74050397Sobrien
741132718Skan/* Return true, if the pointer chain TYPE ends at an incomplete type, or
74290075Sobrien   contains a pointer to member of an incomplete class.  */
74350397Sobrien
744132718Skanstatic bool
745132718Skantarget_incomplete_p (tree type)
74690075Sobrien{
747132718Skan  while (true)
74890075Sobrien    if (TYPE_PTRMEM_P (type))
74990075Sobrien      {
750132718Skan	if (!COMPLETE_TYPE_P (TYPE_PTRMEM_CLASS_TYPE (type)))
751132718Skan	  return true;
752132718Skan	type = TYPE_PTRMEM_POINTED_TO_TYPE (type);
75390075Sobrien      }
754132718Skan    else if (TREE_CODE (type) == POINTER_TYPE)
755132718Skan      type = TREE_TYPE (type);
75690075Sobrien    else
757132718Skan      return !COMPLETE_OR_VOID_TYPE_P (type);
75890075Sobrien}
75950397Sobrien
760169689Skan/* Returns true if TYPE involves an incomplete class type; in that
761169689Skan   case, typeinfo variables for TYPE should be emitted with internal
762169689Skan   linkage.  */
763169689Skan
764169689Skanstatic bool
765169689Skaninvolves_incomplete_p (tree type)
766169689Skan{
767169689Skan  switch (TREE_CODE (type))
768169689Skan    {
769169689Skan    case POINTER_TYPE:
770169689Skan      return target_incomplete_p (TREE_TYPE (type));
771169689Skan
772169689Skan    case OFFSET_TYPE:
773169689Skan    ptrmem:
774169689Skan      return
775169689Skan	(target_incomplete_p (TYPE_PTRMEM_POINTED_TO_TYPE (type))
776169689Skan	 || !COMPLETE_TYPE_P (TYPE_PTRMEM_CLASS_TYPE (type)));
777169689Skan
778169689Skan    case RECORD_TYPE:
779169689Skan      if (TYPE_PTRMEMFUNC_P (type))
780169689Skan	goto ptrmem;
781169689Skan      /* Fall through.  */
782169689Skan    case UNION_TYPE:
783169689Skan      if (!COMPLETE_TYPE_P (type))
784169689Skan	return true;
785169689Skan
786169689Skan    default:
787169689Skan      /* All other types do not involve incomplete class types.  */
788169689Skan      return false;
789169689Skan    }
790169689Skan}
791169689Skan
79290075Sobrien/* Return a CONSTRUCTOR for the common part of the type_info objects. This
79390075Sobrien   is the vtable pointer and NTBS name.  The NTBS name is emitted as a
79490075Sobrien   comdat const char array, so it becomes a unique key for the type. Generate
79590075Sobrien   and emit that VAR_DECL here.  (We can't always emit the type_info itself
79690075Sobrien   as comdat, because of pointers to incomplete.) */
79750397Sobrien
79890075Sobrienstatic tree
799169689Skantinfo_base_init (tinfo_s *ti, tree target)
80050397Sobrien{
80190075Sobrien  tree init = NULL_TREE;
80290075Sobrien  tree name_decl;
803102780Skan  tree vtable_ptr;
804169689Skan
80590075Sobrien  {
80690075Sobrien    tree name_name;
807169689Skan
80890075Sobrien    /* Generate the NTBS array variable.  */
80990075Sobrien    tree name_type = build_cplus_array_type
810169689Skan		     (build_qualified_type (char_type_node, TYPE_QUAL_CONST),
811169689Skan		     NULL_TREE);
81290075Sobrien    tree name_string = tinfo_name (target);
81350397Sobrien
814169689Skan    /* Determine the name of the variable -- and remember with which
815169689Skan       type it is associated.  */
81690075Sobrien    name_name = mangle_typeinfo_string_for_type (target);
817169689Skan    TREE_TYPE (name_name) = target;
818169689Skan
81990075Sobrien    name_decl = build_lang_decl (VAR_DECL, name_name, name_type);
820169689Skan    SET_DECL_ASSEMBLER_NAME (name_decl, name_name);
82190075Sobrien    DECL_ARTIFICIAL (name_decl) = 1;
822169689Skan    DECL_IGNORED_P (name_decl) = 1;
82390075Sobrien    TREE_READONLY (name_decl) = 1;
82490075Sobrien    TREE_STATIC (name_decl) = 1;
82590075Sobrien    DECL_EXTERNAL (name_decl) = 0;
826169689Skan    DECL_TINFO_P (name_decl) = 1;
827169689Skan    set_linkage_according_to_type (target, name_decl);
828169689Skan    import_export_decl (name_decl);
82990075Sobrien    DECL_INITIAL (name_decl) = name_string;
830132718Skan    mark_used (name_decl);
831117395Skan    pushdecl_top_level_and_finish (name_decl, name_string);
83290075Sobrien  }
833102780Skan
834169689Skan  vtable_ptr = ti->vtable;
835102780Skan  if (!vtable_ptr)
836102780Skan    {
837102780Skan      tree real_type;
838102780Skan      push_nested_namespace (abi_node);
839169689Skan      real_type = xref_tag (class_type, ti->name,
840169689Skan			    /*tag_scope=*/ts_current, false);
841102780Skan      pop_nested_namespace (abi_node);
842169689Skan
843102780Skan      if (!COMPLETE_TYPE_P (real_type))
844102780Skan	{
845169689Skan	  /* We never saw a definition of this type, so we need to
846102780Skan	     tell the compiler that this is an exported class, as
847102780Skan	     indeed all of the __*_type_info classes are.  */
848102780Skan	  SET_CLASSTYPE_INTERFACE_KNOWN (real_type);
849102780Skan	  CLASSTYPE_INTERFACE_ONLY (real_type) = 1;
850102780Skan	}
851102780Skan
852102780Skan      vtable_ptr = get_vtable_decl (real_type, /*complete=*/1);
853102780Skan      vtable_ptr = build_unary_op (ADDR_EXPR, vtable_ptr, 0);
854102780Skan
855102780Skan      /* We need to point into the middle of the vtable.  */
856169689Skan      vtable_ptr = build2
857102780Skan	(PLUS_EXPR, TREE_TYPE (vtable_ptr), vtable_ptr,
858102780Skan	 size_binop (MULT_EXPR,
859117395Skan		     size_int (2 * TARGET_VTABLE_DATA_ENTRY_DISTANCE),
860102780Skan		     TYPE_SIZE_UNIT (vtable_entry_type)));
861102780Skan
862169689Skan      ti->vtable = vtable_ptr;
86390075Sobrien    }
864102780Skan
865102780Skan  init = tree_cons (NULL_TREE, vtable_ptr, init);
866169689Skan
86790075Sobrien  init = tree_cons (NULL_TREE, decay_conversion (name_decl), init);
868169689Skan
869169689Skan  init = build_constructor_from_list (NULL_TREE, nreverse (init));
870169689Skan  TREE_CONSTANT (init) = 1;
871169689Skan  TREE_INVARIANT (init) = 1;
872169689Skan  TREE_STATIC (init) = 1;
87390075Sobrien  init = tree_cons (NULL_TREE, init, NULL_TREE);
874169689Skan
87590075Sobrien  return init;
87690075Sobrien}
87750397Sobrien
878169689Skan/* Return the CONSTRUCTOR expr for a type_info of TYPE. TI provides the
87990075Sobrien   information about the particular type_info derivation, which adds no
88090075Sobrien   additional fields to the type_info base.  */
88190075Sobrien
88290075Sobrienstatic tree
883169689Skangeneric_initializer (tinfo_s *ti, tree target)
88490075Sobrien{
885169689Skan  tree init = tinfo_base_init (ti, target);
886169689Skan
887169689Skan  init = build_constructor_from_list (NULL_TREE, init);
888169689Skan  TREE_CONSTANT (init) = 1;
889169689Skan  TREE_INVARIANT (init) = 1;
890169689Skan  TREE_STATIC (init) = 1;
89190075Sobrien  return init;
89250397Sobrien}
89350397Sobrien
89490075Sobrien/* Return the CONSTRUCTOR expr for a type_info of pointer TYPE.
895169689Skan   TI provides information about the particular type_info derivation,
89690075Sobrien   which adds target type and qualifier flags members to the type_info base.  */
89750397Sobrien
89890075Sobrienstatic tree
899169689Skanptr_initializer (tinfo_s *ti, tree target)
90050397Sobrien{
901169689Skan  tree init = tinfo_base_init (ti, target);
90290075Sobrien  tree to = TREE_TYPE (target);
90390075Sobrien  int flags = qualifier_flags (to);
904132718Skan  bool incomplete = target_incomplete_p (to);
905169689Skan
90690075Sobrien  if (incomplete)
907169689Skan    flags |= 8;
908169689Skan  init = tree_cons (NULL_TREE, build_int_cst (NULL_TREE, flags), init);
90990075Sobrien  init = tree_cons (NULL_TREE,
910169689Skan		    get_tinfo_ptr (TYPE_MAIN_VARIANT (to)),
911169689Skan		    init);
912169689Skan
913169689Skan  init = build_constructor_from_list (NULL_TREE, nreverse (init));
914169689Skan  TREE_CONSTANT (init) = 1;
915169689Skan  TREE_INVARIANT (init) = 1;
916169689Skan  TREE_STATIC (init) = 1;
91790075Sobrien  return init;
91890075Sobrien}
91950397Sobrien
92090075Sobrien/* Return the CONSTRUCTOR expr for a type_info of pointer to member data TYPE.
921169689Skan   TI provides information about the particular type_info derivation,
92290075Sobrien   which adds class, target type and qualifier flags members to the type_info
92390075Sobrien   base.  */
92450397Sobrien
92590075Sobrienstatic tree
926169689Skanptm_initializer (tinfo_s *ti, tree target)
92790075Sobrien{
928169689Skan  tree init = tinfo_base_init (ti, target);
92990075Sobrien  tree to = TYPE_PTRMEM_POINTED_TO_TYPE (target);
93090075Sobrien  tree klass = TYPE_PTRMEM_CLASS_TYPE (target);
93190075Sobrien  int flags = qualifier_flags (to);
932132718Skan  bool incomplete = target_incomplete_p (to);
933169689Skan
93490075Sobrien  if (incomplete)
935169689Skan    flags |= 0x8;
93690075Sobrien  if (!COMPLETE_TYPE_P (klass))
937169689Skan    flags |= 0x10;
938169689Skan  init = tree_cons (NULL_TREE, build_int_cst (NULL_TREE, flags), init);
93990075Sobrien  init = tree_cons (NULL_TREE,
940102780Skan		    get_tinfo_ptr (TYPE_MAIN_VARIANT (to)),
941169689Skan		    init);
94290075Sobrien  init = tree_cons (NULL_TREE,
943102780Skan		    get_tinfo_ptr (klass),
944169689Skan		    init);
94550397Sobrien
946169689Skan  init = build_constructor_from_list (NULL_TREE, nreverse (init));
947169689Skan  TREE_CONSTANT (init) = 1;
948169689Skan  TREE_INVARIANT (init) = 1;
949169689Skan  TREE_STATIC (init) = 1;
950169689Skan  return init;
951132718Skan}
95250397Sobrien
95390075Sobrien/* Return the CONSTRUCTOR expr for a type_info of class TYPE.
954169689Skan   TI provides information about the particular __class_type_info derivation,
95590075Sobrien   which adds hint flags and TRAIL initializers to the type_info base.  */
95650397Sobrien
95790075Sobrienstatic tree
958169689Skanclass_initializer (tinfo_s *ti, tree target, tree trail)
95990075Sobrien{
960169689Skan  tree init = tinfo_base_init (ti, target);
961169689Skan
96290075Sobrien  TREE_CHAIN (init) = trail;
963169689Skan  init = build_constructor_from_list (NULL_TREE, init);
964169689Skan  TREE_CONSTANT (init) = 1;
965169689Skan  TREE_INVARIANT (init) = 1;
966169689Skan  TREE_STATIC (init) = 1;
967169689Skan  return init;
96890075Sobrien}
96950397Sobrien
970132718Skan/* Returns true if the typeinfo for type should be placed in
97190075Sobrien   the runtime library.  */
97250397Sobrien
973132718Skanstatic bool
974132718Skantypeinfo_in_lib_p (tree type)
97590075Sobrien{
97690075Sobrien  /* The typeinfo objects for `T*' and `const T*' are in the runtime
97790075Sobrien     library for simple types T.  */
97890075Sobrien  if (TREE_CODE (type) == POINTER_TYPE
97990075Sobrien      && (cp_type_quals (TREE_TYPE (type)) == TYPE_QUAL_CONST
98090075Sobrien	  || cp_type_quals (TREE_TYPE (type)) == TYPE_UNQUALIFIED))
98190075Sobrien    type = TREE_TYPE (type);
98250397Sobrien
98390075Sobrien  switch (TREE_CODE (type))
98490075Sobrien    {
98590075Sobrien    case INTEGER_TYPE:
98690075Sobrien    case BOOLEAN_TYPE:
98790075Sobrien    case REAL_TYPE:
98890075Sobrien    case VOID_TYPE:
989132718Skan      return true;
990169689Skan
99190075Sobrien    default:
992132718Skan      return false;
99390075Sobrien    }
99490075Sobrien}
99550397Sobrien
996169689Skan/* Generate the initializer for the type info describing TYPE.  TK_INDEX is
997169689Skan   the index of the descriptor in the tinfo_desc vector. */
99890075Sobrien
99990075Sobrienstatic tree
1000169689Skanget_pseudo_ti_init (tree type, unsigned tk_index)
100190075Sobrien{
1002169689Skan  tinfo_s *ti = VEC_index (tinfo_s, tinfo_descs, tk_index);
1003169689Skan
1004169689Skan  gcc_assert (at_eof);
1005169689Skan  switch (tk_index)
100690075Sobrien    {
1007169689Skan    case TK_POINTER_MEMBER_TYPE:
1008169689Skan      return ptm_initializer (ti, type);
1009102780Skan
1010169689Skan    case TK_POINTER_TYPE:
1011169689Skan      return ptr_initializer (ti, type);
101250397Sobrien
1013169689Skan    case TK_BUILTIN_TYPE:
1014169689Skan    case TK_ENUMERAL_TYPE:
1015169689Skan    case TK_FUNCTION_TYPE:
1016169689Skan    case TK_ARRAY_TYPE:
1017169689Skan      return generic_initializer (ti, type);
1018169689Skan
1019169689Skan    case TK_CLASS_TYPE:
1020169689Skan      return class_initializer (ti, type, NULL_TREE);
1021169689Skan
1022169689Skan    case TK_SI_CLASS_TYPE:
1023169689Skan      {
1024169689Skan	tree base_binfo = BINFO_BASE_BINFO (TYPE_BINFO (type), 0);
1025169689Skan	tree tinfo = get_tinfo_ptr (BINFO_TYPE (base_binfo));
1026169689Skan	tree base_inits = tree_cons (NULL_TREE, tinfo, NULL_TREE);
1027169689Skan
1028169689Skan	/* get_tinfo_ptr might have reallocated the tinfo_descs vector.  */
1029169689Skan	ti = VEC_index (tinfo_s, tinfo_descs, tk_index);
1030169689Skan	return class_initializer (ti, type, base_inits);
1031169689Skan      }
1032169689Skan
103390075Sobrien    default:
1034169689Skan      {
1035169689Skan	int hint = ((CLASSTYPE_REPEATED_BASE_P (type) << 0)
1036169689Skan		    | (CLASSTYPE_DIAMOND_SHAPED_P (type) << 1));
1037169689Skan	tree binfo = TYPE_BINFO (type);
1038169689Skan	int nbases = BINFO_N_BASE_BINFOS (binfo);
1039169689Skan	VEC(tree,gc) *base_accesses = BINFO_BASE_ACCESSES (binfo);
1040169689Skan	tree base_inits = NULL_TREE;
1041169689Skan	int ix;
1042169689Skan
1043169689Skan	gcc_assert (tk_index >= TK_FIXED);
1044169689Skan
1045169689Skan	/* Generate the base information initializer.  */
1046169689Skan	for (ix = nbases; ix--;)
1047169689Skan	  {
1048169689Skan	    tree base_binfo = BINFO_BASE_BINFO (binfo, ix);
1049169689Skan	    tree base_init = NULL_TREE;
1050169689Skan	    int flags = 0;
1051169689Skan	    tree tinfo;
1052169689Skan	    tree offset;
1053169689Skan
1054169689Skan	    if (VEC_index (tree, base_accesses, ix) == access_public_node)
1055169689Skan	      flags |= 2;
1056169689Skan	    tinfo = get_tinfo_ptr (BINFO_TYPE (base_binfo));
1057169689Skan	    if (BINFO_VIRTUAL_P (base_binfo))
1058169689Skan	      {
1059169689Skan		/* We store the vtable offset at which the virtual
1060169689Skan		   base offset can be found.  */
1061169689Skan		offset = BINFO_VPTR_FIELD (base_binfo);
1062169689Skan		offset = convert (sizetype, offset);
1063169689Skan		flags |= 1;
1064169689Skan	      }
1065169689Skan	    else
1066169689Skan	      offset = BINFO_OFFSET (base_binfo);
1067169689Skan
1068169689Skan	    /* Combine offset and flags into one field.  */
1069169689Skan	    offset = cp_build_binary_op (LSHIFT_EXPR, offset,
1070169689Skan					 build_int_cst (NULL_TREE, 8));
1071169689Skan	    offset = cp_build_binary_op (BIT_IOR_EXPR, offset,
1072169689Skan					 build_int_cst (NULL_TREE, flags));
1073169689Skan	    base_init = tree_cons (NULL_TREE, offset, base_init);
1074169689Skan	    base_init = tree_cons (NULL_TREE, tinfo, base_init);
1075169689Skan	    base_init = build_constructor_from_list (NULL_TREE, base_init);
1076169689Skan	    base_inits = tree_cons (NULL_TREE, base_init, base_inits);
1077169689Skan	  }
1078169689Skan	base_inits = build_constructor_from_list (NULL_TREE, base_inits);
1079169689Skan	base_inits = tree_cons (NULL_TREE, base_inits, NULL_TREE);
1080169689Skan	/* Prepend the number of bases.  */
1081169689Skan	base_inits = tree_cons (NULL_TREE,
1082169689Skan				build_int_cst (NULL_TREE, nbases),
1083169689Skan				base_inits);
1084169689Skan	/* Prepend the hint flags.  */
1085169689Skan	base_inits = tree_cons (NULL_TREE,
1086169689Skan				build_int_cst (NULL_TREE, hint),
1087169689Skan				base_inits);
1088169689Skan
1089169689Skan	/* get_tinfo_ptr might have reallocated the tinfo_descs vector.  */
1090169689Skan	ti = VEC_index (tinfo_s, tinfo_descs, tk_index);
1091169689Skan	return class_initializer (ti, type, base_inits);
1092169689Skan      }
109350397Sobrien    }
109490075Sobrien}
109550397Sobrien
109690075Sobrien/* Generate the RECORD_TYPE containing the data layout of a type_info
109790075Sobrien   derivative as used by the runtime. This layout must be consistent with
109890075Sobrien   that defined in the runtime support. Also generate the VAR_DECL for the
109990075Sobrien   type's vtable. We explicitly manage the vtable member, and name it for
110090075Sobrien   real type as used in the runtime. The RECORD type has a different name,
110190075Sobrien   to avoid collisions.  Return a TREE_LIST who's TINFO_PSEUDO_TYPE
1102102780Skan   is the generated type and TINFO_VTABLE_NAME is the name of the
1103102780Skan   vtable.  We have to delay generating the VAR_DECL of the vtable
1104102780Skan   until the end of the translation, when we'll have seen the library
1105102780Skan   definition, if there was one.
1106169689Skan
110790075Sobrien   REAL_NAME is the runtime's name of the type. Trailing arguments are
110890075Sobrien   additional FIELD_DECL's for the structure. The final argument must be
110990075Sobrien   NULL.  */
111050397Sobrien
1111169689Skanstatic void
1112169689Skancreate_pseudo_type_info (int tk, const char *real_name, ...)
111350397Sobrien{
1114169689Skan  tinfo_s *ti;
1115102780Skan  tree pseudo_type;
111690075Sobrien  char *pseudo_name;
1117132718Skan  tree fields;
111890075Sobrien  tree field_decl;
1119132718Skan  va_list ap;
112050397Sobrien
1121169689Skan  va_start (ap, real_name);
112250397Sobrien
1123117395Skan  /* Generate the pseudo type name.  */
1124169689Skan  pseudo_name = (char *) alloca (strlen (real_name) + 30);
112590075Sobrien  strcpy (pseudo_name, real_name);
112690075Sobrien  strcat (pseudo_name, "_pseudo");
1127169689Skan  if (tk >= TK_FIXED)
1128169689Skan    sprintf (pseudo_name + strlen (pseudo_name), "%d", tk - TK_FIXED);
1129169689Skan
1130117395Skan  /* First field is the pseudo type_info base class.  */
1131169689Skan  fields = build_decl (FIELD_DECL, NULL_TREE,
1132169689Skan		       VEC_index (tinfo_s, tinfo_descs,
1133169689Skan				  TK_TYPE_INFO_TYPE)->type);
1134169689Skan
113590075Sobrien  /* Now add the derived fields.  */
1136132718Skan  while ((field_decl = va_arg (ap, tree)))
1137132718Skan    {
1138132718Skan      TREE_CHAIN (field_decl) = fields;
1139132718Skan      fields = field_decl;
1140132718Skan    }
1141169689Skan
1142117395Skan  /* Create the pseudo type.  */
114390075Sobrien  pseudo_type = make_aggr_type (RECORD_TYPE);
1144132718Skan  finish_builtin_struct (pseudo_type, pseudo_name, fields, NULL_TREE);
1145117395Skan  CLASSTYPE_AS_BASE (pseudo_type) = pseudo_type;
114690075Sobrien
1147169689Skan  ti = VEC_index (tinfo_s, tinfo_descs, tk);
1148169689Skan  ti->type = cp_build_qualified_type (pseudo_type, TYPE_QUAL_CONST);
1149169689Skan  ti->name = get_identifier (real_name);
1150169689Skan  ti->vtable = NULL_TREE;
1151169689Skan
1152169689Skan  /* Pretend this is public so determine_visibility doesn't give vtables
1153169689Skan     internal linkage.  */
1154169689Skan  TREE_PUBLIC (TYPE_MAIN_DECL (ti->type)) = 1;
1155169689Skan
1156132718Skan  va_end (ap);
115750397Sobrien}
115850397Sobrien
1159169689Skan/* Return the index of a pseudo type info type node used to describe
1160169689Skan   TYPE.  TYPE must be a complete type (or cv void), except at the end
1161169689Skan   of the translation unit.  */
116250397Sobrien
1163169689Skanstatic unsigned
1164169689Skanget_pseudo_ti_index (tree type)
116550397Sobrien{
1166169689Skan  unsigned ix;
1167169689Skan
1168102780Skan  switch (TREE_CODE (type))
116950397Sobrien    {
1170132718Skan    case OFFSET_TYPE:
1171169689Skan      ix = TK_POINTER_MEMBER_TYPE;
1172169689Skan      break;
1173169689Skan
1174102780Skan    case POINTER_TYPE:
1175169689Skan      ix = TK_POINTER_TYPE;
1176169689Skan      break;
1177169689Skan
1178102780Skan    case ENUMERAL_TYPE:
1179169689Skan      ix = TK_ENUMERAL_TYPE;
1180169689Skan      break;
1181169689Skan
1182102780Skan    case FUNCTION_TYPE:
1183169689Skan      ix = TK_FUNCTION_TYPE;
1184169689Skan      break;
1185169689Skan
1186102780Skan    case ARRAY_TYPE:
1187169689Skan      ix = TK_ARRAY_TYPE;
1188169689Skan      break;
1189169689Skan
1190102780Skan    case UNION_TYPE:
1191102780Skan    case RECORD_TYPE:
1192102780Skan      if (TYPE_PTRMEMFUNC_P (type))
1193169689Skan	{
1194169689Skan	  ix = TK_POINTER_MEMBER_TYPE;
1195169689Skan	  break;
1196169689Skan	}
1197102780Skan      else if (!COMPLETE_TYPE_P (type))
1198102780Skan	{
1199117395Skan	  if (!at_eof)
1200117395Skan	    cxx_incomplete_type_error (NULL_TREE, type);
1201169689Skan	  ix = TK_CLASS_TYPE;
1202169689Skan	  break;
1203102780Skan	}
1204169689Skan      else if (!BINFO_N_BASE_BINFOS (TYPE_BINFO (type)))
1205169689Skan	{
1206169689Skan	  ix = TK_CLASS_TYPE;
1207169689Skan	  break;
1208169689Skan	}
1209102780Skan      else
1210102780Skan	{
1211132718Skan	  tree binfo = TYPE_BINFO (type);
1212169689Skan	  VEC(tree,gc) *base_accesses = BINFO_BASE_ACCESSES (binfo);
1213169689Skan	  tree base_binfo = BINFO_BASE_BINFO (binfo, 0);
1214169689Skan	  int num_bases = BINFO_N_BASE_BINFOS (binfo);
1215169689Skan
1216102780Skan	  if (num_bases == 1
1217169689Skan	      && VEC_index (tree, base_accesses, 0) == access_public_node
1218169689Skan	      && !BINFO_VIRTUAL_P (base_binfo)
1219102780Skan	      && integer_zerop (BINFO_OFFSET (base_binfo)))
1220169689Skan	    {
1221169689Skan	      /* single non-virtual public.  */
1222169689Skan	      ix = TK_SI_CLASS_TYPE;
1223169689Skan	      break;
1224169689Skan	    }
1225102780Skan	  else
1226102780Skan	    {
1227169689Skan	      tinfo_s *ti;
1228102780Skan	      tree array_domain, base_array;
1229169689Skan
1230169689Skan	      ix = TK_FIXED + num_bases;
1231169689Skan	      if (VEC_length (tinfo_s, tinfo_descs) <= ix)
1232102780Skan		{
1233169689Skan		  /* too short, extend.  */
1234169689Skan		  unsigned len = VEC_length (tinfo_s, tinfo_descs);
1235169689Skan
1236169689Skan		  VEC_safe_grow (tinfo_s, gc, tinfo_descs, ix + 1);
1237169689Skan		  while (VEC_iterate (tinfo_s, tinfo_descs, len++, ti))
1238169689Skan		    ti->type = ti->vtable = ti->name = NULL_TREE;
1239102780Skan		}
1240169689Skan	      else if (VEC_index (tinfo_s, tinfo_descs, ix)->type)
1241169689Skan		/* already created.  */
1242169689Skan		break;
1243169689Skan
1244132718Skan	      /* Create the array of __base_class_type_info entries.
1245132718Skan		 G++ 3.2 allocated an array that had one too many
1246132718Skan		 entries, and then filled that extra entries with
1247132718Skan		 zeros.  */
1248132718Skan	      if (abi_version_at_least (2))
1249132718Skan		array_domain = build_index_type (size_int (num_bases - 1));
1250132718Skan	      else
1251132718Skan		array_domain = build_index_type (size_int (num_bases));
1252102780Skan	      base_array =
1253169689Skan		build_array_type (VEC_index (tinfo_s, tinfo_descs,
1254169689Skan					     TK_BASE_TYPE)->type,
1255169689Skan				  array_domain);
125650397Sobrien
1257102780Skan	      push_nested_namespace (abi_node);
1258169689Skan	      create_pseudo_type_info
1259169689Skan		(ix, "__vmi_class_type_info",
1260102780Skan		 build_decl (FIELD_DECL, NULL_TREE, integer_type_node),
1261102780Skan		 build_decl (FIELD_DECL, NULL_TREE, integer_type_node),
1262102780Skan		 build_decl (FIELD_DECL, NULL_TREE, base_array),
1263102780Skan		 NULL);
1264102780Skan	      pop_nested_namespace (abi_node);
1265169689Skan	      break;
1266102780Skan	    }
1267102780Skan	}
1268102780Skan    default:
1269169689Skan      ix = TK_BUILTIN_TYPE;
1270169689Skan      break;
1271102780Skan    }
1272169689Skan  return ix;
127350397Sobrien}
127450397Sobrien
127590075Sobrien/* Make sure the required builtin types exist for generating the type_info
1276169689Skan   variable definitions.  */
127750397Sobrien
127850397Sobrienstatic void
1279132718Skancreate_tinfo_types (void)
128050397Sobrien{
1281169689Skan  tinfo_s *ti;
1282102780Skan
1283169689Skan  gcc_assert (!tinfo_descs);
1284169689Skan
1285169689Skan  VEC_safe_grow (tinfo_s, gc, tinfo_descs, TK_FIXED);
1286169689Skan
128790075Sobrien  push_nested_namespace (abi_node);
1288169689Skan
128990075Sobrien  /* Create the internal type_info structure. This is used as a base for
129090075Sobrien     the other structures.  */
129190075Sobrien  {
1292132718Skan    tree field, fields;
129350397Sobrien
1294132718Skan    field = build_decl (FIELD_DECL, NULL_TREE, const_ptr_type_node);
1295132718Skan    fields = field;
1296169689Skan
1297132718Skan    field = build_decl (FIELD_DECL, NULL_TREE, const_string_type_node);
1298132718Skan    TREE_CHAIN (field) = fields;
1299132718Skan    fields = field;
1300169689Skan
1301169689Skan    ti = VEC_index (tinfo_s, tinfo_descs, TK_TYPE_INFO_TYPE);
1302169689Skan    ti->type = make_aggr_type (RECORD_TYPE);
1303169689Skan    ti->vtable = NULL_TREE;
1304169689Skan    ti->name = NULL_TREE;
1305169689Skan    finish_builtin_struct (ti->type, "__type_info_pseudo",
1306132718Skan			   fields, NULL_TREE);
1307169689Skan    TYPE_HAS_CONSTRUCTOR (ti->type) = 1;
130890075Sobrien  }
1309169689Skan
131090075Sobrien  /* Fundamental type_info */
1311169689Skan  create_pseudo_type_info (TK_BUILTIN_TYPE, "__fundamental_type_info", NULL);
131250397Sobrien
1313117395Skan  /* Array, function and enum type_info. No additional fields.  */
1314169689Skan  create_pseudo_type_info (TK_ARRAY_TYPE, "__array_type_info", NULL);
1315169689Skan  create_pseudo_type_info (TK_FUNCTION_TYPE, "__function_type_info", NULL);
1316169689Skan  create_pseudo_type_info (TK_ENUMERAL_TYPE, "__enum_type_info", NULL);
1317169689Skan
1318169689Skan  /* Class type_info.  No additional fields.  */
1319169689Skan  create_pseudo_type_info (TK_CLASS_TYPE, "__class_type_info", NULL);
1320169689Skan
1321169689Skan  /* Single public non-virtual base class. Add pointer to base class.
132290075Sobrien     This is really a descendant of __class_type_info.  */
1323169689Skan  create_pseudo_type_info (TK_SI_CLASS_TYPE, "__si_class_type_info",
1324169689Skan	    build_decl (FIELD_DECL, NULL_TREE, type_info_ptr_type),
1325169689Skan	    NULL);
1326169689Skan
132790075Sobrien  /* Base class internal helper. Pointer to base type, offset to base,
1328117395Skan     flags.  */
132990075Sobrien  {
1330132718Skan    tree field, fields;
1331169689Skan
1332132718Skan    field = build_decl (FIELD_DECL, NULL_TREE, type_info_ptr_type);
1333132718Skan    fields = field;
1334169689Skan
1335132718Skan    field = build_decl (FIELD_DECL, NULL_TREE, integer_types[itk_long]);
1336132718Skan    TREE_CHAIN (field) = fields;
1337132718Skan    fields = field;
1338169689Skan
1339169689Skan    ti = VEC_index (tinfo_s, tinfo_descs, TK_BASE_TYPE);
1340169689Skan
1341169689Skan    ti->type = make_aggr_type (RECORD_TYPE);
1342169689Skan    ti->vtable = NULL_TREE;
1343169689Skan    ti->name = NULL_TREE;
1344169689Skan    finish_builtin_struct (ti->type, "__base_class_type_info_pseudo",
1345132718Skan			   fields, NULL_TREE);
1346169689Skan    TYPE_HAS_CONSTRUCTOR (ti->type) = 1;
134790075Sobrien  }
1348169689Skan
134990075Sobrien  /* Pointer type_info. Adds two fields, qualification mask
135090075Sobrien     and pointer to the pointed to type.  This is really a descendant of
1351117395Skan     __pbase_type_info.  */
1352169689Skan  create_pseudo_type_info (TK_POINTER_TYPE, "__pointer_type_info",
135390075Sobrien       build_decl (FIELD_DECL, NULL_TREE, integer_type_node),
1354102780Skan       build_decl (FIELD_DECL, NULL_TREE, type_info_ptr_type),
135590075Sobrien       NULL);
135650397Sobrien
135790075Sobrien  /* Pointer to member data type_info.  Add qualifications flags,
135890075Sobrien     pointer to the member's type info and pointer to the class.
135990075Sobrien     This is really a descendant of __pbase_type_info.  */
1360169689Skan  create_pseudo_type_info (TK_POINTER_MEMBER_TYPE,
1361169689Skan       "__pointer_to_member_type_info",
1362169689Skan	build_decl (FIELD_DECL, NULL_TREE, integer_type_node),
1363169689Skan	build_decl (FIELD_DECL, NULL_TREE, type_info_ptr_type),
1364169689Skan	build_decl (FIELD_DECL, NULL_TREE, type_info_ptr_type),
1365169689Skan	NULL);
136650397Sobrien
136790075Sobrien  pop_nested_namespace (abi_node);
136890075Sobrien}
136950397Sobrien
137090075Sobrien/* Emit the type_info descriptors which are guaranteed to be in the runtime
137190075Sobrien   support.  Generating them here guarantees consistency with the other
137290075Sobrien   structures.  We use the following heuristic to determine when the runtime
137390075Sobrien   is being generated.  If std::__fundamental_type_info is defined, and its
137490075Sobrien   destructor is defined, then the runtime is being built.  */
137590075Sobrien
137650397Sobrienvoid
1377132718Skanemit_support_tinfos (void)
137850397Sobrien{
137990075Sobrien  static tree *const fundamentals[] =
138090075Sobrien  {
138190075Sobrien    &void_type_node,
138290075Sobrien    &boolean_type_node,
138390075Sobrien    &wchar_type_node,
138490075Sobrien    &char_type_node, &signed_char_type_node, &unsigned_char_type_node,
138590075Sobrien    &short_integer_type_node, &short_unsigned_type_node,
138690075Sobrien    &integer_type_node, &unsigned_type_node,
138790075Sobrien    &long_integer_type_node, &long_unsigned_type_node,
138890075Sobrien    &long_long_integer_type_node, &long_long_unsigned_type_node,
138990075Sobrien    &float_type_node, &double_type_node, &long_double_type_node,
139090075Sobrien    0
139190075Sobrien  };
139290075Sobrien  int ix;
139390075Sobrien  tree bltn_type, dtor;
1394169689Skan
139590075Sobrien  push_nested_namespace (abi_node);
1396117395Skan  bltn_type = xref_tag (class_type,
1397169689Skan			get_identifier ("__fundamental_type_info"),
1398169689Skan			/*tag_scope=*/ts_current, false);
139990075Sobrien  pop_nested_namespace (abi_node);
140090075Sobrien  if (!COMPLETE_TYPE_P (bltn_type))
140190075Sobrien    return;
1402169689Skan  dtor = CLASSTYPE_DESTRUCTORS (bltn_type);
1403169689Skan  if (!dtor || DECL_EXTERNAL (dtor))
140490075Sobrien    return;
140590075Sobrien  doing_runtime = 1;
140690075Sobrien  for (ix = 0; fundamentals[ix]; ix++)
140750397Sobrien    {
140890075Sobrien      tree bltn = *fundamentals[ix];
1409169689Skan      tree types[3];
1410169689Skan      int i;
141150397Sobrien
1412169689Skan      types[0] = bltn;
1413169689Skan      types[1] = build_pointer_type (bltn);
1414169689Skan      types[2] = build_pointer_type (build_qualified_type (bltn,
1415169689Skan							   TYPE_QUAL_CONST));
141650397Sobrien
1417169689Skan      for (i = 0; i < 3; ++i)
1418169689Skan	{
1419169689Skan	  tree tinfo;
1420169689Skan
1421169689Skan	  tinfo = get_tinfo_decl (types[i]);
1422169689Skan	  TREE_USED (tinfo) = 1;
1423169689Skan	  mark_needed (tinfo);
1424169689Skan	  /* The C++ ABI requires that these objects be COMDAT.  But,
1425169689Skan	     On systems without weak symbols, initialized COMDAT
1426169689Skan	     objects are emitted with internal linkage.  (See
1427169689Skan	     comdat_linkage for details.)  Since we want these objects
1428169689Skan	     to have external linkage so that copies do not have to be
1429169689Skan	     emitted in code outside the runtime library, we make them
1430169689Skan	     non-COMDAT here.  */
1431169689Skan	  if (!flag_weak)
1432169689Skan	    {
1433169689Skan	      gcc_assert (TREE_PUBLIC (tinfo) && !DECL_COMDAT (tinfo));
1434169689Skan	      DECL_INTERFACE_KNOWN (tinfo) = 1;
1435169689Skan	    }
1436169689Skan	}
1437169689Skan    }
143890075Sobrien}
143950397Sobrien
1440102780Skan/* Finish a type info decl. DECL_PTR is a pointer to an unemitted
1441102780Skan   tinfo decl.  Determine whether it needs emitting, and if so
1442102780Skan   generate the initializer.  */
144350397Sobrien
1444132718Skanbool
1445132718Skanemit_tinfo_decl (tree decl)
144690075Sobrien{
1447102780Skan  tree type = TREE_TYPE (DECL_NAME (decl));
1448102780Skan  int in_library = typeinfo_in_lib_p (type);
1449132718Skan
1450169689Skan  gcc_assert (DECL_TINFO_P (decl));
1451102780Skan
1452169689Skan  if (in_library)
1453169689Skan    {
1454169689Skan      if (doing_runtime)
1455169689Skan	DECL_EXTERNAL (decl) = 0;
1456169689Skan      else
1457169689Skan	{
1458169689Skan	  /* If we're not in the runtime, then DECL (which is already
1459169689Skan	     DECL_EXTERNAL) will not be defined here.  */
1460169689Skan	  DECL_INTERFACE_KNOWN (decl) = 1;
1461169689Skan	  return false;
1462169689Skan	}
1463169689Skan    }
1464169689Skan  else if (involves_incomplete_p (type))
1465169689Skan    {
1466169689Skan      if (!decl_needed_p (decl))
1467169689Skan	return false;
1468169689Skan      /* If TYPE involves an incomplete class type, then the typeinfo
1469169689Skan	 object will be emitted with internal linkage.  There is no
1470169689Skan	 way to know whether or not types are incomplete until the end
1471169689Skan	 of the compilation, so this determination must be deferred
1472169689Skan	 until this point.  */
1473169689Skan      TREE_PUBLIC (decl) = 0;
1474169689Skan      DECL_EXTERNAL (decl) = 0;
1475169689Skan      DECL_INTERFACE_KNOWN (decl) = 1;
1476169689Skan    }
1477102780Skan
1478169689Skan  import_export_decl (decl);
1479169689Skan  if (DECL_NOT_REALLY_EXTERN (decl) && decl_needed_p (decl))
1480169689Skan    {
1481169689Skan      tree init;
1482102780Skan
1483169689Skan      DECL_EXTERNAL (decl) = 0;
1484169689Skan      init = get_pseudo_ti_init (type, get_pseudo_ti_index (type));
1485169689Skan      DECL_INITIAL (decl) = init;
1486169689Skan      mark_used (decl);
1487169689Skan      finish_decl (decl, init, NULL_TREE);
1488169689Skan      return true;
1489169689Skan    }
1490169689Skan  else
1491169689Skan    return false;
1492169689Skan}
1493102780Skan
1494169689Skan#include "gt-cp-rtti.h"
1495