1 /***
2 *vadefs.h - defines helper macros for stdarg.h
3 *
4 *           Copyright (c) Microsoft Corporation. All rights reserved.
5 *
6 *Purpose:
7 *           This is a helper file for stdarg.h
8 *
9 *           [Public]
10 *
11 ****/
12
13 #if        _MSC_VER > 1000
14 #pragma once
15 #endif
16
17 #ifndef _INC_VADEFS
18 #define _INC_VADEFS
19
20 #if        !defined(_WIN32)
21 #error ERROR: Only Win32 target supported!
22 #endif
23
24
25 #ifdef  _MSC_VER
26 /*
27  * Currently, all MS C compilers for Win32 platforms default to 8 byte
28  * alignment.
29  */
30 #undef _CRT_PACKING
31 #define _CRT_PACKING 8
32 #pragma pack(push,_CRT_PACKING)
33 #endif  /* _MSC_VER */
34
35 #ifdef  __cplusplus
36 extern "C" {
37 #endif
38
39
40 #if !defined(_W64)
41 #if !defined(__midl) && (defined(_X86_) || defined(_M_IX86)) && _MSC_VER >= 1300
42 #define _W64 __w64
43 #else
44 #define _W64
45 #endif
46 #endif
47
48 #ifndef _UINTPTR_T_DEFINED
49 #ifdef  _WIN64
50 typedef unsigned __int64      uintptr_t;
51 #else
52 typedef _W64 unsigned int     uintptr_t;
53 #endif
54 #define _UINTPTR_T_DEFINED
55 #endif
56
57 #ifndef _VA_LIST_DEFINED
58 #ifdef _M_CEE_PURE
59 typedef System::ArgIterator va_list;
60 #else
61 typedef char *  va_list;
62 #endif /* _M_CEE_PURE */
63 #define _VA_LIST_DEFINED
64 #endif
65
66 #ifdef  __cplusplus
67 #define _ADDRESSOF(v)     ( &reinterpret_cast<const char &>(v) )
68 #else
69 #define _ADDRESSOF(v)     ( &(v) )
70 #endif
71
72 #if        defined(_M_IA64) && !defined(_M_CEE_PURE)
73 #define _VA_ALIGN           8
74 #define _SLOTSIZEOF(t)     ( (sizeof(t) + _VA_ALIGN - 1) & ~(_VA_ALIGN - 1) )
75
76 #define _VA_STRUCT_ALIGN  16 
77
78 #define _ALIGNOF(ap) ((((ap)+_VA_STRUCT_ALIGN - 1) & ~(_VA_STRUCT_ALIGN -1)) \
79              - (ap))
80 #define _APALIGN(t,ap)  (__alignof(t) > 8 ? _ALIGNOF((uintptr_t) ap) : 0)
81
82 #else
83 #define _SLOTSIZEOF(t)     (sizeof(t))
84 #define _APALIGN(t,ap)  (__alignof(t))
85 #endif
86
87 #if        defined(_M_CEE)
88
89 extern void __cdecl __va_start(va_list*, ...);
90 extern void * __cdecl __va_arg(va_list*, ...);
91 extern void __cdecl __va_end(va_list*);
92
93 #define _crt_va_start(ap,v)  ( __va_start(&ap, _ADDRESSOF(v), _SLOTSIZEOF(v), \
94                                                      __alignof(v), _ADDRESSOF(v)) )
Lines 95 ... 104 are skipped.
105 #define _crt_va_end(ap)          ( ap = (va_list)0 )
106
107 #elif defined(_M_IA64)
108
109 #ifdef  __cplusplus
110 extern void __cdecl __va_start(va_list*, ...);
111 #define _crt_va_start(ap,v)  ( __va_start(&ap, _ADDRESSOF(v), _SLOTSIZEOF(v), \
112                                            _ADDRESSOF(v)) )
113 #else
114 #define _crt_va_start(ap,v)  ( ap = (va_list)_ADDRESSOF(v) + _SLOTSIZEOF(v) )
115 #endif
116
117 #define _crt_va_arg(ap,t)      (*(t *)((ap += _SLOTSIZEOF(t)+ _APALIGN(t,ap)) \
118                                                                                         -_SLOTSIZEOF(t)))
119
120 #define _crt_va_end(ap)          ( ap = (va_list)0 )
121
122 #elif defined(_M_AMD64)
123
124
125 extern void __cdecl __va_start(va_list *, ...);
126
127 #define _crt_va_start(ap, x) ( __va_start(&ap, x) )
128 #define _crt_va_arg(ap, t)     \
129       ( ( sizeof(t) > sizeof(__int64) || ( sizeof(t) & (sizeof(t) - 1) ) != 0 ) \
130              ? **(t **)( ( ap += sizeof(__int64) ) - sizeof(__int64) ) \
131              :  *(t  *)( ( ap += sizeof(__int64) ) - sizeof(__int64) ) )
132 #define _crt_va_end(ap)          ( ap = (va_list)0 )
133
134 #else
135
136 /* A guess at the proper definitions for other platforms */
137
138 #define _INTSIZEOF(n)     ( (sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1) )
139
140 #define _crt_va_start(ap,v)  ( ap = (va_list)_ADDRESSOF(v) + _INTSIZEOF(v) )
141 #define _crt_va_arg(ap,t)      ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) )
142 #define _crt_va_end(ap)          ( ap = (va_list)0 )
143
144 #endif
145
146 #ifdef  __cplusplus
147 }
148 #endif
149
150 #ifdef  _MSC_VER
151 #pragma pack(pop)
152 #endif  /* _MSC_VER */
153
154 #endif  /* _INC_VADEFS */
155