This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug c++/15097] New: code generator problem with ::delete and multiple inheritance
- From: "wolfgang dot roehrl at de dot gi-de dot com" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: 23 Apr 2004 11:01:18 -0000
- Subject: [Bug c++/15097] New: code generator problem with ::delete and multiple inheritance
- Reply-to: gcc-bugzilla at gcc dot gnu dot org
Used invokation line for the C++ compiler:
ccppc -c -x c++ -ansi -Wall -Werror -mcpu=8540 -fverbose-asm -mbig -mmultiple
-mno-string -mstrict-align -O3 -fno-exceptions -fno-rtti
-I<different include paths>
-D<differen #define's>
Z.CPP -oZ.O
// example program
class B1
{
public:
virtual ~B1 () throw();
protected:
B1 ();
private:
int x;
};
class B2
{
public:
virtual ~B2 () throw();
protected:
B2 ();
private:
int x;
};
class D : public B1, public B2
{
public:
D ();
~D () throw();
private:
int y;
};
void f1 (D*);
void f2 (B2*);
void f3 (B1*);
void f (void)
{
f1 (::new D);
f2 (::new D); // correct address adjustement D -> B2, see assembler
listing
f3 (::new D);
}
void f1 (D* p) { ::delete p; }
void f2 (B2* p) { ::delete p; } // missing address adjustment B2 -> D for the
call of ::operator delete()
void f3 (B1* p) { ::delete p; }
In function f2() the deallocation function ::operator delete() (assembler
call 'bl _ZdlPv') is called, but the deallocation function does not get the
address of the
dynamic D-object.
The corresponding assembler listing is attached below.
I think that the code above is legal, cf. the C++ standard 5.3.4/9, 5.3.4/18
(for constructor exceptions) and 5.3.5/8.
**************************************
assembler listing
**************************************
.file "z.CPP"
# rs6000/powerpc options: -mcpu=8540 -msdata=data
# GNU C++ version 3.3-e500 20030421 (Wind River) (powerpc-wrs-vxworks)
# compiled by GNU C version 3.2.2.
# GGC heuristics: --param ggc-min-expand=47 --param ggc-min-heapsize=32684
# options passed: -I. -ID:\\GNU_NG\\target\\h
# -ID:\\GNU_NG\\target\\h\\types -ID:\\GNU_NG\\target\\h\\arch\\ppc
# -iprefix -D__GNUC__=3 -D__GNUC_MINOR__=3 -D__GNUC_PATCHLEVEL__=0
# -DCPU=PPC85XX -DTOOL_FAMILY=gnu -DTOOL=gnu -D__GNUG__=3 -mcpu=8540 -mbig
# -mmultiple -mno-string -mstrict-align -ansi -auxbase-strip -O3 -Wall
# -Werror -ansi -fverbose-asm -fno-exceptions -fno-rtti -oz.ASS
# options enabled: -fdefer-pop -fomit-frame-pointer
# -foptimize-sibling-calls -fcse-follow-jumps -fcse-skip-blocks
# -fexpensive-optimizations -fthread-jumps -fstrength-reduce -fpeephole
# -fforce-mem -ffunction-cse -fkeep-static-consts -fcaller-saves
# -freg-struct-return -fgcse -fgcse-lm -fgcse-sm -floop-optimize
# -fcrossjumping -fif-conversion -fif-conversion2 -frerun-cse-after-loop
# -frerun-loop-opt -fdelete-null-pointer-checks -fschedule-insns
# -fschedule-insns2 -fsched-interblock -fsched-spec -fbranch-count-reg
# -freorder-blocks -freorder-functions -frename-registers
# -fcprop-registers -fcommon -fverbose-asm -fregmove
# -foptimize-register-move -fargument-alias -fstrict-aliasing
# -fmerge-constants -fzero-initialized-in-bss -fident -fpeephole2
# -fguess-branch-probability -fmath-errno -ftrapping-math -mpowerpc
# -mpowerpc-gfxopt -mnew-mnemonics -mmultiple -mno-multiple -mno-string
# -msched-prolog -msched-epilog -mstrict-align -meabi -mcpu=8540
# -mcall-sysv -msdata=data
.globl _ZTV1D
.section .rodata
.align 3
.type _ZTV1D, @object
.size _ZTV1D, 32
_ZTV1D:
.long 0
.long 0
.long _ZN1DD1Ev
.long _ZN1DD0Ev
.long -8
.long 0
.long _ZThn8_N1DD1Ev
.long _ZThn8_N1DD0Ev
.section ".text"
.align 2
.globl _ZN1DC2Ev
.type _ZN1DC2Ev, @function
_ZN1DC2Ev:
stwu 1,-24(1)
mflr 7
stmw 29,12(1)
stw 7,28(1)
mr 29,3 # this
bl _ZN2B1C2Ev
addi 3,29,8 # this, this
bl _ZN2B2C2Ev
lis 3,_ZTV1D+24@ha
la 0,_ZTV1D+24@l(3)
lwz 3,28(1)
lis 5,_ZTV1D+8@ha
li 6,1
la 4,_ZTV1D+8@l(5)
stw 6,16(29) # <variable>.y
stw 4,0(29) # <variable>._vptr$B1
mtlr 3
stw 0,8(29) # <variable>._vptr$B2
lmw 29,12(1)
addi 1,1,24
blr
.size _ZN1DC2Ev, .-_ZN1DC2Ev
.align 2
.globl _ZN1DC1Ev
.type _ZN1DC1Ev, @function
_ZN1DC1Ev:
stwu 1,-24(1)
mflr 7
stmw 29,12(1)
stw 7,28(1)
mr 29,3 # this
bl _ZN2B1C2Ev
addi 3,29,8 # this, this
bl _ZN2B2C2Ev
lis 3,_ZTV1D+24@ha
la 0,_ZTV1D+24@l(3)
lwz 3,28(1)
lis 5,_ZTV1D+8@ha
li 6,1
la 4,_ZTV1D+8@l(5)
stw 6,16(29) # <variable>.y
stw 4,0(29) # <variable>._vptr$B1
mtlr 3
stw 0,8(29) # <variable>._vptr$B2
lmw 29,12(1)
addi 1,1,24
blr
.size _ZN1DC1Ev, .-_ZN1DC1Ev
.align 2
.globl _ZN1DD2Ev
.type _ZN1DD2Ev, @function
_ZN1DD2Ev:
stwu 1,-24(1)
lis 6,_ZTV1D+8@ha
lis 5,_ZTV1D+24@ha
mflr 7
la 0,_ZTV1D+24@l(5)
stmw 29,12(1)
li 4,-1
mr 29,3 # this
stw 7,28(1)
la 3,_ZTV1D+8@l(6)
stw 0,8(29) # <variable>._vptr$B2
stw 3,0(29) # <variable>._vptr$B1
addi 3,29,8 # this, this
stw 4,16(29) # <variable>.y
bl _ZN2B2D2Ev
mr 3,29 # this
bl _ZN2B1D2Ev
lmw 29,12(1)
lwz 3,28(1)
addi 1,1,24
mtlr 3
blr
.size _ZN1DD2Ev, .-_ZN1DD2Ev
.align 2
.globl _ZN1DD1Ev
.type _ZN1DD1Ev, @function
_ZN1DD1Ev:
stwu 1,-24(1)
lis 6,_ZTV1D+8@ha
lis 5,_ZTV1D+24@ha
mflr 7
la 0,_ZTV1D+24@l(5)
stmw 29,12(1)
li 4,-1
mr 29,3 # this
stw 7,28(1)
la 3,_ZTV1D+8@l(6)
stw 0,8(29) # <variable>._vptr$B2
stw 3,0(29) # <variable>._vptr$B1
addi 3,29,8 # this, this
stw 4,16(29) # <variable>.y
bl _ZN2B2D2Ev
mr 3,29 # this
bl _ZN2B1D2Ev
lmw 29,12(1)
lwz 3,28(1)
addi 1,1,24
mtlr 3
blr
.size _ZN1DD1Ev, .-_ZN1DD1Ev
.align 2
.globl _ZThn8_N1DD1Ev
.type _ZThn8_N1DD1Ev, @function
_ZThn8_N1DD1Ev:
addi 3,3,-8
b _ZN1DD1Ev
.size _ZThn8_N1DD1Ev, .-_ZThn8_N1DD1Ev
.align 2
.globl _ZN1DD0Ev
.type _ZN1DD0Ev, @function
_ZN1DD0Ev:
stwu 1,-24(1)
lis 6,_ZTV1D+8@ha
lis 5,_ZTV1D+24@ha
mflr 7
la 0,_ZTV1D+24@l(5)
stmw 29,12(1)
li 4,-1
mr 29,3 # this
stw 7,28(1)
la 3,_ZTV1D+8@l(6)
stw 0,8(29) # <variable>._vptr$B2
stw 4,16(29) # <variable>.y
stw 3,0(29) # <variable>._vptr$B1
addi 3,29,8 # this, this
bl _ZN2B2D2Ev
mr 3,29 # this
bl _ZN2B1D2Ev
mr 3,29 # this
bl _ZdlPv
lmw 29,12(1)
lwz 3,28(1)
addi 1,1,24
mtlr 3
blr
.size _ZN1DD0Ev, .-_ZN1DD0Ev
.align 2
.globl _ZThn8_N1DD0Ev
.type _ZThn8_N1DD0Ev, @function
_ZThn8_N1DD0Ev:
addi 3,3,-8
b _ZN1DD0Ev
.size _ZThn8_N1DD0Ev, .-_ZThn8_N1DD0Ev
.align 2
.globl _Z1fv
.type _Z1fv, @function
_Z1fv:
stwu 1,-40(1)
mflr 3
stw 3,44(1)
stmw 25,12(1)
li 3,20
li 25,1
bl _Znwj
mr 28,3 # this
bl _ZN2B1C2Ev
addi 3,28,8 # this, this
bl _ZN2B2C2Ev
lis 4,_ZTV1D+24@ha
lis 5,_ZTV1D+8@ha
stw 25,16(28) # <variable>.y
la 26,_ZTV1D+8@l(5)
la 27,_ZTV1D+24@l(4)
stw 26,0(28) # <variable>._vptr$B1
mr 3,28 # this
stw 27,8(28) # <variable>._vptr$B2
bl _Z2f1P1D
li 3,20
bl _Znwj
addi 28,3,8 # this, this
mr 29,3 # this
bl _ZN2B1C2Ev
mr 3,28 # this
bl _ZN2B2C2Ev
stw 27,8(29) # <variable>._vptr$B2
stw 25,16(29) # <variable>.y
mr 3,28 # this
stw 26,0(29) # <variable>._vptr$B1
bl _Z2f2P2B2
li 3,20
bl _Znwj
mr 28,3 # this
bl _ZN2B1C2Ev
addi 3,28,8 # this, this
bl _ZN2B2C2Ev
stw 25,16(28) # <variable>.y
stw 26,0(28) # <variable>._vptr$B1
mr 3,28 # this
stw 27,8(28) # <variable>._vptr$B2
bl _Z2f3P2B1
lmw 25,12(1)
lwz 3,44(1)
addi 1,1,40
mtlr 3
blr
.size _Z1fv, .-_Z1fv
.align 2
.globl _Z2f1P1D
.type _Z2f1P1D, @function
_Z2f1P1D:
stwu 1,-24(1)
mflr 4
cmpwi 0,3,0 # p
stw 31,20(1)
mr 31,3 # p
stw 4,28(1)
beq- 0,.L21
lwz 5,0(3) # <variable>._vptr$B1
lwz 0,0(5)
mtctr 0
bctrl
mr 3,31 # p
bl _ZdlPv
.L21:
lwz 3,28(1)
lwz 31,20(1)
addi 1,1,24
mtlr 3
blr
.size _Z2f1P1D, .-_Z2f1P1D
.align 2
.globl _Z2f2P2B2
.type _Z2f2P2B2, @function
_Z2f2P2B2:
stwu 1,-24(1)
mflr 4
cmpwi 0,3,0 # p
stw 31,20(1)
mr 31,3 # p
stw 4,28(1)
beq- 0,.L24
lwz 5,0(3) # <variable>._vptr$B2
lwz 0,0(5)
mtctr 0
bctrl
mr 3,31 # p
bl _ZdlPv
.L24:
lwz 3,28(1)
lwz 31,20(1)
addi 1,1,24
mtlr 3
blr
.size _Z2f2P2B2, .-_Z2f2P2B2
.align 2
.globl _Z2f3P2B1
.type _Z2f3P2B1, @function
_Z2f3P2B1:
stwu 1,-24(1)
mflr 4
cmpwi 0,3,0 # p
stw 31,20(1)
mr 31,3 # p
stw 4,28(1)
beq- 0,.L27
lwz 5,0(3) # <variable>._vptr$B1
lwz 0,0(5)
mtctr 0
bctrl
mr 3,31 # p
bl _ZdlPv
.L27:
lwz 3,28(1)
lwz 31,20(1)
addi 1,1,24
mtlr 3
blr
.size _Z2f3P2B1, .-_Z2f3P2B1
.ident "GCC: (GNU) 3.3-e500 20030421 (Wind River)"
--
Summary: code generator problem with ::delete and multiple
inheritance
Product: gcc
Version: 3.3
Status: UNCONFIRMED
Severity: normal
Priority: P2
Component: c++
AssignedTo: unassigned at gcc dot gnu dot org
ReportedBy: wolfgang dot roehrl at de dot gi-de dot com
CC: gcc-bugs at gcc dot gnu dot org
GCC build triplet: sparc-sun-solaris2.5.1
GCC host triplet: i386-pc-mingw32
GCC target triplet: powerpc-wrs-vxworks
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=15097