The home-grown versions don't work properly for static variadic
functions, when gcc can choose to use a non-standard calling convention.
+++ /dev/null
-#ifndef _STDARG_H
-#define _STDARG_H
-
-typedef void * va_list;
-
-#define va_start( ap, last ) do { \
- ap = ( &last + 1 ); \
- } while ( 0 )
-
-#define va_arg( ap, type ) ({ \
- type *_this = ap; \
- ap = ( _this + 1 ); \
- *(_this); \
- })
-
-#define va_end( ap ) do { } while ( 0 )
-
-#define va_copy( dest, src ) do { \
- dest = src; \
- } while ( 0 )
-
-#endif /* _STDARG_H */
--- /dev/null
+#ifndef _STDARG_H
+#define _STDARG_H
+
+typedef __builtin_va_list va_list;
+#define va_start( ap, last ) __builtin_va_start ( ap, last )
+#define va_arg( ap, type ) __builtin_va_arg ( ap, type )
+#define va_end( ap ) __builtin_va_end ( ap )
+#define va_copy( dest, src ) __builtin_va_copy ( dest, src )
+
+#endif /* _STDARG_H */