OSDN Git Service

Set TARGET_LIBGCC2_CFLAGS instead of LIBGCC2_CFLAGS.
[pf3gnuchains/gcc-fork.git] / gcc / ginclude / va-mips.h
1 /* ---------------------------------------- */
2 /*           VARARGS  for MIPS/GNU CC       */
3 /*                                          */
4 /*                                          */
5 /*                                          */
6 /*                                          */
7 /* ---------------------------------------- */
8
9
10 /* These macros implement varargs for GNU C--either traditional or ANSI.  */
11
12 /* Define __gnuc_va_list.  */
13
14 #ifndef __GNUC_VA_LIST
15 #define __GNUC_VA_LIST
16 #if defined (__mips_eabi) && ! defined (__mips_soft_float) && ! defined (__mips_single_float)
17
18 typedef struct {
19   /* Pointer to FP regs.  */
20   char *__fp_regs;
21   /* Number of FP regs remaining.  */
22   int __fp_left;
23   /* Pointer to GP regs followed by stack parameters.  */
24   char *__gp_regs;
25 } __gnuc_va_list;
26
27 #else /* ! (defined (__mips_eabi) && ! defined (__mips_soft_float) && ! defined (__mips_single_float)) */
28
29 typedef char * __gnuc_va_list;
30
31 #endif /* ! (defined (__mips_eabi) && ! defined (__mips_soft_float) && ! defined (__mips_single_float)) */
32 #endif /* not __GNUC_VA_LIST */
33
34 /* If this is for internal libc use, don't define anything but
35    __gnuc_va_list.  */
36 #if defined (_STDARG_H) || defined (_VARARGS_H)
37
38 enum {
39   __no_type_class = -1,
40   __void_type_class,
41   __integer_type_class,
42   __char_type_class,
43   __enumeral_type_class,
44   __boolean_type_class,
45   __pointer_type_class,
46   __reference_type_class,
47   __offset_type_class,
48   __real_type_class,
49   __complex_type_class,
50   __function_type_class,
51   __method_type_class,
52   __record_type_class,
53   __union_type_class,
54   __array_type_class,
55   __string_type_class,
56   __set_type_class,
57   __file_type_class,
58   __lang_type_class
59 };
60
61 /* In GCC version 2, we want an ellipsis at the end of the declaration
62    of the argument list.  GCC version 1 can't parse it.  */
63
64 #if __GNUC__ > 1
65 #define __va_ellipsis ...
66 #else
67 #define __va_ellipsis
68 #endif
69
70 #ifdef __mips64
71 #define __va_rounded_size(__TYPE)  \
72   (((sizeof (__TYPE) + 8 - 1) / 8) * 8)
73 #else
74 #define __va_rounded_size(__TYPE)  \
75   (((sizeof (__TYPE) + sizeof (int) - 1) / sizeof (int)) * sizeof (int))
76 #endif
77
78 #ifdef __mips64
79 #define __va_reg_size 8
80 #else
81 #define __va_reg_size 4
82 #endif
83
84 /* Get definitions for _MIPS_SIM_ABI64 etc.  */
85 #ifdef _MIPS_SIM
86 #include <sgidefs.h>
87 #endif
88
89 #ifdef _STDARG_H
90 #if defined (__mips_eabi)
91 #if ! defined (__mips_soft_float) && ! defined (__mips_single_float)
92 #ifdef __mips64
93 #define va_start(__AP, __LASTARG)                                       \
94   (__AP.__gp_regs = ((char *) __builtin_next_arg (__LASTARG)            \
95                      - (__builtin_args_info (2) < 8                     \
96                         ? (8 - __builtin_args_info (2)) * __va_reg_size \
97                         : 0)),                                          \
98    __AP.__fp_left = 8 - __builtin_args_info (3),                        \
99    __AP.__fp_regs = __AP.__gp_regs - __AP.__fp_left * __va_reg_size)
100 #else /* ! defined (__mips64) */
101 #define va_start(__AP, __LASTARG)                                       \
102   (__AP.__gp_regs = ((char *) __builtin_next_arg (__LASTARG)            \
103                      - (__builtin_args_info (2) < 8                     \
104                         ? (8 - __builtin_args_info (2)) * __va_reg_size \
105                         : 0)),                                          \
106    __AP.__fp_left = (8 - __builtin_args_info (3)) / 2,                  \
107    __AP.__fp_regs = __AP.__gp_regs - __AP.__fp_left * 8,                \
108    __AP.__fp_regs = (char *) ((int) __AP.__fp_regs & -8))
109 #endif /* ! defined (__mips64) */
110 #else /* ! (! defined (__mips_soft_float) && ! defined (__mips_single_float) ) */
111 #define va_start(__AP, __LASTARG)                                       \
112   (__AP = ((__gnuc_va_list) __builtin_next_arg (__LASTARG)              \
113            - (__builtin_args_info (2) >= 8 ? 0                          \
114               : (8 - __builtin_args_info (2)) * __va_reg_size)))
115 #endif /* ! (! defined (__mips_soft_float) && ! defined (__mips_single_float) ) */
116 #else /* ! defined (__mips_eabi) */
117 #define va_start(__AP, __LASTARG) \
118   (__AP = (__gnuc_va_list) __builtin_next_arg (__LASTARG))
119 #endif /* ! (defined (__mips_eabi) && ! defined (__mips_soft_float) && ! defined (__mips_single_float)) */
120 #else /* ! _STDARG_H */
121 #define va_alist  __builtin_va_alist
122 #ifdef __mips64
123 /* This assumes that `long long int' is always a 64 bit type.  */
124 #define va_dcl    long long int __builtin_va_alist; __va_ellipsis
125 #else
126 #define va_dcl    int __builtin_va_alist; __va_ellipsis
127 #endif
128 #if defined (__mips_eabi)
129 #if ! defined (__mips_soft_float) && ! defined (__mips_single_float)
130 #ifdef __mips64
131 #define va_start(__AP)                                                  \
132   (__AP.__gp_regs = ((char *) __builtin_next_arg ()                     \
133                      - (__builtin_args_info (2) < 8                     \
134                         ? (8 - __builtin_args_info (2)) * __va_reg_size \
135                         : __va_reg_size)),                              \
136    __AP.__fp_left = 8 - __builtin_args_info (3),                        \
137    __AP.__fp_regs = __AP.__gp_regs - __AP.__fp_left * __va_reg_size)
138 #else /* ! defined (__mips64) */
139 #define va_start(__AP)                                                  \
140   (__AP.__gp_regs = ((char *) __builtin_next_arg ()                     \
141                      - (__builtin_args_info (2) < 8                     \
142                         ? (8 - __builtin_args_info (2)) * __va_reg_size \
143                         : __va_reg_size)),                              \
144    __AP.__fp_left = (8 - __builtin_args_info (3)) / 2,                  \
145    __AP.__fp_regs = __AP.__gp_regs - __AP.__fp_left * 8,                \
146    __AP.__fp_regs = (char *) ((int) __AP.__fp_regs & -8))
147 #endif /* ! defined (__mips64) */
148 #else /* ! (! defined (__mips_soft_float) && ! defined (__mips_single_float)) */
149 #define va_start(__AP)                                                  \
150   (__AP = ((__gnuc_va_list) __builtin_next_arg ()                       \
151            - (__builtin_args_info (2) >= 8 ? __va_reg_size              \
152               : (8 - __builtin_args_info (2)) * __va_reg_size)))
153 #endif /* ! (! defined (__mips_soft_float) && ! defined (__mips_single_float)) */
154 /* Need alternate code for _MIPS_SIM_ABI64.  */
155 #elif defined(_MIPS_SIM) && (_MIPS_SIM == _MIPS_SIM_ABI64 || _MIPS_SIM == _MIPS_SIM_NABI32)
156 #define va_start(__AP)                                                  \
157   (__AP = (__gnuc_va_list) __builtin_next_arg ()                        \
158    + (__builtin_args_info (2) >= 8 ? -8 : 0))
159 #else
160 #define va_start(__AP)  __AP = (char *) &__builtin_va_alist
161 #endif
162 #endif /* ! _STDARG_H */
163
164 #ifndef va_end
165 void va_end (__gnuc_va_list);           /* Defined in libgcc.a */
166 #endif
167 #define va_end(__AP)    ((void)0)
168
169 #if defined (__mips_eabi)
170
171 #if ! defined (__mips_soft_float) && ! defined (__mips_single_float)
172 #ifdef __mips64
173 #define __va_next_addr(__AP, __type)                                    \
174   ((__builtin_classify_type (*(__type *) 0) == __real_type_class        \
175     && __AP.__fp_left > 0)                                              \
176    ? (--__AP.__fp_left, (__AP.__fp_regs += 8) - 8)                      \
177    : (__AP.__gp_regs += __va_reg_size) - __va_reg_size)
178 #else
179 #define __va_next_addr(__AP, __type)                                    \
180   ((__builtin_classify_type (*(__type *) 0) == __real_type_class        \
181     && __AP.__fp_left > 0)                                              \
182    ? (--__AP.__fp_left, (__AP.__fp_regs += 8) - 8)                      \
183    : (((__builtin_classify_type (* (__type *) 0) < __record_type_class  \
184         && __alignof__ (__type) > 4)                                    \
185        ? __AP.__gp_regs = (char *) (((int) __AP.__gp_regs + 8 - 1) & -8) \
186        : (char *) 0),                                                   \
187       (__builtin_classify_type (* (__type *) 0) >= __record_type_class  \
188        ? (__AP.__gp_regs += __va_reg_size) - __va_reg_size              \
189        : ((__AP.__gp_regs += __va_rounded_size (__type))                \
190           - __va_rounded_size (__type)))))
191 #endif
192 #else /* ! (! defined (__mips_soft_float) && ! defined (__mips_single_float)) */
193 #ifdef __mips64
194 #define __va_next_addr(__AP, __type)                                    \
195   ((__AP += __va_reg_size) - __va_reg_size)
196 #else
197 #define __va_next_addr(__AP, __type)                                    \
198   (((__builtin_classify_type (* (__type *) 0) < __record_type_class     \
199      && __alignof__ (__type) > 4)                                       \
200     ? __AP = (char *) (((int) __AP + 8 - 1) & -8)                       \
201     : (char *) 0),                                                      \
202    (__builtin_classify_type (* (__type *) 0) >= __record_type_class     \
203     ? (__AP += __va_reg_size) - __va_reg_size                           \
204     : ((__AP += __va_rounded_size (__type))                             \
205        - __va_rounded_size (__type))))
206 #endif
207 #endif /* ! (! defined (__mips_soft_float) && ! defined (__mips_single_float)) */
208
209 #ifdef __MIPSEB__
210 #define va_arg(__AP, __type)                                            \
211   ((__va_rounded_size (__type) <= __va_reg_size)                        \
212    ? *(__type *) (void *) (__va_next_addr (__AP, __type)                \
213                            + __va_reg_size                              \
214                            - sizeof (__type))                           \
215    : (__builtin_classify_type (*(__type *) 0) >= __record_type_class    \
216       ? **(__type **) (void *) (__va_next_addr (__AP, __type)           \
217                                 + __va_reg_size                         \
218                                 - sizeof (char *))                      \
219       : *(__type *) (void *) __va_next_addr (__AP, __type)))
220 #else
221 #define va_arg(__AP, __type)                                            \
222   ((__va_rounded_size (__type) <= __va_reg_size)                        \
223    ? *(__type *) (void *) __va_next_addr (__AP, __type)         \
224    : (__builtin_classify_type (* (__type *) 0) >= __record_type_class   \
225       ? **(__type **) (void *) __va_next_addr (__AP, __type)            \
226       : *(__type *) (void *) __va_next_addr (__AP, __type)))
227 #endif
228
229 #else /* ! defined (__mips_eabi) */
230
231 /* We cast to void * and then to TYPE * because this avoids
232    a warning about increasing the alignment requirement.  */
233 /* The __mips64 cases are reversed from the 32 bit cases, because the standard
234    32 bit calling convention left-aligns all parameters smaller than a word,
235    whereas the __mips64 calling convention does not (and hence they are
236    right aligned).  */
237 #ifdef __mips64
238 #ifdef __MIPSEB__
239 #define va_arg(__AP, __type)                                    \
240   ((__type *) (void *) (__AP = (char *) ((((__PTRDIFF_TYPE__)__AP + 8 - 1) & -8) \
241                                          + __va_rounded_size (__type))))[-1]
242 #else
243 #define va_arg(__AP, __type)                                    \
244   ((__AP = (char *) ((((__PTRDIFF_TYPE__)__AP + 8 - 1) & -8)    \
245                      + __va_rounded_size (__type))),            \
246    *(__type *) (void *) (__AP - __va_rounded_size (__type)))
247 #endif
248
249 #else /* not __mips64 */
250
251 #ifdef __MIPSEB__
252 /* For big-endian machines.  */
253 #define va_arg(__AP, __type)                                    \
254   ((__AP = (char *) ((__alignof__ (__type) > 4                  \
255                       ? ((int)__AP + 8 - 1) & -8                \
256                       : ((int)__AP + 4 - 1) & -4)               \
257                      + __va_rounded_size (__type))),            \
258    *(__type *) (void *) (__AP - __va_rounded_size (__type)))
259 #else
260 /* For little-endian machines.  */
261 #define va_arg(__AP, __type)                                                \
262   ((__type *) (void *) (__AP = (char *) ((__alignof__(__type) > 4           \
263                                           ? ((int)__AP + 8 - 1) & -8        \
264                                           : ((int)__AP + 4 - 1) & -4)       \
265                                          + __va_rounded_size(__type))))[-1]
266 #endif
267 #endif
268 #endif /* ! defined (__mips_eabi)  */
269
270 /* Copy __gnuc_va_list into another variable of this type.  */
271 #define __va_copy(dest, src) (dest) = (src)
272
273 #endif /* defined (_STDARG_H) || defined (_VARARGS_H) */