xref: /illumos-gate/usr/src/uts/common/sys/va_list.h (revision bdfc6d18da790deeec2e0eb09c625902defe2498)
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 #pragma ident	"%Z%%M%	%I%	%E% SMI"
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 #if defined(__STDC__) /* source language is ISO C or C++ */
82 
83 #define	__va_void(expr)	((void)expr)
84 #define	__va_ptr_base	void
85 
86 #else /* source language is K&R C */
87 
88 #define	__va_void(expr)	expr
89 #define	__va_ptr_base	char
90 
91 #endif /* __STDC__ */
92 
93 #if defined(__BUILTIN_VA_STRUCT) && !defined(__lint)	/* -------- protocol */
94 
95 #if defined(__amd64)	/* processor */
96 
97 typedef struct __va_list_element {
98 	unsigned int __va_gp_offset;
99 	unsigned int __va_fp_offset;
100 	void *__va_overflow_arg_area;
101 	void *__va_reg_sve_area;
102 } __va_list[1];
103 
104 /* Other ISA __va_list structures added here under #elif */
105 
106 #else	/* processor */
107 
108 #error("No __va_list structure defined for ISA")
109 
110 #endif	/* processor */
111 
112 #elif (defined(__GNUC__) && ((__GNUC__ == 2 && __GNUC_MINOR >= 96) || \
113 	(__GNUC__ >= 3))) && !defined(__lint)	/* ---------------- protocol */
114 
115 #define	__GNUC_VA_LIST
116 
117 typedef __builtin_va_list __gnuc_va_list;
118 /*
119  * XX64 This seems unnecessary .. but is needed because vcmn_err is
120  *	defined with __va_list instead of plain old va_list.
121  *	Perhaps that should be fixed!
122  */
123 typedef	__builtin_va_list __va_list;
124 
125 #else  /* default */				/* ---------------- protocol */
126 
127 typedef __va_ptr_base *__va_list;
128 
129 #endif  /* -------------------------------------------------------- protocol */
130 
131 #ifdef	__cplusplus
132 }
133 #endif
134 
135 #endif	/* _SYS_VA_LIST_H */
136