summaryrefslogtreecommitdiff
path: root/lib/builtins/clzdi2.c
diff options
context:
space:
mode:
authorJonas Devlieghere <jonas@devlieghere.com>2018-02-08 11:14:11 +0000
committerJonas Devlieghere <jonas@devlieghere.com>2018-02-08 11:14:11 +0000
commit816aba3c5898055fff6a9dffcbae7ec1e33def30 (patch)
tree7d7b5ea1beef2ddde47330d3888968044f391a6d /lib/builtins/clzdi2.c
parentdf07897cb7ceb186e5e1d8eabe72c23083704878 (diff)
downloadcompiler-rt-816aba3c5898055fff6a9dffcbae7ec1e33def30.tar.gz
[builtins] Workaround for infinite recursion in c?zdi2
gcc resolves `__builtin_c?z` to `__c?zdi2` which leads to infinite recursion. This problem has been observed for sparc64, mips64 and riscv. Presumably this happens whenever an arch without dedicated bit counting instructions is targeted. This patch provides a workaround. Differential revision: https://reviews.llvm.org/D42902 git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@324593 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/builtins/clzdi2.c')
-rw-r--r--lib/builtins/clzdi2.c6
1 files changed, 6 insertions, 0 deletions
diff --git a/lib/builtins/clzdi2.c b/lib/builtins/clzdi2.c
index b9e64da49..b56d98f5c 100644
--- a/lib/builtins/clzdi2.c
+++ b/lib/builtins/clzdi2.c
@@ -16,6 +16,12 @@
/* Returns: the number of leading 0-bits */
+#if !defined(__clang__) && (defined(__sparc64__) || defined(__mips64) || defined(__riscv__))
+/* gcc resolves __builtin_clz -> __clzdi2 leading to infinite recursion */
+#define __builtin_clz(a) __clzsi2(a)
+extern si_int __clzsi2(si_int);
+#endif
+
/* Precondition: a != 0 */
COMPILER_RT_ABI si_int