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