From c8f8a520f636d77609b345a9a6f12f8756984a0c Mon Sep 17 00:00:00 2001 From: Bruce Evans Date: Sat, 21 Jun 1997 16:20:55 +0000 Subject: [PATCH] Fixed va_arg() to work for small args (as in stdarg.h). --- sys/amd64/include/varargs.h | 15 ++++++--------- sys/i386/include/varargs.h | 15 ++++++--------- 2 files changed, 12 insertions(+), 18 deletions(-) diff --git a/sys/amd64/include/varargs.h b/sys/amd64/include/varargs.h index 10b57877a3d..5661462e11f 100644 --- a/sys/amd64/include/varargs.h +++ b/sys/amd64/include/varargs.h @@ -36,7 +36,7 @@ * SUCH DAMAGE. * * @(#)varargs.h 8.2 (Berkeley) 3/22/94 - * $Id: varargs.h,v 1.5 1997/02/22 09:35:22 peter Exp $ + * $Id: varargs.h,v 1.6 1997/02/28 07:12:34 bde Exp $ */ #ifndef _VARARGS_H_ @@ -44,6 +44,9 @@ typedef char *va_list; +#define __va_size(type) \ + (((sizeof(type) + sizeof(int) - 1) / sizeof(int)) * sizeof(int)) + #ifdef __GNUC__ #define va_alist __builtin_va_alist #endif @@ -54,16 +57,10 @@ typedef char *va_list; #endif #define va_start(ap) \ - ap = (char *)&va_alist + ((ap) = (va_list)&va_alist) -#ifdef KERNEL #define va_arg(ap, type) \ - ((type *)(ap += sizeof(type)))[-1] -#else -#define va_arg(ap, type) \ - ((type *)(ap += sizeof(type) < sizeof(int) ? \ - (abort(), 0) : sizeof(type)))[-1] -#endif + (*(type *)((ap) += __va_size(type), (ap) - __va_size(type))) #define va_end(ap) diff --git a/sys/i386/include/varargs.h b/sys/i386/include/varargs.h index 10b57877a3d..5661462e11f 100644 --- a/sys/i386/include/varargs.h +++ b/sys/i386/include/varargs.h @@ -36,7 +36,7 @@ * SUCH DAMAGE. * * @(#)varargs.h 8.2 (Berkeley) 3/22/94 - * $Id: varargs.h,v 1.5 1997/02/22 09:35:22 peter Exp $ + * $Id: varargs.h,v 1.6 1997/02/28 07:12:34 bde Exp $ */ #ifndef _VARARGS_H_ @@ -44,6 +44,9 @@ typedef char *va_list; +#define __va_size(type) \ + (((sizeof(type) + sizeof(int) - 1) / sizeof(int)) * sizeof(int)) + #ifdef __GNUC__ #define va_alist __builtin_va_alist #endif @@ -54,16 +57,10 @@ typedef char *va_list; #endif #define va_start(ap) \ - ap = (char *)&va_alist + ((ap) = (va_list)&va_alist) -#ifdef KERNEL #define va_arg(ap, type) \ - ((type *)(ap += sizeof(type)))[-1] -#else -#define va_arg(ap, type) \ - ((type *)(ap += sizeof(type) < sizeof(int) ? \ - (abort(), 0) : sizeof(type)))[-1] -#endif + (*(type *)((ap) += __va_size(type), (ap) - __va_size(type))) #define va_end(ap)