xref: /illumos-gate/usr/src/uts/common/sys/va_list.h (revision d583b39bfb4e2571d3e41097c5c357ffe353ad45)
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 2004 Sun Microsystems, Inc.  All rights reserved.
28  * Use is subject to license terms.
29  */
30 
31 #ifndef	_SYS_VA_LIST_H
32 #define	_SYS_VA_LIST_H
33 
34 /*
35  * An application should not include this header directly.  Instead it
36  * should be included only through the inclusion of other Sun headers.
37  *
38  * The purpose of this header is to provide the type definitions for
39  * the va_list argument used by a number of printf and printf like
40  * functions. The headers that define these various function prototypes
41  * #include this header directly. These include but are not necessarily
42  * limited to <stdio.h>, <stdio_iso.h>, <wchar_iso.h>, <strlog.h> and
43  * <syslog.h>. The type definitions included in this header are for
44  * the benefit of consumers of va_list.
45  *
46  * Any application that accepts variable argument lists must as documented,
47  * include either <varargs.h> or the preferred <stdarg.h>. Doing so will
48  * pull in the appropriate compiler protocols defined in <sys/va_impl.h>
49  * which is in turn is included by <varargs.h> and <stdarg.h>. See comments
50  * in <sys/va_impl.h> for more detailed information regarding implementation
51  * and compiler specific protocols.
52  */
53 
54 /*
55  * The common definitions exported by this header or compilers using
56  * this header are:
57  *
58  * the identifier __builtin_va_alist for the variable list pseudo parameter
59  * the type __va_alist_type for the variable list pseudo parameter
60  * the type __va_list defining the type of the variable list iterator
61  *
62  * The feature macros (e.g. __BUILTIN_VA_STRUCT) and compiler macros
63  * (__GNUC__) and processor macros (e.g. __amd64) are intended to be
64  * defined by the compilation system, not the user of the system.
65  */
66 
67 #include <sys/isa_defs.h> 	/* sys/isa_defs needed for _LP64. */
68 
69 #ifdef	__cplusplus
70 extern "C" {
71 #endif
72 
73 #if defined(_LP64)
74 #define	__va_alist_type long
75 #else
76 #define	__va_alist_type int
77 #endif
78 
79 #if defined(__STDC__) /* source language is ISO C or C++ */
80 
81 #define	__va_void(expr)	((void)expr)
82 #define	__va_ptr_base	void
83 
84 #else /* source language is K&R C */
85 
86 #define	__va_void(expr)	expr
87 #define	__va_ptr_base	char
88 
89 #endif /* __STDC__ */
90 
91 #if defined(__BUILTIN_VA_STRUCT) && !defined(__lint)	/* -------- protocol */
92 
93 #if defined(__amd64)	/* processor */
94 
95 typedef struct __va_list_element {
96 	unsigned int __va_gp_offset;
97 	unsigned int __va_fp_offset;
98 	void *__va_overflow_arg_area;
99 	void *__va_reg_sve_area;
100 } __va_list[1];
101 
102 /* Other ISA __va_list structures added here under #elif */
103 
104 #else	/* processor */
105 
106 #error("No __va_list structure defined for ISA")
107 
108 #endif	/* processor */
109 
110 #elif (defined(__GNUC__) && ((__GNUC__ == 2 && __GNUC_MINOR__ >= 96) || \
111 	(__GNUC__ >= 3))) && !defined(__lint)	/* ---------------- protocol */
112 
113 #define	__GNUC_VA_LIST
114 
115 typedef __builtin_va_list __gnuc_va_list;
116 /*
117  * XX64 This seems unnecessary .. but is needed because vcmn_err is
118  *	defined with __va_list instead of plain old va_list.
119  *	Perhaps that should be fixed!
120  */
121 typedef	__builtin_va_list __va_list;
122 
123 #else  /* default */				/* ---------------- protocol */
124 
125 typedef __va_ptr_base *__va_list;
126 
127 #endif  /* -------------------------------------------------------- protocol */
128 
129 #ifdef	__cplusplus
130 }
131 #endif
132 
133 #endif	/* _SYS_VA_LIST_H */
134