rjc@CS.UCLA.EDU (Robert Collins) (01/08/90)
Sun4/330, SunOS 4.0.3, latest version of g++-1.36.2
Michael,
Here is a short piece of code, it's compilation and execution, and the
assembler produced for the code.
The code calculates the size of an array of objects, and creates the array.
The bug is that the array is not created (nor destroyed). This was not
any easy one to track down--naturally the program didn't just die
immediately nor consistently...things are never that easy...
Thanks,
rob collins
rjc@cs.ucla.edu
Script started on Sun Jan 7 18:39:08 1990
pollux% cat a.cc
#include <stdio.h>
class foo {
private:
int i;
public:
foo(int i = 1);
~foo();
};
foo::foo(int init) : i(init) { printf("constructing foo\n"); }
foo::~foo() { printf("destructing foo\n"); }
void bar(const float, const unsigned);
main()
{
bar(5.3, 1);
}
void bar(const float r, unsigned i)
{
unsigned n = (unsigned) (r * (float) i);
foo k[n];
}
pollux% g++ -v a.cc
g++ version 1.36.2 (based on GCC 1.36)
/usr/local/lib/gcc-cpp -+ -v -undef -D__GNUC__ -D__GNUG__ -D__cplusplus -Dsparc -Dsun -Dunix -D__sparc__ -D__sun__ -D__unix__ a.cc /usr/tmp/cca01001.cpp
GNU CPP version 1.36.91
/usr/local/lib/gcc-cc1plus /usr/tmp/cca01001.cpp -quiet -dumpbase a.cc -version -o /usr/tmp/cca01001.s
GNU C++ version 1.36.2 (based on GCC 1.36) (sparc) compiled by GNU C version 1.36.
default target switches: -mfpu -mepilogue
/usr/local/lib/gcc-as -o a.o /usr/tmp/cca01001.s
/usr/local/lib/gcc-ld -e start -dc -dp /lib/crt0.o a.o -lg++ /usr/local/lib/gcc-gnulib -lc
pollux% a.out
pollux% g++ -S a.cc
pollux% cat a.s
gcc_compiled.:
.text
LC0:
.ascii "constructing foo\12\0"
.align 4
.global ___3fooi
.proc 1
___3fooi:
!#PROLOGUE# 0
save %sp,-112,%sp
!#PROLOGUE# 1
mov %i0,%l0
st %i1,[%fp+72]
ld [%fp+72],%o1
st %o1,[%l0]
sethi %hi(LC0),%o0
or %lo(LC0),%o0,%o0
call _printf,0
nop
mov %l0,%i0
L1:
ret
restore
LC1:
.ascii "destructing foo\12\0"
.align 4
.global __$_foo
.proc 1
__$_foo:
!#PROLOGUE# 0
save %sp,-112,%sp
!#PROLOGUE# 1
mov %i0,%l0
st %i1,[%fp+72]
sethi %hi(LC1),%o0
or %lo(LC1),%o0,%o0
call _printf,0
nop
L3:
ld [%fp+72],%o0
tst %o0
be L4
nop
mov %l0,%o0
call ___builtin_delete,0
nop
b L5
nop
L4:
L5:
L2:
ret
restore
.align 4
LC2:
.single 0r5.29999999999999982236e+00
.align 4
.global _main
.proc 1
_main:
!#PROLOGUE# 0
save %sp,-112,%sp
!#PROLOGUE# 1
call ___main,0
nop
mov %o0,%o0
sethi %hi(LC2),%g1
ld [%g1+%lo(LC2)],%o0
mov 1,%o1
call _bar__FfUi,0
nop
mov 0,%i0
b L6
nop
L6:
ret
restore
.align 4
LC3:
.single 0r4.29496729600000000000e+09
.align 4
.global _bar__FfUi
.proc 1
_bar__FfUi:
!#PROLOGUE# 0
save %sp,-120,%sp
!#PROLOGUE# 1
st %g0,[%fp-16]
st %g0,[%fp-12]
st %i0,[%fp+68]
st %i1,[%fp+72]
ld [%fp+72],%f2
fitos %f2,%f2
ld [%fp-16],%f0
fcmpes %f2,%f0
nop
fbge L8
nop
sethi %hi(LC3),%g1
ld [%g1+%lo(LC3)],%f3
fadds %f2,%f3,%f2
L8:
ld [%fp+68],%f3
fmuls %f2,%f3,%f2
fstod %f2,%f2
std %f2,[%fp-8]
ldd [%fp-8],%o0
call ___fixunsdfsi,0
nop
st %o0,[%fp-20]
ld [%fp-20],%o0
sll %o0,2,%l0
mov %sp,%l1
mov %l0,%o0
add %o0,7,%o1
srl %o1,3,%o0
sll %o0,3,%o0
sub %sp,%o0,%sp
mov %sp,%l2
add %l2,92,%l2
mov 0,%l3
mov %l2,%l3
mov %l2,%l4
ld [%fp-20],%o0
add %o0,-1,%l5
tst %l5
bl L9
nop
L10:
mov %l4,%o0
mov 1,%o1
call ___3fooi,0
nop
add %l4,4,%l4
L12:
add %l5,-1,%l5
cmp %l5,-1
be L11
nop
b L10
nop
L11:
L9:
ld [%fp-20],%o0
add %o0,-1,%l6
tst %l6
bl L13
nop
ld [%fp-20],%o0
add %o0,-1,%o0
add %o0,1,%o0
sll %o0,2,%o0
add %l2,%o0,%l7
L14:
add %l7,-4,%l7
tst %l7
be L17
nop
mov %l7,%o0
mov 0,%o1
call __$_foo,0
nop
b L18
nop
L17:
L18:
L16:
add %l6,-1,%l6
cmp %l6,-1
be L15
nop
b L14
nop
L15:
L13:
mov %l1,%sp
L7:
ret
restore
pollux%
script done on Sun Jan 7 18:40:21 1990tiemann@AI.MIT.EDU (Micheal Tiemann) (01/08/90)
Date: Sun, 7 Jan 90 18:48:54 -0800
From: rjc@cs.ucla.edu (Robert Collins)
Sun4/330, SunOS 4.0.3, latest version of g++-1.36.2
Michael,
Here is a short piece of code, it's compilation and execution, and the
assembler produced for the code.
The code calculates the size of an array of objects, and creates the array.
The bug is that the array is not created (nor destroyed). This was not
any easy one to track down--naturally the program didn't just die
immediately nor consistently...things are never that easy...
Thanks,
rob collins
rjc@cs.ucla.edu
Script started on Sun Jan 7 18:39:08 1990
pollux% cat a.cc
#include <stdio.h>
class foo {
private:
int i;
public:
foo(int i = 1);
~foo();
};
foo::foo(int init) : i(init) { printf("constructing foo\n"); }
foo::~foo() { printf("destructing foo\n"); }
void bar(const float, const unsigned);
main()
{
bar(5.3, 1);
}
void bar(const float r, unsigned i)
{
unsigned n = (unsigned) (r * (float) i);
foo k[n];
}
pollux% g++ -v a.cc
g++ version 1.36.2 (based on GCC 1.36)
/usr/local/lib/gcc-cpp -+ -v -undef -D__GNUC__ -D__GNUG__ -D__cplusplus -Dsparc -Dsun -Dunix -D__sparc__ -D__sun__ -D__unix__ a.cc /usr/tmp/cca01001.cpp
GNU CPP version 1.36.91
/usr/local/lib/gcc-cc1plus /usr/tmp/cca01001.cpp -quiet -dumpbase a.cc -version -o /usr/tmp/cca01001.s
GNU C++ version 1.36.2 (based on GCC 1.36) (sparc) compiled by GNU C version 1.36.
default target switches: -mfpu -mepilogue
/usr/local/lib/gcc-as -o a.o /usr/tmp/cca01001.s
/usr/local/lib/gcc-ld -e start -dc -dp /lib/crt0.o a.o -lg++ /usr/local/lib/gcc-gnulib -lc
pollux% a.out
pollux% g++ -S a.cc
pollux% cat a.s
gcc_compiled.:
.text
LC0:
.ascii "constructing foo\12\0"
.align 4
.global ___3fooi
.proc 1
___3fooi:
!#PROLOGUE# 0
save %sp,-112,%sp
!#PROLOGUE# 1
mov %i0,%l0
st %i1,[%fp+72]
ld [%fp+72],%o1
st %o1,[%l0]
sethi %hi(LC0),%o0
or %lo(LC0),%o0,%o0
call _printf,0
nop
mov %l0,%i0
L1:
ret
restore
LC1:
.ascii "destructing foo\12\0"
.align 4
.global __$_foo
.proc 1
__$_foo:
!#PROLOGUE# 0
save %sp,-112,%sp
!#PROLOGUE# 1
mov %i0,%l0
st %i1,[%fp+72]
sethi %hi(LC1),%o0
or %lo(LC1),%o0,%o0
call _printf,0
nop
L3:
ld [%fp+72],%o0
tst %o0
be L4
nop
mov %l0,%o0
call ___builtin_delete,0
nop
b L5
nop
L4:
L5:
L2:
ret
restore
.align 4
LC2:
.single 0r5.29999999999999982236e+00
.align 4
.global _main
.proc 1
_main:
!#PROLOGUE# 0
save %sp,-112,%sp
!#PROLOGUE# 1
call ___main,0
nop
mov %o0,%o0
sethi %hi(LC2),%g1
ld [%g1+%lo(LC2)],%o0
mov 1,%o1
call _bar__FfUi,0
nop
mov 0,%i0
b L6
nop
L6:
ret
restore
.align 4
LC3:
.single 0r4.29496729600000000000e+09
.align 4
.global _bar__FfUi
.proc 1
_bar__FfUi:
!#PROLOGUE# 0
save %sp,-120,%sp
!#PROLOGUE# 1
st %g0,[%fp-16]
st %g0,[%fp-12]
st %i0,[%fp+68]
st %i1,[%fp+72]
ld [%fp+72],%f2
fitos %f2,%f2
ld [%fp-16],%f0
fcmpes %f2,%f0
nop
fbge L8
nop
sethi %hi(LC3),%g1
ld [%g1+%lo(LC3)],%f3
fadds %f2,%f3,%f2
L8:
ld [%fp+68],%f3
fmuls %f2,%f3,%f2
fstod %f2,%f2
std %f2,[%fp-8]
ldd [%fp-8],%o0
call ___fixunsdfsi,0
nop
st %o0,[%fp-20]
ld [%fp-20],%o0
sll %o0,2,%l0
mov %sp,%l1
mov %l0,%o0
add %o0,7,%o1
srl %o1,3,%o0
sll %o0,3,%o0
sub %sp,%o0,%sp
mov %sp,%l2
add %l2,92,%l2
mov 0,%l3
mov %l2,%l3
mov %l2,%l4
ld [%fp-20],%o0
add %o0,-1,%l5
tst %l5
bl L9
nop
L10:
mov %l4,%o0
mov 1,%o1
call ___3fooi,0
nop
add %l4,4,%l4
L12:
add %l5,-1,%l5
cmp %l5,-1
be L11
nop
b L10
nop
L11:
L9:
ld [%fp-20],%o0
add %o0,-1,%l6
tst %l6
bl L13
nop
ld [%fp-20],%o0
add %o0,-1,%o0
add %o0,1,%o0
sll %o0,2,%o0
add %l2,%o0,%l7
L14:
add %l7,-4,%l7
tst %l7
be L17
nop
mov %l7,%o0
mov 0,%o1
call __$_foo,0
nop
b L18
nop
L17:
L18:
L16:
add %l6,-1,%l6
cmp %l6,-1
be L15
nop
b L14
nop
L15:
L13:
mov %l1,%sp
L7:
ret
restore
pollux%
script done on Sun Jan 7 18:40:21 1990
Not a bug in g++.ztar.Z put on trix.ai.mit.edu (128.52.32.6) this
morning. Please use that as "latest test release".
Michael