[v3,15/19] RISC-V: Build Infastructure for 32-bit

Message ID 3bc3074d7ae29928b90efd584f018cc9da3b42db.1594568655.git.alistair.francis@wdc.com
State Committed
Headers
Series glibc port for 32-bit RISC-V (RV32) |

Commit Message

Alistair Francis July 12, 2020, 3:48 p.m. UTC
  From: Zong Li <zongbox@gmail.com>

This patch lays out the top-level orginazition of the RISC-V 32-bit port. It
contains all the Implies files as well as various other fragments of
build infastructure for the RISC-V 32-bit port.
---
 sysdeps/riscv/preconfigure                   |  6 +--
 sysdeps/riscv/rv32/Implies-after             |  1 +
 sysdeps/riscv/rv32/rvd/Implies               |  3 ++
 sysdeps/riscv/rv32/rvf/Implies               |  1 +
 sysdeps/unix/sysv/linux/riscv/Makefile       |  4 +-
 sysdeps/unix/sysv/linux/riscv/configure      | 39 ++++++++++++++++++++
 sysdeps/unix/sysv/linux/riscv/configure.ac   |  8 ++++
 sysdeps/unix/sysv/linux/riscv/rv32/Implies   |  3 ++
 sysdeps/unix/sysv/linux/riscv/shlib-versions | 10 ++++-
 9 files changed, 67 insertions(+), 8 deletions(-)
 create mode 100644 sysdeps/riscv/rv32/Implies-after
 create mode 100644 sysdeps/riscv/rv32/rvd/Implies
 create mode 100644 sysdeps/riscv/rv32/rvf/Implies
 create mode 100644 sysdeps/unix/sysv/linux/riscv/rv32/Implies
  

Comments

Maciej W. Rozycki July 14, 2020, 11:55 p.m. UTC | #1
Hi Alistair,

 The heading uses odd capitalisation and wording, how about:

RISC-V: Build infastructure for 32-bit port

?

On Sun, 12 Jul 2020, Alistair Francis via Libc-alpha wrote:

> This patch lays out the top-level orginazition of the RISC-V 32-bit port. It
> contains all the Implies files as well as various other fragments of
> build infastructure for the RISC-V 32-bit port.

 How about:

This patch lays out the top-level organization of the RISC-V 32-bit port.  
It provides all the Implies files as well as various other fragments of 
the build infastructure.

?  [Oh, I can see where it all has been copied and pasted from.]

> diff --git a/sysdeps/unix/sysv/linux/riscv/Makefile b/sysdeps/unix/sysv/linux/riscv/Makefile
> index 301b082398..6c11f7fd9a 100644
> --- a/sysdeps/unix/sysv/linux/riscv/Makefile
> +++ b/sysdeps/unix/sysv/linux/riscv/Makefile
> @@ -7,11 +7,13 @@ ifeq ($(subdir),stdlib)
>  gen-as-const-headers += ucontext_i.sym
>  endif
>  
> -abi-variants := lp64 lp64d
> +abi-variants := ilp32 ilp32d lp64 lp64d
>  
>  ifeq (,$(filter $(default-abi),$(abi-variants)))
>  $(error Unknown ABI $(default-abi), must be one of $(abi-variants))
>  endif
>  
> +abi-ilp32-condition   := !defined __LP64__ && defined __riscv_float_abi_soft
> +abi-ilp32d-condition  := !defined __LP64__ && defined __riscv_float_abi_double
>  abi-lp64-condition    := defined __LP64__ && defined __riscv_float_abi_soft
>  abi-lp64d-condition   := defined __LP64__ && defined __riscv_float_abi_double

 I feel like these all ought to use __WORDSIZE so as to be consistent, 
also with the majority of other ports, and inclusive for RV32 rather than 
exclusive.  That if FAOD:

abi-ilp32-condition   := __WORDSIZE == 32 && defined __riscv_float_abi_soft
abi-ilp32d-condition  := __WORDSIZE == 32 && defined __riscv_float_abi_double
abi-lp64-condition    := __WORDSIZE == 64 && defined __riscv_float_abi_soft
abi-lp64d-condition   := __WORDSIZE == 64 && defined __riscv_float_abi_double

This way the ABI condition is tied to a property that we can reasonably 
expect is not going to ever change and won't have to be adjusted if we add 
support for say RV128 sometime.  Let me know if you disagree.

 Otherwise OK.

  Maciej
  
Alistair Francis Aug. 10, 2020, 3:45 p.m. UTC | #2
On Tue, Jul 14, 2020 at 4:55 PM Maciej W. Rozycki via Libc-alpha
<libc-alpha@sourceware.org> wrote:
>
> Hi Alistair,
>
>  The heading uses odd capitalisation and wording, how about:
>
> RISC-V: Build infastructure for 32-bit port
>
> ?
>
> On Sun, 12 Jul 2020, Alistair Francis via Libc-alpha wrote:
>
> > This patch lays out the top-level orginazition of the RISC-V 32-bit port. It
> > contains all the Implies files as well as various other fragments of
> > build infastructure for the RISC-V 32-bit port.
>
>  How about:
>
> This patch lays out the top-level organization of the RISC-V 32-bit port.
> It provides all the Implies files as well as various other fragments of
> the build infastructure.

Fixed.

>
> ?  [Oh, I can see where it all has been copied and pasted from.]
>
> > diff --git a/sysdeps/unix/sysv/linux/riscv/Makefile b/sysdeps/unix/sysv/linux/riscv/Makefile
> > index 301b082398..6c11f7fd9a 100644
> > --- a/sysdeps/unix/sysv/linux/riscv/Makefile
> > +++ b/sysdeps/unix/sysv/linux/riscv/Makefile
> > @@ -7,11 +7,13 @@ ifeq ($(subdir),stdlib)
> >  gen-as-const-headers += ucontext_i.sym
> >  endif
> >
> > -abi-variants := lp64 lp64d
> > +abi-variants := ilp32 ilp32d lp64 lp64d
> >
> >  ifeq (,$(filter $(default-abi),$(abi-variants)))
> >  $(error Unknown ABI $(default-abi), must be one of $(abi-variants))
> >  endif
> >
> > +abi-ilp32-condition   := !defined __LP64__ && defined __riscv_float_abi_soft
> > +abi-ilp32d-condition  := !defined __LP64__ && defined __riscv_float_abi_double
> >  abi-lp64-condition    := defined __LP64__ && defined __riscv_float_abi_soft
> >  abi-lp64d-condition   := defined __LP64__ && defined __riscv_float_abi_double
>
>  I feel like these all ought to use __WORDSIZE so as to be consistent,
> also with the majority of other ports, and inclusive for RV32 rather than
> exclusive.  That if FAOD:
>
> abi-ilp32-condition   := __WORDSIZE == 32 && defined __riscv_float_abi_soft
> abi-ilp32d-condition  := __WORDSIZE == 32 && defined __riscv_float_abi_double
> abi-lp64-condition    := __WORDSIZE == 64 && defined __riscv_float_abi_soft
> abi-lp64d-condition   := __WORDSIZE == 64 && defined __riscv_float_abi_double
>
> This way the ABI condition is tied to a property that we can reasonably
> expect is not going to ever change and won't have to be adjusted if we add
> support for say RV128 sometime.  Let me know if you disagree.

Fixed

Alistair

>
>  Otherwise OK.
>
>   Maciej
  

Patch

diff --git a/sysdeps/riscv/preconfigure b/sysdeps/riscv/preconfigure
index d9adb31b64..1ab5d20f0e 100644
--- a/sysdeps/riscv/preconfigure
+++ b/sysdeps/riscv/preconfigure
@@ -6,11 +6,7 @@  riscv*)
     atomic=`$CC $CFLAGS $CPPFLAGS -E -dM -xc /dev/null | grep '#define __riscv_atomic' | cut -d' ' -f2`
 
     case "$xlen" in
-    32)
-	echo "glibc does not yet support 32-bit systems" >&2
-	exit 1
-	;;
-    64)
+    64 | 32)
 	;;
     *)
 	echo "Unable to determine XLEN" >&2
diff --git a/sysdeps/riscv/rv32/Implies-after b/sysdeps/riscv/rv32/Implies-after
new file mode 100644
index 0000000000..39a34c5f57
--- /dev/null
+++ b/sysdeps/riscv/rv32/Implies-after
@@ -0,0 +1 @@ 
+wordsize-32
diff --git a/sysdeps/riscv/rv32/rvd/Implies b/sysdeps/riscv/rv32/rvd/Implies
new file mode 100644
index 0000000000..1151214e8f
--- /dev/null
+++ b/sysdeps/riscv/rv32/rvd/Implies
@@ -0,0 +1,3 @@ 
+riscv/rv32/rvf
+riscv/rvd
+riscv/rvf
diff --git a/sysdeps/riscv/rv32/rvf/Implies b/sysdeps/riscv/rv32/rvf/Implies
new file mode 100644
index 0000000000..66c401443b
--- /dev/null
+++ b/sysdeps/riscv/rv32/rvf/Implies
@@ -0,0 +1 @@ 
+riscv/rvf
diff --git a/sysdeps/unix/sysv/linux/riscv/Makefile b/sysdeps/unix/sysv/linux/riscv/Makefile
index 301b082398..6c11f7fd9a 100644
--- a/sysdeps/unix/sysv/linux/riscv/Makefile
+++ b/sysdeps/unix/sysv/linux/riscv/Makefile
@@ -7,11 +7,13 @@  ifeq ($(subdir),stdlib)
 gen-as-const-headers += ucontext_i.sym
 endif
 
-abi-variants := lp64 lp64d
+abi-variants := ilp32 ilp32d lp64 lp64d
 
 ifeq (,$(filter $(default-abi),$(abi-variants)))
 $(error Unknown ABI $(default-abi), must be one of $(abi-variants))
 endif
 
+abi-ilp32-condition   := !defined __LP64__ && defined __riscv_float_abi_soft
+abi-ilp32d-condition  := !defined __LP64__ && defined __riscv_float_abi_double
 abi-lp64-condition    := defined __LP64__ && defined __riscv_float_abi_soft
 abi-lp64d-condition   := defined __LP64__ && defined __riscv_float_abi_double
diff --git a/sysdeps/unix/sysv/linux/riscv/configure b/sysdeps/unix/sysv/linux/riscv/configure
index 3018ca8f1b..2b3c77f18c 100755
--- a/sysdeps/unix/sysv/linux/riscv/configure
+++ b/sysdeps/unix/sysv/linux/riscv/configure
@@ -147,6 +147,17 @@  if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
 fi
 rm -f conftest*
 
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+__SIZEOF_INT__ __SIZEOF_LONG__ __SIZEOF_POINTER__
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "4 4 4" >/dev/null 2>&1; then :
+  libc_cv_riscv_int_abi=ilp32
+fi
+rm -f conftest*
+
 if test $libc_cv_riscv_int_abi = no; then
   as_fn_error $? "Unable to determine integer ABI" "$LINENO" 5
 fi
@@ -214,6 +225,34 @@  case "$prefix" in
   ;;
 esac
   ;;
+ilp32-riscv/rv32/*)
+  test -n "$libc_cv_slibdir" ||
+case "$prefix" in
+/usr | /usr/)
+  libc_cv_slibdir='/lib32/ilp32'
+  libc_cv_rtlddir='/lib'
+  if test "$libdir" = '${exec_prefix}/lib'; then
+    libdir='${exec_prefix}/lib32/ilp32';
+    # Locale data can be shared between 32-bit and 64-bit libraries.
+    libc_cv_complocaledir='${exec_prefix}/lib/locale'
+  fi
+  ;;
+esac
+  ;;
+ilp32d-riscv/rv32/*)
+  test -n "$libc_cv_slibdir" ||
+case "$prefix" in
+/usr | /usr/)
+  libc_cv_slibdir='/lib32/ilp32d'
+  libc_cv_rtlddir='/lib'
+  if test "$libdir" = '${exec_prefix}/lib'; then
+    libdir='${exec_prefix}/lib32/ilp32d';
+    # Locale data can be shared between 32-bit and 64-bit libraries.
+    libc_cv_complocaledir='${exec_prefix}/lib/locale'
+  fi
+  ;;
+esac
+  ;;
 esac
 
 ldd_rewrite_script=sysdeps/unix/sysv/linux/riscv/ldd-rewrite.sed
diff --git a/sysdeps/unix/sysv/linux/riscv/configure.ac b/sysdeps/unix/sysv/linux/riscv/configure.ac
index d4819931ca..710d46afcd 100644
--- a/sysdeps/unix/sysv/linux/riscv/configure.ac
+++ b/sysdeps/unix/sysv/linux/riscv/configure.ac
@@ -7,6 +7,8 @@  arch_minimum_kernel=4.15.0
 libc_cv_riscv_int_abi=no
 AC_EGREP_CPP(4 8 8, [__SIZEOF_INT__ __SIZEOF_LONG__ __SIZEOF_POINTER__
   ], libc_cv_riscv_int_abi=lp64)
+AC_EGREP_CPP(4 4 4, [__SIZEOF_INT__ __SIZEOF_LONG__ __SIZEOF_POINTER__
+  ], libc_cv_riscv_int_abi=ilp32)
 if test $libc_cv_riscv_int_abi = no; then
   AC_MSG_ERROR([Unable to determine integer ABI])
 fi
@@ -33,6 +35,12 @@  lp64-riscv/rv64/*)
 lp64d-riscv/rv64/*)
   LIBC_SLIBDIR_RTLDDIR([lib64/lp64d], [lib])
   ;;
+ilp32-riscv/rv32/*)
+  LIBC_SLIBDIR_RTLDDIR([lib32/ilp32], [lib])
+  ;;
+ilp32d-riscv/rv32/*)
+  LIBC_SLIBDIR_RTLDDIR([lib32/ilp32d], [lib])
+  ;;
 esac
 
 ldd_rewrite_script=sysdeps/unix/sysv/linux/riscv/ldd-rewrite.sed
diff --git a/sysdeps/unix/sysv/linux/riscv/rv32/Implies b/sysdeps/unix/sysv/linux/riscv/rv32/Implies
new file mode 100644
index 0000000000..8b7deb33cd
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/riscv/rv32/Implies
@@ -0,0 +1,3 @@ 
+unix/sysv/linux/riscv
+unix/sysv/linux/generic/wordsize-32
+unix/sysv/linux/generic
diff --git a/sysdeps/unix/sysv/linux/riscv/shlib-versions b/sysdeps/unix/sysv/linux/riscv/shlib-versions
index 98c9b29cc4..919c8ec1fd 100644
--- a/sysdeps/unix/sysv/linux/riscv/shlib-versions
+++ b/sysdeps/unix/sysv/linux/riscv/shlib-versions
@@ -1,9 +1,15 @@ 
-DEFAULT		GLIBC_2.27
-
 %if RISCV_ABI_XLEN == 64 && RISCV_ABI_FLEN == 64
+DEFAULT		GLIBC_2.27
 ld=ld-linux-riscv64-lp64d.so.1
 %elif RISCV_ABI_XLEN == 64 && RISCV_ABI_FLEN == 0
+DEFAULT		GLIBC_2.27
 ld=ld-linux-riscv64-lp64.so.1
+%elif RISCV_ABI_XLEN == 32 && RISCV_ABI_FLEN == 64
+DEFAULT		GLIBC_2.32
+ld=ld-linux-riscv32-ilp32d.so.1
+%elif RISCV_ABI_XLEN == 32 && RISCV_ABI_FLEN == 0
+DEFAULT		GLIBC_2.32
+ld=ld-linux-riscv32-ilp32.so.1
 %else
 %error cannot determine ABI
 %endif