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

Subversion Repositories openrisc_me

[/] [openrisc/] [trunk/] [gnu-src/] [gdb-7.2/] [gdb/] [gnu-v2-abi.c] - Blame information for rev 330

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 330 jeremybenn
/* Abstraction of GNU v2 abi.
2
 
3
   Copyright (C) 2001, 2002, 2003, 2005, 2007, 2008, 2009, 2010
4
   Free Software Foundation, Inc.
5
 
6
   Contributed by Daniel Berlin <dberlin@redhat.com>
7
 
8
   This file is part of GDB.
9
 
10
   This program is free software; you can redistribute it and/or modify
11
   it under the terms of the GNU General Public License as published by
12
   the Free Software Foundation; either version 3 of the License, or
13
   (at your option) any later version.
14
 
15
   This program is distributed in the hope that it will be useful,
16
   but WITHOUT ANY WARRANTY; without even the implied warranty of
17
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18
   GNU General Public License for more details.
19
 
20
   You should have received a copy of the GNU General Public License
21
   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
22
 
23
#include "defs.h"
24
#include "gdb_string.h"
25
#include "symtab.h"
26
#include "gdbtypes.h"
27
#include "value.h"
28
#include "demangle.h"
29
#include "cp-abi.h"
30
#include "cp-support.h"
31
 
32
#include <ctype.h>
33
 
34
struct cp_abi_ops gnu_v2_abi_ops;
35
 
36
static int vb_match (struct type *, int, struct type *);
37
 
38
static enum dtor_kinds
39
gnuv2_is_destructor_name (const char *name)
40
{
41
  if ((name[0] == '_' && is_cplus_marker (name[1]) && name[2] == '_')
42
      || strncmp (name, "__dt__", 6) == 0)
43
    return complete_object_dtor;
44
  else
45
    return 0;
46
}
47
 
48
static enum ctor_kinds
49
gnuv2_is_constructor_name (const char *name)
50
{
51
  if ((name[0] == '_' && name[1] == '_'
52
       && (isdigit (name[2]) || strchr ("Qt", name[2])))
53
      || strncmp (name, "__ct__", 6) == 0)
54
    return complete_object_ctor;
55
  else
56
    return 0;
57
}
58
 
59
static int
60
gnuv2_is_vtable_name (const char *name)
61
{
62
  return (((name)[0] == '_'
63
           && (((name)[1] == 'V' && (name)[2] == 'T')
64
               || ((name)[1] == 'v' && (name)[2] == 't'))
65
           && is_cplus_marker ((name)[3])) ||
66
          ((name)[0] == '_' && (name)[1] == '_'
67
           && (name)[2] == 'v' && (name)[3] == 't' && (name)[4] == '_'));
68
}
69
 
70
static int
71
gnuv2_is_operator_name (const char *name)
72
{
73
  return strncmp (name, "operator", 8) == 0;
74
}
75
 
76
 
77
/* Return a virtual function as a value.
78
   ARG1 is the object which provides the virtual function
79
   table pointer.  *ARG1P is side-effected in calling this function.
80
   F is the list of member functions which contains the desired virtual
81
   function.
82
   J is an index into F which provides the desired virtual function.
83
 
84
   TYPE is the type in which F is located.  */
85
static struct value *
86
gnuv2_virtual_fn_field (struct value **arg1p, struct fn_field * f, int j,
87
                        struct type * type, int offset)
88
{
89
  struct value *arg1 = *arg1p;
90
  struct type *type1 = check_typedef (value_type (arg1));
91
  struct type *entry_type;
92
  /* First, get the virtual function table pointer.  That comes
93
     with a strange type, so cast it to type `pointer to long' (which
94
     should serve just fine as a function type).  Then, index into
95
     the table, and convert final value to appropriate function type.  */
96
  struct value *entry;
97
  struct value *vfn;
98
  struct value *vtbl;
99
  LONGEST vi = (LONGEST) TYPE_FN_FIELD_VOFFSET (f, j);
100
  struct type *fcontext = TYPE_FN_FIELD_FCONTEXT (f, j);
101
  struct type *context;
102
  struct type *context_vptr_basetype;
103
  int context_vptr_fieldno;
104
 
105
  if (fcontext == NULL)
106
    /* We don't have an fcontext (e.g. the program was compiled with
107
       g++ version 1).  Try to get the vtbl from the TYPE_VPTR_BASETYPE.
108
       This won't work right for multiple inheritance, but at least we
109
       should do as well as GDB 3.x did.  */
110
    fcontext = TYPE_VPTR_BASETYPE (type);
111
  context = lookup_pointer_type (fcontext);
112
  /* Now context is a pointer to the basetype containing the vtbl.  */
113
  if (TYPE_TARGET_TYPE (context) != type1)
114
    {
115
      struct value *tmp = value_cast (context, value_addr (arg1));
116
 
117
      arg1 = value_ind (tmp);
118
      type1 = check_typedef (value_type (arg1));
119
    }
120
 
121
  context = type1;
122
  /* Now context is the basetype containing the vtbl.  */
123
 
124
  /* This type may have been defined before its virtual function table
125
     was.  If so, fill in the virtual function table entry for the
126
     type now.  */
127
  context_vptr_fieldno = get_vptr_fieldno (context, &context_vptr_basetype);
128
  /* FIXME: What to do if vptr_fieldno is still -1?  */
129
 
130
  /* The virtual function table is now an array of structures
131
     which have the form { int16 offset, delta; void *pfn; }.  */
132
  vtbl = value_primitive_field (arg1, 0, context_vptr_fieldno,
133
                                context_vptr_basetype);
134
 
135
  /* With older versions of g++, the vtbl field pointed to an array
136
     of structures.  Nowadays it points directly to the structure. */
137
  if (TYPE_CODE (value_type (vtbl)) == TYPE_CODE_PTR
138
      && TYPE_CODE (TYPE_TARGET_TYPE (value_type (vtbl))) == TYPE_CODE_ARRAY)
139
    {
140
      /* Handle the case where the vtbl field points to an
141
         array of structures. */
142
      vtbl = value_ind (vtbl);
143
 
144
      /* Index into the virtual function table.  This is hard-coded because
145
         looking up a field is not cheap, and it may be important to save
146
         time, e.g. if the user has set a conditional breakpoint calling
147
         a virtual function.  */
148
      entry = value_subscript (vtbl, vi);
149
    }
150
  else
151
    {
152
      /* Handle the case where the vtbl field points directly to a structure. */
153
      vtbl = value_ptradd (vtbl, vi);
154
      entry = value_ind (vtbl);
155
    }
156
 
157
  entry_type = check_typedef (value_type (entry));
158
 
159
  if (TYPE_CODE (entry_type) == TYPE_CODE_STRUCT)
160
    {
161
      /* Move the `this' pointer according to the virtual function table. */
162
      set_value_offset (arg1, value_offset (arg1) + value_as_long (value_field (entry, 0)));
163
 
164
      if (!value_lazy (arg1))
165
        {
166
          set_value_lazy (arg1, 1);
167
          value_fetch_lazy (arg1);
168
        }
169
 
170
      vfn = value_field (entry, 2);
171
    }
172
  else if (TYPE_CODE (entry_type) == TYPE_CODE_PTR)
173
    vfn = entry;
174
  else
175
    error (_("I'm confused:  virtual function table has bad type"));
176
  /* Reinstantiate the function pointer with the correct type.  */
177
  deprecated_set_value_type (vfn, lookup_pointer_type (TYPE_FN_FIELD_TYPE (f, j)));
178
 
179
  *arg1p = arg1;
180
  return vfn;
181
}
182
 
183
 
184
static struct type *
185
gnuv2_value_rtti_type (struct value *v, int *full, int *top, int *using_enc)
186
{
187
  struct type *known_type;
188
  struct type *rtti_type;
189
  CORE_ADDR vtbl;
190
  struct minimal_symbol *minsym;
191
  char *demangled_name, *p;
192
  struct type *btype;
193
  struct type *known_type_vptr_basetype;
194
  int known_type_vptr_fieldno;
195
 
196
  if (full)
197
    *full = 0;
198
  if (top)
199
    *top = -1;
200
  if (using_enc)
201
    *using_enc = 0;
202
 
203
  /* Get declared type */
204
  known_type = value_type (v);
205
  CHECK_TYPEDEF (known_type);
206
  /* RTTI works only or class objects */
207
  if (TYPE_CODE (known_type) != TYPE_CODE_CLASS)
208
    return NULL;
209
 
210
  /* Plan on this changing in the future as i get around to setting
211
     the vtables properly for G++ compiled stuff.  Also, I'll be using
212
     the type info functions, which are always right.  Deal with it
213
     until then.  */
214
 
215
  /* Try to get the vptr basetype, fieldno.  */
216
  known_type_vptr_fieldno = get_vptr_fieldno (known_type,
217
                                              &known_type_vptr_basetype);
218
 
219
  /* If we can't find it, give up.  */
220
  if (known_type_vptr_fieldno < 0)
221
    return NULL;
222
 
223
  /* Make sure our basetype and known type match, otherwise, cast
224
     so we can get at the vtable properly.
225
  */
226
  btype = known_type_vptr_basetype;
227
  CHECK_TYPEDEF (btype);
228
  if (btype != known_type )
229
    {
230
      v = value_cast (btype, v);
231
      if (using_enc)
232
        *using_enc=1;
233
    }
234
  /*
235
    We can't use value_ind here, because it would want to use RTTI, and
236
    we'd waste a bunch of time figuring out we already know the type.
237
    Besides, we don't care about the type, just the actual pointer
238
  */
239
  if (value_address (value_field (v, known_type_vptr_fieldno)) == 0)
240
    return NULL;
241
 
242
  vtbl = value_as_address (value_field (v, known_type_vptr_fieldno));
243
 
244
  /* Try to find a symbol that is the vtable */
245
  minsym=lookup_minimal_symbol_by_pc(vtbl);
246
  if (minsym==NULL
247
      || (demangled_name=SYMBOL_LINKAGE_NAME (minsym))==NULL
248
      || !is_vtable_name (demangled_name))
249
    return NULL;
250
 
251
  /* If we just skip the prefix, we get screwed by namespaces */
252
  demangled_name=cplus_demangle(demangled_name,DMGL_PARAMS|DMGL_ANSI);
253
  p = strchr (demangled_name, ' ');
254
  if (p)
255
    *p = '\0';
256
 
257
  /* Lookup the type for the name */
258
  /* FIXME: chastain/2003-11-26: block=NULL is bogus.  See pr gdb/1465. */
259
  rtti_type = cp_lookup_rtti_type (demangled_name, NULL);
260
  if (rtti_type == NULL)
261
    return NULL;
262
 
263
  if (TYPE_N_BASECLASSES(rtti_type) > 1 &&  full && (*full) != 1)
264
    {
265
      if (top)
266
        *top=TYPE_BASECLASS_BITPOS(rtti_type,TYPE_VPTR_FIELDNO(rtti_type))/8;
267
      if (top && ((*top) >0))
268
        {
269
          if (TYPE_LENGTH(rtti_type) > TYPE_LENGTH(known_type))
270
            {
271
              if (full)
272
                *full=0;
273
            }
274
          else
275
            {
276
              if (full)
277
                *full=1;
278
            }
279
        }
280
    }
281
  else
282
    {
283
      if (full)
284
        *full=1;
285
    }
286
 
287
  return rtti_type;
288
}
289
 
290
/* Return true if the INDEXth field of TYPE is a virtual baseclass
291
   pointer which is for the base class whose type is BASECLASS.  */
292
 
293
static int
294
vb_match (struct type *type, int index, struct type *basetype)
295
{
296
  struct type *fieldtype;
297
  char *name = TYPE_FIELD_NAME (type, index);
298
  char *field_class_name = NULL;
299
 
300
  if (*name != '_')
301
    return 0;
302
  /* gcc 2.4 uses _vb$.  */
303
  if (name[1] == 'v' && name[2] == 'b' && is_cplus_marker (name[3]))
304
    field_class_name = name + 4;
305
  /* gcc 2.5 will use __vb_.  */
306
  if (name[1] == '_' && name[2] == 'v' && name[3] == 'b' && name[4] == '_')
307
    field_class_name = name + 5;
308
 
309
  if (field_class_name == NULL)
310
    /* This field is not a virtual base class pointer.  */
311
    return 0;
312
 
313
  /* It's a virtual baseclass pointer, now we just need to find out whether
314
     it is for this baseclass.  */
315
  fieldtype = TYPE_FIELD_TYPE (type, index);
316
  if (fieldtype == NULL
317
      || TYPE_CODE (fieldtype) != TYPE_CODE_PTR)
318
    /* "Can't happen".  */
319
    return 0;
320
 
321
  /* What we check for is that either the types are equal (needed for
322
     nameless types) or have the same name.  This is ugly, and a more
323
     elegant solution should be devised (which would probably just push
324
     the ugliness into symbol reading unless we change the stabs format).  */
325
  if (TYPE_TARGET_TYPE (fieldtype) == basetype)
326
    return 1;
327
 
328
  if (TYPE_NAME (basetype) != NULL
329
      && TYPE_NAME (TYPE_TARGET_TYPE (fieldtype)) != NULL
330
      && strcmp (TYPE_NAME (basetype),
331
                 TYPE_NAME (TYPE_TARGET_TYPE (fieldtype))) == 0)
332
    return 1;
333
  return 0;
334
}
335
 
336
/* Compute the offset of the baseclass which is
337
   the INDEXth baseclass of class TYPE,
338
   for value at VALADDR (in host) at ADDRESS (in target).
339
   The result is the offset of the baseclass value relative
340
   to (the address of)(ARG) + OFFSET.
341
 
342
   -1 is returned on error. */
343
 
344
static int
345
gnuv2_baseclass_offset (struct type *type, int index,
346
                        const bfd_byte *valaddr, CORE_ADDR address)
347
{
348
  struct type *basetype = TYPE_BASECLASS (type, index);
349
 
350
  if (BASETYPE_VIA_VIRTUAL (type, index))
351
    {
352
      /* Must hunt for the pointer to this virtual baseclass.  */
353
      int i, len = TYPE_NFIELDS (type);
354
      int n_baseclasses = TYPE_N_BASECLASSES (type);
355
 
356
      /* First look for the virtual baseclass pointer
357
         in the fields.  */
358
      for (i = n_baseclasses; i < len; i++)
359
        {
360
          if (vb_match (type, i, basetype))
361
            {
362
              CORE_ADDR addr
363
                = unpack_pointer (TYPE_FIELD_TYPE (type, i),
364
                                  valaddr + (TYPE_FIELD_BITPOS (type, i) / 8));
365
 
366
              return addr - (LONGEST) address;
367
            }
368
        }
369
      /* Not in the fields, so try looking through the baseclasses.  */
370
      for (i = index + 1; i < n_baseclasses; i++)
371
        {
372
          int boffset =
373
            baseclass_offset (type, i, valaddr, address);
374
 
375
          if (boffset)
376
            return boffset;
377
        }
378
      /* Not found.  */
379
      return -1;
380
    }
381
 
382
  /* Baseclass is easily computed.  */
383
  return TYPE_BASECLASS_BITPOS (type, index) / 8;
384
}
385
 
386
static void
387
init_gnuv2_ops (void)
388
{
389
  gnu_v2_abi_ops.shortname = "gnu-v2";
390
  gnu_v2_abi_ops.longname = "GNU G++ Version 2 ABI";
391
  gnu_v2_abi_ops.doc = "G++ Version 2 ABI";
392
  gnu_v2_abi_ops.is_destructor_name = gnuv2_is_destructor_name;
393
  gnu_v2_abi_ops.is_constructor_name = gnuv2_is_constructor_name;
394
  gnu_v2_abi_ops.is_vtable_name = gnuv2_is_vtable_name;
395
  gnu_v2_abi_ops.is_operator_name = gnuv2_is_operator_name;
396
  gnu_v2_abi_ops.virtual_fn_field = gnuv2_virtual_fn_field;
397
  gnu_v2_abi_ops.rtti_type = gnuv2_value_rtti_type;
398
  gnu_v2_abi_ops.baseclass_offset = gnuv2_baseclass_offset;
399
}
400
 
401
extern initialize_file_ftype _initialize_gnu_v2_abi; /* -Wmissing-prototypes */
402
 
403
void
404
_initialize_gnu_v2_abi (void)
405
{
406
  init_gnuv2_ops ();
407
  register_cp_abi (&gnu_v2_abi_ops);
408
  set_cp_abi_as_auto_default (gnu_v2_abi_ops.shortname);
409
}

powered by: WebSVN 2.1.0

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