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