]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
x86: math: Use of __libgcc_cmp_return__ iff compiler supports it
authorAdhemerval Zanella <adhemerval.zanella@linaro.org>
Thu, 10 Mar 2022 17:41:31 +0000 (14:41 -0300)
committerAdhemerval Zanella <adhemerval.zanella@linaro.org>
Tue, 28 Oct 2025 16:36:29 +0000 (13:36 -0300)
clang does not support '__attribute__ ((mode (__libgcc_cmp_return__)))',
so use a more close related type instead fo the default 'int'.

config.h.in
sysdeps/x86/configure
sysdeps/x86/configure.ac
sysdeps/x86/fpu/sfp-machine.h

index 53788830606e181985bda823b2bece1223ea12e8..34da4d047e42d95bf761f82e8578f2f4754b8f52 100644 (file)
 /* Define if trunc is inlined on x86.  */
 #undef HAVE_X86_INLINE_TRUNC
 
+/* Define if compiler suport __attribute__ ((mode (__libgcc_cmp_return__))).  */
+#undef HAVE_X86_LIBGCC_CMP_RETURN_ATTR
+
 #endif
index 2e95277f29efb71e76bb9b13124d8e9c7896a54b..ad205f69751dd84cc933b28c789ec8afaae545e3 100644 (file)
@@ -392,6 +392,45 @@ else
 
 fi
 
+
+conftest_code="
+int __gcc_CMPtype_GCC __attribute__ ((mode (__libgcc_cmp_return__)));
+"
+
+cat > conftest.c <<EOF
+$conftest_code
+EOF
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for __libgcc_cmp_return__ mode attribute support" >&5
+printf %s "checking for __libgcc_cmp_return__ mode attribute support... " >&6; }
+if test ${libc_cv_cc_x86_libgcc_cmp_return_attribute+y}
+then :
+  printf %s "(cached) " >&6
+else case e in #(
+  e)   if { ac_try='${CC-cc} $CFLAGS $CPPFLAGS $CFLAGS conftest.c -o conftest 1>&5'
+  { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; }
+  then
+    libc_cv_cc_x86_libgcc_cmp_return_attribute=yes
+  else
+    libc_cv_cc_x86_libgcc_cmp_return_attribute=no
+  fi ;;
+esac
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $libc_cv_cc_x86_libgcc_cmp_return_attribute" >&5
+printf "%s\n" "$libc_cv_cc_x86_libgcc_cmp_return_attribute" >&6; }
+rm -f conftest*
+if test "$libc_cv_cc_x86_libgcc_cmp_return_attribute" = yes; then
+  printf "%s\n" "#define HAVE_X86_LIBGCC_CMP_RETURN_ATTR 1" >>confdefs.h
+
+else
+  printf "%s\n" "#define HAVE_X86_LIBGCC_CMP_RETURN_ATTR 0" >>confdefs.h
+
+fi
+
+
 if test "${libc_cv_cc_no_direct_extern_access}${libc_cv_test_cc_cflags_no_direct_extern_access}" = yes; then
   libc_cv_protected_data=no
 fi
index f3888e6618b60d7a89d8c351a3b182aaedc737b0..e0500f21b4e9de71aeac16ad57322db350d969ce 100644 (file)
@@ -223,6 +223,24 @@ else
   AC_DEFINE(HAVE_X86_INLINE_TRUNC, 0)
 fi
 
+
+conftest_code="
+int __gcc_CMPtype_GCC __attribute__ ((mode (__libgcc_cmp_return__)));
+"
+dnl Check if CC support the __libgcc_cmp_return__ mode attribute
+LIBC_TRY_CC_COMMAND([for __libgcc_cmp_return__ mode attribute support],
+  [$conftest_code],
+  [$CFLAGS],
+  libc_cv_cc_x86_libgcc_cmp_return_attribute,
+  [libc_cv_cc_x86_libgcc_cmp_return_attribute=yes],
+  [libc_cv_cc_x86_libgcc_cmp_return_attribute=no])
+if test "$libc_cv_cc_x86_libgcc_cmp_return_attribute" = yes; then
+  AC_DEFINE(HAVE_X86_LIBGCC_CMP_RETURN_ATTR, 1)
+else
+  AC_DEFINE(HAVE_X86_LIBGCC_CMP_RETURN_ATTR, 0)
+fi
+
+
 dnl If the building compiler enables no direct external data access by
 dnl default, access to protected data in shared libraries from executables
 dnl must be compiled with no direct external data access.  If the testing
index cbcedb8621e7f023e335f5b57eac4c527c2102a6..9ef85c4e6c270d92a7def89c131d9948a7cacfb9 100644 (file)
@@ -1,9 +1,17 @@
 /* Configure soft-fp for building sqrtf128.  Based on sfp-machine.h in
    libgcc, with soft-float and other irrelevant parts removed.  */
 
+#if HAVE_X86_LIBGCC_CMP_RETURN_ATTR
 /* The type of the result of a floating point comparison.  This must
    match `__libgcc_cmp_return__' in GCC for the target.  */
-typedef int __gcc_CMPtype __attribute__ ((mode (__libgcc_cmp_return__)));
+typedef int __gcc_CMPtype_GCC __attribute__ ((mode (__libgcc_cmp_return__)));
+#else
+# if defined __x86_64__ && defined __ILP32__
+typedef long long int __gcc_CMPtype;
+#else
+typedef long int __gcc_CMPtype;
+# endif
+#endif
 #define CMPtype __gcc_CMPtype
 
 #ifdef __x86_64__