1/* GNU C varargs and stdargs support for the DEC Alpha. */ 2 3/* Note: We must use the name __builtin_savregs. GCC attaches special 4 significance to that name. In particular, regardless of where in a 5 function __builtin_saveregs is called, GCC moves the call up to the 6 very start of the function. */ 7 8/* Define __gnuc_va_list. */ 9 10#ifndef __GNUC_VA_LIST 11#define __GNUC_VA_LIST 12 13/* In VMS, __gnuc_va_list is simply char *; on OSF, it's a structure. */ 14 15#ifdef __VMS__ 16typedef char *__gnuc_va_list; 17#else 18 19typedef struct { 20 char *__base; /* Pointer to first integer register. */ 21 int __offset; /* Byte offset of args so far. */ 22} __gnuc_va_list; 23#endif 24 25#endif /* __GNUC_VA_LIST */ 26 27/* If this is for internal libc use, don't define anything but 28 __gnuc_va_list. */ 29 30#if !defined(__GNUC_VA_LIST_1) && (defined (_STDARG_H) || defined (_VARARGS_H)) 31#define __GNUC_VA_LIST_1 32 33#define _VA_LIST 34#define _VA_LIST_ 35 36typedef __gnuc_va_list va_list; 37 38#if !defined(_STDARG_H) 39 40/* varargs support */ 41#define va_alist __builtin_va_alist 42#define va_dcl int __builtin_va_alist;... 43#ifdef __VMS__ 44#define va_start(pvar) ((pvar) = __builtin_saveregs ()) 45#else 46#define va_start(pvar) ((pvar) = * (__gnuc_va_list *) __builtin_saveregs ()) 47#endif 48 49#else /* STDARG.H */ 50 51/* ANSI alternative. */ 52 53/* Call __builtin_next_arg even though we aren't using its value, so that 54 we can verify that firstarg is correct. */ 55 56#ifdef __VMS__ 57#define va_start(pvar, firstarg) \ 58 (__builtin_next_arg (firstarg), \ 59 (pvar) = __builtin_saveregs ()) 60#else 61#define va_start(pvar, firstarg) \ 62 (__builtin_next_arg (firstarg), \ 63 (pvar) = *(__gnuc_va_list *) __builtin_saveregs ()) 64#endif 65 66#endif /* _STDARG_H */ 67 68#define va_end(__va) ((void) 0) 69 70/* Values returned by __builtin_classify_type. */ 71 72enum { 73 __no_type_class = -1, 74 __void_type_class, 75 __integer_type_class, 76 __char_type_class, 77 __enumeral_type_class, 78 __boolean_type_class, 79 __pointer_type_class, 80 __reference_type_class, 81 __offset_type_class, 82 __real_type_class, 83 __complex_type_class, 84 __function_type_class, 85 __method_type_class, 86 __record_type_class, 87 __union_type_class, 88 __array_type_class, 89 __string_type_class, 90 __set_type_class, 91 __file_type_class, 92 __lang_type_class 93}; 94 95/* Note that parameters are always aligned at least to a word boundary 96 (when passed) regardless of what GCC's __alignof__ operator says. */ 97 98/* Avoid errors if compiling GCC v2 with GCC v1. */ 99#if __GNUC__ == 1 100#define __extension__ 101#endif 102 103/* Get the size of a type in bytes, rounded up to an integral number 104 of words. */ 105 106#define __va_tsize(__type) \ 107 (((sizeof (__type) + __extension__ sizeof (long long) - 1) \ 108 / __extension__ sizeof (long long)) * __extension__ sizeof (long long)) 109 110#ifdef __VMS__ 111#define va_arg(__va, __type) \ 112(*(((__va) += __va_tsize (__type)), \ 113 (__type *)(void *)((__va) - __va_tsize (__type)))) 114 115#else 116 117#define va_arg(__va, __type) \ 118(*(((__va).__offset += __va_tsize (__type)), \ 119 (__type *)(void *)((__va).__base + (__va).__offset \ 120 - (((__builtin_classify_type (* (__type *) 0) \ 121 == __real_type_class) && (__va).__offset <= (6 * 8)) \ 122 ? (6 * 8) + 8 : __va_tsize (__type))))) 123#endif 124 125/* Copy __gnuc_va_list into another variable of this type. */ 126#define __va_copy(dest, src) (dest) = (src) 127 128#endif /* __GNUC_VA_LIST_1 */ 129