work around regression building for armhf with clang (compiler bug)
authorRich Felker <dalias@aerifal.cx>
Fri, 19 Feb 2016 01:20:07 +0000 (01:20 +0000)
committerRich Felker <dalias@aerifal.cx>
Fri, 19 Feb 2016 01:20:07 +0000 (01:20 +0000)
commit e4355bd6bec89688e8c739cd7b4c76e675643dca moved the math asm
from external source files to inline asm, but unfortunately, all
current releases of clang use the wrong inline asm constraint codes
for float and double ("w" and "P" instead of "t" and "w",
respectively). this patch adds detection for the bug in configure,
and, for now, just disables the affected asm on broken clang versions.

configure
src/math/arm/fabsf.c
src/math/arm/sqrtf.c

index 0e36585647f942274db9795b4872f7e26a92a4ad..5a92ea012d32aa88eeff241e00cdd3f21e01af98 100755 (executable)
--- a/configure
+++ b/configure
@@ -588,6 +588,20 @@ fi
 if test "$ARCH" = "arm" ; then
 trycppif __ARMEB__ "$t" && SUBARCH=${SUBARCH}eb
 trycppif __ARM_PCS_VFP "$t" && SUBARCH=${SUBARCH}hf
+# Versions of clang up until at least 3.8 have the wrong constraint codes
+# for floating point operands to inline asm. Detect this so the affected
+# source files can just disable the asm.
+if test "$cc_family" = clang ; then
+printf "checking whether clang's vfp asm constraints work... "
+echo 'float f(float x) { __asm__("":"+t"(x)); return x; }' > "$tmpc"
+if $CC $CFLAGS_C99FSE $CPPFLAGS $CFLAGS -c -o /dev/null "$tmpc" >/dev/null 2>&1 ; then
+printf "yes\n"
+else
+printf "no\n"
+CFLAGS_AUTO="$CFLAGS_AUTO -DBROKEN_VFP_ASM"
+CFLAGS_AUTO="${CFLAGS_AUTO# }"
+fi
+fi
 fi
 
 if test "$ARCH" = "aarch64" ; then
index 28153a61e01ade8524c5109d907e9430cd3ae36a..4a217c98899d579831ba7d0e32036568fd09171e 100644 (file)
@@ -1,6 +1,6 @@
 #include <math.h>
 
-#if __ARM_PCS_VFP
+#if __ARM_PCS_VFP && !BROKEN_VFP_ASM
 
 float fabsf(float x)
 {
index 98858ecd7901d49452ac6500605a608790f8b78e..32693293b49b777667923a5008bbb2145ddd930d 100644 (file)
@@ -1,6 +1,6 @@
 #include <math.h>
 
-#if __ARM_PCS_VFP || (__VFP_FP__ && !__SOFTFP__)
+#if (__ARM_PCS_VFP || (__VFP_FP__ && !__SOFTFP__)) && !BROKEN_VFP_ASM
 
 float sqrtf(float x)
 {