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