[gnu.gcc.bug] A bug

jim@meiko.co.uk (11/25/89)

I have found a bug in gcc version 1.34 running on a SUN 4/110 under 
SunOS Release 4.0.3_EXPORT.  The compiler was built using your standard
sun4 installation scheme.

The problem occurs when using the stdarg facilities, and appears to be
related to the use of the (magic) "function" __builtin_saveregs.

The problem is demonstrated by the following piece of code, which does
not correctly save %o0 after calling nextLabel(). Note that when compiled
with -g the code functions correctly, so looking with the debugger won't help !

int bug( int a, int b, int c, ...)
{
    int   label = nextLabel();
    int * foo ;
    
    /* This is more or less what a call to va_start(foo,a) generates ! */
    (__builtin_saveregs(), foo = &a);
   
    bah(label, foo);
    
    return label;
}  

Compiled thus
% gcc -S bug.c

gives 
gcc_compiled.:
.text
      .align 4
.global _bug
      .proc 1
_bug:
      !#PROLOGUE# 0
      save %sp,-136,%sp
      !#PROLOGUE# 1
      st %o0,[%fp-20]			/* This is the store for label ! */
      call ___builtin_saveregs,0
      nop
      st %i0,[%fp+68]
      st %i1,[%fp+72]
      st %i2,[%fp+76]
      call _nextLabel,0			/* but here is the call ... */
      nop
      add %fp,68,%o0			/* and here we throw away the result */
      mov %o0,%o0
      st %o0,[%fp-28]
      ld [%fp-20],%o0
      ld [%fp-28],%o1
      call _bah,0
      nop
      ld [%fp-20],%i0
      b L1
      nop
L1:
      ret
      restore

Good luck.

James Cownie

p.s. Is anyone doing a gcc for the i860 ?