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'.
This commit is contained in:
Adhemerval Zanella 2025-10-31 17:00:44 -03:00
parent bd6b49e11d
commit d25db12c2a
4 changed files with 69 additions and 1 deletions

View File

@ -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

39
sysdeps/x86/configure vendored
View 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 -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

View 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 -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

View 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
# ifdef __x86_64__
typedef long long int __gcc_CMPtype;
#else
typedef long int __gcc_CMPtype;
# endif
#endif
#define CMPtype __gcc_CMPtype
#ifdef __x86_64__