1 /* va_list.c - tinycc support for va_list on X86_64 */
5 /* Avoid include files, they may not be available when cross compiling */
6 extern void abort(void);
8 /* This should be in sync with our include/stdarg.h */
10 __va_gen_reg
, __va_float_reg
, __va_stack
13 /* GCC compatible definition of va_list. */
14 /*predefined by TCC (tcc_predefs.h):
16 unsigned int gp_offset;
17 unsigned int fp_offset;
19 unsigned int overflow_offset;
20 char *overflow_arg_area;
23 } __builtin_va_list[1];
26 void *__va_arg(__builtin_va_list ap
,
30 size
= (size
+ 7) & ~7;
31 align
= (align
+ 7) & ~7;
32 switch ((enum __va_arg_type
)arg_type
) {
34 if (ap
->gp_offset
+ size
<= 48) {
35 ap
->gp_offset
+= size
;
36 return ap
->reg_save_area
+ ap
->gp_offset
- size
;
38 goto use_overflow_area
;
41 if (ap
->fp_offset
< 128 + 48) {
43 return ap
->reg_save_area
+ ap
->fp_offset
- 16;
46 goto use_overflow_area
;
50 ap
->overflow_arg_area
+= size
;
51 ap
->overflow_arg_area
= (char*)((long long)(ap
->overflow_arg_area
+ align
- 1) & -align
);
52 return ap
->overflow_arg_area
- size
;
54 default: /* should never happen */