From f938bef38fedbec332e68df16a2d6b0cd6777eea Mon Sep 17 00:00:00 2001 From: Bart Van Assche Date: Tue, 15 Jun 2010 14:55:28 +0000 Subject: [PATCH] Reimplemented the _VKI_IOC_TYPECHECK() macro such that it doesn't trigger a compiler warning on PPC when it shouldn't. git-svn-id: svn://svn.valgrind.org/valgrind/trunk@11180 --- include/vki/vki-arm-linux.h | 7 ------- include/vki/vki-linux.h | 28 ++++++++++++++++++++++++++++ include/vki/vki-ppc32-linux.h | 7 ------- include/vki/vki-ppc64-linux.h | 7 ------- include/vki/vki-x86-linux.h | 7 ------- 5 files changed, 28 insertions(+), 28 deletions(-) diff --git a/include/vki/vki-arm-linux.h b/include/vki/vki-arm-linux.h index ab745bbea8..65da4e0377 100644 --- a/include/vki/vki-arm-linux.h +++ b/include/vki/vki-arm-linux.h @@ -474,13 +474,6 @@ struct vki_termios { ((nr) << _VKI_IOC_NRSHIFT) | \ ((size) << _VKI_IOC_SIZESHIFT)) -/* provoke compile error for invalid uses of size argument */ -#define _VKI_IOC_TYPECHECK(t) \ - ((sizeof(t) == sizeof(t[1]) && \ - sizeof(t) < (1 << _VKI_IOC_SIZEBITS)) \ - ? sizeof(t) \ - : /*cause gcc to complain about division by zero*/(1/0) ) - /* used to create numbers */ #define _VKI_IO(type,nr) _VKI_IOC(_VKI_IOC_NONE,(type),(nr),0) #define _VKI_IOR(type,nr,size) _VKI_IOC(_VKI_IOC_READ,(type),(nr),(_VKI_IOC_TYPECHECK(size))) diff --git a/include/vki/vki-linux.h b/include/vki/vki-linux.h index 395a059da2..beff378b31 100644 --- a/include/vki/vki-linux.h +++ b/include/vki/vki-linux.h @@ -93,6 +93,34 @@ # error Unknown platform #endif +//---------------------------------------------------------------------- +// VKI_STATIC_ASSERT(). Inspired by BUILD_BUG_ON() from +// linux-2.6.34/include/linux/kernel.h +//---------------------------------------------------------------------- + +/* + * Evaluates to zero if 'expr' is true and forces a compilation error if + * 'expr' is false. Can be used in a context where no comma expressions + * are allowed. + */ +#ifdef __cplusplus +template struct vki_static_assert { int m_bitfield:(2*b-1); }; +#define VKI_STATIC_ASSERT(expr) \ + (sizeof(vki_static_assert<(expr)>) - sizeof(int)) +#else +#define VKI_STATIC_ASSERT(expr) (sizeof(struct { int:-!(expr); })) +#endif + +//---------------------------------------------------------------------- +// Based on _IOC_TYPECHECK() from linux-2.6.34/asm-generic/ioctl.h +//---------------------------------------------------------------------- + +/* provoke compile error for invalid uses of size argument */ +#define _VKI_IOC_TYPECHECK(t) \ + (VKI_STATIC_ASSERT((sizeof(t) == sizeof(t[1]) \ + && sizeof(t) < (1 << _VKI_IOC_SIZEBITS))) \ + + sizeof(t)) + //---------------------------------------------------------------------- // From linux-2.6.8.1/include/linux/compiler.h //---------------------------------------------------------------------- diff --git a/include/vki/vki-ppc32-linux.h b/include/vki/vki-ppc32-linux.h index 224397d69a..858f9417a1 100644 --- a/include/vki/vki-ppc32-linux.h +++ b/include/vki/vki-ppc32-linux.h @@ -515,13 +515,6 @@ struct vki_termios { ((nr) << _VKI_IOC_NRSHIFT) | \ ((size) << _VKI_IOC_SIZESHIFT)) -/* provoke compile error for invalid uses of size argument */ -#define _VKI_IOC_TYPECHECK(t) \ - ((sizeof(t) == sizeof(t[1]) && \ - sizeof(t) < (1 << _VKI_IOC_SIZEBITS)) \ - ? sizeof(t) \ - : /*cause gcc to complain about division by zero*/(1/0) ) - /* used to create numbers */ #define _VKI_IO(type,nr) _VKI_IOC(_VKI_IOC_NONE,(type),(nr),0) #define _VKI_IOR(type,nr,size) _VKI_IOC(_VKI_IOC_READ,(type),(nr),(_VKI_IOC_TYPECHECK(size))) diff --git a/include/vki/vki-ppc64-linux.h b/include/vki/vki-ppc64-linux.h index c310741e72..4d786bb242 100644 --- a/include/vki/vki-ppc64-linux.h +++ b/include/vki/vki-ppc64-linux.h @@ -558,13 +558,6 @@ struct vki_termios { ((nr) << _VKI_IOC_NRSHIFT) | \ ((size) << _VKI_IOC_SIZESHIFT)) -/* provoke compile error for invalid uses of size argument */ -#define _VKI_IOC_TYPECHECK(t) \ - ((sizeof(t) == sizeof(t[1]) && \ - sizeof(t) < (1 << _VKI_IOC_SIZEBITS)) \ - ? sizeof(t) \ - : /*cause gcc to complain about division by zero*/(1/0) ) - /* used to create numbers */ #define _VKI_IO(type,nr) _VKI_IOC(_VKI_IOC_NONE,(type),(nr),0) #define _VKI_IOR(type,nr,size) _VKI_IOC(_VKI_IOC_READ,(type),(nr), \ diff --git a/include/vki/vki-x86-linux.h b/include/vki/vki-x86-linux.h index e45a0ed639..0d50529467 100644 --- a/include/vki/vki-x86-linux.h +++ b/include/vki/vki-x86-linux.h @@ -479,13 +479,6 @@ struct vki_termios { ((nr) << _VKI_IOC_NRSHIFT) | \ ((size) << _VKI_IOC_SIZESHIFT)) -/* provoke compile error for invalid uses of size argument */ -#define _VKI_IOC_TYPECHECK(t) \ - ((sizeof(t) == sizeof(t[1]) && \ - sizeof(t) < (1 << _VKI_IOC_SIZEBITS)) \ - ? sizeof(t) \ - : /*cause gcc to complain about division by zero*/(1/0) ) - /* used to create numbers */ #define _VKI_IO(type,nr) _VKI_IOC(_VKI_IOC_NONE,(type),(nr),0) #define _VKI_IOR(type,nr,size) _VKI_IOC(_VKI_IOC_READ,(type),(nr),(_VKI_IOC_TYPECHECK(size))) -- 2.47.2