|
|
1.1 root 1: /* GNU C varargs and stdargs support for the DEC Alpha. */
2:
3: /* Note: We must use the name __builtin_savregs. GCC attaches special
4: significance to that name. In particular, regardless of where in a
5: function __builtin_saveregs is called, GCC moves the call up to the
6: very start of the function. */
7:
8: /* Define __gnuc_va_list. */
9:
10: #ifndef __GNUC_VA_LIST
11: #define __GNUC_VA_LIST
12:
13: typedef struct {
14: char *__base; /* Pointer to first integer register. */
15: long __offset; /* Byte offset of args so far. */
16: } __gnuc_va_list;
17: #endif /* not __GNUC_VA_LIST */
18:
19: /* If this is for internal libc use, don't define anything but
20: __gnuc_va_list. */
21: #if defined (_STDARG_H) || defined (_VARARGS_H)
22:
23: #define va_list __gnuc_va_list
24: #define _VA_LIST
25: #define _VA_LIST_
26:
27: #if !defined(_STDARG_H)
28:
29: /* varargs support */
30: #define va_alist __builtin_va_alist
31: #define va_dcl int __builtin_va_alist;...
32: #define va_start(pvar) ((pvar) = * (__gnuc_va_list *) __builtin_saveregs ())
33:
34: #else /* STDARG.H */
35:
36: /* ANSI alternative. */
37:
38: /* Call __builtin_next_arg even though we aren't using its value, so that
39: we can verify that firstarg is correct. */
40: #define va_start(pvar, firstarg) \
41: (__builtin_next_arg (firstarg), \
42: (pvar) = *(__gnuc_va_list *) __builtin_saveregs ())
43:
44: #endif /* _STDARG_H */
45:
46: #ifndef va_end
47:
48: #define va_end(__va)
49:
50: /* Values returned by __builtin_classify_type. */
51:
52: enum {
53: __no_type_class = -1,
54: __void_type_class,
55: __integer_type_class,
56: __char_type_class,
57: __enumeral_type_class,
58: __boolean_type_class,
59: __pointer_type_class,
60: __reference_type_class,
61: __offset_type_class,
62: __real_type_class,
63: __complex_type_class,
64: __function_type_class,
65: __method_type_class,
66: __record_type_class,
67: __union_type_class,
68: __array_type_class,
69: __string_type_class,
70: __set_type_class,
71: __file_type_class,
72: __lang_type_class
73: };
74:
75: #endif
76:
77: /* Note that parameters are always aligned at least to a word boundary
78: (when passed) regardless of what GCC's __alignof__ operator says. */
79:
80: /* Avoid errors if compiling GCC v2 with GCC v1. */
81: #if __GNUC__ == 1
82: #define __extension__
83: #endif
84:
85: /* Get the size of a type in bytes, rounded up to an integral number
86: of words. */
87:
88: #define __va_tsize(__type) \
89: (((sizeof (__type) + sizeof (long) - 1) / sizeof (long)) * sizeof (long))
90:
91: #define va_arg(__va, __type) \
92: (*(((__va).__offset += __va_tsize (__type)), \
93: (__type *)(void *)((__va).__base + (__va).__offset \
94: - (((__builtin_classify_type (* (__type *) 0) \
95: == __real_type_class) && (__va).__offset <= (6 * 8)) \
96: ? (6 * 8) + 8 : __va_tsize (__type)))))
97:
98: #endif /* defined (_STDARG_H) || defined (_VARARGS_H) */
99:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.