X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Fgnu-v2-abi.c;h=e577e2e55011095d14aac24dee9284cb1994d397;hb=9cce227f8cd3081662b208e0067b23547afa5a83;hp=57bc0d8b5304f63987a0d42dc5ff80f51ab2c92c;hpb=f5cf64a7277fc62fa3243371962c81fe198db64d;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/gnu-v2-abi.c b/gdb/gnu-v2-abi.c index 57bc0d8b53..e577e2e550 100644 --- a/gdb/gnu-v2-abi.c +++ b/gdb/gnu-v2-abi.c @@ -1,16 +1,15 @@ /* Abstraction of GNU v2 abi. - Copyright 2001, 2002, 2003, 2005 Free Software Foundation, Inc. + Copyright (C) 2001, 2002, 2003, 2005, 2007, 2008, 2009 + Free Software Foundation, Inc. Contributed by Daniel Berlin This file is part of GDB. - This program is free software; you can redistribute it and/or - modify - it under the terms of the GNU General Public License as published - by - the Free Software Foundation; either version 2 of the License, or + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, @@ -19,9 +18,7 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. */ + along with this program. If not, see . */ #include "defs.h" #include "gdb_string.h" @@ -92,8 +89,6 @@ gnuv2_virtual_fn_field (struct value **arg1p, struct fn_field * f, int j, { struct value *arg1 = *arg1p; struct type *type1 = check_typedef (value_type (arg1)); - - struct type *entry_type; /* First, get the virtual function table pointer. That comes with a strange type, so cast it to type `pointer to long' (which @@ -102,10 +97,12 @@ gnuv2_virtual_fn_field (struct value **arg1p, struct fn_field * f, int j, struct value *entry; struct value *vfn; struct value *vtbl; - struct value *vi = value_from_longest (builtin_type_int, - (LONGEST) TYPE_FN_FIELD_VOFFSET (f, j)); + LONGEST vi = (LONGEST) TYPE_FN_FIELD_VOFFSET (f, j); struct type *fcontext = TYPE_FN_FIELD_FCONTEXT (f, j); struct type *context; + struct type *context_vptr_basetype; + int context_vptr_fieldno; + if (fcontext == NULL) /* We don't have an fcontext (e.g. the program was compiled with g++ version 1). Try to get the vtbl from the TYPE_VPTR_BASETYPE. @@ -127,13 +124,13 @@ gnuv2_virtual_fn_field (struct value **arg1p, struct fn_field * f, int j, /* This type may have been defined before its virtual function table was. If so, fill in the virtual function table entry for the type now. */ - if (TYPE_VPTR_FIELDNO (context) < 0) - fill_in_vptr_fieldno (context); + context_vptr_fieldno = get_vptr_fieldno (context, &context_vptr_basetype); + /* FIXME: What to do if vptr_fieldno is still -1? */ /* The virtual function table is now an array of structures which have the form { int16 offset, delta; void *pfn; }. */ - vtbl = value_primitive_field (arg1, 0, TYPE_VPTR_FIELDNO (context), - TYPE_VPTR_BASETYPE (context)); + vtbl = value_primitive_field (arg1, 0, context_vptr_fieldno, + context_vptr_basetype); /* With older versions of g++, the vtbl field pointed to an array of structures. Nowadays it points directly to the structure. */ @@ -153,7 +150,7 @@ gnuv2_virtual_fn_field (struct value **arg1p, struct fn_field * f, int j, else { /* Handle the case where the vtbl field points directly to a structure. */ - vtbl = value_add (vtbl, vi); + vtbl = value_ptradd (vtbl, vi); entry = value_ind (vtbl); } @@ -175,7 +172,7 @@ gnuv2_virtual_fn_field (struct value **arg1p, struct fn_field * f, int j, else if (TYPE_CODE (entry_type) == TYPE_CODE_PTR) vfn = entry; else - error ("I'm confused: virtual function table has bad type"); + error (_("I'm confused: virtual function table has bad type")); /* Reinstantiate the function pointer with the correct type. */ deprecated_set_value_type (vfn, lookup_pointer_type (TYPE_FN_FIELD_TYPE (f, j))); @@ -196,8 +193,10 @@ gnuv2_value_rtti_type (struct value *v, int *full, int *top, int *using_enc) CORE_ADDR vtbl; struct minimal_symbol *minsym; struct symbol *sym; - char *demangled_name; + char *demangled_name, *p; struct type *btype; + struct type *known_type_vptr_basetype; + int known_type_vptr_fieldno; if (full) *full = 0; @@ -218,18 +217,18 @@ gnuv2_value_rtti_type (struct value *v, int *full, int *top, int *using_enc) the type info functions, which are always right. Deal with it until then. */ - /* If the type has no vptr fieldno, try to get it filled in */ - if (TYPE_VPTR_FIELDNO(known_type) < 0) - fill_in_vptr_fieldno(known_type); + /* Try to get the vptr basetype, fieldno. */ + known_type_vptr_fieldno = get_vptr_fieldno (known_type, + &known_type_vptr_basetype); - /* If we still can't find one, give up */ - if (TYPE_VPTR_FIELDNO(known_type) < 0) + /* If we can't find it, give up. */ + if (known_type_vptr_fieldno < 0) return NULL; /* Make sure our basetype and known type match, otherwise, cast so we can get at the vtable properly. */ - btype = TYPE_VPTR_BASETYPE (known_type); + btype = known_type_vptr_basetype; CHECK_TYPEDEF (btype); if (btype != known_type ) { @@ -242,21 +241,23 @@ gnuv2_value_rtti_type (struct value *v, int *full, int *top, int *using_enc) we'd waste a bunch of time figuring out we already know the type. Besides, we don't care about the type, just the actual pointer */ - if (VALUE_ADDRESS (value_field (v, TYPE_VPTR_FIELDNO (known_type))) == 0) + if (value_address (value_field (v, known_type_vptr_fieldno)) == 0) return NULL; - vtbl=value_as_address(value_field(v,TYPE_VPTR_FIELDNO(known_type))); + vtbl = value_as_address (value_field (v, known_type_vptr_fieldno)); /* Try to find a symbol that is the vtable */ minsym=lookup_minimal_symbol_by_pc(vtbl); if (minsym==NULL - || (demangled_name=DEPRECATED_SYMBOL_NAME (minsym))==NULL + || (demangled_name=SYMBOL_LINKAGE_NAME (minsym))==NULL || !is_vtable_name (demangled_name)) return NULL; /* If we just skip the prefix, we get screwed by namespaces */ demangled_name=cplus_demangle(demangled_name,DMGL_PARAMS|DMGL_ANSI); - *(strchr(demangled_name,' '))=0; + p = strchr (demangled_name, ' '); + if (p) + *p = '\0'; /* Lookup the type for the name */ /* FIXME: chastain/2003-11-26: block=NULL is bogus. See pr gdb/1465. */