🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

1 total messages Started by Rick Weiss Wed, 11 Jan 1989 23:18
g++ 1.32 problem with stack temps
#1600
Author: Rick Weiss
Date: Wed, 11 Jan 1989 23:18
99 lines
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
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