]>
Commit | Line | Data |
---|---|---|
f3db20a3 | 1 | /* This is just like the default gvarargs.h |
6dc42e49 | 2 | except for differences described below. */ |
f3db20a3 | 3 | |
59d52763 CH |
4 | /* Define __gnuc_va_list. */ |
5 | ||
6 | #ifndef __GNUC_VA_LIST | |
7 | #define __GNUC_VA_LIST | |
8 | ||
69d6c854 | 9 | #ifndef __svr4__ |
f3db20a3 RS |
10 | /* This has to be a char * to be compatible with Sun. |
11 | i.e., we have to pass a `va_list' to vsprintf. */ | |
59d52763 | 12 | typedef char * __gnuc_va_list; |
69d6c854 RS |
13 | #else |
14 | /* This has to be a void * to be compatible with Sun svr4. | |
15 | i.e., we have to pass a `va_list' to vsprintf. */ | |
59d52763 | 16 | typedef void * __gnuc_va_list; |
69d6c854 | 17 | #endif |
59d52763 CH |
18 | #endif /* not __GNUC_VA_LIST */ |
19 | ||
20 | /* If this is for internal libc use, don't define anything but | |
21 | __gnuc_va_list. */ | |
22 | #if defined (_STDARG_H) || defined (_VARARGS_H) | |
f3db20a3 | 23 | |
a36dc548 | 24 | #ifdef _STDARG_H |
f3db20a3 | 25 | |
4cf82435 | 26 | #ifdef __GCC_NEW_VARARGS__ |
a36dc548 | 27 | #define va_start(AP, LASTARG) (AP = (char *) __builtin_saveregs ()) |
4cf82435 JW |
28 | #else |
29 | #define va_start(AP, LASTARG) \ | |
30 | (__builtin_saveregs (), AP = ((char *) __builtin_next_arg ())) | |
31 | #endif | |
f3db20a3 | 32 | |
5840cf94 | 33 | #else |
a36dc548 | 34 | |
168c4006 | 35 | #define va_alist __builtin_va_alist |
a36dc548 | 36 | #define va_dcl |
4cf82435 JW |
37 | |
38 | #ifdef __GCC_NEW_VARARGS__ | |
a36dc548 | 39 | #define va_start(AP) ((AP) = (char *) __builtin_saveregs ()) |
4cf82435 JW |
40 | #else |
41 | #define va_start(AP) \ | |
42 | (__builtin_saveregs (), (AP) = ((char *) &__builtin_va_alist)) | |
43 | #endif | |
168c4006 | 44 | |
5840cf94 JW |
45 | #endif |
46 | ||
6f8d2fbd | 47 | #ifndef va_end |
59d52763 | 48 | void va_end (__gnuc_va_list); /* Defined in libgcc.a */ |
6f8d2fbd | 49 | #endif |
f3db20a3 RS |
50 | #define va_end(pvar) |
51 | ||
52 | #define __va_rounded_size(TYPE) \ | |
53 | (((sizeof (TYPE) + sizeof (int) - 1) / sizeof (int)) * sizeof (int)) | |
54 | ||
cc8995d5 RS |
55 | /* Avoid errors if compiling GCC v2 with GCC v1. */ |
56 | #if __GNUC__ == 1 | |
57 | #define __extension__ | |
58 | #endif | |
59 | ||
f3db20a3 RS |
60 | /* RECORD_TYPE args passed using the C calling convention are |
61 | passed by invisible reference. ??? RECORD_TYPE args passed | |
62 | in the stack are made to be word-aligned; for an aggregate that is | |
63 | not word-aligned, we advance the pointer to the first non-reg slot. */ | |
5c96a037 RS |
64 | /* We don't declare the union member `d' to have type TYPE |
65 | because that would lose in C++ if TYPE has a constructor. */ | |
7436f435 RS |
66 | /* We cast to void * and then to TYPE * because this avoids |
67 | a warning about increasing the alignment requirement. */ | |
f3db20a3 | 68 | #define va_arg(pvar,TYPE) \ |
e13d81d0 | 69 | __extension__ \ |
f3db20a3 RS |
70 | ({ TYPE __va_temp; \ |
71 | ((__builtin_classify_type (__va_temp) >= 12) \ | |
72 | ? ((pvar) += __va_rounded_size (TYPE *), \ | |
8d02144c | 73 | **(TYPE **) (void *) ((pvar) - __va_rounded_size (TYPE *))) \ |
81359be5 | 74 | : __va_rounded_size (TYPE) == 8 \ |
5c96a037 | 75 | ? ({ union {char __d[sizeof (TYPE)]; int __i[2];} __u; \ |
8d02144c JW |
76 | __u.__i[0] = ((int *) (void *) (pvar))[0]; \ |
77 | __u.__i[1] = ((int *) (void *) (pvar))[1]; \ | |
81359be5 | 78 | (pvar) += 8; \ |
7436f435 | 79 | *(TYPE *) (void *) __u.__d; }) \ |
5840cf94 | 80 | : ((pvar) += __va_rounded_size (TYPE), \ |
7436f435 | 81 | *((TYPE *) (void *) ((pvar) - __va_rounded_size (TYPE)))));}) |
59d52763 CH |
82 | |
83 | #endif /* defined (_STDARG_H) || defined (_VARARGS_H) */ | |
84 |