summaryrefslogtreecommitdiffstats
path: root/contrib/gcc/ginclude/va-alpha.h
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/gcc/ginclude/va-alpha.h')
-rw-r--r--contrib/gcc/ginclude/va-alpha.h44
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 */
OpenPOWER on IntegriCloud