From 5ed3299822c1eec29d95f20c19ee334dd767ec2a Mon Sep 17 00:00:00 2001 From: Matt Turner Date: Tue, 23 Jun 2015 18:41:38 -0700 Subject: [PATCH] glx: Avoid aliasing violations. Compilers are perfectly capable of generating efficient code for calls like these to memcpy(). Reviewed-by: Brian Paul Reviewed-by: Ian Romanick --- src/glx/packrender.h | 34 ++++++++++++++++++++-------------- src/glx/packsingle.h | 15 +++++---------- 2 files changed, 25 insertions(+), 24 deletions(-) diff --git a/src/glx/packrender.h b/src/glx/packrender.h index f8f38ca2ec5..461180cd7b1 100644 --- a/src/glx/packrender.h +++ b/src/glx/packrender.h @@ -155,28 +155,34 @@ /* Single item copy macros */ #define __GLX_PUT_CHAR(offset,a) \ - *((INT8 *) (pc + offset)) = a + do { \ + int8_t __tmp = (a); \ + memcpy((pc + (offset)), &__tmp, 1); \ + } while (0) #define __GLX_PUT_SHORT(offset,a) \ - *((INT16 *) (pc + offset)) = a + do { \ + int16_t __tmp = (a); \ + memcpy((pc + (offset)), &__tmp, 2); \ + } while (0) #define __GLX_PUT_LONG(offset,a) \ - *((INT32 *) (pc + offset)) = a + do { \ + int32_t __tmp = (a); \ + memcpy((pc + (offset)), &__tmp, 4); \ + } while (0) #define __GLX_PUT_FLOAT(offset,a) \ - *((FLOAT32 *) (pc + offset)) = a + do { \ + float __tmp = (a); \ + memcpy((pc + (offset)), &__tmp, 4); \ + } while (0) -#ifdef __GLX_ALIGN64 -/* -** This can certainly be done better for a particular machine -** architecture! -*/ -#define __GLX_PUT_DOUBLE(offset,a) \ - __GLX_MEM_COPY(pc + offset, &a, 8) -#else #define __GLX_PUT_DOUBLE(offset,a) \ - *((FLOAT64 *) (pc + offset)) = a -#endif + do { \ + double __tmp = (a); \ + memcpy((pc + (offset)), &__tmp, 8); \ + } while (0) #define __GLX_PUT_CHAR_ARRAY(offset,a,alen) \ __GLX_MEM_COPY(pc + offset, a, alen * __GLX_SIZE_INT8) diff --git a/src/glx/packsingle.h b/src/glx/packsingle.h index fddcbf157f8..99a170d5cd5 100644 --- a/src/glx/packsingle.h +++ b/src/glx/packsingle.h @@ -103,24 +103,19 @@ a = (GLint) reply.size #define __GLX_SINGLE_GET_CHAR(p) \ - *p = *(GLbyte *)&reply.pad3; + memcpy((p), &reply.pad3, 1); #define __GLX_SINGLE_GET_SHORT(p) \ - *p = *(GLshort *)&reply.pad3; + memcpy((p), &reply.pad3, 2); #define __GLX_SINGLE_GET_LONG(p) \ - *p = *(GLint *)&reply.pad3; + memcpy((p), &reply.pad3, 4); #define __GLX_SINGLE_GET_FLOAT(p) \ - *p = *(GLfloat *)&reply.pad3; + memcpy((p), &reply.pad3, 4); -#ifdef __GLX_ALIGN64 #define __GLX_SINGLE_GET_DOUBLE(p) \ - __GLX_MEM_COPY(p, &reply.pad3, 8) -#else -#define __GLX_SINGLE_GET_DOUBLE(p) \ - *p = *(GLdouble *)&reply.pad3 -#endif + memcpy((p), &reply.pad3, 8); /* Get an array of typed data */ #define __GLX_SINGLE_GET_VOID_ARRAY(a,alen) \ -- 2.30.2