[llvm-commits] [Patch] Unbreak compiler-rt on FreeBSD/sparc64 and FreeBSD/mips64

Ed Schouten ed at 80386.nl
Sat Dec 31 04:55:19 PST 2011


Hello all,

On FreeBSD/sparc64 and FreeBSD/mips64, compiler-rt runs into endless
recursion when using __clzdi2() or __ctzdi2(), as described in bug
#11663. This is due to the fact that __builtin_c?z() emit function calls
to __c?zdi2() instead of __c?zsi2(). The following (evil) workaround
fixes it for us.

I'd rather not have too many local changes to our version of
compiler-rt, so would it be possible to get this fix upstreamed?

Index: lib/int_lib.h
===================================================================
--- lib/int_lib.h	(revision 229003)
+++ lib/int_lib.h	(working copy)
@@ -153,4 +153,23 @@
     long double f;
 } long_double_bits;
 
+/*
+ * Workaround for LLVM bug 11663.  Prevent endless recursion in
+ * __c?zdi2(), where calls to __builtin_c?z() are expanded to
+ * __c?zdi2() instead of __c?zsi2().
+ *
+ * Instead of placing this workaround in c?zdi2.c, put it in this
+ * global header to prevent other C files from making the detour
+ * through __c?zdi2() as well.
+ *
+ * This problem has only been observed on FreeBSD for sparc64 and
+ * mips64 with GCC 4.2.1.
+ */
+#if defined(__FreeBSD__) && (defined(__sparc64__) || defined(__mips_n64))
+si_int __clzsi2(si_int);
+si_int __ctzsi2(si_int);
+#define	__builtin_clz	__clzsi2
+#define	__builtin_ctz	__ctzsi2
+#endif
+
 #endif /* INT_LIB_H */

Thanks,
-- 
 Ed Schouten <ed at 80386.nl>
 WWW: http://80386.nl/
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 834 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20111231/75d81f8e/attachment.sig>


More information about the llvm-commits mailing list