]> git.ipfire.org Git - thirdparty/git.git/commitdiff
bswap.h: add support for built-in bswap functions
authorDennis Ameling <dennis@dennisameling.com>
Wed, 23 Apr 2025 08:01:43 +0000 (08:01 +0000)
committerJunio C Hamano <gitster@pobox.com>
Wed, 23 Apr 2025 15:53:04 +0000 (08:53 -0700)
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>
compat/bswap.h

index b34054f2bd72849e2844036c40f9e9dc6dc211aa..9e0f98e00b93a40ba2699038eee83025d136c3b5 100644 (file)
@@ -35,7 +35,19 @@ static inline uint64_t default_bswap64(uint64_t val)
 #undef bswap32
 #undef bswap64
 
-#if defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__))
+/**
+ * __has_builtin is available since Clang 10 and GCC 10.
+ * Below is a fallback for older compilers.
+ */
+#ifndef __has_builtin
+       #define __has_builtin(x) 0
+#endif
+
+#if __has_builtin(__builtin_bswap32) && __has_builtin(__builtin_bswap64)
+#define bswap32(x) __builtin_bswap32((x))
+#define bswap64(x) __builtin_bswap64((x))
+
+#elif defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__))
 
 #define bswap32 git_bswap32
 static inline uint32_t git_bswap32(uint32_t x)