OpenCores
URL https://opencores.org/ocsvn/scarts/scarts/trunk

Subversion Repositories scarts

[/] [scarts/] [trunk/] [toolchain/] [scarts-gcc/] [gcc-4.1.1/] [gcc/] [cp/] [rtti.c] - Blame information for rev 12

Details | Compare with Previous | View Log

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

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.