Article View: gnu.gcc.bug
Article #2416gcc 1.34, bug in defer-pop with valued blocks
From: Lawrence Crowl
Date: Fri, 17 Mar 1989 19:07
Date: Fri, 17 Mar 1989 19:07
100 lines
2660 bytes
2660 bytes
Gcc 1.34 incorrectly defers popping function parameters that are computed by
value returning blocks. Compiling with the -fno-defer-pop option is a
suitable work-around. Below is a program exhibiting the problem.
int f( a, b )
int a ;
int b ;
{
return a * b ;
}
void main( )
{
int a = 2 ;
int b = 3 ;
int c = 5 ;
int d ;
int e = f( ({ d = f( a, b ) ; d+= 1 ; }), c ) ;
printf( "a==%d b==%d c==%d d==%d e==%d\n", a, b, c, d, e ) ;
}
In summary, the compiler generates:
push c
push b
push a
call f
copy result to d
increment d
push d
call f
However, this leaves parameters b and a to the first call to f INBETWEEN
parameters c and d to to second call to f.
The command "gcc -v -S defer.c" yields:
gcc version 1.34
/usr/su/lib/gcc-cpp -v -undef -D__GNUC__ -Dmc68000 -Dsun -Dunix -D__mc68000__ -D__sun__ -D__unix__ -D__HAVE_68881__ -Dmc68020 defer.c /tmp/cca10231.cpp
GNU CPP version 1.34
/usr/su/lib/gcc-cc1 /tmp/cca10231.cpp -quiet -dumpbase defer.c -version -o defer.s
GNU C version 1.34 (68k, MIT syntax) compiled by GNU C version 1.34.
and the assembly code:
#NO_APP
gcc_compiled.:
.text
.even
.globl _f
_f:
link a6,#0
movel a6@(8),d0
mulsl a6@(12),d0
movel d0,d0
jra L1
L1:
unlk a6
rts
LC0:
.ascii "a==%d b==%d c==%d d==%d e==%d\12\0"
.even
.globl _main
_main:
link a6,#-20
moveq #2,d1
movel d1,a6@(-4)
moveq #3,d1
movel d1,a6@(-8)
moveq #5,d1
movel d1,a6@(-12)
movel a6@(-12),sp@-
movel a6@(-8),sp@-
movel a6@(-4),sp@-
jbsr _f
movel d0,d0
movel d0,d0
movel d0,a6@(-16)
movel d0,d0
addql #1,d0
movel d0,d0
movel d0,a6@(-16)
movel d0,sp@-
jbsr _f
movel d0,a6@(-20)
movel a6@(-20),sp@-
movel a6@(-16),sp@-
movel a6@(-12),sp@-
movel a6@(-8),sp@-
movel a6@(-4),sp@-
pea LC0
jbsr _printf
L2:
unlk a6
rts
--
Lawrence Crowl 716-275-9499 University of Rochester
crowl@cs.rochester.edu Computer Science Department
...!{allegra,decvax,rutgers}!rochester!crowl Rochester, New York, 14627
Technical Details
Message-ID:
<1989Mar17.140721.17327@cs.rochester.edu>Path:
arc1-ca.pugleaf.net!utzoo!telly!attcan!uunet!tut.cis.ohio-state.edu!rutgers!rochester!crowlShow Full Headers
Complete Article Headers
Path: arc1-ca.pugleaf.net!utzoo!telly!attcan!uunet!tut.cis.ohio-state.edu!rutgers!rochester!crowl From: crowl@cs.rochester.edu (Lawrence Crowl) Newsgroups: gnu.gcc.bug Subject: gcc 1.34, bug in defer-pop with valued blocks Message-ID: <1989Mar17.140721.17327@cs.rochester.edu> Date: 17 Mar 89 19:07:20 GMT Reply-To: crowl@cs.rochester.edu (Lawrence Crowl) Distribution: gnu Organization: U of Rochester, CS Dept, Rochester, NY Lines: 100