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)