https://gcc.gnu.org/g:73a62377ae638ce85c0a40327e67b41c861fb156
commit r14-11538-g73a62377ae638ce85c0a40327e67b41c861fb156 Author: Lulu Cheng <chengl...@loongson.cn> Date: Mon Apr 7 10:00:27 2025 +0800 LoongArch: Add LoongArch architecture detection to __float128 support in libgfortran and libquadmath [PR119408]. In GCC14, LoongArch added __float128 as an alias for _Float128. In commit r15-8962, support for q/Q suffixes for 128-bit floating point numbers. This will cause the compiler to automatically link libquadmath when compiling Fortran programs. But on LoongArch `long double` is IEEE quad, so there is no need to implement libquadmath. This causes link failure. PR target/119408 libgfortran/ChangeLog: * acinclude.m4: When checking for __float128 support, determine whether the current architecture is LoongArch. If so, return false. * configure: Regenerate. libquadmath/ChangeLog: * configure.ac: When checking for __float128 support, determine whether the current architecture is LoongArch. If so, return false. * configure: Regenerate. Sigend-off-by: Xi Ruoyao <xry...@xry111.site> Sigend-off-by: Jakub Jelinek <ja...@redhat.com> (cherry picked from commit 1534f0099c98ea14c08a401302b05edf2231f411) Diff: --- libgfortran/acinclude.m4 | 4 ++++ libgfortran/configure | 8 ++++++++ libquadmath/configure | 8 ++++++++ libquadmath/configure.ac | 4 ++++ 4 files changed, 24 insertions(+) diff --git a/libgfortran/acinclude.m4 b/libgfortran/acinclude.m4 index a73207e54656..23fd621e5188 100644 --- a/libgfortran/acinclude.m4 +++ b/libgfortran/acinclude.m4 @@ -274,6 +274,10 @@ AC_DEFUN([LIBGFOR_CHECK_FLOAT128], [ AC_CACHE_CHECK([whether we have a usable _Float128 type], libgfor_cv_have_float128, [ GCC_TRY_COMPILE_OR_LINK([ + #ifdef __loongarch__ + #error On LoongArch we should use long double instead; __float128 is only for porting existing code easier. + #endif + _Float128 foo (_Float128 x) { _Complex _Float128 z1, z2; diff --git a/libgfortran/configure b/libgfortran/configure index 774dd52fc95d..16bad2924749 100755 --- a/libgfortran/configure +++ b/libgfortran/configure @@ -30288,6 +30288,10 @@ else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ + #ifdef __loongarch__ + #error On LoongArch we should use long double instead; __float128 is only for porting existing code easier. + #endif + _Float128 foo (_Float128 x) { _Complex _Float128 z1, z2; @@ -30341,6 +30345,10 @@ fi cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ + #ifdef __loongarch__ + #error On LoongArch we should use long double instead; __float128 is only for porting existing code easier. + #endif + _Float128 foo (_Float128 x) { _Complex _Float128 z1, z2; diff --git a/libquadmath/configure b/libquadmath/configure index 49d70809218c..f82dd3d0d6d4 100755 --- a/libquadmath/configure +++ b/libquadmath/configure @@ -12843,6 +12843,10 @@ else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ + #ifdef __loongarch__ + #error On LoongArch we should use long double instead; __float128 is only for porting existing code easier. + #endif + #if (!defined(_ARCH_PPC)) || defined(__LONG_DOUBLE_IEEE128__) typedef _Complex float __attribute__((mode(TC))) __complex128; #else @@ -12894,6 +12898,10 @@ fi cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ + #ifdef __loongarch__ + #error On LoongArch we should use long double instead; __float128 is only for porting existing code easier. + #endif + #if (!defined(_ARCH_PPC)) || defined(__LONG_DOUBLE_IEEE128__) typedef _Complex float __attribute__((mode(TC))) __complex128; #else diff --git a/libquadmath/configure.ac b/libquadmath/configure.ac index 349be2607c64..c64a84892191 100644 --- a/libquadmath/configure.ac +++ b/libquadmath/configure.ac @@ -233,6 +233,10 @@ AM_CONDITIONAL(LIBQUAD_USE_SYMVER_SUN, [test "x$quadmath_use_symver" = xsun]) AC_CACHE_CHECK([whether __float128 is supported], [libquad_cv_have_float128], [GCC_TRY_COMPILE_OR_LINK([ + #ifdef __loongarch__ + #error On LoongArch we should use long double instead; __float128 is only for porting existing code easier. + #endif + #if (!defined(_ARCH_PPC)) || defined(__LONG_DOUBLE_IEEE128__) typedef _Complex float __attribute__((mode(TC))) __complex128; #else