Mesa (master): glx: Avoid aliasing violations.

Matt Turner mattst88 at kemper.freedesktop.org
Tue Jul 26 19:12:39 UTC 2016


Module: Mesa
Branch: master
Commit: 5ed3299822c1eec29d95f20c19ee334dd767ec2a
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=5ed3299822c1eec29d95f20c19ee334dd767ec2a

Author: Matt Turner <mattst88 at gmail.com>
Date:   Tue Jun 23 18:41:38 2015 -0700

glx: Avoid aliasing violations.

Compilers are perfectly capable of generating efficient code for calls
like these to memcpy().

Reviewed-by: Brian Paul <brianp at vmware.com>
Reviewed-by: Ian Romanick <ian.d.romanick at intel.com>

---

 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..461180c 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..99a170d 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)     \




More information about the mesa-commit mailing list