xref: /openbsd/gnu/usr.bin/binutils/gdb/gnu-v3-abi.c (revision c6130722)
1b725ae77Skettenis /* Abstraction of GNU v3 abi.
2b725ae77Skettenis    Contributed by Jim Blandy <jimb@redhat.com>
3b725ae77Skettenis 
4b725ae77Skettenis    Copyright 2001, 2002, 2003 Free Software Foundation, Inc.
5b725ae77Skettenis 
6b725ae77Skettenis    This file is part of GDB.
7b725ae77Skettenis 
8b725ae77Skettenis    This program is free software; you can redistribute it and/or
9b725ae77Skettenis    modify it under the terms of the GNU General Public License as
10b725ae77Skettenis    published by the Free Software Foundation; either version 2 of the
11b725ae77Skettenis    License, or (at your option) any later version.
12b725ae77Skettenis 
13b725ae77Skettenis    This program is distributed in the hope that it will be useful,
14b725ae77Skettenis    but WITHOUT ANY WARRANTY; without even the implied warranty of
15b725ae77Skettenis    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16b725ae77Skettenis    GNU General Public License for more details.
17b725ae77Skettenis 
18b725ae77Skettenis    You should have received a copy of the GNU General Public License
19b725ae77Skettenis    along with this program; if not, write to the Free Software
20b725ae77Skettenis    Foundation, Inc., 59 Temple Place - Suite 330,
21b725ae77Skettenis    Boston, MA 02111-1307, USA.  */
22b725ae77Skettenis 
23b725ae77Skettenis #include "defs.h"
24b725ae77Skettenis #include "value.h"
25b725ae77Skettenis #include "cp-abi.h"
26b725ae77Skettenis #include "cp-support.h"
27b725ae77Skettenis #include "demangle.h"
28b725ae77Skettenis #include "gdb_assert.h"
29b725ae77Skettenis #include "gdb_string.h"
30b725ae77Skettenis 
31b725ae77Skettenis static struct cp_abi_ops gnu_v3_abi_ops;
32b725ae77Skettenis 
33b725ae77Skettenis static int
gnuv3_is_vtable_name(const char * name)34b725ae77Skettenis gnuv3_is_vtable_name (const char *name)
35b725ae77Skettenis {
36b725ae77Skettenis   return strncmp (name, "_ZTV", 4) == 0;
37b725ae77Skettenis }
38b725ae77Skettenis 
39b725ae77Skettenis static int
gnuv3_is_operator_name(const char * name)40b725ae77Skettenis gnuv3_is_operator_name (const char *name)
41b725ae77Skettenis {
42b725ae77Skettenis   return strncmp (name, "operator", 8) == 0;
43b725ae77Skettenis }
44b725ae77Skettenis 
45b725ae77Skettenis 
46b725ae77Skettenis /* To help us find the components of a vtable, we build ourselves a
47b725ae77Skettenis    GDB type object representing the vtable structure.  Following the
48b725ae77Skettenis    V3 ABI, it goes something like this:
49b725ae77Skettenis 
50b725ae77Skettenis    struct gdb_gnu_v3_abi_vtable {
51b725ae77Skettenis 
52b725ae77Skettenis      / * An array of virtual call and virtual base offsets.  The real
53b725ae77Skettenis          length of this array depends on the class hierarchy; we use
54b725ae77Skettenis          negative subscripts to access the elements.  Yucky, but
55b725ae77Skettenis          better than the alternatives.  * /
56b725ae77Skettenis      ptrdiff_t vcall_and_vbase_offsets[0];
57b725ae77Skettenis 
58b725ae77Skettenis      / * The offset from a virtual pointer referring to this table
59b725ae77Skettenis          to the top of the complete object.  * /
60b725ae77Skettenis      ptrdiff_t offset_to_top;
61b725ae77Skettenis 
62b725ae77Skettenis      / * The type_info pointer for this class.  This is really a
63b725ae77Skettenis          std::type_info *, but GDB doesn't really look at the
64b725ae77Skettenis          type_info object itself, so we don't bother to get the type
65b725ae77Skettenis          exactly right.  * /
66b725ae77Skettenis      void *type_info;
67b725ae77Skettenis 
68b725ae77Skettenis      / * Virtual table pointers in objects point here.  * /
69b725ae77Skettenis 
70b725ae77Skettenis      / * Virtual function pointers.  Like the vcall/vbase array, the
71b725ae77Skettenis          real length of this table depends on the class hierarchy.  * /
72b725ae77Skettenis      void (*virtual_functions[0]) ();
73b725ae77Skettenis 
74b725ae77Skettenis    };
75b725ae77Skettenis 
76b725ae77Skettenis    The catch, of course, is that the exact layout of this table
77b725ae77Skettenis    depends on the ABI --- word size, endianness, alignment, etc.  So
78b725ae77Skettenis    the GDB type object is actually a per-architecture kind of thing.
79b725ae77Skettenis 
80b725ae77Skettenis    vtable_type_gdbarch_data is a gdbarch per-architecture data pointer
81b725ae77Skettenis    which refers to the struct type * for this structure, laid out
82b725ae77Skettenis    appropriately for the architecture.  */
83b725ae77Skettenis static struct gdbarch_data *vtable_type_gdbarch_data;
84b725ae77Skettenis 
85b725ae77Skettenis 
86b725ae77Skettenis /* Human-readable names for the numbers of the fields above.  */
87b725ae77Skettenis enum {
88b725ae77Skettenis   vtable_field_vcall_and_vbase_offsets,
89b725ae77Skettenis   vtable_field_offset_to_top,
90b725ae77Skettenis   vtable_field_type_info,
91b725ae77Skettenis   vtable_field_virtual_functions
92b725ae77Skettenis };
93b725ae77Skettenis 
94b725ae77Skettenis 
95b725ae77Skettenis /* Return a GDB type representing `struct gdb_gnu_v3_abi_vtable',
96b725ae77Skettenis    described above, laid out appropriately for ARCH.
97b725ae77Skettenis 
98b725ae77Skettenis    We use this function as the gdbarch per-architecture data
99b725ae77Skettenis    initialization function.  We assume that the gdbarch framework
100b725ae77Skettenis    calls the per-architecture data initialization functions after it
101b725ae77Skettenis    sets current_gdbarch to the new architecture.  */
102b725ae77Skettenis static void *
build_gdb_vtable_type(struct gdbarch * arch)103b725ae77Skettenis build_gdb_vtable_type (struct gdbarch *arch)
104b725ae77Skettenis {
105b725ae77Skettenis   struct type *t;
106b725ae77Skettenis   struct field *field_list, *field;
107b725ae77Skettenis   int offset;
108b725ae77Skettenis 
109b725ae77Skettenis   struct type *void_ptr_type
110b725ae77Skettenis     = lookup_pointer_type (builtin_type_void);
111b725ae77Skettenis   struct type *ptr_to_void_fn_type
112b725ae77Skettenis     = lookup_pointer_type (lookup_function_type (builtin_type_void));
113b725ae77Skettenis 
114b725ae77Skettenis   /* ARCH can't give us the true ptrdiff_t type, so we guess.  */
115b725ae77Skettenis   struct type *ptrdiff_type
116b725ae77Skettenis     = init_type (TYPE_CODE_INT, TARGET_PTR_BIT / TARGET_CHAR_BIT, 0,
117b725ae77Skettenis                  "ptrdiff_t", 0);
118b725ae77Skettenis 
119b725ae77Skettenis   /* We assume no padding is necessary, since GDB doesn't know
120b725ae77Skettenis      anything about alignment at the moment.  If this assumption bites
121b725ae77Skettenis      us, we should add a gdbarch method which, given a type, returns
122b725ae77Skettenis      the alignment that type requires, and then use that here.  */
123b725ae77Skettenis 
124b725ae77Skettenis   /* Build the field list.  */
125b725ae77Skettenis   field_list = xmalloc (sizeof (struct field [4]));
126b725ae77Skettenis   memset (field_list, 0, sizeof (struct field [4]));
127b725ae77Skettenis   field = &field_list[0];
128b725ae77Skettenis   offset = 0;
129b725ae77Skettenis 
130b725ae77Skettenis   /* ptrdiff_t vcall_and_vbase_offsets[0]; */
131b725ae77Skettenis   FIELD_NAME (*field) = "vcall_and_vbase_offsets";
132b725ae77Skettenis   FIELD_TYPE (*field)
133b725ae77Skettenis     = create_array_type (0, ptrdiff_type,
134b725ae77Skettenis                          create_range_type (0, builtin_type_int, 0, -1));
135b725ae77Skettenis   FIELD_BITPOS (*field) = offset * TARGET_CHAR_BIT;
136b725ae77Skettenis   offset += TYPE_LENGTH (FIELD_TYPE (*field));
137b725ae77Skettenis   field++;
138b725ae77Skettenis 
139b725ae77Skettenis   /* ptrdiff_t offset_to_top; */
140b725ae77Skettenis   FIELD_NAME (*field) = "offset_to_top";
141b725ae77Skettenis   FIELD_TYPE (*field) = ptrdiff_type;
142b725ae77Skettenis   FIELD_BITPOS (*field) = offset * TARGET_CHAR_BIT;
143b725ae77Skettenis   offset += TYPE_LENGTH (FIELD_TYPE (*field));
144b725ae77Skettenis   field++;
145b725ae77Skettenis 
146b725ae77Skettenis   /* void *type_info; */
147b725ae77Skettenis   FIELD_NAME (*field) = "type_info";
148b725ae77Skettenis   FIELD_TYPE (*field) = void_ptr_type;
149b725ae77Skettenis   FIELD_BITPOS (*field) = offset * TARGET_CHAR_BIT;
150b725ae77Skettenis   offset += TYPE_LENGTH (FIELD_TYPE (*field));
151b725ae77Skettenis   field++;
152b725ae77Skettenis 
153b725ae77Skettenis   /* void (*virtual_functions[0]) (); */
154b725ae77Skettenis   FIELD_NAME (*field) = "virtual_functions";
155b725ae77Skettenis   FIELD_TYPE (*field)
156b725ae77Skettenis     = create_array_type (0, ptr_to_void_fn_type,
157b725ae77Skettenis                          create_range_type (0, builtin_type_int, 0, -1));
158b725ae77Skettenis   FIELD_BITPOS (*field) = offset * TARGET_CHAR_BIT;
159b725ae77Skettenis   offset += TYPE_LENGTH (FIELD_TYPE (*field));
160b725ae77Skettenis   field++;
161b725ae77Skettenis 
162b725ae77Skettenis   /* We assumed in the allocation above that there were four fields.  */
163b725ae77Skettenis   gdb_assert (field == (field_list + 4));
164b725ae77Skettenis 
165b725ae77Skettenis   t = init_type (TYPE_CODE_STRUCT, offset, 0, 0, 0);
166b725ae77Skettenis   TYPE_NFIELDS (t) = field - field_list;
167b725ae77Skettenis   TYPE_FIELDS (t) = field_list;
168b725ae77Skettenis   TYPE_TAG_NAME (t) = "gdb_gnu_v3_abi_vtable";
169b725ae77Skettenis 
170b725ae77Skettenis   return t;
171b725ae77Skettenis }
172b725ae77Skettenis 
173b725ae77Skettenis 
174b725ae77Skettenis /* Return the offset from the start of the imaginary `struct
175b725ae77Skettenis    gdb_gnu_v3_abi_vtable' object to the vtable's "address point"
176b725ae77Skettenis    (i.e., where objects' virtual table pointers point).  */
177b725ae77Skettenis static int
vtable_address_point_offset(void)178b725ae77Skettenis vtable_address_point_offset (void)
179b725ae77Skettenis {
180b725ae77Skettenis   struct type *vtable_type = gdbarch_data (current_gdbarch,
181b725ae77Skettenis 					   vtable_type_gdbarch_data);
182b725ae77Skettenis 
183b725ae77Skettenis   return (TYPE_FIELD_BITPOS (vtable_type, vtable_field_virtual_functions)
184b725ae77Skettenis           / TARGET_CHAR_BIT);
185b725ae77Skettenis }
186b725ae77Skettenis 
187b725ae77Skettenis 
188b725ae77Skettenis static struct type *
gnuv3_rtti_type(struct value * value,int * full_p,int * top_p,int * using_enc_p)189b725ae77Skettenis gnuv3_rtti_type (struct value *value,
190b725ae77Skettenis                  int *full_p, int *top_p, int *using_enc_p)
191b725ae77Skettenis {
192b725ae77Skettenis   struct type *vtable_type = gdbarch_data (current_gdbarch,
193b725ae77Skettenis 					   vtable_type_gdbarch_data);
194b725ae77Skettenis   struct type *value_type = check_typedef (VALUE_TYPE (value));
195b725ae77Skettenis   CORE_ADDR vtable_address;
196b725ae77Skettenis   struct value *vtable;
197b725ae77Skettenis   struct minimal_symbol *vtable_symbol;
198b725ae77Skettenis   const char *vtable_symbol_name;
199b725ae77Skettenis   const char *class_name;
200b725ae77Skettenis   struct type *run_time_type;
201b725ae77Skettenis   struct type *base_type;
202b725ae77Skettenis   LONGEST offset_to_top;
203b725ae77Skettenis 
204b725ae77Skettenis   /* We only have RTTI for class objects.  */
205b725ae77Skettenis   if (TYPE_CODE (value_type) != TYPE_CODE_CLASS)
206b725ae77Skettenis     return NULL;
207b725ae77Skettenis 
208b725ae77Skettenis   /* If we can't find the virtual table pointer for value_type, we
209b725ae77Skettenis      can't find the RTTI.  */
210b725ae77Skettenis   fill_in_vptr_fieldno (value_type);
211b725ae77Skettenis   if (TYPE_VPTR_FIELDNO (value_type) == -1)
212b725ae77Skettenis     return NULL;
213b725ae77Skettenis 
214b725ae77Skettenis   if (using_enc_p)
215b725ae77Skettenis     *using_enc_p = 0;
216b725ae77Skettenis 
217b725ae77Skettenis   /* Fetch VALUE's virtual table pointer, and tweak it to point at
218b725ae77Skettenis      an instance of our imaginary gdb_gnu_v3_abi_vtable structure.  */
219b725ae77Skettenis   base_type = check_typedef (TYPE_VPTR_BASETYPE (value_type));
220b725ae77Skettenis   if (value_type != base_type)
221b725ae77Skettenis     {
222b725ae77Skettenis       value = value_cast (base_type, value);
223b725ae77Skettenis       if (using_enc_p)
224b725ae77Skettenis 	*using_enc_p = 1;
225b725ae77Skettenis     }
226b725ae77Skettenis   vtable_address
227b725ae77Skettenis     = value_as_address (value_field (value, TYPE_VPTR_FIELDNO (value_type)));
228b725ae77Skettenis   vtable = value_at_lazy (vtable_type,
229b725ae77Skettenis                           vtable_address - vtable_address_point_offset (),
230b725ae77Skettenis                           VALUE_BFD_SECTION (value));
231b725ae77Skettenis 
232b725ae77Skettenis   /* Find the linker symbol for this vtable.  */
233b725ae77Skettenis   vtable_symbol
234b725ae77Skettenis     = lookup_minimal_symbol_by_pc (VALUE_ADDRESS (vtable)
235b725ae77Skettenis                                    + VALUE_OFFSET (vtable)
236b725ae77Skettenis                                    + VALUE_EMBEDDED_OFFSET (vtable));
237b725ae77Skettenis   if (! vtable_symbol)
238b725ae77Skettenis     return NULL;
239b725ae77Skettenis 
240b725ae77Skettenis   /* The symbol's demangled name should be something like "vtable for
241b725ae77Skettenis      CLASS", where CLASS is the name of the run-time type of VALUE.
242b725ae77Skettenis      If we didn't like this approach, we could instead look in the
243b725ae77Skettenis      type_info object itself to get the class name.  But this way
244b725ae77Skettenis      should work just as well, and doesn't read target memory.  */
245b725ae77Skettenis   vtable_symbol_name = SYMBOL_DEMANGLED_NAME (vtable_symbol);
246b725ae77Skettenis   if (vtable_symbol_name == NULL
247b725ae77Skettenis       || strncmp (vtable_symbol_name, "vtable for ", 11))
248b725ae77Skettenis     {
249b725ae77Skettenis       warning ("can't find linker symbol for virtual table for `%s' value",
250b725ae77Skettenis 	       TYPE_NAME (value_type));
251b725ae77Skettenis       if (vtable_symbol_name)
252b725ae77Skettenis 	warning ("  found `%s' instead", vtable_symbol_name);
253b725ae77Skettenis       return NULL;
254b725ae77Skettenis     }
255b725ae77Skettenis   class_name = vtable_symbol_name + 11;
256b725ae77Skettenis 
257b725ae77Skettenis   /* Try to look up the class name as a type name.  */
258b725ae77Skettenis   /* FIXME: chastain/2003-11-26: block=NULL is bogus.  See pr gdb/1465. */
259b725ae77Skettenis   run_time_type = cp_lookup_rtti_type (class_name, NULL);
260b725ae77Skettenis   if (run_time_type == NULL)
261b725ae77Skettenis     return NULL;
262b725ae77Skettenis 
263b725ae77Skettenis   /* Get the offset from VALUE to the top of the complete object.
264b725ae77Skettenis      NOTE: this is the reverse of the meaning of *TOP_P.  */
265b725ae77Skettenis   offset_to_top
266b725ae77Skettenis     = value_as_long (value_field (vtable, vtable_field_offset_to_top));
267b725ae77Skettenis 
268b725ae77Skettenis   if (full_p)
269b725ae77Skettenis     *full_p = (- offset_to_top == VALUE_EMBEDDED_OFFSET (value)
270b725ae77Skettenis                && (TYPE_LENGTH (VALUE_ENCLOSING_TYPE (value))
271b725ae77Skettenis                    >= TYPE_LENGTH (run_time_type)));
272b725ae77Skettenis   if (top_p)
273b725ae77Skettenis     *top_p = - offset_to_top;
274b725ae77Skettenis 
275b725ae77Skettenis   return run_time_type;
276b725ae77Skettenis }
277b725ae77Skettenis 
278b725ae77Skettenis 
279b725ae77Skettenis static struct value *
gnuv3_virtual_fn_field(struct value ** value_p,struct fn_field * f,int j,struct type * type,int offset)280b725ae77Skettenis gnuv3_virtual_fn_field (struct value **value_p,
281b725ae77Skettenis                         struct fn_field *f, int j,
282b725ae77Skettenis 			struct type *type, int offset)
283b725ae77Skettenis {
284b725ae77Skettenis   struct type *vtable_type = gdbarch_data (current_gdbarch,
285b725ae77Skettenis 					   vtable_type_gdbarch_data);
286b725ae77Skettenis   struct value *value = *value_p;
287b725ae77Skettenis   struct type *value_type = check_typedef (VALUE_TYPE (value));
288b725ae77Skettenis   struct type *vfn_base;
289b725ae77Skettenis   CORE_ADDR vtable_address;
290b725ae77Skettenis   struct value *vtable;
291b725ae77Skettenis   struct value *vfn;
292b725ae77Skettenis 
293b725ae77Skettenis   /* Some simple sanity checks.  */
294b725ae77Skettenis   if (TYPE_CODE (value_type) != TYPE_CODE_CLASS)
295b725ae77Skettenis     error ("Only classes can have virtual functions.");
296b725ae77Skettenis 
297b725ae77Skettenis   /* Find the base class that defines this virtual function.  */
298b725ae77Skettenis   vfn_base = TYPE_FN_FIELD_FCONTEXT (f, j);
299b725ae77Skettenis   if (! vfn_base)
300b725ae77Skettenis     /* In programs compiled with G++ version 1, the debug info doesn't
301b725ae77Skettenis        say which base class defined the virtual function.  We'll guess
302b725ae77Skettenis        it's the same base class that has our vtable; this is wrong for
303b725ae77Skettenis        multiple inheritance, but it's better than nothing.  */
304b725ae77Skettenis     vfn_base = TYPE_VPTR_BASETYPE (type);
305b725ae77Skettenis 
306b725ae77Skettenis   /* This type may have been defined before its virtual function table
307b725ae77Skettenis      was.  If so, fill in the virtual function table entry for the
308b725ae77Skettenis      type now.  */
309b725ae77Skettenis   if (TYPE_VPTR_FIELDNO (vfn_base) < 0)
310b725ae77Skettenis     fill_in_vptr_fieldno (vfn_base);
311b725ae77Skettenis   if (TYPE_VPTR_FIELDNO (vfn_base) < 0)
312b725ae77Skettenis     error ("Could not find virtual table pointer for class \"%s\".",
313b725ae77Skettenis 	   TYPE_TAG_NAME (vfn_base) ? TYPE_TAG_NAME (vfn_base) : "<unknown>");
314b725ae77Skettenis 
315b725ae77Skettenis   /* Now that we know which base class is defining our virtual
316b725ae77Skettenis      function, cast our value to that baseclass.  This takes care of
317b725ae77Skettenis      any necessary `this' adjustments.  */
318b725ae77Skettenis   if (vfn_base != value_type)
319b725ae77Skettenis     value = value_cast (vfn_base, value);
320b725ae77Skettenis 
321b725ae77Skettenis   /* Now value is an object of the appropriate base type.  Fetch its
322b725ae77Skettenis      virtual table.  */
323b725ae77Skettenis   /* It might be possible to do this cast at the same time as the above.
324b725ae77Skettenis      Does multiple inheritance affect this?
325b725ae77Skettenis      Can this even trigger, or is TYPE_VPTR_BASETYPE idempotent?
326b725ae77Skettenis   */
327b725ae77Skettenis   if (TYPE_VPTR_BASETYPE (vfn_base) != vfn_base)
328b725ae77Skettenis     value = value_cast (TYPE_VPTR_BASETYPE (vfn_base), value);
329b725ae77Skettenis   vtable_address
330b725ae77Skettenis     = value_as_address (value_field (value, TYPE_VPTR_FIELDNO (vfn_base)));
331b725ae77Skettenis 
332b725ae77Skettenis   vtable = value_at_lazy (vtable_type,
333b725ae77Skettenis                           vtable_address - vtable_address_point_offset (),
334b725ae77Skettenis                           VALUE_BFD_SECTION (value));
335b725ae77Skettenis 
336b725ae77Skettenis   /* Fetch the appropriate function pointer from the vtable.  */
337b725ae77Skettenis   vfn = value_subscript (value_field (vtable, vtable_field_virtual_functions),
338b725ae77Skettenis                          value_from_longest (builtin_type_int,
339b725ae77Skettenis                                              TYPE_FN_FIELD_VOFFSET (f, j)));
340b725ae77Skettenis 
341b725ae77Skettenis   /* Cast the function pointer to the appropriate type.  */
342b725ae77Skettenis   vfn = value_cast (lookup_pointer_type (TYPE_FN_FIELD_TYPE (f, j)),
343b725ae77Skettenis                     vfn);
344b725ae77Skettenis 
345b725ae77Skettenis   /* Is (type)value always numerically the same as (vfn_base)value?
346b725ae77Skettenis      If so we can spare this cast and use one of the ones above.  */
347b725ae77Skettenis   *value_p = value_addr (value_cast (type, *value_p));
348b725ae77Skettenis 
349b725ae77Skettenis   return vfn;
350b725ae77Skettenis }
351b725ae77Skettenis 
352b725ae77Skettenis /* Compute the offset of the baseclass which is
353b725ae77Skettenis    the INDEXth baseclass of class TYPE,
354b725ae77Skettenis    for value at VALADDR (in host) at ADDRESS (in target).
355b725ae77Skettenis    The result is the offset of the baseclass value relative
356b725ae77Skettenis    to (the address of)(ARG) + OFFSET.
357b725ae77Skettenis 
358b725ae77Skettenis    -1 is returned on error. */
359b725ae77Skettenis static int
gnuv3_baseclass_offset(struct type * type,int index,char * valaddr,CORE_ADDR address)360b725ae77Skettenis gnuv3_baseclass_offset (struct type *type, int index, char *valaddr,
361b725ae77Skettenis 			CORE_ADDR address)
362b725ae77Skettenis {
363b725ae77Skettenis   struct type *vtable_type = gdbarch_data (current_gdbarch,
364b725ae77Skettenis 					   vtable_type_gdbarch_data);
365b725ae77Skettenis   struct value *vtable;
366b725ae77Skettenis   struct type *vbasetype;
367b725ae77Skettenis   struct value *offset_val, *vbase_array;
368b725ae77Skettenis   CORE_ADDR vtable_address;
369b725ae77Skettenis   long int cur_base_offset, base_offset;
370b725ae77Skettenis 
371b725ae77Skettenis   /* If it isn't a virtual base, this is easy.  The offset is in the
372b725ae77Skettenis      type definition.  */
373b725ae77Skettenis   if (!BASETYPE_VIA_VIRTUAL (type, index))
374b725ae77Skettenis     return TYPE_BASECLASS_BITPOS (type, index) / 8;
375b725ae77Skettenis 
376b725ae77Skettenis   /* To access a virtual base, we need to use the vbase offset stored in
377b725ae77Skettenis      our vtable.  Recent GCC versions provide this information.  If it isn't
378b725ae77Skettenis      available, we could get what we needed from RTTI, or from drawing the
379b725ae77Skettenis      complete inheritance graph based on the debug info.  Neither is
380b725ae77Skettenis      worthwhile.  */
381b725ae77Skettenis   cur_base_offset = TYPE_BASECLASS_BITPOS (type, index) / 8;
382b725ae77Skettenis   if (cur_base_offset >= - vtable_address_point_offset ())
383b725ae77Skettenis     error ("Expected a negative vbase offset (old compiler?)");
384b725ae77Skettenis 
385b725ae77Skettenis   cur_base_offset = cur_base_offset + vtable_address_point_offset ();
386b725ae77Skettenis   if ((- cur_base_offset) % TYPE_LENGTH (builtin_type_void_data_ptr) != 0)
387b725ae77Skettenis     error ("Misaligned vbase offset.");
388b725ae77Skettenis   cur_base_offset = cur_base_offset
389b725ae77Skettenis     / ((int) TYPE_LENGTH (builtin_type_void_data_ptr));
390b725ae77Skettenis 
391b725ae77Skettenis   /* We're now looking for the cur_base_offset'th entry (negative index)
392b725ae77Skettenis      in the vcall_and_vbase_offsets array.  We used to cast the object to
393b725ae77Skettenis      its TYPE_VPTR_BASETYPE, and reference the vtable as TYPE_VPTR_FIELDNO;
394b725ae77Skettenis      however, that cast can not be done without calling baseclass_offset again
395b725ae77Skettenis      if the TYPE_VPTR_BASETYPE is a virtual base class, as described in the
396b725ae77Skettenis      v3 C++ ABI Section 2.4.I.2.b.  Fortunately the ABI guarantees that the
397b725ae77Skettenis      vtable pointer will be located at the beginning of the object, so we can
398b725ae77Skettenis      bypass the casting.  Verify that the TYPE_VPTR_FIELDNO is in fact at the
399b725ae77Skettenis      start of whichever baseclass it resides in, as a sanity measure - iff
400b725ae77Skettenis      we have debugging information for that baseclass.  */
401b725ae77Skettenis 
402b725ae77Skettenis   vbasetype = TYPE_VPTR_BASETYPE (type);
403b725ae77Skettenis   if (TYPE_VPTR_FIELDNO (vbasetype) < 0)
404b725ae77Skettenis     fill_in_vptr_fieldno (vbasetype);
405b725ae77Skettenis 
406b725ae77Skettenis   if (TYPE_VPTR_FIELDNO (vbasetype) >= 0
407b725ae77Skettenis       && TYPE_FIELD_BITPOS (vbasetype, TYPE_VPTR_FIELDNO (vbasetype)) != 0)
408b725ae77Skettenis     error ("Illegal vptr offset in class %s",
409b725ae77Skettenis 	   TYPE_NAME (vbasetype) ? TYPE_NAME (vbasetype) : "<unknown>");
410b725ae77Skettenis 
411b725ae77Skettenis   vtable_address = value_as_address (value_at_lazy (builtin_type_void_data_ptr,
412b725ae77Skettenis 						    address, NULL));
413b725ae77Skettenis   vtable = value_at_lazy (vtable_type,
414b725ae77Skettenis                           vtable_address - vtable_address_point_offset (),
415b725ae77Skettenis                           NULL);
416b725ae77Skettenis   offset_val = value_from_longest(builtin_type_int, cur_base_offset);
417b725ae77Skettenis   vbase_array = value_field (vtable, vtable_field_vcall_and_vbase_offsets);
418b725ae77Skettenis   base_offset = value_as_long (value_subscript (vbase_array, offset_val));
419b725ae77Skettenis   return base_offset;
420b725ae77Skettenis }
421b725ae77Skettenis 
422b725ae77Skettenis static void
init_gnuv3_ops(void)423b725ae77Skettenis init_gnuv3_ops (void)
424b725ae77Skettenis {
42511efff7fSkettenis   vtable_type_gdbarch_data = gdbarch_data_register_post_init (build_gdb_vtable_type);
426b725ae77Skettenis 
427b725ae77Skettenis   gnu_v3_abi_ops.shortname = "gnu-v3";
428b725ae77Skettenis   gnu_v3_abi_ops.longname = "GNU G++ Version 3 ABI";
429b725ae77Skettenis   gnu_v3_abi_ops.doc = "G++ Version 3 ABI";
430*c6130722Sjca   gnu_v3_abi_ops.is_destructor_name = (enum dtor_kinds (*)(const char *))is_gnu_v3_mangled_dtor;
431*c6130722Sjca   gnu_v3_abi_ops.is_constructor_name = (enum ctor_kinds (*)(const char *))is_gnu_v3_mangled_ctor;
432b725ae77Skettenis   gnu_v3_abi_ops.is_vtable_name = gnuv3_is_vtable_name;
433b725ae77Skettenis   gnu_v3_abi_ops.is_operator_name = gnuv3_is_operator_name;
434b725ae77Skettenis   gnu_v3_abi_ops.rtti_type = gnuv3_rtti_type;
435b725ae77Skettenis   gnu_v3_abi_ops.virtual_fn_field = gnuv3_virtual_fn_field;
436b725ae77Skettenis   gnu_v3_abi_ops.baseclass_offset = gnuv3_baseclass_offset;
437b725ae77Skettenis }
438b725ae77Skettenis 
439b725ae77Skettenis extern initialize_file_ftype _initialize_gnu_v3_abi; /* -Wmissing-prototypes */
440b725ae77Skettenis 
441b725ae77Skettenis void
_initialize_gnu_v3_abi(void)442b725ae77Skettenis _initialize_gnu_v3_abi (void)
443b725ae77Skettenis {
444b725ae77Skettenis   init_gnuv3_ops ();
445b725ae77Skettenis 
446b725ae77Skettenis   register_cp_abi (&gnu_v3_abi_ops);
447b725ae77Skettenis }
448