c++/6830: Virtual table layout: wrong vcall/vbase order for primary base class

Nathan Sidwell nathan@codesourcery.com
Wed Jul 3 13:25:00 GMT 2002


http://gcc.gnu.org/cgi-bin/gnatsweb.pl?cmd=view%20audit-trail&database=gcc&pr=6830

not a bug. You are misinterpreting the ABI spec.

(you do know about the -fdump-class-hierarchy flag don't you?) Anyway.
The V::g thunk in S's vtable uses a vcall offset that you should consider
part of S's vtable (not P's, the overridden class). So the vcall offset
is at a lower index than the vbase offsets.

This is the bit from 2.5.2 in the ABI (my emphasis)
	Virtual call (vcall) offsets are used to perform ... These entries are
	allocated in the virtual table for the *virtual* base class that is *most
	immediately derived* from the base class containing the overridden.

Here the most immediately derived virtual base on the path from P->S->V is S.
The (ia32) vtable for V is and should be
12	vbase offset V to R
4	vbase offset V to S
0	offset to top
TI	type info
.... primary vptr here
v::g	final overrider
... start of secondary vtable (that for S)
-4	vcall offset (to V) for V::g thunk
8	vbase offset S to R
-4	offset to top
TI	type info
vthunk(-4) to V::g

nathan

-- 
Dr Nathan Sidwell   ::   http://www.codesourcery.com   ::   CodeSourcery LLC
         'But that's a lie.' - 'Yes it is. What's your point?'
nathan@codesourcery.com : http://www.cs.bris.ac.uk/~nathan/ : nathan@acm.org



More information about the Gcc-bugs mailing list