entered into RCS
authorCharles Hannum <mycroft@gnu.org>
Fri, 26 Jun 1992 08:38:37 +0000 (08:38 +0000)
committerCharles Hannum <mycroft@gnu.org>
Fri, 26 Jun 1992 08:38:37 +0000 (08:38 +0000)
From-SVN: r1293

gcc/ginclude/va-i960.h
gcc/ginclude/va-mips.h
gcc/ginclude/va-pa.h [new file with mode: 0644]
gcc/ginclude/va-pyr.h
gcc/ginclude/va-sparc.h

index 740be6c2493960f88af5891761cd5c08596dbab8..28fc0d44935b68206cc9f63e9ee80ace5d13ed74 100644 (file)
@@ -1,5 +1,18 @@
 /* GNU C varargs support for the Intel 80960.  */
 
+/* Define __gnuc_va_list.  */
+
+#ifndef __GNUC_VA_LIST
+#define __GNUC_VA_LIST
+/* The first element is the address of the first argument.
+   The second element is the number of bytes skipped past so far.  */
+typedef unsigned __gnuc_va_list[2];    
+#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)
+
 /* In GCC version 2, we want an ellipsis at the end of the declaration
    of the argument list.  GCC version 1 can't parse it.  */
 
@@ -9,10 +22,6 @@
 #define __va_ellipsis
 #endif
 
-/* The first element is the address of the first argument.
-   The second element is the number of bytes skipped past so far.  */
-typedef unsigned va_list[2];   
-
 /* The stack size of the type t.  */
 #define __vsiz(T)   (((sizeof (T) + 3) / 4) * 4)
 /* The stack alignment of the type t.  */
@@ -42,4 +51,8 @@ typedef unsigned va_list[2];
   *((T *) ((char *) *(AP) + (AP)[1] - __vsiz (T)))                     \
 )
 
+void va_end (__gnuc_va_list);          /* Defined in libgcc.a */
 #define        va_end(AP)
+
+#endif /* defined (_STDARG_H) || defined (_VARARGS_H) */
+
index db2837abc3f9cbddeed9d003c4cd13b71f3a930f..f43222538cf2d5e8177da5972aa38291b384dee7 100644 (file)
@@ -7,8 +7,18 @@
 /* ---------------------------------------- */
 
 
-/* These macros implement traditional (non-ANSI) varargs
-   for GNU C.  */
+/* These macros implement varargs for GNU C--either traditional or ANSU.  */
+
+/* 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)
 
 /* In GCC version 2, we want an ellipsis at the end of the declaration
    of the argument list.  GCC version 1 can't parse it.  */
 #define __va_ellipsis
 #endif
 
-#ifndef _VA_LIST_
-#define _VA_LIST_
-/* Make this a macro rather than a typedef, so we can undef any other defn.  */
-#define va_list __va___list
-typedef char * __va___list;
-#endif
-
 #define __va_rounded_size(TYPE)  \
   (((sizeof (TYPE) + sizeof (int) - 1) / sizeof (int)) * sizeof (int))
 
@@ -38,6 +41,7 @@ typedef char * __va___list;
 #define va_start(AP)  AP = (char *) &__builtin_va_alist
 #endif
 
+void va_end (__gnuc_va_list);          /* Defined in libgcc.a */
 #define va_end(AP)
 
 #ifdef lint    /* complains about constant in conditional context */
@@ -50,3 +54,4 @@ typedef char * __va___list;
                                : ((int)AP + 2*4 - 1) & -4)))[-1]
 #endif         /* lint */
 
+#endif /* defined (_STDARG_H) || defined (_VARARGS_H) */
diff --git a/gcc/ginclude/va-pa.h b/gcc/ginclude/va-pa.h
new file mode 100644 (file)
index 0000000..8d403f6
--- /dev/null
@@ -0,0 +1,98 @@
+#if __GNUC__ > 1
+
+/* Define __gnuc_va_list.  */
+
+#ifndef __GNUC_VA_LIST
+#define __GNUC_VA_LIST
+
+typedef struct
+{
+  char *__va_stack_start;      /* Real start of stack args. */
+  char *__va_int;              /* Pointer to the general register */
+                               /* args and stack. */
+  char *__va_float;            /* Pointer to the fp register args.  */
+  char *__va_double;
+} __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_saveregs())
+#else
+#define va_alist  __builtin_va_alist
+/* The ... causes current_function_varargs to be set in cc1.  */
+#define va_dcl    int __builtin_va_alist; ...
+#define va_start(AP) ((AP) = *(__gnuc_va_list *)__builtin_saveregs())
+#endif /* _STDARG_H */
+
+/* Handle pass by invisible reference and voids left by aligned */
+/* doubles. */
+
+#define __va_rounded_size(TYPE)  \
+  (((sizeof (TYPE) + sizeof (int) - 1) / sizeof (int)) * sizeof (int))
+
+#define va_arg(AP, TYPE) \
+  (((__va_rounded_size(TYPE) <= 8)                                     \
+    ? ((AP).__va_int -= __va_rounded_size (TYPE),                      \
+       (AP).__va_float -= __va_rounded_size (TYPE),                    \
+       (AP).__va_double -= __va_rounded_size (TYPE),                   \
+       (__alignof__ (TYPE) > 4 ? ((int)(AP).__va_int &= ~(0x7),                \
+                                 (int)(AP).__va_float &= ~(0x7),       \
+                                 (int)(AP).__va_double &= ~(0x7)) : 0))\
+    : (int)((AP).__va_int -= sizeof (TYPE *),                          \
+           (AP).__va_float -= sizeof (TYPE *),                         \
+           (AP).__va_double -= sizeof (TYPE *))),                      \
+   (((AP).__va_int < (AP).__va_stack_start                             \
+     || __builtin_classify_type (* (TYPE *) 0) != 8)                   \
+    ? ((__va_rounded_size(TYPE) <= 8) ? *(TYPE *)(AP).__va_int         \
+       : **(TYPE **)(AP).__va_int)                                     \
+    : ((__va_rounded_size(TYPE) <= 4) ? *(TYPE *)(AP).__va_float       \
+       : ((__va_rounded_size(TYPE) <= 8) ? *(TYPE *)(AP).__va_double   \
+         : **(TYPE **)(AP).__va_int))))
+
+
+void va_end (__gnuc_va_list);          /* Defined in libgcc.a */
+#define va_end(AP)
+
+#endif /* defined (_STDARG_H) || defined (_VARARGS_H) */
+
+#else /* not __GNUCC_ > 1 */
+
+typedef char *va_list;
+
+/* __builtin_saveregs () tickles a bug in the pa-risc gcc 1.39 port, */
+/* so don't use it for varargs. Obviously the stdarg stuff doesn't */
+/* work very well. */ 
+
+#ifdef _STDARG_H
+#define va_start(AP,LASTARG) \
+  (__builtin_saveregs(), (AP) = __builtin_next_arg ())
+
+/* gcc1 doesn't implement pass by invisible reference */ 
+#define __va_rounded_size(TYPE)  \
+  (((sizeof (TYPE) + sizeof (int) - 1) / sizeof (int)) * sizeof (int))
+
+#define va_arg(AP,TYPE) \
+  ((AP) -= __va_rounded_size (TYPE), (__alignof__ (TYPE) > 4 ? \
+                                     (int)AP &= ~(0x7) : 0),   \
+   *(TYPE *)(AP))
+
+void va_end (va_list);         /* Defined in libgcc.a */
+#define va_end(AP)
+#else /* _STDARG_H */
+#define va_alist __va_a__, __va_b__, __va_c__, __va_d__
+#define va_dcl int __va_a__, __va_b__, __va_c__, __va_d__;
+#define va_start(list) list = (char *) &__va_a__, &__va_b__, &__va_c__, \
+  &__va_d__
+
+# define va_arg(list,mode) *(mode *) ((int) (list = (char *) \
+       (((int) list + sizeof(int /*__va_a__*/) - sizeof(mode)) & ~(sizeof(mode)-1)) \
+       - sizeof(int /*__va_a__*/)) + sizeof(int /*__va_a__*/))
+  
+#define va_end(list)
+
+#endif /* _STDARG_H */
+#endif /* not __GNUCC__ > 1 */
index 7034f2377cc52357e061f811011b60a415bb788a..61bddbf60c8fb68e89a37f97cf9053442ce3cbc8 100644 (file)
  *  # of calls to va_arg (debugging) at __va_buf[15]
  */
 
+/* Define __gnuc_va_list.  */
+
+#ifndef __GNUC_VA_LIST
+#define __GNUC_VA_LIST
+
 typedef void *__voidptr;
 #if 1
 
@@ -63,6 +68,14 @@ typedef __voidptr(*__va_buf);
 
 #endif
 
+typedef __va_buf __gnuc_va_list;
+
+#endif /* not __GNUC_VA_LIST */
+\f
+/* If this is for internal libc use, don't define anything but
+   __gnuc_va_list.  */
+#if defined (_STDARG_H) || defined (_VARARGS_H)
+
 /* In GCC version 2, we want an ellipsis at the end of the declaration
    of the argument list.  GCC version 1 can't parse it.  */
 
@@ -79,8 +92,6 @@ typedef __voidptr(*__va_buf);
 /* The ... causes current_function_varargs to be set in cc1.  */
 #define va_dcl __voidptr va_alist; __va_ellipsis
 
-typedef __va_buf va_list;
-
 
 /* __asm ("rcsp %0" : "=r" ( _AP [0]));*/
 
@@ -111,4 +122,7 @@ __extension__                                                               \
   *(( _MODE *)__param_addr);                                           \
 })
 
+void va_end (__gnuc_va_list);          /* Defined in libgcc.a */
 #define va_end(_X)
+
+#endif /* defined (_STDARG_H) || defined (_VARARGS_H) */
index 2afc3c47ff69b5ca921afbabe0f45516d2aeca6f..f98bbc4fd440f46708537a75ef5e1d16cd2ab4f1 100644 (file)
@@ -1,17 +1,25 @@
 /* This is just like the default gvarargs.h
    except for differences described below.  */
 
-/* Make this a macro rather than a typedef, so we can undef any other defn.  */
-#define va_list __va___list
+/* Define __gnuc_va_list.  */
+
+#ifndef __GNUC_VA_LIST
+#define __GNUC_VA_LIST
+
 #ifndef __svr4__
 /* This has to be a char * to be compatible with Sun.
    i.e., we have to pass a `va_list' to vsprintf.  */
-typedef char * __va___list;
+typedef char * __gnuc_va_list;
 #else
 /* This has to be a void * to be compatible with Sun svr4.
    i.e., we have to pass a `va_list' to vsprintf.  */
-typedef void * __va___list;
+typedef void * __gnuc_va_list;
 #endif
+#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)
 
 /* In GCC version 2, we want an ellipsis at the end of the declaration
    of the argument list.  GCC version 1 can't parse it.  */
@@ -34,6 +42,7 @@ typedef void * __va___list;
  (__builtin_saveregs (), (AP) = ((char *) &__builtin_va_alist))
 #endif
 
+void va_end (__gnuc_va_list);          /* Defined in libgcc.a */
 #define va_end(pvar)
 
 #define __va_rounded_size(TYPE)  \
@@ -64,3 +73,6 @@ __extension__                                                 \
         *(TYPE *)__u.__d; })                                   \
     : ((pvar) += __va_rounded_size (TYPE),                     \
        *((TYPE *) ((pvar) - __va_rounded_size (TYPE)))));})
+
+#endif /* defined (_STDARG_H) || defined (_VARARGS_H) */
+