summaryrefslogtreecommitdiffstats
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
commit1db3ca9ab1cc4b35fb1029575ea6bd6d663c7543 (patch)
treeae0a8fd59ca541ef8384051b5df7a4cfc49a299a
parentd4034d24da4c2d89314b57a7a094d3d7e908b0bf (diff)
downloadbcm5719-llvm-1db3ca9ab1cc4b35fb1029575ea6bd6d663c7543.tar.gz
bcm5719-llvm-1db3ca9ab1cc4b35fb1029575ea6bd6d663c7543.zip
[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 llvm-svn: 324593
-rw-r--r--compiler-rt/lib/builtins/clzdi2.c6
-rw-r--r--compiler-rt/lib/builtins/ctzdi2.c6
2 files changed, 12 insertions, 0 deletions
diff --git a/compiler-rt/lib/builtins/clzdi2.c b/compiler-rt/lib/builtins/clzdi2.c
index b9e64da492b..b56d98f5c01 100644
--- a/compiler-rt/lib/builtins/clzdi2.c
+++ b/compiler-rt/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
diff --git a/compiler-rt/lib/builtins/ctzdi2.c b/compiler-rt/lib/builtins/ctzdi2.c
index db3c6fdc08f..eecde29718d 100644
--- a/compiler-rt/lib/builtins/ctzdi2.c
+++ b/compiler-rt/lib/builtins/ctzdi2.c
@@ -16,6 +16,12 @@
/* Returns: the number of trailing 0-bits */
+#if !defined(__clang__) && (defined(__sparc64__) || defined(__mips64) || defined(__riscv__))
+/* gcc resolves __builtin_ctz -> __ctzdi2 leading to infinite recursion */
+#define __builtin_ctz(a) __ctzsi2(a)
+extern si_int __ctzsi2(si_int);
+#endif
+
/* Precondition: a != 0 */
COMPILER_RT_ABI si_int
OpenPOWER on IntegriCloud