diff options
author | Jonas Devlieghere <jonas@devlieghere.com> | 2018-02-08 11:14:11 +0000 |
---|---|---|
committer | Jonas Devlieghere <jonas@devlieghere.com> | 2018-02-08 11:14:11 +0000 |
commit | 816aba3c5898055fff6a9dffcbae7ec1e33def30 (patch) | |
tree | 7d7b5ea1beef2ddde47330d3888968044f391a6d /lib/builtins/clzdi2.c | |
parent | df07897cb7ceb186e5e1d8eabe72c23083704878 (diff) | |
download | compiler-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.c | 6 |
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 |