Article View: gnu.g++.bug
Article #1600g++ 1.32 problem with stack temps
From: Rick Weiss
Date: Wed, 11 Jan 1989 23:18
Date: Wed, 11 Jan 1989 23:18
99 lines
3282 bytes
3282 bytes
Greetings,
I've encountered a problem with G++ 1.32 on an Encore Multimax (NS32000) in the
apparent management of temporary stack space. In re-using pending stack space
where the space needed is smaller than the space available it seems to get
confused. The following example should help clarify the problem:
Compile the following source:
g++ version 1.32.0
/usr/local/lib/gcc-cpp -+ -v -undef -D__GNU__ -D__GNUG__ -Dns32000 -Dn16 -Dns16000 -Dns32332 -Dunix -D__OPTIMIZE__ tuna.cc /tmp/cc011412.cpp
GNU CPP version 1.32
/usr/local/lib/gcc-c++ /tmp/cc011412.cpp -quiet -dumpbase tuna.cc -fchar-charconst -opt -version -o tuna.s
GNU C++ version 1.32.0 (32000, Encore syntax) compiled by CC.
In function int main ():
tuna.cc:30: warning: variable `x' never used
-----------------------------------------------------------------------------
#include "stream.h"
class Point {
long xc;
long yc;
public:
Point(long newx=0, long newy =0) { xc=newx; yc=newy; }
friend Point operator*(Point p, long i) { return Point(i*p.xc, i*p.yc); }
friend Point operator*(long i, Point p) { return Point(i*p.xc, i*p.yc); }
friend Point operator/(Point p, long i) { return Point(p.xc/i, p.yc/i); }
friend Point operator/(long i, Point p) { return Point(i/p.xc, i/p.yc); }
};
class Rect {
Point or;
Point sz;
public:
Rect(Point o, Point s) { or=o; sz=s; }
Point origin() { return or; }
Point size() { return sz; }
};
main ()
{
Rect r( Point ( 10, 10 ), Point ( 20, 20 ) );
// problem occurs with code generated for the following line:
Point x = r.size()*10/100;
}
-----------------------------------------------------------------------------
generates the following code
-----------------------------------------------------------------------------
.align 16
.globl _main
_main:
enter [r3,r4],24
adjspb $20 # we add 20 to stack
addr 12(sp),r0
addr @20,tos # we add another 4
addr @20,tos # we add another 4
movd r0,tos # we add another 4
addr _Point_PSPoint_lSI_lSI,r3
jsr r3
adjspb $-12 # back to 20
addr 4(sp),r0
addr @10,tos # we add another 4
addr @10,tos # we add another 4
movd r0,tos # we add another 4
jsr r3
adjspb $-12 # back to 20
addr -16(fp),r3
movd r3,0(sp)
bsr ?_Rect_PSRect_SPoint_SPoint
# we still have 20 on stack
addr @100,8(sp) # <- we should have the stack at 12, or
addr tos,r4
adjspb $4 # <- we should be adding another 12 here
addr @10,8(sp)
addr tos,r2
movd r3,tos
bsr ?_size_PSRect
cmpqd $0,tos # adjsp -4
movd r4,r2
bsr ?_op$mult_expr_SPoint_lSI
adjspb $-12
addr -24(fp),r2
bsr ?_op$trunc_div_expr_SPoint_lSI
adjspb $-12
exit [r4,r3]
ret 0
-----------------------------------------------------------------------------
Good luck!
Rick
Technical Details
Message-ID:
<4645@xenna.Encore.COM>Path:
arc1-ca.pugleaf.net!utzoo!utgpu!watmath!uunet!bu-cs!encore!maxzilla!weissShow Full Headers
Complete Article Headers
Path: arc1-ca.pugleaf.net!utzoo!utgpu!watmath!uunet!bu-cs!encore!maxzilla!weiss From: weiss@maxzilla.Encore.COM (Rick Weiss) Newsgroups: gnu.g++.bug Subject: g++ 1.32 problem with stack temps Message-ID: <4645@xenna.Encore.COM> Date: 11 Jan 89 23:18:20 GMT Sender: news@Encore.COM Reply-To: weiss@multimax.arpa (Rick Weiss) Distribution: gnu.g++.bug Organization: Encore Computer Corp, Marlboro, MA Lines: 99