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