glenne%hplsla@HP-SDE.SDE.HP.COM (Glenn Engel) (05/02/89)
gcc-1.35 / hp9k320g.h
Here's a nasty little bug dealing with inline functions.
In the function main below, 4 bytes of local space are allocated but when
the second call to printit is made, the compiler makes use of a temporary int
at -6 from fp, thus munching part of the stack. The program appears to run
fine but has very serious side affects when the contents of the stack are
used in other functions.
gcc version 1.35
/usr/local/lib/gcc-cpp -v -undef -D__GNUC__ -Dhp9000s200 -Dhp9000s300 -DPWB -Dmc68k -Dhpux -Dunix -D__hp9000s200__ -D__hp9000s300__ -D__PWB__ -D__mc68k__ -D__hpux__ -D__unix__ -D__HAVE_68881__ -Dmc68020 t.c /tmp/cca17275.cpp
GNU CPP version 1.35
/usr/local/lib/gcc-cc1 /tmp/cca17275.cpp -quiet -dumpbase t.c -version -o /tmp/cca17275.s
GNU C version 1.35 (68k, MIT syntax) compiled by GNU C version 1.35.
/usr/local/lib/gcc-as -mc68020 -o t.o /tmp/cca17275.s
/usr/local/lib/gcc-ld /usr/local/lib/gnu/crt0.o t.o /usr/local/lib/gcc-gnulib -lc
typedef unsigned char usc;
printit(usc * cptr)
{
printf("%c=\n",*cptr);
}
static inline void doit(usc *cptr)
{
printit(cptr);
}
static inline void doitadr(usc ch)
{
printit(&ch);
}
main()
{
usc ch;
ch = 'a';
doit(&ch);
doitadr(ch);
}
#NO_APP
gcc_compiled.:
.text
LC0:
.ascii "%c=\12\0"
.even
.globl _printit
_printit:
link a6,#0
movel a6@(8),a0
clrl d0
moveb a0@,d0
movel d0,sp@-
pea LC0
jbsr _printf
L1:
unlk a6
rts
.even
.globl _main
_main:
link a6,#-4 <************ only 4 bytes
movel d2,sp@-
moveb #97,a6@(-1)
movel a6,d2
subql #1,d2
movel a6,d0
subql #2,d0
movel d2,sp@-
jbsr _printit
addqw #4,sp
L7:
clrl d0
moveb a6@(-1),d0
movel d0,a6@(-6) <************** offset -6 used
movel a6,d0
subql #4,d0
moveb a6@(-3),d0
movel a6,d0
subql #3,d0
movel d0,sp@-
jbsr _printit
addqw #4,sp
L8:
L6:
movel a6@(-8),d2
unlk a6
rts
--
| Glenn R. Engel
| Hewlett-Packard
| (206) 335-2066
| glenne%hplsla@hplabs.hp.com