GDB (API)
/home/stan/gdb/src/gdb/gnu-v2-abi.c
Go to the documentation of this file.
00001 /* Abstraction of GNU v2 abi.
00002 
00003    Copyright (C) 2001-2013 Free Software Foundation, Inc.
00004 
00005    Contributed by Daniel Berlin <dberlin@redhat.com>
00006 
00007    This file is part of GDB.
00008 
00009    This program is free software; you can redistribute it and/or modify
00010    it under the terms of the GNU General Public License as published by
00011    the Free Software Foundation; either version 3 of the License, or
00012    (at your option) any later version.
00013 
00014    This program is distributed in the hope that it will be useful,
00015    but WITHOUT ANY WARRANTY; without even the implied warranty of
00016    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00017    GNU General Public License for more details.
00018 
00019    You should have received a copy of the GNU General Public License
00020    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
00021 
00022 #include "defs.h"
00023 #include "gdb_string.h"
00024 #include "symtab.h"
00025 #include "gdbtypes.h"
00026 #include "value.h"
00027 #include "demangle.h"
00028 #include "gdb-demangle.h"
00029 #include "cp-abi.h"
00030 #include "cp-support.h"
00031 #include "exceptions.h"
00032 
00033 #include <ctype.h>
00034 
00035 struct cp_abi_ops gnu_v2_abi_ops;
00036 
00037 static int vb_match (struct type *, int, struct type *);
00038 
00039 static enum dtor_kinds
00040 gnuv2_is_destructor_name (const char *name)
00041 {
00042   if ((name[0] == '_' && is_cplus_marker (name[1]) && name[2] == '_')
00043       || strncmp (name, "__dt__", 6) == 0)
00044     return complete_object_dtor;
00045   else
00046     return 0;
00047 }
00048 
00049 static enum ctor_kinds
00050 gnuv2_is_constructor_name (const char *name)
00051 {
00052   if ((name[0] == '_' && name[1] == '_'
00053        && (isdigit (name[2]) || strchr ("Qt", name[2])))
00054       || strncmp (name, "__ct__", 6) == 0)
00055     return complete_object_ctor;
00056   else
00057     return 0;
00058 }
00059 
00060 static int
00061 gnuv2_is_vtable_name (const char *name)
00062 {
00063   return (((name)[0] == '_'
00064            && (((name)[1] == 'V' && (name)[2] == 'T')
00065                || ((name)[1] == 'v' && (name)[2] == 't'))
00066            && is_cplus_marker ((name)[3])) ||
00067           ((name)[0] == '_' && (name)[1] == '_'
00068            && (name)[2] == 'v' && (name)[3] == 't' && (name)[4] == '_'));
00069 }
00070 
00071 static int
00072 gnuv2_is_operator_name (const char *name)
00073 {
00074   return strncmp (name, "operator", 8) == 0;
00075 }
00076 
00077 
00078 /* Return a virtual function as a value.
00079    ARG1 is the object which provides the virtual function
00080    table pointer.  *ARG1P is side-effected in calling this function.
00081    F is the list of member functions which contains the desired virtual
00082    function.
00083    J is an index into F which provides the desired virtual function.
00084 
00085    TYPE is the type in which F is located.  */
00086 static struct value *
00087 gnuv2_virtual_fn_field (struct value **arg1p, struct fn_field * f, int j,
00088                         struct type * type, int offset)
00089 {
00090   struct value *arg1 = *arg1p;
00091   struct type *type1 = check_typedef (value_type (arg1));
00092   struct type *entry_type;
00093   /* First, get the virtual function table pointer.  That comes
00094      with a strange type, so cast it to type `pointer to long' (which
00095      should serve just fine as a function type).  Then, index into
00096      the table, and convert final value to appropriate function type.  */
00097   struct value *entry;
00098   struct value *vfn;
00099   struct value *vtbl;
00100   LONGEST vi = (LONGEST) TYPE_FN_FIELD_VOFFSET (f, j);
00101   struct type *fcontext = TYPE_FN_FIELD_FCONTEXT (f, j);
00102   struct type *context;
00103   struct type *context_vptr_basetype;
00104   int context_vptr_fieldno;
00105 
00106   if (fcontext == NULL)
00107     /* We don't have an fcontext (e.g. the program was compiled with
00108        g++ version 1).  Try to get the vtbl from the TYPE_VPTR_BASETYPE.
00109        This won't work right for multiple inheritance, but at least we
00110        should do as well as GDB 3.x did.  */
00111     fcontext = TYPE_VPTR_BASETYPE (type);
00112   context = lookup_pointer_type (fcontext);
00113   /* Now context is a pointer to the basetype containing the vtbl.  */
00114   if (TYPE_TARGET_TYPE (context) != type1)
00115     {
00116       struct value *tmp = value_cast (context, value_addr (arg1));
00117 
00118       arg1 = value_ind (tmp);
00119       type1 = check_typedef (value_type (arg1));
00120     }
00121 
00122   context = type1;
00123   /* Now context is the basetype containing the vtbl.  */
00124 
00125   /* This type may have been defined before its virtual function table
00126      was.  If so, fill in the virtual function table entry for the
00127      type now.  */
00128   context_vptr_fieldno = get_vptr_fieldno (context, &context_vptr_basetype);
00129   /* FIXME: What to do if vptr_fieldno is still -1?  */
00130 
00131   /* The virtual function table is now an array of structures
00132      which have the form { int16 offset, delta; void *pfn; }.  */
00133   vtbl = value_primitive_field (arg1, 0, context_vptr_fieldno,
00134                                 context_vptr_basetype);
00135 
00136   /* With older versions of g++, the vtbl field pointed to an array
00137      of structures.  Nowadays it points directly to the structure.  */
00138   if (TYPE_CODE (value_type (vtbl)) == TYPE_CODE_PTR
00139       && TYPE_CODE (TYPE_TARGET_TYPE (value_type (vtbl))) == TYPE_CODE_ARRAY)
00140     {
00141       /* Handle the case where the vtbl field points to an
00142          array of structures.  */
00143       vtbl = value_ind (vtbl);
00144 
00145       /* Index into the virtual function table.  This is hard-coded because
00146          looking up a field is not cheap, and it may be important to save
00147          time, e.g. if the user has set a conditional breakpoint calling
00148          a virtual function.  */
00149       entry = value_subscript (vtbl, vi);
00150     }
00151   else
00152     {
00153       /* Handle the case where the vtbl field points directly to a
00154          structure.  */
00155       vtbl = value_ptradd (vtbl, vi);
00156       entry = value_ind (vtbl);
00157     }
00158 
00159   entry_type = check_typedef (value_type (entry));
00160 
00161   if (TYPE_CODE (entry_type) == TYPE_CODE_STRUCT)
00162     {
00163       /* Move the `this' pointer according to the virtual function table.  */
00164       set_value_offset (arg1, value_offset (arg1)
00165                         + value_as_long (value_field (entry, 0)));
00166 
00167       if (!value_lazy (arg1))
00168         {
00169           set_value_lazy (arg1, 1);
00170           value_fetch_lazy (arg1);
00171         }
00172 
00173       vfn = value_field (entry, 2);
00174     }
00175   else if (TYPE_CODE (entry_type) == TYPE_CODE_PTR)
00176     vfn = entry;
00177   else
00178     error (_("I'm confused:  virtual function table has bad type"));
00179   /* Reinstantiate the function pointer with the correct type.  */
00180   deprecated_set_value_type (vfn,
00181                              lookup_pointer_type (TYPE_FN_FIELD_TYPE (f, j)));
00182 
00183   *arg1p = arg1;
00184   return vfn;
00185 }
00186 
00187 
00188 static struct type *
00189 gnuv2_value_rtti_type (struct value *v, int *full, int *top, int *using_enc)
00190 {
00191   struct type *known_type;
00192   struct type *rtti_type;
00193   CORE_ADDR vtbl;
00194   struct bound_minimal_symbol minsym;
00195   char *demangled_name, *p;
00196   const char *linkage_name;
00197   struct type *btype;
00198   struct type *known_type_vptr_basetype;
00199   int known_type_vptr_fieldno;
00200 
00201   if (full)
00202     *full = 0;
00203   if (top)
00204     *top = -1;
00205   if (using_enc)
00206     *using_enc = 0;
00207 
00208   /* Get declared type.  */
00209   known_type = value_type (v);
00210   CHECK_TYPEDEF (known_type);
00211   /* RTTI works only or class objects.  */
00212   if (TYPE_CODE (known_type) != TYPE_CODE_CLASS)
00213     return NULL;
00214 
00215   /* Plan on this changing in the future as i get around to setting
00216      the vtables properly for G++ compiled stuff.  Also, I'll be using
00217      the type info functions, which are always right.  Deal with it
00218      until then.  */
00219 
00220   /* Try to get the vptr basetype, fieldno.  */
00221   known_type_vptr_fieldno = get_vptr_fieldno (known_type,
00222                                               &known_type_vptr_basetype);
00223 
00224   /* If we can't find it, give up.  */
00225   if (known_type_vptr_fieldno < 0)
00226     return NULL;
00227 
00228   /* Make sure our basetype and known type match, otherwise, cast
00229      so we can get at the vtable properly.  */
00230   btype = known_type_vptr_basetype;
00231   CHECK_TYPEDEF (btype);
00232   if (btype != known_type )
00233     {
00234       v = value_cast (btype, v);
00235       if (using_enc)
00236         *using_enc=1;
00237     }
00238   /* We can't use value_ind here, because it would want to use RTTI, and
00239      we'd waste a bunch of time figuring out we already know the type.
00240      Besides, we don't care about the type, just the actual pointer.  */
00241   if (value_address (value_field (v, known_type_vptr_fieldno)) == 0)
00242     return NULL;
00243 
00244   vtbl = value_as_address (value_field (v, known_type_vptr_fieldno));
00245 
00246   /* Try to find a symbol that is the vtable.  */
00247   minsym=lookup_minimal_symbol_by_pc(vtbl);
00248   if (minsym.minsym==NULL
00249       || (linkage_name=SYMBOL_LINKAGE_NAME (minsym.minsym))==NULL
00250       || !is_vtable_name (linkage_name))
00251     return NULL;
00252 
00253   /* If we just skip the prefix, we get screwed by namespaces.  */
00254   demangled_name=cplus_demangle(linkage_name,DMGL_PARAMS|DMGL_ANSI);
00255   p = strchr (demangled_name, ' ');
00256   if (p)
00257     *p = '\0';
00258 
00259   /* Lookup the type for the name.  */
00260   /* FIXME: chastain/2003-11-26: block=NULL is bogus.  See pr gdb/1465.  */
00261   rtti_type = cp_lookup_rtti_type (demangled_name, NULL);
00262   if (rtti_type == NULL)
00263     return NULL;
00264 
00265   if (TYPE_N_BASECLASSES(rtti_type) > 1 &&  full && (*full) != 1)
00266     {
00267       if (top)
00268         *top = TYPE_BASECLASS_BITPOS (rtti_type,
00269                                       TYPE_VPTR_FIELDNO(rtti_type)) / 8;
00270       if (top && ((*top) >0))
00271         {
00272           if (TYPE_LENGTH(rtti_type) > TYPE_LENGTH(known_type))
00273             {
00274               if (full)
00275                 *full=0;
00276             }
00277           else
00278             {
00279               if (full)
00280                 *full=1;
00281             }
00282         }
00283     }
00284   else
00285     {
00286       if (full)
00287         *full=1;
00288     }
00289 
00290   return rtti_type;
00291 }
00292 
00293 /* Return true if the INDEXth field of TYPE is a virtual baseclass
00294    pointer which is for the base class whose type is BASECLASS.  */
00295 
00296 static int
00297 vb_match (struct type *type, int index, struct type *basetype)
00298 {
00299   struct type *fieldtype;
00300   const char *name = TYPE_FIELD_NAME (type, index);
00301   const char *field_class_name = NULL;
00302 
00303   if (*name != '_')
00304     return 0;
00305   /* gcc 2.4 uses _vb$.  */
00306   if (name[1] == 'v' && name[2] == 'b' && is_cplus_marker (name[3]))
00307     field_class_name = name + 4;
00308   /* gcc 2.5 will use __vb_.  */
00309   if (name[1] == '_' && name[2] == 'v' && name[3] == 'b' && name[4] == '_')
00310     field_class_name = name + 5;
00311 
00312   if (field_class_name == NULL)
00313     /* This field is not a virtual base class pointer.  */
00314     return 0;
00315 
00316   /* It's a virtual baseclass pointer, now we just need to find out whether
00317      it is for this baseclass.  */
00318   fieldtype = TYPE_FIELD_TYPE (type, index);
00319   if (fieldtype == NULL
00320       || TYPE_CODE (fieldtype) != TYPE_CODE_PTR)
00321     /* "Can't happen".  */
00322     return 0;
00323 
00324   /* What we check for is that either the types are equal (needed for
00325      nameless types) or have the same name.  This is ugly, and a more
00326      elegant solution should be devised (which would probably just push
00327      the ugliness into symbol reading unless we change the stabs format).  */
00328   if (TYPE_TARGET_TYPE (fieldtype) == basetype)
00329     return 1;
00330 
00331   if (TYPE_NAME (basetype) != NULL
00332       && TYPE_NAME (TYPE_TARGET_TYPE (fieldtype)) != NULL
00333       && strcmp (TYPE_NAME (basetype),
00334                  TYPE_NAME (TYPE_TARGET_TYPE (fieldtype))) == 0)
00335     return 1;
00336   return 0;
00337 }
00338 
00339 /* Compute the offset of the baseclass which is the INDEXth baseclass
00340    of class TYPE, for value at VALADDR (in host) at ADDRESS (in
00341    target).  The result is the offset of the baseclass value relative
00342    to (the address of)(ARG) + OFFSET.  */
00343 
00344 static int
00345 gnuv2_baseclass_offset (struct type *type, int index,
00346                         const bfd_byte *valaddr, int embedded_offset,
00347                         CORE_ADDR address, const struct value *val)
00348 {
00349   struct type *basetype = TYPE_BASECLASS (type, index);
00350 
00351   if (BASETYPE_VIA_VIRTUAL (type, index))
00352     {
00353       /* Must hunt for the pointer to this virtual baseclass.  */
00354       int i, len = TYPE_NFIELDS (type);
00355       int n_baseclasses = TYPE_N_BASECLASSES (type);
00356 
00357       /* First look for the virtual baseclass pointer
00358          in the fields.  */
00359       for (i = n_baseclasses; i < len; i++)
00360         {
00361           if (vb_match (type, i, basetype))
00362             {
00363               struct type *field_type;
00364               int field_offset;
00365               int field_length;
00366               CORE_ADDR addr;
00367 
00368               field_type = check_typedef (TYPE_FIELD_TYPE (type, i));
00369               field_offset = TYPE_FIELD_BITPOS (type, i) / 8;
00370               field_length = TYPE_LENGTH (field_type);
00371 
00372               if (!value_bytes_available (val, embedded_offset + field_offset,
00373                                           field_length))
00374                 throw_error (NOT_AVAILABLE_ERROR,
00375                              _("Virtual baseclass pointer is not available"));
00376 
00377               addr = unpack_pointer (field_type,
00378                                      valaddr + embedded_offset + field_offset);
00379 
00380               return addr - (LONGEST) address + embedded_offset;
00381             }
00382         }
00383       /* Not in the fields, so try looking through the baseclasses.  */
00384       for (i = index + 1; i < n_baseclasses; i++)
00385         {
00386           /* Don't go through baseclass_offset, as that wraps
00387              exceptions, thus, inner exceptions would be wrapped more
00388              than once.  */
00389           int boffset =
00390             gnuv2_baseclass_offset (type, i, valaddr,
00391                                     embedded_offset, address, val);
00392 
00393           if (boffset)
00394             return boffset;
00395         }
00396 
00397       error (_("Baseclass offset not found"));
00398     }
00399 
00400   /* Baseclass is easily computed.  */
00401   return TYPE_BASECLASS_BITPOS (type, index) / 8;
00402 }
00403 
00404 static void
00405 init_gnuv2_ops (void)
00406 {
00407   gnu_v2_abi_ops.shortname = "gnu-v2";
00408   gnu_v2_abi_ops.longname = "GNU G++ Version 2 ABI";
00409   gnu_v2_abi_ops.doc = "G++ Version 2 ABI";
00410   gnu_v2_abi_ops.is_destructor_name = gnuv2_is_destructor_name;
00411   gnu_v2_abi_ops.is_constructor_name = gnuv2_is_constructor_name;
00412   gnu_v2_abi_ops.is_vtable_name = gnuv2_is_vtable_name;
00413   gnu_v2_abi_ops.is_operator_name = gnuv2_is_operator_name;
00414   gnu_v2_abi_ops.virtual_fn_field = gnuv2_virtual_fn_field;
00415   gnu_v2_abi_ops.rtti_type = gnuv2_value_rtti_type;
00416   gnu_v2_abi_ops.baseclass_offset = gnuv2_baseclass_offset;
00417 }
00418 
00419 extern initialize_file_ftype _initialize_gnu_v2_abi; /* -Wmissing-prototypes */
00420 
00421 void
00422 _initialize_gnu_v2_abi (void)
00423 {
00424   init_gnuv2_ops ();
00425   register_cp_abi (&gnu_v2_abi_ops);
00426 }
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Defines