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