From 930993921f2f381b545ea1b1f2d9c534b2b72b08 Mon Sep 17 00:00:00 2001 From: caiyinyu Date: Mon, 22 Aug 2022 16:00:51 +0800 Subject: LoongArch: Add soft float support. --- sysdeps/unix/sysv/linux/loongarch/Makefile | 9 ++++ sysdeps/unix/sysv/linux/loongarch/configure | 51 +++++++++++++++++++++-- sysdeps/unix/sysv/linux/loongarch/configure.ac | 22 ++++++++-- sysdeps/unix/sysv/linux/loongarch/ldd-rewrite.sed | 2 +- sysdeps/unix/sysv/linux/loongarch/shlib-versions | 2 + 5 files changed, 79 insertions(+), 7 deletions(-) (limited to 'sysdeps/unix/sysv') diff --git a/sysdeps/unix/sysv/linux/loongarch/Makefile b/sysdeps/unix/sysv/linux/loongarch/Makefile index 91bd35800a..c84a1762ed 100644 --- a/sysdeps/unix/sysv/linux/loongarch/Makefile +++ b/sysdeps/unix/sysv/linux/loongarch/Makefile @@ -1,3 +1,12 @@ ifeq ($(subdir),stdlib) gen-as-const-headers += ucontext_i.sym endif + +abi-variants := lp64s lp64d + +ifeq (,$(filter $(default-abi),$(abi-variants))) +$(error Unknown ABI $(default-abi), must be one of $(abi-variants)) +endif + +abi-lp64s-condition := __WORDSIZE == 64 && defined __loongarch_soft_float +abi-lp64d-condition := __WORDSIZE == 64 && defined __loongarch_double_float diff --git a/sysdeps/unix/sysv/linux/loongarch/configure b/sysdeps/unix/sysv/linux/loongarch/configure index 60a410303e..28216c165e 100644 --- a/sysdeps/unix/sysv/linux/loongarch/configure +++ b/sysdeps/unix/sysv/linux/loongarch/configure @@ -151,11 +151,56 @@ if test $libc_cv_loongarch_int_abi = no; then as_fn_error $? "Unable to determine integer ABI" "$LINENO" 5 fi +libc_cv_loongarch_float_abi=no +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef __loongarch_double_float + yes + #endif + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "yes" >/dev/null 2>&1; then : + libc_cv_loongarch_float_abi=d +fi +rm -f conftest* + +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef __loongarch_soft_float + yes + #endif + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "yes" >/dev/null 2>&1; then : + libc_cv_loongarch_float_abi=s +fi +rm -f conftest* + +if test "$libc_cv_loongarch_float_abi" = no; then + as_fn_error $? "Unable to determine floating-point ABI" "$LINENO" 5 +fi + config_vars="$config_vars -default-abi = $libc_cv_loongarch_int_abi" +default-abi = $libc_cv_loongarch_int_abi$libc_cv_loongarch_float_abi" -case $libc_cv_loongarch_int_abi in -lp64) +case $libc_cv_loongarch_int_abi$libc_cv_loongarch_float_abi in +lp64s) + test -n "$libc_cv_slibdir" || +case "$prefix" in +/usr | /usr/) + libc_cv_slibdir='/lib64/sf' + libc_cv_rtlddir='/lib64' + if test "$libdir" = '${exec_prefix}/lib'; then + libdir='${exec_prefix}/lib64/sf'; + # Locale data can be shared between 32-bit and 64-bit libraries. + libc_cv_complocaledir='${exec_prefix}/lib/locale' + fi + ;; +esac + ;; +lp64d) test -n "$libc_cv_slibdir" || case "$prefix" in /usr | /usr/) diff --git a/sysdeps/unix/sysv/linux/loongarch/configure.ac b/sysdeps/unix/sysv/linux/loongarch/configure.ac index 7de1e95ff6..04e9150a9b 100644 --- a/sysdeps/unix/sysv/linux/loongarch/configure.ac +++ b/sysdeps/unix/sysv/linux/loongarch/configure.ac @@ -11,10 +11,26 @@ if test $libc_cv_loongarch_int_abi = no; then AC_MSG_ERROR([Unable to determine integer ABI]) fi -LIBC_CONFIG_VAR([default-abi], [$libc_cv_loongarch_int_abi]) +libc_cv_loongarch_float_abi=no +AC_EGREP_CPP(yes, [#ifdef __loongarch_double_float + yes + #endif + ],libc_cv_loongarch_float_abi=d) +AC_EGREP_CPP(yes, [#ifdef __loongarch_soft_float + yes + #endif + ],libc_cv_loongarch_float_abi=s) +if test "$libc_cv_loongarch_float_abi" = no; then + AC_MSG_ERROR([Unable to determine floating-point ABI]) +fi + +LIBC_CONFIG_VAR([default-abi], [$libc_cv_loongarch_int_abi$libc_cv_loongarch_float_abi]) -case $libc_cv_loongarch_int_abi in -lp64) +case $libc_cv_loongarch_int_abi$libc_cv_loongarch_float_abi in +lp64s) + LIBC_SLIBDIR_RTLDDIR([lib64/sf], [lib64]) + ;; +lp64d) LIBC_SLIBDIR_RTLDDIR([lib64], [lib64]) ;; esac diff --git a/sysdeps/unix/sysv/linux/loongarch/ldd-rewrite.sed b/sysdeps/unix/sysv/linux/loongarch/ldd-rewrite.sed index f8976fd239..cdbe5c3dc5 100644 --- a/sysdeps/unix/sysv/linux/loongarch/ldd-rewrite.sed +++ b/sysdeps/unix/sysv/linux/loongarch/ldd-rewrite.sed @@ -1 +1 @@ -s_^\(RTLDLIST=\)\(.*lib\)\(\|64\|32\)\(/[^/]*\)\(-loongarch\)\(64\|32\)\(\.so\.[0-9.]*\)[[:blank:]]*$_\1"\2\4\7 \264\4-loongarch64\7 \232\4-loongarch32\7"_ +s_^\(RTLDLIST=\)\(.*lib\)\(\|64\|32\)\(/ld-linux-loongarch-\)\(lp\|ilp\)\(64\|32\)\(d\|s\)\(\.so\.[0-9.]*\)[[:blank:]]*$_\1"\264\4lp64d\8 \264\4lp64s\8"_ diff --git a/sysdeps/unix/sysv/linux/loongarch/shlib-versions b/sysdeps/unix/sysv/linux/loongarch/shlib-versions index dc2220b4be..5f40e7f5ec 100644 --- a/sysdeps/unix/sysv/linux/loongarch/shlib-versions +++ b/sysdeps/unix/sysv/linux/loongarch/shlib-versions @@ -2,6 +2,8 @@ DEFAULT GLIBC_2.36 %if LOONGARCH_ABI_GRLEN == 64 && LOONGARCH_ABI_FRLEN == 64 ld=ld-linux-loongarch-lp64d.so.1 +%elif LOONGARCH_ABI_GRLEN == 64 && LOONGARCH_ABI_FRLEN == 0 +ld=ld-linux-loongarch-lp64s.so.1 %else %error cannot determine ABI %endif -- cgit 1.4.1