The previous misc.h code went out of its way to allow swapping of
unaligned pointers to values.  However, the members of an X
request/response are always naturally aligned within the struct, and
the buffers containing a request/response will also be aligned to at
least 8 bytes, so we can just drop it.

        text      data   bss    dec      hex    filename
before: 2215167   51552  132016 2398735  249a0f hw/xfree86/Xorg
after:  2214919   51552  132016 2398487  249917 hw/xfree86/Xorg

Signed-off-by: Eric Anholt <e...@anholt.net>
---
 include/misc.h | 15 +++------------
 test/misc.c    | 25 ++++++-------------------
 2 files changed, 9 insertions(+), 31 deletions(-)

diff --git a/include/misc.h b/include/misc.h
index a75eb617c642..38af70ff9e89 100644
--- a/include/misc.h
+++ b/include/misc.h
@@ -310,12 +310,9 @@ bswap_64(uint64_t x)
 }
 
 #define swapll(x) do { \
-               uint64_t temp; \
                if (sizeof(*(x)) != 8) \
                        wrong_size(); \
-               memcpy(&temp, x, 8); \
-               temp = bswap_64(temp); \
-               memcpy(x, &temp, 8); \
+               *(x) = bswap_64(*(x));          \
        } while (0)
 
 static inline uint32_t
@@ -328,12 +325,9 @@ bswap_32(uint32_t x)
 }
 
 #define swapl(x) do { \
-               uint32_t temp; \
                if (sizeof(*(x)) != 4) \
                        wrong_size(); \
-               memcpy(&temp, x, 4); \
-               temp = bswap_32(temp); \
-               memcpy(x, &temp, 4); \
+               *(x) = bswap_32(*(x)); \
        } while (0)
 
 static inline uint16_t
@@ -344,12 +338,9 @@ bswap_16(uint16_t x)
 }
 
 #define swaps(x) do { \
-               uint16_t temp; \
                if (sizeof(*(x)) != 2) \
                        wrong_size(); \
-               memcpy(&temp, x, 2); \
-               temp = bswap_16(temp); \
-               memcpy(x, &temp, 2); \
+               *(x) = bswap_16(*(x)); \
        } while (0)
 
 /* copy 32-bit value from src to dst byteswapping on the way */
diff --git a/test/misc.c b/test/misc.c
index c10a2b935bc4..3c669b6776ff 100644
--- a/test/misc.c
+++ b/test/misc.c
@@ -204,34 +204,21 @@ bswap_test(void)
     uint16_t result_16;
     uint32_t result_32;
     uint64_t result_64;
-    unsigned buffer[sizeof(test_64) + 4];
-    void *unaligned = &buffer[1];
 
     assert(bswap_16(test_16) == expect_16);
     assert(bswap_32(test_32) == expect_32);
     assert(bswap_64(test_64) == expect_64);
 
-    /* Test the swapping-in-a-pointer functions, with unaligned
-     * addresses (the functions shouldn't cause traps in that case).
-     */
-    for (int i = 0; i < 2; i++) {
-        unaligned = buffer + i;
-        if (((uintptr_t)unaligned & 1) == 1)
-            break;
-    }
-    memcpy(unaligned, &test_16, sizeof(test_16));
-    swaps((uint16_t *)unaligned);
-    memcpy(&result_16, unaligned, sizeof(result_16));
+    result_16 = test_16;
+    swaps(&result_16);
     assert(result_16 == expect_16);
 
-    memcpy(unaligned, &test_32, sizeof(test_32));
-    swapl((uint32_t *)unaligned);
-    memcpy(&result_32, unaligned, sizeof(result_32));
+    result_32 = test_32;
+    swapl(&result_32);
     assert(result_32 == expect_32);
 
-    memcpy(unaligned, &test_64, sizeof(test_64));
-    swapll((uint64_t *)unaligned);
-    memcpy(&result_64, unaligned, sizeof(result_64));
+    result_64 = test_64;
+    swapll(&result_64);
     assert(result_64 == expect_64);
 }
 
-- 
2.11.0

_______________________________________________
xorg-devel@lists.x.org: X.Org development
Archives: http://lists.x.org/archives/xorg-devel
Info: https://lists.x.org/mailman/listinfo/xorg-devel

Reply via email to