[v3,07/19] RISC-V: Build Infastructure
Commit Message
This patch lays out the top-level orginazition of the RISC-V port. It
contains all the Implies files as well as various other fragments of
build infastructure for the RISC-V port. This contains the only change
to a shared file: config.h.in.
RISC-V is a family of base ISAs with optional extensions. The base ISAs
are RV32I and RV64I, which are 32-bit and 64-bit integer-only ISAs.
Support for these live in sysdeps/riscv/rv{32,64}. In addition to these
ISAs, our glibc port supports most of the currently-defined extensions:
the A extension for atomics, the M extension for multiplication, the C
extension for compressed instructions, and the F/D extensions for
single/double precision IEEE floating-point. Most of these extensions
are handled by GCC, but glibc defines various floating-point wrappers
(in sysdeps/riscv/rv{32,64}/rv{f,d}) and emulation routines (in
sysdeps/riscv/soft-fp).
We support running glibc-based programs on Linux, the suppor for which
lives in sysdeps/unix/sysv/linux/riscv.
---
sysdeps/riscv/Implies | 5 +
sysdeps/riscv/Makefile | 11 ++
sysdeps/riscv/Versions | 4 +
sysdeps/riscv/configure | 4 +
sysdeps/riscv/configure.ac | 4 +
sysdeps/riscv/nptl/Makefile | 26 ++++
sysdeps/riscv/preconfigure | 67 +++++++++
sysdeps/riscv/rv32/Implies-after | 1 +
sysdeps/riscv/rv32/rvd/Implies | 2 +
sysdeps/riscv/rv32/rvf/Implies | 1 +
sysdeps/riscv/rv64/Implies-after | 1 +
sysdeps/riscv/rv64/rvd/Implies | 3 +
sysdeps/riscv/rv64/rvf/Implies | 1 +
sysdeps/unix/sysv/linux/riscv/Implies | 1 +
sysdeps/unix/sysv/linux/riscv/Makefile | 50 +++++++
sysdeps/unix/sysv/linux/riscv/Versions | 5 +
sysdeps/unix/sysv/linux/riscv/configure | 210 +++++++++++++++++++++++++++
sysdeps/unix/sysv/linux/riscv/configure.ac | 33 +++++
sysdeps/unix/sysv/linux/riscv/rv32/Implies | 3 +
sysdeps/unix/sysv/linux/riscv/rv64/Implies | 3 +
sysdeps/unix/sysv/linux/riscv/rv64/Makefile | 4 +
sysdeps/unix/sysv/linux/riscv/shlib-versions | 17 +++
22 files changed, 456 insertions(+)
create mode 100644 sysdeps/riscv/Implies
create mode 100644 sysdeps/riscv/Makefile
create mode 100644 sysdeps/riscv/Versions
create mode 100644 sysdeps/riscv/configure
create mode 100644 sysdeps/riscv/configure.ac
create mode 100644 sysdeps/riscv/nptl/Makefile
create mode 100644 sysdeps/riscv/preconfigure
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/riscv/rv64/Implies-after
create mode 100644 sysdeps/riscv/rv64/rvd/Implies
create mode 100644 sysdeps/riscv/rv64/rvf/Implies
create mode 100644 sysdeps/unix/sysv/linux/riscv/Implies
create mode 100644 sysdeps/unix/sysv/linux/riscv/Makefile
create mode 100644 sysdeps/unix/sysv/linux/riscv/Versions
create mode 100755 sysdeps/unix/sysv/linux/riscv/configure
create mode 100644 sysdeps/unix/sysv/linux/riscv/configure.ac
create mode 100644 sysdeps/unix/sysv/linux/riscv/rv32/Implies
create mode 100644 sysdeps/unix/sysv/linux/riscv/rv64/Implies
create mode 100644 sysdeps/unix/sysv/linux/riscv/rv64/Makefile
create mode 100644 sysdeps/unix/sysv/linux/riscv/shlib-versions
Comments
On Tue, 26 Dec 2017, Palmer Dabbelt wrote:
> diff --git a/sysdeps/riscv/Versions b/sysdeps/riscv/Versions
> new file mode 100644
> index 000000000000..aafa348a2395
> --- /dev/null
> +++ b/sysdeps/riscv/Versions
> @@ -0,0 +1,4 @@
> +libc {
> + GLIBC_2.27 {
> + }
> +}
I still don't see why this file should be needed. You need more
explanation than "IIRC some test was depending on this." for such an empty
GLIBC_2.27 version here (and the explanation ought to go in a comment in
the file to justify why the file exists).
> diff --git a/sysdeps/riscv/preconfigure b/sysdeps/riscv/preconfigure
> + case "$float_abi" in
> + soft)
> + abi_flen=0
> + ;;
> + single)
> + abi_flen=32
> + ;;
I'd expect the "single" case to be removed or made into an error, given
the decision not to support the "f" ABIs.
> +abi-ilp32-condition := (__SIZEOF_INT__ == 4)
> +abi-ilp32-condition += && (__SIZEOF_LONG__ == 4)
> +abi-ilp32-condition += && (__SIZEOF_POINTER__ == 4)
> +abi-ilp32-condition += && (defined __riscv_float_abi_soft)
> +abi-ilp32-condition += && (!defined __riscv_float_abi_single)
> +abi-ilp32-condition += && (!defined __riscv_float_abi_double)
You don't need such long and redundant conditions. I'd expect something
simpler like on other architectures (e.g. !defined __LP64__ && defined
__riscv_float_abi_soft in this case - in general, just checking one macro
for the ILP32/LP64 distinction, one for the floating-point ABI).
> diff --git a/sysdeps/unix/sysv/linux/riscv/configure.ac b/sysdeps/unix/sysv/linux/riscv/configure.ac
> +AC_EGREP_CPP(yes, [#ifdef __riscv_float_abi_single
> + yes
> + #endif
> + ],libc_cv_riscv_float_abi=f)
I'd expect this "f" ABI support to go away.
> diff --git a/sysdeps/unix/sysv/linux/riscv/shlib-versions b/sysdeps/unix/sysv/linux/riscv/shlib-versions
> +%elif RISCV_ABI_XLEN == 64 && RISCV_ABI_FLEN == 32
> +ld=ld-linux-riscv64-lp64f.so.1
> +%elif RISCV_ABI_XLEN == 32 && RISCV_ABI_FLEN == 32
> +ld=ld-linux-riscv32-ilp32f.so.1
Again, I'd expect the "f" ABI support to go away.
On 01/01/2018 08:09 AM, Joseph Myers wrote:
> On Tue, 26 Dec 2017, Palmer Dabbelt wrote:
>
>> diff --git a/sysdeps/riscv/Versions b/sysdeps/riscv/Versions
>> new file mode 100644
>> index 000000000000..aafa348a2395
>> --- /dev/null
>> +++ b/sysdeps/riscv/Versions
>> @@ -0,0 +1,4 @@
>> +libc {
>> + GLIBC_2.27 {
>> + }
>> +}
>
> I still don't see why this file should be needed. You need more
> explanation than "IIRC some test was depending on this." for such an empty
> GLIBC_2.27 version here (and the explanation ought to go in a comment in
> the file to justify why the file exists).
>
It doesn't appear to be necessary (I just tried without it), so I'll
remove it. Thanks.
>> diff --git a/sysdeps/riscv/preconfigure b/sysdeps/riscv/preconfigure
>> + case "$float_abi" in
>> + soft)
>> + abi_flen=0
>> + ;;
>> + single)
>> + abi_flen=32
>> + ;;
>
> I'd expect the "single" case to be removed or made into an error, given
> the decision not to support the "f" ABIs.
>
Indeed. I'll remove references to the single precision ABIs here and
elsewhere.
>> +abi-ilp32-condition := (__SIZEOF_INT__ == 4)
>> +abi-ilp32-condition += && (__SIZEOF_LONG__ == 4)
>> +abi-ilp32-condition += && (__SIZEOF_POINTER__ == 4)
>> +abi-ilp32-condition += && (defined __riscv_float_abi_soft)
>> +abi-ilp32-condition += && (!defined __riscv_float_abi_single)
>> +abi-ilp32-condition += && (!defined __riscv_float_abi_double)
>
> You don't need such long and redundant conditions. I'd expect something
> simpler like on other architectures (e.g. !defined __LP64__ && defined
> __riscv_float_abi_soft in this case - in general, just checking one macro
> for the ILP32/LP64 distinction, one for the floating-point ABI).
>
I'll remove the extraneous checks for the floating point ABI. However,
I think the other checks are necessary, as __LP64__/__ILP32__ are not
defined by gcc when -mabi is used. That might be a gcc bug, but that
seems to be how it is now. Alternatively, I could replace the check
with __riscv_xlen == 32 and == 64, but that doesn't seem like a good
approach, as it would break, if, for example, RISC-V ever supported
ILP32 on RV64.
>> diff --git a/sysdeps/unix/sysv/linux/riscv/configure.ac b/sysdeps/unix/sysv/linux/riscv/configure.ac
>
>> +AC_EGREP_CPP(yes, [#ifdef __riscv_float_abi_single
>> + yes
>> + #endif
>> + ],libc_cv_riscv_float_abi=f)
>
> I'd expect this "f" ABI support to go away.
>
>> diff --git a/sysdeps/unix/sysv/linux/riscv/shlib-versions b/sysdeps/unix/sysv/linux/riscv/shlib-versions
>
>> +%elif RISCV_ABI_XLEN == 64 && RISCV_ABI_FLEN == 32
>> +ld=ld-linux-riscv64-lp64f.so.1
>
>> +%elif RISCV_ABI_XLEN == 32 && RISCV_ABI_FLEN == 32
>> +ld=ld-linux-riscv32-ilp32f.so.1
>
> Again, I'd expect the "f" ABI support to go away.
>
On Thu, 4 Jan 2018, Darius Rad wrote:
> > You don't need such long and redundant conditions. I'd expect something
> > simpler like on other architectures (e.g. !defined __LP64__ && defined
> > __riscv_float_abi_soft in this case - in general, just checking one macro
> > for the ILP32/LP64 distinction, one for the floating-point ABI).
> >
>
> I'll remove the extraneous checks for the floating point ABI. However,
> I think the other checks are necessary, as __LP64__/__ILP32__ are not
> defined by gcc when -mabi is used. That might be a gcc bug, but that
__LP64__ is defined in architecture-independent code (cppbuiltin.c), so
should be fully suitable for this. (__ILP32__ is indeed an
architecture-specific macro on only some architectures.)
On 01/05/2018 08:44 AM, Joseph Myers wrote:
> On Thu, 4 Jan 2018, Darius Rad wrote:
>
>>> You don't need such long and redundant conditions. I'd expect something
>>> simpler like on other architectures (e.g. !defined __LP64__ && defined
>>> __riscv_float_abi_soft in this case - in general, just checking one macro
>>> for the ILP32/LP64 distinction, one for the floating-point ABI).
>>>
>>
>> I'll remove the extraneous checks for the floating point ABI. However,
>> I think the other checks are necessary, as __LP64__/__ILP32__ are not
>> defined by gcc when -mabi is used. That might be a gcc bug, but that
>
> __LP64__ is defined in architecture-independent code (cppbuiltin.c), so
> should be fully suitable for this. (__ILP32__ is indeed an
> architecture-specific macro on only some architectures.)
>
Indeed, my mistake. __ILP32__ is not present, but __LP64__ is defined
when appropriate. So I'll use __LP64__ and !__LP64__, which are
sufficient to differentiate the currently supported ABIs (along with
soft/double float).
new file mode 100644
@@ -0,0 +1,5 @@
+init_array
+
+ieee754/ldbl-128
+ieee754/dbl-64
+ieee754/flt-32
new file mode 100644
@@ -0,0 +1,11 @@
+ifeq ($(subdir),misc)
+sysdep_headers += sys/asm.h
+endif
+
+# RISC-V's assembler also needs to know about PIC as it changes the definition
+# of some assembler macros.
+ASFLAGS-.os += $(pic-ccflag)
+
+ifeq ($(subdir),math)
+CPPFLAGS += -I../soft-fp
+endif
new file mode 100644
@@ -0,0 +1,4 @@
+libc {
+ GLIBC_2.27 {
+ }
+}
new file mode 100644
@@ -0,0 +1,4 @@
+# This file is generated from configure.ac by Autoconf. DO NOT EDIT!
+ # Local configure fragment for sysdeps/riscv/elf.
+
+$as_echo "#define PI_STATIC_AND_HIDDEN 1" >>confdefs.h
new file mode 100644
@@ -0,0 +1,4 @@
+GLIBC_PROVIDES dnl See aclocal.m4 in the top level source directory.
+# Local configure fragment for sysdeps/riscv/elf.
+
+AC_DEFINE(PI_STATIC_AND_HIDDEN)
new file mode 100644
@@ -0,0 +1,26 @@
+# Makefile for sysdeps/riscv/nptl.
+# Copyright (C) 2005-2017 Free Software Foundation, Inc.
+# This file is part of the GNU C Library.
+#
+# The GNU C Library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# The GNU C Library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with the GNU C Library; if not, see
+# <http://www.gnu.org/licenses/>.
+
+ifeq ($(subdir),csu)
+gen-as-const-headers += tcb-offsets.sym
+endif
+
+ifeq ($(subdir),nptl)
+libpthread-sysdep_routines += nptl-sysdep
+libpthread-shared-only-routines += nptl-sysdep
+endif
new file mode 100644
@@ -0,0 +1,67 @@
+case "$machine" in
+riscv*)
+ xlen=`$CC $CFLAGS $CPPFLAGS -E -dM -xc /dev/null | sed -n 's/^#define __riscv_xlen \(.*\)/\1/p'`
+ flen=`$CC $CFLAGS $CPPFLAGS -E -dM -xc /dev/null | sed -n 's/^#define __riscv_flen \(.*\)/\1/p'`
+ float_abi=`$CC $CFLAGS $CPPFLAGS -E -dM -xc /dev/null | sed -n 's/^#define __riscv_float_abi_\([^ ]*\) .*/\1/p'`
+ atomic=`$CC $CFLAGS $CPPFLAGS -E -dM -xc /dev/null | grep '#define __riscv_atomic' | cut -d' ' -f2`
+
+ case "$xlen" in
+ 32 | 64)
+ ;;
+ *)
+ echo "Unable to determine XLEN" >&2
+ exit 1
+ ;;
+ esac
+
+ case "$flen" in
+ 64)
+ float_machine=rvd
+ with_fp_cond=1
+ ;;
+ 32)
+ float_machine=rvf
+ with_fp_cond=1
+ ;;
+ "")
+ float_machine=
+ with_fp_cond=0
+ ;;
+ *)
+ echo "Unable to determine FLEN" >&2
+ exit 1
+ ;;
+ esac
+
+ case "$float_abi" in
+ soft)
+ abi_flen=0
+ ;;
+ single)
+ abi_flen=32
+ ;;
+ double)
+ abi_flen=64
+ ;;
+ *)
+ echo "Unable to determine floating-point ABI" >&2
+ exit 1
+ ;;
+ esac
+
+ case "$atomic" in
+ __riscv_atomic)
+ ;;
+ *)
+ echo "glibc requires the A extension" >&2
+ exit 1
+ ;;
+ esac
+
+ base_machine=riscv
+ machine=riscv/rv$xlen/$float_machine
+
+ $as_echo "#define RISCV_ABI_XLEN $xlen" >>confdefs.h
+ $as_echo "#define RISCV_ABI_FLEN $abi_flen" >>confdefs.h
+ ;;
+esac
new file mode 100644
@@ -0,0 +1 @@
+wordsize-32
new file mode 100644
@@ -0,0 +1,2 @@
+riscv/rvd
+riscv/rvf
new file mode 100644
@@ -0,0 +1 @@
+riscv/rvf
new file mode 100644
@@ -0,0 +1 @@
+wordsize-64
new file mode 100644
@@ -0,0 +1,3 @@
+riscv/rv64/rvf
+riscv/rvd
+riscv/rvf
new file mode 100644
@@ -0,0 +1 @@
+riscv/rvf
new file mode 100644
@@ -0,0 +1 @@
+riscv/nptl
new file mode 100644
@@ -0,0 +1,50 @@
+ifeq ($(subdir),elf)
+sysdep_routines += dl-vdso
+ifeq ($(build-shared),yes)
+# This is needed for DSO loading from static binaries.
+sysdep-dl-routines += dl-static
+endif
+endif
+
+ifeq ($(subdir),misc)
+sysdep_headers += sys/cachectl.h
+sysdep_routines += flush-icache
+endif
+
+ifeq ($(subdir),stdlib)
+gen-as-const-headers += ucontext_i.sym
+endif
+
+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 := (__SIZEOF_INT__ == 4)
+abi-ilp32-condition += && (__SIZEOF_LONG__ == 4)
+abi-ilp32-condition += && (__SIZEOF_POINTER__ == 4)
+abi-ilp32-condition += && (defined __riscv_float_abi_soft)
+abi-ilp32-condition += && (!defined __riscv_float_abi_single)
+abi-ilp32-condition += && (!defined __riscv_float_abi_double)
+
+abi-ilp32d-condition := (__SIZEOF_INT__ == 4)
+abi-ilp32d-condition += && (__SIZEOF_LONG__ == 4)
+abi-ilp32d-condition += && (__SIZEOF_POINTER__ == 4)
+abi-ilp32d-condition += && (!defined __riscv_float_abi_soft)
+abi-ilp32d-condition += && (!defined __riscv_float_abi_single)
+abi-ilp32d-condition += && (defined __riscv_float_abi_double)
+
+abi-lp64-condition := (__SIZEOF_INT__ == 4)
+abi-lp64-condition += && (__SIZEOF_LONG__ == 8)
+abi-lp64-condition += && (__SIZEOF_POINTER__ == 8)
+abi-lp64-condition += && (defined __riscv_float_abi_soft)
+abi-lp64-condition += && (!defined __riscv_float_abi_single)
+abi-lp64-condition += && (!defined __riscv_float_abi_double)
+
+abi-lp64d-condition := (__SIZEOF_INT__ == 4)
+abi-lp64d-condition += && (__SIZEOF_LONG__ == 8)
+abi-lp64d-condition += && (__SIZEOF_POINTER__ == 8)
+abi-lp64d-condition += && (!defined __riscv_float_abi_soft)
+abi-lp64d-condition += && (!defined __riscv_float_abi_single)
+abi-lp64d-condition += && (defined __riscv_float_abi_double)
new file mode 100644
@@ -0,0 +1,5 @@
+libc {
+ GLIBC_2.27 {
+ __riscv_flush_icache;
+ }
+}
new file mode 100755
@@ -0,0 +1,210 @@
+# This file is generated from configure.ac by Autoconf. DO NOT EDIT!
+ # Local configure fragment for sysdeps/unix/sysv/linux/riscv.
+
+arch_minimum_kernel=4.15.0
+
+libc_cv_riscv_int_abi=no
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5
+$as_echo_n "checking for grep that handles long lines and -e... " >&6; }
+if ${ac_cv_path_GREP+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -z "$GREP"; then
+ ac_path_GREP_found=false
+ # Loop through the user's path and test for each of PROGNAME-LIST
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_prog in grep ggrep; do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext"
+ as_fn_executable_p "$ac_path_GREP" || continue
+# Check for GNU ac_path_GREP and select it if it is found.
+ # Check for GNU $ac_path_GREP
+case `"$ac_path_GREP" --version 2>&1` in
+*GNU*)
+ ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;;
+*)
+ ac_count=0
+ $as_echo_n 0123456789 >"conftest.in"
+ while :
+ do
+ cat "conftest.in" "conftest.in" >"conftest.tmp"
+ mv "conftest.tmp" "conftest.in"
+ cp "conftest.in" "conftest.nl"
+ $as_echo 'GREP' >> "conftest.nl"
+ "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break
+ diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+ as_fn_arith $ac_count + 1 && ac_count=$as_val
+ if test $ac_count -gt ${ac_path_GREP_max-0}; then
+ # Best one so far, save it but keep looking for a better one
+ ac_cv_path_GREP="$ac_path_GREP"
+ ac_path_GREP_max=$ac_count
+ fi
+ # 10*(2^10) chars as input seems more than enough
+ test $ac_count -gt 10 && break
+ done
+ rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+ $ac_path_GREP_found && break 3
+ done
+ done
+ done
+IFS=$as_save_IFS
+ if test -z "$ac_cv_path_GREP"; then
+ as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
+ fi
+else
+ ac_cv_path_GREP=$GREP
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5
+$as_echo "$ac_cv_path_GREP" >&6; }
+ GREP="$ac_cv_path_GREP"
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5
+$as_echo_n "checking for egrep... " >&6; }
+if ${ac_cv_path_EGREP+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if echo a | $GREP -E '(a|b)' >/dev/null 2>&1
+ then ac_cv_path_EGREP="$GREP -E"
+ else
+ if test -z "$EGREP"; then
+ ac_path_EGREP_found=false
+ # Loop through the user's path and test for each of PROGNAME-LIST
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_prog in egrep; do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext"
+ as_fn_executable_p "$ac_path_EGREP" || continue
+# Check for GNU ac_path_EGREP and select it if it is found.
+ # Check for GNU $ac_path_EGREP
+case `"$ac_path_EGREP" --version 2>&1` in
+*GNU*)
+ ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;;
+*)
+ ac_count=0
+ $as_echo_n 0123456789 >"conftest.in"
+ while :
+ do
+ cat "conftest.in" "conftest.in" >"conftest.tmp"
+ mv "conftest.tmp" "conftest.in"
+ cp "conftest.in" "conftest.nl"
+ $as_echo 'EGREP' >> "conftest.nl"
+ "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break
+ diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+ as_fn_arith $ac_count + 1 && ac_count=$as_val
+ if test $ac_count -gt ${ac_path_EGREP_max-0}; then
+ # Best one so far, save it but keep looking for a better one
+ ac_cv_path_EGREP="$ac_path_EGREP"
+ ac_path_EGREP_max=$ac_count
+ fi
+ # 10*(2^10) chars as input seems more than enough
+ test $ac_count -gt 10 && break
+ done
+ rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+ $ac_path_EGREP_found && break 3
+ done
+ done
+ done
+IFS=$as_save_IFS
+ if test -z "$ac_cv_path_EGREP"; then
+ as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
+ fi
+else
+ ac_cv_path_EGREP=$EGREP
+fi
+
+ fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5
+$as_echo "$ac_cv_path_EGREP" >&6; }
+ EGREP="$ac_cv_path_EGREP"
+
+
+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 8 8" >/dev/null 2>&1; then :
+ libc_cv_riscv_int_abi=lp64
+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
+
+libc_cv_riscv_float_abi=no
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#ifdef __riscv_float_abi_double
+ yes
+ #endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "yes" >/dev/null 2>&1; then :
+ libc_cv_riscv_float_abi=d
+fi
+rm -f conftest*
+
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#ifdef __riscv_float_abi_single
+ yes
+ #endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "yes" >/dev/null 2>&1; then :
+ libc_cv_riscv_float_abi=f
+fi
+rm -f conftest*
+
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#ifdef __riscv_float_abi_soft
+ yes
+ #endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "yes" >/dev/null 2>&1; then :
+ libc_cv_riscv_float_abi=
+fi
+rm -f conftest*
+
+if test $libc_cv_riscv_float_abi = no; then
+ as_fn_error $? "Unable to determine floating-point ABI" "$LINENO" 5
+fi
+
+config_vars="$config_vars
+default-abi = $libc_cv_riscv_int_abi$libc_cv_riscv_float_abi"
new file mode 100644
@@ -0,0 +1,33 @@
+sinclude(./aclocal.m4)dnl Autoconf lossage
+GLIBC_PROVIDES dnl See aclocal.m4 in the top level source directory.
+# Local configure fragment for sysdeps/unix/sysv/linux/riscv.
+
+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
+
+libc_cv_riscv_float_abi=no
+AC_EGREP_CPP(yes, [#ifdef __riscv_float_abi_double
+ yes
+ #endif
+ ],libc_cv_riscv_float_abi=d)
+AC_EGREP_CPP(yes, [#ifdef __riscv_float_abi_single
+ yes
+ #endif
+ ],libc_cv_riscv_float_abi=f)
+AC_EGREP_CPP(yes, [#ifdef __riscv_float_abi_soft
+ yes
+ #endif
+ ],libc_cv_riscv_float_abi=)
+if test $libc_cv_riscv_float_abi = no; then
+ AC_MSG_ERROR([Unable to determine floating-point ABI])
+fi
+
+LIBC_CONFIG_VAR([default-abi], [$libc_cv_riscv_int_abi$libc_cv_riscv_float_abi])
new file mode 100644
@@ -0,0 +1,3 @@
+unix/sysv/linux/riscv
+unix/sysv/linux/generic/wordsize-32
+unix/sysv/linux/generic
new file mode 100644
@@ -0,0 +1,3 @@
+unix/sysv/linux/riscv
+unix/sysv/linux/generic
+unix/sysv/linux/wordsize-64
new file mode 100644
@@ -0,0 +1,4 @@
+ifeq ($(subdir),socket)
+CFLAGS-recv.c += -fexceptions
+CFLAGS-send.c += -fexceptions
+endif
new file mode 100644
@@ -0,0 +1,17 @@
+DEFAULT GLIBC_2.27
+
+%if RISCV_ABI_XLEN == 64 && RISCV_ABI_FLEN == 64
+ld=ld-linux-riscv64-lp64d.so.1
+%elif RISCV_ABI_XLEN == 64 && RISCV_ABI_FLEN == 32
+ld=ld-linux-riscv64-lp64f.so.1
+%elif RISCV_ABI_XLEN == 64 && RISCV_ABI_FLEN == 0
+ld=ld-linux-riscv64-lp64.so.1
+%elif RISCV_ABI_XLEN == 32 && RISCV_ABI_FLEN == 64
+ld=ld-linux-riscv32-ilp32d.so.1
+%elif RISCV_ABI_XLEN == 32 && RISCV_ABI_FLEN == 32
+ld=ld-linux-riscv32-ilp32f.so.1
+%elif RISCV_ABI_XLEN == 32 && RISCV_ABI_FLEN == 0
+ld=ld-linux-riscv32-ilp32.so.1
+%else
+%error cannot determine ABI
+%endif