Message ID | 20220708065255.2316410-12-caiyinyu@loongson.cn |
---|---|
State | New |
Headers | show |
Series | GLIBC LoongArch PATCHES | expand |
On Fri, 2022-07-08 at 14:52 +0800, caiyinyu wrote:
> grlen=`$CC $CFLAGS $CPPFLAGS -E -dM -xc /dev/null | sed -n 's/^#define __loongarch_grlen \(.*\)/\1/p'`
I suggest to use "__loongarch_lp64" for checking ABI grlen. Consider:
"gcc -march=la464 -mabi=ilp32d ..."
Once ILP32 ABIs are available, will __loongarch_grlen be 64 or 32 in
this case, where the hardware has 64-bit registers but the ABI uses them
as 32-bit? Our documentation is not clear about this question and
currently we understand __loongarch_grlen as hardware GR length instead
of the register length used in ABI [1].
[1]:https://github.com/loongson/LoongArch-Documentation/pull/28#discussion_r917364055
OTOH if you think "we should define __loongarch_grlen as the register
length for ABI, irrelevant to the hardware", you need to inform your
colleagues to clarify it in the doc.
On 2022/7/13 11:07, Xi Ruoyao wrote: > On Fri, 2022-07-08 at 14:52 +0800, caiyinyu wrote: >> grlen=`$CC $CFLAGS $CPPFLAGS -E -dM -xc /dev/null | sed -n 's/^#define __loongarch_grlen \(.*\)/\1/p'` > I suggest to use "__loongarch_lp64" for checking ABI grlen. Consider: > > "gcc -march=la464 -mabi=ilp32d ..." > > Once ILP32 ABIs are available, will __loongarch_grlen be 64 or 32 in > this case, where the hardware has 64-bit registers but the ABI uses them > as 32-bit? Our documentation is not clear about this question and > currently we understand __loongarch_grlen as hardware GR length instead > of the register length used in ABI [1]. > > [1]:https://github.com/loongson/LoongArch-Documentation/pull/28#discussion_r917364055 > > OTOH if you think "we should define __loongarch_grlen as the register > length for ABI, irrelevant to the hardware", you need to inform your > colleagues to clarify it in the doc. To my intuition it's the hardware GRLEN, but thinking about it harder, there is indeed ambiguity. Some clarification would be useful here. (BTW, Yinyu, could you keep me CC-ed when sending your next revisions? I'd like to take a quick review to ensure there are as few historical warts as possible when the patchset get updated.)
在 2022/7/13 上午11:43, WANG Xuerui 写道: > On 2022/7/13 11:07, Xi Ruoyao wrote: >> On Fri, 2022-07-08 at 14:52 +0800, caiyinyu wrote: >>> grlen=`$CC $CFLAGS $CPPFLAGS -E -dM -xc /dev/null | sed -n >>> 's/^#define __loongarch_grlen \(.*\)/\1/p'` >> I suggest to use "__loongarch_lp64" for checking ABI grlen. Consider: >> >> "gcc -march=la464 -mabi=ilp32d ..." >> >> Once ILP32 ABIs are available, will __loongarch_grlen be 64 or 32 in >> this case, where the hardware has 64-bit registers but the ABI uses them >> as 32-bit? Our documentation is not clear about this question and >> currently we understand __loongarch_grlen as hardware GR length instead >> of the register length used in ABI [1]. >> >> [1]:https://github.com/loongson/LoongArch-Documentation/pull/28#discussion_r917364055 >> >> >> OTOH if you think "we should define __loongarch_grlen as the register >> length for ABI, irrelevant to the hardware", you need to inform your >> colleagues to clarify it in the doc. > > To my intuition it's the hardware GRLEN, but thinking about it harder, > there is indeed ambiguity. Some clarification would be useful here. > > (BTW, Yinyu, could you keep me CC-ed when sending your next revisions? > I'd like to take a quick review to ensure there are as few historical > warts as possible when the patchset get updated.) Fixed, thanks. >>>>>>>>> diff --git a/sysdeps/loongarch/preconfigure b/sysdeps/loongarch/preconfigure index 489af6f0b7..118963cda6 100644 --- a/sysdeps/loongarch/preconfigure +++ b/sysdeps/loongarch/preconfigure @@ -4,7 +4,7 @@ case "$machine" in loongarch*) - grlen=`$CC $CFLAGS $CPPFLAGS -E -dM -xc /dev/null | sed -n 's/^#define __loongarch_grlen \(.*\)/\1/p'` + abi=`$CC $CFLAGS $CPPFLAGS -E -dM -xc /dev/null | sed -n 's/^#define __loongarch_\(lp64\|ilp32\).*/\1/p'` float_abi=`$CC $CFLAGS $CPPFLAGS -E -dM -xc /dev/null | sed -n 's/^#define __loongarch_\(soft\|single\|double\)_float.*/\1/p'` with_fp_cond="!defined __loongarch_soft_float" @@ -25,11 +25,12 @@ loongarch*) ;; esac - case "$grlen" in - 32) + case "$abi" in + ilp32) as_fn_error 1 "loongarch does not yet support ilp32 ABI!!" "$LINENO" 5 ;; - 64) + lp64) + grlen=64 machine=loongarch/lp64 ;; *) diff --git a/sysdeps/loongarch/preconfigure.ac b/sysdeps/loongarch/preconfigure.ac index 8eb94e9efe..1aba743c15 100644 --- a/sysdeps/loongarch/preconfigure.ac +++ b/sysdeps/loongarch/preconfigure.ac @@ -4,7 +4,7 @@ GLIBC_PROVIDES[]dnl See aclocal.m4 in the top level source directory. case "$machine" in loongarch*) - grlen=`$CC $CFLAGS $CPPFLAGS -E -dM -xc /dev/null | sed -n 's/^#define __loongarch_grlen \(.*\)/\1/p'` + abi=`$CC $CFLAGS $CPPFLAGS -E -dM -xc /dev/null | sed -n 's/^#define __loongarch_\(lp64\|ilp32\).*/\1/p'` float_abi=`$CC $CFLAGS $CPPFLAGS -E -dM -xc /dev/null | sed -n 's/^#define __loongarch_\(soft\|single\|double\)_float.*/\1/p'` with_fp_cond="!defined __loongarch_soft_float" @@ -25,11 +25,12 @@ loongarch*) ;; esac - case "$grlen" in - 32) + case "$abi" in + ilp32) AC_MSG_ERROR([loongarch does not yet support ilp32 ABI!!], 1) ;; - 64) + lp64) + grlen=64 machine=loongarch/lp64 ;; *) <<<<<<
Looks ok, some comments below. On 08/07/22 03:52, caiyinyu wrote: > --- > sysdeps/loongarch/Implies | 3 + > sysdeps/loongarch/Makefile | 15 ++ > sysdeps/loongarch/configure | 5 + > sysdeps/loongarch/configure.ac | 6 + > sysdeps/loongarch/lp64/Implies-after | 1 + > sysdeps/loongarch/nptl/Makefile | 21 +++ > sysdeps/loongarch/preconfigure | 52 ++++++ > sysdeps/loongarch/preconfigure.ac | 46 +++++ > sysdeps/loongarch/sys/regdef.h | 93 ++++++++++ > sysdeps/unix/sysv/linux/loongarch/Implies | 1 + > sysdeps/unix/sysv/linux/loongarch/Makefile | 4 + > sysdeps/unix/sysv/linux/loongarch/configure | 174 ++++++++++++++++++ > .../unix/sysv/linux/loongarch/configure.ac | 22 +++ > .../unix/sysv/linux/loongarch/ldd-rewrite.sed | 3 + > .../unix/sysv/linux/loongarch/lp64/Implies | 3 + > .../unix/sysv/linux/loongarch/shlib-versions | 7 + > 16 files changed, 456 insertions(+) > create mode 100644 sysdeps/loongarch/Implies > create mode 100644 sysdeps/loongarch/Makefile > create mode 100644 sysdeps/loongarch/configure > create mode 100644 sysdeps/loongarch/configure.ac > create mode 100644 sysdeps/loongarch/lp64/Implies-after > create mode 100644 sysdeps/loongarch/nptl/Makefile > create mode 100644 sysdeps/loongarch/preconfigure > create mode 100644 sysdeps/loongarch/preconfigure.ac > create mode 100644 sysdeps/loongarch/sys/regdef.h > create mode 100644 sysdeps/unix/sysv/linux/loongarch/Implies > create mode 100644 sysdeps/unix/sysv/linux/loongarch/Makefile > create mode 100644 sysdeps/unix/sysv/linux/loongarch/configure > create mode 100644 sysdeps/unix/sysv/linux/loongarch/configure.ac > create mode 100644 sysdeps/unix/sysv/linux/loongarch/ldd-rewrite.sed > create mode 100644 sysdeps/unix/sysv/linux/loongarch/lp64/Implies > create mode 100644 sysdeps/unix/sysv/linux/loongarch/shlib-versions > > diff --git a/sysdeps/loongarch/Implies b/sysdeps/loongarch/Implies > new file mode 100644 > index 0000000000..1945b1f4bb > --- /dev/null > +++ b/sysdeps/loongarch/Implies > @@ -0,0 +1,3 @@ > +ieee754/ldbl-128 > +ieee754/dbl-64 > +ieee754/flt-32 > diff --git a/sysdeps/loongarch/Makefile b/sysdeps/loongarch/Makefile > new file mode 100644 > index 0000000000..41c3449670 > --- /dev/null > +++ b/sysdeps/loongarch/Makefile > @@ -0,0 +1,15 @@ > +ifeq ($(subdir),misc) > +sysdep_headers += sys/asm.h > +endif > + > +# LoongArch's assembler also needs to know about PIC as it changes the > +# definition of some assembler macros. > +ASFLAGS-.os += $(pic-ccflag) > + > +abi-variants := lp64 > + > +ifeq (,$(filter $(default-abi),$(abi-variants))) > +$(error Unknown ABI $(default-abi), must be one of $(abi-variants)) > +endif > + > +abi-lp64-condition := defined __loongarch_lp64 > diff --git a/sysdeps/loongarch/configure b/sysdeps/loongarch/configure > new file mode 100644 > index 0000000000..43b54d4965 > --- /dev/null > +++ b/sysdeps/loongarch/configure > @@ -0,0 +1,5 @@ > +# This file is generated from configure.ac by Autoconf. DO NOT EDIT! > + # Local configure fragment for sysdeps/loongarch/elf. > + > +$as_echo "#define HIDDEN_VAR_NEEDS_DYNAMIC_RELOC 1" >>confdefs.h > + > diff --git a/sysdeps/loongarch/configure.ac b/sysdeps/loongarch/configure.ac > new file mode 100644 > index 0000000000..f744367bf3 > --- /dev/null > +++ b/sysdeps/loongarch/configure.ac > @@ -0,0 +1,6 @@ > +GLIBC_PROVIDES dnl See aclocal.m4 in the top level source directory. > +# Local configure fragment for sysdeps/loongarch/elf. > + > +dnl It is always possible to access static and hidden symbols in an > +dnl position independent way. > +AC_DEFINE(HIDDEN_VAR_NEEDS_DYNAMIC_RELOC) > diff --git a/sysdeps/loongarch/lp64/Implies-after b/sysdeps/loongarch/lp64/Implies-after > new file mode 100644 > index 0000000000..a8cae95f9d > --- /dev/null > +++ b/sysdeps/loongarch/lp64/Implies-after > @@ -0,0 +1 @@ > +wordsize-64 > diff --git a/sysdeps/loongarch/nptl/Makefile b/sysdeps/loongarch/nptl/Makefile > new file mode 100644 > index 0000000000..e73bbf3e21 > --- /dev/null > +++ b/sysdeps/loongarch/nptl/Makefile > @@ -0,0 +1,21 @@ > +# Makefile for sysdeps/loongarch/nptl. > +# Copyright (C) 2022 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 > +# <https://www.gnu.org/licenses/>. > + > +ifeq ($(subdir),csu) > +gen-as-const-headers += tcb-offsets.sym > +endif loongarch does not need this header (you can build glibc if you remove it). > diff --git a/sysdeps/loongarch/preconfigure b/sysdeps/loongarch/preconfigure > new file mode 100644 > index 0000000000..489af6f0b7 > --- /dev/null > +++ b/sysdeps/loongarch/preconfigure > @@ -0,0 +1,52 @@ > +# This file is generated from configure.ac by Autoconf. DO NOT EDIT! > +# Local preconfigure fragment for sysdeps/loongarch > + > +case "$machine" in > +loongarch*) > + > + grlen=`$CC $CFLAGS $CPPFLAGS -E -dM -xc /dev/null | sed -n 's/^#define __loongarch_grlen \(.*\)/\1/p'` > + float_abi=`$CC $CFLAGS $CPPFLAGS -E -dM -xc /dev/null | sed -n 's/^#define __loongarch_\(soft\|single\|double\)_float.*/\1/p'` > + > + with_fp_cond="!defined __loongarch_soft_float" > + > + case "$float_abi" in > + soft) > + abi_flen=0 > + as_fn_error 1 "loongarch does not yet support soft floating-point ABI!!" "$LINENO" 5 > + ;; > + single) > + as_fn_error 1 "glibc does not yet support the single floating-point ABI!!" "$LINENO" 5 > + ;; > + double) > + abi_flen=64 > + ;; > + *) > + as_fn_error 1 "Unable to determine floating-point ABI!!" "$LINENO" 5 > + ;; > + esac > + > + case "$grlen" in > + 32) > + as_fn_error 1 "loongarch does not yet support ilp32 ABI!!" "$LINENO" 5 > + ;; > + 64) > + machine=loongarch/lp64 > + ;; > + *) > + as_fn_error 1 "Unable to determine GRLEN!!" "$LINENO" 5 > + ;; > + esac > + > + cat >>confdefs.h <<_ACEOF > +#define LOONGARCH_ABI_GRLEN $grlen > +_ACEOF > + > + cat >>confdefs.h <<_ACEOF > +#define LOONGARCH_ABI_FRLEN $abi_flen > +_ACEOF > + > + > + base_machine=loongarch > + ;; > +esac > + > diff --git a/sysdeps/loongarch/preconfigure.ac b/sysdeps/loongarch/preconfigure.ac > new file mode 100644 > index 0000000000..8eb94e9efe > --- /dev/null > +++ b/sysdeps/loongarch/preconfigure.ac > @@ -0,0 +1,46 @@ > +GLIBC_PROVIDES[]dnl See aclocal.m4 in the top level source directory. > +# Local preconfigure fragment for sysdeps/loongarch > + > +case "$machine" in > +loongarch*) > + > + grlen=`$CC $CFLAGS $CPPFLAGS -E -dM -xc /dev/null | sed -n 's/^#define __loongarch_grlen \(.*\)/\1/p'` > + float_abi=`$CC $CFLAGS $CPPFLAGS -E -dM -xc /dev/null | sed -n 's/^#define __loongarch_\(soft\|single\|double\)_float.*/\1/p'` > + > + with_fp_cond="!defined __loongarch_soft_float" > + > + case "$float_abi" in > + soft) > + abi_flen=0 > + AC_MSG_ERROR([loongarch does not yet support soft floating-point ABI!!], 1) > + ;; > + single) > + AC_MSG_ERROR([glibc does not yet support the single floating-point ABI!!], 1) > + ;; > + double) > + abi_flen=64 > + ;; > + *) > + AC_MSG_ERROR([Unable to determine floating-point ABI!!], 1) > + ;; > + esac > + > + case "$grlen" in > + 32) > + AC_MSG_ERROR([loongarch does not yet support ilp32 ABI!!], 1) > + ;; > + 64) > + machine=loongarch/lp64 > + ;; > + *) > + AC_MSG_ERROR([Unable to determine GRLEN!!], 1) > + ;; > + esac > + > + AC_DEFINE_UNQUOTED([LOONGARCH_ABI_GRLEN], [$grlen]) > + AC_DEFINE_UNQUOTED([LOONGARCH_ABI_FRLEN], [$abi_flen]) > + > + base_machine=loongarch > + ;; > +esac > + > diff --git a/sysdeps/loongarch/sys/regdef.h b/sysdeps/loongarch/sys/regdef.h > new file mode 100644 > index 0000000000..d266df372d > --- /dev/null > +++ b/sysdeps/loongarch/sys/regdef.h > @@ -0,0 +1,93 @@ > +/* Register Macro definitions > + Copyright (C) 2022 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 > + <https://www.gnu.org/licenses/>. */ > + > +#ifndef _SYS_REGDEF_H > +#define _SYS_REGDEF_H > + > +#define zero $r0 > +#define ra $r1 > +#define tp $r2 > +#define sp $r3 > +#define a0 $r4 > +#define a1 $r5 > +#define a2 $r6 > +#define a3 $r7 > +#define a4 $r8 > +#define a5 $r9 > +#define a6 $r10 > +#define a7 $r11 > +#define v0 $r4 > +#define v1 $r5 > +#define t0 $r12 > +#define t1 $r13 > +#define t2 $r14 > +#define t3 $r15 > +#define t4 $r16 > +#define t5 $r17 > +#define t6 $r18 > +#define t7 $r19 > +#define t8 $r20 > +#define x $r21 > +#define fp $r22 > +#define s0 $r23 > +#define s1 $r24 > +#define s2 $r25 > +#define s3 $r26 > +#define s4 $r27 > +#define s5 $r28 > +#define s6 $r29 > +#define s7 $r30 > +#define s8 $r31 > + > +#define fa0 $f0 > +#define fa1 $f1 > +#define fa2 $f2 > +#define fa3 $f3 > +#define fa4 $f4 > +#define fa5 $f5 > +#define fa6 $f6 > +#define fa7 $f7 > +#define fv0 $f0 > +#define fv1 $f1 > +#define ft0 $f8 > +#define ft1 $f9 > +#define ft2 $f10 > +#define ft3 $f11 > +#define ft4 $f12 > +#define ft5 $f13 > +#define ft6 $f14 > +#define ft7 $f15 > +#define ft8 $f16 > +#define ft9 $f17 > +#define ft10 $f18 > +#define ft11 $f19 > +#define ft12 $f20 > +#define ft13 $f21 > +#define ft14 $f22 > +#define ft15 $f23 > +#define fs0 $f24 > +#define fs1 $f25 > +#define fs2 $f26 > +#define fs3 $f27 > +#define fs4 $f28 > +#define fs5 $f29 > +#define fs6 $f30 > +#define fs7 $f31 > + > +#endif /* _SYS_REGDEF_H */ > diff --git a/sysdeps/unix/sysv/linux/loongarch/Implies b/sysdeps/unix/sysv/linux/loongarch/Implies > new file mode 100644 > index 0000000000..e52b1ac310 > --- /dev/null > +++ b/sysdeps/unix/sysv/linux/loongarch/Implies > @@ -0,0 +1 @@ > +loongarch/nptl > diff --git a/sysdeps/unix/sysv/linux/loongarch/Makefile b/sysdeps/unix/sysv/linux/loongarch/Makefile > new file mode 100644 > index 0000000000..730bfa7465 > --- /dev/null > +++ b/sysdeps/unix/sysv/linux/loongarch/Makefile > @@ -0,0 +1,4 @@ > +ifeq ($(subdir),stdlib) > +gen-as-const-headers += ucontext_i.sym > +endif > + > diff --git a/sysdeps/unix/sysv/linux/loongarch/configure b/sysdeps/unix/sysv/linux/loongarch/configure > new file mode 100644 > index 0000000000..54ccd1528e > --- /dev/null > +++ b/sysdeps/unix/sysv/linux/loongarch/configure > @@ -0,0 +1,174 @@ > +# This file is generated from configure.ac by Autoconf. DO NOT EDIT! > + # Local configure fragment for sysdeps/unix/sysv/linux/loongarch. > + > +arch_minimum_kernel=5.19.0 > + > +libc_cv_loongarch_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_loongarch_int_abi=lp64 > +fi > +rm -f conftest* > + > +if test $libc_cv_loongarch_int_abi = no; then > + as_fn_error $? "Unable to determine integer ABI" "$LINENO" 5 > +fi > + > +config_vars="$config_vars > +default-abi = $libc_cv_loongarch_int_abi" > + > +case $libc_cv_loongarch_int_abi in > +lp64) > + test -n "$libc_cv_slibdir" || > +case "$prefix" in > +/usr | /usr/) > + libc_cv_slibdir='/lib64' > + libc_cv_rtlddir='/lib64' > + if test "$libdir" = '${exec_prefix}/lib'; then > + libdir='${exec_prefix}/lib64'; > + # 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/loongarch/ldd-rewrite.sed > diff --git a/sysdeps/unix/sysv/linux/loongarch/configure.ac b/sysdeps/unix/sysv/linux/loongarch/configure.ac > new file mode 100644 > index 0000000000..07da5eed76 > --- /dev/null > +++ b/sysdeps/unix/sysv/linux/loongarch/configure.ac > @@ -0,0 +1,22 @@ > +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/loongarch. > + > +arch_minimum_kernel=5.19.0 > + > +libc_cv_loongarch_int_abi=no > +AC_EGREP_CPP(4 8 8, [__SIZEOF_INT__ __SIZEOF_LONG__ __SIZEOF_POINTER__ > + ], libc_cv_loongarch_int_abi=lp64) > +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]) > + > +case $libc_cv_loongarch_int_abi in > +lp64) > + LIBC_SLIBDIR_RTLDDIR([lib64], [lib64]) > + ;; > +esac > + > +ldd_rewrite_script=sysdeps/unix/sysv/linux/loongarch/ldd-rewrite.sed > diff --git a/sysdeps/unix/sysv/linux/loongarch/ldd-rewrite.sed b/sysdeps/unix/sysv/linux/loongarch/ldd-rewrite.sed > new file mode 100644 > index 0000000000..d42a13e08c > --- /dev/null > +++ b/sysdeps/unix/sysv/linux/loongarch/ldd-rewrite.sed > @@ -0,0 +1,3 @@ > +/LD_TRACE_LOADED_OBJECTS=1/a\ > +add_env="$add_env LD_LIBRARY_VERSION=\\$verify_out" This LD_LIBRARY_VERSION is not supported anymore (I forgot to remove them from ldd-rewrite.sed files). > +s_^\(RTLDLIST=\)\(.*lib\)\(\|64\|32\)\(/[^/]*\)\(-loongarch\)\(64\|32\)\(\.so\.[0-9.]*\)[[:blank:]]*$_\1"\2\4\7 \264\4-loongarch64\7 \232\4-loongarch32\7"_ > diff --git a/sysdeps/unix/sysv/linux/loongarch/lp64/Implies b/sysdeps/unix/sysv/linux/loongarch/lp64/Implies > new file mode 100644 > index 0000000000..117c2b8efe > --- /dev/null > +++ b/sysdeps/unix/sysv/linux/loongarch/lp64/Implies > @@ -0,0 +1,3 @@ > +unix/sysv/linux/loongarch > +unix/sysv/linux/generic > +unix/sysv/linux/wordsize-64 > diff --git a/sysdeps/unix/sysv/linux/loongarch/shlib-versions b/sysdeps/unix/sysv/linux/loongarch/shlib-versions > new file mode 100644 > index 0000000000..dc2220b4be > --- /dev/null > +++ b/sysdeps/unix/sysv/linux/loongarch/shlib-versions > @@ -0,0 +1,7 @@ > +DEFAULT GLIBC_2.36 > + > +%if LOONGARCH_ABI_GRLEN == 64 && LOONGARCH_ABI_FRLEN == 64 > +ld=ld-linux-loongarch-lp64d.so.1 > +%else > +%error cannot determine ABI > +%endif
diff --git a/sysdeps/loongarch/nptl/Makefile b/sysdeps/loongarch/nptl/Makefile new file mode 100644 index 0000000000..e73bbf3e21 --- /dev/null +++ b/sysdeps/loongarch/nptl/Makefile @@ -0,0 +1,21 @@ +# Makefile for sysdeps/loongarch/nptl. +# Copyright (C) 2022 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 +#<https://www.gnu.org/licenses/>. + +ifeq ($(subdir),csu) +gen-as-const-headers += tcb-offsets.sym +endif loongarch does not need this header (you can build glibc if you remove it). *OK, **sysdeps/loongarch/nptl/Makefile and **tcb-offsets.sym removed.* diff --git a/sysdeps/unix/sysv/linux/loongarch/ldd-rewrite.sed b/sysdeps/unix/sysv/linux/loongarch/ldd-rewrite.sed new file mode 100644 index 0000000000..d42a13e08c --- /dev/null +++ b/sysdeps/unix/sysv/linux/loongarch/ldd-rewrite.sed @@ -0,0 +1,3 @@ +/LD_TRACE_LOADED_OBJECTS=1/a\ +add_env="$add_env LD_LIBRARY_VERSION=\\$verify_out" This LD_LIBRARY_VERSION is not supported anymore (I forgot to remove them from ldd-rewrite.sed files). *OK, removed. Thanks. * *>>>>>>>>>>>>> diff --git a/sysdeps/unix/sysv/linux/loongarch/ldd-rewrite.sed b/sysdeps/unix/sysv/linux/loongarch/ldd-rewrite.sed index d42a13e08c..f8976fd239 100644 --- a/sysdeps/unix/sysv/linux/loongarch/ldd-rewrite.sed +++ b/sysdeps/unix/sysv/linux/loongarch/ldd-rewrite.sed @@ -1,3 +1 @@ -/LD_TRACE_LOADED_OBJECTS=1/a\ -add_env="$add_env LD_LIBRARY_VERSION=\\$verify_out" s_^\(RTLDLIST=\)\(.*lib\)\(\|64\|32\)\(/[^/]*\)\(-loongarch\)\(64\|32\)\(\.so\.[0-9.]*\)[[:blank:]]*$_\1"\2\4\7 \264\4-loongarch64\7 \232\4-loongarch32\7"_ <<<<<<<<<<<<<<<<<<<<<<<* 在 2022/7/14 上午1:48, Adhemerval Zanella Netto 写道: > Looks ok, some comments below. > > On 08/07/22 03:52, caiyinyu wrote: >> --- >> sysdeps/loongarch/Implies | 3 + >> sysdeps/loongarch/Makefile | 15 ++ >> sysdeps/loongarch/configure | 5 + >> sysdeps/loongarch/configure.ac | 6 + >> sysdeps/loongarch/lp64/Implies-after | 1 + >> sysdeps/loongarch/nptl/Makefile | 21 +++ >> sysdeps/loongarch/preconfigure | 52 ++++++ >> sysdeps/loongarch/preconfigure.ac | 46 +++++ >> sysdeps/loongarch/sys/regdef.h | 93 ++++++++++ >> sysdeps/unix/sysv/linux/loongarch/Implies | 1 + >> sysdeps/unix/sysv/linux/loongarch/Makefile | 4 + >> sysdeps/unix/sysv/linux/loongarch/configure | 174 ++++++++++++++++++ >> .../unix/sysv/linux/loongarch/configure.ac | 22 +++ >> .../unix/sysv/linux/loongarch/ldd-rewrite.sed | 3 + >> .../unix/sysv/linux/loongarch/lp64/Implies | 3 + >> .../unix/sysv/linux/loongarch/shlib-versions | 7 + >> 16 files changed, 456 insertions(+) >> create mode 100644 sysdeps/loongarch/Implies >> create mode 100644 sysdeps/loongarch/Makefile >> create mode 100644 sysdeps/loongarch/configure >> create mode 100644 sysdeps/loongarch/configure.ac >> create mode 100644 sysdeps/loongarch/lp64/Implies-after >> create mode 100644 sysdeps/loongarch/nptl/Makefile >> create mode 100644 sysdeps/loongarch/preconfigure >> create mode 100644 sysdeps/loongarch/preconfigure.ac >> create mode 100644 sysdeps/loongarch/sys/regdef.h >> create mode 100644 sysdeps/unix/sysv/linux/loongarch/Implies >> create mode 100644 sysdeps/unix/sysv/linux/loongarch/Makefile >> create mode 100644 sysdeps/unix/sysv/linux/loongarch/configure >> create mode 100644 sysdeps/unix/sysv/linux/loongarch/configure.ac >> create mode 100644 sysdeps/unix/sysv/linux/loongarch/ldd-rewrite.sed >> create mode 100644 sysdeps/unix/sysv/linux/loongarch/lp64/Implies >> create mode 100644 sysdeps/unix/sysv/linux/loongarch/shlib-versions >> >> diff --git a/sysdeps/loongarch/Implies b/sysdeps/loongarch/Implies >> new file mode 100644 >> index 0000000000..1945b1f4bb >> --- /dev/null >> +++ b/sysdeps/loongarch/Implies >> @@ -0,0 +1,3 @@ >> +ieee754/ldbl-128 >> +ieee754/dbl-64 >> +ieee754/flt-32 >> diff --git a/sysdeps/loongarch/Makefile b/sysdeps/loongarch/Makefile >> new file mode 100644 >> index 0000000000..41c3449670 >> --- /dev/null >> +++ b/sysdeps/loongarch/Makefile >> @@ -0,0 +1,15 @@ >> +ifeq ($(subdir),misc) >> +sysdep_headers += sys/asm.h >> +endif >> + >> +# LoongArch's assembler also needs to know about PIC as it changes the >> +# definition of some assembler macros. >> +ASFLAGS-.os += $(pic-ccflag) >> + >> +abi-variants := lp64 >> + >> +ifeq (,$(filter $(default-abi),$(abi-variants))) >> +$(error Unknown ABI $(default-abi), must be one of $(abi-variants)) >> +endif >> + >> +abi-lp64-condition := defined __loongarch_lp64 >> diff --git a/sysdeps/loongarch/configure b/sysdeps/loongarch/configure >> new file mode 100644 >> index 0000000000..43b54d4965 >> --- /dev/null >> +++ b/sysdeps/loongarch/configure >> @@ -0,0 +1,5 @@ >> +# This file is generated from configure.ac by Autoconf. DO NOT EDIT! >> + # Local configure fragment for sysdeps/loongarch/elf. >> + >> +$as_echo "#define HIDDEN_VAR_NEEDS_DYNAMIC_RELOC 1" >>confdefs.h >> + >> diff --git a/sysdeps/loongarch/configure.ac b/sysdeps/loongarch/configure.ac >> new file mode 100644 >> index 0000000000..f744367bf3 >> --- /dev/null >> +++ b/sysdeps/loongarch/configure.ac >> @@ -0,0 +1,6 @@ >> +GLIBC_PROVIDES dnl See aclocal.m4 in the top level source directory. >> +# Local configure fragment for sysdeps/loongarch/elf. >> + >> +dnl It is always possible to access static and hidden symbols in an >> +dnl position independent way. >> +AC_DEFINE(HIDDEN_VAR_NEEDS_DYNAMIC_RELOC) >> diff --git a/sysdeps/loongarch/lp64/Implies-after b/sysdeps/loongarch/lp64/Implies-after >> new file mode 100644 >> index 0000000000..a8cae95f9d >> --- /dev/null >> +++ b/sysdeps/loongarch/lp64/Implies-after >> @@ -0,0 +1 @@ >> +wordsize-64 >> diff --git a/sysdeps/loongarch/nptl/Makefile b/sysdeps/loongarch/nptl/Makefile >> new file mode 100644 >> index 0000000000..e73bbf3e21 >> --- /dev/null >> +++ b/sysdeps/loongarch/nptl/Makefile >> @@ -0,0 +1,21 @@ >> +# Makefile for sysdeps/loongarch/nptl. >> +# Copyright (C) 2022 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 >> +#<https://www.gnu.org/licenses/>. >> + >> +ifeq ($(subdir),csu) >> +gen-as-const-headers += tcb-offsets.sym >> +endif > loongarch does not need this header (you can build glibc if you remove it). > >> diff --git a/sysdeps/loongarch/preconfigure b/sysdeps/loongarch/preconfigure >> new file mode 100644 >> index 0000000000..489af6f0b7 >> --- /dev/null >> +++ b/sysdeps/loongarch/preconfigure >> @@ -0,0 +1,52 @@ >> +# This file is generated from configure.ac by Autoconf. DO NOT EDIT! >> +# Local preconfigure fragment for sysdeps/loongarch >> + >> +case "$machine" in >> +loongarch*) >> + >> + grlen=`$CC $CFLAGS $CPPFLAGS -E -dM -xc /dev/null | sed -n 's/^#define __loongarch_grlen \(.*\)/\1/p'` >> + float_abi=`$CC $CFLAGS $CPPFLAGS -E -dM -xc /dev/null | sed -n 's/^#define __loongarch_\(soft\|single\|double\)_float.*/\1/p'` >> + >> + with_fp_cond="!defined __loongarch_soft_float" >> + >> + case "$float_abi" in >> + soft) >> + abi_flen=0 >> + as_fn_error 1 "loongarch does not yet support soft floating-point ABI!!" "$LINENO" 5 >> + ;; >> + single) >> + as_fn_error 1 "glibc does not yet support the single floating-point ABI!!" "$LINENO" 5 >> + ;; >> + double) >> + abi_flen=64 >> + ;; >> + *) >> + as_fn_error 1 "Unable to determine floating-point ABI!!" "$LINENO" 5 >> + ;; >> + esac >> + >> + case "$grlen" in >> + 32) >> + as_fn_error 1 "loongarch does not yet support ilp32 ABI!!" "$LINENO" 5 >> + ;; >> + 64) >> + machine=loongarch/lp64 >> + ;; >> + *) >> + as_fn_error 1 "Unable to determine GRLEN!!" "$LINENO" 5 >> + ;; >> + esac >> + >> + cat >>confdefs.h <<_ACEOF >> +#define LOONGARCH_ABI_GRLEN $grlen >> +_ACEOF >> + >> + cat >>confdefs.h <<_ACEOF >> +#define LOONGARCH_ABI_FRLEN $abi_flen >> +_ACEOF >> + >> + >> + base_machine=loongarch >> + ;; >> +esac >> + >> diff --git a/sysdeps/loongarch/preconfigure.ac b/sysdeps/loongarch/preconfigure.ac >> new file mode 100644 >> index 0000000000..8eb94e9efe >> --- /dev/null >> +++ b/sysdeps/loongarch/preconfigure.ac >> @@ -0,0 +1,46 @@ >> +GLIBC_PROVIDES[]dnl See aclocal.m4 in the top level source directory. >> +# Local preconfigure fragment for sysdeps/loongarch >> + >> +case "$machine" in >> +loongarch*) >> + >> + grlen=`$CC $CFLAGS $CPPFLAGS -E -dM -xc /dev/null | sed -n 's/^#define __loongarch_grlen \(.*\)/\1/p'` >> + float_abi=`$CC $CFLAGS $CPPFLAGS -E -dM -xc /dev/null | sed -n 's/^#define __loongarch_\(soft\|single\|double\)_float.*/\1/p'` >> + >> + with_fp_cond="!defined __loongarch_soft_float" >> + >> + case "$float_abi" in >> + soft) >> + abi_flen=0 >> + AC_MSG_ERROR([loongarch does not yet support soft floating-point ABI!!], 1) >> + ;; >> + single) >> + AC_MSG_ERROR([glibc does not yet support the single floating-point ABI!!], 1) >> + ;; >> + double) >> + abi_flen=64 >> + ;; >> + *) >> + AC_MSG_ERROR([Unable to determine floating-point ABI!!], 1) >> + ;; >> + esac >> + >> + case "$grlen" in >> + 32) >> + AC_MSG_ERROR([loongarch does not yet support ilp32 ABI!!], 1) >> + ;; >> + 64) >> + machine=loongarch/lp64 >> + ;; >> + *) >> + AC_MSG_ERROR([Unable to determine GRLEN!!], 1) >> + ;; >> + esac >> + >> + AC_DEFINE_UNQUOTED([LOONGARCH_ABI_GRLEN], [$grlen]) >> + AC_DEFINE_UNQUOTED([LOONGARCH_ABI_FRLEN], [$abi_flen]) >> + >> + base_machine=loongarch >> + ;; >> +esac >> + >> diff --git a/sysdeps/loongarch/sys/regdef.h b/sysdeps/loongarch/sys/regdef.h >> new file mode 100644 >> index 0000000000..d266df372d >> --- /dev/null >> +++ b/sysdeps/loongarch/sys/regdef.h >> @@ -0,0 +1,93 @@ >> +/* Register Macro definitions >> + Copyright (C) 2022 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 >> +<https://www.gnu.org/licenses/>. */ >> + >> +#ifndef _SYS_REGDEF_H >> +#define _SYS_REGDEF_H >> + >> +#define zero $r0 >> +#define ra $r1 >> +#define tp $r2 >> +#define sp $r3 >> +#define a0 $r4 >> +#define a1 $r5 >> +#define a2 $r6 >> +#define a3 $r7 >> +#define a4 $r8 >> +#define a5 $r9 >> +#define a6 $r10 >> +#define a7 $r11 >> +#define v0 $r4 >> +#define v1 $r5 >> +#define t0 $r12 >> +#define t1 $r13 >> +#define t2 $r14 >> +#define t3 $r15 >> +#define t4 $r16 >> +#define t5 $r17 >> +#define t6 $r18 >> +#define t7 $r19 >> +#define t8 $r20 >> +#define x $r21 >> +#define fp $r22 >> +#define s0 $r23 >> +#define s1 $r24 >> +#define s2 $r25 >> +#define s3 $r26 >> +#define s4 $r27 >> +#define s5 $r28 >> +#define s6 $r29 >> +#define s7 $r30 >> +#define s8 $r31 >> + >> +#define fa0 $f0 >> +#define fa1 $f1 >> +#define fa2 $f2 >> +#define fa3 $f3 >> +#define fa4 $f4 >> +#define fa5 $f5 >> +#define fa6 $f6 >> +#define fa7 $f7 >> +#define fv0 $f0 >> +#define fv1 $f1 >> +#define ft0 $f8 >> +#define ft1 $f9 >> +#define ft2 $f10 >> +#define ft3 $f11 >> +#define ft4 $f12 >> +#define ft5 $f13 >> +#define ft6 $f14 >> +#define ft7 $f15 >> +#define ft8 $f16 >> +#define ft9 $f17 >> +#define ft10 $f18 >> +#define ft11 $f19 >> +#define ft12 $f20 >> +#define ft13 $f21 >> +#define ft14 $f22 >> +#define ft15 $f23 >> +#define fs0 $f24 >> +#define fs1 $f25 >> +#define fs2 $f26 >> +#define fs3 $f27 >> +#define fs4 $f28 >> +#define fs5 $f29 >> +#define fs6 $f30 >> +#define fs7 $f31 >> + >> +#endif /* _SYS_REGDEF_H */ >> diff --git a/sysdeps/unix/sysv/linux/loongarch/Implies b/sysdeps/unix/sysv/linux/loongarch/Implies >> new file mode 100644 >> index 0000000000..e52b1ac310 >> --- /dev/null >> +++ b/sysdeps/unix/sysv/linux/loongarch/Implies >> @@ -0,0 +1 @@ >> +loongarch/nptl >> diff --git a/sysdeps/unix/sysv/linux/loongarch/Makefile b/sysdeps/unix/sysv/linux/loongarch/Makefile >> new file mode 100644 >> index 0000000000..730bfa7465 >> --- /dev/null >> +++ b/sysdeps/unix/sysv/linux/loongarch/Makefile >> @@ -0,0 +1,4 @@ >> +ifeq ($(subdir),stdlib) >> +gen-as-const-headers += ucontext_i.sym >> +endif >> + >> diff --git a/sysdeps/unix/sysv/linux/loongarch/configure b/sysdeps/unix/sysv/linux/loongarch/configure >> new file mode 100644 >> index 0000000000..54ccd1528e >> --- /dev/null >> +++ b/sysdeps/unix/sysv/linux/loongarch/configure >> @@ -0,0 +1,174 @@ >> +# This file is generated from configure.ac by Autoconf. DO NOT EDIT! >> + # Local configure fragment for sysdeps/unix/sysv/linux/loongarch. >> + >> +arch_minimum_kernel=5.19.0 >> + >> +libc_cv_loongarch_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_loongarch_int_abi=lp64 >> +fi >> +rm -f conftest* >> + >> +if test $libc_cv_loongarch_int_abi = no; then >> + as_fn_error $? "Unable to determine integer ABI" "$LINENO" 5 >> +fi >> + >> +config_vars="$config_vars >> +default-abi = $libc_cv_loongarch_int_abi" >> + >> +case $libc_cv_loongarch_int_abi in >> +lp64) >> + test -n "$libc_cv_slibdir" || >> +case "$prefix" in >> +/usr | /usr/) >> + libc_cv_slibdir='/lib64' >> + libc_cv_rtlddir='/lib64' >> + if test "$libdir" = '${exec_prefix}/lib'; then >> + libdir='${exec_prefix}/lib64'; >> + # 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/loongarch/ldd-rewrite.sed >> diff --git a/sysdeps/unix/sysv/linux/loongarch/configure.ac b/sysdeps/unix/sysv/linux/loongarch/configure.ac >> new file mode 100644 >> index 0000000000..07da5eed76 >> --- /dev/null >> +++ b/sysdeps/unix/sysv/linux/loongarch/configure.ac >> @@ -0,0 +1,22 @@ >> +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/loongarch. >> + >> +arch_minimum_kernel=5.19.0 >> + >> +libc_cv_loongarch_int_abi=no >> +AC_EGREP_CPP(4 8 8, [__SIZEOF_INT__ __SIZEOF_LONG__ __SIZEOF_POINTER__ >> + ], libc_cv_loongarch_int_abi=lp64) >> +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]) >> + >> +case $libc_cv_loongarch_int_abi in >> +lp64) >> + LIBC_SLIBDIR_RTLDDIR([lib64], [lib64]) >> + ;; >> +esac >> + >> +ldd_rewrite_script=sysdeps/unix/sysv/linux/loongarch/ldd-rewrite.sed >> diff --git a/sysdeps/unix/sysv/linux/loongarch/ldd-rewrite.sed b/sysdeps/unix/sysv/linux/loongarch/ldd-rewrite.sed >> new file mode 100644 >> index 0000000000..d42a13e08c >> --- /dev/null >> +++ b/sysdeps/unix/sysv/linux/loongarch/ldd-rewrite.sed >> @@ -0,0 +1,3 @@ >> +/LD_TRACE_LOADED_OBJECTS=1/a\ >> +add_env="$add_env LD_LIBRARY_VERSION=\\$verify_out" > This LD_LIBRARY_VERSION is not supported anymore (I forgot to remove them > from ldd-rewrite.sed files). > >> +s_^\(RTLDLIST=\)\(.*lib\)\(\|64\|32\)\(/[^/]*\)\(-loongarch\)\(64\|32\)\(\.so\.[0-9.]*\)[[:blank:]]*$_\1"\2\4\7 \264\4-loongarch64\7 \232\4-loongarch32\7"_ >> diff --git a/sysdeps/unix/sysv/linux/loongarch/lp64/Implies b/sysdeps/unix/sysv/linux/loongarch/lp64/Implies >> new file mode 100644 >> index 0000000000..117c2b8efe >> --- /dev/null >> +++ b/sysdeps/unix/sysv/linux/loongarch/lp64/Implies >> @@ -0,0 +1,3 @@ >> +unix/sysv/linux/loongarch >> +unix/sysv/linux/generic >> +unix/sysv/linux/wordsize-64 >> diff --git a/sysdeps/unix/sysv/linux/loongarch/shlib-versions b/sysdeps/unix/sysv/linux/loongarch/shlib-versions >> new file mode 100644 >> index 0000000000..dc2220b4be >> --- /dev/null >> +++ b/sysdeps/unix/sysv/linux/loongarch/shlib-versions >> @@ -0,0 +1,7 @@ >> +DEFAULT GLIBC_2.36 >> + >> +%if LOONGARCH_ABI_GRLEN == 64 && LOONGARCH_ABI_FRLEN == 64 >> +ld=ld-linux-loongarch-lp64d.so.1 >> +%else >> +%error cannot determine ABI >> +%endif
diff --git a/sysdeps/loongarch/Implies b/sysdeps/loongarch/Implies new file mode 100644 index 0000000000..1945b1f4bb --- /dev/null +++ b/sysdeps/loongarch/Implies @@ -0,0 +1,3 @@ +ieee754/ldbl-128 +ieee754/dbl-64 +ieee754/flt-32 diff --git a/sysdeps/loongarch/Makefile b/sysdeps/loongarch/Makefile new file mode 100644 index 0000000000..41c3449670 --- /dev/null +++ b/sysdeps/loongarch/Makefile @@ -0,0 +1,15 @@ +ifeq ($(subdir),misc) +sysdep_headers += sys/asm.h +endif + +# LoongArch's assembler also needs to know about PIC as it changes the +# definition of some assembler macros. +ASFLAGS-.os += $(pic-ccflag) + +abi-variants := lp64 + +ifeq (,$(filter $(default-abi),$(abi-variants))) +$(error Unknown ABI $(default-abi), must be one of $(abi-variants)) +endif + +abi-lp64-condition := defined __loongarch_lp64 diff --git a/sysdeps/loongarch/configure b/sysdeps/loongarch/configure new file mode 100644 index 0000000000..43b54d4965 --- /dev/null +++ b/sysdeps/loongarch/configure @@ -0,0 +1,5 @@ +# This file is generated from configure.ac by Autoconf. DO NOT EDIT! + # Local configure fragment for sysdeps/loongarch/elf. + +$as_echo "#define HIDDEN_VAR_NEEDS_DYNAMIC_RELOC 1" >>confdefs.h + diff --git a/sysdeps/loongarch/configure.ac b/sysdeps/loongarch/configure.ac new file mode 100644 index 0000000000..f744367bf3 --- /dev/null +++ b/sysdeps/loongarch/configure.ac @@ -0,0 +1,6 @@ +GLIBC_PROVIDES dnl See aclocal.m4 in the top level source directory. +# Local configure fragment for sysdeps/loongarch/elf. + +dnl It is always possible to access static and hidden symbols in an +dnl position independent way. +AC_DEFINE(HIDDEN_VAR_NEEDS_DYNAMIC_RELOC) diff --git a/sysdeps/loongarch/lp64/Implies-after b/sysdeps/loongarch/lp64/Implies-after new file mode 100644 index 0000000000..a8cae95f9d --- /dev/null +++ b/sysdeps/loongarch/lp64/Implies-after @@ -0,0 +1 @@ +wordsize-64 diff --git a/sysdeps/loongarch/nptl/Makefile b/sysdeps/loongarch/nptl/Makefile new file mode 100644 index 0000000000..e73bbf3e21 --- /dev/null +++ b/sysdeps/loongarch/nptl/Makefile @@ -0,0 +1,21 @@ +# Makefile for sysdeps/loongarch/nptl. +# Copyright (C) 2022 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 +# <https://www.gnu.org/licenses/>. + +ifeq ($(subdir),csu) +gen-as-const-headers += tcb-offsets.sym +endif diff --git a/sysdeps/loongarch/preconfigure b/sysdeps/loongarch/preconfigure new file mode 100644 index 0000000000..489af6f0b7 --- /dev/null +++ b/sysdeps/loongarch/preconfigure @@ -0,0 +1,52 @@ +# This file is generated from configure.ac by Autoconf. DO NOT EDIT! +# Local preconfigure fragment for sysdeps/loongarch + +case "$machine" in +loongarch*) + + grlen=`$CC $CFLAGS $CPPFLAGS -E -dM -xc /dev/null | sed -n 's/^#define __loongarch_grlen \(.*\)/\1/p'` + float_abi=`$CC $CFLAGS $CPPFLAGS -E -dM -xc /dev/null | sed -n 's/^#define __loongarch_\(soft\|single\|double\)_float.*/\1/p'` + + with_fp_cond="!defined __loongarch_soft_float" + + case "$float_abi" in + soft) + abi_flen=0 + as_fn_error 1 "loongarch does not yet support soft floating-point ABI!!" "$LINENO" 5 + ;; + single) + as_fn_error 1 "glibc does not yet support the single floating-point ABI!!" "$LINENO" 5 + ;; + double) + abi_flen=64 + ;; + *) + as_fn_error 1 "Unable to determine floating-point ABI!!" "$LINENO" 5 + ;; + esac + + case "$grlen" in + 32) + as_fn_error 1 "loongarch does not yet support ilp32 ABI!!" "$LINENO" 5 + ;; + 64) + machine=loongarch/lp64 + ;; + *) + as_fn_error 1 "Unable to determine GRLEN!!" "$LINENO" 5 + ;; + esac + + cat >>confdefs.h <<_ACEOF +#define LOONGARCH_ABI_GRLEN $grlen +_ACEOF + + cat >>confdefs.h <<_ACEOF +#define LOONGARCH_ABI_FRLEN $abi_flen +_ACEOF + + + base_machine=loongarch + ;; +esac + diff --git a/sysdeps/loongarch/preconfigure.ac b/sysdeps/loongarch/preconfigure.ac new file mode 100644 index 0000000000..8eb94e9efe --- /dev/null +++ b/sysdeps/loongarch/preconfigure.ac @@ -0,0 +1,46 @@ +GLIBC_PROVIDES[]dnl See aclocal.m4 in the top level source directory. +# Local preconfigure fragment for sysdeps/loongarch + +case "$machine" in +loongarch*) + + grlen=`$CC $CFLAGS $CPPFLAGS -E -dM -xc /dev/null | sed -n 's/^#define __loongarch_grlen \(.*\)/\1/p'` + float_abi=`$CC $CFLAGS $CPPFLAGS -E -dM -xc /dev/null | sed -n 's/^#define __loongarch_\(soft\|single\|double\)_float.*/\1/p'` + + with_fp_cond="!defined __loongarch_soft_float" + + case "$float_abi" in + soft) + abi_flen=0 + AC_MSG_ERROR([loongarch does not yet support soft floating-point ABI!!], 1) + ;; + single) + AC_MSG_ERROR([glibc does not yet support the single floating-point ABI!!], 1) + ;; + double) + abi_flen=64 + ;; + *) + AC_MSG_ERROR([Unable to determine floating-point ABI!!], 1) + ;; + esac + + case "$grlen" in + 32) + AC_MSG_ERROR([loongarch does not yet support ilp32 ABI!!], 1) + ;; + 64) + machine=loongarch/lp64 + ;; + *) + AC_MSG_ERROR([Unable to determine GRLEN!!], 1) + ;; + esac + + AC_DEFINE_UNQUOTED([LOONGARCH_ABI_GRLEN], [$grlen]) + AC_DEFINE_UNQUOTED([LOONGARCH_ABI_FRLEN], [$abi_flen]) + + base_machine=loongarch + ;; +esac + diff --git a/sysdeps/loongarch/sys/regdef.h b/sysdeps/loongarch/sys/regdef.h new file mode 100644 index 0000000000..d266df372d --- /dev/null +++ b/sysdeps/loongarch/sys/regdef.h @@ -0,0 +1,93 @@ +/* Register Macro definitions + Copyright (C) 2022 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 + <https://www.gnu.org/licenses/>. */ + +#ifndef _SYS_REGDEF_H +#define _SYS_REGDEF_H + +#define zero $r0 +#define ra $r1 +#define tp $r2 +#define sp $r3 +#define a0 $r4 +#define a1 $r5 +#define a2 $r6 +#define a3 $r7 +#define a4 $r8 +#define a5 $r9 +#define a6 $r10 +#define a7 $r11 +#define v0 $r4 +#define v1 $r5 +#define t0 $r12 +#define t1 $r13 +#define t2 $r14 +#define t3 $r15 +#define t4 $r16 +#define t5 $r17 +#define t6 $r18 +#define t7 $r19 +#define t8 $r20 +#define x $r21 +#define fp $r22 +#define s0 $r23 +#define s1 $r24 +#define s2 $r25 +#define s3 $r26 +#define s4 $r27 +#define s5 $r28 +#define s6 $r29 +#define s7 $r30 +#define s8 $r31 + +#define fa0 $f0 +#define fa1 $f1 +#define fa2 $f2 +#define fa3 $f3 +#define fa4 $f4 +#define fa5 $f5 +#define fa6 $f6 +#define fa7 $f7 +#define fv0 $f0 +#define fv1 $f1 +#define ft0 $f8 +#define ft1 $f9 +#define ft2 $f10 +#define ft3 $f11 +#define ft4 $f12 +#define ft5 $f13 +#define ft6 $f14 +#define ft7 $f15 +#define ft8 $f16 +#define ft9 $f17 +#define ft10 $f18 +#define ft11 $f19 +#define ft12 $f20 +#define ft13 $f21 +#define ft14 $f22 +#define ft15 $f23 +#define fs0 $f24 +#define fs1 $f25 +#define fs2 $f26 +#define fs3 $f27 +#define fs4 $f28 +#define fs5 $f29 +#define fs6 $f30 +#define fs7 $f31 + +#endif /* _SYS_REGDEF_H */ diff --git a/sysdeps/unix/sysv/linux/loongarch/Implies b/sysdeps/unix/sysv/linux/loongarch/Implies new file mode 100644 index 0000000000..e52b1ac310 --- /dev/null +++ b/sysdeps/unix/sysv/linux/loongarch/Implies @@ -0,0 +1 @@ +loongarch/nptl diff --git a/sysdeps/unix/sysv/linux/loongarch/Makefile b/sysdeps/unix/sysv/linux/loongarch/Makefile new file mode 100644 index 0000000000..730bfa7465 --- /dev/null +++ b/sysdeps/unix/sysv/linux/loongarch/Makefile @@ -0,0 +1,4 @@ +ifeq ($(subdir),stdlib) +gen-as-const-headers += ucontext_i.sym +endif + diff --git a/sysdeps/unix/sysv/linux/loongarch/configure b/sysdeps/unix/sysv/linux/loongarch/configure new file mode 100644 index 0000000000..54ccd1528e --- /dev/null +++ b/sysdeps/unix/sysv/linux/loongarch/configure @@ -0,0 +1,174 @@ +# This file is generated from configure.ac by Autoconf. DO NOT EDIT! + # Local configure fragment for sysdeps/unix/sysv/linux/loongarch. + +arch_minimum_kernel=5.19.0 + +libc_cv_loongarch_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_loongarch_int_abi=lp64 +fi +rm -f conftest* + +if test $libc_cv_loongarch_int_abi = no; then + as_fn_error $? "Unable to determine integer ABI" "$LINENO" 5 +fi + +config_vars="$config_vars +default-abi = $libc_cv_loongarch_int_abi" + +case $libc_cv_loongarch_int_abi in +lp64) + test -n "$libc_cv_slibdir" || +case "$prefix" in +/usr | /usr/) + libc_cv_slibdir='/lib64' + libc_cv_rtlddir='/lib64' + if test "$libdir" = '${exec_prefix}/lib'; then + libdir='${exec_prefix}/lib64'; + # 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/loongarch/ldd-rewrite.sed diff --git a/sysdeps/unix/sysv/linux/loongarch/configure.ac b/sysdeps/unix/sysv/linux/loongarch/configure.ac new file mode 100644 index 0000000000..07da5eed76 --- /dev/null +++ b/sysdeps/unix/sysv/linux/loongarch/configure.ac @@ -0,0 +1,22 @@ +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/loongarch. + +arch_minimum_kernel=5.19.0 + +libc_cv_loongarch_int_abi=no +AC_EGREP_CPP(4 8 8, [__SIZEOF_INT__ __SIZEOF_LONG__ __SIZEOF_POINTER__ + ], libc_cv_loongarch_int_abi=lp64) +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]) + +case $libc_cv_loongarch_int_abi in +lp64) + LIBC_SLIBDIR_RTLDDIR([lib64], [lib64]) + ;; +esac + +ldd_rewrite_script=sysdeps/unix/sysv/linux/loongarch/ldd-rewrite.sed diff --git a/sysdeps/unix/sysv/linux/loongarch/ldd-rewrite.sed b/sysdeps/unix/sysv/linux/loongarch/ldd-rewrite.sed new file mode 100644 index 0000000000..d42a13e08c --- /dev/null +++ b/sysdeps/unix/sysv/linux/loongarch/ldd-rewrite.sed @@ -0,0 +1,3 @@ +/LD_TRACE_LOADED_OBJECTS=1/a\ +add_env="$add_env LD_LIBRARY_VERSION=\\$verify_out" +s_^\(RTLDLIST=\)\(.*lib\)\(\|64\|32\)\(/[^/]*\)\(-loongarch\)\(64\|32\)\(\.so\.[0-9.]*\)[[:blank:]]*$_\1"\2\4\7 \264\4-loongarch64\7 \232\4-loongarch32\7"_ diff --git a/sysdeps/unix/sysv/linux/loongarch/lp64/Implies b/sysdeps/unix/sysv/linux/loongarch/lp64/Implies new file mode 100644 index 0000000000..117c2b8efe --- /dev/null +++ b/sysdeps/unix/sysv/linux/loongarch/lp64/Implies @@ -0,0 +1,3 @@ +unix/sysv/linux/loongarch +unix/sysv/linux/generic +unix/sysv/linux/wordsize-64 diff --git a/sysdeps/unix/sysv/linux/loongarch/shlib-versions b/sysdeps/unix/sysv/linux/loongarch/shlib-versions new file mode 100644 index 0000000000..dc2220b4be --- /dev/null +++ b/sysdeps/unix/sysv/linux/loongarch/shlib-versions @@ -0,0 +1,7 @@ +DEFAULT GLIBC_2.36 + +%if LOONGARCH_ABI_GRLEN == 64 && LOONGARCH_ABI_FRLEN == 64 +ld=ld-linux-loongarch-lp64d.so.1 +%else +%error cannot determine ABI +%endif