mccanne@HELIOS.EE.LBL.GOV (Steven McCanne) (01/02/90)
Here is a bug in gcc version 1.36, running on a Sun sparcstation. The structure below is being passed in only a single register. Note that the structure is both passed and received in a single register. struct triple { short a, b, c; }; void p (e) struct triple e; { printf ("%d %d %d\n", e.a, e.b, e.c); } q () { struct triple r = { 1, 2, 3 }; p (r); } Output from 'gcc -S': gcc_compiled.: .text LC0: .ascii "%d %d %d\12\0" .align 4 .global _p .proc 1 _p: !#PROLOGUE# 0 save %sp,-112,%sp !#PROLOGUE# 1 ! Here is the problem. ! The struct is passed in only 1 register. st %i0,[%fp+68] ldsh [%fp+68],%o1 ldsh [%fp+70],%o2 ! This is garbage, but should be 'e.c'. ldsh [%fp+72],%o3 sethi %hi(LC0),%o0 or %lo(LC0),%o0,%o0 mov %o1,%o1 mov %o2,%o2 mov %o3,%o3 call _printf,0 nop L1: ret restore .align 2 LC1: .half 1 .half 2 .half 3 .align 4 .global _q .proc 1 _q: !#PROLOGUE# 0 save %sp,-120,%sp !#PROLOGUE# 1 add %fp,-24,%o0 sethi %hi(LC1),%o2 or %lo(LC1),%o2,%o2 lduh [%o2+4],%g1 sth %g1,[%o0+4] lduh [%o2+2],%g1 sth %g1,[%o0+2] lduh [%o2+0],%g1 sth %g1,[%o0+0] ! Also, P is called with only one reg argument. ld [%fp-24],%o0 call _p,0 nop L2: ret restore ------------------------- Steven McCanne mccanne@helios.ee.lbl.gov -------------------------