[PATCH v2 16/28] x86: math: Use of __libgcc_cmp_return__ iff compiler supports it
H.J. Lu
hjl.tools@gmail.com
Tue Oct 28 19:38:40 GMT 2025
On Wed, Oct 29, 2025 at 1:13 AM Adhemerval Zanella
<adhemerval.zanella@linaro.org> wrote:
>
> clang does not support '__attribute__ ((mode (__libgcc_cmp_return__)))',
> so use a more close related type instead fo the default 'int'.
> ---
> 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 5378883060..34da4d047e 100644
> --- a/config.h.in
> +++ b/config.h.in
> @@ -317,4 +317,7 @@
> /* 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
> diff --git a/sysdeps/x86/configure b/sysdeps/x86/configure
> index 2e95277f29..ad205f6975 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 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..e0500f21b4 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],
> + 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 cbcedb8621..9ef85c4e6c 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
> +# if defined __x86_64__ && defined __ILP32__
Can you drop "&& defined __ILP32__"?
> +typedef long long int __gcc_CMPtype;
> +#else
> +typedef long int __gcc_CMPtype;
> +# endif
> +#endif
> #define CMPtype __gcc_CMPtype
>
> #ifdef __x86_64__
> --
> 2.43.0
>
--
H.J.
More information about the Libc-alpha
mailing list