11590Srgrimes/* GNU C varargs and stdargs support for Clipper. */ 21590Srgrimes 31590Srgrimes/* Define __gnuc_va_list. */ 41590Srgrimes 51590Srgrimes#ifndef __GNUC_VA_LIST 61590Srgrimes#define __GNUC_VA_LIST 71590Srgrimes 81590Srgrimestypedef struct 91590Srgrimes{ 101590Srgrimes int __va_ap; /* pointer to stack args */ 111590Srgrimes void *__va_reg[4]; /* pointer to r0,f0,r1,f1 */ 121590Srgrimes int __va_num; /* number of args processed */ 131590Srgrimes} __gnuc_va_list; 141590Srgrimes#endif /* not __GNUC_VA_LIST */ 151590Srgrimes 161590Srgrimes 171590Srgrimes#if defined (_STDARG_H) || defined (_VARARGS_H) 181590Srgrimestypedef __gnuc_va_list va_list; 191590Srgrimes#define __va_list __gnuc_va_list /* acc compatibility */ 201590Srgrimes 211590Srgrimes#define _VA_LIST 221590Srgrimes#define _VA_LIST_ 231590Srgrimes#define _SYS_INT_STDARG_H /* acc compatibility */ 241590Srgrimes 251590Srgrimes/* Call __builtin_next_arg even though we aren't using its value, so that 261590Srgrimes we can verify that LASTARG is correct. */ 271590Srgrimes#ifdef _STDARG_H 281590Srgrimes#define va_start(AP,LASTARG) \ 291590Srgrimes (__builtin_next_arg (LASTARG), \ 301590Srgrimes (AP) = *(va_list *)__builtin_saveregs(), \ 311590Srgrimes (AP).__va_num = __builtin_args_info (0), \ 321590Srgrimes (AP).__va_ap += __builtin_args_info (1)) 331590Srgrimes#else 341590Srgrimes#define va_alist __builtin_va_alist 3527315Scharnier/* The ... causes current_function_varargs to be set in cc1. */ 361590Srgrimes#define va_dcl va_list __builtin_va_alist; ... 3727315Scharnier#define va_start(AP) \ 3827315Scharnier ((AP) = *(va_list *)__builtin_saveregs(), \ 3930921Sache (AP).__va_num = __builtin_args_info (0)) 401590Srgrimes#endif /* _STDARG_H */ 411590Srgrimes 421590Srgrimes/* round to alignment of `type' but keep a least integer alignment */ 431590Srgrimes#define __va_round(AP,TYPE) \ 4427315Scharnier ((AP).__va_ap = ((AP).__va_ap + __alignof__ (TYPE) - 1 ) & \ 451590Srgrimes ~(__alignof__ (TYPE) - 1), \ 461590Srgrimes ((AP).__va_ap = ((AP).__va_ap + sizeof (int) - 1) & ~(sizeof (int) - 1))) 471590Srgrimes 481590Srgrimes#define va_arg(AP, TYPE) \ 491590Srgrimes (*((AP).__va_num < 2 && __builtin_classify_type (* (TYPE *)0) < 12 \ 501590Srgrimes ? (__builtin_classify_type (* (TYPE *)0) == 8 \ 511590Srgrimes ? ((TYPE *)(AP).__va_reg[2 * (AP).__va_num++ + 1]) \ 521590Srgrimes : ((TYPE *)(AP).__va_reg[2 * (AP).__va_num++ ])) \ 531590Srgrimes : ((AP).__va_num++, __va_round (AP,TYPE), ((TYPE *)((AP).__va_ap))++))) 541590Srgrimes 551590Srgrimes#define va_end(AP) ((void) 0) 561590Srgrimes 571590Srgrimes/* Copy __gnuc_va_list into another variable of this type. */ 5830921Sache#define __va_copy(dest, src) (dest) = (src) 591590Srgrimes 601590Srgrimes#endif /* defined (_STDARG_H) || defined (_VARARGS_H) */ 611590Srgrimes