xref: /illumos-gate/usr/src/uts/common/sys/va_list.h (revision aa693e996c2928c92cccd8a3efe91373e85a6967)
1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License, Version 1.0 only
6  * (the "License").  You may not use this file except in compliance
7  * with the License.
8  *
9  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10  * or http://www.opensolaris.org/os/licensing.
11  * See the License for the specific language governing permissions
12  * and limitations under the License.
13  *
14  * When distributing Covered Code, include this CDDL HEADER in each
15  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16  * If applicable, add the following below this CDDL HEADER, with the
17  * fields enclosed by brackets "[]" replaced with your own identifying
18  * information: Portions Copyright [yyyy] [name of copyright owner]
19  *
20  * CDDL HEADER END
21  */
22 /*	Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T	*/
23 /*	  All Rights Reserved	*/
24 
25 
26 /*
27  * Copyright 2014 Garrett D'Amore <garrett@damore.org>
28  *
29  * Copyright 2004 Sun Microsystems, Inc.  All rights reserved.
30  * Use is subject to license terms.
31  */
32 
33 #ifndef	_SYS_VA_LIST_H
34 #define	_SYS_VA_LIST_H
35 
36 /*
37  * An application should not include this header directly.  Instead it
38  * should be included only through the inclusion of other Sun headers.
39  *
40  * The purpose of this header is to provide the type definitions for
41  * the va_list argument used by a number of printf and printf like
42  * functions. The headers that define these various function prototypes
43  * #include this header directly. These include but are not necessarily
44  * limited to <stdio.h>, <stdio_iso.h>, <wchar_iso.h>, <strlog.h> and
45  * <syslog.h>. The type definitions included in this header are for
46  * the benefit of consumers of va_list.
47  *
48  * Any application that accepts variable argument lists must as documented,
49  * include either <varargs.h> or the preferred <stdarg.h>. Doing so will
50  * pull in the appropriate compiler protocols defined in <sys/va_impl.h>
51  * which is in turn is included by <varargs.h> and <stdarg.h>. See comments
52  * in <sys/va_impl.h> for more detailed information regarding implementation
53  * and compiler specific protocols.
54  */
55 
56 /*
57  * The common definitions exported by this header or compilers using
58  * this header are:
59  *
60  * the identifier __builtin_va_alist for the variable list pseudo parameter
61  * the type __va_alist_type for the variable list pseudo parameter
62  * the type __va_list defining the type of the variable list iterator
63  *
64  * The feature macros (e.g. __BUILTIN_VA_STRUCT) and compiler macros
65  * (__GNUC__) and processor macros (e.g. __amd64) are intended to be
66  * defined by the compilation system, not the user of the system.
67  */
68 
69 #include <sys/isa_defs.h> 	/* sys/isa_defs needed for _LP64. */
70 
71 #ifdef	__cplusplus
72 extern "C" {
73 #endif
74 
75 #if defined(_LP64)
76 #define	__va_alist_type long
77 #else
78 #define	__va_alist_type int
79 #endif
80 
81 #define	__va_void(expr)	((void)expr)
82 #define	__va_ptr_base	void
83 
84 #if defined(__BUILTIN_VA_STRUCT) && !defined(__lint)	/* -------- protocol */
85 
86 #if defined(__amd64)	/* processor */
87 
88 typedef struct __va_list_element {
89 	unsigned int __va_gp_offset;
90 	unsigned int __va_fp_offset;
91 	void *__va_overflow_arg_area;
92 	void *__va_reg_sve_area;
93 } __va_list[1];
94 
95 /* Other ISA __va_list structures added here under #elif */
96 
97 #else	/* processor */
98 
99 #error("No __va_list structure defined for ISA")
100 
101 #endif	/* processor */
102 
103 #elif (defined(__GNUC__) && ((__GNUC__ == 2 && __GNUC_MINOR__ >= 96) || \
104 	(__GNUC__ >= 3))) && !defined(__lint)	/* ---------------- protocol */
105 
106 #define	__GNUC_VA_LIST
107 
108 typedef __builtin_va_list __gnuc_va_list;
109 /*
110  * XX64 This seems unnecessary .. but is needed because vcmn_err is
111  *	defined with __va_list instead of plain old va_list.
112  *	Perhaps that should be fixed!
113  */
114 typedef	__builtin_va_list __va_list;
115 
116 #else  /* default */				/* ---------------- protocol */
117 
118 typedef __va_ptr_base *__va_list;
119 
120 #endif  /* -------------------------------------------------------- protocol */
121 
122 #ifdef	__cplusplus
123 }
124 #endif
125 
126 #endif	/* _SYS_VA_LIST_H */
127