diff options
Diffstat (limited to 'contrib/gcc/ginclude/va-alpha.h')
-rw-r--r-- | contrib/gcc/ginclude/va-alpha.h | 44 |
1 files changed, 36 insertions, 8 deletions
diff --git a/contrib/gcc/ginclude/va-alpha.h b/contrib/gcc/ginclude/va-alpha.h index 33f6c2d..2528a71 100644 --- a/contrib/gcc/ginclude/va-alpha.h +++ b/contrib/gcc/ginclude/va-alpha.h @@ -10,26 +10,41 @@ #ifndef __GNUC_VA_LIST #define __GNUC_VA_LIST +/* In VMS, __gnuc_va_list is simply char *; on OSF, it's a structure. */ + +#ifdef __VMS__ +typedef char *__gnuc_va_list; +#else + typedef struct { char *__base; /* Pointer to first integer register. */ int __offset; /* Byte offset of args so far. */ } __gnuc_va_list; -#endif /* not __GNUC_VA_LIST */ +#endif + +#endif /* __GNUC_VA_LIST */ /* If this is for internal libc use, don't define anything but __gnuc_va_list. */ -#if defined (_STDARG_H) || defined (_VARARGS_H) -#define va_list __gnuc_va_list +#if !defined(__GNUC_VA_LIST_1) && (defined (_STDARG_H) || defined (_VARARGS_H)) +#define __GNUC_VA_LIST_1 + #define _VA_LIST #define _VA_LIST_ +typedef __gnuc_va_list va_list; + #if !defined(_STDARG_H) /* varargs support */ #define va_alist __builtin_va_alist #define va_dcl int __builtin_va_alist;... +#ifdef __VMS__ +#define va_start(pvar) ((pvar) = __builtin_saveregs ()) +#else #define va_start(pvar) ((pvar) = * (__gnuc_va_list *) __builtin_saveregs ()) +#endif #else /* STDARG.H */ @@ -37,14 +52,19 @@ typedef struct { /* Call __builtin_next_arg even though we aren't using its value, so that we can verify that firstarg is correct. */ + +#ifdef __VMS__ +#define va_start(pvar, firstarg) \ + (__builtin_next_arg (firstarg), \ + (pvar) = __builtin_saveregs ()) +#else #define va_start(pvar, firstarg) \ (__builtin_next_arg (firstarg), \ (pvar) = *(__gnuc_va_list *) __builtin_saveregs ()) +#endif #endif /* _STDARG_H */ -#ifndef va_end - #define va_end(__va) ((void) 0) /* Values returned by __builtin_classify_type. */ @@ -72,8 +92,6 @@ enum { __lang_type_class }; -#endif - /* Note that parameters are always aligned at least to a word boundary (when passed) regardless of what GCC's __alignof__ operator says. */ @@ -89,12 +107,22 @@ enum { (((sizeof (__type) + __extension__ sizeof (long long) - 1) \ / __extension__ sizeof (long long)) * __extension__ sizeof (long long)) +#ifdef __VMS__ +#define va_arg(__va, __type) \ +(*(((__va) += __va_tsize (__type)), \ + (__type *)(void *)((__va) - __va_tsize (__type)))) + +#else + #define va_arg(__va, __type) \ (*(((__va).__offset += __va_tsize (__type)), \ (__type *)(void *)((__va).__base + (__va).__offset \ - (((__builtin_classify_type (* (__type *) 0) \ == __real_type_class) && (__va).__offset <= (6 * 8)) \ ? (6 * 8) + 8 : __va_tsize (__type))))) +#endif -#endif /* defined (_STDARG_H) || defined (_VARARGS_H) */ +/* Copy __gnuc_va_list into another variable of this type. */ +#define __va_copy(dest, src) (dest) = (src) +#endif /* __GNUC_VA_LIST_1 */ |