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