GDB (API)
|
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 }