1 /* Note: We must use the name __builtin_savregs. GCC attaches special
2 significance to that name. In particular, regardless of where in a
3 function __builtin_saveregs is called, GCC moves the call up to the
4 very start of the function. */
7 /* Define __gnuc_va_list. */
10 #define __GNUC_VA_LIST
18 #if defined (__SVR4__) || defined (__svr4__) || defined (__alliant__) || defined (__PARAGON__)
19 __f_regs __float_regs
; long __ireg
[12];
21 long __ireg
[12]; __f_regs __float_regs
;
26 #if defined(__SVR4__) || defined(__svr4__) || defined(__alliant__) || defined (__PARAGON__)
27 unsigned __ireg_used
; /* How many int regs consumed 'til now? */
28 unsigned __freg_used
; /* How many flt regs consumed 'til now? */
29 long *__reg_base
; /* Address of where we stored the regs. */
30 long * __mem_ptr
; /* Address of memory overflow args area. */
32 long *__reg_base
; /* Address of where we stored the regs. */
33 long * __mem_ptr
; /* Address of memory overflow args area. */
34 unsigned __ireg_used
; /* How many int regs consumed 'til now? */
35 unsigned __freg_used
; /* How many flt regs consumed 'til now? */
38 #endif /* not __GNUC_VA_LIST */
40 /* If this is for internal libc use, don't define anything but
42 #if defined (_STDARG_H) || defined (_VARARGS_H)
44 #if !defined(_STDARG_H)
47 #define va_alist __builtin_va_alist
48 #if defined (__PARAGON__)
49 #define va_dcl int va_alist;
50 #else /* __PARAGON__ */
52 #endif /* __PARAGON__ */
53 #define va_start(pvar) ((pvar) = * (__gnuc_va_list *) __builtin_saveregs ())
57 /* ANSI alternative. */
58 /* Note that CUMULATIVE_ARGS elements are measured in bytes on the i860,
59 so we divide by 4 to get # of registers. */
60 #define va_start(pvar, firstarg) \
61 ((pvar) = *(__gnuc_va_list *) __builtin_saveregs (), \
62 (pvar).__ireg_used = __builtin_args_info (0) / 4, \
63 (pvar).__freg_used = __builtin_args_info (1) / 4, \
64 (pvar).__mem_ptr = __builtin_next_arg (firstarg))
66 #endif /* _STDARG_H */
68 /* Values returned by __builtin_classify_type. */
76 __enumeral_type_class
,
79 __reference_type_class
,
83 __function_type_class
,
94 void va_end (__gnuc_va_list
); /* Defined in libgcc.a */
96 #define va_end(__va) ((void) 0)
98 #define __NUM_PARM_FREGS 8
99 #define __NUM_PARM_IREGS 12
101 #define __savereg(__va) ((__va_saved_regs *) ((__va).__reg_base))
103 /* This macro works both for SVR4 and pre-SVR4 environments. */
105 /* Note that parameters are always aligned at least to a word boundary
106 (when passed) regardless of what GCC's __alignof__ operator says. */
108 /* Make allowances here for adding 128-bit (long double) floats someday. */
110 #if 0 /* What was this for? */
111 #ifndef __GNU_VA_LIST
112 #define __ireg_used ireg_used
113 #define __freg_used freg_used
114 #define __mem_ptr mem_ptr
115 #define __reg_base reg_base
119 /* Avoid errors if compiling GCC v2 with GCC v1. */
121 #define __extension__
124 #define va_arg(__va, __type) \
128 register void *__rv; /* result value */ \
129 register unsigned __align; \
130 switch (__builtin_classify_type (* (__type *) 0)) \
132 case __real_type_class: \
133 switch (sizeof (__type)) \
135 case sizeof (float): \
136 case sizeof (double): \
137 if ((__va).__freg_used < __NUM_PARM_FREGS - 1) \
139 if (((__va).__freg_used & 1) != 0) \
140 (__va).__freg_used++; /* skip odd */ \
141 __rv = &__savereg((__va))->__float_regs.__freg[(__va).__freg_used];\
142 (__va).__freg_used += 2; \
146 if ((((unsigned) (__va).__mem_ptr) & (sizeof(double)-1)) != 0) \
147 (__va).__mem_ptr++; /* skip odd */ \
148 __rv = (__va).__mem_ptr; \
149 (__va).__mem_ptr += 2; \
151 if (sizeof (__type) == sizeof (float)) \
153 *((float *) __rv) = *((double *) __rv); \
154 *(((long *) __rv) + 1) = 0xfff00001; \
161 case __void_type_class: \
162 case __integer_type_class: \
163 case __char_type_class: \
164 case __enumeral_type_class: \
165 case __boolean_type_class: \
166 case __pointer_type_class: \
167 case __reference_type_class: \
168 case __offset_type_class: \
169 if (sizeof (__type) <= 4) \
171 __rv = ((__va).__ireg_used < __NUM_PARM_IREGS \
172 ? (&__savereg((__va))->__ireg[(__va).__ireg_used++]) \
173 : (__va).__mem_ptr++); \
176 else if ((__va).__ireg_used + sizeof (__type) / 4 <= __NUM_PARM_IREGS) \
178 __rv = &__savereg((__va))->__ireg[(__va).__ireg_used]; \
179 (__va).__ireg_used += sizeof (__type) / 4; \
182 /* Fall through to fetch from memory. */ \
183 case __record_type_class: \
184 case __union_type_class: \
185 __align = (__alignof__ (__type) < sizeof (long) \
187 : __alignof__ (__type)); \
190 ((((unsigned) (__va).__mem_ptr) + (__align-1)) & ~(__align-1)); \
191 __rv = (__va).__mem_ptr; \
193 += ((sizeof (__type) + sizeof (long) - 1) / sizeof (long)); \
195 case __complex_type_class: \
196 case __function_type_class: \
197 case __method_type_class: \
198 case __array_type_class: \
199 case __string_type_class: \
200 case __set_type_class: \
201 case __file_type_class: \
202 case __lang_type_class: \
203 case __no_type_class: \
210 /* Copy __gnuc_va_list into another variable of this type. */
211 #define __va_copy(dest, src) (dest) = (src)
213 #endif /* defined (_STDARG_H) || defined (_VARARGS_H) */