Thread View: gnu.g++.bug
1 messages
1 total messages
Started by Alexander Klaiber
Fri, 17 Nov 1989 19:33
HELP! -- g++ 1.36.1
Author: Alexander Klaiber
Date: Fri, 17 Nov 1989 19:33
Date: Fri, 17 Nov 1989 19:33
225 lines
5421 bytes
5421 bytes
Summary:
g++ doesn't clean up the stack after calling constructors, thus messing up
the stack and argument lists, as in fun(1, new Foo(..), 2)
Note:
problem doesn't show (but is still there) if constructors are not used as
actuals.
System:
g++ 1.36.1
Sun3, os3
----------------------------------------
[uw-larry - 1] % cat main.c
#include "stdio.h"
class Foo {
private:
char* name;
public:
Foo(char* s);
};
Foo::Foo(char* s) {
name = s;
}
void fun(int a, Foo* f, int b) {
printf("%d %d %d\n", a, (int)f, b);
}
main() {
fun(1, new Foo("crash"), 2);
}
[uw-larry - 2] % g++ -v main.c
gcc version 1.36.1 (based on GCC 1.36)
/usr/larry/users/klaiber/lib/gcc-cpp -+ -v -undef -D__GNUC__ -D__GNUG__ -D__cplusplus -Dmc68000 -Dsun -Dunix -D__mc68000__ -D__sun__ -D__unix__ -D__HAVE_68881__ -Dmc68020 main.c /usr/tmp/cca03962.cpp
GNU CPP version 1.36
/usr/larry/users/klaiber/lib/gcc-cc1plus /usr/tmp/cca03962.cpp -quiet -dumpbase main.c -version -o /usr/tmp/cca03962.s
GNU C++ version 1.36.1 (based on GCC 1.36) (68k, MIT syntax) compiled by GNU C version 1.36.
default target switches: -m68020 -mc68020 -m68881 -mbitfield
as -mc68020 -o main.o /usr/tmp/cca03962.s
/usr/larry/users/klaiber/lib/gcc-ld -e start -dc -dp /lib/crt0.o /lib/Mcrt1.o main.o -lg++ /usr/larry/users/klaiber/lib/gcc-gnulib -lc
[uw-larry - 3] % a.out
1 148520 148520
^^^^^^
this is most definitely wrong!
----------------------------------------
Here's the generated assembly code: (w/o the -g option for readability)
#NO_APP
gcc_compiled.:
.text
.even
.globl ___3FooPc
___3FooPc:
link a6,#0
movel a6@(8),a0
movel a6@(12),a0@
movel a0,d0
L1:
unlk a6
rts
LC0:
.ascii "%d %d %d\12\0"
.even
.globl _fun__FiP3Fooi
_fun__FiP3Fooi:
link a6,#0
movel a6@(16),sp@-
movel a6@(12),sp@-
movel a6@(8),sp@-
pea LC0
jbsr _printf
addw #16,sp
L2:
unlk a6
rts
LC1:
.ascii "crash\0"
.even
.globl _main
_main:
link a6,#0
movel d2,sp@-
jbsr ___main
movel d0,d0
pea 2:w
pea LC1
pea 4:w
jbsr ___builtin_new
addqw #4,sp
movel d0,d2
movel d2,sp@-
jbsr ___3FooPc <== **** PROBLEM right here ****
movel d2,sp@-
pea 1:w
jbsr _fun__FiP3Fooi
addw #20,sp
clrl d0
jra L3
L3:
movel a6@(-4),d2
unlk a6
rts
----------------------------------------
The error is clear: after the jbsr, we ned an addqw #8,sp to pop the 2 args
for Foo::Foo (this & s)
----------------------------------------
If a temporary variable is used, things seem to be fine:
[uw-larry - 4] % cat other.c
#include "stdio.h"
class Foo {
private:
char* name;
public:
Foo(char* s);
};
Foo::Foo(char* s) {
name = s;
}
void fun(int a, Foo* f, int b) {
printf("%d %d %d\n", a, (int)f, b);
}
main() {
Foo* temp = new Foo("crash");
fun(1, temp, 2);
}
[uw-larry - 5] % g++ -v other.c
gcc version 1.36.1 (based on GCC 1.36)
/usr/larry/users/klaiber/lib/gcc-cpp -+ -v -undef -D__GNUC__ -D__GNUG__ -D__cplusplus -Dmc68000 -Dsun -Dunix -D__mc68000__ -D__sun__ -D__unix__ -D__HAVE_68881__ -Dmc68020 other.c /usr/tmp/cca03969.cpp
GNU CPP version 1.36
/usr/larry/users/klaiber/lib/gcc-cc1plus /usr/tmp/cca03969.cpp -quiet -dumpbase other.c -version -o /usr/tmp/cca03969.s
GNU C++ version 1.36.1 (based on GCC 1.36) (68k, MIT syntax) compiled by GNU C version 1.36.
default target switches: -m68020 -mc68020 -m68881 -mbitfield
as -mc68020 -o other.o /usr/tmp/cca03969.s
/usr/larry/users/klaiber/lib/gcc-ld -e start -dc -dp /lib/crt0.o /lib/Mcrt1.o other.o -lg++ /usr/larry/users/klaiber/lib/gcc-gnulib -lc
[uw-larry - 6] % a.out
1 148520 2
^^^^
it's the correct output allright
----------------------------------------
***HOWEVER***, as can be seen from the assembly code, g++ still doesn't
clean up the stack after the call to the constructor:
#NO_APP
gcc_compiled.:
.text
.even
.globl ___3FooPc
___3FooPc:
link a6,#0
movel a6@(8),a0
movel a6@(12),a0@
movel a0,d0
L1:
unlk a6
rts
LC0:
.ascii "%d %d %d\12\0"
.even
.globl _fun__FiP3Fooi
_fun__FiP3Fooi:
link a6,#0
movel a6@(16),sp@-
movel a6@(12),sp@-
movel a6@(8),sp@-
pea LC0
jbsr _printf
addw #16,sp
L2:
unlk a6
rts
LC1:
.ascii "crash\0"
.even
.globl _main
_main:
link a6,#-4
movel d2,sp@-
jbsr ___main
movel d0,d0
pea LC1
pea 4:w
jbsr ___builtin_new
addqw #4,sp
movel d0,d2
movel d2,sp@-
jbsr ___3FooPc
movel d2,a6@(-4)
pea 2:w
movel a6@(-4),sp@-
pea 1:w
jbsr _fun__FiP3Fooi
addw #20,sp
clrl d0
jra L3
L3:
movel a6@(-8),d2
unlk a6
rts
===========================================================================
PLEEEASE, try this and tell me whether you can reproduce the bug or whether
I have a screwed-up installation!
A quick bug fix would be even more greatly appreciated!
Alexander Klaiber
klaiber@cs.washington.edu
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads