|
|
1.1 root 1: typedef char *va_list;
2:
3: #if __GNUCC__ > 1
4:
5: #ifdef _STDARG_H
6: #define va_start(AP,LASTARG) \
7: (__builtin_saveregs(), (AP) = __builtin_next_arg ())
8: #else
9: #define va_alist __builtin_va_alist
10: /* The ... causes current_function_varargs to be set in cc1. */
11: #define va_dcl int __builtin_va_alist; ...
12: #define va_start(AP) \
13: ((AP) = (va_list *)&__builtin_va_alist + sizeof(int))
14: #endif /* _STDARG_H */
15:
16: /* Handle pass by invisible reference and voids left by aligned */
17: /* doubles. */
18:
19: #define __va_rounded_size(TYPE) \
20: (((sizeof (TYPE) + sizeof (int) - 1) / sizeof (int)) * sizeof (int))
21:
22: #define va_arg(AP,TYPE) \
23: ((__va_rounded_size(TYPE) <= 8)) \
24: ? ((AP) -= __va_rounded_size (TYPE), (__alignof__ (TYPE) > 4 ? \
25: (int)AP &= ~(0x7) : 0), \
26: *(TYPE *)(AP)) \
27: : ((AP) -= sizeof (TYPE *), **(TYPE **)(AP))
28:
29: void va_end (va_list); /* Defined in libgcc.a */
30: #define va_end(AP)
31:
32: #else /* __GNUCC__ > 1 */
33:
34: /* __builtin_saveregs () tickles a bug in the pa-risc gcc 1.39 port, */
35: /* so don't use it for varargs. Obviously the stdarg stuff doesn't */
36: /* work very well. */
37:
38: #ifdef _STDARG_H
39: #define va_start(AP,LASTARG) \
40: (__builtin_saveregs(), (AP) = __builtin_next_arg ())
41:
42: /* gcc1 doesn't implement pass by invisible reference */
43: #define __va_rounded_size(TYPE) \
44: (((sizeof (TYPE) + sizeof (int) - 1) / sizeof (int)) * sizeof (int))
45:
46: #define va_arg(AP,TYPE) \
47: ((AP) -= __va_rounded_size (TYPE), (__alignof__ (TYPE) > 4 ? \
48: (int)AP &= ~(0x7) : 0), \
49: *(TYPE *)(AP))
50:
51: void va_end (va_list); /* Defined in libgcc.a */
52: #define va_end(AP)
53: #else /* _STDARG_H */
54: #define va_alist __va_a__, __va_b__, __va_c__, __va_d__
55: #define va_dcl int __va_a__, __va_b__, __va_c__, __va_d__;
56: #define va_start(list) list = (char *) &__va_a__, &__va_b__, &__va_c__, \
57: &__va_d__
58:
59: # define va_arg(list,mode) *(mode *) ((int) (list = (char *) \
60: (((int) list + sizeof(int /*__va_a__*/) - sizeof(mode)) & ~(sizeof(mode)-1)) \
61: - sizeof(int /*__va_a__*/)) + sizeof(int /*__va_a__*/))
62:
63: #define va_end(list)
64:
65: #endif /* _STDARG_H */
66: #endif /* __GNUCC__ > 1 */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.