bswap.h: add support for built-in bswap functions

Newer compiler versions, like GCC 10 and Clang 12, have built-in functions for bswap32 and bswap64. This comes in handy, for example, when targeting CLANGARM64 on Windows, which would not be supported without this logic. Signed-off-by: Dennis Ameling <dennis@dennisameling.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Dennis Ameling committed Apr 23, 2025 at 08:01 UTC 6547d1c9cbafaa5f3e650ccdedd8809e88987011
1 file changed +13 -1
compat/bswap.h
+13 -1
@@ -35,7 +35,19 @@ static inline uint64_t default_bswap64(uint64_t val)
35 #undef bswap32
36 #undef bswap64
37
38 -#if defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__))
38 +/**
39 + * __has_builtin is available since Clang 10 and GCC 10.
40 + * Below is a fallback for older compilers.
41 + */
42 +#ifndef __has_builtin
43 + #define __has_builtin(x) 0
44 +#endif
45 +
46 +#if __has_builtin(__builtin_bswap32) && __has_builtin(__builtin_bswap64)
47 +#define bswap32(x) __builtin_bswap32((x))
48 +#define bswap64(x) __builtin_bswap64((x))
49 +
50 +#elif defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__))
51
52 #define bswap32 git_bswap32
53 static inline uint32_t git_bswap32(uint32_t x)