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