XenevaOS
Loading...
Searching...
No Matches
stdarg.h
Go to the documentation of this file.
1
31#ifndef __STDARG_H__
32#define __STDARG_H__
33
34
35#ifdef __cplusplus
36extern "C"
37{
38#endif
39
40
41#ifdef __GNUC__
42 typedef __builtin_va_list va_list;
43#else
44 /* va list parameter list */
45 typedef unsigned char* va_list;
46#endif
47
48
49 /* width of stack == width of int */
50#define STACKITEM int64_t
51
52 /* round up width of objects pushed on stack. The expression before the
53 & ensures that we get 0 for objects of size 0. */
54#define VA_SIZE(TYPE) \
55 ((sizeof(TYPE)+sizeof(STACKITEM)-1) \
56 & ~(sizeof(STACKITEM)-1))
57
58#if defined(ARCH_X64) || defined(__x86_64__)
59 /* &(LASTARG) points to the LEFTMOST argument of the function call
60 (before the ...) */
61#define va_start(AP, LASTARG) \
62 (AP = ((va_list)&(LASTARG)+VA_SIZE(LASTARG)))
63
64 /* nothing for va_end */
65#define va_end(AP)
66
67#define va_arg(AP, TYPE) \
68 (AP += VA_SIZE(TYPE), *((TYPE *)(AP - VA_SIZE(TYPE))))
69#elif defined(ARCH_ARM64) || defined(__aarch64__)
70#ifdef __GNUC__
71#define va_start(ap, last) __builtin_va_start(ap, last)
72#define va_arg(ap, type) __builtin_va_arg(ap, type)
73#define va_end(ap) __builtin_va_end(ap)
74#else
75#define va_start(ap,last) \
76 ((ap) = (va_list)(&(last)) + 8)
77
78#define va_arg(ap,T) \
79 (*(T*)((ap) += 8, (ap) - 8))
80
81#define va_end(ap) \
82 ((ap) = (va_list)0)
83#endif
84#endif
85
86#ifdef __cplusplus
87}
88#endif
89
90
91#endif
unsigned char * va_list
Definition stdarg.h:45