summaryrefslogtreecommitdiff
path: root/gcc_arm/ginclude/va-fr30.h
diff options
context:
space:
mode:
Diffstat (limited to 'gcc_arm/ginclude/va-fr30.h')
-rwxr-xr-xgcc_arm/ginclude/va-fr30.h49
1 files changed, 49 insertions, 0 deletions
diff --git a/gcc_arm/ginclude/va-fr30.h b/gcc_arm/ginclude/va-fr30.h
new file mode 100755
index 0000000..17b8e37
--- /dev/null
+++ b/gcc_arm/ginclude/va-fr30.h
@@ -0,0 +1,49 @@
+/* Define __gnuc_va_list. */
+
+#ifndef __GNUC_VA_LIST
+#define __GNUC_VA_LIST
+typedef void * __gnuc_va_list;
+#endif /* not __GNUC_VA_LIST */
+
+/* If this is for internal libc use, don't define anything but
+ __gnuc_va_list. */
+#if defined (_STDARG_H) || defined (_VARARGS_H)
+
+#ifdef _STDARG_H
+#define va_start(AP, LASTARG) \
+ (AP = ((__gnuc_va_list) __builtin_next_arg (LASTARG)))
+#else
+#define __va_ellipsis ...
+#define va_alist __builtin_va_alist
+#define va_dcl int __builtin_va_alist; __va_ellipsis
+#define va_start(AP) AP = (char *) & __builtin_va_alist
+#endif
+
+/* Now stuff common to both varargs & stdarg implementations. */
+#define __va_rounded_size(TYPE) \
+ (((sizeof (TYPE) + sizeof (int) - 1) / sizeof (int)) * sizeof (int))
+
+#undef va_end
+
+void va_end (__gnuc_va_list);
+
+#define va_end(AP) ((void)0)
+
+/* We need to be able to detect structures and handle them specially. */
+#define __va_aggregate_p(TYPE) (__builtin_classify_type(*(TYPE *)0) >= 12)
+
+#define va_arg(AP, TYPE) \
+ (__va_aggregate_p (TYPE) ? \
+ (AP = (__gnuc_va_list) ((char *) (AP) + __va_rounded_size (char *)), \
+ ** ((TYPE **) (void *)((char *) (AP) - __va_rounded_size (char *)))) \
+ : (sizeof (TYPE) % sizeof (int) == 0) ? \
+ (AP = (__gnuc_va_list) ((char *) (AP) + __va_rounded_size (TYPE)), \
+ * ((TYPE *) (void *) ((char *) (AP) - __va_rounded_size (TYPE)))) \
+ : (sizeof (TYPE) < 4) ? \
+ (AP = (__gnuc_va_list) ((char *) (AP) + __va_rounded_size (TYPE)), \
+ * ((TYPE *) (void *) ((char *) (AP) - sizeof (TYPE)))) \
+ : \
+ (AP = (__gnuc_va_list) ((char *) (AP) + __va_rounded_size (char *)), \
+ ** ((TYPE **) (void *)((char *) (AP) - __va_rounded_size (char *)))))
+
+#endif /* defined (_STDARG_H) || defined (_VARARGS_H) */