[v3,15/19] RISC-V: Build Infastructure for 32-bit
Commit Message
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
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
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
@@ -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
new file mode 100644
@@ -0,0 +1 @@
+wordsize-32
new file mode 100644
@@ -0,0 +1,3 @@
+riscv/rv32/rvf
+riscv/rvd
+riscv/rvf
new file mode 100644
@@ -0,0 +1 @@
+riscv/rvf
@@ -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
@@ -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
@@ -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
new file mode 100644
@@ -0,0 +1,3 @@
+unix/sysv/linux/riscv
+unix/sysv/linux/generic/wordsize-32
+unix/sysv/linux/generic
@@ -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