[gnu.g++.bug] Question on virtual function tables

ham@Neon.Stanford.EDU (Peter R. Ham) (11/21/89)

 	I've taken a look at the virtual function tables created by
g++ on the pmax and I have some questions?
	What exactly is the layout? I see some pre-amble type
information for each table. Then there are two words of information
for each virtual function: the address of a virtual function and a
"delta" to "fixup" this with. I don't really understand this delta.
	I have a test case using multiple inheritance where the
delta is negative. I assume that this means that "this" at some
point had to been offset positively, but I don't see any positive
deltas in any of the other virtual function tables and haven't
been able to generate any. Can "this" only be offset positively
by a cast?
	I would appreciate some small example that illustrates
how these deltas are used. Included are the C++ source
and resulting assembly of my example:


class a {
 public:
  virtual void vf1();
  virtual void vf2();
  int f1;
  int f2;
};

class b { 
 public:
  virtual void vf1();
  virtual void vf3();
  int f3;
  int f4;
};


class c : public b, public a {
public:
  virtual void vf1();
  int f7;
  int f8;
};

class d: public c  {
public:
  virtual void vf1();
  int f5;
  int f6;
};


a a1;
b b1;
c c1;
d d1;

void
foo(c x)
{
  x.vf1();
}

 #	.verstamp	2 0
gcc_compiled.:
	.globl a1
.data
	.align 2
a1:
	.space 12
	.globl b1
	.align 2
b1:
	.space 12
	.globl c1
	.align 2
c1:
	.space 32
	.globl d1
	.align 2
d1:
	.space 40
.text
	.align 2
	.globl foo__FG1c
	.ent	foo__FG1c
foo__FG1c:
	subu	$29,8	# saveregs=    8
	.frame	$30,0,$31
	.mask	0xc0000000,-4
	sw	$31,4($29)
	sw	$30,0($29)
	addiu	$30,$29,8	# define fp
	addu	$2,$0,$30	#movsi	$30 -> $2 
	lw	$3,8($30)	#movsi 8($30) -> $3
	lh	$4,8($3)	#sign extendhisi2 8($3) -> $4
	addiu	$29,$29,0xfff0	#subsi3	$29,16 -> $29
	addu	$4,$2,$4	#addsi3	$2,$4 -> $4
	lw	$2,12($3)	#movsi 12($3) -> $2
	jal	$31,$2	# call with  16 arguments (reg)
	addiu	$29,$29,0x10	#addsi3	$29,16 -> $29
	addu	$8,$0,$30	# don't trust sp?
	lw	$31,-4($8)
	lw	$30,-8($8)
	addu	$29,$0,$8	# sp not trusted  here 
	j	$31
 	.end	foo__FG1c
	.align 2
	.globl __sti__short_c
	.ent	__sti__short_c
__sti__short_c:
	subu	$29,8	# saveregs=    8
	.frame	$30,0,$31
	.mask	0x40000000,-4
	sw	$30,4($29)
	addiu	$30,$29,8	# define fp
	la	$3,__vtbl__a	#movsi __vtbl__a -> $3
	sw	$3,a1+8	#movsi $3 -> a1+8
	la	$3,__vtbl__b	#movsi __vtbl__b -> $3
	sw	$3,b1+8	#movsi $3 -> b1+8
	la	$2,c1+12	#movsi c1+12(AExp) -> $2
	la	$3,__vtbl__c$a	#movsi __vtbl__c$a -> $3
	sw	$3,c1+20	#movsi $3 -> c1+20
	la	$3,__vtbl__c	#movsi __vtbl__c -> $3
	sw	$3,-4($2)	#movsi $3 -> -4($2)
	la	$3,__vtbl__c$a	#movsi __vtbl__c$a -> $3
	sw	$3,d1+20	#movsi $3 -> d1+20
	la	$2,d1	#movsi d1 -> $2
	la	$3,__vtbl__d$c	#movsi __vtbl__d$c -> $3
	sw	$3,d1+8	#movsi $3 -> d1+8
	la	$3,__vtbl__d	#movsi __vtbl__d -> $3
	sw	$3,8($2)	#movsi $3 -> 8($2)
	addu	$8,$0,$30	# don't trust sp?
	lw	$30,-4($8)
	addu	$29,$0,$8	# sp not trusted  here 
	j	$31
 	.end	__sti__short_c
.data
	.align 3
__vtbl__d:
	.half 0
	.half 0
	.word 2
	.half 0
	.half 0
	.word vf1__1d
	.half 0
	.half 0
	.word vf3__1b
	.align 3
__vtbl__d$c:
	.half 0
	.half 0
	.word 2
	.half 0
	.half 0
	.word vf1__1d
	.half 0
	.half 0
	.word vf3__1b
	.align 3
__vtbl__c:
	.half 0
	.half 0
	.word 2
	.half 0
	.half 0
	.word vf1__1c
	.half 0
	.half 0
	.word vf3__1b
	.align 3
__vtbl__c$a:
	.half 0
	.half 0
	.word 2
	.half -12
	.half 0
	.word vf1__1c
	.half 0
	.half 0
	.word vf2__1a
	.align 3
__vtbl__b:
	.half 0
	.half 0
	.word 2
	.half 0
	.half 0
	.word vf1__1b
	.half 0
	.half 0
	.word vf3__1b
	.align 3
__vtbl__a:
	.half 0
	.half 0
	.word 2
	.half 0
	.half 0
	.word vf1__1a
	.half 0
	.half 0
	.word vf2__1a
--
Peter Ham			PO Box 3430	(h)(415) 322-4390
MS Computer Science Student	Stanford, CA	ham@cs.stanford.edu
Stanford University 		94309		(o)(415) 723-2067