🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

1 total messages Started by Johan Widen Fri, 02 Jun 1989 22:04
g++ 1.35.1-: A fix for Intel 386, and an unresolved bug
#2063
Author: Johan Widen
Date: Fri, 02 Jun 1989 22:04
86 lines
2803 bytes
g++ sometimes fails to pop arguments from the stack, on the 386. With the
following patch installed I am able to run all programs in libg++/tests
except:
	tRational, tRandom, tFix	they get a floating point exception
	tCurses runs but I have to terminate entered lines with ^J rather
	than ^M.
	No timing information is available, -1 is printed for all timing
	results.

The floating point exceptions are due to overflow on the i387 stack. This
is due to the instruction
	fstl
being output in some places where a
	fstpl
is required. Some of these bugs, but not all, disappear if -O is turned off.
It is thus possible to run tRandom to completion if libg++ is compiled without
-O. tRandom will still fail however.

My feeling is that this floating point problem is the last stumbling block
on the road to a working g++ on the 386 processor.


Now for the fix to the i386 stack pop bug. First a repeat by program:

struct s{int a; int b; int c;};

extern struct s h(int j);
extern int g(int, struct s, int);

f(int i, int j, int k)
{
  g(i, h(j), k);
}

Without the fix installed the following code is generated by g++:

	.file	"xx2.cc"
gcc_compiled.:
.text
	.align 2
.globl _f
_f:
	pushl %ebp
	movl %esp,%ebp
	subl $20,%esp
	movl 16(%ebp),%edx
	movl %edx,16(%esp)
	leal 4(%esp),%eax
	pushl 12(%ebp)
	pushl %eax
	call _h
	leal 4(%esp),%esp	<-- Bug, should be: leal 8(%esp),%esp
	movl 8(%ebp),%edx
	movl %edx,(%esp)
	call _g
	leal 20(%esp),%esp
L1:
	leave
	ret

Here is the fix:

*** expr.c.orig	Wed May 17 08:45:29 1989
--- expr.c	Thu Jun  1 23:00:16 1989
***************
*** 4122,4128
        INIT_CUMULATIVE_ARGS (args_so_far, funtype);
        tem = FUNCTION_ARG (args_so_far, Pmode,
  			  build_pointer_type (TREE_TYPE (funtype)), 1);
!       if (tem != 0 && GET_CODE (tem) == MEM)
  	{
  	  actparms = tree_cons (error_mark_node,
  				build (SAVE_EXPR,

--- 4122,4128 -----
        INIT_CUMULATIVE_ARGS (args_so_far, funtype);
        tem = FUNCTION_ARG (args_so_far, Pmode,
  			  build_pointer_type (TREE_TYPE (funtype)), 1);
!       if (tem == 0)
  	{
  	  actparms = tree_cons (error_mark_node,
  				build (SAVE_EXPR,
--
Johan Widen
SICS, PO Box 1263, S-164 28 KISTA, SWEDEN	Internet: jw@sics.se
Tel: +46 8 752 15 32	Ttx: 812 61 54 SICS S	Fax: +46 8 751 72 30
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