1 /** 2 * This file has no copyright assigned and is placed in the Public Domain. 3 * This file is part of the w64 mingw-runtime package. 4 * No warranty is given; refer to the file DISCLAIMER within this package. 5 */ 6 #ifndef _INC_VADEFS 7 #define _INC_VADEFS 8 9 #ifndef _WIN32 10 #error Only Win32 target is supported! 11 #endif 12 13 #undef _CRT_PACKING 14 #define _CRT_PACKING 8 15 #pragma pack(push,_CRT_PACKING) 16 17 #ifdef __cplusplus 18 extern "C" { 19 #endif 20 21 #ifdef __GNUC__ 22 #ifndef __GNUC_VA_LIST 23 #define __GNUC_VA_LIST 24 typedef __builtin_va_list __gnuc_va_list; 25 #endif 26 #endif 27 28 #ifndef _VA_LIST_DEFINED 29 #define _VA_LIST_DEFINED 30 #if defined(__GNUC__) 31 typedef __gnuc_va_list va_list; 32 #elif defined(_MSC_VER) 33 typedef _Writable_bytes_(_Inexpressible_("length varies")) char * va_list; 34 #endif 35 #endif 36 37 #ifndef _UINTPTR_T_DEFINED 38 #define _UINTPTR_T_DEFINED 39 #ifndef __uintptr_t_defined 40 #define __uintptr_t_defined 41 #undef uintptr_t 42 #ifdef _WIN64 43 #if defined(__GNUC__) && defined(__STRICT_ANSI__) 44 typedef unsigned int uintptr_t __attribute__ ((mode (DI))); 45 #else 46 typedef unsigned __int64 uintptr_t; 47 #endif 48 #else 49 typedef unsigned int uintptr_t; 50 #endif 51 #endif 52 #endif 53 54 #ifdef __cplusplus 55 #define _ADDRESSOF(v) (&reinterpret_cast<const char &>(v)) 56 #else 57 #define _ADDRESSOF(v) (&(v)) 58 #endif 59 60 #if defined(__ia64__) 61 #define _VA_ALIGN 8 62 #define _SLOTSIZEOF(t) ((sizeof(t) + _VA_ALIGN - 1) & ~(_VA_ALIGN - 1)) 63 #define _VA_STRUCT_ALIGN 16 64 #define _ALIGNOF(ap) ((((ap)+_VA_STRUCT_ALIGN - 1) & ~(_VA_STRUCT_ALIGN -1)) - (ap)) 65 #define _APALIGN(t,ap) (__alignof(t) > 8 ? _ALIGNOF((uintptr_t) ap) : 0) 66 #else 67 #define _SLOTSIZEOF(t) (sizeof(t)) 68 #define _APALIGN(t,ap) (__alignof(t)) 69 #endif 70 71 #define _INTSIZEOF(n) ((sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1)) 72 73 #if defined(__GNUC__) || defined(__clang__) 74 #define __crt_va_start(v,l) __builtin_va_start(v,l) 75 #define __crt_va_arg(v,l) __builtin_va_arg(v,l) 76 #define __crt_va_end(v) __builtin_va_end(v) 77 #define __va_copy(d,s) __builtin_va_copy(d,s) 78 #elif defined(_MSC_VER) 79 80 #if defined(_M_IX86) 81 #define __crt_va_start(v,l) ((void)((v) = (va_list)_ADDRESSOF(l) + _INTSIZEOF(l))) 82 #define __crt_va_arg(v,l) (*(l *)(((v) += _INTSIZEOF(l)) - _INTSIZEOF(l))) 83 #define __crt_va_end(v) ((void)((v) = (va_list)0)) 84 #define __va_copy(d,s) ((void)((d) = (s))) 85 #elif defined(_M_AMD64) 86 #define _PTRSIZEOF(n) ((sizeof(n) + sizeof(void*) - 1) & ~(sizeof(void*) - 1)) 87 #define _ISSTRUCT(t) ((sizeof(t) > sizeof(void*)) || (sizeof(t) & (sizeof(t)-1)) != 0) 88 #define __crt_va_start(v,l) ((void)((v) = (va_list)_ADDRESSOF(l) + _PTRSIZEOF(l))) 89 #define __crt_va_arg(v,t) (_ISSTRUCT(t) ? \ 90 (**(t**)(((v) += sizeof(void*)) - sizeof(void*))) : \ 91 (*(t*)(((v) += sizeof(void*)) - sizeof(void*)))) 92 #define __crt_va_end(v) ((void)((v) = (va_list)0)) 93 #define __va_copy(d,s) ((void)((d) = (s))) 94 #elif defined(_M_ARM) 95 #ifdef __cplusplus 96 extern void __cdecl __va_start(va_list*, ...); 97 #define __crt_va_start(ap,v) __va_start(&ap, _ADDRESSOF(v), _SLOTSIZEOF(v), _ADDRESSOF(v)) 98 #else 99 #define __crt_va_start(ap,v) (ap = (va_list)_ADDRESSOF(v) + _SLOTSIZEOF(v)) 100 #endif 101 #define __crt_va_arg(ap,t) (*(t*)((ap += _SLOTSIZEOF(t) + _APALIGN(t,ap)) - _SLOTSIZEOF(t))) 102 #define __crt_va_end(ap) ( ap = (va_list)0 ) 103 #define __va_copy(d,s) ((void)((d) = (s))) 104 #elif defined(_M_ARM64) 105 extern void __cdecl __va_start(va_list*, ...); 106 #define __crt_va_start(ap,v) ((void)(__va_start(&ap, _ADDRESSOF(v), _SLOTSIZEOF(v), __alignof(v), _ADDRESSOF(v)))) 107 #define __crt_va_arg(ap, t) \ 108 ((sizeof(t) > (2 * sizeof(__int64))) \ 109 ? **(t**)((ap += sizeof(__int64)) - sizeof(__int64)) \ 110 : *(t*)((ap += _SLOTSIZEOF(t) + _APALIGN(t,ap)) - _SLOTSIZEOF(t))) 111 #define __crt_va_end(ap) ((void)(ap = (va_list)0)) 112 #define __va_copy(d,s) ((void)((d) = (s))) 113 #else //if defined(_M_IA64) || defined(_M_CEE) 114 #error Please implement me 115 #endif 116 117 #endif 118 119 #if !defined(va_copy) && (!defined(__STRICT_ANSI__) || __STDC_VERSION__ + 0 >= 199900L) 120 #define va_copy(d,s) __va_copy((d),(s)) 121 #endif 122 123 #ifdef __cplusplus 124 } 125 #endif 126 127 #pragma pack(pop) 128 #endif 129