summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEdward Thomson <ethomson@edwardthomson.com>2020-12-18 17:57:46 +0000
committerGitHub <noreply@github.com>2020-12-18 17:57:46 +0000
commitc76e9f22912e3b987a4e4590eb386477ae114f85 (patch)
tree21bf622dfbb1727bb970be79a7306fdf07a7e44c
parentbe85c7e8e5510b5b4f7930e0f8b0b0238b297947 (diff)
parent7f8ae01913e408bf219ab41036bd68265596c917 (diff)
downloadlibgit2-c76e9f22912e3b987a4e4590eb386477ae114f85.tar.gz
Merge pull request #5742 from lhchavez/fix-clang-32-bit-build
Avoid using `__builtin_mul_overflow` with the clang+32-bit combo
-rw-r--r--src/integer.h13
1 files changed, 10 insertions, 3 deletions
diff --git a/src/integer.h b/src/integer.h
index 026a1fac0..28122a99f 100644
--- a/src/integer.h
+++ b/src/integer.h
@@ -79,8 +79,12 @@ GIT_INLINE(int) git__is_int(long long p)
# define git__add_int64_overflow(out, one, two) \
__builtin_add_overflow(one, two, out)
-# define git__multiply_int64_overflow(out, one, two) \
- __builtin_mul_overflow(one, two, out)
+
+/* clang on 32-bit systems produces an undefined reference to `__mulodi4`. */
+# if !defined(__clang__) || !defined(GIT_ARCH_32)
+# define git__multiply_int64_overflow(out, one, two) \
+ __builtin_mul_overflow(one, two, out)
+# endif
/* Use Microsoft's safe integer handling functions where available */
#elif defined(_MSC_VER)
@@ -156,6 +160,10 @@ GIT_INLINE(bool) git__add_int64_overflow(int64_t *out, int64_t one, int64_t two)
return false;
}
+#endif
+
+/* If we could not provide an intrinsic implementation for this, provide a (slow) fallback. */
+#if !defined(git__multiply_int64_overflow)
GIT_INLINE(bool) git__multiply_int64_overflow(int64_t *out, int64_t one, int64_t two)
{
if ((one == -1 && two == INT_MIN) ||
@@ -166,7 +174,6 @@ GIT_INLINE(bool) git__multiply_int64_overflow(int64_t *out, int64_t one, int64_t
*out = one * two;
return false;
}
-
#endif
#endif