From 2faa141bdb47be94da2eae6df6f08858999a5911 Mon Sep 17 00:00:00 2001 From: Lasse Collin Date: Mon, 23 Mar 2026 23:43:56 +0200 Subject: [PATCH] tuklib_integer: Fix inefficient aligned_writeXXne The __builtin_assume_aligned was applied to the wrong argument which made aligned writes worse on strict-align archs. Aligned writes aren't used in liblzma, so this bug didn't matter in this package; tuklib_integer.h is meant to be usable elsewhere too. --- src/common/tuklib_integer.h | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/src/common/tuklib_integer.h b/src/common/tuklib_integer.h index 4026249e..bbb695db 100644 --- a/src/common/tuklib_integer.h +++ b/src/common/tuklib_integer.h @@ -643,11 +643,10 @@ write64le(uint8_t *buf, uint64_t num) // // __builtin_assume_aligned is support by GCC >= 4.7 and clang >= 3.6. #ifdef HAVE___BUILTIN_ASSUME_ALIGNED -# define tuklib_memcpy_aligned(dest, src, size) \ - memcpy(dest, __builtin_assume_aligned(src, size), size) +# define tuklib_assume_aligned(ptr, align) \ + __builtin_assume_aligned(ptr, align) #else -# define tuklib_memcpy_aligned(dest, src, size) \ - memcpy(dest, src, size) +# define tuklib_assume_aligned(ptr, align) (ptr) # ifndef TUKLIB_FAST_UNALIGNED_ACCESS # define TUKLIB_USE_UNSAFE_ALIGNED_READS 1 # endif @@ -662,7 +661,7 @@ aligned_read16ne(const uint8_t *buf) return *(const uint16_t *)buf; #else uint16_t num; - tuklib_memcpy_aligned(&num, buf, sizeof(num)); + memcpy(&num, tuklib_assume_aligned(buf, sizeof(num)), sizeof(num)); return num; #endif } @@ -676,7 +675,7 @@ aligned_read32ne(const uint8_t *buf) return *(const uint32_t *)buf; #else uint32_t num; - tuklib_memcpy_aligned(&num, buf, sizeof(num)); + memcpy(&num, tuklib_assume_aligned(buf, sizeof(num)), sizeof(num)); return num; #endif } @@ -690,7 +689,7 @@ aligned_read64ne(const uint8_t *buf) return *(const uint64_t *)buf; #else uint64_t num; - tuklib_memcpy_aligned(&num, buf, sizeof(num)); + memcpy(&num, tuklib_assume_aligned(buf, sizeof(num)), sizeof(num)); return num; #endif } @@ -702,7 +701,7 @@ aligned_write16ne(uint8_t *buf, uint16_t num) #ifdef TUKLIB_USE_UNSAFE_TYPE_PUNNING *(uint16_t *)buf = num; #else - tuklib_memcpy_aligned(buf, &num, sizeof(num)); + memcpy(tuklib_assume_aligned(buf, sizeof(num)), &num, sizeof(num)); #endif return; } @@ -714,7 +713,7 @@ aligned_write32ne(uint8_t *buf, uint32_t num) #ifdef TUKLIB_USE_UNSAFE_TYPE_PUNNING *(uint32_t *)buf = num; #else - tuklib_memcpy_aligned(buf, &num, sizeof(num)); + memcpy(tuklib_assume_aligned(buf, sizeof(num)), &num, sizeof(num)); #endif return; } @@ -726,7 +725,7 @@ aligned_write64ne(uint8_t *buf, uint64_t num) #ifdef TUKLIB_USE_UNSAFE_TYPE_PUNNING *(uint64_t *)buf = num; #else - tuklib_memcpy_aligned(buf, &num, sizeof(num)); + memcpy(tuklib_assume_aligned(buf, sizeof(num)), &num, sizeof(num)); #endif return; }