1 /* $OpenBSD: stdarg.h,v 1.6 2003/06/02 23:27:54 millert Exp $ */ 2 /* $NetBSD: stdarg.h,v 1.10 1996/12/27 20:55:28 pk Exp $ */ 3 4 /* 5 * Copyright (c) 1992, 1993 6 * The Regents of the University of California. All rights reserved. 7 * 8 * This software was developed by the Computer Systems Engineering group 9 * at Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and 10 * contributed to Berkeley. 11 * 12 * All advertising materials mentioning features or use of this software 13 * must display the following acknowledgement: 14 * This product includes software developed by the University of 15 * California, Lawrence Berkeley Laboratory. 16 * 17 * Redistribution and use in source and binary forms, with or without 18 * modification, are permitted provided that the following conditions 19 * are met: 20 * 1. Redistributions of source code must retain the above copyright 21 * notice, this list of conditions and the following disclaimer. 22 * 2. Redistributions in binary form must reproduce the above copyright 23 * notice, this list of conditions and the following disclaimer in the 24 * documentation and/or other materials provided with the distribution. 25 * 3. Neither the name of the University nor the names of its contributors 26 * may be used to endorse or promote products derived from this software 27 * without specific prior written permission. 28 * 29 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 30 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 31 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 32 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 33 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 34 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 35 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 36 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 37 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 38 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 39 * SUCH DAMAGE. 40 * 41 * from: @(#)stdarg.h 8.2 (Berkeley) 9/27/93 42 */ 43 44 #ifndef _SPARC_STDARG_H_ 45 #define _SPARC_STDARG_H_ 46 47 #include <machine/ansi.h> 48 49 #ifdef __lint__ 50 #define __extension__(x) (0) 51 #define __builtin_classify_type(t) (0) 52 #endif 53 54 typedef _BSD_VA_LIST_ va_list; 55 56 #define __va_size(type) \ 57 (((sizeof(type) + sizeof(long) - 1) / sizeof(long)) * sizeof(long)) 58 59 #ifdef lint 60 #define va_start(ap,lastarg) ((ap) = (ap)) 61 #else 62 #define va_start(ap, last) \ 63 (__builtin_next_arg(last), (ap) = (va_list)__builtin_saveregs()) 64 #endif 65 66 /* 67 * va_arg picks up the next argument of type `type'. Appending an 68 * asterisk to `type' must produce a pointer to `type' (i.e., `type' 69 * may not be, e.g., `int (*)()'). 70 * 71 * Gcc-2.x tries to use ldd/std for double and quad_t values, but Sun's 72 * brain-damaged calling convention does not quad-align these. Thus, for 73 * 8-byte arguments, we have to pick up the actual value four bytes at a 74 * time, and use type punning (i.e., a union) to produce the result. 75 * (We could also do this with a libc function, actually, by returning 76 * 8 byte integers in %o0+%o1 and the same 8 bytes as a double in %f0+%f1.) 77 * 78 * Note: We don't declare __d with type `type', since in C++ the type might 79 * have a constructor. 80 */ 81 #if __GNUC__ == 1 82 #define __extension__ 83 #endif 84 85 #define __va_8byte(ap, type) \ 86 __extension__ ({ \ 87 union { char __d[sizeof(type)]; int __i[2]; } __va_u; \ 88 __va_u.__i[0] = ((int *)(void *)(ap))[0]; \ 89 __va_u.__i[1] = ((int *)(void *)(ap))[1]; \ 90 (ap) += 8; *(type *)(va_list)__va_u.__d; \ 91 }) 92 93 #define __va_arg(ap, type) \ 94 (*(type *)((ap) += __va_size(type), \ 95 (ap) - (sizeof(type) < sizeof(long) && \ 96 sizeof(type) != __va_size(type) ? \ 97 sizeof(type) : __va_size(type)))) 98 99 #define __RECORD_TYPE_CLASS 12 100 #define va_arg(ap, type) \ 101 (__builtin_classify_type(*(type *)0) >= __RECORD_TYPE_CLASS ? \ 102 *__va_arg(ap, type *) : __va_size(type) == 8 ? \ 103 __va_8byte(ap, type) : __va_arg(ap, type)) 104 105 #if !defined(_ANSI_SOURCE) && \ 106 (!defined(_POSIX_C_SOURCE) && !defined(_XOPEN_SOURCE) || \ 107 defined(_ISOC99_SOURCE) || (__STDC_VERSION__ - 0) >= 199901L) 108 #define va_copy(dest, src) \ 109 ((dest) = (src)) 110 #endif 111 112 #define va_end(ap) ((void)0) 113 114 #endif /* !_SPARC_STDARG_H_ */ 115