Fix varargs/stdarg on PowerPC Windows NT
authorMichael Meissner <meissner@gcc.gnu.org>
Wed, 14 Aug 1996 15:49:57 +0000 (15:49 +0000)
committerMichael Meissner <meissner@gcc.gnu.org>
Wed, 14 Aug 1996 15:49:57 +0000 (15:49 +0000)
From-SVN: r12637

gcc/ginclude/stdarg.h
gcc/ginclude/va-ppc.h
gcc/ginclude/varargs.h

index 025694eee92bf8ba7718174a9e16226984f0ecfe..588bf66d163b613530e49242c905271634ee3b4a 100644 (file)
@@ -38,7 +38,7 @@
 #if defined (__H8300__) || defined (__H8300H__) || defined (__H8300S__)
 #include <va-h8300.h>
 #else
-#if defined (__PPC__) && defined (_CALL_SYSV)
+#if defined (__PPC__) && (defined (_CALL_SYSV) || defined (__WIN32__))
 #include <va-ppc.h>
 #else
 #ifdef __sh__
index 57730b076f1f6abd9f73815fd933f72a6fc6d9e2..e502c2c912cb7724d21f68fa2f6d44468b83b5cd 100644 (file)
@@ -1,5 +1,7 @@
-/* GNU C varargs support for the PowerPC with V.4 calling sequence */
+/* GNU C varargs support for the PowerPC with either the V.4 or Windows NT calling sequences */
 
+#ifndef __WIN32__
+/* System V.4 support */
 /* Define __gnuc_va_list.  */
 
 #ifndef __GNUC_VA_LIST
@@ -167,3 +169,56 @@ __extension__ (*({                                                 \
 #define va_end(AP)     ((void)0)
 
 #endif /* defined (_STDARG_H) || defined (_VARARGS_H) */
+
+\f
+#else
+/* Windows NT */
+/* Define __gnuc_va_list.  */
+
+#ifndef __GNUC_VA_LIST
+#define __GNUC_VA_LIST
+typedef char *__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)
+
+#define __va_start_common(AP, LASTARG, FAKE)                           \
+  ((__builtin_saveregs ()), ((AP) = ((char *) &LASTARG) + __va_rounded_size (AP)), 0)
+
+#ifdef _STDARG_H /* stdarg.h support */
+
+/* Calling __builtin_next_arg gives the proper error message if LASTARG is
+   not indeed the last argument.  */
+#define va_start(AP,LASTARG)                                           \
+  (__builtin_saveregs (),                                              \
+   (AP) = __builtin_next_arg (LASTARG),                                        \
+   0)
+
+#else /* varargs.h support */
+
+#define va_start(AP)                                                   \
+  (__builtin_saveregs (),                                              \
+   (AP) = __builtin_next_arg (__va_1st_arg) - sizeof (int),            \
+   0)
+
+#define va_alist __va_1st_arg
+#define va_dcl register int __va_1st_arg; ...
+
+#endif /* _STDARG_H */
+
+#define __va_rounded_size(TYPE) ((sizeof (TYPE) + 3) & ~3)
+#define __va_align(AP, TYPE)                                           \
+     ((((unsigned long)(AP)) + ((sizeof (TYPE) >= 8) ? 7 : 3))         \
+      & ~((sizeof (TYPE) >= 8) ? 7 : 3))
+
+#define va_arg(AP,TYPE)                                                        \
+( *(TYPE *)((AP = (char *) (__va_align(AP, TYPE)                       \
+                           + __va_rounded_size(TYPE)))                 \
+           - __va_rounded_size(TYPE)))
+
+#define va_end(AP)     ((void)0)
+
+#endif /* defined (_STDARG_H) || defined (_VARARGS_H) */
+#endif /* Windows NT */
index 16e8437ef1c889923ae9a189344ac029e98637c0..06ba8e89ec32ad0cfc96dc0269d0dead3c110ad7 100644 (file)
@@ -36,7 +36,7 @@
 #if defined (__H8300__) || defined (__H8300H__) || defined (__H8300S__)
 #include <va-h8300.h>
 #else
-#if defined (__PPC__) && defined (_CALL_SYSV)
+#if defined (__PPC__) && (defined (_CALL_SYSV) || defined (__WIN32__))
 #include <va-ppc.h>
 #else
 #ifdef __sh__