diff options
Diffstat (limited to 'gcc/testsuite/gcc.target/x86_64/abi/test_varargs.c')
-rw-r--r-- | gcc/testsuite/gcc.target/x86_64/abi/test_varargs.c | 97 |
1 files changed, 97 insertions, 0 deletions
diff --git a/gcc/testsuite/gcc.target/x86_64/abi/test_varargs.c b/gcc/testsuite/gcc.target/x86_64/abi/test_varargs.c new file mode 100644 index 000000000..e6d99461d --- /dev/null +++ b/gcc/testsuite/gcc.target/x86_64/abi/test_varargs.c @@ -0,0 +1,97 @@ +/* Test variable number of arguments passed to functions. For now this is + just a simple test to see if it's working. */ + +#include <stdarg.h> +#include "defines.h" + + +#define ARG_INT 1 +#define ARG_DOUBLE 2 +#define ARG_POINTER 3 + +union types +{ + int ivalue; + double dvalue; + void *pvalue; +}; + +struct arg +{ + int type; + union types value; +}; + +struct arg *arglist; + +/* This tests the argumentlist to see if it matches the format string which + is printf-like. Nothing will be printed of course. It can handle ints, + doubles and void pointers. The given value will be tested against the + values given in arglist. + This test only assures that the variable argument passing is working. + No attempt is made to see if argument passing is done the right way. + Since the ABI doesn't say how it's done, checking this is not really + relevant. */ +void +my_noprintf (char *format, ...) +{ + va_list va_arglist; + char *c; + + int ivalue; + double dvalue; + void *pvalue; + struct arg *argp = arglist; + + va_start (va_arglist, format); + for (c = format; *c; c++) + if (*c == '%') + { + switch (*++c) + { + case 'd': + assert (argp->type == ARG_INT); + ivalue = va_arg (va_arglist, int); + assert (argp->value.ivalue == ivalue); + break; + case 'f': + assert (argp->type == ARG_DOUBLE); + dvalue = va_arg (va_arglist, double); + assert (argp->value.dvalue == dvalue); + break; + case 'p': + assert (argp->type == ARG_POINTER); + pvalue = va_arg (va_arglist, void *); + assert (argp->value.pvalue == pvalue); + break; + default: + abort (); + } + + argp++; + } +} + +int +main (void) +{ +#ifdef CHECK_VARARGS + struct arg al[5]; + + al[0].type = ARG_INT; + al[0].value.ivalue = 256; + al[1].type = ARG_DOUBLE; + al[1].value.dvalue = 257.0; + al[2].type = ARG_POINTER; + al[2].value.pvalue = al; + al[3].type = ARG_DOUBLE; + al[3].value.dvalue = 258.0; + al[4].type = ARG_INT; + al[4].value.ivalue = 259; + + arglist = al; + my_noprintf("%d%f%p%f%d", 256, 257.0, al, 258.0, 259); +#endif + + return 0; +} |