frank@Morgan.COM (Frank Wortner) (01/21/89)
Machine/OS: Sun-4/SunOS 4.0 GCC 1.32 won't compile the program "va-test.c". Sun's CC compiles the program without complaint, and the result executes correctly. This problem seems to be related to the implementation of "va-sparc.h". I've enclosed my own version of this file, "my-va-sparc.h". This one *seems* to work OK, but I'd like others to try it. Try gcc va-test.c and then try gcc -DMY_VARARGS va-test.c BTW, I spotted this problem while trying to compile GAWK 2.00 Beta with GCC. The file "awk5.c" contains code similar to that in "va-test.c". Frank ------------------------------------------------------------------------------- #! /bin/sh # This is a shell archive, meaning: # 1. Remove everything above the #! /bin/sh line. # 2. Save the resulting text in a file. # 3. Execute the file with /bin/sh (not csh) to create the files: # va-test.c # my-va-sparc.h # This archive created: Fri Jan 20 15:51:19 1989 export PATH; PATH=/bin:$PATH echo shar: extracting "'va-test.c'" '(421 characters)' if test -f 'va-test.c' then echo shar: will not over-write existing file "'va-test.c'" else sed 's/^ X//' << \SHAR_EOF > 'va-test.c' X#include <stdio.h> X X#ifdef MY_VARARGS X# include "./my-va-sparc.h" X#else X# include <varargs.h> X#endif X Xvoid test1(ap) Xva_list ap; X{ X char *fmt; X double f; X X f = va_arg(ap, double); X printf("f = %f\n", f); X fmt = va_arg(ap, char *); X vprintf(fmt, ap); X} X Xvoid test(va_alist) Xva_dcl X{ X va_list ap; X X va_start(ap); X test1(ap); X va_end(ap); X} X X X Xvoid main() X{ X test(5.12, "%s %d\n", "arg1", -234); X} X SHAR_EOF if test 421 -ne "`wc -c < 'va-test.c'`" then echo shar: error transmitting "'va-test.c'" '(should have been 421 characters)' fi fi # end of overwriting check echo shar: extracting "'my-va-sparc.h'" '(775 characters)' if test -f 'my-va-sparc.h' then echo shar: will not over-write existing file "'my-va-sparc.h'" else sed 's/^ X//' << \SHAR_EOF > 'my-va-sparc.h' X#ifdef sparc X/* Frank Wortner's replacement for the normal GCC 1.32 va-sparc.h. X** This implementation is (more or less) compatible with Sun's, so you can X** use it with Sun's libraries. X*/ X X#define va_dcl int __fake_arg; X#define va_alist __fake_arg Xtypedef void *va_list; X X/* Amount of space required in an argument list for an arg of type TYPE. X TYPE may alternatively be an expression whose type is used. */ X X#define __va_rounded_size(TYPE) \ X (((sizeof (TYPE) + sizeof (int) - 1) / sizeof (int)) * sizeof (int)) X X#define va_start(AP) \ X (__builtin_saveregs (), \ X AP = ((void *) &__fake_arg)) X X#define va_end(AP) X X#define va_arg(AP, TYPE) \ X (AP += __va_rounded_size (TYPE), \ X *((TYPE *) (AP - __va_rounded_size (TYPE)))) X X X#endif /* sparc */ SHAR_EOF if test 775 -ne "`wc -c < 'my-va-sparc.h'`" then echo shar: error transmitting "'my-va-sparc.h'" '(should have been 775 characters)' fi fi # end of overwriting check # End of shell archive exit 0 -- Frank "Computers are mistake amplifiers."