[gnu.g++.bug] stdarg.h for DECstation-3100

grunwald@foobar.colorado.edu (Dirk Grunwald) (10/12/89)

The following shar contains three patches: one to stdarg.h, one to gnulib.c
and one to gnulib2.c.

These implement a better stdarg.h for the MIPS architecture. I'm not certain
it's completely correct, but it compiles simple test cases.

the changes to gnulib/gnulib2 simple move the definition of
builtin_saveregs from gnulib.c (compiled with `cc') to gnulib2.c
(compiled with `gcc`). This is needed because the MIPS compiler
doesn't support the asm() operations used. The routine __builtin_saveregs
for the MIPS arch. simply stored a0..a3 into the appropriate memory
locations in preperation for a _varargs.

the changes to stdarg.h define a special strick, used by the mips backend
to detect varargs, and then called builtin_saveregs. One would think the
special string would also signel the need to save a0..a3, but I didn't
want to change tm-mips.h any more than needed.

One last change: In the Makefile, you'll need to move the _varargs
from the line for gnulib to gnulib2 -- I forgot to ci my Makefile
before changing things around, so no context diffs.

These changes let `<<' style I/O work on the PMAX; basically, anything
that uses stdarg.h should be recompiled (like, recompiled libg++)

#! /bin/sh
# This is a shell archive.  Remove anything before this line, then unpack
# it by saving it into a file and typing "sh file".  To overwrite existing
# files, type "sh file -c".  You can also feed this as standard input via
# unshar, or by typing "sh <file", e.g..  If this archive is complete, you
# will see the following message at the end:
#		"End of shell archive."
# Contents:  gnulib.c.diff gnulib2.c.diff stdarg.h.diff
# Wrapped by grunwald@foobar on Wed Oct 11 21:40:08 1989
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'gnulib.c.diff' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'gnulib.c.diff'\"
else
echo shar: Extracting \"'gnulib.c.diff'\" \(379 characters\)
sed "s/^X//" >'gnulib.c.diff' <<'END_OF_FILE'
X299,317d298
X< #ifdef L_varargs
X< #ifdef sparc
X< 	asm (".global ___builtin_saveregs");
X< 	asm ("___builtin_saveregs:");
X< 	asm ("st %i0,[%fp+68]");
X< 	asm ("st %i1,[%fp+72]");
X< 	asm ("st %i2,[%fp+76]");
X< 	asm ("st %i3,[%fp+80]");
X< 	asm ("st %i4,[%fp+84]");
X< 	asm ("retl");
X< 	asm ("st %i5,[%fp+88]");
X< #else
X< __builtin_saveregs ()
X< {
X<   abort ();
X< }
X< #endif
X< #endif
X< 
END_OF_FILE
if test 379 -ne `wc -c <'gnulib.c.diff'`; then
    echo shar: \"'gnulib.c.diff'\" unpacked with wrong size!
fi
# end of 'gnulib.c.diff'
fi
if test -f 'gnulib2.c.diff' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'gnulib2.c.diff'\"
else
echo shar: Extracting \"'gnulib2.c.diff'\" \(916 characters\)
sed "s/^X//" >'gnulib2.c.diff' <<'END_OF_FILE'
X*** /tmp/,RCSt1a19906	Wed Oct 11 21:33:56 1989
X--- gnulib2.c	Wed Oct 11 21:24:24 1989
X***************
X*** 845,847 ****
X--- 845,879 ----
X    return (negate ? -d : d);
X  }
X  #endif
X+ 
X+ #ifdef L_varargs
X+ #ifdef sparc
X+ 	asm (".global ___builtin_saveregs");
X+ 	asm ("___builtin_saveregs:");
X+ 	asm ("st %i0,[%fp+68]");
X+ 	asm ("st %i1,[%fp+72]");
X+ 	asm ("st %i2,[%fp+76]");
X+ 	asm ("st %i3,[%fp+80]");
X+ 	asm ("st %i4,[%fp+84]");
X+ 	asm ("retl");
X+ 	asm ("st %i5,[%fp+88]");
X+ #else
X+ #if defined(MIPSEL) | defined(R3000) | defined(R2000) | defined(mips)
X+ 
X+   asm ("	.ent __builtin_saveregs");
X+   asm ("	.globl __builtin_saveregs");
X+   asm ("__builtin_saveregs:");
X+   asm ("	sw	$4,0($30)");
X+   asm ("	sw	$5,4($30)");
X+   asm ("	sw	$6,8($30)");
X+   asm ("	sw	$7,12($30)");
X+   asm ("	j	$31");
X+   asm ("	.end __builtin_saveregs");
X+ #else
X+ __builtin_saveregs ()
X+ {
X+   abort ();
X+ }
X+ #endif
X+ #endif
X+ #endif
END_OF_FILE
if test 916 -ne `wc -c <'gnulib2.c.diff'`; then
    echo shar: \"'gnulib2.c.diff'\" unpacked with wrong size!
fi
# end of 'gnulib2.c.diff'
fi
if test -f 'stdarg.h.diff' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'stdarg.h.diff'\"
else
echo shar: Extracting \"'stdarg.h.diff'\" \(1219 characters\)
sed "s/^X//" >'stdarg.h.diff' <<'END_OF_FILE'
X*** /tmp/,RCSt1a19942	Wed Oct 11 21:39:35 1989
X--- stdarg.h	Wed Oct 11 21:37:54 1989
X***************
X*** 33,44 ****
X  #define __va_rounded_size(TYPE)  \
X    (((sizeof (TYPE) + sizeof (int) - 1) / sizeof (int)) * sizeof (int))
X  
X! #ifndef sparc
X! #define va_start(AP, LASTARG) 						\
X!  (AP = ((char *) &(LASTARG) + __va_rounded_size (LASTARG)))
X! #else
X! #define va_start(AP, LASTARG) 						\
X   (__builtin_saveregs (), AP = ((char *) &(LASTARG) + __va_rounded_size (LASTARG)))
X  #endif
X  
X  void va_end (va_list);		/* Defined in gnulib */
X--- 33,49 ----
X  #define __va_rounded_size(TYPE)  \
X    (((sizeof (TYPE) + sizeof (int) - 1) / sizeof (int)) * sizeof (int))
X  
X! #if	defined(sparc)
X! #  define va_start(AP, LASTARG)						\
X   (__builtin_saveregs (), AP = ((char *) &(LASTARG) + __va_rounded_size (LASTARG)))
X+ #elif defined(mips)
X+ #  define va_start(AP,LASTARG) {\
X+        static char __vd_alist[16] = "__%%VARARGS";  /* Identify to codegen */\
X+ 	__builtin_saveregs();\
X+ 	(AP = ((char *) &(LASTARG) + __va_rounded_size (LASTARG)));}
X+ #else
X+ #  define va_start(AP, LASTARG)						\
X+  (AP = ((char *) &(LASTARG) + __va_rounded_size (LASTARG)))
X  #endif
X  
X  void va_end (va_list);		/* Defined in gnulib */
END_OF_FILE
if test 1219 -ne `wc -c <'stdarg.h.diff'`; then
    echo shar: \"'stdarg.h.diff'\" unpacked with wrong size!
fi
# end of 'stdarg.h.diff'
fi
echo shar: End of shell archive.
exit 0