diff mbox series

[v6,11/13] LoongArch: Build Infastructure

Message ID 20220708065255.2316410-12-caiyinyu@loongson.cn
State New
Headers show
Series GLIBC LoongArch PATCHES | expand

Commit Message

caiyinyu July 8, 2022, 6:52 a.m. UTC
---
 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

Comments

Xi Ruoyao July 13, 2022, 3:07 a.m. UTC | #1
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.
WANG Xuerui July 13, 2022, 3:43 a.m. UTC | #2
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.)
caiyinyu July 13, 2022, 7:51 a.m. UTC | #3
在 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
         ;;
      *)

<<<<<<
Adhemerval Zanella Netto July 13, 2022, 5:48 p.m. UTC | #4
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
caiyinyu July 15, 2022, 1:49 a.m. UTC | #5
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 mbox series

Patch

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