glx: Avoid aliasing violations.
authorMatt Turner <mattst88@gmail.com>
Wed, 24 Jun 2015 01:41:38 +0000 (18:41 -0700)
committerMatt Turner <mattst88@gmail.com>
Tue, 26 Jul 2016 19:12:27 +0000 (12:12 -0700)
Compilers are perfectly capable of generating efficient code for calls
like these to memcpy().

Reviewed-by: Brian Paul <brianp@vmware.com>
Reviewed-by: Ian Romanick <ian.d.romanick@intel.com>
src/glx/packrender.h
src/glx/packsingle.h

index f8f38ca2ec55d60ff0ce6ca06456985c225a5c44..461180cd7b1de219873f30e83b0821424ba4b5f2 100644 (file)
 
 /* 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)
index fddcbf157f80064b1847a2a84883e0d897a05e85..99a170d5cd5683f1287ff114fad72c6f8c6ed2a8 100644 (file)
    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)     \