trq@moose.cita.toronto.edu (Tom Quinn) (09/28/88)
The following code demonstrates a bug in gcc v1.28 on sparc when
passing structure values to a function. Two of the parameter passing
registers get smashed while the end of the structure is being put onto
the stack.
This is on a Sun4/110 running SunOS 4.0
The compile:
gcc -g -v -S -sun4 -c control2.c
gcc version 1.28
/usr/local/lib/gcc-cpp -v -undef -D__GNU__ -D__GNUC__ -Dsparc -Dsun -Dunix control2.c /tmp/cca20015.cpp
GNU CPP version 1.28
/usr/local/lib/gcc-cc1 /tmp/cca20015.cpp -quiet -dumpbase control2.c -g -version -o control2.s
GNU C version 1.28 (sparc) compiled by GNU C version 1.28.
The code:
------------------------------------------------------------
typedef struct {
char descrip[80],
*name;
float *vec;
int dimen;
} VECTOR;
typedef union yystype {
char charval[80];
int intval;
};
extern union yystype yylval;
static char data_file[80];
union yystype yylval;
int
yyparse()
{
register union yystype *yyvsp;
union yystype yyvsa[200 ];
union yystype *yyvs = yyvsa;
yyvsp = yyvs;
*++yyvsp = yylval;
{
VECTOR temp;
if(read_row(data_file,yyvsp[0].intval,&temp) == 0) {
copy_vector(yyvsp[-1].charval,temp);
}
;
}
}
--------------------------------------------------------------
The offending assembler:
.stabn 68,0,25,LM6
LM6:
sub %sp,72,%sp
add %l0,-80,%l1
set -16120,%o0
add %fp,%o0,%o0
ld [%o0],%o1 <<<First 4 bytes of structure
ld [%o0+4],%o2 <<<Second 4 bytes of structure
ld [%o0+8],%o3
ld [%o0+12],%o4
ld [%o0+16],%o5
set 68,%o1 <<< OUCH!!
add %sp,76,%o2 <<< OOFF!!
Lm1: <<< Loop to shove the rest onto the stack
ld [%o0+%o1],%g1
subcc %o1,4,%o1
bge Lm1
st %g1,[%o2+%o1]
mov %l1,%o0
call _copy_vector,0
nop
Tom Quinn Canadian Institute for Theoretical Astrophysics
trq@moose.cita.toronto.edu
SOON TO BE trq@moose.cita.utoronto.ca
UUCP - decvax!utgpu!moose!trq
BITNET - quinn@utorphys.bitnet
ARPA - trq%moose.cita.toronto.edu@relay.cs.net