[glibc] x86: math: Use of __libgcc_cmp_return__ iff compiler supports it
Adhemerval Zanella
azanella@sourceware.org
Mon Nov 10 12:03:57 GMT 2025
https://sourceware.org/git/gitweb.cgi?p=glibc.git;h=d25db12c2aafc5a05cf4deda4154f7a4cd357c21
commit d25db12c2aafc5a05cf4deda4154f7a4cd357c21
Author: Adhemerval Zanella <adhemerval.zanella@linaro.org>
Date: Fri Oct 31 17:00:44 2025 -0300
x86: math: Use of __libgcc_cmp_return__ iff compiler supports it
clang does not support '__attribute__ ((mode (__libgcc_cmp_return__)))',
so use a more close related type instead fo the default 'int'.
Diff:
---
config.h.in | 3 +++
sysdeps/x86/configure | 39 +++++++++++++++++++++++++++++++++++++++
sysdeps/x86/configure.ac | 18 ++++++++++++++++++
sysdeps/x86/fpu/sfp-machine.h | 10 +++++++++-
4 files changed, 69 insertions(+), 1 deletion(-)
diff --git a/config.h.in b/config.h.in
index 5fea143d69..4204dbf123 100644
--- a/config.h.in
+++ b/config.h.in
@@ -323,4 +323,7 @@
/* Define if compiler allows add attribute after function declaration. */
#undef ATTR_AFTER_FUNC_DECL
+/* Define if compiler suport __attribute__ ((mode (__libgcc_cmp_return__))). */
+#undef HAVE_X86_LIBGCC_CMP_RETURN_ATTR
+
#endif
diff --git a/sysdeps/x86/configure b/sysdeps/x86/configure
index 2e95277f29..e530a18f54 100644
--- a/sysdeps/x86/configure
+++ b/sysdeps/x86/configure
@@ -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 -c 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
diff --git a/sysdeps/x86/configure.ac b/sysdeps/x86/configure.ac
index f3888e6618..c440b6bf5c 100644
--- a/sysdeps/x86/configure.ac
+++ b/sysdeps/x86/configure.ac
@@ -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 -c],
+ 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
diff --git a/sysdeps/x86/fpu/sfp-machine.h b/sysdeps/x86/fpu/sfp-machine.h
index 5892f4f5fe..002fdb54dd 100644
--- a/sysdeps/x86/fpu/sfp-machine.h
+++ b/sysdeps/x86/fpu/sfp-machine.h
@@ -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
+# ifdef __x86_64__
+typedef long long int __gcc_CMPtype;
+#else
+typedef long int __gcc_CMPtype;
+# endif
+#endif
#define CMPtype __gcc_CMPtype
#ifdef __x86_64__
More information about the Glibc-cvs
mailing list