about summary refs log tree commit diff
path: root/sysdeps/unix/sysv/linux/loongarch
diff options
context:
space:
mode:
authorcaiyinyu <caiyinyu@loongson.cn>2022-08-22 16:00:51 +0800
committercaiyinyu <caiyinyu@loongson.cn>2022-09-01 09:10:08 +0800
commit930993921f2f381b545ea1b1f2d9c534b2b72b08 (patch)
tree1015c0f98c4232af277f7dc56286c5dbc1b652b6 /sysdeps/unix/sysv/linux/loongarch
parent1e903124cec4492463d075c6c061a2a772db77bf (diff)
downloadglibc-930993921f2f381b545ea1b1f2d9c534b2b72b08.tar.gz
glibc-930993921f2f381b545ea1b1f2d9c534b2b72b08.tar.xz
glibc-930993921f2f381b545ea1b1f2d9c534b2b72b08.zip
LoongArch: Add soft float support.
Diffstat (limited to 'sysdeps/unix/sysv/linux/loongarch')
-rw-r--r--sysdeps/unix/sysv/linux/loongarch/Makefile9
-rw-r--r--sysdeps/unix/sysv/linux/loongarch/configure51
-rw-r--r--sysdeps/unix/sysv/linux/loongarch/configure.ac22
-rw-r--r--sysdeps/unix/sysv/linux/loongarch/ldd-rewrite.sed2
-rw-r--r--sysdeps/unix/sysv/linux/loongarch/shlib-versions2
5 files changed, 79 insertions, 7 deletions
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