[Mesa-dev] [PATCH 6/7] glx: Avoid aliasing violations.

Matt Turner mattst88 at gmail.com
Mon Jun 27 21:43:02 UTC 2016


Compilers are perfectly capable of generating efficient code for calls
like these to memcpy().
---
 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 f8f38ca..58094e0 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 fddcbf1..e38e820 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.7.3



More information about the mesa-dev mailing list