public inbox for libc-alpha@sourceware.org
 help / color / mirror / Atom feed
* [PATCH v3 00/13] GLIBC LoongArch PATCHES
@ 2022-04-15  1:31 caiyinyu
  2022-04-15  1:31 ` [PATCH v3 01/13] LoongArch: Update NEWS and README for the LoongArch port caiyinyu
                   ` (12 more replies)
  0 siblings, 13 replies; 21+ messages in thread
From: caiyinyu @ 2022-04-15  1:31 UTC (permalink / raw)
  To: libc-alpha, adhemerval.zanella; +Cc: joseph_myers, xuchenghua, caiyinyu


Hello, these are LoongArch patches v3, and we really need your futher suggestions:

LoongArch patches v1: https://sourceware.org/pipermail/libc-alpha/2021-August/130262.html
LoongArch patches v2: https://sourceware.org/pipermail/libc-alpha/2021-December/134811.html

LoongArch-Doc:  https://github.com/loongson/LoongArch-Documentation

We add new section: procedure calling convention.
https://loongson.github.io/LoongArch-Documentation/LoongArch-ELF-ABI-EN.html#_procedure_calling_convention

Source code:
linux:          https://github.com/loongson/linux/tree/loongarch-next
glibc:          https://github.com/loongson/glibc/tree/loongarch_2_36_upstream_v3

GCC and Binutils Loongarch parts have been into GNU Open Source community.
Loongarch kernal may be no problem on 5.19:
https://lore.kernel.org/linux-arch/20220319142759.1026237-1-chenhuacai@loongson.cn/T/#m9d06c1882053c313ced32eaddda61e2514c712e8
---------------------------------------------------------------------------
* Re: [PATCH V8 00/22] arch: Add basic LoongArch support
  2022-03-21 21:55     ` Arnd Bergmann
@ 2022-03-21 22:03       ` Linus Torvalds
  0 siblings, 0 replies; 46+ messages in thread
From: Linus Torvalds @ 2022-03-21 22:03 UTC (permalink / raw)
  To: Arnd Bergmann
  Cc: Huacai Chen, Andy Lutomirski, Thomas Gleixner, Peter Zijlstra,
        Andrew Morton, David Airlie, Jonathan Corbet, linux-arch,
        open list:DOCUMENTATION, Linux Kernel Mailing List, Xuefeng Li,
        Yanteng Si, Huacai Chen, Jiaxun Yang, Huacai Chen

On Mon, Mar 21, 2022 at 2:55 PM Arnd Bergmann <arnd@arndb.de> wrote:
>
> I can prepare a pull request when it gets to that, but I think the boot protocol
> should be fixed first, and that makes it 5.19 material.

Thanks. No problem on 5.19, it's not like I don't have enough pending
for this merge window already..

                 Linus
---------------------------------------------------------------------------

test result: all passed.

XPASS: conform/UNIX98/ndbm.h/linknamespace
XPASS: conform/XOPEN2K/ndbm.h/linknamespace
XPASS: conform/XOPEN2K8/ndbm.h/linknamespace
XPASS: conform/XPG42/ndbm.h/linknamespace
UNSUPPORTED: crypt/cert
UNSUPPORTED: elf/tst-env-setuid
UNSUPPORTED: elf/tst-env-setuid-tunables
XPASS: elf/tst-protected1a
XPASS: elf/tst-protected1b
UNSUPPORTED: elf/tst-valgrind-smoke
UNSUPPORTED: misc/tst-adjtimex
UNSUPPORTED: misc/tst-clock_adjtime
UNSUPPORTED: misc/tst-ntp_adjtime
UNSUPPORTED: misc/tst-pkey
UNSUPPORTED: misc/tst-rseq
UNSUPPORTED: misc/tst-rseq-disable
UNSUPPORTED: nptl/test-cond-printers
UNSUPPORTED: nptl/test-condattr-printers
UNSUPPORTED: nptl/test-mutex-printers
UNSUPPORTED: nptl/test-mutexattr-printers
UNSUPPORTED: nptl/test-rwlock-printers
UNSUPPORTED: nptl/test-rwlockattr-printers
UNSUPPORTED: nptl/tst-rseq-nptl
UNSUPPORTED: stdlib/tst-secure-getenv
UNSUPPORTED: time/tst-clock_settime
UNSUPPORTED: time/tst-settimeofday
Summary of test results:
   4543 PASS
     20 UNSUPPORTED
     12 XFAIL
      6 XPASS


caiyinyu (13):
  LoongArch: Update NEWS and README for the LoongArch port.
  LoongArch: Add LoongArch entries to config.h.in
  LoongArch: Add relocations and ELF flags to elf.h
  LoongArch: ABI Implementation
  LoongArch: Thread-Local Storage Support
  LoongArch: Generic <math.h> and soft-fp Routines
  LoongArch: Atomic and Locking Routines
  LoongArch: Linux Syscall Interface
  LoongArch: Linux ABI
  LoongArch: Add ABI Lists
  LoongArch: Build Infastructure
  LoongArch: Hard Float Support
  LoongArch: Update build-many-glibcs.py for the LoongArch Port.

 NEWS                                          |    9 +
 README                                        |    1 +
 config.h.in                                   |    6 +
 elf/elf.h                                     |   68 +-
 manual/math.texi                              |    2 +-
 scripts/build-many-glibcs.py                  |    5 +
 sysdeps/loongarch/Implies                     |    3 +
 sysdeps/loongarch/Makefile                    |   15 +
 sysdeps/loongarch/__longjmp.S                 |   52 +
 sysdeps/loongarch/abort-instr.h               |    2 +
 sysdeps/loongarch/bits/endianness.h           |   11 +
 sysdeps/loongarch/bits/fenv.h                 |   90 +
 sysdeps/loongarch/bits/link.h                 |   58 +
 sysdeps/loongarch/bits/setjmp.h               |   42 +
 sysdeps/loongarch/bsd-_setjmp.c               |    1 +
 sysdeps/loongarch/bsd-setjmp.c                |    1 +
 sysdeps/loongarch/configure                   |    4 +
 sysdeps/loongarch/configure.ac                |    6 +
 sysdeps/loongarch/dl-irel.h                   |   48 +
 sysdeps/loongarch/dl-machine.h                |  362 +++
 sysdeps/loongarch/dl-tls.h                    |   46 +
 sysdeps/loongarch/dl-trampoline.S             |   91 +
 sysdeps/loongarch/e_sqrtl.c                   |   38 +
 sysdeps/loongarch/fpu/fclrexcpt.c             |   46 +
 sysdeps/loongarch/fpu/fedisblxcpt.c           |   39 +
 sysdeps/loongarch/fpu/feenablxcpt.c           |   39 +
 sysdeps/loongarch/fpu/fegetenv.c              |   31 +
 sysdeps/loongarch/fpu/fegetexcept.c           |   32 +
 sysdeps/loongarch/fpu/fegetmode.c             |   27 +
 sysdeps/loongarch/fpu/fegetround.c            |   33 +
 sysdeps/loongarch/fpu/feholdexcpt.c           |   40 +
 sysdeps/loongarch/fpu/fenv_libc.h             |   30 +
 sysdeps/loongarch/fpu/fesetenv.c              |   42 +
 sysdeps/loongarch/fpu/fesetexcept.c           |   32 +
 sysdeps/loongarch/fpu/fesetmode.c             |   38 +
 sysdeps/loongarch/fpu/fesetround.c            |   44 +
 sysdeps/loongarch/fpu/feupdateenv.c           |   43 +
 sysdeps/loongarch/fpu/fgetexcptflg.c          |   38 +
 sysdeps/loongarch/fpu/fraiseexcpt.c           |   75 +
 sysdeps/loongarch/fpu/fsetexcptflg.c          |   41 +
 sysdeps/loongarch/fpu/ftestexcept.c           |   32 +
 .../loongarch/fpu/math-use-builtins-sqrt.h    |    4 +
 sysdeps/loongarch/fpu_control.h               |  102 +
 sysdeps/loongarch/hp-timing.h                 |   42 +
 sysdeps/loongarch/jmpbuf-offsets.h            |   22 +
 sysdeps/loongarch/jmpbuf-unwind.h             |   45 +
 sysdeps/loongarch/ldsodefs.h                  |   41 +
 sysdeps/loongarch/libc-tls.c                  |   32 +
 sysdeps/loongarch/linkmap.h                   |   22 +
 sysdeps/loongarch/lp64/Implies-after          |    1 +
 sysdeps/loongarch/lp64/libm-test-ulps         | 1412 +++++++++++
 sysdeps/loongarch/lp64/libm-test-ulps-name    |    1 +
 sysdeps/loongarch/machine-gmon.h              |   37 +
 sysdeps/loongarch/math_private.h              |  248 ++
 sysdeps/loongarch/nptl/Makefile               |   21 +
 sysdeps/loongarch/nptl/pthreaddef.h           |   32 +
 sysdeps/loongarch/nptl/tcb-offsets.sym        |    6 +
 sysdeps/loongarch/nptl/tls.h                  |  138 ++
 sysdeps/loongarch/preconfigure                |   47 +
 sysdeps/loongarch/setjmp.S                    |   66 +
 sysdeps/loongarch/sfp-machine.h               |  102 +
 sysdeps/loongarch/sotruss-lib.c               |   50 +
 sysdeps/loongarch/stackinfo.h                 |   33 +
 sysdeps/loongarch/start.S                     |   67 +
 sysdeps/loongarch/sys/asm.h                   |   59 +
 sysdeps/loongarch/sys/regdef.h                |   93 +
 sysdeps/loongarch/tininess.h                  |    1 +
 sysdeps/loongarch/tst-audit.h                 |   23 +
 sysdeps/unix/sysv/linux/loongarch/Implies     |    1 +
 sysdeps/unix/sysv/linux/loongarch/Makefile    |    4 +
 .../unix/sysv/linux/loongarch/arch-syscall.h  |  303 +++
 .../sysv/linux/loongarch/atomic-machine.h     |  181 ++
 .../unix/sysv/linux/loongarch/bits/fcntl.h    |   61 +
 .../unix/sysv/linux/loongarch/bits/procfs.h   |   52 +
 .../linux/loongarch/bits/pthread_stack_min.h  |   20 +
 .../unix/sysv/linux/loongarch/bits/sigstack.h |   32 +
 sysdeps/unix/sysv/linux/loongarch/clone.S     |   96 +
 sysdeps/unix/sysv/linux/loongarch/clone3.S    |   83 +
 sysdeps/unix/sysv/linux/loongarch/configure   |  199 ++
 .../unix/sysv/linux/loongarch/configure.ac    |   22 +
 .../unix/sysv/linux/loongarch/getcontext.S    |   59 +
 sysdeps/unix/sysv/linux/loongarch/ldconfig.h  |   26 +
 .../unix/sysv/linux/loongarch/ldd-rewrite.sed |    3 +
 .../unix/sysv/linux/loongarch/localplt.data   |   12 +
 .../unix/sysv/linux/loongarch/lp64/Implies    |    3 +
 .../sysv/linux/loongarch/lp64/c++-types.data  |   67 +
 .../unix/sysv/linux/loongarch/lp64/ld.abilist |    8 +
 .../loongarch/lp64/libBrokenLocale.abilist    |    1 +
 .../sysv/linux/loongarch/lp64/libc.abilist    | 2139 +++++++++++++++++
 .../loongarch/lp64/libc_malloc_debug.abilist  |   26 +
 .../linux/loongarch/lp64/libcrypt.abilist     |    2 +
 .../sysv/linux/loongarch/lp64/libm.abilist    | 1031 ++++++++
 .../linux/loongarch/lp64/libpthread.abilist   |    0
 .../linux/loongarch/lp64/libresolv.abilist    |   55 +
 .../sysv/linux/loongarch/lp64/librt.abilist   |    0
 .../linux/loongarch/lp64/libthread_db.abilist |   40 +
 .../unix/sysv/linux/loongarch/makecontext.c   |   79 +
 .../unix/sysv/linux/loongarch/setcontext.S    |  100 +
 .../unix/sysv/linux/loongarch/shlib-versions  |    7 +
 .../sysv/linux/loongarch/sigcontextinfo.h     |   32 +
 .../unix/sysv/linux/loongarch/swapcontext.S   |   95 +
 .../unix/sysv/linux/loongarch/sys/ucontext.h  |   61 +
 sysdeps/unix/sysv/linux/loongarch/sys/user.h  |   42 +
 sysdeps/unix/sysv/linux/loongarch/sysdep.S    |   53 +
 sysdeps/unix/sysv/linux/loongarch/sysdep.h    |  321 +++
 .../sysv/linux/loongarch/ucontext-macros.h    |   32 +
 .../unix/sysv/linux/loongarch/ucontext_i.sym  |   31 +
 sysdeps/unix/sysv/linux/loongarch/vfork.S     |   50 +
 108 files changed, 9837 insertions(+), 2 deletions(-)
 create mode 100644 sysdeps/loongarch/Implies
 create mode 100644 sysdeps/loongarch/Makefile
 create mode 100644 sysdeps/loongarch/__longjmp.S
 create mode 100644 sysdeps/loongarch/abort-instr.h
 create mode 100644 sysdeps/loongarch/bits/endianness.h
 create mode 100644 sysdeps/loongarch/bits/fenv.h
 create mode 100644 sysdeps/loongarch/bits/link.h
 create mode 100644 sysdeps/loongarch/bits/setjmp.h
 create mode 100644 sysdeps/loongarch/bsd-_setjmp.c
 create mode 100644 sysdeps/loongarch/bsd-setjmp.c
 create mode 100644 sysdeps/loongarch/configure
 create mode 100644 sysdeps/loongarch/configure.ac
 create mode 100644 sysdeps/loongarch/dl-irel.h
 create mode 100644 sysdeps/loongarch/dl-machine.h
 create mode 100644 sysdeps/loongarch/dl-tls.h
 create mode 100644 sysdeps/loongarch/dl-trampoline.S
 create mode 100644 sysdeps/loongarch/e_sqrtl.c
 create mode 100644 sysdeps/loongarch/fpu/fclrexcpt.c
 create mode 100644 sysdeps/loongarch/fpu/fedisblxcpt.c
 create mode 100644 sysdeps/loongarch/fpu/feenablxcpt.c
 create mode 100644 sysdeps/loongarch/fpu/fegetenv.c
 create mode 100644 sysdeps/loongarch/fpu/fegetexcept.c
 create mode 100644 sysdeps/loongarch/fpu/fegetmode.c
 create mode 100644 sysdeps/loongarch/fpu/fegetround.c
 create mode 100644 sysdeps/loongarch/fpu/feholdexcpt.c
 create mode 100644 sysdeps/loongarch/fpu/fenv_libc.h
 create mode 100644 sysdeps/loongarch/fpu/fesetenv.c
 create mode 100644 sysdeps/loongarch/fpu/fesetexcept.c
 create mode 100644 sysdeps/loongarch/fpu/fesetmode.c
 create mode 100644 sysdeps/loongarch/fpu/fesetround.c
 create mode 100644 sysdeps/loongarch/fpu/feupdateenv.c
 create mode 100644 sysdeps/loongarch/fpu/fgetexcptflg.c
 create mode 100644 sysdeps/loongarch/fpu/fraiseexcpt.c
 create mode 100644 sysdeps/loongarch/fpu/fsetexcptflg.c
 create mode 100644 sysdeps/loongarch/fpu/ftestexcept.c
 create mode 100644 sysdeps/loongarch/fpu/math-use-builtins-sqrt.h
 create mode 100644 sysdeps/loongarch/fpu_control.h
 create mode 100644 sysdeps/loongarch/hp-timing.h
 create mode 100644 sysdeps/loongarch/jmpbuf-offsets.h
 create mode 100644 sysdeps/loongarch/jmpbuf-unwind.h
 create mode 100644 sysdeps/loongarch/ldsodefs.h
 create mode 100644 sysdeps/loongarch/libc-tls.c
 create mode 100644 sysdeps/loongarch/linkmap.h
 create mode 100644 sysdeps/loongarch/lp64/Implies-after
 create mode 100644 sysdeps/loongarch/lp64/libm-test-ulps
 create mode 100644 sysdeps/loongarch/lp64/libm-test-ulps-name
 create mode 100644 sysdeps/loongarch/machine-gmon.h
 create mode 100644 sysdeps/loongarch/math_private.h
 create mode 100644 sysdeps/loongarch/nptl/Makefile
 create mode 100644 sysdeps/loongarch/nptl/pthreaddef.h
 create mode 100644 sysdeps/loongarch/nptl/tcb-offsets.sym
 create mode 100644 sysdeps/loongarch/nptl/tls.h
 create mode 100644 sysdeps/loongarch/preconfigure
 create mode 100644 sysdeps/loongarch/setjmp.S
 create mode 100644 sysdeps/loongarch/sfp-machine.h
 create mode 100644 sysdeps/loongarch/sotruss-lib.c
 create mode 100644 sysdeps/loongarch/stackinfo.h
 create mode 100644 sysdeps/loongarch/start.S
 create mode 100644 sysdeps/loongarch/sys/asm.h
 create mode 100644 sysdeps/loongarch/sys/regdef.h
 create mode 100644 sysdeps/loongarch/tininess.h
 create mode 100644 sysdeps/loongarch/tst-audit.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/arch-syscall.h
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/atomic-machine.h
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/bits/fcntl.h
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/bits/procfs.h
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/bits/pthread_stack_min.h
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/bits/sigstack.h
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/clone.S
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/clone3.S
 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/getcontext.S
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/ldconfig.h
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/ldd-rewrite.sed
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/localplt.data
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/lp64/Implies
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/lp64/c++-types.data
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/lp64/ld.abilist
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/lp64/libBrokenLocale.abilist
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/lp64/libc.abilist
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/lp64/libc_malloc_debug.abilist
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/lp64/libcrypt.abilist
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/lp64/libm.abilist
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/lp64/libpthread.abilist
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/lp64/libresolv.abilist
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/lp64/librt.abilist
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/lp64/libthread_db.abilist
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/makecontext.c
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/setcontext.S
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/shlib-versions
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/sigcontextinfo.h
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/swapcontext.S
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/sys/ucontext.h
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/sys/user.h
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/sysdep.S
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/sysdep.h
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/ucontext-macros.h
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/ucontext_i.sym
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/vfork.S

-- 
2.20.1


^ permalink raw reply	[flat|nested] 21+ messages in thread

* [PATCH v3 01/13] LoongArch: Update NEWS and README for the LoongArch port.
  2022-04-15  1:31 [PATCH v3 00/13] GLIBC LoongArch PATCHES caiyinyu
@ 2022-04-15  1:31 ` caiyinyu
  2022-04-19 20:06   ` Joseph Myers
  2022-04-15  1:31 ` [PATCH v3 02/13] LoongArch: Add LoongArch entries to config.h.in caiyinyu
                   ` (11 subsequent siblings)
  12 siblings, 1 reply; 21+ messages in thread
From: caiyinyu @ 2022-04-15  1:31 UTC (permalink / raw)
  To: libc-alpha, adhemerval.zanella; +Cc: joseph_myers, xuchenghua, caiyinyu

---
 NEWS             | 9 +++++++++
 README           | 1 +
 manual/math.texi | 2 +-
 3 files changed, 11 insertions(+), 1 deletion(-)

diff --git a/NEWS b/NEWS
index 4b6d9de2b5..dc338ed761 100644
--- a/NEWS
+++ b/NEWS
@@ -35,6 +35,15 @@ Version 2.35
 
 Major new features:
 
+* Support for LoongArch running on Linux has been added.  This port requires
+  as least binutils 2.38, GCC 12, and Linux 10.0.0.  Currently only hard-float
+  ABI is supported:
+
+    - loongarch64-linux-gnu
+
+  The LoongArch ABI is 64-bit little-endian and uses 64-bit time (y2038 safe) and
+  64-bit file offsets (LFS default).
+
 * Unicode 14.0.0 Support: Character encoding, character type info, and
   transliteration tables are all updated to Unicode 14.0.0, using
   generator scripts contributed by Mike FABIAN (Red Hat).
diff --git a/README b/README
index 3d5a78ccff..63f3a1bebf 100644
--- a/README
+++ b/README
@@ -31,6 +31,7 @@ The GNU C Library supports these configurations for using Linux kernels:
 	i[4567]86-*-linux-gnu
 	x86_64-*-linux-gnu	Can build either x86_64 or x32
 	ia64-*-linux-gnu
+	loongarch64-*-linux-gnu Hardware floating point, LE only.
 	m68k-*-linux-gnu
 	microblaze*-*-linux-gnu
 	mips-*-linux-gnu
diff --git a/manual/math.texi b/manual/math.texi
index 477a18b6d1..105d6122df 100644
--- a/manual/math.texi
+++ b/manual/math.texi
@@ -70,7 +70,7 @@ provided for @code{_Float32}, @code{_Float64} and @code{_Float32x} on
 all platforms.
 It is also provided for @code{_Float128} and @code{_Float64x} on
 powerpc64le (PowerPC 64-bits little-endian), x86_64, x86, ia64,
-aarch64, alpha, mips64, riscv, s390 and sparc.
+aarch64, alpha, loongarch, mips64, riscv, s390 and sparc.
 
 @menu
 * Mathematical Constants::      Precise numeric values for often-used
-- 
2.20.1


^ permalink raw reply	[flat|nested] 21+ messages in thread

* [PATCH v3 02/13] LoongArch: Add LoongArch entries to config.h.in
  2022-04-15  1:31 [PATCH v3 00/13] GLIBC LoongArch PATCHES caiyinyu
  2022-04-15  1:31 ` [PATCH v3 01/13] LoongArch: Update NEWS and README for the LoongArch port caiyinyu
@ 2022-04-15  1:31 ` caiyinyu
  2022-04-15  1:31 ` [PATCH v3 03/13] LoongArch: Add relocations and ELF flags to elf.h caiyinyu
                   ` (10 subsequent siblings)
  12 siblings, 0 replies; 21+ messages in thread
From: caiyinyu @ 2022-04-15  1:31 UTC (permalink / raw)
  To: libc-alpha, adhemerval.zanella; +Cc: joseph_myers, xuchenghua, caiyinyu

---
 config.h.in | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/config.h.in b/config.h.in
index a94f756859..9aaa79ad22 100644
--- a/config.h.in
+++ b/config.h.in
@@ -132,6 +132,12 @@
 /* RISC-V floating-point ABI for ld.so.  */
 #undef RISCV_ABI_FLEN
 
+/* LOONGARCH integer ABI for ld.so.  */
+#undef LOONGARCH_ABI_GRLEN
+
+/* LOONGARCH floating-point ABI for ld.so.  */
+#undef LOONGARCH_ABI_FRLEN
+
 /* Linux specific: minimum supported kernel version.  */
 #undef	__LINUX_KERNEL_VERSION
 
-- 
2.20.1


^ permalink raw reply	[flat|nested] 21+ messages in thread

* [PATCH v3 03/13] LoongArch: Add relocations and ELF flags to elf.h
  2022-04-15  1:31 [PATCH v3 00/13] GLIBC LoongArch PATCHES caiyinyu
  2022-04-15  1:31 ` [PATCH v3 01/13] LoongArch: Update NEWS and README for the LoongArch port caiyinyu
  2022-04-15  1:31 ` [PATCH v3 02/13] LoongArch: Add LoongArch entries to config.h.in caiyinyu
@ 2022-04-15  1:31 ` caiyinyu
  2022-04-15  1:31 ` [PATCH v3 04/13] LoongArch: ABI Implementation caiyinyu
                   ` (9 subsequent siblings)
  12 siblings, 0 replies; 21+ messages in thread
From: caiyinyu @ 2022-04-15  1:31 UTC (permalink / raw)
  To: libc-alpha, adhemerval.zanella; +Cc: joseph_myers, xuchenghua, caiyinyu

---
 elf/elf.h | 68 ++++++++++++++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 67 insertions(+), 1 deletion(-)

diff --git a/elf/elf.h b/elf/elf.h
index 0735f6b579..6e0cd65a9b 100644
--- a/elf/elf.h
+++ b/elf/elf.h
@@ -358,8 +358,9 @@ typedef struct
 
 #define EM_BPF		247	/* Linux BPF -- in-kernel virtual machine */
 #define EM_CSKY		252     /* C-SKY */
+#define EM_LOONGARCH	258	/* LoongArch */
 
-#define EM_NUM		253
+#define EM_NUM		259
 
 /* Old spellings/synonyms.  */
 
@@ -4056,6 +4057,71 @@ enum
 #define R_NDS32_TLS_TPOFF	102
 #define R_NDS32_TLS_DESC	119
 
+/* LoongArch ELF Flags */
+#define EF_LARCH_ABI    	0x07
+#define EF_LARCH_ABI_LP64D	0x03
+
+/* LoongArch specific dynamic relocations */
+#define R_LARCH_NONE		0
+#define R_LARCH_32		1
+#define R_LARCH_64		2
+#define R_LARCH_RELATIVE	3
+#define R_LARCH_COPY		4
+#define R_LARCH_JUMP_SLOT	5
+#define R_LARCH_TLS_DTPMOD32	6
+#define R_LARCH_TLS_DTPMOD64	7
+#define R_LARCH_TLS_DTPREL32	8
+#define R_LARCH_TLS_DTPREL64	9
+#define R_LARCH_TLS_TPREL32	10
+#define R_LARCH_TLS_TPREL64	11
+#define R_LARCH_IRELATIVE	12
+
+/* Reserved for future relocs that the dynamic linker must understand.  */
+
+/* used by the static linker for relocating .text.  */
+#define R_LARCH_MARK_LA  20
+#define R_LARCH_MARK_PCREL  21
+#define R_LARCH_SOP_PUSH_PCREL  22
+#define R_LARCH_SOP_PUSH_ABSOLUTE  23
+#define R_LARCH_SOP_PUSH_DUP  24
+#define R_LARCH_SOP_PUSH_GPREL  25
+#define R_LARCH_SOP_PUSH_TLS_TPREL  26
+#define R_LARCH_SOP_PUSH_TLS_GOT  27
+#define R_LARCH_SOP_PUSH_TLS_GD  28
+#define R_LARCH_SOP_PUSH_PLT_PCREL  29
+#define R_LARCH_SOP_ASSERT  30
+#define R_LARCH_SOP_NOT  31
+#define R_LARCH_SOP_SUB  32
+#define R_LARCH_SOP_SL  33
+#define R_LARCH_SOP_SR  34
+#define R_LARCH_SOP_ADD  35
+#define R_LARCH_SOP_AND  36
+#define R_LARCH_SOP_IF_ELSE  37
+#define R_LARCH_SOP_POP_32_S_10_5  38
+#define R_LARCH_SOP_POP_32_U_10_12  39
+#define R_LARCH_SOP_POP_32_S_10_12  40
+#define R_LARCH_SOP_POP_32_S_10_16  41
+#define R_LARCH_SOP_POP_32_S_10_16_S2  42
+#define R_LARCH_SOP_POP_32_S_5_20  43
+#define R_LARCH_SOP_POP_32_S_0_5_10_16_S2  44
+#define R_LARCH_SOP_POP_32_S_0_10_10_16_S2  45
+#define R_LARCH_SOP_POP_32_U  46
+
+/* used by the static linker for relocating non .text.  */
+#define R_LARCH_ADD8  47
+#define R_LARCH_ADD16  48
+#define R_LARCH_ADD24  49
+#define R_LARCH_ADD32  50
+#define R_LARCH_ADD64  51
+#define R_LARCH_SUB8  52
+#define R_LARCH_SUB16  53
+#define R_LARCH_SUB24  54
+#define R_LARCH_SUB32  55
+#define R_LARCH_SUB64  56
+#define R_LARCH_GNU_VTINHERIT  57
+#define R_LARCH_GNU_VTENTRY  58
+
+
 /* ARCompact/ARCv2 specific relocs.  */
 #define R_ARC_NONE		0x0
 #define R_ARC_8			0x1
-- 
2.20.1


^ permalink raw reply	[flat|nested] 21+ messages in thread

* [PATCH v3 04/13] LoongArch: ABI Implementation
  2022-04-15  1:31 [PATCH v3 00/13] GLIBC LoongArch PATCHES caiyinyu
                   ` (2 preceding siblings ...)
  2022-04-15  1:31 ` [PATCH v3 03/13] LoongArch: Add relocations and ELF flags to elf.h caiyinyu
@ 2022-04-15  1:31 ` caiyinyu
  2022-04-15  1:31 ` [PATCH v3 05/13] LoongArch: Thread-Local Storage Support caiyinyu
                   ` (8 subsequent siblings)
  12 siblings, 0 replies; 21+ messages in thread
From: caiyinyu @ 2022-04-15  1:31 UTC (permalink / raw)
  To: libc-alpha, adhemerval.zanella; +Cc: joseph_myers, xuchenghua, caiyinyu

---
 sysdeps/loongarch/__longjmp.S                |  52 +++
 sysdeps/loongarch/bits/endianness.h          |  11 +
 sysdeps/loongarch/bits/link.h                |  58 +++
 sysdeps/loongarch/bits/setjmp.h              |  42 +++
 sysdeps/loongarch/bsd-_setjmp.c              |   1 +
 sysdeps/loongarch/bsd-setjmp.c               |   1 +
 sysdeps/loongarch/dl-machine.h               | 362 +++++++++++++++++++
 sysdeps/loongarch/dl-trampoline.S            |  91 +++++
 sysdeps/loongarch/jmpbuf-offsets.h           |  22 ++
 sysdeps/loongarch/jmpbuf-unwind.h            |  45 +++
 sysdeps/loongarch/ldsodefs.h                 |  41 +++
 sysdeps/loongarch/linkmap.h                  |  22 ++
 sysdeps/loongarch/machine-gmon.h             |  37 ++
 sysdeps/loongarch/setjmp.S                   |  66 ++++
 sysdeps/loongarch/sotruss-lib.c              |  50 +++
 sysdeps/loongarch/start.S                    |  67 ++++
 sysdeps/loongarch/sys/asm.h                  |  59 +++
 sysdeps/loongarch/tst-audit.h                |  23 ++
 sysdeps/unix/sysv/linux/loongarch/ldconfig.h |  26 ++
 19 files changed, 1076 insertions(+)
 create mode 100644 sysdeps/loongarch/__longjmp.S
 create mode 100644 sysdeps/loongarch/bits/endianness.h
 create mode 100644 sysdeps/loongarch/bits/link.h
 create mode 100644 sysdeps/loongarch/bits/setjmp.h
 create mode 100644 sysdeps/loongarch/bsd-_setjmp.c
 create mode 100644 sysdeps/loongarch/bsd-setjmp.c
 create mode 100644 sysdeps/loongarch/dl-machine.h
 create mode 100644 sysdeps/loongarch/dl-trampoline.S
 create mode 100644 sysdeps/loongarch/jmpbuf-offsets.h
 create mode 100644 sysdeps/loongarch/jmpbuf-unwind.h
 create mode 100644 sysdeps/loongarch/ldsodefs.h
 create mode 100644 sysdeps/loongarch/linkmap.h
 create mode 100644 sysdeps/loongarch/machine-gmon.h
 create mode 100644 sysdeps/loongarch/setjmp.S
 create mode 100644 sysdeps/loongarch/sotruss-lib.c
 create mode 100644 sysdeps/loongarch/start.S
 create mode 100644 sysdeps/loongarch/sys/asm.h
 create mode 100644 sysdeps/loongarch/tst-audit.h
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/ldconfig.h

diff --git a/sysdeps/loongarch/__longjmp.S b/sysdeps/loongarch/__longjmp.S
new file mode 100644
index 0000000000..b7690dd94f
--- /dev/null
+++ b/sysdeps/loongarch/__longjmp.S
@@ -0,0 +1,52 @@
+/* longjmp.
+   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/>.  */
+
+#include <sysdep.h>
+#include <sys/asm.h>
+
+ENTRY (__longjmp)
+	REG_L ra, a0, 0*SZREG
+	REG_L sp, a0, 1*SZREG
+	REG_L x,  a0, 2*SZREG
+	REG_L fp, a0, 3*SZREG
+	REG_L s0, a0, 4*SZREG
+	REG_L s1, a0, 5*SZREG
+	REG_L s2, a0, 6*SZREG
+	REG_L s3, a0, 7*SZREG
+	REG_L s4, a0, 8*SZREG
+	REG_L s5, a0, 9*SZREG
+	REG_L s6, a0, 10*SZREG
+	REG_L s7, a0, 11*SZREG
+	REG_L s8, a0, 12*SZREG
+
+#ifndef __loongarch_soft_float
+	FREG_L $f24, a0, 13*SZREG + 0*SZFREG
+	FREG_L $f25, a0, 13*SZREG + 1*SZFREG
+	FREG_L $f26, a0, 13*SZREG + 2*SZFREG
+	FREG_L $f27, a0, 13*SZREG + 3*SZFREG
+	FREG_L $f28, a0, 13*SZREG + 4*SZFREG
+	FREG_L $f29, a0, 13*SZREG + 5*SZFREG
+	FREG_L $f30, a0, 13*SZREG + 6*SZFREG
+	FREG_L $f31, a0, 13*SZREG + 7*SZFREG
+#endif
+
+	sltui	a0,a1,1
+	ADD	a0, a0, a1	 # a0 = (a1 == 0) ? 1 : a1
+	jirl	zero,ra,0
+
+END (__longjmp)
diff --git a/sysdeps/loongarch/bits/endianness.h b/sysdeps/loongarch/bits/endianness.h
new file mode 100644
index 0000000000..7290be7b18
--- /dev/null
+++ b/sysdeps/loongarch/bits/endianness.h
@@ -0,0 +1,11 @@
+#ifndef _BITS_ENDIANNESS_H
+#define _BITS_ENDIANNESS_H 1
+
+#ifndef _BITS_ENDIAN_H
+#error "Never use <bits/endianness.h> directly; include <endian.h> instead."
+#endif
+
+/* LoongArch is little-endian.  */
+#define __BYTE_ORDER __LITTLE_ENDIAN
+
+#endif /* bits/endianness.h */
diff --git a/sysdeps/loongarch/bits/link.h b/sysdeps/loongarch/bits/link.h
new file mode 100644
index 0000000000..4df09989cb
--- /dev/null
+++ b/sysdeps/loongarch/bits/link.h
@@ -0,0 +1,58 @@
+/* Machine-specific declarations for dynamic linker interface.
+   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 _LINK_H
+#error "Never include <bits/link.h> directly; use <link.h> instead."
+#endif
+
+typedef struct La_loongarch_regs
+{
+  unsigned long int lr_reg[8]; /* a0 - a7 */
+  double lr_fpreg[8];	       /* fa0 - fa7 */
+  unsigned long int lr_ra;
+  unsigned long int lr_sp;
+} La_loongarch_regs;
+
+/* Return values for calls from PLT on LoongArch.  */
+typedef struct La_loongarch_retval
+{
+  unsigned long int lrv_a0;
+  unsigned long int lrv_a1;
+  double lrv_fa0;
+  double lrv_fa1;
+} La_loongarch_retval;
+
+__BEGIN_DECLS
+
+extern ElfW (Addr) la_loongarch_gnu_pltenter (ElfW (Sym) * __sym,
+					      unsigned int __ndx,
+					      uintptr_t *__refcook,
+					      uintptr_t *__defcook,
+					      La_loongarch_regs *__regs,
+					      unsigned int *__flags,
+					      const char *__symname,
+					      long int *__framesizep);
+extern unsigned int la_loongarch_gnu_pltexit (ElfW (Sym) * __sym,
+					      unsigned int __ndx,
+					      uintptr_t *__refcook,
+					      uintptr_t *__defcook,
+					      const La_loongarch_regs *__inregs,
+					      La_loongarch_retval *__outregs,
+					      const char *__symname);
+
+__END_DECLS
diff --git a/sysdeps/loongarch/bits/setjmp.h b/sysdeps/loongarch/bits/setjmp.h
new file mode 100644
index 0000000000..8b323ad2b6
--- /dev/null
+++ b/sysdeps/loongarch/bits/setjmp.h
@@ -0,0 +1,42 @@
+/* Define the machine-dependent type `jmp_buf'.
+   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 _LOONGARCH_BITS_SETJMP_H
+#define _LOONGARCH_BITS_SETJMP_H
+
+typedef struct __jmp_buf_internal_tag
+{
+  /* Program counter.  */
+  long int __pc;
+  /* Stack pointer.  */
+  long int __sp;
+  /* Reserved */
+  long int __x;
+  /* Frame pointer.  */
+  long int __fp;
+  /* Callee-saved registers.  */
+  long int __regs[9];
+
+#ifndef __loongarch_soft_float
+  /* Callee-saved floating point registers.  */
+  double __fpregs[8];
+#endif
+
+} __jmp_buf[1];
+
+#endif /* _LOONGARCH_BITS_SETJMP_H */
diff --git a/sysdeps/loongarch/bsd-_setjmp.c b/sysdeps/loongarch/bsd-_setjmp.c
new file mode 100644
index 0000000000..32f49441c3
--- /dev/null
+++ b/sysdeps/loongarch/bsd-_setjmp.c
@@ -0,0 +1 @@
+/* _setjmp is implemented in setjmp.S.  */
diff --git a/sysdeps/loongarch/bsd-setjmp.c b/sysdeps/loongarch/bsd-setjmp.c
new file mode 100644
index 0000000000..45fd802aac
--- /dev/null
+++ b/sysdeps/loongarch/bsd-setjmp.c
@@ -0,0 +1 @@
+/* setjmp is implemented in setjmp.S.  */
diff --git a/sysdeps/loongarch/dl-machine.h b/sysdeps/loongarch/dl-machine.h
new file mode 100644
index 0000000000..68b68e677d
--- /dev/null
+++ b/sysdeps/loongarch/dl-machine.h
@@ -0,0 +1,362 @@
+/* Machine-dependent ELF dynamic relocation inline functions.
+   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 dl_machine_h
+#define dl_machine_h
+
+#define ELF_MACHINE_NAME "LoongArch"
+
+#include <entry.h>
+#include <elf/elf.h>
+#include <sys/asm.h>
+#include <dl-tls.h>
+#include <dl-static-tls.h>
+#include <dl-machine-rel.h>
+
+#ifndef _RTLD_PROLOGUE
+# define _RTLD_PROLOGUE(entry)					\
+	".globl\t" __STRING (entry) "\n\t"			\
+	".type\t" __STRING (entry) ", @function\n\t"		\
+	CFI_STARTPROC "\n"					\
+	__STRING (entry) ":\n"
+#endif
+
+#ifndef _RTLD_EPILOGUE
+# define _RTLD_EPILOGUE(entry)					\
+	CFI_ENDPROC "\n\t"					\
+	".size\t" __STRING (entry) ", . - " __STRING (entry) "\n"
+#endif
+
+#define ELF_MACHINE_JMP_SLOT R_LARCH_JUMP_SLOT
+#define ELF_MACHINE_IRELATIVE R_LARCH_IRELATIVE
+
+#define elf_machine_type_class(type)				\
+  ((ELF_RTYPE_CLASS_PLT * ((type) == ELF_MACHINE_JMP_SLOT	\
+     || (__WORDSIZE == 32 && (type) == R_LARCH_TLS_DTPREL32)	\
+     || (__WORDSIZE == 32 && (type) == R_LARCH_TLS_DTPMOD32)	\
+     || (__WORDSIZE == 32 && (type) == R_LARCH_TLS_TPREL32)	\
+     || (__WORDSIZE == 64 && (type) == R_LARCH_TLS_DTPREL64)	\
+     || (__WORDSIZE == 64 && (type) == R_LARCH_TLS_DTPMOD64)	\
+     || (__WORDSIZE == 64 && (type) == R_LARCH_TLS_TPREL64)))	\
+   | (ELF_RTYPE_CLASS_COPY * ((type) == R_LARCH_COPY)))
+
+#define ELF_MACHINE_NO_REL 1
+#define ELF_MACHINE_NO_RELA 0
+
+/* Return nonzero iff ELF header is compatible with the running host.  */
+static inline int __attribute_used__
+elf_machine_matches_host (const ElfW (Ehdr) * ehdr)
+{
+  /* We can only run LoongArch binaries.  */
+  if (ehdr->e_machine != EM_LOONGARCH)
+    return 0;
+
+  return 1;
+}
+
+/* Runtime address of .got */
+#define _GLOBAL_OFFSET_TABLE_ \
+  ({ \
+    ElfW (Addr) * r; \
+    asm("la.pcrel %0, _GLOBAL_OFFSET_TABLE_" : "=r"(r)); \
+    r; \
+  })
+
+/* Return the link-time address of _DYNAMIC.  */
+static inline ElfW (Addr) elf_machine_dynamic (void)
+{
+  return _GLOBAL_OFFSET_TABLE_[0];
+}
+
+#define STRINGXP(X) __STRING (X)
+#define STRINGXV(X) STRINGV_ (X)
+#define STRINGV_(...) #__VA_ARGS__
+
+/* Return the run-time load address of the shared object.  */
+static inline ElfW (Addr) elf_machine_load_address (void)
+{
+  ElfW (Addr) got_linktime_addr;
+  asm("la.got %0, _GLOBAL_OFFSET_TABLE_"
+      /* Link-time address in GOT entry before runtime relocation */
+      : "=r"(got_linktime_addr));
+  return (ElfW (Addr)) _GLOBAL_OFFSET_TABLE_ - got_linktime_addr;
+}
+
+/* Initial entry point code for the dynamic linker.
+   The C function `_dl_start' is the real entry point;
+   its return value is the user program's entry point.  */
+
+#define RTLD_START \
+  asm(".text\n\
+      " _RTLD_PROLOGUE (ENTRY_POINT) "\
+      .cfi_label .Ldummy   \n\
+      " CFI_UNDEFINED (1) "   \n\
+      or	$a0, $sp, $zero   \n\
+      bl	_dl_start   \n\
+      # Stash user entry point in s0.   \n\
+      or	$s0, $v0, $zero   \n\
+      # See if we were run as a command with the executable file   \n\
+      # name as an extra leading argument.   \n\
+      la	$a0, _dl_skip_args   \n\
+      ld.w	$a0, $a0, 0   \n\
+      # Load the original argument count.   \n\
+      ld.d	$a1, $sp, 0   \n\
+      # Subtract _dl_skip_args from it.   \n\
+      sub.d	$a1, $a1, $a0   \n\
+      # Adjust the stack pointer to skip _dl_skip_args words.   \n\
+      slli.d	$a0, $a0, 3   \n\
+      add.d	$sp, $sp, $a0   \n\
+      # Save back the modified argument count.   \n\
+      st.d	$a1, $sp, 0   \n\
+      # Call _dl_init (struct link_map *main_map, int argc, char **argv, \
+		       char **env)    \n\
+      la	$a0, _rtld_local   \n\
+      ld.d	$a0, $a0, 0   \n\
+      addi.d	$a2, $sp, 8   \n\
+      slli.d	$a3, $a1, 3   \n\
+      add.d	$a3, $a3, $a2   \n\
+      addi.d	$a3, $a3, 8   \n\
+      # Adjust $sp for 16-aligned   \n\
+      srli.d  $t0, $sp, 4   \n\
+      slli.d  $t0, $t0, 4   \n\
+      ori	$t1, $sp, 0   \n\
+      addi.d  $sp, $t0, -32   \n\
+      st.d	$t1, $sp, 24   \n\
+      # Call the function to run the initializers.   \n\
+      bl	_dl_init   \n\
+      # Pass our finalizer function to _start.   \n\
+      ld.d    $sp, $sp, 24   \n\
+      la	$a0, _dl_fini   \n\
+      # Jump to the user entry point.   \n\
+      jirl	$zero, $s0, 0   \n\
+      " _RTLD_EPILOGUE (ENTRY_POINT) "\
+      .previous");
+
+/* Names of the architecture-specific auditing callback functions.  */
+#define ARCH_LA_PLTENTER loongarch_gnu_pltenter
+#define ARCH_LA_PLTEXIT loongarch_gnu_pltexit
+
+/* Bias .got.plt entry by the offset requested by the PLT header.  */
+#define elf_machine_plt_value(map, reloc, value) (value)
+
+static inline ElfW (Addr)
+  elf_machine_fixup_plt (struct link_map *map, lookup_t t,
+			 const ElfW (Sym) * refsym, const ElfW (Sym) * sym,
+			 const ElfW (Rela) * reloc, ElfW (Addr) * reloc_addr,
+			 ElfW (Addr) value)
+{
+  return *reloc_addr = value;
+}
+
+#endif /* !dl_machine_h */
+
+#ifdef RESOLVE_MAP
+
+/* Perform a relocation described by R_INFO at the location pointed to
+   by RELOC_ADDR.  SYM is the relocation symbol specified by R_INFO and
+   MAP is the object containing the reloc.  */
+
+static inline void __attribute__ ((always_inline))
+elf_machine_rela (struct link_map *map, struct r_scope_elem *scope[],
+		  const ElfW (Rela) * reloc,
+		  const ElfW (Sym) * sym,
+		  const struct r_found_version *version,
+		  void *const reloc_addr, int skip_ifunc)
+{
+  ElfW (Addr) r_info = reloc->r_info;
+  const unsigned long int r_type = ELFW (R_TYPE) (r_info);
+  ElfW (Addr) *addr_field = (ElfW (Addr) *) reloc_addr;
+  const ElfW (Sym) *const __attribute__ ((unused)) refsym = sym;
+  struct link_map *sym_map = RESOLVE_MAP (map, scope, &sym, version, r_type);
+  ElfW (Addr) value = 0;
+  if (sym_map != NULL)
+    value = SYMBOL_ADDRESS (sym_map, sym, true) + reloc->r_addend;
+
+  if (sym != NULL
+      && __builtin_expect (ELFW (ST_TYPE) (sym->st_info) == STT_GNU_IFUNC, 0)
+      && __builtin_expect (sym->st_shndx != SHN_UNDEF, 1)
+      && __builtin_expect (!skip_ifunc, 1))
+    value = ((ElfW (Addr) (*) (int)) value) (GLRO (dl_hwcap));
+
+  switch (r_type)
+    {
+#ifndef RTLD_BOOTSTRAP
+    case __WORDSIZE == 64 ? R_LARCH_TLS_DTPMOD64:
+    R_LARCH_TLS_DTPMOD32:
+      if (sym_map)
+	*addr_field = sym_map->l_tls_modid;
+      break;
+
+    case __WORDSIZE == 64 ? R_LARCH_TLS_DTPREL64:
+    R_LARCH_TLS_DTPREL32:
+      if (sym != NULL)
+	*addr_field = TLS_DTPREL_VALUE (sym) + reloc->r_addend;
+      break;
+
+    case __WORDSIZE == 64 ? R_LARCH_TLS_TPREL64:
+    R_LARCH_TLS_TPREL32:
+      if (sym != NULL)
+	{
+	  CHECK_STATIC_TLS (map, sym_map);
+	  *addr_field = TLS_TPREL_VALUE (sym_map, sym) + reloc->r_addend;
+	}
+      break;
+
+    case R_LARCH_COPY:
+      {
+	if (__glibc_unlikely (sym == NULL))
+	  /* This can happen in trace mode if an object could not be
+	     found.  */
+	  break;
+
+	/* Handle TLS copy relocations.  */
+	if (__glibc_unlikely (ELFW (ST_TYPE) (sym->st_info) == STT_TLS))
+	  {
+	    /* There's nothing to do if the symbol is in .tbss.  */
+	    if (__glibc_likely (sym->st_value
+				>= sym_map->l_tls_initimage_size))
+	      break;
+	    value += (ElfW (Addr)) sym_map->l_tls_initimage - sym_map->l_addr;
+	  }
+
+	size_t size = sym->st_size;
+	if (__glibc_unlikely (sym->st_size != refsym->st_size))
+	  {
+	    const char *strtab = (const void *) D_PTR (map, l_info[DT_STRTAB]);
+	    if (sym->st_size > refsym->st_size)
+	      size = refsym->st_size;
+	    if (sym->st_size > refsym->st_size || GLRO (dl_verbose))
+	      _dl_error_printf ("\
+  %s: Symbol `%s' has different size in shared object, consider re-linking\n",
+				rtld_progname ?: "<program name unknown>",
+				strtab + refsym->st_name);
+	  }
+
+	memcpy (reloc_addr, (void *) value, size);
+	break;
+      }
+#endif
+
+#if !defined RTLD_BOOTSTRAP || !defined HAVE_Z_COMBRELOC
+    case R_LARCH_RELATIVE:
+      {
+#if !defined RTLD_BOOTSTRAP && !defined HAVE_Z_COMBRELOC
+	/* This is defined in rtld.c, but nowhere in the static libc.a;
+	   make the reference weak so static programs can still link.
+	   This declaration cannot be done when compiling rtld.c
+	   (i.e. #ifdef RTLD_BOOTSTRAP) because rtld.c contains the
+	   common defn for _dl_rtld_map, which is incompatible with a
+	   weak decl in the same file.  */
+#ifndef SHARED
+	weak_extern (GL (dl_rtld_map));
+#endif
+	if (map != &GL (dl_rtld_map)) /* Already done in rtld itself.  */
+#endif
+	  *addr_field = map->l_addr + reloc->r_addend;
+	break;
+      }
+#endif
+
+    case R_LARCH_JUMP_SLOT:
+    case __WORDSIZE == 64 ? R_LARCH_64:
+    R_LARCH_32:
+      *addr_field = value;
+      break;
+
+    case R_LARCH_IRELATIVE:
+      value = map->l_addr + reloc->r_addend;
+      if (__glibc_likely (!skip_ifunc))
+	value = ((ElfW (Addr) (*) (void)) value) ();
+      *addr_field = value;
+      break;
+
+    case R_LARCH_NONE:
+      break;
+
+    default:
+      _dl_reloc_bad_type (map, r_type, 0);
+      break;
+    }
+}
+
+static inline void __attribute__ ((always_inline))
+elf_machine_rela_relative (ElfW (Addr) l_addr, const ElfW (Rela) * reloc,
+			   void *const reloc_addr)
+{
+  *(ElfW (Addr) *) reloc_addr = l_addr + reloc->r_addend;
+}
+
+static inline void __attribute__ ((always_inline))
+elf_machine_lazy_rel (struct link_map *map, struct r_scope_elem *scope[],
+		      ElfW (Addr) l_addr,
+		      const ElfW (Rela) * reloc, int skip_ifunc)
+{
+  ElfW (Addr) *const reloc_addr = (void *) (l_addr + reloc->r_offset);
+  const unsigned int r_type = ELFW (R_TYPE) (reloc->r_info);
+
+  /* Check for unexpected PLT reloc type.  */
+  if (__glibc_likely (r_type == R_LARCH_JUMP_SLOT))
+    {
+      if (__glibc_unlikely (map->l_mach.plt == 0))
+	{
+	  if (l_addr)
+	    *reloc_addr += l_addr;
+	}
+      else
+	*reloc_addr = map->l_mach.plt;
+    }
+  else if (__glibc_unlikely (r_type == R_LARCH_IRELATIVE))
+    {
+      ElfW (Addr) *value = (void *) (l_addr + reloc->r_addend);
+      if (__glibc_likely (!skip_ifunc))
+	value = (ElfW (Addr) *) ((ElfW (Addr) (*) (void)) value) ();
+      *reloc_addr = (ElfW (Addr)) value;
+    }
+  else
+    _dl_reloc_bad_type (map, r_type, 1);
+}
+
+/* Set up the loaded object described by L so its stub function
+   will jump to the on-demand fixup code __dl_runtime_resolve.  */
+
+static inline int __attribute__ ((always_inline))
+elf_machine_runtime_setup (struct link_map *l, struct r_scope_elem *scope[],
+			   int lazy, int profile)
+{
+#ifndef RTLD_BOOTSTRAP
+  /* If using PLTs, fill in the first two entries of .got.plt.  */
+  if (l->l_info[DT_JMPREL])
+    {
+      extern void _dl_runtime_resolve (void)
+	__attribute__ ((visibility ("hidden")));
+      ElfW (Addr) *gotplt = (ElfW (Addr) *) D_PTR (l, l_info[DT_PLTGOT]);
+      /* If a library is prelinked but we have to relocate anyway,
+	 we have to be able to undo the prelinking of .got.plt.
+	 The prelinker saved the address of .plt for us here.  */
+      if (gotplt[1])
+	l->l_mach.plt = gotplt[1] + l->l_addr;
+      gotplt[0] = (ElfW (Addr)) & _dl_runtime_resolve;
+      gotplt[1] = (ElfW (Addr)) l;
+    }
+#endif
+
+  return lazy;
+}
+
+#endif /* RESOLVE_MAP */
diff --git a/sysdeps/loongarch/dl-trampoline.S b/sysdeps/loongarch/dl-trampoline.S
new file mode 100644
index 0000000000..eb610392f6
--- /dev/null
+++ b/sysdeps/loongarch/dl-trampoline.S
@@ -0,0 +1,91 @@
+/* PLT trampolines.
+   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/>.  */
+
+#include <sysdep.h>
+#include <sys/asm.h>
+
+/* Assembler veneer called from the PLT header code for lazy loading.
+   The PLT header passes its own args in t0-t2.  */
+
+#ifdef __loongarch_soft_float
+# define FRAME_SIZE (-((-10 * SZREG) & ALMASK))
+#else
+# define FRAME_SIZE (-((-10 * SZREG - 8 * SZFREG) & ALMASK))
+#endif
+
+ENTRY (_dl_runtime_resolve)
+
+	/* Save arguments to stack. */
+	ADDI	sp, sp, -FRAME_SIZE
+
+	REG_S	ra, sp, 9*SZREG
+	REG_S	a0, sp, 1*SZREG
+	REG_S	a1, sp, 2*SZREG
+	REG_S	a2, sp, 3*SZREG
+	REG_S	a3, sp, 4*SZREG
+	REG_S	a4, sp, 5*SZREG
+	REG_S	a5, sp, 6*SZREG
+	REG_S	a6, sp, 7*SZREG
+	REG_S	a7, sp, 8*SZREG
+
+#ifndef __loongarch_soft_float
+	FREG_S	fa0, sp, 10*SZREG + 0*SZFREG
+	FREG_S	fa1, sp, 10*SZREG + 1*SZFREG
+	FREG_S	fa2, sp, 10*SZREG + 2*SZFREG
+	FREG_S	fa3, sp, 10*SZREG + 3*SZFREG
+	FREG_S	fa4, sp, 10*SZREG + 4*SZFREG
+	FREG_S	fa5, sp, 10*SZREG + 5*SZFREG
+	FREG_S	fa6, sp, 10*SZREG + 6*SZFREG
+	FREG_S	fa7, sp, 10*SZREG + 7*SZFREG
+#endif
+
+	/* Update .got.plt and obtain runtime address of callee */
+	SLLI	a1, t1, 1
+	or	a0, t0, zero
+	ADD	a1, a1, t1
+	la	a2, _dl_fixup
+	jirl	ra, a2, 0
+	or	t1, v0, zero
+
+	/* Restore arguments from stack. */
+	REG_L	ra, sp, 9*SZREG
+	REG_L	a0, sp, 1*SZREG
+	REG_L	a1, sp, 2*SZREG
+	REG_L	a2, sp, 3*SZREG
+	REG_L	a3, sp, 4*SZREG
+	REG_L	a4, sp, 5*SZREG
+	REG_L	a5, sp, 6*SZREG
+	REG_L	a6, sp, 7*SZREG
+	REG_L	a7, sp, 8*SZREG
+
+#ifndef __loongarch_soft_float
+	FREG_L	fa0, sp, 10*SZREG + 0*SZFREG
+	FREG_L	fa1, sp, 10*SZREG + 1*SZFREG
+	FREG_L	fa2, sp, 10*SZREG + 2*SZFREG
+	FREG_L	fa3, sp, 10*SZREG + 3*SZFREG
+	FREG_L	fa4, sp, 10*SZREG + 4*SZFREG
+	FREG_L	fa5, sp, 10*SZREG + 5*SZFREG
+	FREG_L	fa6, sp, 10*SZREG + 6*SZFREG
+	FREG_L	fa7, sp, 10*SZREG + 7*SZFREG
+#endif
+
+	ADDI	sp, sp, FRAME_SIZE
+
+	/* Invoke the callee. */
+	jirl		zero, t1, 0
+END (_dl_runtime_resolve)
diff --git a/sysdeps/loongarch/jmpbuf-offsets.h b/sysdeps/loongarch/jmpbuf-offsets.h
new file mode 100644
index 0000000000..a4b8ea690e
--- /dev/null
+++ b/sysdeps/loongarch/jmpbuf-offsets.h
@@ -0,0 +1,22 @@
+/* Private macros for accessing __jmp_buf contents.
+   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/>.  */
+
+#include <jmpbuf-unwind.h>
+
+/* Helper for generic ____longjmp_chk().  */
+#define JB_FRAME_ADDRESS(buf) ((void *) _jmpbuf_sp (buf))
diff --git a/sysdeps/loongarch/jmpbuf-unwind.h b/sysdeps/loongarch/jmpbuf-unwind.h
new file mode 100644
index 0000000000..6fa509151d
--- /dev/null
+++ b/sysdeps/loongarch/jmpbuf-unwind.h
@@ -0,0 +1,45 @@
+/* Examine __jmp_buf for unwinding frames.
+   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/>.  */
+
+#include <setjmp.h>
+#include <stdint.h>
+#include <unwind.h>
+#include <sysdep.h>
+
+/* Test if longjmp to JMPBUF would unwind the frame
+   containing a local variable at ADDRESS.  */
+#define _JMPBUF_UNWINDS(jmpbuf, address, demangle) \
+  ((void *) (address) < (void *) demangle ((jmpbuf)[0].__sp))
+
+#define _JMPBUF_CFA_UNWINDS_ADJ(_jmpbuf, _context, _adj) \
+  _JMPBUF_UNWINDS_ADJ (_jmpbuf, (void *) _Unwind_GetCFA (_context), _adj)
+
+static inline uintptr_t __attribute__ ((unused)) _jmpbuf_sp (__jmp_buf regs)
+{
+  uintptr_t sp = regs[0].__sp;
+#ifdef PTR_DEMANGLE
+  PTR_DEMANGLE (sp);
+#endif
+  return sp;
+}
+
+#define _JMPBUF_UNWINDS_ADJ(_jmpbuf, _address, _adj) \
+  ((uintptr_t) (_address) - (_adj) < _jmpbuf_sp (_jmpbuf) - (_adj))
+
+/* We use the normal longjmp for unwinding.  */
+#define __libc_unwind_longjmp(buf, val) __libc_longjmp (buf, val)
diff --git a/sysdeps/loongarch/ldsodefs.h b/sysdeps/loongarch/ldsodefs.h
new file mode 100644
index 0000000000..36b1b25b9f
--- /dev/null
+++ b/sysdeps/loongarch/ldsodefs.h
@@ -0,0 +1,41 @@
+/* Run-time dynamic linker data structures for loaded ELF shared objects.
+   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 _LOONGARCH_LDSODEFS_H
+#define _LOONGARCH_LDSODEFS_H 1
+
+#include <elf.h>
+
+struct La_loongarch_regs;
+struct La_loongarch_retval;
+
+#define ARCH_PLTENTER_MEMBERS \
+  ElfW (Addr) (*loongarch_gnu_pltenter) (ElfW (Sym) *, unsigned int, \
+					 uintptr_t *, uintptr_t *, \
+					 const struct La_loongarch_regs *, \
+					 unsigned int *, const char *name, \
+					 long int *framesizep);
+
+#define ARCH_PLTEXIT_MEMBERS \
+  unsigned int (*loongarch_gnu_pltexit) (ElfW (Sym) *, unsigned int, \
+		uintptr_t *, uintptr_t *, const struct La_loongarch_regs *, \
+		struct La_loongarch_retval *, const char *);
+
+#include_next <ldsodefs.h>
+
+#endif
diff --git a/sysdeps/loongarch/linkmap.h b/sysdeps/loongarch/linkmap.h
new file mode 100644
index 0000000000..bbba73ed70
--- /dev/null
+++ b/sysdeps/loongarch/linkmap.h
@@ -0,0 +1,22 @@
+/* Definition of link_map_machine.
+   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/>.  */
+
+struct link_map_machine
+{
+  ElfW (Addr) plt; /* Address of .plt.  */
+};
diff --git a/sysdeps/loongarch/machine-gmon.h b/sysdeps/loongarch/machine-gmon.h
new file mode 100644
index 0000000000..4a3cdd964e
--- /dev/null
+++ b/sysdeps/loongarch/machine-gmon.h
@@ -0,0 +1,37 @@
+/* LoongArch definitions for profiling support.
+   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/>.  */
+
+/* Accept 'frompc' address as argument from the function that calls
+   _mcount for profiling.  Use  __builtin_return_address (0)
+   for the 'selfpc' address.  */
+
+#include <sysdep.h>
+
+static void mcount_internal (unsigned long int frompc,
+			     unsigned long int selfpc);
+
+#define _MCOUNT_DECL(frompc, selfpc) \
+  static inline void mcount_internal (unsigned long int frompc, \
+				      unsigned long int selfpc)
+
+#define MCOUNT \
+  void _mcount (void *frompc) \
+  { \
+    mcount_internal ((unsigned long int) frompc, \
+		     (unsigned long int) RETURN_ADDRESS (0)); \
+  }
diff --git a/sysdeps/loongarch/setjmp.S b/sysdeps/loongarch/setjmp.S
new file mode 100644
index 0000000000..b93ae2f5da
--- /dev/null
+++ b/sysdeps/loongarch/setjmp.S
@@ -0,0 +1,66 @@
+/* setjmp for LoongArch.
+   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/>.  */
+
+#include <sysdep.h>
+#include <sys/asm.h>
+
+ENTRY (_setjmp)
+	li.w		a1,0
+	b		__sigsetjmp
+END (_setjmp)
+
+ENTRY (setjmp)
+	li.w		a1,1
+END (setjmp)
+
+ENTRY (__sigsetjmp)
+	REG_S ra, a0, 0*SZREG
+	REG_S sp, a0, 1*SZREG
+	REG_S x,  a0, 2*SZREG
+	REG_S fp, a0, 3*SZREG
+	REG_S s0, a0, 4*SZREG
+	REG_S s1, a0, 5*SZREG
+	REG_S s2, a0, 6*SZREG
+	REG_S s3, a0, 7*SZREG
+	REG_S s4, a0, 8*SZREG
+	REG_S s5, a0, 9*SZREG
+	REG_S s6, a0, 10*SZREG
+	REG_S s7, a0, 11*SZREG
+	REG_S s8, a0, 12*SZREG
+
+#ifndef __loongarch_soft_float
+	FREG_S $f24, a0, 13*SZREG + 0*SZFREG
+	FREG_S $f25, a0, 13*SZREG + 1*SZFREG
+	FREG_S $f26, a0, 13*SZREG + 2*SZFREG
+	FREG_S $f27, a0, 13*SZREG + 3*SZFREG
+	FREG_S $f28, a0, 13*SZREG + 4*SZFREG
+	FREG_S $f29, a0, 13*SZREG + 5*SZFREG
+	FREG_S $f30, a0, 13*SZREG + 6*SZFREG
+	FREG_S $f31, a0, 13*SZREG + 7*SZFREG
+#endif
+
+#if !IS_IN (libc) && IS_IN(rtld)
+	li.w		v0, 0
+	jirl		zero,ra,0
+#else
+	b		__sigjmp_save
+#endif
+END (__sigsetjmp)
+
+hidden_def (__sigsetjmp)
+weak_alias (_setjmp, __GI__setjmp)
diff --git a/sysdeps/loongarch/sotruss-lib.c b/sysdeps/loongarch/sotruss-lib.c
new file mode 100644
index 0000000000..5b15f4815a
--- /dev/null
+++ b/sysdeps/loongarch/sotruss-lib.c
@@ -0,0 +1,50 @@
+/* Override generic sotruss-lib.c to define actual functions for LoongArch.
+   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/>.  */
+
+#define HAVE_ARCH_PLTENTER
+#define HAVE_ARCH_PLTEXIT
+
+#include <elf/sotruss-lib.c>
+
+ElfW (Addr)
+la_loongarch_gnu_pltenter (ElfW (Sym) * sym __attribute__ ((unused)),
+			   unsigned int ndx __attribute__ ((unused)),
+			   uintptr_t *refcook, uintptr_t *defcook,
+			   La_loongarch_regs *regs, unsigned int *flags,
+			   const char *symname, long int *framesizep)
+{
+  print_enter (refcook, defcook, symname, regs->lr_reg[0], regs->lr_reg[1],
+		   regs->lr_reg[2], *flags);
+
+  /* No need to copy anything, we will not need the parameters in any case.  */
+  *framesizep = 0;
+
+  return sym->st_value;
+}
+
+unsigned int
+la_loongarch_gnu_pltexit (ElfW (Sym) * sym, unsigned int ndx,
+			  uintptr_t *refcook, uintptr_t *defcook,
+			  const struct La_loongarch_regs *inregs,
+			  struct La_loongarch_retval *outregs,
+			  const char *symname)
+{
+  print_exit (refcook, defcook, symname, outregs->lrv_a0);
+
+  return 0;
+}
diff --git a/sysdeps/loongarch/start.S b/sysdeps/loongarch/start.S
new file mode 100644
index 0000000000..a9b32aa966
--- /dev/null
+++ b/sysdeps/loongarch/start.S
@@ -0,0 +1,67 @@
+/* Startup code compliant to the ELF LoongArch ABI.
+   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/>.  */
+
+#define __ASSEMBLY__ 1
+#include <entry.h>
+#include <sys/asm.h>
+
+/* The entry point's job is to call __libc_start_main.  Per the ABI,
+   a0 contains the address of a function to be passed to atexit.
+   __libc_start_main wants this in a5.  */
+
+/*
+int
+__libc_start_main (int (*main) (int, char **, char **),
+		   int argc,
+		   char **argv,
+		   __typeof (main) init,
+		   void (*fini) (void),
+		   void (*rtld_fini) (void),
+		   void *stack_end);
+ */
+
+ENTRY (ENTRY_POINT)
+
+/* Terminate call stack by noting ra is undefined.  Use a dummy
+   .cfi_label to force starting the FDE.  */
+	.cfi_label .Ldummy
+	cfi_undefined (1)
+	or		a5, a0, zero /* rtld_fini */
+
+/* We must get symbol main through GOT table, since main may not be local.
+   For instance: googletest defines main in dynamic library.  */
+	la.got		a0, t0, main
+	REG_L		a1, sp, 0
+	ADDI		a2, sp, SZREG
+
+	/* Adjust $sp for 16-aligned */
+	SRLI		sp, sp, 4
+	SLLI		sp, sp, 4
+
+	move		a3, zero /* used to be init */
+	move		a4, zero /* used to be fini */
+	or		a6, sp, zero /* stack_end */
+
+	la.got		ra, t0, __libc_start_main
+	jirl		ra, ra, 0
+
+	la.got		ra, t0, abort
+	jirl		ra, ra, 0
+END (ENTRY_POINT)
+
diff --git a/sysdeps/loongarch/sys/asm.h b/sysdeps/loongarch/sys/asm.h
new file mode 100644
index 0000000000..b41ee59694
--- /dev/null
+++ b/sysdeps/loongarch/sys/asm.h
@@ -0,0 +1,59 @@
+/* Miscellaneous macros.
+   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_ASM_H
+#define _SYS_ASM_H
+
+#include <sys/regdef.h>
+#include <sysdeps/generic/sysdep.h>
+
+/* Macros to handle different pointer/register sizes for 32/64-bit code.  */
+#define SZREG 8
+#define SZFREG 8
+#define REG_L ld.d
+#define REG_S st.d
+#define SRLI srli.d
+#define SLLI slli.d
+#define ADDI addi.d
+#define ADD  add.d
+#define BSTRINS  bstrins.d
+#define LI  li.d
+#define FREG_L fld.d
+#define FREG_S fst.d
+
+/* Declare leaf routine.  */
+#define LEAF(symbol) \
+  .text; \
+  .globl symbol; \
+  .align 3; \
+  cfi_startproc; \
+  .type symbol, @function; \
+  symbol:
+
+#define ENTRY(symbol) LEAF (symbol)
+
+/* Mark end of function.  */
+#undef END
+#define END(function) \
+  cfi_endproc; \
+  .size function, .- function;
+
+/* Stack alignment.  */
+#define ALMASK ~15
+
+#endif /* sys/asm.h */
diff --git a/sysdeps/loongarch/tst-audit.h b/sysdeps/loongarch/tst-audit.h
new file mode 100644
index 0000000000..e71948c86e
--- /dev/null
+++ b/sysdeps/loongarch/tst-audit.h
@@ -0,0 +1,23 @@
+/* Definitions for testing PLT entry/exit auditing.
+   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/>.  */
+
+#define pltenter la_loongarch_gnu_pltenter
+#define pltexit la_loongarch_gnu_pltexit
+#define La_regs La_loongarch_regs
+#define La_retval La_loongarch_retval
+#define int_retval lrv_a0
diff --git a/sysdeps/unix/sysv/linux/loongarch/ldconfig.h b/sysdeps/unix/sysv/linux/loongarch/ldconfig.h
new file mode 100644
index 0000000000..4887c30ca2
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/loongarch/ldconfig.h
@@ -0,0 +1,26 @@
+/* ldconfig default paths and libraries.
+   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
+   <http://www.gnu.org/licenses/>.  */
+
+#include <sysdeps/generic/ldconfig.h>
+
+#define SYSDEP_KNOWN_INTERPRETER_NAMES \
+  { "/lib64/ld-linux-loongarch-lp64d.so.1", FLAG_ELF_LIBC6 },
+
+#define SYSDEP_KNOWN_LIBRARY_NAMES	\
+  { "libc.so.6", FLAG_ELF_LIBC6 },	\
+  { "libm.so.6", FLAG_ELF_LIBC6 },
-- 
2.20.1


^ permalink raw reply	[flat|nested] 21+ messages in thread

* [PATCH v3 05/13] LoongArch: Thread-Local Storage Support
  2022-04-15  1:31 [PATCH v3 00/13] GLIBC LoongArch PATCHES caiyinyu
                   ` (3 preceding siblings ...)
  2022-04-15  1:31 ` [PATCH v3 04/13] LoongArch: ABI Implementation caiyinyu
@ 2022-04-15  1:31 ` caiyinyu
  2022-04-15  1:31 ` [PATCH v3 06/13] LoongArch: Generic <math.h> and soft-fp Routines caiyinyu
                   ` (7 subsequent siblings)
  12 siblings, 0 replies; 21+ messages in thread
From: caiyinyu @ 2022-04-15  1:31 UTC (permalink / raw)
  To: libc-alpha, adhemerval.zanella; +Cc: joseph_myers, xuchenghua, caiyinyu

---
 sysdeps/loongarch/dl-tls.h             |  46 +++++++++
 sysdeps/loongarch/libc-tls.c           |  32 ++++++
 sysdeps/loongarch/nptl/tcb-offsets.sym |   6 ++
 sysdeps/loongarch/nptl/tls.h           | 138 +++++++++++++++++++++++++
 sysdeps/loongarch/stackinfo.h          |  33 ++++++
 5 files changed, 255 insertions(+)
 create mode 100644 sysdeps/loongarch/dl-tls.h
 create mode 100644 sysdeps/loongarch/libc-tls.c
 create mode 100644 sysdeps/loongarch/nptl/tcb-offsets.sym
 create mode 100644 sysdeps/loongarch/nptl/tls.h
 create mode 100644 sysdeps/loongarch/stackinfo.h

diff --git a/sysdeps/loongarch/dl-tls.h b/sysdeps/loongarch/dl-tls.h
new file mode 100644
index 0000000000..f82edcae76
--- /dev/null
+++ b/sysdeps/loongarch/dl-tls.h
@@ -0,0 +1,46 @@
+/* Thread-local storage handling in the ELF dynamic linker.
+   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/>.  */
+
+/* Type used for the representation of TLS information in the GOT.  */
+typedef struct
+{
+  unsigned long int ti_module;
+  unsigned long int ti_offset;
+} tls_index;
+
+/* The thread pointer points to the first static TLS block.  */
+#define TLS_TP_OFFSET 0
+
+/* Dynamic thread vector pointers point to the start of each
+   TLS block.  */
+#define TLS_DTV_OFFSET 0
+
+/* Compute the value for a GOTTPREL reloc.  */
+#define TLS_TPREL_VALUE(sym_map, sym) \
+  ((sym_map)->l_tls_offset + (sym)->st_value - TLS_TP_OFFSET)
+
+/* Compute the value for a DTPREL reloc.  */
+#define TLS_DTPREL_VALUE(sym) ((sym)->st_value - TLS_DTV_OFFSET)
+
+extern void *__tls_get_addr (tls_index *ti);
+
+#define GET_ADDR_OFFSET (ti->ti_offset + TLS_DTV_OFFSET)
+#define __TLS_GET_ADDR(__ti) (__tls_get_addr (__ti) - TLS_DTV_OFFSET)
+
+/* Value used for dtv entries for which the allocation is delayed.  */
+#define TLS_DTV_UNALLOCATED ((void *) -1l)
diff --git a/sysdeps/loongarch/libc-tls.c b/sysdeps/loongarch/libc-tls.c
new file mode 100644
index 0000000000..9285d11a7b
--- /dev/null
+++ b/sysdeps/loongarch/libc-tls.c
@@ -0,0 +1,32 @@
+/* Thread-local storage handling in the ELF dynamic linker.
+   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/>.  */
+
+#include <csu/libc-tls.c>
+#include <dl-tls.h>
+
+/* On LoongArch, linker optimizations are not required, so __tls_get_addr
+   can be called even in statically linked binaries.  In this case module
+   must be always 1 and PT_TLS segment exist in the binary, otherwise it
+   would not link.  */
+
+void *
+__tls_get_addr (tls_index *ti)
+{
+  dtv_t *dtv = THREAD_DTV ();
+  return (char *) dtv[1].pointer.val + GET_ADDR_OFFSET;
+}
diff --git a/sysdeps/loongarch/nptl/tcb-offsets.sym b/sysdeps/loongarch/nptl/tcb-offsets.sym
new file mode 100644
index 0000000000..7d0c7596e8
--- /dev/null
+++ b/sysdeps/loongarch/nptl/tcb-offsets.sym
@@ -0,0 +1,6 @@
+#include <sysdep.h>
+#include <tls.h>
+
+#define thread_offsetof(mem)  (long)(offsetof (struct pthread, mem) - TLS_TCB_OFFSET - TLS_PRE_TCB_SIZE)
+
+MULTIPLE_THREADS_OFFSET		thread_offsetof (header.multiple_threads)
diff --git a/sysdeps/loongarch/nptl/tls.h b/sysdeps/loongarch/nptl/tls.h
new file mode 100644
index 0000000000..f77265ae52
--- /dev/null
+++ b/sysdeps/loongarch/nptl/tls.h
@@ -0,0 +1,138 @@
+/* Definition for thread-local data handling.
+   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 _LOONGARCH_TLS_H
+#define _LOONGARCH_TLS_H 1
+
+#include <dl-sysdep.h>
+
+#ifndef __ASSEMBLER__
+#include <stdbool.h>
+#include <stddef.h>
+#include <stdint.h>
+#include <dl-dtv.h>
+
+register void *__thread_self asm("$tp");
+#define READ_THREAD_POINTER() ({ __thread_self; })
+
+/* Get system call information.  */
+#include <sysdep.h>
+
+/* The TP points to the start of the thread blocks.  */
+#define TLS_DTV_AT_TP 1
+#define TLS_TCB_AT_TP 0
+
+/* Get the thread descriptor definition.  */
+#include <nptl/descr.h>
+
+typedef struct
+{
+  dtv_t *dtv;
+  void *private;
+} tcbhead_t;
+
+/* This is the size of the initial TCB.  Because our TCB is before the thread
+   pointer, we don't need this.  */
+#define TLS_INIT_TCB_SIZE 0
+
+/* Alignment requirements for the initial TCB.  */
+#define TLS_INIT_TCB_ALIGN __alignof__(struct pthread)
+
+/* This is the size of the TCB.  Because our TCB is before the thread
+   pointer, we don't need this.  */
+#define TLS_TCB_SIZE 0
+
+/* Alignment requirements for the TCB.  */
+#define TLS_TCB_ALIGN __alignof__(struct pthread)
+
+/* This is the size we need before TCB - actually, it includes the TCB.  */
+#define TLS_PRE_TCB_SIZE \
+  (sizeof (struct pthread) \
+   + ((sizeof (tcbhead_t) + TLS_TCB_ALIGN - 1) & ~(TLS_TCB_ALIGN - 1)))
+
+/* The thread pointer tp points to the end of the TCB.
+   The pthread_descr structure is immediately in front of the TCB.  */
+#define TLS_TCB_OFFSET 0
+
+/* Install the dtv pointer.  The pointer passed is to the element with
+   index -1 which contain the length.  */
+#define INSTALL_DTV(tcbp, dtvp) (((tcbhead_t *) (tcbp))[-1].dtv = (dtvp) + 1)
+
+/* Install new dtv for current thread.  */
+#define INSTALL_NEW_DTV(dtv) (THREAD_DTV () = (dtv))
+
+/* Return dtv of given thread descriptor.  */
+#define GET_DTV(tcbp) (((tcbhead_t *) (tcbp))[-1].dtv)
+
+/* Code to initially initialize the thread pointer.  */
+#define TLS_INIT_TP(tcbp) \
+  ({ \
+    __thread_self = (char *) tcbp + TLS_TCB_OFFSET; \
+    NULL; \
+  })
+
+/* Return the address of the dtv for the current thread.  */
+#define THREAD_DTV() \
+  (((tcbhead_t *) (READ_THREAD_POINTER () - TLS_TCB_OFFSET))[-1].dtv)
+
+/* Return the thread descriptor for the current thread.  */
+#define THREAD_SELF \
+  ((struct pthread *) (READ_THREAD_POINTER () - TLS_TCB_OFFSET \
+		       - TLS_PRE_TCB_SIZE))
+
+/* Value passed to 'clone' for initialization of the thread register.  */
+#define TLS_DEFINE_INIT_TP(tp, pd) \
+  void *tp = (void *) (pd) + TLS_TCB_OFFSET + TLS_PRE_TCB_SIZE
+
+/* Informs libthread_db that the thread pointer is register 2, which is used
+ * to know how to do THREAD_SELF.  */
+#define DB_THREAD_SELF \
+  REGISTER (64, 64, 2 * 8, -TLS_TCB_OFFSET - TLS_PRE_TCB_SIZE)
+
+/* Access to data in the thread descriptor is easy.  */
+# include <tcb-access.h>
+
+/* l_tls_offset == 0 is perfectly valid, so we have to use some different
+   value to mean unset l_tls_offset.  */
+#define NO_TLS_OFFSET -1
+
+/* Get and set the global scope generation counter in struct pthread.  */
+#define THREAD_GSCOPE_IN_TCB 1
+#define THREAD_GSCOPE_FLAG_UNUSED 0
+#define THREAD_GSCOPE_FLAG_USED 1
+#define THREAD_GSCOPE_FLAG_WAIT 2
+#define THREAD_GSCOPE_RESET_FLAG() \
+  do \
+    { \
+      int __res = atomic_exchange_rel (&THREAD_SELF->header.gscope_flag, \
+				       THREAD_GSCOPE_FLAG_UNUSED); \
+      if (__res == THREAD_GSCOPE_FLAG_WAIT) \
+	lll_futex_wake (&THREAD_SELF->header.gscope_flag, 1, LLL_PRIVATE); \
+    } \
+  while (0)
+#define THREAD_GSCOPE_SET_FLAG() \
+  do \
+    { \
+      THREAD_SELF->header.gscope_flag = THREAD_GSCOPE_FLAG_USED; \
+      atomic_write_barrier (); \
+    } \
+  while (0)
+
+#endif /* __ASSEMBLER__ */
+
+#endif /* tls.h */
diff --git a/sysdeps/loongarch/stackinfo.h b/sysdeps/loongarch/stackinfo.h
new file mode 100644
index 0000000000..ff8b9b7bf2
--- /dev/null
+++ b/sysdeps/loongarch/stackinfo.h
@@ -0,0 +1,33 @@
+/* Stack environment definitions for LoongArch.
+   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/>.  */
+
+/* This file contains a bit of information about the stack allocation
+   of the processor.  */
+
+#ifndef _STACKINFO_H
+#define _STACKINFO_H 1
+
+#include <elf.h>
+
+/* On LoongArch the stack grows down.  */
+#define _STACK_GROWS_DOWN 1
+
+/* Default to a non-executable stack.  */
+#define DEFAULT_STACK_PERMS (PF_R | PF_W)
+
+#endif /* stackinfo.h */
-- 
2.20.1


^ permalink raw reply	[flat|nested] 21+ messages in thread

* [PATCH v3 06/13] LoongArch: Generic <math.h> and soft-fp Routines
  2022-04-15  1:31 [PATCH v3 00/13] GLIBC LoongArch PATCHES caiyinyu
                   ` (4 preceding siblings ...)
  2022-04-15  1:31 ` [PATCH v3 05/13] LoongArch: Thread-Local Storage Support caiyinyu
@ 2022-04-15  1:31 ` caiyinyu
  2022-04-15  1:31 ` [PATCH v3 07/13] LoongArch: Atomic and Locking Routines caiyinyu
                   ` (6 subsequent siblings)
  12 siblings, 0 replies; 21+ messages in thread
From: caiyinyu @ 2022-04-15  1:31 UTC (permalink / raw)
  To: libc-alpha, adhemerval.zanella; +Cc: joseph_myers, xuchenghua, caiyinyu

---
 sysdeps/loongarch/bits/fenv.h   |  90 ++++++++++++++++++++++++++++
 sysdeps/loongarch/e_sqrtl.c     |  38 ++++++++++++
 sysdeps/loongarch/fpu_control.h | 102 ++++++++++++++++++++++++++++++++
 sysdeps/loongarch/sfp-machine.h | 102 ++++++++++++++++++++++++++++++++
 sysdeps/loongarch/tininess.h    |   1 +
 5 files changed, 333 insertions(+)
 create mode 100644 sysdeps/loongarch/bits/fenv.h
 create mode 100644 sysdeps/loongarch/e_sqrtl.c
 create mode 100644 sysdeps/loongarch/fpu_control.h
 create mode 100644 sysdeps/loongarch/sfp-machine.h
 create mode 100644 sysdeps/loongarch/tininess.h

diff --git a/sysdeps/loongarch/bits/fenv.h b/sysdeps/loongarch/bits/fenv.h
new file mode 100644
index 0000000000..7e223b402b
--- /dev/null
+++ b/sysdeps/loongarch/bits/fenv.h
@@ -0,0 +1,90 @@
+/* Floating point environment.
+   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 _FENV_H
+#error "Never use <bits/fenv.h> directly; include <fenv.h> instead."
+#endif
+
+/* Define bits representing the exception.  We use the bit positions
+   of the appropriate bits in the FPU control word.  */
+enum
+{
+  FE_INEXACT =
+#define FE_INEXACT 0x010000
+    FE_INEXACT,
+  FE_UNDERFLOW =
+#define FE_UNDERFLOW 0x020000
+    FE_UNDERFLOW,
+  FE_OVERFLOW =
+#define FE_OVERFLOW 0x040000
+    FE_OVERFLOW,
+  FE_DIVBYZERO =
+#define FE_DIVBYZERO 0x080000
+    FE_DIVBYZERO,
+  FE_INVALID =
+#define FE_INVALID 0x100000
+    FE_INVALID,
+};
+
+#define FE_ALL_EXCEPT \
+  (FE_INEXACT | FE_DIVBYZERO | FE_UNDERFLOW | FE_OVERFLOW | FE_INVALID)
+
+/* The LoongArch FPU supports all of the four defined rounding modes.  We
+   use again the bit positions in the FPU control word as the values
+   for the appropriate macros.  */
+enum
+{
+  FE_TONEAREST =
+#define FE_TONEAREST 0x000
+    FE_TONEAREST,
+  FE_TOWARDZERO =
+#define FE_TOWARDZERO 0x100
+    FE_TOWARDZERO,
+  FE_UPWARD =
+#define FE_UPWARD 0x200
+    FE_UPWARD,
+  FE_DOWNWARD =
+#define FE_DOWNWARD 0x300
+    FE_DOWNWARD
+};
+
+/* Type representing exception flags.  */
+typedef unsigned int fexcept_t;
+
+/* Type representing floating-point environment.  This function corresponds
+   to the layout of the block written by the `fstenv'.  */
+typedef struct
+{
+  unsigned int __fp_control_register;
+} fenv_t;
+
+/* If the default argument is used we use this value.  */
+#define FE_DFL_ENV ((const fenv_t *) -1)
+
+#ifdef __USE_GNU
+/* Floating-point environment where none of the exception is masked.  */
+#define FE_NOMASK_ENV ((const fenv_t *) -257)
+#endif
+
+#if __GLIBC_USE (IEC_60559_BFP_EXT_C2X)
+/* Type representing floating-point control modes.  */
+typedef unsigned int femode_t;
+
+/* Default floating-point control modes.  */
+#define FE_DFL_MODE ((const femode_t *) -1L)
+#endif
diff --git a/sysdeps/loongarch/e_sqrtl.c b/sysdeps/loongarch/e_sqrtl.c
new file mode 100644
index 0000000000..5eb8cc8adb
--- /dev/null
+++ b/sysdeps/loongarch/e_sqrtl.c
@@ -0,0 +1,38 @@
+/* long double square root in software floating-point emulation.
+   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/>.  */
+
+#include <stdlib.h>
+#include <soft-fp/soft-fp.h>
+#include <soft-fp/quad.h>
+
+long double
+__ieee754_sqrtl (const long double a)
+{
+  FP_DECL_EX;
+  FP_DECL_Q (A);
+  FP_DECL_Q (C);
+  long double c;
+
+  FP_INIT_ROUNDMODE;
+  FP_UNPACK_Q (A, a);
+  FP_SQRT_Q (C, A);
+  FP_PACK_Q (c, C);
+  FP_HANDLE_EXCEPTIONS;
+  return c;
+}
+strong_alias (__ieee754_sqrtl, __sqrtl_finite)
diff --git a/sysdeps/loongarch/fpu_control.h b/sysdeps/loongarch/fpu_control.h
new file mode 100644
index 0000000000..e302ae52b1
--- /dev/null
+++ b/sysdeps/loongarch/fpu_control.h
@@ -0,0 +1,102 @@
+/* FPU control word bits.
+   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 _FPU_CONTROL_H
+#define _FPU_CONTROL_H
+
+/* LoongArch FPU floating point control register bits.
+ *
+ * 31-29  -> reserved (read as 0, can not changed by software)
+ * 28     -> cause bit for invalid exception
+ * 27     -> cause bit for division by zero exception
+ * 26     -> cause bit for overflow exception
+ * 25     -> cause bit for underflow exception
+ * 24     -> cause bit for inexact exception
+ * 23-21  -> reserved (read as 0, can not changed by software)
+ * 20     -> flag invalid exception
+ * 19     -> flag division by zero exception
+ * 18     -> flag overflow exception
+ * 17     -> flag underflow exception
+ * 16     -> flag inexact exception
+ *  9-8   -> rounding control
+ *  7-5   -> reserved (read as 0, can not changed by software)
+ *  4     -> enable exception for invalid exception
+ *  3     -> enable exception for division by zero exception
+ *  2     -> enable exception for overflow exception
+ *  1     -> enable exception for underflow exception
+ *  0     -> enable exception for inexact exception
+ *
+ *
+ * Rounding Control:
+ * 00 - rounding ties to even (RNE)
+ * 01 - rounding toward zero (RZ)
+ * 10 - rounding (up) toward plus infinity (RP)
+ * 11 - rounding (down) toward minus infinity (RM)
+ */
+
+#include <features.h>
+
+#ifdef __loongarch_soft_float
+
+#define _FPU_RESERVED 0xffffffff
+#define _FPU_DEFAULT 0x00000000
+typedef unsigned int fpu_control_t;
+#define _FPU_GETCW(cw) (cw) = 0
+#define _FPU_SETCW(cw) (void) (cw)
+extern fpu_control_t __fpu_control;
+
+#else /* __loongarch_soft_float */
+
+/* Masks for interrupts.  */
+#define _FPU_MASK_V 0x10 /* Invalid operation */
+#define _FPU_MASK_Z 0x08 /* Division by zero  */
+#define _FPU_MASK_O 0x04 /* Overflow */
+#define _FPU_MASK_U 0x02 /* Underflow */
+#define _FPU_MASK_I 0x01 /* Inexact operation */
+
+/* Flush denormalized numbers to zero.  */
+#define _FPU_FLUSH_TZ 0x1000000
+
+/* Rounding control.  */
+#define _FPU_RC_NEAREST 0x000 /* RECOMMENDED */
+#define _FPU_RC_ZERO 0x100
+#define _FPU_RC_UP 0x200
+#define _FPU_RC_DOWN 0x300
+/* Mask for rounding control.  */
+#define _FPU_RC_MASK 0x300
+
+#define _FPU_RESERVED 0x0
+
+#define _FPU_DEFAULT 0x0
+#define _FPU_IEEE 0x1F
+
+/* Type of the control word.  */
+typedef unsigned int fpu_control_t __attribute__ ((__mode__ (__SI__)));
+
+/* Macros for accessing the hardware control word.  */
+extern fpu_control_t __loongarch_fpu_getcw (void) __THROW;
+extern void __loongarch_fpu_setcw (fpu_control_t) __THROW;
+#define _FPU_GETCW(cw) __asm__ volatile("movfcsr2gr %0,$r0" : "=r"(cw))
+#define _FPU_SETCW(cw) __asm__ volatile("movgr2fcsr $r0,%0" : : "r"(cw))
+
+/* Default control word set at startup.  */
+extern fpu_control_t __fpu_control;
+
+#endif /* __loongarch_soft_float */
+
+#endif /* fpu_control.h */
diff --git a/sysdeps/loongarch/sfp-machine.h b/sysdeps/loongarch/sfp-machine.h
new file mode 100644
index 0000000000..27391f2945
--- /dev/null
+++ b/sysdeps/loongarch/sfp-machine.h
@@ -0,0 +1,102 @@
+/* LoongArch softfloat 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/>.  */
+
+#include <fenv.h>
+#include <fpu_control.h>
+
+#define _FP_W_TYPE_SIZE 64
+#define _FP_W_TYPE unsigned long long
+#define _FP_WS_TYPE signed long long
+#define _FP_I_TYPE long long
+
+#define _FP_MUL_MEAT_S(R, X, Y) _FP_MUL_MEAT_1_imm (_FP_WFRACBITS_S, R, X, Y)
+#define _FP_MUL_MEAT_D(R, X, Y) \
+  _FP_MUL_MEAT_1_wide (_FP_WFRACBITS_D, R, X, Y, umul_ppmm)
+#define _FP_MUL_MEAT_Q(R, X, Y) \
+  _FP_MUL_MEAT_2_wide_3mul (_FP_WFRACBITS_Q, R, X, Y, umul_ppmm)
+
+#define _FP_MUL_MEAT_DW_S(R, X, Y) \
+  _FP_MUL_MEAT_DW_1_imm (_FP_WFRACBITS_S, R, X, Y)
+#define _FP_MUL_MEAT_DW_D(R, X, Y) \
+  _FP_MUL_MEAT_DW_1_wide (_FP_WFRACBITS_D, R, X, Y, umul_ppmm)
+#define _FP_MUL_MEAT_DW_Q(R, X, Y) \
+  _FP_MUL_MEAT_DW_2_wide_3mul (_FP_WFRACBITS_Q, R, X, Y, umul_ppmm)
+
+#define _FP_DIV_MEAT_S(R, X, Y) \
+  _FP_DIV_MEAT_1_imm (S, R, X, Y, _FP_DIV_HELP_imm)
+#define _FP_DIV_MEAT_D(R, X, Y) _FP_DIV_MEAT_1_udiv_norm (D, R, X, Y)
+#define _FP_DIV_MEAT_Q(R, X, Y) _FP_DIV_MEAT_2_udiv (Q, R, X, Y)
+
+#define _FP_NANFRAC_S _FP_QNANBIT_S
+#define _FP_NANFRAC_D _FP_QNANBIT_D
+#define _FP_NANFRAC_Q _FP_QNANBIT_Q, 0
+
+#define _FP_NANSIGN_S 0
+#define _FP_NANSIGN_D 0
+#define _FP_NANSIGN_Q 0
+
+#define _FP_KEEPNANFRACP 1
+#define _FP_QNANNEGATEDP 0
+
+/* NaN payloads should be preserved for NAN2008.  */
+#define _FP_CHOOSENAN(fs, wc, R, X, Y, OP) \
+  do \
+    { \
+      R##_s = X##_s; \
+      _FP_FRAC_COPY_##wc (R, X); \
+      R##_c = FP_CLS_NAN; \
+    } \
+  while (0)
+
+#define _FP_DECL_EX fpu_control_t _fcw
+
+#define FP_ROUNDMODE (_fcw & 0x300)
+
+#define FP_RND_NEAREST FE_TONEAREST
+#define FP_RND_ZERO FE_TOWARDZERO
+#define FP_RND_PINF FE_UPWARD
+#define FP_RND_MINF FE_DOWNWARD
+
+#define FP_EX_INVALID FE_INVALID
+#define FP_EX_OVERFLOW FE_OVERFLOW
+#define FP_EX_UNDERFLOW FE_UNDERFLOW
+#define FP_EX_DIVZERO FE_DIVBYZERO
+#define FP_EX_INEXACT FE_INEXACT
+
+#define _FP_TININESS_AFTER_ROUNDING 1
+
+#ifdef __loongarch_hard_float
+#define FP_INIT_ROUNDMODE \
+  do \
+    { \
+      _FPU_GETCW (_fcw); \
+    } \
+  while (0)
+
+#define FP_HANDLE_EXCEPTIONS \
+  do \
+    { \
+      if (__builtin_expect (_fex, 0)) \
+	_FPU_SETCW (_fcw | _fex | (_fex << 8)); \
+    } \
+  while (0)
+#define FP_TRAPPING_EXCEPTIONS ((_fcw << 16) & 0x1f0000)
+#else
+#define FP_INIT_ROUNDMODE _fcw = FP_RND_NEAREST
+#endif
diff --git a/sysdeps/loongarch/tininess.h b/sysdeps/loongarch/tininess.h
new file mode 100644
index 0000000000..90956c35f7
--- /dev/null
+++ b/sysdeps/loongarch/tininess.h
@@ -0,0 +1 @@
+#define TININESS_AFTER_ROUNDING 1
-- 
2.20.1


^ permalink raw reply	[flat|nested] 21+ messages in thread

* [PATCH v3 07/13] LoongArch: Atomic and Locking Routines
  2022-04-15  1:31 [PATCH v3 00/13] GLIBC LoongArch PATCHES caiyinyu
                   ` (5 preceding siblings ...)
  2022-04-15  1:31 ` [PATCH v3 06/13] LoongArch: Generic <math.h> and soft-fp Routines caiyinyu
@ 2022-04-15  1:31 ` caiyinyu
  2022-04-15  1:31 ` [PATCH v3 08/13] LoongArch: Linux Syscall Interface caiyinyu
                   ` (5 subsequent siblings)
  12 siblings, 0 replies; 21+ messages in thread
From: caiyinyu @ 2022-04-15  1:31 UTC (permalink / raw)
  To: libc-alpha, adhemerval.zanella; +Cc: joseph_myers, xuchenghua, caiyinyu

---
 .../sysv/linux/loongarch/atomic-machine.h     | 181 ++++++++++++++++++
 1 file changed, 181 insertions(+)
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/atomic-machine.h

diff --git a/sysdeps/unix/sysv/linux/loongarch/atomic-machine.h b/sysdeps/unix/sysv/linux/loongarch/atomic-machine.h
new file mode 100644
index 0000000000..60db25587e
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/loongarch/atomic-machine.h
@@ -0,0 +1,181 @@
+/* Atomic operations.
+   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 _LINUX_LOONGARCH_BITS_ATOMIC_H
+#define _LINUX_LOONGARCH_BITS_ATOMIC_H 1
+
+#define atomic_full_barrier() __sync_synchronize ()
+
+#define __HAVE_64B_ATOMICS (__loongarch_grlen >=64)
+#define USE_ATOMIC_COMPILER_BUILTINS 1
+#define ATOMIC_EXCHANGE_USES_CAS 0
+
+/* Compare and exchange.
+   For all "bool" routines, we return FALSE if exchange succesful.  */
+
+#define __arch_compare_and_exchange_bool_8_int(mem, newval, oldval, model) \
+  ({ \
+    typeof (*mem) __oldval = (oldval); \
+    !__atomic_compare_exchange_n (mem, (void *) &__oldval, newval, 0, model, \
+				  __ATOMIC_RELAXED); \
+  })
+
+#define __arch_compare_and_exchange_bool_16_int(mem, newval, oldval, model) \
+  ({ \
+    typeof (*mem) __oldval = (oldval); \
+    !__atomic_compare_exchange_n (mem, (void *) &__oldval, newval, 0, model, \
+				  __ATOMIC_RELAXED); \
+  })
+
+#define __arch_compare_and_exchange_bool_32_int(mem, newval, oldval, model) \
+  ({ \
+    typeof (*mem) __oldval = (oldval); \
+    !__atomic_compare_exchange_n (mem, (void *) &__oldval, newval, 0, model, \
+				  __ATOMIC_RELAXED); \
+  })
+
+#define __arch_compare_and_exchange_bool_64_int(mem, newval, oldval, model) \
+  ({ \
+    typeof (*mem) __oldval = (oldval); \
+    !__atomic_compare_exchange_n (mem, (void *) &__oldval, newval, 0, model, \
+				  __ATOMIC_RELAXED); \
+  })
+
+#define __arch_compare_and_exchange_val_8_int(mem, newval, oldval, model) \
+  ({ \
+    typeof (*mem) __oldval = (oldval); \
+    __atomic_compare_exchange_n (mem, (void *) &__oldval, newval, 0, model, \
+				 __ATOMIC_RELAXED); \
+    __oldval; \
+  })
+
+#define __arch_compare_and_exchange_val_16_int(mem, newval, oldval, model) \
+  ({ \
+    typeof (*mem) __oldval = (oldval); \
+    __atomic_compare_exchange_n (mem, (void *) &__oldval, newval, 0, model, \
+				 __ATOMIC_RELAXED); \
+    __oldval; \
+  })
+
+#define __arch_compare_and_exchange_val_32_int(mem, newval, oldval, model) \
+  ({ \
+    typeof (*mem) __oldval = (oldval); \
+    __atomic_compare_exchange_n (mem, (void *) &__oldval, newval, 0, model, \
+				 __ATOMIC_RELAXED); \
+    __oldval; \
+  })
+
+#define __arch_compare_and_exchange_val_64_int(mem, newval, oldval, model) \
+  ({ \
+    typeof (*mem) __oldval = (oldval); \
+    __atomic_compare_exchange_n (mem, (void *) &__oldval, newval, 0, model, \
+				 __ATOMIC_RELAXED); \
+    __oldval; \
+  })
+
+/* Atomic compare and exchange.  */
+
+#define atomic_compare_and_exchange_bool_acq(mem, new, old) \
+  __atomic_bool_bysize (__arch_compare_and_exchange_bool, int, mem, new, old, \
+			__ATOMIC_ACQUIRE)
+
+#define atomic_compare_and_exchange_val_acq(mem, new, old) \
+  __atomic_val_bysize (__arch_compare_and_exchange_val, int, mem, new, old, \
+		       __ATOMIC_ACQUIRE)
+
+#define atomic_compare_and_exchange_val_rel(mem, new, old) \
+  __atomic_val_bysize (__arch_compare_and_exchange_val, int, mem, new, old, \
+		       __ATOMIC_RELEASE)
+
+/* Atomic exchange (without compare).  */
+
+#define __arch_exchange_8_int(mem, newval, model) \
+  __atomic_exchange_n (mem, newval, model)
+
+#define __arch_exchange_16_int(mem, newval, model) \
+  __atomic_exchange_n (mem, newval, model)
+
+#define __arch_exchange_32_int(mem, newval, model) \
+  __atomic_exchange_n (mem, newval, model)
+
+#define __arch_exchange_64_int(mem, newval, model) \
+  __atomic_exchange_n (mem, newval, model)
+
+#define atomic_exchange_acq(mem, value) \
+  __atomic_val_bysize (__arch_exchange, int, mem, value, __ATOMIC_ACQUIRE)
+
+#define atomic_exchange_rel(mem, value) \
+  __atomic_val_bysize (__arch_exchange, int, mem, value, __ATOMIC_RELEASE)
+
+/* Atomically add value and return the previous (unincremented) value.  */
+
+#define __arch_exchange_and_add_8_int(mem, value, model) \
+  __atomic_fetch_add (mem, value, model)
+
+#define __arch_exchange_and_add_16_int(mem, value, model) \
+  __atomic_fetch_add (mem, value, model)
+
+#define __arch_exchange_and_add_32_int(mem, value, model) \
+  __atomic_fetch_add (mem, value, model)
+
+#define __arch_exchange_and_add_64_int(mem, value, model) \
+  __atomic_fetch_add (mem, value, model)
+
+#define atomic_exchange_and_add_acq(mem, value) \
+  __atomic_val_bysize (__arch_exchange_and_add, int, mem, value, \
+		       __ATOMIC_ACQUIRE)
+
+#define atomic_exchange_and_add_rel(mem, value) \
+  __atomic_val_bysize (__arch_exchange_and_add, int, mem, value, \
+		       __ATOMIC_RELEASE)
+
+/* Miscellaneous.  */
+
+#define asm_amo(which, mem, value) \
+  ({ \
+    __atomic_check_size (mem); \
+    typeof (*mem) __tmp; \
+    if (sizeof (__tmp) == 4) \
+      asm volatile(which ".w" \
+			 "\t%0, %z2, %1" \
+		   : "=&r"(__tmp), "+ZB"(*(mem)) \
+		   : "rJ"(value)); \
+    else if (sizeof (__tmp) == 8) \
+      asm volatile(which ".d" \
+			 "\t%0, %z2, %1" \
+		   : "=&r"(__tmp), "+ZB"(*(mem)) \
+		   : "rJ"(value)); \
+    else \
+      abort (); \
+    __tmp; \
+  })
+
+#define atomic_max(mem, value) asm_amo ("ammax_db", mem, value)
+#define atomic_min(mem, value) asm_amo ("ammin_db", mem, value)
+
+#define atomic_bit_test_set(mem, bit) \
+  ({ \
+    typeof (*mem) __mask = (typeof (*mem)) 1 << (bit); \
+    asm_amo ("amor_db", mem, __mask) & __mask; \
+  })
+
+#define catomic_exchange_and_add(mem, value) \
+  atomic_exchange_and_add (mem, value)
+#define catomic_max(mem, value) atomic_max (mem, value)
+
+#endif /* bits/atomic.h */
-- 
2.20.1


^ permalink raw reply	[flat|nested] 21+ messages in thread

* [PATCH v3 08/13] LoongArch: Linux Syscall Interface
  2022-04-15  1:31 [PATCH v3 00/13] GLIBC LoongArch PATCHES caiyinyu
                   ` (6 preceding siblings ...)
  2022-04-15  1:31 ` [PATCH v3 07/13] LoongArch: Atomic and Locking Routines caiyinyu
@ 2022-04-15  1:31 ` caiyinyu
  2022-04-15  1:31 ` [PATCH v3 09/13] LoongArch: Linux ABI caiyinyu
                   ` (4 subsequent siblings)
  12 siblings, 0 replies; 21+ messages in thread
From: caiyinyu @ 2022-04-15  1:31 UTC (permalink / raw)
  To: libc-alpha, adhemerval.zanella; +Cc: joseph_myers, xuchenghua, caiyinyu

---
 sysdeps/loongarch/abort-instr.h               |   2 +
 sysdeps/loongarch/hp-timing.h                 |  42 +++
 .../unix/sysv/linux/loongarch/arch-syscall.h  | 303 +++++++++++++++++
 sysdeps/unix/sysv/linux/loongarch/clone.S     |  96 ++++++
 sysdeps/unix/sysv/linux/loongarch/clone3.S    |  83 +++++
 sysdeps/unix/sysv/linux/loongarch/sysdep.S    |  53 +++
 sysdeps/unix/sysv/linux/loongarch/sysdep.h    | 321 ++++++++++++++++++
 sysdeps/unix/sysv/linux/loongarch/vfork.S     |  50 +++
 8 files changed, 950 insertions(+)
 create mode 100644 sysdeps/loongarch/abort-instr.h
 create mode 100644 sysdeps/loongarch/hp-timing.h
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/arch-syscall.h
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/clone.S
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/clone3.S
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/sysdep.S
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/sysdep.h
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/vfork.S

diff --git a/sysdeps/loongarch/abort-instr.h b/sysdeps/loongarch/abort-instr.h
new file mode 100644
index 0000000000..46d3ad0871
--- /dev/null
+++ b/sysdeps/loongarch/abort-instr.h
@@ -0,0 +1,2 @@
+/* An instruction which should crash any program is a breakpoint.  */
+#define ABORT_INSTRUCTION asm ("break 0")
diff --git a/sysdeps/loongarch/hp-timing.h b/sysdeps/loongarch/hp-timing.h
new file mode 100644
index 0000000000..af1da81024
--- /dev/null
+++ b/sysdeps/loongarch/hp-timing.h
@@ -0,0 +1,42 @@
+/* High precision, low overhead timing functions.
+   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 _HP_TIMING_H
+#define _HP_TIMING_H 1
+
+/* We always assume having the timestamp register.  */
+#define HP_TIMING_AVAIL (1)
+#define HP_SMALL_TIMING_AVAIL (1)
+
+/* We indeed have inlined functions.  */
+#define HP_TIMING_INLINE (1)
+
+/* We use 64bit values for the times.  */
+typedef unsigned long long int hp_timing_t;
+
+/* Read the stable counter.  */
+#define HP_TIMING_NOW(Var) \
+  ({ \
+    unsigned long long int _count; \
+    asm volatile ("rdtime.d\t%0,$r0" : "=r" (_count)); \
+    (Var) = _count; \
+  })
+
+#include <hp-timing-common.h>
+
+#endif /* hp-timing.h */
diff --git a/sysdeps/unix/sysv/linux/loongarch/arch-syscall.h b/sysdeps/unix/sysv/linux/loongarch/arch-syscall.h
new file mode 100644
index 0000000000..f9d64818a8
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/loongarch/arch-syscall.h
@@ -0,0 +1,303 @@
+/* AUTOGENERATED by update-syscall-lists.py.  */
+#define __NR_accept 202
+#define __NR_accept4 242
+#define __NR_acct 89
+#define __NR_add_key 217
+#define __NR_adjtimex 171
+#define __NR_bind 200
+#define __NR_bpf 280
+#define __NR_brk 214
+#define __NR_capget 90
+#define __NR_capset 91
+#define __NR_chdir 49
+#define __NR_chroot 51
+#define __NR_clock_adjtime 266
+#define __NR_clock_getres 114
+#define __NR_clock_gettime 113
+#define __NR_clock_nanosleep 115
+#define __NR_clock_settime 112
+#define __NR_clone 220
+#define __NR_clone3 435
+#define __NR_close 57
+#define __NR_close_range 436
+#define __NR_connect 203
+#define __NR_copy_file_range 285
+#define __NR_delete_module 106
+#define __NR_dup 23
+#define __NR_dup3 24
+#define __NR_epoll_create1 20
+#define __NR_epoll_ctl 21
+#define __NR_epoll_pwait 22
+#define __NR_epoll_pwait2 441
+#define __NR_eventfd2 19
+#define __NR_execve 221
+#define __NR_execveat 281
+#define __NR_exit 93
+#define __NR_exit_group 94
+#define __NR_faccessat 48
+#define __NR_faccessat2 439
+#define __NR_fadvise64 223
+#define __NR_fallocate 47
+#define __NR_fanotify_init 262
+#define __NR_fanotify_mark 263
+#define __NR_fchdir 50
+#define __NR_fchmod 52
+#define __NR_fchmodat 53
+#define __NR_fchown 55
+#define __NR_fchownat 54
+#define __NR_fcntl 25
+#define __NR_fdatasync 83
+#define __NR_fgetxattr 10
+#define __NR_finit_module 273
+#define __NR_flistxattr 13
+#define __NR_flock 32
+#define __NR_fremovexattr 16
+#define __NR_fsconfig 431
+#define __NR_fsetxattr 7
+#define __NR_fsmount 432
+#define __NR_fsopen 430
+#define __NR_fspick 433
+#define __NR_fstat 80
+#define __NR_fstatfs 44
+#define __NR_fsync 82
+#define __NR_ftruncate 46
+#define __NR_futex 98
+#define __NR_futex_waitv 449
+#define __NR_get_mempolicy 236
+#define __NR_get_robust_list 100
+#define __NR_getcpu 168
+#define __NR_getcwd 17
+#define __NR_getdents64 61
+#define __NR_getegid 177
+#define __NR_geteuid 175
+#define __NR_getgid 176
+#define __NR_getgroups 158
+#define __NR_getitimer 102
+#define __NR_getpeername 205
+#define __NR_getpgid 155
+#define __NR_getpid 172
+#define __NR_getppid 173
+#define __NR_getpriority 141
+#define __NR_getrandom 278
+#define __NR_getresgid 150
+#define __NR_getresuid 148
+#define __NR_getrusage 165
+#define __NR_getsid 156
+#define __NR_getsockname 204
+#define __NR_getsockopt 209
+#define __NR_gettid 178
+#define __NR_gettimeofday 169
+#define __NR_getuid 174
+#define __NR_getxattr 8
+#define __NR_init_module 105
+#define __NR_inotify_add_watch 27
+#define __NR_inotify_init1 26
+#define __NR_inotify_rm_watch 28
+#define __NR_io_cancel 3
+#define __NR_io_destroy 1
+#define __NR_io_getevents 4
+#define __NR_io_pgetevents 292
+#define __NR_io_setup 0
+#define __NR_io_submit 2
+#define __NR_io_uring_enter 426
+#define __NR_io_uring_register 427
+#define __NR_io_uring_setup 425
+#define __NR_ioctl 29
+#define __NR_ioprio_get 31
+#define __NR_ioprio_set 30
+#define __NR_kcmp 272
+#define __NR_kexec_file_load 294
+#define __NR_kexec_load 104
+#define __NR_keyctl 219
+#define __NR_kill 129
+#define __NR_landlock_add_rule 445
+#define __NR_landlock_create_ruleset 444
+#define __NR_landlock_restrict_self 446
+#define __NR_lgetxattr 9
+#define __NR_linkat 37
+#define __NR_listen 201
+#define __NR_listxattr 11
+#define __NR_llistxattr 12
+#define __NR_lookup_dcookie 18
+#define __NR_lremovexattr 15
+#define __NR_lseek 62
+#define __NR_lsetxattr 6
+#define __NR_madvise 233
+#define __NR_mbind 235
+#define __NR_membarrier 283
+#define __NR_memfd_create 279
+#define __NR_migrate_pages 238
+#define __NR_mincore 232
+#define __NR_mkdirat 34
+#define __NR_mknodat 33
+#define __NR_mlock 228
+#define __NR_mlock2 284
+#define __NR_mlockall 230
+#define __NR_mmap 222
+#define __NR_mount 40
+#define __NR_mount_setattr 442
+#define __NR_move_mount 429
+#define __NR_move_pages 239
+#define __NR_mprotect 226
+#define __NR_mq_getsetattr 185
+#define __NR_mq_notify 184
+#define __NR_mq_open 180
+#define __NR_mq_timedreceive 183
+#define __NR_mq_timedsend 182
+#define __NR_mq_unlink 181
+#define __NR_mremap 216
+#define __NR_msgctl 187
+#define __NR_msgget 186
+#define __NR_msgrcv 188
+#define __NR_msgsnd 189
+#define __NR_msync 227
+#define __NR_munlock 229
+#define __NR_munlockall 231
+#define __NR_munmap 215
+#define __NR_name_to_handle_at 264
+#define __NR_nanosleep 101
+#define __NR_newfstatat 79
+#define __NR_nfsservctl 42
+#define __NR_open_by_handle_at 265
+#define __NR_open_tree 428
+#define __NR_openat 56
+#define __NR_openat2 437
+#define __NR_perf_event_open 241
+#define __NR_personality 92
+#define __NR_pidfd_getfd 438
+#define __NR_pidfd_open 434
+#define __NR_pidfd_send_signal 424
+#define __NR_pipe2 59
+#define __NR_pivot_root 41
+#define __NR_pkey_alloc 289
+#define __NR_pkey_free 290
+#define __NR_pkey_mprotect 288
+#define __NR_ppoll 73
+#define __NR_prctl 167
+#define __NR_pread64 67
+#define __NR_preadv 69
+#define __NR_preadv2 286
+#define __NR_prlimit64 261
+#define __NR_process_madvise 440
+#define __NR_process_mrelease 448
+#define __NR_process_vm_readv 270
+#define __NR_process_vm_writev 271
+#define __NR_pselect6 72
+#define __NR_ptrace 117
+#define __NR_pwrite64 68
+#define __NR_pwritev 70
+#define __NR_pwritev2 287
+#define __NR_quotactl 60
+#define __NR_quotactl_fd 443
+#define __NR_read 63
+#define __NR_readahead 213
+#define __NR_readlinkat 78
+#define __NR_readv 65
+#define __NR_reboot 142
+#define __NR_recvfrom 207
+#define __NR_recvmmsg 243
+#define __NR_recvmsg 212
+#define __NR_remap_file_pages 234
+#define __NR_removexattr 14
+#define __NR_renameat2 276
+#define __NR_request_key 218
+#define __NR_restart_syscall 128
+#define __NR_rseq 293
+#define __NR_rt_sigaction 134
+#define __NR_rt_sigpending 136
+#define __NR_rt_sigprocmask 135
+#define __NR_rt_sigqueueinfo 138
+#define __NR_rt_sigreturn 139
+#define __NR_rt_sigsuspend 133
+#define __NR_rt_sigtimedwait 137
+#define __NR_rt_tgsigqueueinfo 240
+#define __NR_sched_get_priority_max 125
+#define __NR_sched_get_priority_min 126
+#define __NR_sched_getaffinity 123
+#define __NR_sched_getattr 275
+#define __NR_sched_getparam 121
+#define __NR_sched_getscheduler 120
+#define __NR_sched_rr_get_interval 127
+#define __NR_sched_setaffinity 122
+#define __NR_sched_setattr 274
+#define __NR_sched_setparam 118
+#define __NR_sched_setscheduler 119
+#define __NR_sched_yield 124
+#define __NR_seccomp 277
+#define __NR_semctl 191
+#define __NR_semget 190
+#define __NR_semop 193
+#define __NR_semtimedop 192
+#define __NR_sendfile 71
+#define __NR_sendmmsg 269
+#define __NR_sendmsg 211
+#define __NR_sendto 206
+#define __NR_set_mempolicy 237
+#define __NR_set_mempolicy_home_node 450
+#define __NR_set_robust_list 99
+#define __NR_set_tid_address 96
+#define __NR_setdomainname 162
+#define __NR_setfsgid 152
+#define __NR_setfsuid 151
+#define __NR_setgid 144
+#define __NR_setgroups 159
+#define __NR_sethostname 161
+#define __NR_setitimer 103
+#define __NR_setns 268
+#define __NR_setpgid 154
+#define __NR_setpriority 140
+#define __NR_setregid 143
+#define __NR_setresgid 149
+#define __NR_setresuid 147
+#define __NR_setreuid 145
+#define __NR_setsid 157
+#define __NR_setsockopt 208
+#define __NR_settimeofday 170
+#define __NR_setuid 146
+#define __NR_setxattr 5
+#define __NR_shmat 196
+#define __NR_shmctl 195
+#define __NR_shmdt 197
+#define __NR_shmget 194
+#define __NR_shutdown 210
+#define __NR_sigaltstack 132
+#define __NR_signalfd4 74
+#define __NR_socket 198
+#define __NR_socketpair 199
+#define __NR_splice 76
+#define __NR_statfs 43
+#define __NR_statx 291
+#define __NR_swapoff 225
+#define __NR_swapon 224
+#define __NR_symlinkat 36
+#define __NR_sync 81
+#define __NR_sync_file_range 84
+#define __NR_syncfs 267
+#define __NR_sysinfo 179
+#define __NR_syslog 116
+#define __NR_tee 77
+#define __NR_tgkill 131
+#define __NR_timer_create 107
+#define __NR_timer_delete 111
+#define __NR_timer_getoverrun 109
+#define __NR_timer_gettime 108
+#define __NR_timer_settime 110
+#define __NR_timerfd_create 85
+#define __NR_timerfd_gettime 87
+#define __NR_timerfd_settime 86
+#define __NR_times 153
+#define __NR_tkill 130
+#define __NR_truncate 45
+#define __NR_umask 166
+#define __NR_umount2 39
+#define __NR_uname 160
+#define __NR_unlinkat 35
+#define __NR_unshare 97
+#define __NR_userfaultfd 282
+#define __NR_utimensat 88
+#define __NR_vhangup 58
+#define __NR_vmsplice 75
+#define __NR_wait4 260
+#define __NR_waitid 95
+#define __NR_write 64
+#define __NR_writev 66
diff --git a/sysdeps/unix/sysv/linux/loongarch/clone.S b/sysdeps/unix/sysv/linux/loongarch/clone.S
new file mode 100644
index 0000000000..00d9ae3406
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/loongarch/clone.S
@@ -0,0 +1,96 @@
+/* The clone syscall wrapper.
+   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/>.  */
+
+/* clone() is even more special than fork() as it mucks with stacks
+   and invokes a function in the right context after its all over.  */
+
+#include <sys/asm.h>
+#include <sysdep.h>
+#define _ERRNO_H  1
+#include <bits/errno.h>
+#include <tls.h>
+#include "tcb-offsets.h"
+
+/* int clone(int (*fn)(void *arg), void *child_stack, int flags, void *arg,
+   void *parent_tidptr, void *tls, void *child_tidptr) */
+
+ENTRY (__clone)
+
+	/* Align stack to 16 or 8 bytes per the ABI.  */
+	BSTRINS		a1, zero, 3, 0
+
+	/* Sanity check arguments.  */
+	beqz		a0, L (invalid) /* No NULL function pointers.  */
+	beqz		a1, L (invalid) /* No NULL stack pointers.  */
+
+	ADDI 		a1, a1, -16 /* Reserve argument save space.  */
+	REG_S		a0, a1, 0   /* Save function pointer.  */
+	REG_S		a3, a1, SZREG   /* Save argument pointer.  */
+
+	/* The syscall expects the args to be in different slots.  */
+	or		a0, a2, zero
+	or		a2, a4, zero
+	or		a3, a6, zero
+	or		a4, a5, zero
+
+	/* Do the system call.  */
+	LI		a7,__NR_clone
+	syscall		0
+
+	blt		a0, zero ,L (error)
+	beqz		a0,L (thread_start)
+
+	/* Successful return from the parent.  */
+	ret
+
+L (invalid):
+	LI		a0, -EINVAL
+
+	/* Something bad happened -- no child created.  */
+L (error):
+	b		__syscall_error
+
+END (__clone)
+
+/* Load up the arguments to the function.  Put this block of code in
+   its own function so that we can terminate the stack trace with our
+   debug info.  */
+ENTRY (__thread_start)
+L (thread_start):
+
+/* Terminate call stack by noting ra is undefined.  Use a dummy
+   .cfi_label to force starting the FDE.  */
+	.cfi_label .Ldummy
+	cfi_undefined (1)
+
+	/* Restore the arg for user's function.  */
+	REG_L		a1, sp, 0   /* Function pointer.  */
+	REG_L		a0, sp, SZREG   /* Argument pointer.  */
+
+	/* Call the user's function.  */
+	jirl		ra, a1, 0
+
+	/* Call exit with the function's return value.  */
+	LI		a7, __NR_exit
+	syscall		0
+
+	END (__thread_start)
+
+libc_hidden_def (__clone)
+weak_alias (__clone, clone)
diff --git a/sysdeps/unix/sysv/linux/loongarch/clone3.S b/sysdeps/unix/sysv/linux/loongarch/clone3.S
new file mode 100644
index 0000000000..7cbb550dca
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/loongarch/clone3.S
@@ -0,0 +1,83 @@
+/* The clone3 syscall wrapper.
+   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/>.  */
+
+/* clone3() is even more special than fork() as it mucks with stacks
+   and invokes a function in the right context after its all over.  */
+
+#include <sys/asm.h>
+#include <sysdep.h>
+#define _ERRNO_H  1
+#include <bits/errno.h>
+#include <tls.h>
+#include "tcb-offsets.h"
+
+/* int clone3(struct clone_args *cl_args, size_t size,
+   int (*func)(void *arg), void *arg); */
+
+ENTRY (__clone3)
+
+	/* Sanity check arguments.  */
+	beqz		a0, L (invalid)	/* No NULL cl_args pointer.  */
+	beqz		a2, L (invalid)	/* No NULL function pointer.  */
+
+	/* Do the system call.  */
+	LI		a7, __NR_clone3
+	syscall		0
+
+	blt		a0, zero ,L (error)
+	beqz		a0, L (thread_start3)
+
+	/* Successful return from the parent.  */
+	ret
+
+L (invalid):
+	LI		a0, -EINVAL
+
+	/* Something bad happened -- no child created.  */
+L (error):
+	b		__syscall_error
+
+END (__clone3)
+
+/* Load up the arguments to the function.  Put this block of code in
+   its own function so that we can terminate the stack trace with our
+   debug info.  */
+ENTRY (__thread_start3)
+L (thread_start3):
+
+/* Terminate call stack by noting ra is undefined.  Use a dummy
+   .cfi_label to force starting the FDE.  */
+	.cfi_label .Ldummy
+	cfi_undefined (1)
+
+	/* Align stack to 16 or 8 bytes per the ABI.  */
+	BSTRINS		sp, zero, 3, 0
+
+	/* Set up arguments for the function call.  */
+	move		a0, a3		/* Argument.  */
+	jirl		ra, a2, 0	/* Call function.  */
+
+	/* Call exit with the function's return value.  */
+	LI		a7, __NR_exit
+	syscall		0
+
+	END (__thread_start3)
+
+libc_hidden_def (__clone3)
+weak_alias (__clone3, clone3)
diff --git a/sysdeps/unix/sysv/linux/loongarch/sysdep.S b/sysdeps/unix/sysv/linux/loongarch/sysdep.S
new file mode 100644
index 0000000000..b5f5d9f351
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/loongarch/sysdep.S
@@ -0,0 +1,53 @@
+/* syscall error handlers
+   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/>.  */
+
+#include <sysdep.h>
+
+#if IS_IN (libc)
+# define errno __libc_errno
+#endif
+
+ENTRY (__syscall_error)
+/* Fall through to __syscall_set_errno */
+END (__syscall_error)
+
+/* Non-standard calling convention: argument in a0, return address in t0,
+   and clobber only t1.
+ */
+ENTRY (__syscall_set_errno)
+
+/* We got here because a0 < 0, but only codes in the range [-4095, -1]
+   represent errors.	Otherwise, just return the result normally.
+ */
+	li.d		t1, -4096
+	bgeu		t1, a0, L (out)
+	sub.w		a0, zero, a0
+#if RTLD_PRIVATE_ERRNO
+	la		t1, rtld_errno
+#elif defined(__PIC__)
+	la.tls.ie	t1, errno
+	add.d		t1, tp, t1
+#else
+	la.tls.le	t1, errno
+	add.d		t1, tp, t1
+#endif
+	st.w		a0, t1, 0
+	li.d		a0, -1
+L (out):
+	ret
+END (__syscall_set_errno)
diff --git a/sysdeps/unix/sysv/linux/loongarch/sysdep.h b/sysdeps/unix/sysv/linux/loongarch/sysdep.h
new file mode 100644
index 0000000000..a90d2b65ed
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/loongarch/sysdep.h
@@ -0,0 +1,321 @@
+/* Assembly macros for LoongArch.
+   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 _LINUX_LOONGARCH_SYSDEP_H
+#define _LINUX_LOONGARCH_SYSDEP_H 1
+
+#include <sysdeps/unix/sysv/linux/generic/sysdep.h>
+#include <tls.h>
+
+#ifdef __ASSEMBLER__
+
+#include <sys/asm.h>
+#define ret jirl zero, ra, 0
+#define L(label) .L##label
+
+/* Performs a system call, handling errors by setting errno.  Linux indicates
+   errors by setting a0 to a value between -1 and -4095.  */
+#undef PSEUDO
+#define PSEUDO(name, syscall_name, args) \
+  ENTRY (name); \
+  li.d a7, SYS_ify (syscall_name); \
+  syscall 0; \
+  li.d a7, -4096; \
+  bltu a7, a0, .Lsyscall_error##name;
+
+#undef PSEUDO_END
+#define PSEUDO_END(sym) \
+  SYSCALL_ERROR_HANDLER (sym); \
+  ret; \
+  END (sym);
+
+#if !IS_IN(libc)
+#if RTLD_PRIVATE_ERRNO
+
+#define SYSCALL_ERROR_HANDLER(name) \
+  .Lsyscall_error##name : la t0, rtld_errno; \
+  sub.w a0, zero, a0; \
+  st.w a0, t0, 0; \
+  li.d a0, -1;
+
+#else
+
+#define SYSCALL_ERROR_HANDLER(name) \
+  .Lsyscall_error##name : la.tls.ie t0, errno; \
+  add.d t0, tp, t0; \
+  sub.w a0, zero, a0; \
+  st.w a0, t0, 0; \
+  li.d a0, -1;
+
+#endif
+#else
+
+#define SYSCALL_ERROR_HANDLER(name) .Lsyscall_error##name : b __syscall_error;
+
+#endif
+
+/* Performs a system call, not setting errno.  */
+#undef PSEUDO_NEORRNO
+#define PSEUDO_NOERRNO(name, syscall_name, args) \
+  ENTRY (name); \
+  li.d a7, SYS_ify (syscall_name); \
+  syscall 0;
+
+#undef PSEUDO_END_NOERRNO
+#define PSEUDO_END_NOERRNO(name) END (name);
+
+#undef ret_NOERRNO
+#define ret_NOERRNO ret
+
+/* Perfroms a system call, returning the error code.  */
+#undef PSEUDO_ERRVAL
+#define PSEUDO_ERRVAL(name, syscall_name, args) \
+  PSEUDO_NOERRNO (name, syscall_name, args); \
+  slli.d a0, a0, 32; \
+  srai.d a0, a0, 32; /* sign_ext */ \
+  sub.d a0, zero, a0;
+
+#undef PSEUDO_END_ERRVAL
+#define PSEUDO_END_ERRVAL(name) END (name);
+
+#undef ret_ERRVAL
+#define ret_ERRVAL ret
+
+#endif /* __ASSEMBLER__ */
+
+/* In order to get __set_errno() definition in INLINE_SYSCALL.  */
+#ifndef __ASSEMBLER__
+#include <errno.h>
+#endif
+
+#include <sysdeps/unix/sysdep.h>
+
+#undef SYS_ify
+#define SYS_ify(syscall_name) __NR_##syscall_name
+
+#ifndef __ASSEMBLER__
+
+#define VDSO_NAME "LINUX_2.6"
+#define VDSO_HASH 61765110
+
+/* List of system calls which are supported as vsyscalls.  */
+#define HAVE_CLOCK_GETRES64_VSYSCALL "__vdso_clock_getres"
+#define HAVE_CLOCK_GETTIME64_VSYSCALL "__vdso_clock_gettime"
+#define HAVE_GETTIMEOFDAY_VSYSCALL "__vdso_gettimeofday"
+#define HAVE_GETCPU_VSYSCALL "__vdso_getcpu"
+
+#define HAVE_CLONE3_WRAPPER 1
+
+#define INTERNAL_SYSCALL(name, nr, args...) \
+  internal_syscall##nr (SYS_ify (name), args)
+
+#define INTERNAL_SYSCALL_NCS(number, nr, args...) \
+  internal_syscall##nr (number, args)
+
+#define internal_syscall0(number, dummy...) \
+  ({ \
+    long int _sys_result; \
+\
+    { \
+      register long int __a7 asm("$a7") = number; \
+      register long int __a0 asm("$a0"); \
+      __asm__ volatile("syscall	0\n\t" \
+		       : "=r"(__a0) \
+		       : "r"(__a7) \
+		       : __SYSCALL_CLOBBERS); \
+      _sys_result = __a0; \
+    } \
+    _sys_result; \
+  })
+
+#define internal_syscall1(number, arg0) \
+  ({ \
+    long int _sys_result; \
+\
+    { \
+      long int _arg0 = (long int) (arg0); \
+      register long int __a7 asm("$a7") = number; \
+      register long int __a0 asm("$a0") = _arg0; \
+      __asm__ volatile("syscall	0\n\t" \
+		       : "+r"(__a0) \
+		       : "r"(__a7) \
+		       : __SYSCALL_CLOBBERS); \
+      _sys_result = __a0; \
+    } \
+    _sys_result; \
+  })
+
+#define internal_syscall2(number, arg0, arg1) \
+  ({ \
+    long int _sys_result; \
+\
+    { \
+      long int _arg0 = (long int) (arg0); \
+      long int _arg1 = (long int) (arg1); \
+      register long int __a7 asm("$a7") = number; \
+      register long int __a0 asm("$a0") = _arg0; \
+      register long int __a1 asm("$a1") = _arg1; \
+      __asm__ volatile("syscall	0\n\t" \
+		       : "+r"(__a0) \
+		       : "r"(__a7), "r"(__a1) \
+		       : __SYSCALL_CLOBBERS); \
+      _sys_result = __a0; \
+    } \
+    _sys_result; \
+  })
+
+#define internal_syscall3(number, arg0, arg1, arg2) \
+  ({ \
+    long int _sys_result; \
+\
+    { \
+      long int _arg0 = (long int) (arg0); \
+      long int _arg1 = (long int) (arg1); \
+      long int _arg2 = (long int) (arg2); \
+      register long int __a7 asm("$a7") = number; \
+      register long int __a0 asm("$a0") = _arg0; \
+      register long int __a1 asm("$a1") = _arg1; \
+      register long int __a2 asm("$a2") = _arg2; \
+      __asm__ volatile("syscall	0\n\t" \
+		       : "+r"(__a0) \
+		       : "r"(__a7), "r"(__a1), "r"(__a2) \
+		       : __SYSCALL_CLOBBERS); \
+      _sys_result = __a0; \
+    } \
+    _sys_result; \
+  })
+
+#define internal_syscall4(number, arg0, arg1, arg2, arg3) \
+  ({ \
+    long int _sys_result; \
+\
+    { \
+      long int _arg0 = (long int) (arg0); \
+      long int _arg1 = (long int) (arg1); \
+      long int _arg2 = (long int) (arg2); \
+      long int _arg3 = (long int) (arg3); \
+      register long int __a7 asm("$a7") = number; \
+      register long int __a0 asm("$a0") = _arg0; \
+      register long int __a1 asm("$a1") = _arg1; \
+      register long int __a2 asm("$a2") = _arg2; \
+      register long int __a3 asm("$a3") = _arg3; \
+      __asm__ volatile("syscall	0\n\t" \
+		       : "+r"(__a0) \
+		       : "r"(__a7), "r"(__a1), "r"(__a2), "r"(__a3) \
+		       : __SYSCALL_CLOBBERS); \
+      _sys_result = __a0; \
+    } \
+    _sys_result; \
+  })
+
+#define internal_syscall5(number, arg0, arg1, arg2, arg3, arg4) \
+  ({ \
+    long int _sys_result; \
+\
+    { \
+      long int _arg0 = (long int) (arg0); \
+      long int _arg1 = (long int) (arg1); \
+      long int _arg2 = (long int) (arg2); \
+      long int _arg3 = (long int) (arg3); \
+      long int _arg4 = (long int) (arg4); \
+      register long int __a7 asm("$a7") = number; \
+      register long int __a0 asm("$a0") = _arg0; \
+      register long int __a1 asm("$a1") = _arg1; \
+      register long int __a2 asm("$a2") = _arg2; \
+      register long int __a3 asm("$a3") = _arg3; \
+      register long int __a4 asm("$a4") = _arg4; \
+      __asm__ volatile("syscall	0\n\t" \
+		       : "+r"(__a0) \
+		       : "r"(__a7), "r"(__a1), "r"(__a2), \
+			 "r"(__a3), "r"(__a4) \
+		       : __SYSCALL_CLOBBERS); \
+      _sys_result = __a0; \
+    } \
+    _sys_result; \
+  })
+
+#define internal_syscall6(number, arg0, arg1, arg2, arg3, arg4, arg5) \
+  ({ \
+    long int _sys_result; \
+\
+    { \
+      long int _arg0 = (long int) (arg0); \
+      long int _arg1 = (long int) (arg1); \
+      long int _arg2 = (long int) (arg2); \
+      long int _arg3 = (long int) (arg3); \
+      long int _arg4 = (long int) (arg4); \
+      long int _arg5 = (long int) (arg5); \
+      register long int __a7 asm("$a7") = number; \
+      register long int __a0 asm("$a0") = _arg0; \
+      register long int __a1 asm("$a1") = _arg1; \
+      register long int __a2 asm("$a2") = _arg2; \
+      register long int __a3 asm("$a3") = _arg3; \
+      register long int __a4 asm("$a4") = _arg4; \
+      register long int __a5 asm("$a5") = _arg5; \
+      __asm__ volatile("syscall	0\n\t" \
+		       : "+r"(__a0) \
+		       : "r"(__a7), "r"(__a1), "r"(__a2), "r"(__a3), \
+			 "r"(__a4), "r"(__a5) \
+		       : __SYSCALL_CLOBBERS); \
+      _sys_result = __a0; \
+    } \
+    _sys_result; \
+  })
+
+#define internal_syscall7(number, arg0, arg1, arg2, arg3, arg4, arg5, arg6) \
+  ({ \
+    long int _sys_result; \
+\
+    { \
+      long int _arg0 = (long int) (arg0); \
+      long int _arg1 = (long int) (arg1); \
+      long int _arg2 = (long int) (arg2); \
+      long int _arg3 = (long int) (arg3); \
+      long int _arg4 = (long int) (arg4); \
+      long int _arg5 = (long int) (arg5); \
+      long int _arg6 = (long int) (arg6); \
+      register long int __a7 asm("$a7") = number; \
+      register long int __a0 asm("$a0") = _arg0; \
+      register long int __a1 asm("$a1") = _arg1; \
+      register long int __a2 asm("$a2") = _arg2; \
+      register long int __a3 asm("$a3") = _arg3; \
+      register long int __a4 asm("$a4") = _arg4; \
+      register long int __a5 asm("$a5") = _arg5; \
+      register long int __a6 asm("$a6") = _arg6; \
+      __asm__ volatile("syscall	0\n\t" \
+		       : "+r"(__a0) \
+		       : "r"(__a7), "r"(__a1), "r"(__a2), "r"(__a3), \
+			 "r"(__a4), "r"(__a5), "r"(__a6) \
+		       : __SYSCALL_CLOBBERS); \
+      _sys_result = __a0; \
+    } \
+    _sys_result; \
+  })
+
+#define __SYSCALL_CLOBBERS \
+  "$t0", "$t1", "$t2", "$t3", "$t4", "$t5", "$t6", "$t7", "$t8", "memory"
+
+extern long int __syscall_error (long int neg_errno);
+
+#endif /* ! __ASSEMBLER__ */
+
+/* Pointer mangling is not supported.  */
+#define PTR_MANGLE(var) (void) (var)
+#define PTR_DEMANGLE(var) (void) (var)
+
+#endif /* linux/loongarch/sysdep.h */
diff --git a/sysdeps/unix/sysv/linux/loongarch/vfork.S b/sysdeps/unix/sysv/linux/loongarch/vfork.S
new file mode 100644
index 0000000000..fcc84e3549
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/loongarch/vfork.S
@@ -0,0 +1,50 @@
+/* vfork for Linux.
+   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/>.  */
+
+#include <sysdep.h>
+#define _ERRNO_H  1
+#include <bits/errno.h>
+
+/* Clone the calling process, but without copying the whole address space.
+   The calling process is suspended until the new process exits or is
+   replaced by a call to `execve'.  Return -1 for errors, 0 to the new process,
+   and the process ID of the new process to the old process.  */
+
+ENTRY (__vfork)
+
+	li.d	a0, 0x4111 /* CLONE_VM | CLONE_VFORK | SIGCHLD */
+	add.d   a1, zero, sp
+
+	/* Do the system call.  */
+	li.d	a7, __NR_clone
+	syscall	0
+
+	blt	a0, zero ,L (error)
+
+	ret
+
+L (error):
+	b	__syscall_error
+
+END (__vfork)
+
+libc_hidden_def (__vfork)
+
+weak_alias (__vfork, vfork)
+strong_alias (__vfork, __libc_vfork)
-- 
2.20.1


^ permalink raw reply	[flat|nested] 21+ messages in thread

* [PATCH v3 09/13] LoongArch: Linux ABI
  2022-04-15  1:31 [PATCH v3 00/13] GLIBC LoongArch PATCHES caiyinyu
                   ` (7 preceding siblings ...)
  2022-04-15  1:31 ` [PATCH v3 08/13] LoongArch: Linux Syscall Interface caiyinyu
@ 2022-04-15  1:31 ` caiyinyu
  2022-04-15  1:31 ` [PATCH v3 10/13] LoongArch: Add ABI Lists caiyinyu
                   ` (3 subsequent siblings)
  12 siblings, 0 replies; 21+ messages in thread
From: caiyinyu @ 2022-04-15  1:31 UTC (permalink / raw)
  To: libc-alpha, adhemerval.zanella; +Cc: joseph_myers, xuchenghua, caiyinyu

---
 sysdeps/loongarch/dl-irel.h                   |  48 +++++++++
 sysdeps/loongarch/nptl/pthreaddef.h           |  32 ++++++
 .../unix/sysv/linux/loongarch/bits/fcntl.h    |  61 +++++++++++
 .../unix/sysv/linux/loongarch/bits/procfs.h   |  52 +++++++++
 .../linux/loongarch/bits/pthread_stack_min.h  |  20 ++++
 .../unix/sysv/linux/loongarch/bits/sigstack.h |  32 ++++++
 .../unix/sysv/linux/loongarch/getcontext.S    |  59 +++++++++++
 .../unix/sysv/linux/loongarch/localplt.data   |  12 +++
 .../unix/sysv/linux/loongarch/makecontext.c   |  79 ++++++++++++++
 .../unix/sysv/linux/loongarch/setcontext.S    | 100 ++++++++++++++++++
 .../sysv/linux/loongarch/sigcontextinfo.h     |  32 ++++++
 .../unix/sysv/linux/loongarch/swapcontext.S   |  95 +++++++++++++++++
 .../unix/sysv/linux/loongarch/sys/ucontext.h  |  61 +++++++++++
 sysdeps/unix/sysv/linux/loongarch/sys/user.h  |  42 ++++++++
 .../sysv/linux/loongarch/ucontext-macros.h    |  32 ++++++
 .../unix/sysv/linux/loongarch/ucontext_i.sym  |  31 ++++++
 16 files changed, 788 insertions(+)
 create mode 100644 sysdeps/loongarch/dl-irel.h
 create mode 100644 sysdeps/loongarch/nptl/pthreaddef.h
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/bits/fcntl.h
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/bits/procfs.h
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/bits/pthread_stack_min.h
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/bits/sigstack.h
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/getcontext.S
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/localplt.data
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/makecontext.c
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/setcontext.S
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/sigcontextinfo.h
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/swapcontext.S
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/sys/ucontext.h
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/sys/user.h
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/ucontext-macros.h
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/ucontext_i.sym

diff --git a/sysdeps/loongarch/dl-irel.h b/sysdeps/loongarch/dl-irel.h
new file mode 100644
index 0000000000..c94cba702a
--- /dev/null
+++ b/sysdeps/loongarch/dl-irel.h
@@ -0,0 +1,48 @@
+/* Machine-dependent ELF indirect relocation inline functions.
+   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 _DL_IREL_H
+#define _DL_IREL_H
+
+#include <stdio.h>
+#include <unistd.h>
+
+#define ELF_MACHINE_IRELA 1
+
+static inline ElfW (Addr) __attribute ((always_inline))
+elf_ifunc_invoke (ElfW (Addr) addr)
+{
+  return ((ElfW (Addr) (*) (void)) (addr)) ();
+}
+
+static inline void __attribute ((always_inline))
+elf_irela (const ElfW (Rela) * reloc)
+{
+  ElfW (Addr) *const reloc_addr = (void *) reloc->r_offset;
+  const unsigned long int r_type = ELFW (R_TYPE) (reloc->r_info);
+
+  if (__glibc_likely (r_type == R_LARCH_IRELATIVE))
+    {
+      ElfW (Addr) value = elf_ifunc_invoke (reloc->r_addend);
+      *reloc_addr = value;
+    }
+  else
+    __libc_fatal ("Unexpected reloc type in static binary.\n");
+}
+
+#endif /* dl-irel.h */
diff --git a/sysdeps/loongarch/nptl/pthreaddef.h b/sysdeps/loongarch/nptl/pthreaddef.h
new file mode 100644
index 0000000000..955566cddc
--- /dev/null
+++ b/sysdeps/loongarch/nptl/pthreaddef.h
@@ -0,0 +1,32 @@
+/* pthread machine parameter 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/>.  */
+
+/* Default stack size.  */
+#define ARCH_STACK_DEFAULT_SIZE (2 * 1024 * 1024)
+
+/* Minimum guard size.  */
+#define ARCH_MIN_GUARD_SIZE 0
+
+/* Required stack pointer alignment at beginning.  */
+#define STACK_ALIGN 16
+
+/* Minimal stack size after allocating thread descriptor and guard size.  */
+#define MINIMAL_REST_STACK 2048
+
+/* Location of current stack frame.  */
+#define CURRENT_STACK_FRAME __builtin_frame_address (0)
diff --git a/sysdeps/unix/sysv/linux/loongarch/bits/fcntl.h b/sysdeps/unix/sysv/linux/loongarch/bits/fcntl.h
new file mode 100644
index 0000000000..bf1e254234
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/loongarch/bits/fcntl.h
@@ -0,0 +1,61 @@
+/* O_*, F_*, FD_* bit values for the generic Linux/LoongArch ABI.
+   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 _FCNTL_H
+#error "Never use <bits/fcntl.h> directly; include <fcntl.h> instead."
+#endif
+
+#include <bits/wordsize.h>
+
+/* In 64-bit ISA files are always with 64bit off_t and F_*LK64 are the same as
+   non-64-bit versions.  It will need to be revised for 128-bit.  */
+#if __WORDSIZE == 64
+#define __O_LARGEFILE 0
+
+#define F_GETLK64 5  /* Get record locking info.  */
+#define F_SETLK64 6  /* Set record locking info (non-blocking).  */
+#define F_SETLKW64 7 /* Set record locking info (blocking).  */
+#endif
+
+struct flock
+{
+  short int l_type;   /* Type of lock: F_RDLCK, F_WRLCK, or F_UNLCK.  */
+  short int l_whence; /* Where `l_start' is relative to (like `lseek').  */
+#ifndef __USE_FILE_OFFSET64
+  __off_t l_start; /* Offset where the lock begins.  */
+  __off_t l_len;   /* Size of the locked area; zero means until EOF.  */
+#else
+  __off64_t l_start; /* Offset where the lock begins.  */
+  __off64_t l_len;   /* Size of the locked area; zero means until EOF.  */
+#endif
+  __pid_t l_pid; /* Process holding the lock.  */
+};
+
+#ifdef __USE_LARGEFILE64
+struct flock64
+{
+  short int l_type;   /* Type of lock: F_RDLCK, F_WRLCK, or F_UNLCK.  */
+  short int l_whence; /* Where `l_start' is relative to (like `lseek').  */
+  __off64_t l_start;  /* Offset where the lock begins.  */
+  __off64_t l_len;    /* Size of the locked area; zero means until EOF.  */
+  __pid_t l_pid;      /* Process holding the lock.  */
+};
+#endif
+
+/* Include generic Linux declarations.  */
+#include <bits/fcntl-linux.h>
diff --git a/sysdeps/unix/sysv/linux/loongarch/bits/procfs.h b/sysdeps/unix/sysv/linux/loongarch/bits/procfs.h
new file mode 100644
index 0000000000..2db777b38c
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/loongarch/bits/procfs.h
@@ -0,0 +1,52 @@
+/* Types for registers for sys/procfs.h.
+   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_PROCFS_H
+# error "Never include <bits/procfs.h> directly; use <sys/procfs.h> instead."
+#endif
+
+/* Type for a general-purpose register.  */
+typedef __uint64_t elf_greg_t;
+
+/* And the whole bunch of them.  We could have used `struct
+   pt_regs' directly in the typedef, but tradition says that
+   the register set is an array, which does have some peculiar
+   semantics, so leave it that way.  */
+#define ELF_NGREG (sizeof (struct user_regs_struct) / sizeof (elf_greg_t))
+typedef elf_greg_t elf_gregset_t[ELF_NGREG];
+
+#define ELF_NFPREG 34 /* 32 FPRs + 8-byte byte-vec for fcc + 4-byte FCR */
+typedef union
+{
+  double d;
+  float f;
+} elf_fpreg_t;
+typedef elf_fpreg_t elf_fpregset_t[ELF_NFPREG];
+
+typedef union
+{
+  double d[2];
+  float f[4];
+} __attribute__ ((__aligned__ (16))) elf_lsxregset_t[32];
+
+typedef union
+{
+  double d[4];
+  float f[8];
+} __attribute__ ((__aligned__ (32))) elf_lasxregset_t[32];
diff --git a/sysdeps/unix/sysv/linux/loongarch/bits/pthread_stack_min.h b/sysdeps/unix/sysv/linux/loongarch/bits/pthread_stack_min.h
new file mode 100644
index 0000000000..072c2ade42
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/loongarch/bits/pthread_stack_min.h
@@ -0,0 +1,20 @@
+/* Definition of PTHREAD_STACK_MIN.  LoongArch Linux version.
+   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/>.  */
+
+/* Minimum size for a thread.  At least two pages with 64k pages.  */
+#define PTHREAD_STACK_MIN	131072
diff --git a/sysdeps/unix/sysv/linux/loongarch/bits/sigstack.h b/sysdeps/unix/sysv/linux/loongarch/bits/sigstack.h
new file mode 100644
index 0000000000..238c1a98e6
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/loongarch/bits/sigstack.h
@@ -0,0 +1,32 @@
+/* sigstack, sigaltstack 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 _BITS_SIGSTACK_H
+#define _BITS_SIGSTACK_H 1
+
+#if !defined _SIGNAL_H && !defined _SYS_UCONTEXT_H
+# error "Never include this file directly.  Use <signal.h> instead"
+#endif
+
+/* Minimum stack size for a signal handler.  */
+#define MINSIGSTKSZ	4096
+
+/* System default stack size.  */
+#define SIGSTKSZ	16384
+
+#endif /* bits/sigstack.h */
diff --git a/sysdeps/unix/sysv/linux/loongarch/getcontext.S b/sysdeps/unix/sysv/linux/loongarch/getcontext.S
new file mode 100644
index 0000000000..43b95e9715
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/loongarch/getcontext.S
@@ -0,0 +1,59 @@
+/* Save current context.
+   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/>.  */
+
+#include "ucontext-macros.h"
+
+/* int getcontext (ucontext_t *ucp) */
+
+	.text
+LEAF (__getcontext)
+	SAVE_INT_REG (ra,   1, a0)
+	SAVE_INT_REG (sp,   3, a0)
+	SAVE_INT_REG (zero, 4, a0) /* return 0 by overwriting a0.  */
+	SAVE_INT_REG (x,   21, a0)
+	SAVE_INT_REG (fp,  22, a0)
+	SAVE_INT_REG (s0,  23, a0)
+	SAVE_INT_REG (s1,  24, a0)
+	SAVE_INT_REG (s2,  25, a0)
+	SAVE_INT_REG (s3,  26, a0)
+	SAVE_INT_REG (s4,  27, a0)
+	SAVE_INT_REG (s5,  28, a0)
+	SAVE_INT_REG (s6,  29, a0)
+	SAVE_INT_REG (s7,  30, a0)
+	SAVE_INT_REG (s8,  31, a0)
+	st.d		ra, a0, MCONTEXT_PC
+
+/* rt_sigprocmask (SIG_BLOCK, NULL, &ucp->uc_sigmask, _NSIG8) */
+	li.d		a3, _NSIG8
+	li.d		a2, UCONTEXT_SIGMASK
+	add.d		a2, a2, a0
+	ori		a1, zero,0
+	li.d		a0, SIG_BLOCK
+
+	li.d		a7, SYS_ify (rt_sigprocmask)
+	syscall		0
+	blt		a0, zero, 99f
+
+	jirl		$r0, $r1, 0
+
+99:
+	b		__syscall_error
+
+PSEUDO_END (__getcontext)
+
+weak_alias (__getcontext, getcontext)
diff --git a/sysdeps/unix/sysv/linux/loongarch/localplt.data b/sysdeps/unix/sysv/linux/loongarch/localplt.data
new file mode 100644
index 0000000000..817ab2659a
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/loongarch/localplt.data
@@ -0,0 +1,12 @@
+# See scripts/check-localplt.awk for how this file is processed.
+# PLT use is required for the malloc family and for matherr because
+# users can define their own functions and have library internals call them.
+libc.so: calloc
+libc.so: free
+libc.so: malloc
+libc.so: realloc
+# The TLS-enabled version of these functions is interposed from libc.so.
+ld.so: _dl_signal_error
+ld.so: _dl_catch_error
+ld.so: _dl_signal_exception
+ld.so: _dl_catch_exception
diff --git a/sysdeps/unix/sysv/linux/loongarch/makecontext.c b/sysdeps/unix/sysv/linux/loongarch/makecontext.c
new file mode 100644
index 0000000000..d29c8056cb
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/loongarch/makecontext.c
@@ -0,0 +1,79 @@
+/* Create new context.
+   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/>.  */
+
+#include <sysdep.h>
+#include <sys/asm.h>
+#include <sys/ucontext.h>
+#include <stdarg.h>
+#include <assert.h>
+
+void
+__makecontext (ucontext_t *ucp, void (*func) (void), int argc, long int a0,
+	       long int a1, long int a2, long int a3, long int a4, ...)
+{
+  extern void __start_context (void) attribute_hidden;
+  long int i, sp;
+
+  _Static_assert(LARCH_REG_NARGS == 8,
+		 "__makecontext assumes 8 argument registers");
+
+  /* Set up the stack.  */
+  sp = ((long int) ucp->uc_stack.ss_sp + ucp->uc_stack.ss_size) & ALMASK;
+
+  /* Set up the register context.
+     ra = s0 = 0, terminating the stack for backtracing purposes.
+     s1 = the function we must call.
+     s2 = the subsequent context to run.  */
+  ucp->uc_mcontext.__gregs[LARCH_REG_RA] = 0;
+  ucp->uc_mcontext.__gregs[LARCH_REG_S0] = 0;
+  ucp->uc_mcontext.__gregs[LARCH_REG_S1] = (long int) func;
+  ucp->uc_mcontext.__gregs[LARCH_REG_S2] = (long int) ucp->uc_link;
+  ucp->uc_mcontext.__gregs[LARCH_REG_SP] = sp;
+  ucp->uc_mcontext.__pc = (long int) &__start_context;
+
+  /* Put args in a0-a7, then put any remaining args on the stack.  */
+  ucp->uc_mcontext.__gregs[LARCH_REG_A0 + 0] = a0;
+  ucp->uc_mcontext.__gregs[LARCH_REG_A0 + 1] = a1;
+  ucp->uc_mcontext.__gregs[LARCH_REG_A0 + 2] = a2;
+  ucp->uc_mcontext.__gregs[LARCH_REG_A0 + 3] = a3;
+  ucp->uc_mcontext.__gregs[LARCH_REG_A0 + 4] = a4;
+
+  if (__glibc_unlikely (argc > 5))
+    {
+      va_list vl;
+      va_start (vl, a4);
+
+      long reg_args = argc < LARCH_REG_NARGS ? argc : LARCH_REG_NARGS;
+      for (i = 5; i < reg_args; i++)
+	ucp->uc_mcontext.__gregs[LARCH_REG_A0 + i] = va_arg (vl, long);
+
+      long int stack_args = argc - reg_args;
+      if (stack_args > 0)
+	{
+	  sp = (sp - stack_args * sizeof (long int)) & ALMASK;
+	  ucp->uc_mcontext.__gregs[LARCH_REG_SP] = sp;
+	  for (i = 0; i < stack_args; i++)
+	    ((long int *) sp)[i] = va_arg (vl, long int);
+	}
+
+      va_end (vl);
+    }
+}
+
+weak_alias (__makecontext, makecontext)
diff --git a/sysdeps/unix/sysv/linux/loongarch/setcontext.S b/sysdeps/unix/sysv/linux/loongarch/setcontext.S
new file mode 100644
index 0000000000..a1216dad69
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/loongarch/setcontext.S
@@ -0,0 +1,100 @@
+/* Set current context.
+   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/>.  */
+#include "sys/regdef.h"
+#include "ucontext-macros.h"
+
+/*  int __setcontext (const ucontext_t *ucp)
+
+  Restores the machine context in UCP and thereby resumes execution
+  in that context.
+
+  This implementation is intended to be used for *synchronous* context
+  switches only.  Therefore, it does not have to restore anything
+  other than the PRESERVED state.  */
+
+	.text
+LEAF (__setcontext)
+
+	addi.d		sp, sp, -16
+	st.d		a0, sp, 0	/* Save ucp to stack */
+
+/* rt_sigprocmask (SIG_SETMASK, &ucp->uc_sigmask, NULL, _NSIG8) */
+	li.d		a3, _NSIG8
+	li.d		a2, 0
+	li.d		a1, UCONTEXT_SIGMASK
+	add.d		a1, a1, a0
+	li.d		a0, SIG_SETMASK
+
+	li.d		a7, SYS_ify (rt_sigprocmask)
+	syscall		0
+
+	blt		a0, $r0, 99f
+
+	ld.d		t0, sp, 0	/* Load ucp to t0 */
+	cfi_def_cfa (12, 0)
+
+/* Note the contents of argument registers will be random
+   unless makecontext() has been called.  */
+	RESTORE_INT_REG(ra,   1, t0)
+	RESTORE_INT_REG(sp,   3, t0)
+	RESTORE_INT_REG(a0,   4, t0)
+	RESTORE_INT_REG(a1,   5, t0)
+	RESTORE_INT_REG(a2,   6, t0)
+	RESTORE_INT_REG(a3,   7, t0)
+	RESTORE_INT_REG(a4,   8, t0)
+	RESTORE_INT_REG(a5,   9, t0)
+	RESTORE_INT_REG(a6,  10, t0)
+	RESTORE_INT_REG(a7,  11, t0)
+	RESTORE_INT_REG(x,   21, t0)
+	RESTORE_INT_REG(fp,  22, t0)
+	RESTORE_INT_REG(s0,  23, t0)
+	RESTORE_INT_REG(s1,  24, t0)
+	RESTORE_INT_REG(s2,  25, t0)
+	RESTORE_INT_REG(s3,  26, t0)
+	RESTORE_INT_REG(s4,  27, t0)
+	RESTORE_INT_REG(s5,  28, t0)
+	RESTORE_INT_REG(s6,  29, t0)
+	RESTORE_INT_REG(s7,  30, t0)
+	RESTORE_INT_REG(s8,  31, t0)
+
+	ld.d		t1, t0, MCONTEXT_PC
+	jirl		$r0,t1,0
+
+99:
+	addi.d		sp, sp, 16
+	b		__syscall_error
+
+PSEUDO_END (__setcontext)
+weak_alias (__setcontext, setcontext)
+
+LEAF (__start_context)
+
+	/* Terminate call stack by noting ra == 0.  Happily, s0 == 0 here.  */
+	cfi_register (1, 23)
+
+	/* Call the function passed to makecontext.  */
+	jirl		$r1,s1,0
+
+	/* Invoke subsequent context if present, else exit(0).  */
+	ori		a0, s2, 0
+	beqz		s2, 1f
+	bl		__setcontext
+1:
+	b		exit
+
+PSEUDO_END (__start_context)
diff --git a/sysdeps/unix/sysv/linux/loongarch/sigcontextinfo.h b/sysdeps/unix/sysv/linux/loongarch/sigcontextinfo.h
new file mode 100644
index 0000000000..5e202bc0b4
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/loongarch/sigcontextinfo.h
@@ -0,0 +1,32 @@
+/* LoongArch definitions for signal handling calling conventions.
+   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 _SIGCONTEXTINFO_H
+#define _SIGCONTEXTINFO_H
+
+#include <stdint.h>
+#include <sys/ucontext.h>
+
+static inline uintptr_t
+sigcontext_get_pc (const ucontext_t *ctx)
+{
+  return ctx->uc_mcontext.__pc;
+}
+
+#endif
diff --git a/sysdeps/unix/sysv/linux/loongarch/swapcontext.S b/sysdeps/unix/sysv/linux/loongarch/swapcontext.S
new file mode 100644
index 0000000000..bb22cd2f00
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/loongarch/swapcontext.S
@@ -0,0 +1,95 @@
+/* Save and set current context.
+   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/>.  */
+
+#include "ucontext-macros.h"
+
+/* int swapcontext (ucontext_t *oucp, const ucontext_t *ucp) */
+
+LEAF (__swapcontext)
+	ori		a2, sp, 0		/* Save sp to a2 */
+	addi.d		sp, sp, -16
+	st.d		a1, sp, 0
+	ori		t0, a1, 0
+
+	SAVE_INT_REG (ra,   1, a0)
+	SAVE_INT_REG (a2,   3, a0)		/* Store sp */
+	SAVE_INT_REG (zero, 4, a0)		/* return 0 by overwriting a0 */
+	SAVE_INT_REG (x,   21, a0)
+	SAVE_INT_REG (fp,  22, a0)
+	SAVE_INT_REG (s0,  23, a0)
+	SAVE_INT_REG (s1,  24, a0)
+	SAVE_INT_REG (s2,  25, a0)
+	SAVE_INT_REG (s3,  26, a0)
+	SAVE_INT_REG (s4,  27, a0)
+	SAVE_INT_REG (s5,  28, a0)
+	SAVE_INT_REG (s6,  29, a0)
+	SAVE_INT_REG (s7,  30, a0)
+	SAVE_INT_REG (s8,  31, a0)
+
+	st.d		ra, a0, MCONTEXT_PC
+
+/* rt_sigprocmask (SIG_SETMASK, &ucp->uc_sigmask, &oucp->uc_sigmask, _NSIG8) */
+	li.d		a3, _NSIG8
+	li.d		a2, UCONTEXT_SIGMASK
+	add.d		a2, a2, a0
+	li.d		a1, UCONTEXT_SIGMASK
+	add.d		a1, a1, t0
+	li.d		a0, SIG_SETMASK
+
+	li.d		a7, SYS_ify (rt_sigprocmask)
+	syscall		0
+
+	blt		a0, zero, 99f
+
+	ld.d		t0, sp, 0		/* Load a1 to t0 */
+
+/* Note the contents of argument registers will be random
+   unless makecontext() has been called.  */
+	RESTORE_INT_REG (ra,   1, t0)
+	RESTORE_INT_REG (sp,   3, t0)
+	RESTORE_INT_REG (a0,   4, t0)
+	RESTORE_INT_REG (a1,   5, t0)
+	RESTORE_INT_REG (a2,   6, t0)
+	RESTORE_INT_REG (a3,   7, t0)
+	RESTORE_INT_REG (a4,   8, t0)
+	RESTORE_INT_REG (a5,   9, t0)
+	RESTORE_INT_REG (a6,  10, t0)
+	RESTORE_INT_REG (a7,  11, t0)
+	RESTORE_INT_REG (x,   21, t0)
+	RESTORE_INT_REG (fp,  22, t0)
+	RESTORE_INT_REG (s0,  23, t0)
+	RESTORE_INT_REG (s1,  24, t0)
+	RESTORE_INT_REG (s2,  25, t0)
+	RESTORE_INT_REG (s3,  26, t0)
+	RESTORE_INT_REG (s4,  27, t0)
+	RESTORE_INT_REG (s5,  28, t0)
+	RESTORE_INT_REG (s6,  29, t0)
+	RESTORE_INT_REG (s7,  30, t0)
+	RESTORE_INT_REG (s8,  31, t0)
+
+	ld.d		t1, t0, MCONTEXT_PC
+	jirl		$r0, t1, 0
+
+
+99:
+	addi.d		sp, sp, 16
+	b		__syscall_error
+
+PSEUDO_END (__swapcontext)
+
+weak_alias (__swapcontext, swapcontext)
diff --git a/sysdeps/unix/sysv/linux/loongarch/sys/ucontext.h b/sysdeps/unix/sysv/linux/loongarch/sys/ucontext.h
new file mode 100644
index 0000000000..e334a45a44
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/loongarch/sys/ucontext.h
@@ -0,0 +1,61 @@
+/* struct ucontext definition.
+   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/>.  */
+
+/* Don't rely on this, the interface is currently messed up and may need to
+   be broken to be fixed.  */
+#ifndef _SYS_UCONTEXT_H
+#define _SYS_UCONTEXT_H 1
+
+#include <features.h>
+
+#include <bits/types/sigset_t.h>
+#include <bits/types/stack_t.h>
+
+#ifdef __USE_MISC
+#define LARCH_NGREG 32
+
+#define LARCH_REG_RA 1
+#define LARCH_REG_SP 3
+#define LARCH_REG_S0 23
+#define LARCH_REG_S1 24
+#define LARCH_REG_A0 4
+#define LARCH_REG_S2 25
+#define LARCH_REG_NARGS 8
+
+#endif
+
+typedef struct mcontext_t
+{
+  unsigned long long __pc;
+  unsigned long long __gregs[32];
+  unsigned int __flags;
+  unsigned long long __extcontext[0] __attribute__((__aligned__(16)));
+} mcontext_t;
+
+/* Userlevel context.  */
+typedef struct ucontext_t
+{
+  unsigned long int __uc_flags;
+  struct ucontext_t *uc_link;
+  stack_t uc_stack;
+  sigset_t uc_sigmask;
+  mcontext_t uc_mcontext;
+} ucontext_t;
+
+#endif /* sys/ucontext.h */
diff --git a/sysdeps/unix/sysv/linux/loongarch/sys/user.h b/sysdeps/unix/sysv/linux/loongarch/sys/user.h
new file mode 100644
index 0000000000..55181de816
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/loongarch/sys/user.h
@@ -0,0 +1,42 @@
+/* struct user_regs_struct definition for LoongArch.
+   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_USER_H
+#define _SYS_USER_H 1
+
+#include <stdint.h>
+
+struct user_regs_struct
+{
+  /* Saved main processor registers. */
+  uint64_t regs[32];
+
+  /* Saved special registers. */
+  uint64_t orig_a0;
+  uint64_t csr_era;
+  uint64_t csr_badv;
+  uint64_t reserved[10];
+};
+
+struct user_fp_struct {
+  uint64_t    fpr[32];
+  uint64_t    fcc;
+  uint32_t    fcsr;
+};
+
+#endif /* _SYS_USER_H */
diff --git a/sysdeps/unix/sysv/linux/loongarch/ucontext-macros.h b/sysdeps/unix/sysv/linux/loongarch/ucontext-macros.h
new file mode 100644
index 0000000000..859eba464b
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/loongarch/ucontext-macros.h
@@ -0,0 +1,32 @@
+/* Macros for ucontext routines.
+   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 _LINUX_LOONGARCH_UCONTEXT_MACROS_H
+#define _LINUX_LOONGARCH_UCONTEXT_MACROS_H
+
+#include <sysdep.h>
+#include <sys/asm.h>
+#include "ucontext_i.h"
+
+#define SAVE_INT_REG(name, num, base) \
+  REG_S name, base, ((num) *SZREG + MCONTEXT_GREGS)
+
+#define RESTORE_INT_REG(name, num, base) \
+  REG_L name, base, ((num) *SZREG + MCONTEXT_GREGS)
+
+#endif /* _LINUX_LOONGARCH_UCONTEXT_MACROS_H */
diff --git a/sysdeps/unix/sysv/linux/loongarch/ucontext_i.sym b/sysdeps/unix/sysv/linux/loongarch/ucontext_i.sym
new file mode 100644
index 0000000000..f27afad56f
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/loongarch/ucontext_i.sym
@@ -0,0 +1,31 @@
+#include <inttypes.h>
+#include <signal.h>
+#include <stddef.h>
+#include <sys/ucontext.h>
+
+-- Constants used by the rt_sigprocmask call.
+
+SIG_BLOCK
+SIG_SETMASK
+
+_NSIG8				(_NSIG / 8)
+
+-- Offsets of the fields in the ucontext_t structure.
+#define ucontext(member)	offsetof (ucontext_t, member)
+#define stack(member)		ucontext (uc_stack.member)
+#define mcontext(member)	ucontext (uc_mcontext.member)
+
+UCONTEXT_FLAGS			ucontext (__uc_flags)
+UCONTEXT_LINK			ucontext (uc_link)
+UCONTEXT_STACK			ucontext (uc_stack)
+UCONTEXT_MCONTEXT		ucontext (uc_mcontext)
+UCONTEXT_SIGMASK		ucontext (uc_sigmask)
+
+STACK_SP			stack (ss_sp)
+STACK_SIZE			stack (ss_size)
+STACK_FLAGS			stack (ss_flags)
+
+MCONTEXT_PC			mcontext (__pc)
+MCONTEXT_GREGS			mcontext (__gregs)
+
+UCONTEXT_SIZE			sizeof (ucontext_t)
-- 
2.20.1


^ permalink raw reply	[flat|nested] 21+ messages in thread

* [PATCH v3 10/13] LoongArch: Add ABI Lists
  2022-04-15  1:31 [PATCH v3 00/13] GLIBC LoongArch PATCHES caiyinyu
                   ` (8 preceding siblings ...)
  2022-04-15  1:31 ` [PATCH v3 09/13] LoongArch: Linux ABI caiyinyu
@ 2022-04-15  1:31 ` caiyinyu
  2022-04-15  1:31 ` [PATCH v3 11/13] LoongArch: Build Infastructure caiyinyu
                   ` (2 subsequent siblings)
  12 siblings, 0 replies; 21+ messages in thread
From: caiyinyu @ 2022-04-15  1:31 UTC (permalink / raw)
  To: libc-alpha, adhemerval.zanella; +Cc: joseph_myers, xuchenghua, caiyinyu

---
 .../sysv/linux/loongarch/lp64/c++-types.data  |   67 +
 .../unix/sysv/linux/loongarch/lp64/ld.abilist |    8 +
 .../loongarch/lp64/libBrokenLocale.abilist    |    1 +
 .../sysv/linux/loongarch/lp64/libc.abilist    | 2139 +++++++++++++++++
 .../loongarch/lp64/libc_malloc_debug.abilist  |   26 +
 .../linux/loongarch/lp64/libcrypt.abilist     |    2 +
 .../sysv/linux/loongarch/lp64/libm.abilist    | 1031 ++++++++
 .../linux/loongarch/lp64/libpthread.abilist   |    0
 .../linux/loongarch/lp64/libresolv.abilist    |   55 +
 .../sysv/linux/loongarch/lp64/librt.abilist   |    0
 .../linux/loongarch/lp64/libthread_db.abilist |   40 +
 11 files changed, 3369 insertions(+)
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/lp64/c++-types.data
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/lp64/ld.abilist
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/lp64/libBrokenLocale.abilist
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/lp64/libc.abilist
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/lp64/libc_malloc_debug.abilist
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/lp64/libcrypt.abilist
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/lp64/libm.abilist
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/lp64/libpthread.abilist
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/lp64/libresolv.abilist
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/lp64/librt.abilist
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/lp64/libthread_db.abilist

diff --git a/sysdeps/unix/sysv/linux/loongarch/lp64/c++-types.data b/sysdeps/unix/sysv/linux/loongarch/lp64/c++-types.data
new file mode 100644
index 0000000000..ac925ccb36
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/loongarch/lp64/c++-types.data
@@ -0,0 +1,67 @@
+blkcnt64_t:l
+blkcnt_t:l
+blksize_t:i
+caddr_t:Pc
+clockid_t:i
+clock_t:l
+daddr_t:i
+dev_t:m
+fd_mask:l
+fsblkcnt64_t:m
+fsblkcnt_t:m
+fsfilcnt64_t:m
+fsfilcnt_t:m
+fsid_t:8__fsid_t
+gid_t:j
+id_t:j
+ino64_t:m
+ino_t:m
+int16_t:s
+int32_t:i
+int64_t:l
+int8_t:a
+intptr_t:l
+key_t:i
+loff_t:l
+mode_t:j
+nlink_t:j
+off64_t:l
+off_t:l
+pid_t:i
+pthread_attr_t:14pthread_attr_t
+pthread_barrier_t:17pthread_barrier_t
+pthread_barrierattr_t:21pthread_barrierattr_t
+pthread_cond_t:14pthread_cond_t
+pthread_condattr_t:18pthread_condattr_t
+pthread_key_t:j
+pthread_mutex_t:15pthread_mutex_t
+pthread_mutexattr_t:19pthread_mutexattr_t
+pthread_once_t:i
+pthread_rwlock_t:16pthread_rwlock_t
+pthread_rwlockattr_t:20pthread_rwlockattr_t
+pthread_spinlock_t:i
+pthread_t:m
+quad_t:l
+register_t:l
+rlim64_t:m
+rlim_t:m
+sigset_t:10__sigset_t
+size_t:m
+socklen_t:j
+ssize_t:l
+suseconds_t:l
+time_t:l
+u_char:h
+uid_t:j
+uint:j
+u_int:j
+u_int16_t:t
+u_int32_t:j
+u_int64_t:m
+u_int8_t:h
+ulong:m
+u_long:m
+u_quad_t:m
+useconds_t:j
+ushort:t
+u_short:t
diff --git a/sysdeps/unix/sysv/linux/loongarch/lp64/ld.abilist b/sysdeps/unix/sysv/linux/loongarch/lp64/ld.abilist
new file mode 100644
index 0000000000..93fcd64eee
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/loongarch/lp64/ld.abilist
@@ -0,0 +1,8 @@
+GLIBC_2.36 __libc_stack_end D 0x8
+GLIBC_2.36 __rseq_flags D 0x4
+GLIBC_2.36 __rseq_offset D 0x8
+GLIBC_2.36 __rseq_size D 0x4
+GLIBC_2.36 __stack_chk_guard D 0x8
+GLIBC_2.36 __tls_get_addr F
+GLIBC_2.36 _dl_mcount F
+GLIBC_2.36 _r_debug D 0x28
diff --git a/sysdeps/unix/sysv/linux/loongarch/lp64/libBrokenLocale.abilist b/sysdeps/unix/sysv/linux/loongarch/lp64/libBrokenLocale.abilist
new file mode 100644
index 0000000000..404afa3683
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/loongarch/lp64/libBrokenLocale.abilist
@@ -0,0 +1 @@
+GLIBC_2.36 __ctype_get_mb_cur_max F
diff --git a/sysdeps/unix/sysv/linux/loongarch/lp64/libc.abilist b/sysdeps/unix/sysv/linux/loongarch/lp64/libc.abilist
new file mode 100644
index 0000000000..f94fd65022
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/loongarch/lp64/libc.abilist
@@ -0,0 +1,2139 @@
+GLIBC_2.36 _Exit F
+GLIBC_2.36 _Fork F
+GLIBC_2.36 _IO_2_1_stderr_ D 0xe0
+GLIBC_2.36 _IO_2_1_stdin_ D 0xe0
+GLIBC_2.36 _IO_2_1_stdout_ D 0xe0
+GLIBC_2.36 _IO_adjust_column F
+GLIBC_2.36 _IO_adjust_wcolumn F
+GLIBC_2.36 _IO_default_doallocate F
+GLIBC_2.36 _IO_default_finish F
+GLIBC_2.36 _IO_default_pbackfail F
+GLIBC_2.36 _IO_default_uflow F
+GLIBC_2.36 _IO_default_xsgetn F
+GLIBC_2.36 _IO_default_xsputn F
+GLIBC_2.36 _IO_do_write F
+GLIBC_2.36 _IO_doallocbuf F
+GLIBC_2.36 _IO_fclose F
+GLIBC_2.36 _IO_fdopen F
+GLIBC_2.36 _IO_feof F
+GLIBC_2.36 _IO_ferror F
+GLIBC_2.36 _IO_fflush F
+GLIBC_2.36 _IO_fgetpos F
+GLIBC_2.36 _IO_fgetpos64 F
+GLIBC_2.36 _IO_fgets F
+GLIBC_2.36 _IO_file_attach F
+GLIBC_2.36 _IO_file_close F
+GLIBC_2.36 _IO_file_close_it F
+GLIBC_2.36 _IO_file_doallocate F
+GLIBC_2.36 _IO_file_finish F
+GLIBC_2.36 _IO_file_fopen F
+GLIBC_2.36 _IO_file_init F
+GLIBC_2.36 _IO_file_jumps D 0xa8
+GLIBC_2.36 _IO_file_open F
+GLIBC_2.36 _IO_file_overflow F
+GLIBC_2.36 _IO_file_read F
+GLIBC_2.36 _IO_file_seek F
+GLIBC_2.36 _IO_file_seekoff F
+GLIBC_2.36 _IO_file_setbuf F
+GLIBC_2.36 _IO_file_stat F
+GLIBC_2.36 _IO_file_sync F
+GLIBC_2.36 _IO_file_underflow F
+GLIBC_2.36 _IO_file_write F
+GLIBC_2.36 _IO_file_xsputn F
+GLIBC_2.36 _IO_flockfile F
+GLIBC_2.36 _IO_flush_all F
+GLIBC_2.36 _IO_flush_all_linebuffered F
+GLIBC_2.36 _IO_fopen F
+GLIBC_2.36 _IO_fprintf F
+GLIBC_2.36 _IO_fputs F
+GLIBC_2.36 _IO_fread F
+GLIBC_2.36 _IO_free_backup_area F
+GLIBC_2.36 _IO_free_wbackup_area F
+GLIBC_2.36 _IO_fsetpos F
+GLIBC_2.36 _IO_fsetpos64 F
+GLIBC_2.36 _IO_ftell F
+GLIBC_2.36 _IO_ftrylockfile F
+GLIBC_2.36 _IO_funlockfile F
+GLIBC_2.36 _IO_fwrite F
+GLIBC_2.36 _IO_getc F
+GLIBC_2.36 _IO_getline F
+GLIBC_2.36 _IO_getline_info F
+GLIBC_2.36 _IO_gets F
+GLIBC_2.36 _IO_init F
+GLIBC_2.36 _IO_init_marker F
+GLIBC_2.36 _IO_init_wmarker F
+GLIBC_2.36 _IO_iter_begin F
+GLIBC_2.36 _IO_iter_end F
+GLIBC_2.36 _IO_iter_file F
+GLIBC_2.36 _IO_iter_next F
+GLIBC_2.36 _IO_least_wmarker F
+GLIBC_2.36 _IO_link_in F
+GLIBC_2.36 _IO_list_all D 0x8
+GLIBC_2.36 _IO_list_lock F
+GLIBC_2.36 _IO_list_resetlock F
+GLIBC_2.36 _IO_list_unlock F
+GLIBC_2.36 _IO_marker_delta F
+GLIBC_2.36 _IO_marker_difference F
+GLIBC_2.36 _IO_padn F
+GLIBC_2.36 _IO_peekc_locked F
+GLIBC_2.36 _IO_popen F
+GLIBC_2.36 _IO_printf F
+GLIBC_2.36 _IO_proc_close F
+GLIBC_2.36 _IO_proc_open F
+GLIBC_2.36 _IO_putc F
+GLIBC_2.36 _IO_puts F
+GLIBC_2.36 _IO_remove_marker F
+GLIBC_2.36 _IO_seekmark F
+GLIBC_2.36 _IO_seekoff F
+GLIBC_2.36 _IO_seekpos F
+GLIBC_2.36 _IO_seekwmark F
+GLIBC_2.36 _IO_setb F
+GLIBC_2.36 _IO_setbuffer F
+GLIBC_2.36 _IO_setvbuf F
+GLIBC_2.36 _IO_sgetn F
+GLIBC_2.36 _IO_sprintf F
+GLIBC_2.36 _IO_sputbackc F
+GLIBC_2.36 _IO_sputbackwc F
+GLIBC_2.36 _IO_sscanf F
+GLIBC_2.36 _IO_str_init_readonly F
+GLIBC_2.36 _IO_str_init_static F
+GLIBC_2.36 _IO_str_overflow F
+GLIBC_2.36 _IO_str_pbackfail F
+GLIBC_2.36 _IO_str_seekoff F
+GLIBC_2.36 _IO_str_underflow F
+GLIBC_2.36 _IO_sungetc F
+GLIBC_2.36 _IO_sungetwc F
+GLIBC_2.36 _IO_switch_to_get_mode F
+GLIBC_2.36 _IO_switch_to_main_wget_area F
+GLIBC_2.36 _IO_switch_to_wbackup_area F
+GLIBC_2.36 _IO_switch_to_wget_mode F
+GLIBC_2.36 _IO_un_link F
+GLIBC_2.36 _IO_ungetc F
+GLIBC_2.36 _IO_unsave_markers F
+GLIBC_2.36 _IO_unsave_wmarkers F
+GLIBC_2.36 _IO_vfprintf F
+GLIBC_2.36 _IO_vsprintf F
+GLIBC_2.36 _IO_wdefault_doallocate F
+GLIBC_2.36 _IO_wdefault_finish F
+GLIBC_2.36 _IO_wdefault_pbackfail F
+GLIBC_2.36 _IO_wdefault_uflow F
+GLIBC_2.36 _IO_wdefault_xsgetn F
+GLIBC_2.36 _IO_wdefault_xsputn F
+GLIBC_2.36 _IO_wdo_write F
+GLIBC_2.36 _IO_wdoallocbuf F
+GLIBC_2.36 _IO_wfile_jumps D 0xa8
+GLIBC_2.36 _IO_wfile_overflow F
+GLIBC_2.36 _IO_wfile_seekoff F
+GLIBC_2.36 _IO_wfile_sync F
+GLIBC_2.36 _IO_wfile_underflow F
+GLIBC_2.36 _IO_wfile_xsputn F
+GLIBC_2.36 _IO_wmarker_delta F
+GLIBC_2.36 _IO_wsetb F
+GLIBC_2.36 __adjtimex F
+GLIBC_2.36 __argz_count F
+GLIBC_2.36 __argz_next F
+GLIBC_2.36 __argz_stringify F
+GLIBC_2.36 __asprintf F
+GLIBC_2.36 __asprintf_chk F
+GLIBC_2.36 __assert F
+GLIBC_2.36 __assert_fail F
+GLIBC_2.36 __assert_perror_fail F
+GLIBC_2.36 __backtrace F
+GLIBC_2.36 __backtrace_symbols F
+GLIBC_2.36 __backtrace_symbols_fd F
+GLIBC_2.36 __bsd_getpgrp F
+GLIBC_2.36 __bzero F
+GLIBC_2.36 __check_rhosts_file D 0x4
+GLIBC_2.36 __chk_fail F
+GLIBC_2.36 __clone F
+GLIBC_2.36 __close F
+GLIBC_2.36 __cmsg_nxthdr F
+GLIBC_2.36 __confstr_chk F
+GLIBC_2.36 __connect F
+GLIBC_2.36 __ctype_b_loc F
+GLIBC_2.36 __ctype_get_mb_cur_max F
+GLIBC_2.36 __ctype_tolower_loc F
+GLIBC_2.36 __ctype_toupper_loc F
+GLIBC_2.36 __curbrk D 0x8
+GLIBC_2.36 __cxa_at_quick_exit F
+GLIBC_2.36 __cxa_atexit F
+GLIBC_2.36 __cxa_finalize F
+GLIBC_2.36 __cxa_thread_atexit_impl F
+GLIBC_2.36 __cyg_profile_func_enter F
+GLIBC_2.36 __cyg_profile_func_exit F
+GLIBC_2.36 __daylight D 0x4
+GLIBC_2.36 __dcgettext F
+GLIBC_2.36 __dgettext F
+GLIBC_2.36 __dprintf_chk F
+GLIBC_2.36 __dup2 F
+GLIBC_2.36 __duplocale F
+GLIBC_2.36 __endmntent F
+GLIBC_2.36 __environ D 0x8
+GLIBC_2.36 __errno_location F
+GLIBC_2.36 __explicit_bzero_chk F
+GLIBC_2.36 __fbufsize F
+GLIBC_2.36 __fcntl F
+GLIBC_2.36 __fdelt_chk F
+GLIBC_2.36 __fdelt_warn F
+GLIBC_2.36 __ffs F
+GLIBC_2.36 __fgets_chk F
+GLIBC_2.36 __fgets_unlocked_chk F
+GLIBC_2.36 __fgetws_chk F
+GLIBC_2.36 __fgetws_unlocked_chk F
+GLIBC_2.36 __finite F
+GLIBC_2.36 __finitef F
+GLIBC_2.36 __finitel F
+GLIBC_2.36 __flbf F
+GLIBC_2.36 __fork F
+GLIBC_2.36 __fpending F
+GLIBC_2.36 __fprintf_chk F
+GLIBC_2.36 __fpu_control D 0x4
+GLIBC_2.36 __fpurge F
+GLIBC_2.36 __fread_chk F
+GLIBC_2.36 __fread_unlocked_chk F
+GLIBC_2.36 __freadable F
+GLIBC_2.36 __freading F
+GLIBC_2.36 __freelocale F
+GLIBC_2.36 __fsetlocking F
+GLIBC_2.36 __fwprintf_chk F
+GLIBC_2.36 __fwritable F
+GLIBC_2.36 __fwriting F
+GLIBC_2.36 __getauxval F
+GLIBC_2.36 __getcwd_chk F
+GLIBC_2.36 __getdelim F
+GLIBC_2.36 __getdomainname_chk F
+GLIBC_2.36 __getgroups_chk F
+GLIBC_2.36 __gethostname_chk F
+GLIBC_2.36 __getlogin_r_chk F
+GLIBC_2.36 __getmntent_r F
+GLIBC_2.36 __getpagesize F
+GLIBC_2.36 __getpgid F
+GLIBC_2.36 __getpid F
+GLIBC_2.36 __gets_chk F
+GLIBC_2.36 __gettimeofday F
+GLIBC_2.36 __getwd_chk F
+GLIBC_2.36 __gmtime_r F
+GLIBC_2.36 __h_errno_location F
+GLIBC_2.36 __isalnum_l F
+GLIBC_2.36 __isalpha_l F
+GLIBC_2.36 __isascii_l F
+GLIBC_2.36 __isblank_l F
+GLIBC_2.36 __iscntrl_l F
+GLIBC_2.36 __isctype F
+GLIBC_2.36 __isdigit_l F
+GLIBC_2.36 __isgraph_l F
+GLIBC_2.36 __isinf F
+GLIBC_2.36 __isinff F
+GLIBC_2.36 __isinfl F
+GLIBC_2.36 __islower_l F
+GLIBC_2.36 __isnan F
+GLIBC_2.36 __isnanf F
+GLIBC_2.36 __isnanl F
+GLIBC_2.36 __isoc99_fscanf F
+GLIBC_2.36 __isoc99_fwscanf F
+GLIBC_2.36 __isoc99_scanf F
+GLIBC_2.36 __isoc99_sscanf F
+GLIBC_2.36 __isoc99_swscanf F
+GLIBC_2.36 __isoc99_vfscanf F
+GLIBC_2.36 __isoc99_vfwscanf F
+GLIBC_2.36 __isoc99_vscanf F
+GLIBC_2.36 __isoc99_vsscanf F
+GLIBC_2.36 __isoc99_vswscanf F
+GLIBC_2.36 __isoc99_vwscanf F
+GLIBC_2.36 __isoc99_wscanf F
+GLIBC_2.36 __isprint_l F
+GLIBC_2.36 __ispunct_l F
+GLIBC_2.36 __isspace_l F
+GLIBC_2.36 __isupper_l F
+GLIBC_2.36 __iswalnum_l F
+GLIBC_2.36 __iswalpha_l F
+GLIBC_2.36 __iswblank_l F
+GLIBC_2.36 __iswcntrl_l F
+GLIBC_2.36 __iswctype F
+GLIBC_2.36 __iswctype_l F
+GLIBC_2.36 __iswdigit_l F
+GLIBC_2.36 __iswgraph_l F
+GLIBC_2.36 __iswlower_l F
+GLIBC_2.36 __iswprint_l F
+GLIBC_2.36 __iswpunct_l F
+GLIBC_2.36 __iswspace_l F
+GLIBC_2.36 __iswupper_l F
+GLIBC_2.36 __iswxdigit_l F
+GLIBC_2.36 __isxdigit_l F
+GLIBC_2.36 __ivaliduser F
+GLIBC_2.36 __libc_allocate_rtsig F
+GLIBC_2.36 __libc_calloc F
+GLIBC_2.36 __libc_current_sigrtmax F
+GLIBC_2.36 __libc_current_sigrtmin F
+GLIBC_2.36 __libc_free F
+GLIBC_2.36 __libc_freeres F
+GLIBC_2.36 __libc_init_first F
+GLIBC_2.36 __libc_mallinfo F
+GLIBC_2.36 __libc_malloc F
+GLIBC_2.36 __libc_mallopt F
+GLIBC_2.36 __libc_memalign F
+GLIBC_2.36 __libc_pvalloc F
+GLIBC_2.36 __libc_realloc F
+GLIBC_2.36 __libc_sa_len F
+GLIBC_2.36 __libc_single_threaded D 0x1
+GLIBC_2.36 __libc_start_main F
+GLIBC_2.36 __libc_valloc F
+GLIBC_2.36 __longjmp_chk F
+GLIBC_2.36 __lseek F
+GLIBC_2.36 __mbrlen F
+GLIBC_2.36 __mbrtowc F
+GLIBC_2.36 __mbsnrtowcs_chk F
+GLIBC_2.36 __mbsrtowcs_chk F
+GLIBC_2.36 __mbstowcs_chk F
+GLIBC_2.36 __memcmpeq F
+GLIBC_2.36 __memcpy_chk F
+GLIBC_2.36 __memmove_chk F
+GLIBC_2.36 __mempcpy F
+GLIBC_2.36 __mempcpy_chk F
+GLIBC_2.36 __memset_chk F
+GLIBC_2.36 __monstartup F
+GLIBC_2.36 __mq_open_2 F
+GLIBC_2.36 __nanosleep F
+GLIBC_2.36 __newlocale F
+GLIBC_2.36 __nl_langinfo_l F
+GLIBC_2.36 __nss_configure_lookup F
+GLIBC_2.36 __nss_hostname_digits_dots F
+GLIBC_2.36 __obstack_printf_chk F
+GLIBC_2.36 __obstack_vprintf_chk F
+GLIBC_2.36 __open F
+GLIBC_2.36 __open64 F
+GLIBC_2.36 __open64_2 F
+GLIBC_2.36 __open_2 F
+GLIBC_2.36 __openat64_2 F
+GLIBC_2.36 __openat_2 F
+GLIBC_2.36 __overflow F
+GLIBC_2.36 __pipe F
+GLIBC_2.36 __poll F
+GLIBC_2.36 __poll_chk F
+GLIBC_2.36 __posix_getopt F
+GLIBC_2.36 __ppoll_chk F
+GLIBC_2.36 __pread64 F
+GLIBC_2.36 __pread64_chk F
+GLIBC_2.36 __pread_chk F
+GLIBC_2.36 __printf_chk F
+GLIBC_2.36 __printf_fp F
+GLIBC_2.36 __profile_frequency F
+GLIBC_2.36 __progname D 0x8
+GLIBC_2.36 __progname_full D 0x8
+GLIBC_2.36 __pthread_cleanup_routine F
+GLIBC_2.36 __pthread_key_create F
+GLIBC_2.36 __pthread_register_cancel F
+GLIBC_2.36 __pthread_register_cancel_defer F
+GLIBC_2.36 __pthread_rwlock_unlock F
+GLIBC_2.36 __pthread_unregister_cancel F
+GLIBC_2.36 __pthread_unregister_cancel_restore F
+GLIBC_2.36 __pthread_unwind_next F
+GLIBC_2.36 __ptsname_r_chk F
+GLIBC_2.36 __pwrite64 F
+GLIBC_2.36 __rawmemchr F
+GLIBC_2.36 __rcmd_errstr D 0x8
+GLIBC_2.36 __read F
+GLIBC_2.36 __read_chk F
+GLIBC_2.36 __readlink_chk F
+GLIBC_2.36 __readlinkat_chk F
+GLIBC_2.36 __realpath_chk F
+GLIBC_2.36 __recv_chk F
+GLIBC_2.36 __recvfrom_chk F
+GLIBC_2.36 __register_atfork F
+GLIBC_2.36 __res_init F
+GLIBC_2.36 __res_nclose F
+GLIBC_2.36 __res_ninit F
+GLIBC_2.36 __res_randomid F
+GLIBC_2.36 __res_state F
+GLIBC_2.36 __sbrk F
+GLIBC_2.36 __sched_cpualloc F
+GLIBC_2.36 __sched_cpucount F
+GLIBC_2.36 __sched_cpufree F
+GLIBC_2.36 __sched_get_priority_max F
+GLIBC_2.36 __sched_get_priority_min F
+GLIBC_2.36 __sched_getparam F
+GLIBC_2.36 __sched_getscheduler F
+GLIBC_2.36 __sched_setscheduler F
+GLIBC_2.36 __sched_yield F
+GLIBC_2.36 __select F
+GLIBC_2.36 __send F
+GLIBC_2.36 __setmntent F
+GLIBC_2.36 __setpgid F
+GLIBC_2.36 __sigaction F
+GLIBC_2.36 __signbit F
+GLIBC_2.36 __signbitf F
+GLIBC_2.36 __signbitl F
+GLIBC_2.36 __sigpause F
+GLIBC_2.36 __sigsetjmp F
+GLIBC_2.36 __sigsuspend F
+GLIBC_2.36 __snprintf_chk F
+GLIBC_2.36 __sprintf_chk F
+GLIBC_2.36 __stack_chk_fail F
+GLIBC_2.36 __statfs F
+GLIBC_2.36 __stpcpy F
+GLIBC_2.36 __stpcpy_chk F
+GLIBC_2.36 __stpncpy F
+GLIBC_2.36 __stpncpy_chk F
+GLIBC_2.36 __strcasecmp F
+GLIBC_2.36 __strcasecmp_l F
+GLIBC_2.36 __strcasestr F
+GLIBC_2.36 __strcat_chk F
+GLIBC_2.36 __strcoll_l F
+GLIBC_2.36 __strcpy_chk F
+GLIBC_2.36 __strdup F
+GLIBC_2.36 __strerror_r F
+GLIBC_2.36 __strfmon_l F
+GLIBC_2.36 __strftime_l F
+GLIBC_2.36 __strncasecmp_l F
+GLIBC_2.36 __strncat_chk F
+GLIBC_2.36 __strncpy_chk F
+GLIBC_2.36 __strndup F
+GLIBC_2.36 __strsep_g F
+GLIBC_2.36 __strtod_internal F
+GLIBC_2.36 __strtod_l F
+GLIBC_2.36 __strtof_internal F
+GLIBC_2.36 __strtof_l F
+GLIBC_2.36 __strtok_r F
+GLIBC_2.36 __strtol_internal F
+GLIBC_2.36 __strtol_l F
+GLIBC_2.36 __strtold_internal F
+GLIBC_2.36 __strtold_l F
+GLIBC_2.36 __strtoll_internal F
+GLIBC_2.36 __strtoll_l F
+GLIBC_2.36 __strtoul_internal F
+GLIBC_2.36 __strtoul_l F
+GLIBC_2.36 __strtoull_internal F
+GLIBC_2.36 __strtoull_l F
+GLIBC_2.36 __strverscmp F
+GLIBC_2.36 __strxfrm_l F
+GLIBC_2.36 __swprintf_chk F
+GLIBC_2.36 __sysconf F
+GLIBC_2.36 __syslog_chk F
+GLIBC_2.36 __sysv_signal F
+GLIBC_2.36 __timezone D 0x8
+GLIBC_2.36 __toascii_l F
+GLIBC_2.36 __tolower_l F
+GLIBC_2.36 __toupper_l F
+GLIBC_2.36 __towctrans F
+GLIBC_2.36 __towctrans_l F
+GLIBC_2.36 __towlower_l F
+GLIBC_2.36 __towupper_l F
+GLIBC_2.36 __ttyname_r_chk F
+GLIBC_2.36 __tzname D 0x10
+GLIBC_2.36 __uflow F
+GLIBC_2.36 __underflow F
+GLIBC_2.36 __uselocale F
+GLIBC_2.36 __vasprintf_chk F
+GLIBC_2.36 __vdprintf_chk F
+GLIBC_2.36 __vfork F
+GLIBC_2.36 __vfprintf_chk F
+GLIBC_2.36 __vfscanf F
+GLIBC_2.36 __vfwprintf_chk F
+GLIBC_2.36 __vprintf_chk F
+GLIBC_2.36 __vsnprintf F
+GLIBC_2.36 __vsnprintf_chk F
+GLIBC_2.36 __vsprintf_chk F
+GLIBC_2.36 __vsscanf F
+GLIBC_2.36 __vswprintf_chk F
+GLIBC_2.36 __vsyslog_chk F
+GLIBC_2.36 __vwprintf_chk F
+GLIBC_2.36 __wait F
+GLIBC_2.36 __waitpid F
+GLIBC_2.36 __wcpcpy_chk F
+GLIBC_2.36 __wcpncpy_chk F
+GLIBC_2.36 __wcrtomb_chk F
+GLIBC_2.36 __wcscasecmp_l F
+GLIBC_2.36 __wcscat_chk F
+GLIBC_2.36 __wcscoll_l F
+GLIBC_2.36 __wcscpy_chk F
+GLIBC_2.36 __wcsftime_l F
+GLIBC_2.36 __wcsncasecmp_l F
+GLIBC_2.36 __wcsncat_chk F
+GLIBC_2.36 __wcsncpy_chk F
+GLIBC_2.36 __wcsnrtombs_chk F
+GLIBC_2.36 __wcsrtombs_chk F
+GLIBC_2.36 __wcstod_internal F
+GLIBC_2.36 __wcstod_l F
+GLIBC_2.36 __wcstof_internal F
+GLIBC_2.36 __wcstof_l F
+GLIBC_2.36 __wcstol_internal F
+GLIBC_2.36 __wcstol_l F
+GLIBC_2.36 __wcstold_internal F
+GLIBC_2.36 __wcstold_l F
+GLIBC_2.36 __wcstoll_internal F
+GLIBC_2.36 __wcstoll_l F
+GLIBC_2.36 __wcstombs_chk F
+GLIBC_2.36 __wcstoul_internal F
+GLIBC_2.36 __wcstoul_l F
+GLIBC_2.36 __wcstoull_internal F
+GLIBC_2.36 __wcstoull_l F
+GLIBC_2.36 __wcsxfrm_l F
+GLIBC_2.36 __wctomb_chk F
+GLIBC_2.36 __wctrans_l F
+GLIBC_2.36 __wctype_l F
+GLIBC_2.36 __wmemcpy_chk F
+GLIBC_2.36 __wmemmove_chk F
+GLIBC_2.36 __wmempcpy_chk F
+GLIBC_2.36 __wmemset_chk F
+GLIBC_2.36 __woverflow F
+GLIBC_2.36 __wprintf_chk F
+GLIBC_2.36 __write F
+GLIBC_2.36 __wuflow F
+GLIBC_2.36 __wunderflow F
+GLIBC_2.36 __xpg_basename F
+GLIBC_2.36 __xpg_sigpause F
+GLIBC_2.36 __xpg_strerror_r F
+GLIBC_2.36 _dl_find_object F
+GLIBC_2.36 _dl_mcount_wrapper F
+GLIBC_2.36 _dl_mcount_wrapper_check F
+GLIBC_2.36 _environ D 0x8
+GLIBC_2.36 _exit F
+GLIBC_2.36 _flushlbf F
+GLIBC_2.36 _libc_intl_domainname D 0x5
+GLIBC_2.36 _longjmp F
+GLIBC_2.36 _mcleanup F
+GLIBC_2.36 _mcount F
+GLIBC_2.36 _nl_default_dirname D 0x12
+GLIBC_2.36 _nl_domain_bindings D 0x8
+GLIBC_2.36 _nl_msg_cat_cntr D 0x4
+GLIBC_2.36 _obstack_allocated_p F
+GLIBC_2.36 _obstack_begin F
+GLIBC_2.36 _obstack_begin_1 F
+GLIBC_2.36 _obstack_free F
+GLIBC_2.36 _obstack_memory_used F
+GLIBC_2.36 _obstack_newchunk F
+GLIBC_2.36 _pthread_cleanup_pop F
+GLIBC_2.36 _pthread_cleanup_push F
+GLIBC_2.36 _res D 0x238
+GLIBC_2.36 _res_hconf D 0x48
+GLIBC_2.36 _setjmp F
+GLIBC_2.36 _tolower F
+GLIBC_2.36 _toupper F
+GLIBC_2.36 a64l F
+GLIBC_2.36 abort F
+GLIBC_2.36 abs F
+GLIBC_2.36 accept F
+GLIBC_2.36 accept4 F
+GLIBC_2.36 access F
+GLIBC_2.36 acct F
+GLIBC_2.36 addmntent F
+GLIBC_2.36 addseverity F
+GLIBC_2.36 adjtime F
+GLIBC_2.36 adjtimex F
+GLIBC_2.36 aio_cancel F
+GLIBC_2.36 aio_cancel64 F
+GLIBC_2.36 aio_error F
+GLIBC_2.36 aio_error64 F
+GLIBC_2.36 aio_fsync F
+GLIBC_2.36 aio_fsync64 F
+GLIBC_2.36 aio_init F
+GLIBC_2.36 aio_read F
+GLIBC_2.36 aio_read64 F
+GLIBC_2.36 aio_return F
+GLIBC_2.36 aio_return64 F
+GLIBC_2.36 aio_suspend F
+GLIBC_2.36 aio_suspend64 F
+GLIBC_2.36 aio_write F
+GLIBC_2.36 aio_write64 F
+GLIBC_2.36 alarm F
+GLIBC_2.36 aligned_alloc F
+GLIBC_2.36 alphasort F
+GLIBC_2.36 alphasort64 F
+GLIBC_2.36 argp_err_exit_status D 0x4
+GLIBC_2.36 argp_error F
+GLIBC_2.36 argp_failure F
+GLIBC_2.36 argp_help F
+GLIBC_2.36 argp_parse F
+GLIBC_2.36 argp_program_bug_address D 0x8
+GLIBC_2.36 argp_program_version D 0x8
+GLIBC_2.36 argp_program_version_hook D 0x8
+GLIBC_2.36 argp_state_help F
+GLIBC_2.36 argp_usage F
+GLIBC_2.36 argz_add F
+GLIBC_2.36 argz_add_sep F
+GLIBC_2.36 argz_append F
+GLIBC_2.36 argz_count F
+GLIBC_2.36 argz_create F
+GLIBC_2.36 argz_create_sep F
+GLIBC_2.36 argz_delete F
+GLIBC_2.36 argz_extract F
+GLIBC_2.36 argz_insert F
+GLIBC_2.36 argz_next F
+GLIBC_2.36 argz_replace F
+GLIBC_2.36 argz_stringify F
+GLIBC_2.36 asctime F
+GLIBC_2.36 asctime_r F
+GLIBC_2.36 asprintf F
+GLIBC_2.36 atof F
+GLIBC_2.36 atoi F
+GLIBC_2.36 atol F
+GLIBC_2.36 atoll F
+GLIBC_2.36 backtrace F
+GLIBC_2.36 backtrace_symbols F
+GLIBC_2.36 backtrace_symbols_fd F
+GLIBC_2.36 basename F
+GLIBC_2.36 bcmp F
+GLIBC_2.36 bcopy F
+GLIBC_2.36 bind F
+GLIBC_2.36 bind_textdomain_codeset F
+GLIBC_2.36 bindresvport F
+GLIBC_2.36 bindtextdomain F
+GLIBC_2.36 brk F
+GLIBC_2.36 bsd_signal F
+GLIBC_2.36 bsearch F
+GLIBC_2.36 btowc F
+GLIBC_2.36 bzero F
+GLIBC_2.36 c16rtomb F
+GLIBC_2.36 c32rtomb F
+GLIBC_2.36 call_once F
+GLIBC_2.36 calloc F
+GLIBC_2.36 canonicalize_file_name F
+GLIBC_2.36 capget F
+GLIBC_2.36 capset F
+GLIBC_2.36 catclose F
+GLIBC_2.36 catgets F
+GLIBC_2.36 catopen F
+GLIBC_2.36 cfgetispeed F
+GLIBC_2.36 cfgetospeed F
+GLIBC_2.36 cfmakeraw F
+GLIBC_2.36 cfsetispeed F
+GLIBC_2.36 cfsetospeed F
+GLIBC_2.36 cfsetspeed F
+GLIBC_2.36 chdir F
+GLIBC_2.36 chflags F
+GLIBC_2.36 chmod F
+GLIBC_2.36 chown F
+GLIBC_2.36 chroot F
+GLIBC_2.36 clearenv F
+GLIBC_2.36 clearerr F
+GLIBC_2.36 clearerr_unlocked F
+GLIBC_2.36 clock F
+GLIBC_2.36 clock_adjtime F
+GLIBC_2.36 clock_getcpuclockid F
+GLIBC_2.36 clock_getres F
+GLIBC_2.36 clock_gettime F
+GLIBC_2.36 clock_nanosleep F
+GLIBC_2.36 clock_settime F
+GLIBC_2.36 clone F
+GLIBC_2.36 close F
+GLIBC_2.36 close_range F
+GLIBC_2.36 closedir F
+GLIBC_2.36 closefrom F
+GLIBC_2.36 closelog F
+GLIBC_2.36 cnd_broadcast F
+GLIBC_2.36 cnd_destroy F
+GLIBC_2.36 cnd_init F
+GLIBC_2.36 cnd_signal F
+GLIBC_2.36 cnd_timedwait F
+GLIBC_2.36 cnd_wait F
+GLIBC_2.36 confstr F
+GLIBC_2.36 connect F
+GLIBC_2.36 copy_file_range F
+GLIBC_2.36 copysign F
+GLIBC_2.36 copysignf F
+GLIBC_2.36 copysignl F
+GLIBC_2.36 creat F
+GLIBC_2.36 creat64 F
+GLIBC_2.36 ctermid F
+GLIBC_2.36 ctime F
+GLIBC_2.36 ctime_r F
+GLIBC_2.36 cuserid F
+GLIBC_2.36 daemon F
+GLIBC_2.36 daylight D 0x4
+GLIBC_2.36 dcgettext F
+GLIBC_2.36 dcngettext F
+GLIBC_2.36 delete_module F
+GLIBC_2.36 dgettext F
+GLIBC_2.36 difftime F
+GLIBC_2.36 dirfd F
+GLIBC_2.36 dirname F
+GLIBC_2.36 div F
+GLIBC_2.36 dl_iterate_phdr F
+GLIBC_2.36 dladdr F
+GLIBC_2.36 dladdr1 F
+GLIBC_2.36 dlclose F
+GLIBC_2.36 dlerror F
+GLIBC_2.36 dlinfo F
+GLIBC_2.36 dlmopen F
+GLIBC_2.36 dlopen F
+GLIBC_2.36 dlsym F
+GLIBC_2.36 dlvsym F
+GLIBC_2.36 dn_comp F
+GLIBC_2.36 dn_expand F
+GLIBC_2.36 dn_skipname F
+GLIBC_2.36 dngettext F
+GLIBC_2.36 dprintf F
+GLIBC_2.36 drand48 F
+GLIBC_2.36 drand48_r F
+GLIBC_2.36 dup F
+GLIBC_2.36 dup2 F
+GLIBC_2.36 dup3 F
+GLIBC_2.36 duplocale F
+GLIBC_2.36 dysize F
+GLIBC_2.36 eaccess F
+GLIBC_2.36 ecvt F
+GLIBC_2.36 ecvt_r F
+GLIBC_2.36 endaliasent F
+GLIBC_2.36 endfsent F
+GLIBC_2.36 endgrent F
+GLIBC_2.36 endhostent F
+GLIBC_2.36 endmntent F
+GLIBC_2.36 endnetent F
+GLIBC_2.36 endnetgrent F
+GLIBC_2.36 endprotoent F
+GLIBC_2.36 endpwent F
+GLIBC_2.36 endrpcent F
+GLIBC_2.36 endservent F
+GLIBC_2.36 endsgent F
+GLIBC_2.36 endspent F
+GLIBC_2.36 endttyent F
+GLIBC_2.36 endusershell F
+GLIBC_2.36 endutent F
+GLIBC_2.36 endutxent F
+GLIBC_2.36 environ D 0x8
+GLIBC_2.36 envz_add F
+GLIBC_2.36 envz_entry F
+GLIBC_2.36 envz_get F
+GLIBC_2.36 envz_merge F
+GLIBC_2.36 envz_remove F
+GLIBC_2.36 envz_strip F
+GLIBC_2.36 epoll_create F
+GLIBC_2.36 epoll_create1 F
+GLIBC_2.36 epoll_ctl F
+GLIBC_2.36 epoll_pwait F
+GLIBC_2.36 epoll_pwait2 F
+GLIBC_2.36 epoll_wait F
+GLIBC_2.36 erand48 F
+GLIBC_2.36 erand48_r F
+GLIBC_2.36 err F
+GLIBC_2.36 error F
+GLIBC_2.36 error_at_line F
+GLIBC_2.36 error_message_count D 0x4
+GLIBC_2.36 error_one_per_line D 0x4
+GLIBC_2.36 error_print_progname D 0x8
+GLIBC_2.36 errx F
+GLIBC_2.36 ether_aton F
+GLIBC_2.36 ether_aton_r F
+GLIBC_2.36 ether_hostton F
+GLIBC_2.36 ether_line F
+GLIBC_2.36 ether_ntoa F
+GLIBC_2.36 ether_ntoa_r F
+GLIBC_2.36 ether_ntohost F
+GLIBC_2.36 euidaccess F
+GLIBC_2.36 eventfd F
+GLIBC_2.36 eventfd_read F
+GLIBC_2.36 eventfd_write F
+GLIBC_2.36 execl F
+GLIBC_2.36 execle F
+GLIBC_2.36 execlp F
+GLIBC_2.36 execv F
+GLIBC_2.36 execve F
+GLIBC_2.36 execveat F
+GLIBC_2.36 execvp F
+GLIBC_2.36 execvpe F
+GLIBC_2.36 exit F
+GLIBC_2.36 explicit_bzero F
+GLIBC_2.36 faccessat F
+GLIBC_2.36 fallocate F
+GLIBC_2.36 fallocate64 F
+GLIBC_2.36 fanotify_init F
+GLIBC_2.36 fanotify_mark F
+GLIBC_2.36 fchdir F
+GLIBC_2.36 fchflags F
+GLIBC_2.36 fchmod F
+GLIBC_2.36 fchmodat F
+GLIBC_2.36 fchown F
+GLIBC_2.36 fchownat F
+GLIBC_2.36 fclose F
+GLIBC_2.36 fcloseall F
+GLIBC_2.36 fcntl F
+GLIBC_2.36 fcntl64 F
+GLIBC_2.36 fcvt F
+GLIBC_2.36 fcvt_r F
+GLIBC_2.36 fdatasync F
+GLIBC_2.36 fdopen F
+GLIBC_2.36 fdopendir F
+GLIBC_2.36 feof F
+GLIBC_2.36 feof_unlocked F
+GLIBC_2.36 ferror F
+GLIBC_2.36 ferror_unlocked F
+GLIBC_2.36 fexecve F
+GLIBC_2.36 fflush F
+GLIBC_2.36 fflush_unlocked F
+GLIBC_2.36 ffs F
+GLIBC_2.36 ffsl F
+GLIBC_2.36 ffsll F
+GLIBC_2.36 fgetc F
+GLIBC_2.36 fgetc_unlocked F
+GLIBC_2.36 fgetgrent F
+GLIBC_2.36 fgetgrent_r F
+GLIBC_2.36 fgetpos F
+GLIBC_2.36 fgetpos64 F
+GLIBC_2.36 fgetpwent F
+GLIBC_2.36 fgetpwent_r F
+GLIBC_2.36 fgets F
+GLIBC_2.36 fgets_unlocked F
+GLIBC_2.36 fgetsgent F
+GLIBC_2.36 fgetsgent_r F
+GLIBC_2.36 fgetspent F
+GLIBC_2.36 fgetspent_r F
+GLIBC_2.36 fgetwc F
+GLIBC_2.36 fgetwc_unlocked F
+GLIBC_2.36 fgetws F
+GLIBC_2.36 fgetws_unlocked F
+GLIBC_2.36 fgetxattr F
+GLIBC_2.36 fileno F
+GLIBC_2.36 fileno_unlocked F
+GLIBC_2.36 finite F
+GLIBC_2.36 finitef F
+GLIBC_2.36 finitel F
+GLIBC_2.36 flistxattr F
+GLIBC_2.36 flock F
+GLIBC_2.36 flockfile F
+GLIBC_2.36 fmemopen F
+GLIBC_2.36 fmtmsg F
+GLIBC_2.36 fnmatch F
+GLIBC_2.36 fopen F
+GLIBC_2.36 fopen64 F
+GLIBC_2.36 fopencookie F
+GLIBC_2.36 fork F
+GLIBC_2.36 forkpty F
+GLIBC_2.36 fpathconf F
+GLIBC_2.36 fprintf F
+GLIBC_2.36 fputc F
+GLIBC_2.36 fputc_unlocked F
+GLIBC_2.36 fputs F
+GLIBC_2.36 fputs_unlocked F
+GLIBC_2.36 fputwc F
+GLIBC_2.36 fputwc_unlocked F
+GLIBC_2.36 fputws F
+GLIBC_2.36 fputws_unlocked F
+GLIBC_2.36 fread F
+GLIBC_2.36 fread_unlocked F
+GLIBC_2.36 free F
+GLIBC_2.36 freeaddrinfo F
+GLIBC_2.36 freeifaddrs F
+GLIBC_2.36 freelocale F
+GLIBC_2.36 fremovexattr F
+GLIBC_2.36 freopen F
+GLIBC_2.36 freopen64 F
+GLIBC_2.36 frexp F
+GLIBC_2.36 frexpf F
+GLIBC_2.36 frexpl F
+GLIBC_2.36 fscanf F
+GLIBC_2.36 fseek F
+GLIBC_2.36 fseeko F
+GLIBC_2.36 fseeko64 F
+GLIBC_2.36 fsetpos F
+GLIBC_2.36 fsetpos64 F
+GLIBC_2.36 fsetxattr F
+GLIBC_2.36 fstat F
+GLIBC_2.36 fstat64 F
+GLIBC_2.36 fstatat F
+GLIBC_2.36 fstatat64 F
+GLIBC_2.36 fstatfs F
+GLIBC_2.36 fstatfs64 F
+GLIBC_2.36 fstatvfs F
+GLIBC_2.36 fstatvfs64 F
+GLIBC_2.36 fsync F
+GLIBC_2.36 ftell F
+GLIBC_2.36 ftello F
+GLIBC_2.36 ftello64 F
+GLIBC_2.36 ftime F
+GLIBC_2.36 ftok F
+GLIBC_2.36 ftruncate F
+GLIBC_2.36 ftruncate64 F
+GLIBC_2.36 ftrylockfile F
+GLIBC_2.36 fts64_children F
+GLIBC_2.36 fts64_close F
+GLIBC_2.36 fts64_open F
+GLIBC_2.36 fts64_read F
+GLIBC_2.36 fts64_set F
+GLIBC_2.36 fts_children F
+GLIBC_2.36 fts_close F
+GLIBC_2.36 fts_open F
+GLIBC_2.36 fts_read F
+GLIBC_2.36 fts_set F
+GLIBC_2.36 ftw F
+GLIBC_2.36 ftw64 F
+GLIBC_2.36 funlockfile F
+GLIBC_2.36 futimens F
+GLIBC_2.36 futimes F
+GLIBC_2.36 futimesat F
+GLIBC_2.36 fwide F
+GLIBC_2.36 fwprintf F
+GLIBC_2.36 fwrite F
+GLIBC_2.36 fwrite_unlocked F
+GLIBC_2.36 fwscanf F
+GLIBC_2.36 gai_cancel F
+GLIBC_2.36 gai_error F
+GLIBC_2.36 gai_strerror F
+GLIBC_2.36 gai_suspend F
+GLIBC_2.36 gcvt F
+GLIBC_2.36 get_avphys_pages F
+GLIBC_2.36 get_current_dir_name F
+GLIBC_2.36 get_nprocs F
+GLIBC_2.36 get_nprocs_conf F
+GLIBC_2.36 get_phys_pages F
+GLIBC_2.36 getaddrinfo F
+GLIBC_2.36 getaddrinfo_a F
+GLIBC_2.36 getaliasbyname F
+GLIBC_2.36 getaliasbyname_r F
+GLIBC_2.36 getaliasent F
+GLIBC_2.36 getaliasent_r F
+GLIBC_2.36 getauxval F
+GLIBC_2.36 getc F
+GLIBC_2.36 getc_unlocked F
+GLIBC_2.36 getchar F
+GLIBC_2.36 getchar_unlocked F
+GLIBC_2.36 getcontext F
+GLIBC_2.36 getcpu F
+GLIBC_2.36 getcwd F
+GLIBC_2.36 getdate F
+GLIBC_2.36 getdate_err D 0x4
+GLIBC_2.36 getdate_r F
+GLIBC_2.36 getdelim F
+GLIBC_2.36 getdents64 F
+GLIBC_2.36 getdirentries F
+GLIBC_2.36 getdirentries64 F
+GLIBC_2.36 getdomainname F
+GLIBC_2.36 getdtablesize F
+GLIBC_2.36 getegid F
+GLIBC_2.36 getentropy F
+GLIBC_2.36 getenv F
+GLIBC_2.36 geteuid F
+GLIBC_2.36 getfsent F
+GLIBC_2.36 getfsfile F
+GLIBC_2.36 getfsspec F
+GLIBC_2.36 getgid F
+GLIBC_2.36 getgrent F
+GLIBC_2.36 getgrent_r F
+GLIBC_2.36 getgrgid F
+GLIBC_2.36 getgrgid_r F
+GLIBC_2.36 getgrnam F
+GLIBC_2.36 getgrnam_r F
+GLIBC_2.36 getgrouplist F
+GLIBC_2.36 getgroups F
+GLIBC_2.36 gethostbyaddr F
+GLIBC_2.36 gethostbyaddr_r F
+GLIBC_2.36 gethostbyname F
+GLIBC_2.36 gethostbyname2 F
+GLIBC_2.36 gethostbyname2_r F
+GLIBC_2.36 gethostbyname_r F
+GLIBC_2.36 gethostent F
+GLIBC_2.36 gethostent_r F
+GLIBC_2.36 gethostid F
+GLIBC_2.36 gethostname F
+GLIBC_2.36 getifaddrs F
+GLIBC_2.36 getipv4sourcefilter F
+GLIBC_2.36 getitimer F
+GLIBC_2.36 getline F
+GLIBC_2.36 getloadavg F
+GLIBC_2.36 getlogin F
+GLIBC_2.36 getlogin_r F
+GLIBC_2.36 getmntent F
+GLIBC_2.36 getmntent_r F
+GLIBC_2.36 getnameinfo F
+GLIBC_2.36 getnetbyaddr F
+GLIBC_2.36 getnetbyaddr_r F
+GLIBC_2.36 getnetbyname F
+GLIBC_2.36 getnetbyname_r F
+GLIBC_2.36 getnetent F
+GLIBC_2.36 getnetent_r F
+GLIBC_2.36 getnetgrent F
+GLIBC_2.36 getnetgrent_r F
+GLIBC_2.36 getopt F
+GLIBC_2.36 getopt_long F
+GLIBC_2.36 getopt_long_only F
+GLIBC_2.36 getpagesize F
+GLIBC_2.36 getpass F
+GLIBC_2.36 getpeername F
+GLIBC_2.36 getpgid F
+GLIBC_2.36 getpgrp F
+GLIBC_2.36 getpid F
+GLIBC_2.36 getppid F
+GLIBC_2.36 getpriority F
+GLIBC_2.36 getprotobyname F
+GLIBC_2.36 getprotobyname_r F
+GLIBC_2.36 getprotobynumber F
+GLIBC_2.36 getprotobynumber_r F
+GLIBC_2.36 getprotoent F
+GLIBC_2.36 getprotoent_r F
+GLIBC_2.36 getpt F
+GLIBC_2.36 getpw F
+GLIBC_2.36 getpwent F
+GLIBC_2.36 getpwent_r F
+GLIBC_2.36 getpwnam F
+GLIBC_2.36 getpwnam_r F
+GLIBC_2.36 getpwuid F
+GLIBC_2.36 getpwuid_r F
+GLIBC_2.36 getrandom F
+GLIBC_2.36 getresgid F
+GLIBC_2.36 getresuid F
+GLIBC_2.36 getrlimit F
+GLIBC_2.36 getrlimit64 F
+GLIBC_2.36 getrpcbyname F
+GLIBC_2.36 getrpcbyname_r F
+GLIBC_2.36 getrpcbynumber F
+GLIBC_2.36 getrpcbynumber_r F
+GLIBC_2.36 getrpcent F
+GLIBC_2.36 getrpcent_r F
+GLIBC_2.36 getrusage F
+GLIBC_2.36 gets F
+GLIBC_2.36 getservbyname F
+GLIBC_2.36 getservbyname_r F
+GLIBC_2.36 getservbyport F
+GLIBC_2.36 getservbyport_r F
+GLIBC_2.36 getservent F
+GLIBC_2.36 getservent_r F
+GLIBC_2.36 getsgent F
+GLIBC_2.36 getsgent_r F
+GLIBC_2.36 getsgnam F
+GLIBC_2.36 getsgnam_r F
+GLIBC_2.36 getsid F
+GLIBC_2.36 getsockname F
+GLIBC_2.36 getsockopt F
+GLIBC_2.36 getsourcefilter F
+GLIBC_2.36 getspent F
+GLIBC_2.36 getspent_r F
+GLIBC_2.36 getspnam F
+GLIBC_2.36 getspnam_r F
+GLIBC_2.36 getsubopt F
+GLIBC_2.36 gettext F
+GLIBC_2.36 gettid F
+GLIBC_2.36 gettimeofday F
+GLIBC_2.36 getttyent F
+GLIBC_2.36 getttynam F
+GLIBC_2.36 getuid F
+GLIBC_2.36 getusershell F
+GLIBC_2.36 getutent F
+GLIBC_2.36 getutent_r F
+GLIBC_2.36 getutid F
+GLIBC_2.36 getutid_r F
+GLIBC_2.36 getutline F
+GLIBC_2.36 getutline_r F
+GLIBC_2.36 getutmp F
+GLIBC_2.36 getutmpx F
+GLIBC_2.36 getutxent F
+GLIBC_2.36 getutxid F
+GLIBC_2.36 getutxline F
+GLIBC_2.36 getw F
+GLIBC_2.36 getwc F
+GLIBC_2.36 getwc_unlocked F
+GLIBC_2.36 getwchar F
+GLIBC_2.36 getwchar_unlocked F
+GLIBC_2.36 getwd F
+GLIBC_2.36 getxattr F
+GLIBC_2.36 glob F
+GLIBC_2.36 glob64 F
+GLIBC_2.36 glob_pattern_p F
+GLIBC_2.36 globfree F
+GLIBC_2.36 globfree64 F
+GLIBC_2.36 gmtime F
+GLIBC_2.36 gmtime_r F
+GLIBC_2.36 gnu_dev_major F
+GLIBC_2.36 gnu_dev_makedev F
+GLIBC_2.36 gnu_dev_minor F
+GLIBC_2.36 gnu_get_libc_release F
+GLIBC_2.36 gnu_get_libc_version F
+GLIBC_2.36 grantpt F
+GLIBC_2.36 group_member F
+GLIBC_2.36 gsignal F
+GLIBC_2.36 gtty F
+GLIBC_2.36 h_errlist D 0x28
+GLIBC_2.36 h_nerr D 0x4
+GLIBC_2.36 hasmntopt F
+GLIBC_2.36 hcreate F
+GLIBC_2.36 hcreate_r F
+GLIBC_2.36 hdestroy F
+GLIBC_2.36 hdestroy_r F
+GLIBC_2.36 herror F
+GLIBC_2.36 hsearch F
+GLIBC_2.36 hsearch_r F
+GLIBC_2.36 hstrerror F
+GLIBC_2.36 htonl F
+GLIBC_2.36 htons F
+GLIBC_2.36 iconv F
+GLIBC_2.36 iconv_close F
+GLIBC_2.36 iconv_open F
+GLIBC_2.36 if_freenameindex F
+GLIBC_2.36 if_indextoname F
+GLIBC_2.36 if_nameindex F
+GLIBC_2.36 if_nametoindex F
+GLIBC_2.36 imaxabs F
+GLIBC_2.36 imaxdiv F
+GLIBC_2.36 in6addr_any D 0x10
+GLIBC_2.36 in6addr_loopback D 0x10
+GLIBC_2.36 index F
+GLIBC_2.36 inet6_opt_append F
+GLIBC_2.36 inet6_opt_find F
+GLIBC_2.36 inet6_opt_finish F
+GLIBC_2.36 inet6_opt_get_val F
+GLIBC_2.36 inet6_opt_init F
+GLIBC_2.36 inet6_opt_next F
+GLIBC_2.36 inet6_opt_set_val F
+GLIBC_2.36 inet6_option_alloc F
+GLIBC_2.36 inet6_option_append F
+GLIBC_2.36 inet6_option_find F
+GLIBC_2.36 inet6_option_init F
+GLIBC_2.36 inet6_option_next F
+GLIBC_2.36 inet6_option_space F
+GLIBC_2.36 inet6_rth_add F
+GLIBC_2.36 inet6_rth_getaddr F
+GLIBC_2.36 inet6_rth_init F
+GLIBC_2.36 inet6_rth_reverse F
+GLIBC_2.36 inet6_rth_segments F
+GLIBC_2.36 inet6_rth_space F
+GLIBC_2.36 inet_addr F
+GLIBC_2.36 inet_aton F
+GLIBC_2.36 inet_lnaof F
+GLIBC_2.36 inet_makeaddr F
+GLIBC_2.36 inet_netof F
+GLIBC_2.36 inet_network F
+GLIBC_2.36 inet_nsap_addr F
+GLIBC_2.36 inet_nsap_ntoa F
+GLIBC_2.36 inet_ntoa F
+GLIBC_2.36 inet_ntop F
+GLIBC_2.36 inet_pton F
+GLIBC_2.36 init_module F
+GLIBC_2.36 initgroups F
+GLIBC_2.36 initstate F
+GLIBC_2.36 initstate_r F
+GLIBC_2.36 innetgr F
+GLIBC_2.36 inotify_add_watch F
+GLIBC_2.36 inotify_init F
+GLIBC_2.36 inotify_init1 F
+GLIBC_2.36 inotify_rm_watch F
+GLIBC_2.36 insque F
+GLIBC_2.36 ioctl F
+GLIBC_2.36 iruserok F
+GLIBC_2.36 iruserok_af F
+GLIBC_2.36 isalnum F
+GLIBC_2.36 isalnum_l F
+GLIBC_2.36 isalpha F
+GLIBC_2.36 isalpha_l F
+GLIBC_2.36 isascii F
+GLIBC_2.36 isatty F
+GLIBC_2.36 isblank F
+GLIBC_2.36 isblank_l F
+GLIBC_2.36 iscntrl F
+GLIBC_2.36 iscntrl_l F
+GLIBC_2.36 isctype F
+GLIBC_2.36 isdigit F
+GLIBC_2.36 isdigit_l F
+GLIBC_2.36 isfdtype F
+GLIBC_2.36 isgraph F
+GLIBC_2.36 isgraph_l F
+GLIBC_2.36 isinf F
+GLIBC_2.36 isinff F
+GLIBC_2.36 isinfl F
+GLIBC_2.36 islower F
+GLIBC_2.36 islower_l F
+GLIBC_2.36 isnan F
+GLIBC_2.36 isnanf F
+GLIBC_2.36 isnanl F
+GLIBC_2.36 isprint F
+GLIBC_2.36 isprint_l F
+GLIBC_2.36 ispunct F
+GLIBC_2.36 ispunct_l F
+GLIBC_2.36 isspace F
+GLIBC_2.36 isspace_l F
+GLIBC_2.36 isupper F
+GLIBC_2.36 isupper_l F
+GLIBC_2.36 iswalnum F
+GLIBC_2.36 iswalnum_l F
+GLIBC_2.36 iswalpha F
+GLIBC_2.36 iswalpha_l F
+GLIBC_2.36 iswblank F
+GLIBC_2.36 iswblank_l F
+GLIBC_2.36 iswcntrl F
+GLIBC_2.36 iswcntrl_l F
+GLIBC_2.36 iswctype F
+GLIBC_2.36 iswctype_l F
+GLIBC_2.36 iswdigit F
+GLIBC_2.36 iswdigit_l F
+GLIBC_2.36 iswgraph F
+GLIBC_2.36 iswgraph_l F
+GLIBC_2.36 iswlower F
+GLIBC_2.36 iswlower_l F
+GLIBC_2.36 iswprint F
+GLIBC_2.36 iswprint_l F
+GLIBC_2.36 iswpunct F
+GLIBC_2.36 iswpunct_l F
+GLIBC_2.36 iswspace F
+GLIBC_2.36 iswspace_l F
+GLIBC_2.36 iswupper F
+GLIBC_2.36 iswupper_l F
+GLIBC_2.36 iswxdigit F
+GLIBC_2.36 iswxdigit_l F
+GLIBC_2.36 isxdigit F
+GLIBC_2.36 isxdigit_l F
+GLIBC_2.36 jrand48 F
+GLIBC_2.36 jrand48_r F
+GLIBC_2.36 kill F
+GLIBC_2.36 killpg F
+GLIBC_2.36 klogctl F
+GLIBC_2.36 l64a F
+GLIBC_2.36 labs F
+GLIBC_2.36 lchmod F
+GLIBC_2.36 lchown F
+GLIBC_2.36 lckpwdf F
+GLIBC_2.36 lcong48 F
+GLIBC_2.36 lcong48_r F
+GLIBC_2.36 ldexp F
+GLIBC_2.36 ldexpf F
+GLIBC_2.36 ldexpl F
+GLIBC_2.36 ldiv F
+GLIBC_2.36 lfind F
+GLIBC_2.36 lgetxattr F
+GLIBC_2.36 link F
+GLIBC_2.36 linkat F
+GLIBC_2.36 lio_listio F
+GLIBC_2.36 lio_listio64 F
+GLIBC_2.36 listen F
+GLIBC_2.36 listxattr F
+GLIBC_2.36 llabs F
+GLIBC_2.36 lldiv F
+GLIBC_2.36 llistxattr F
+GLIBC_2.36 localeconv F
+GLIBC_2.36 localtime F
+GLIBC_2.36 localtime_r F
+GLIBC_2.36 lockf F
+GLIBC_2.36 lockf64 F
+GLIBC_2.36 login F
+GLIBC_2.36 login_tty F
+GLIBC_2.36 logout F
+GLIBC_2.36 logwtmp F
+GLIBC_2.36 longjmp F
+GLIBC_2.36 lrand48 F
+GLIBC_2.36 lrand48_r F
+GLIBC_2.36 lremovexattr F
+GLIBC_2.36 lsearch F
+GLIBC_2.36 lseek F
+GLIBC_2.36 lseek64 F
+GLIBC_2.36 lsetxattr F
+GLIBC_2.36 lstat F
+GLIBC_2.36 lstat64 F
+GLIBC_2.36 lutimes F
+GLIBC_2.36 madvise F
+GLIBC_2.36 makecontext F
+GLIBC_2.36 mallinfo F
+GLIBC_2.36 mallinfo2 F
+GLIBC_2.36 malloc F
+GLIBC_2.36 malloc_info F
+GLIBC_2.36 malloc_stats F
+GLIBC_2.36 malloc_trim F
+GLIBC_2.36 malloc_usable_size F
+GLIBC_2.36 mallopt F
+GLIBC_2.36 mblen F
+GLIBC_2.36 mbrlen F
+GLIBC_2.36 mbrtoc16 F
+GLIBC_2.36 mbrtoc32 F
+GLIBC_2.36 mbrtowc F
+GLIBC_2.36 mbsinit F
+GLIBC_2.36 mbsnrtowcs F
+GLIBC_2.36 mbsrtowcs F
+GLIBC_2.36 mbstowcs F
+GLIBC_2.36 mbtowc F
+GLIBC_2.36 mcheck F
+GLIBC_2.36 mcheck_check_all F
+GLIBC_2.36 mcheck_pedantic F
+GLIBC_2.36 memalign F
+GLIBC_2.36 memccpy F
+GLIBC_2.36 memchr F
+GLIBC_2.36 memcmp F
+GLIBC_2.36 memcpy F
+GLIBC_2.36 memfd_create F
+GLIBC_2.36 memfrob F
+GLIBC_2.36 memmem F
+GLIBC_2.36 memmove F
+GLIBC_2.36 mempcpy F
+GLIBC_2.36 memrchr F
+GLIBC_2.36 memset F
+GLIBC_2.36 mincore F
+GLIBC_2.36 mkdir F
+GLIBC_2.36 mkdirat F
+GLIBC_2.36 mkdtemp F
+GLIBC_2.36 mkfifo F
+GLIBC_2.36 mkfifoat F
+GLIBC_2.36 mknod F
+GLIBC_2.36 mknodat F
+GLIBC_2.36 mkostemp F
+GLIBC_2.36 mkostemp64 F
+GLIBC_2.36 mkostemps F
+GLIBC_2.36 mkostemps64 F
+GLIBC_2.36 mkstemp F
+GLIBC_2.36 mkstemp64 F
+GLIBC_2.36 mkstemps F
+GLIBC_2.36 mkstemps64 F
+GLIBC_2.36 mktemp F
+GLIBC_2.36 mktime F
+GLIBC_2.36 mlock F
+GLIBC_2.36 mlock2 F
+GLIBC_2.36 mlockall F
+GLIBC_2.36 mmap F
+GLIBC_2.36 mmap64 F
+GLIBC_2.36 modf F
+GLIBC_2.36 modff F
+GLIBC_2.36 modfl F
+GLIBC_2.36 moncontrol F
+GLIBC_2.36 monstartup F
+GLIBC_2.36 mount F
+GLIBC_2.36 mprobe F
+GLIBC_2.36 mprotect F
+GLIBC_2.36 mq_close F
+GLIBC_2.36 mq_getattr F
+GLIBC_2.36 mq_notify F
+GLIBC_2.36 mq_open F
+GLIBC_2.36 mq_receive F
+GLIBC_2.36 mq_send F
+GLIBC_2.36 mq_setattr F
+GLIBC_2.36 mq_timedreceive F
+GLIBC_2.36 mq_timedsend F
+GLIBC_2.36 mq_unlink F
+GLIBC_2.36 mrand48 F
+GLIBC_2.36 mrand48_r F
+GLIBC_2.36 mremap F
+GLIBC_2.36 msgctl F
+GLIBC_2.36 msgget F
+GLIBC_2.36 msgrcv F
+GLIBC_2.36 msgsnd F
+GLIBC_2.36 msync F
+GLIBC_2.36 mtrace F
+GLIBC_2.36 mtx_destroy F
+GLIBC_2.36 mtx_init F
+GLIBC_2.36 mtx_lock F
+GLIBC_2.36 mtx_timedlock F
+GLIBC_2.36 mtx_trylock F
+GLIBC_2.36 mtx_unlock F
+GLIBC_2.36 munlock F
+GLIBC_2.36 munlockall F
+GLIBC_2.36 munmap F
+GLIBC_2.36 muntrace F
+GLIBC_2.36 name_to_handle_at F
+GLIBC_2.36 nanosleep F
+GLIBC_2.36 newlocale F
+GLIBC_2.36 nftw F
+GLIBC_2.36 nftw64 F
+GLIBC_2.36 ngettext F
+GLIBC_2.36 nice F
+GLIBC_2.36 nl_langinfo F
+GLIBC_2.36 nl_langinfo_l F
+GLIBC_2.36 nrand48 F
+GLIBC_2.36 nrand48_r F
+GLIBC_2.36 ns_name_compress F
+GLIBC_2.36 ns_name_ntop F
+GLIBC_2.36 ns_name_pack F
+GLIBC_2.36 ns_name_pton F
+GLIBC_2.36 ns_name_skip F
+GLIBC_2.36 ns_name_uncompress F
+GLIBC_2.36 ns_name_unpack F
+GLIBC_2.36 ntohl F
+GLIBC_2.36 ntohs F
+GLIBC_2.36 ntp_adjtime F
+GLIBC_2.36 ntp_gettime F
+GLIBC_2.36 ntp_gettimex F
+GLIBC_2.36 obstack_alloc_failed_handler D 0x8
+GLIBC_2.36 obstack_exit_failure D 0x4
+GLIBC_2.36 obstack_free F
+GLIBC_2.36 obstack_printf F
+GLIBC_2.36 obstack_vprintf F
+GLIBC_2.36 on_exit F
+GLIBC_2.36 open F
+GLIBC_2.36 open64 F
+GLIBC_2.36 open_by_handle_at F
+GLIBC_2.36 open_memstream F
+GLIBC_2.36 open_wmemstream F
+GLIBC_2.36 openat F
+GLIBC_2.36 openat64 F
+GLIBC_2.36 opendir F
+GLIBC_2.36 openlog F
+GLIBC_2.36 openpty F
+GLIBC_2.36 optarg D 0x8
+GLIBC_2.36 opterr D 0x4
+GLIBC_2.36 optind D 0x4
+GLIBC_2.36 optopt D 0x4
+GLIBC_2.36 parse_printf_format F
+GLIBC_2.36 pathconf F
+GLIBC_2.36 pause F
+GLIBC_2.36 pclose F
+GLIBC_2.36 perror F
+GLIBC_2.36 personality F
+GLIBC_2.36 pipe F
+GLIBC_2.36 pipe2 F
+GLIBC_2.36 pivot_root F
+GLIBC_2.36 pkey_alloc F
+GLIBC_2.36 pkey_free F
+GLIBC_2.36 pkey_get F
+GLIBC_2.36 pkey_mprotect F
+GLIBC_2.36 pkey_set F
+GLIBC_2.36 poll F
+GLIBC_2.36 popen F
+GLIBC_2.36 posix_fadvise F
+GLIBC_2.36 posix_fadvise64 F
+GLIBC_2.36 posix_fallocate F
+GLIBC_2.36 posix_fallocate64 F
+GLIBC_2.36 posix_madvise F
+GLIBC_2.36 posix_memalign F
+GLIBC_2.36 posix_openpt F
+GLIBC_2.36 posix_spawn F
+GLIBC_2.36 posix_spawn_file_actions_addchdir_np F
+GLIBC_2.36 posix_spawn_file_actions_addclose F
+GLIBC_2.36 posix_spawn_file_actions_addclosefrom_np F
+GLIBC_2.36 posix_spawn_file_actions_adddup2 F
+GLIBC_2.36 posix_spawn_file_actions_addfchdir_np F
+GLIBC_2.36 posix_spawn_file_actions_addopen F
+GLIBC_2.36 posix_spawn_file_actions_addtcsetpgrp_np F
+GLIBC_2.36 posix_spawn_file_actions_destroy F
+GLIBC_2.36 posix_spawn_file_actions_init F
+GLIBC_2.36 posix_spawnattr_destroy F
+GLIBC_2.36 posix_spawnattr_getflags F
+GLIBC_2.36 posix_spawnattr_getpgroup F
+GLIBC_2.36 posix_spawnattr_getschedparam F
+GLIBC_2.36 posix_spawnattr_getschedpolicy F
+GLIBC_2.36 posix_spawnattr_getsigdefault F
+GLIBC_2.36 posix_spawnattr_getsigmask F
+GLIBC_2.36 posix_spawnattr_init F
+GLIBC_2.36 posix_spawnattr_setflags F
+GLIBC_2.36 posix_spawnattr_setpgroup F
+GLIBC_2.36 posix_spawnattr_setschedparam F
+GLIBC_2.36 posix_spawnattr_setschedpolicy F
+GLIBC_2.36 posix_spawnattr_setsigdefault F
+GLIBC_2.36 posix_spawnattr_setsigmask F
+GLIBC_2.36 posix_spawnp F
+GLIBC_2.36 ppoll F
+GLIBC_2.36 prctl F
+GLIBC_2.36 pread F
+GLIBC_2.36 pread64 F
+GLIBC_2.36 preadv F
+GLIBC_2.36 preadv2 F
+GLIBC_2.36 preadv64 F
+GLIBC_2.36 preadv64v2 F
+GLIBC_2.36 printf F
+GLIBC_2.36 printf_size F
+GLIBC_2.36 printf_size_info F
+GLIBC_2.36 prlimit F
+GLIBC_2.36 prlimit64 F
+GLIBC_2.36 process_vm_readv F
+GLIBC_2.36 process_vm_writev F
+GLIBC_2.36 profil F
+GLIBC_2.36 program_invocation_name D 0x8
+GLIBC_2.36 program_invocation_short_name D 0x8
+GLIBC_2.36 pselect F
+GLIBC_2.36 psiginfo F
+GLIBC_2.36 psignal F
+GLIBC_2.36 pthread_attr_destroy F
+GLIBC_2.36 pthread_attr_getaffinity_np F
+GLIBC_2.36 pthread_attr_getdetachstate F
+GLIBC_2.36 pthread_attr_getguardsize F
+GLIBC_2.36 pthread_attr_getinheritsched F
+GLIBC_2.36 pthread_attr_getschedparam F
+GLIBC_2.36 pthread_attr_getschedpolicy F
+GLIBC_2.36 pthread_attr_getscope F
+GLIBC_2.36 pthread_attr_getsigmask_np F
+GLIBC_2.36 pthread_attr_getstack F
+GLIBC_2.36 pthread_attr_getstackaddr F
+GLIBC_2.36 pthread_attr_getstacksize F
+GLIBC_2.36 pthread_attr_init F
+GLIBC_2.36 pthread_attr_setaffinity_np F
+GLIBC_2.36 pthread_attr_setdetachstate F
+GLIBC_2.36 pthread_attr_setguardsize F
+GLIBC_2.36 pthread_attr_setinheritsched F
+GLIBC_2.36 pthread_attr_setschedparam F
+GLIBC_2.36 pthread_attr_setschedpolicy F
+GLIBC_2.36 pthread_attr_setscope F
+GLIBC_2.36 pthread_attr_setsigmask_np F
+GLIBC_2.36 pthread_attr_setstack F
+GLIBC_2.36 pthread_attr_setstackaddr F
+GLIBC_2.36 pthread_attr_setstacksize F
+GLIBC_2.36 pthread_barrier_destroy F
+GLIBC_2.36 pthread_barrier_init F
+GLIBC_2.36 pthread_barrier_wait F
+GLIBC_2.36 pthread_barrierattr_destroy F
+GLIBC_2.36 pthread_barrierattr_getpshared F
+GLIBC_2.36 pthread_barrierattr_init F
+GLIBC_2.36 pthread_barrierattr_setpshared F
+GLIBC_2.36 pthread_cancel F
+GLIBC_2.36 pthread_clockjoin_np F
+GLIBC_2.36 pthread_cond_broadcast F
+GLIBC_2.36 pthread_cond_clockwait F
+GLIBC_2.36 pthread_cond_destroy F
+GLIBC_2.36 pthread_cond_init F
+GLIBC_2.36 pthread_cond_signal F
+GLIBC_2.36 pthread_cond_timedwait F
+GLIBC_2.36 pthread_cond_wait F
+GLIBC_2.36 pthread_condattr_destroy F
+GLIBC_2.36 pthread_condattr_getclock F
+GLIBC_2.36 pthread_condattr_getpshared F
+GLIBC_2.36 pthread_condattr_init F
+GLIBC_2.36 pthread_condattr_setclock F
+GLIBC_2.36 pthread_condattr_setpshared F
+GLIBC_2.36 pthread_create F
+GLIBC_2.36 pthread_detach F
+GLIBC_2.36 pthread_equal F
+GLIBC_2.36 pthread_exit F
+GLIBC_2.36 pthread_getaffinity_np F
+GLIBC_2.36 pthread_getattr_default_np F
+GLIBC_2.36 pthread_getattr_np F
+GLIBC_2.36 pthread_getconcurrency F
+GLIBC_2.36 pthread_getcpuclockid F
+GLIBC_2.36 pthread_getname_np F
+GLIBC_2.36 pthread_getschedparam F
+GLIBC_2.36 pthread_getspecific F
+GLIBC_2.36 pthread_join F
+GLIBC_2.36 pthread_key_create F
+GLIBC_2.36 pthread_key_delete F
+GLIBC_2.36 pthread_kill F
+GLIBC_2.36 pthread_mutex_clocklock F
+GLIBC_2.36 pthread_mutex_consistent F
+GLIBC_2.36 pthread_mutex_destroy F
+GLIBC_2.36 pthread_mutex_getprioceiling F
+GLIBC_2.36 pthread_mutex_init F
+GLIBC_2.36 pthread_mutex_lock F
+GLIBC_2.36 pthread_mutex_setprioceiling F
+GLIBC_2.36 pthread_mutex_timedlock F
+GLIBC_2.36 pthread_mutex_trylock F
+GLIBC_2.36 pthread_mutex_unlock F
+GLIBC_2.36 pthread_mutexattr_destroy F
+GLIBC_2.36 pthread_mutexattr_getprioceiling F
+GLIBC_2.36 pthread_mutexattr_getprotocol F
+GLIBC_2.36 pthread_mutexattr_getpshared F
+GLIBC_2.36 pthread_mutexattr_getrobust F
+GLIBC_2.36 pthread_mutexattr_gettype F
+GLIBC_2.36 pthread_mutexattr_init F
+GLIBC_2.36 pthread_mutexattr_setprioceiling F
+GLIBC_2.36 pthread_mutexattr_setprotocol F
+GLIBC_2.36 pthread_mutexattr_setpshared F
+GLIBC_2.36 pthread_mutexattr_setrobust F
+GLIBC_2.36 pthread_mutexattr_settype F
+GLIBC_2.36 pthread_once F
+GLIBC_2.36 pthread_rwlock_clockrdlock F
+GLIBC_2.36 pthread_rwlock_clockwrlock F
+GLIBC_2.36 pthread_rwlock_destroy F
+GLIBC_2.36 pthread_rwlock_init F
+GLIBC_2.36 pthread_rwlock_rdlock F
+GLIBC_2.36 pthread_rwlock_timedrdlock F
+GLIBC_2.36 pthread_rwlock_timedwrlock F
+GLIBC_2.36 pthread_rwlock_tryrdlock F
+GLIBC_2.36 pthread_rwlock_trywrlock F
+GLIBC_2.36 pthread_rwlock_unlock F
+GLIBC_2.36 pthread_rwlock_wrlock F
+GLIBC_2.36 pthread_rwlockattr_destroy F
+GLIBC_2.36 pthread_rwlockattr_getkind_np F
+GLIBC_2.36 pthread_rwlockattr_getpshared F
+GLIBC_2.36 pthread_rwlockattr_init F
+GLIBC_2.36 pthread_rwlockattr_setkind_np F
+GLIBC_2.36 pthread_rwlockattr_setpshared F
+GLIBC_2.36 pthread_self F
+GLIBC_2.36 pthread_setaffinity_np F
+GLIBC_2.36 pthread_setattr_default_np F
+GLIBC_2.36 pthread_setcancelstate F
+GLIBC_2.36 pthread_setcanceltype F
+GLIBC_2.36 pthread_setconcurrency F
+GLIBC_2.36 pthread_setname_np F
+GLIBC_2.36 pthread_setschedparam F
+GLIBC_2.36 pthread_setschedprio F
+GLIBC_2.36 pthread_setspecific F
+GLIBC_2.36 pthread_sigmask F
+GLIBC_2.36 pthread_sigqueue F
+GLIBC_2.36 pthread_spin_destroy F
+GLIBC_2.36 pthread_spin_init F
+GLIBC_2.36 pthread_spin_lock F
+GLIBC_2.36 pthread_spin_trylock F
+GLIBC_2.36 pthread_spin_unlock F
+GLIBC_2.36 pthread_testcancel F
+GLIBC_2.36 pthread_timedjoin_np F
+GLIBC_2.36 pthread_tryjoin_np F
+GLIBC_2.36 ptrace F
+GLIBC_2.36 ptsname F
+GLIBC_2.36 ptsname_r F
+GLIBC_2.36 putc F
+GLIBC_2.36 putc_unlocked F
+GLIBC_2.36 putchar F
+GLIBC_2.36 putchar_unlocked F
+GLIBC_2.36 putenv F
+GLIBC_2.36 putgrent F
+GLIBC_2.36 putpwent F
+GLIBC_2.36 puts F
+GLIBC_2.36 putsgent F
+GLIBC_2.36 putspent F
+GLIBC_2.36 pututline F
+GLIBC_2.36 pututxline F
+GLIBC_2.36 putw F
+GLIBC_2.36 putwc F
+GLIBC_2.36 putwc_unlocked F
+GLIBC_2.36 putwchar F
+GLIBC_2.36 putwchar_unlocked F
+GLIBC_2.36 pvalloc F
+GLIBC_2.36 pwrite F
+GLIBC_2.36 pwrite64 F
+GLIBC_2.36 pwritev F
+GLIBC_2.36 pwritev2 F
+GLIBC_2.36 pwritev64 F
+GLIBC_2.36 pwritev64v2 F
+GLIBC_2.36 qecvt F
+GLIBC_2.36 qecvt_r F
+GLIBC_2.36 qfcvt F
+GLIBC_2.36 qfcvt_r F
+GLIBC_2.36 qgcvt F
+GLIBC_2.36 qsort F
+GLIBC_2.36 qsort_r F
+GLIBC_2.36 quick_exit F
+GLIBC_2.36 quotactl F
+GLIBC_2.36 raise F
+GLIBC_2.36 rand F
+GLIBC_2.36 rand_r F
+GLIBC_2.36 random F
+GLIBC_2.36 random_r F
+GLIBC_2.36 rawmemchr F
+GLIBC_2.36 rcmd F
+GLIBC_2.36 rcmd_af F
+GLIBC_2.36 re_comp F
+GLIBC_2.36 re_compile_fastmap F
+GLIBC_2.36 re_compile_pattern F
+GLIBC_2.36 re_exec F
+GLIBC_2.36 re_match F
+GLIBC_2.36 re_match_2 F
+GLIBC_2.36 re_search F
+GLIBC_2.36 re_search_2 F
+GLIBC_2.36 re_set_registers F
+GLIBC_2.36 re_set_syntax F
+GLIBC_2.36 re_syntax_options D 0x8
+GLIBC_2.36 read F
+GLIBC_2.36 readahead F
+GLIBC_2.36 readdir F
+GLIBC_2.36 readdir64 F
+GLIBC_2.36 readdir64_r F
+GLIBC_2.36 readdir_r F
+GLIBC_2.36 readlink F
+GLIBC_2.36 readlinkat F
+GLIBC_2.36 readv F
+GLIBC_2.36 realloc F
+GLIBC_2.36 reallocarray F
+GLIBC_2.36 realpath F
+GLIBC_2.36 reboot F
+GLIBC_2.36 recv F
+GLIBC_2.36 recvfrom F
+GLIBC_2.36 recvmmsg F
+GLIBC_2.36 recvmsg F
+GLIBC_2.36 regcomp F
+GLIBC_2.36 regerror F
+GLIBC_2.36 regexec F
+GLIBC_2.36 regfree F
+GLIBC_2.36 register_printf_function F
+GLIBC_2.36 register_printf_modifier F
+GLIBC_2.36 register_printf_specifier F
+GLIBC_2.36 register_printf_type F
+GLIBC_2.36 remap_file_pages F
+GLIBC_2.36 remove F
+GLIBC_2.36 removexattr F
+GLIBC_2.36 remque F
+GLIBC_2.36 rename F
+GLIBC_2.36 renameat F
+GLIBC_2.36 renameat2 F
+GLIBC_2.36 res_dnok F
+GLIBC_2.36 res_hnok F
+GLIBC_2.36 res_mailok F
+GLIBC_2.36 res_mkquery F
+GLIBC_2.36 res_nmkquery F
+GLIBC_2.36 res_nquery F
+GLIBC_2.36 res_nquerydomain F
+GLIBC_2.36 res_nsearch F
+GLIBC_2.36 res_nsend F
+GLIBC_2.36 res_ownok F
+GLIBC_2.36 res_query F
+GLIBC_2.36 res_querydomain F
+GLIBC_2.36 res_search F
+GLIBC_2.36 res_send F
+GLIBC_2.36 revoke F
+GLIBC_2.36 rewind F
+GLIBC_2.36 rewinddir F
+GLIBC_2.36 rexec F
+GLIBC_2.36 rexec_af F
+GLIBC_2.36 rexecoptions D 0x4
+GLIBC_2.36 rindex F
+GLIBC_2.36 rmdir F
+GLIBC_2.36 rpmatch F
+GLIBC_2.36 rresvport F
+GLIBC_2.36 rresvport_af F
+GLIBC_2.36 ruserok F
+GLIBC_2.36 ruserok_af F
+GLIBC_2.36 ruserpass F
+GLIBC_2.36 sbrk F
+GLIBC_2.36 scalbn F
+GLIBC_2.36 scalbnf F
+GLIBC_2.36 scalbnl F
+GLIBC_2.36 scandir F
+GLIBC_2.36 scandir64 F
+GLIBC_2.36 scandirat F
+GLIBC_2.36 scandirat64 F
+GLIBC_2.36 scanf F
+GLIBC_2.36 sched_get_priority_max F
+GLIBC_2.36 sched_get_priority_min F
+GLIBC_2.36 sched_getaffinity F
+GLIBC_2.36 sched_getcpu F
+GLIBC_2.36 sched_getparam F
+GLIBC_2.36 sched_getscheduler F
+GLIBC_2.36 sched_rr_get_interval F
+GLIBC_2.36 sched_setaffinity F
+GLIBC_2.36 sched_setparam F
+GLIBC_2.36 sched_setscheduler F
+GLIBC_2.36 sched_yield F
+GLIBC_2.36 secure_getenv F
+GLIBC_2.36 seed48 F
+GLIBC_2.36 seed48_r F
+GLIBC_2.36 seekdir F
+GLIBC_2.36 select F
+GLIBC_2.36 sem_clockwait F
+GLIBC_2.36 sem_close F
+GLIBC_2.36 sem_destroy F
+GLIBC_2.36 sem_getvalue F
+GLIBC_2.36 sem_init F
+GLIBC_2.36 sem_open F
+GLIBC_2.36 sem_post F
+GLIBC_2.36 sem_timedwait F
+GLIBC_2.36 sem_trywait F
+GLIBC_2.36 sem_unlink F
+GLIBC_2.36 sem_wait F
+GLIBC_2.36 semctl F
+GLIBC_2.36 semget F
+GLIBC_2.36 semop F
+GLIBC_2.36 semtimedop F
+GLIBC_2.36 send F
+GLIBC_2.36 sendfile F
+GLIBC_2.36 sendfile64 F
+GLIBC_2.36 sendmmsg F
+GLIBC_2.36 sendmsg F
+GLIBC_2.36 sendto F
+GLIBC_2.36 setaliasent F
+GLIBC_2.36 setbuf F
+GLIBC_2.36 setbuffer F
+GLIBC_2.36 setcontext F
+GLIBC_2.36 setdomainname F
+GLIBC_2.36 setegid F
+GLIBC_2.36 setenv F
+GLIBC_2.36 seteuid F
+GLIBC_2.36 setfsent F
+GLIBC_2.36 setfsgid F
+GLIBC_2.36 setfsuid F
+GLIBC_2.36 setgid F
+GLIBC_2.36 setgrent F
+GLIBC_2.36 setgroups F
+GLIBC_2.36 sethostent F
+GLIBC_2.36 sethostid F
+GLIBC_2.36 sethostname F
+GLIBC_2.36 setipv4sourcefilter F
+GLIBC_2.36 setitimer F
+GLIBC_2.36 setjmp F
+GLIBC_2.36 setlinebuf F
+GLIBC_2.36 setlocale F
+GLIBC_2.36 setlogin F
+GLIBC_2.36 setlogmask F
+GLIBC_2.36 setmntent F
+GLIBC_2.36 setnetent F
+GLIBC_2.36 setnetgrent F
+GLIBC_2.36 setns F
+GLIBC_2.36 setpgid F
+GLIBC_2.36 setpgrp F
+GLIBC_2.36 setpriority F
+GLIBC_2.36 setprotoent F
+GLIBC_2.36 setpwent F
+GLIBC_2.36 setregid F
+GLIBC_2.36 setresgid F
+GLIBC_2.36 setresuid F
+GLIBC_2.36 setreuid F
+GLIBC_2.36 setrlimit F
+GLIBC_2.36 setrlimit64 F
+GLIBC_2.36 setrpcent F
+GLIBC_2.36 setservent F
+GLIBC_2.36 setsgent F
+GLIBC_2.36 setsid F
+GLIBC_2.36 setsockopt F
+GLIBC_2.36 setsourcefilter F
+GLIBC_2.36 setspent F
+GLIBC_2.36 setstate F
+GLIBC_2.36 setstate_r F
+GLIBC_2.36 settimeofday F
+GLIBC_2.36 setttyent F
+GLIBC_2.36 setuid F
+GLIBC_2.36 setusershell F
+GLIBC_2.36 setutent F
+GLIBC_2.36 setutxent F
+GLIBC_2.36 setvbuf F
+GLIBC_2.36 setxattr F
+GLIBC_2.36 sgetsgent F
+GLIBC_2.36 sgetsgent_r F
+GLIBC_2.36 sgetspent F
+GLIBC_2.36 sgetspent_r F
+GLIBC_2.36 shm_open F
+GLIBC_2.36 shm_unlink F
+GLIBC_2.36 shmat F
+GLIBC_2.36 shmctl F
+GLIBC_2.36 shmdt F
+GLIBC_2.36 shmget F
+GLIBC_2.36 shutdown F
+GLIBC_2.36 sigabbrev_np F
+GLIBC_2.36 sigaction F
+GLIBC_2.36 sigaddset F
+GLIBC_2.36 sigaltstack F
+GLIBC_2.36 sigandset F
+GLIBC_2.36 sigblock F
+GLIBC_2.36 sigdelset F
+GLIBC_2.36 sigdescr_np F
+GLIBC_2.36 sigemptyset F
+GLIBC_2.36 sigfillset F
+GLIBC_2.36 siggetmask F
+GLIBC_2.36 sighold F
+GLIBC_2.36 sigignore F
+GLIBC_2.36 siginterrupt F
+GLIBC_2.36 sigisemptyset F
+GLIBC_2.36 sigismember F
+GLIBC_2.36 siglongjmp F
+GLIBC_2.36 signal F
+GLIBC_2.36 signalfd F
+GLIBC_2.36 sigorset F
+GLIBC_2.36 sigpause F
+GLIBC_2.36 sigpending F
+GLIBC_2.36 sigprocmask F
+GLIBC_2.36 sigqueue F
+GLIBC_2.36 sigrelse F
+GLIBC_2.36 sigreturn F
+GLIBC_2.36 sigset F
+GLIBC_2.36 sigsetmask F
+GLIBC_2.36 sigstack F
+GLIBC_2.36 sigsuspend F
+GLIBC_2.36 sigtimedwait F
+GLIBC_2.36 sigwait F
+GLIBC_2.36 sigwaitinfo F
+GLIBC_2.36 sleep F
+GLIBC_2.36 snprintf F
+GLIBC_2.36 sockatmark F
+GLIBC_2.36 socket F
+GLIBC_2.36 socketpair F
+GLIBC_2.36 splice F
+GLIBC_2.36 sprintf F
+GLIBC_2.36 sprofil F
+GLIBC_2.36 srand F
+GLIBC_2.36 srand48 F
+GLIBC_2.36 srand48_r F
+GLIBC_2.36 srandom F
+GLIBC_2.36 srandom_r F
+GLIBC_2.36 sscanf F
+GLIBC_2.36 ssignal F
+GLIBC_2.36 stat F
+GLIBC_2.36 stat64 F
+GLIBC_2.36 statfs F
+GLIBC_2.36 statfs64 F
+GLIBC_2.36 statvfs F
+GLIBC_2.36 statvfs64 F
+GLIBC_2.36 statx F
+GLIBC_2.36 stderr D 0x8
+GLIBC_2.36 stdin D 0x8
+GLIBC_2.36 stdout D 0x8
+GLIBC_2.36 stpcpy F
+GLIBC_2.36 stpncpy F
+GLIBC_2.36 strcasecmp F
+GLIBC_2.36 strcasecmp_l F
+GLIBC_2.36 strcasestr F
+GLIBC_2.36 strcat F
+GLIBC_2.36 strchr F
+GLIBC_2.36 strchrnul F
+GLIBC_2.36 strcmp F
+GLIBC_2.36 strcoll F
+GLIBC_2.36 strcoll_l F
+GLIBC_2.36 strcpy F
+GLIBC_2.36 strcspn F
+GLIBC_2.36 strdup F
+GLIBC_2.36 strerror F
+GLIBC_2.36 strerror_l F
+GLIBC_2.36 strerror_r F
+GLIBC_2.36 strerrordesc_np F
+GLIBC_2.36 strerrorname_np F
+GLIBC_2.36 strfmon F
+GLIBC_2.36 strfmon_l F
+GLIBC_2.36 strfromd F
+GLIBC_2.36 strfromf F
+GLIBC_2.36 strfromf128 F
+GLIBC_2.36 strfromf32 F
+GLIBC_2.36 strfromf32x F
+GLIBC_2.36 strfromf64 F
+GLIBC_2.36 strfromf64x F
+GLIBC_2.36 strfroml F
+GLIBC_2.36 strfry F
+GLIBC_2.36 strftime F
+GLIBC_2.36 strftime_l F
+GLIBC_2.36 strlen F
+GLIBC_2.36 strncasecmp F
+GLIBC_2.36 strncasecmp_l F
+GLIBC_2.36 strncat F
+GLIBC_2.36 strncmp F
+GLIBC_2.36 strncpy F
+GLIBC_2.36 strndup F
+GLIBC_2.36 strnlen F
+GLIBC_2.36 strpbrk F
+GLIBC_2.36 strptime F
+GLIBC_2.36 strptime_l F
+GLIBC_2.36 strrchr F
+GLIBC_2.36 strsep F
+GLIBC_2.36 strsignal F
+GLIBC_2.36 strspn F
+GLIBC_2.36 strstr F
+GLIBC_2.36 strtod F
+GLIBC_2.36 strtod_l F
+GLIBC_2.36 strtof F
+GLIBC_2.36 strtof128 F
+GLIBC_2.36 strtof128_l F
+GLIBC_2.36 strtof32 F
+GLIBC_2.36 strtof32_l F
+GLIBC_2.36 strtof32x F
+GLIBC_2.36 strtof32x_l F
+GLIBC_2.36 strtof64 F
+GLIBC_2.36 strtof64_l F
+GLIBC_2.36 strtof64x F
+GLIBC_2.36 strtof64x_l F
+GLIBC_2.36 strtof_l F
+GLIBC_2.36 strtoimax F
+GLIBC_2.36 strtok F
+GLIBC_2.36 strtok_r F
+GLIBC_2.36 strtol F
+GLIBC_2.36 strtol_l F
+GLIBC_2.36 strtold F
+GLIBC_2.36 strtold_l F
+GLIBC_2.36 strtoll F
+GLIBC_2.36 strtoll_l F
+GLIBC_2.36 strtoq F
+GLIBC_2.36 strtoul F
+GLIBC_2.36 strtoul_l F
+GLIBC_2.36 strtoull F
+GLIBC_2.36 strtoull_l F
+GLIBC_2.36 strtoumax F
+GLIBC_2.36 strtouq F
+GLIBC_2.36 strverscmp F
+GLIBC_2.36 strxfrm F
+GLIBC_2.36 strxfrm_l F
+GLIBC_2.36 stty F
+GLIBC_2.36 swab F
+GLIBC_2.36 swapcontext F
+GLIBC_2.36 swapoff F
+GLIBC_2.36 swapon F
+GLIBC_2.36 swprintf F
+GLIBC_2.36 swscanf F
+GLIBC_2.36 symlink F
+GLIBC_2.36 symlinkat F
+GLIBC_2.36 sync F
+GLIBC_2.36 sync_file_range F
+GLIBC_2.36 syncfs F
+GLIBC_2.36 syscall F
+GLIBC_2.36 sysconf F
+GLIBC_2.36 sysinfo F
+GLIBC_2.36 syslog F
+GLIBC_2.36 system F
+GLIBC_2.36 sysv_signal F
+GLIBC_2.36 tcdrain F
+GLIBC_2.36 tcflow F
+GLIBC_2.36 tcflush F
+GLIBC_2.36 tcgetattr F
+GLIBC_2.36 tcgetpgrp F
+GLIBC_2.36 tcgetsid F
+GLIBC_2.36 tcsendbreak F
+GLIBC_2.36 tcsetattr F
+GLIBC_2.36 tcsetpgrp F
+GLIBC_2.36 tdelete F
+GLIBC_2.36 tdestroy F
+GLIBC_2.36 tee F
+GLIBC_2.36 telldir F
+GLIBC_2.36 tempnam F
+GLIBC_2.36 textdomain F
+GLIBC_2.36 tfind F
+GLIBC_2.36 tgkill F
+GLIBC_2.36 thrd_create F
+GLIBC_2.36 thrd_current F
+GLIBC_2.36 thrd_detach F
+GLIBC_2.36 thrd_equal F
+GLIBC_2.36 thrd_exit F
+GLIBC_2.36 thrd_join F
+GLIBC_2.36 thrd_sleep F
+GLIBC_2.36 thrd_yield F
+GLIBC_2.36 time F
+GLIBC_2.36 timegm F
+GLIBC_2.36 timelocal F
+GLIBC_2.36 timer_create F
+GLIBC_2.36 timer_delete F
+GLIBC_2.36 timer_getoverrun F
+GLIBC_2.36 timer_gettime F
+GLIBC_2.36 timer_settime F
+GLIBC_2.36 timerfd_create F
+GLIBC_2.36 timerfd_gettime F
+GLIBC_2.36 timerfd_settime F
+GLIBC_2.36 times F
+GLIBC_2.36 timespec_get F
+GLIBC_2.36 timespec_getres F
+GLIBC_2.36 timezone D 0x8
+GLIBC_2.36 tmpfile F
+GLIBC_2.36 tmpfile64 F
+GLIBC_2.36 tmpnam F
+GLIBC_2.36 tmpnam_r F
+GLIBC_2.36 toascii F
+GLIBC_2.36 tolower F
+GLIBC_2.36 tolower_l F
+GLIBC_2.36 toupper F
+GLIBC_2.36 toupper_l F
+GLIBC_2.36 towctrans F
+GLIBC_2.36 towctrans_l F
+GLIBC_2.36 towlower F
+GLIBC_2.36 towlower_l F
+GLIBC_2.36 towupper F
+GLIBC_2.36 towupper_l F
+GLIBC_2.36 truncate F
+GLIBC_2.36 truncate64 F
+GLIBC_2.36 tsearch F
+GLIBC_2.36 tss_create F
+GLIBC_2.36 tss_delete F
+GLIBC_2.36 tss_get F
+GLIBC_2.36 tss_set F
+GLIBC_2.36 ttyname F
+GLIBC_2.36 ttyname_r F
+GLIBC_2.36 ttyslot F
+GLIBC_2.36 twalk F
+GLIBC_2.36 twalk_r F
+GLIBC_2.36 tzname D 0x10
+GLIBC_2.36 tzset F
+GLIBC_2.36 ualarm F
+GLIBC_2.36 ulckpwdf F
+GLIBC_2.36 ulimit F
+GLIBC_2.36 umask F
+GLIBC_2.36 umount F
+GLIBC_2.36 umount2 F
+GLIBC_2.36 uname F
+GLIBC_2.36 ungetc F
+GLIBC_2.36 ungetwc F
+GLIBC_2.36 unlink F
+GLIBC_2.36 unlinkat F
+GLIBC_2.36 unlockpt F
+GLIBC_2.36 unsetenv F
+GLIBC_2.36 unshare F
+GLIBC_2.36 updwtmp F
+GLIBC_2.36 updwtmpx F
+GLIBC_2.36 uselocale F
+GLIBC_2.36 usleep F
+GLIBC_2.36 utime F
+GLIBC_2.36 utimensat F
+GLIBC_2.36 utimes F
+GLIBC_2.36 utmpname F
+GLIBC_2.36 utmpxname F
+GLIBC_2.36 valloc F
+GLIBC_2.36 vasprintf F
+GLIBC_2.36 vdprintf F
+GLIBC_2.36 verr F
+GLIBC_2.36 verrx F
+GLIBC_2.36 versionsort F
+GLIBC_2.36 versionsort64 F
+GLIBC_2.36 vfork F
+GLIBC_2.36 vfprintf F
+GLIBC_2.36 vfscanf F
+GLIBC_2.36 vfwprintf F
+GLIBC_2.36 vfwscanf F
+GLIBC_2.36 vhangup F
+GLIBC_2.36 vlimit F
+GLIBC_2.36 vmsplice F
+GLIBC_2.36 vprintf F
+GLIBC_2.36 vscanf F
+GLIBC_2.36 vsnprintf F
+GLIBC_2.36 vsprintf F
+GLIBC_2.36 vsscanf F
+GLIBC_2.36 vswprintf F
+GLIBC_2.36 vswscanf F
+GLIBC_2.36 vsyslog F
+GLIBC_2.36 vwarn F
+GLIBC_2.36 vwarnx F
+GLIBC_2.36 vwprintf F
+GLIBC_2.36 vwscanf F
+GLIBC_2.36 wait F
+GLIBC_2.36 wait3 F
+GLIBC_2.36 wait4 F
+GLIBC_2.36 waitid F
+GLIBC_2.36 waitpid F
+GLIBC_2.36 warn F
+GLIBC_2.36 warnx F
+GLIBC_2.36 wcpcpy F
+GLIBC_2.36 wcpncpy F
+GLIBC_2.36 wcrtomb F
+GLIBC_2.36 wcscasecmp F
+GLIBC_2.36 wcscasecmp_l F
+GLIBC_2.36 wcscat F
+GLIBC_2.36 wcschr F
+GLIBC_2.36 wcschrnul F
+GLIBC_2.36 wcscmp F
+GLIBC_2.36 wcscoll F
+GLIBC_2.36 wcscoll_l F
+GLIBC_2.36 wcscpy F
+GLIBC_2.36 wcscspn F
+GLIBC_2.36 wcsdup F
+GLIBC_2.36 wcsftime F
+GLIBC_2.36 wcsftime_l F
+GLIBC_2.36 wcslen F
+GLIBC_2.36 wcsncasecmp F
+GLIBC_2.36 wcsncasecmp_l F
+GLIBC_2.36 wcsncat F
+GLIBC_2.36 wcsncmp F
+GLIBC_2.36 wcsncpy F
+GLIBC_2.36 wcsnlen F
+GLIBC_2.36 wcsnrtombs F
+GLIBC_2.36 wcspbrk F
+GLIBC_2.36 wcsrchr F
+GLIBC_2.36 wcsrtombs F
+GLIBC_2.36 wcsspn F
+GLIBC_2.36 wcsstr F
+GLIBC_2.36 wcstod F
+GLIBC_2.36 wcstod_l F
+GLIBC_2.36 wcstof F
+GLIBC_2.36 wcstof128 F
+GLIBC_2.36 wcstof128_l F
+GLIBC_2.36 wcstof32 F
+GLIBC_2.36 wcstof32_l F
+GLIBC_2.36 wcstof32x F
+GLIBC_2.36 wcstof32x_l F
+GLIBC_2.36 wcstof64 F
+GLIBC_2.36 wcstof64_l F
+GLIBC_2.36 wcstof64x F
+GLIBC_2.36 wcstof64x_l F
+GLIBC_2.36 wcstof_l F
+GLIBC_2.36 wcstoimax F
+GLIBC_2.36 wcstok F
+GLIBC_2.36 wcstol F
+GLIBC_2.36 wcstol_l F
+GLIBC_2.36 wcstold F
+GLIBC_2.36 wcstold_l F
+GLIBC_2.36 wcstoll F
+GLIBC_2.36 wcstoll_l F
+GLIBC_2.36 wcstombs F
+GLIBC_2.36 wcstoq F
+GLIBC_2.36 wcstoul F
+GLIBC_2.36 wcstoul_l F
+GLIBC_2.36 wcstoull F
+GLIBC_2.36 wcstoull_l F
+GLIBC_2.36 wcstoumax F
+GLIBC_2.36 wcstouq F
+GLIBC_2.36 wcswcs F
+GLIBC_2.36 wcswidth F
+GLIBC_2.36 wcsxfrm F
+GLIBC_2.36 wcsxfrm_l F
+GLIBC_2.36 wctob F
+GLIBC_2.36 wctomb F
+GLIBC_2.36 wctrans F
+GLIBC_2.36 wctrans_l F
+GLIBC_2.36 wctype F
+GLIBC_2.36 wctype_l F
+GLIBC_2.36 wcwidth F
+GLIBC_2.36 wmemchr F
+GLIBC_2.36 wmemcmp F
+GLIBC_2.36 wmemcpy F
+GLIBC_2.36 wmemmove F
+GLIBC_2.36 wmempcpy F
+GLIBC_2.36 wmemset F
+GLIBC_2.36 wordexp F
+GLIBC_2.36 wordfree F
+GLIBC_2.36 wprintf F
+GLIBC_2.36 write F
+GLIBC_2.36 writev F
+GLIBC_2.36 wscanf F
diff --git a/sysdeps/unix/sysv/linux/loongarch/lp64/libc_malloc_debug.abilist b/sysdeps/unix/sysv/linux/loongarch/lp64/libc_malloc_debug.abilist
new file mode 100644
index 0000000000..6ddfd162b3
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/loongarch/lp64/libc_malloc_debug.abilist
@@ -0,0 +1,26 @@
+GLIBC_2.36 __free_hook D 0x8
+GLIBC_2.36 __malloc_hook D 0x8
+GLIBC_2.36 __memalign_hook D 0x8
+GLIBC_2.36 __realloc_hook D 0x8
+GLIBC_2.36 aligned_alloc F
+GLIBC_2.36 calloc F
+GLIBC_2.36 free F
+GLIBC_2.36 mallinfo F
+GLIBC_2.36 mallinfo2 F
+GLIBC_2.36 malloc F
+GLIBC_2.36 malloc_info F
+GLIBC_2.36 malloc_stats F
+GLIBC_2.36 malloc_trim F
+GLIBC_2.36 malloc_usable_size F
+GLIBC_2.36 mallopt F
+GLIBC_2.36 mcheck F
+GLIBC_2.36 mcheck_check_all F
+GLIBC_2.36 mcheck_pedantic F
+GLIBC_2.36 memalign F
+GLIBC_2.36 mprobe F
+GLIBC_2.36 mtrace F
+GLIBC_2.36 muntrace F
+GLIBC_2.36 posix_memalign F
+GLIBC_2.36 pvalloc F
+GLIBC_2.36 realloc F
+GLIBC_2.36 valloc F
diff --git a/sysdeps/unix/sysv/linux/loongarch/lp64/libcrypt.abilist b/sysdeps/unix/sysv/linux/loongarch/lp64/libcrypt.abilist
new file mode 100644
index 0000000000..4d4332dab7
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/loongarch/lp64/libcrypt.abilist
@@ -0,0 +1,2 @@
+GLIBC_2.36 crypt F
+GLIBC_2.36 crypt_r F
diff --git a/sysdeps/unix/sysv/linux/loongarch/lp64/libm.abilist b/sysdeps/unix/sysv/linux/loongarch/lp64/libm.abilist
new file mode 100644
index 0000000000..6ddb86edef
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/loongarch/lp64/libm.abilist
@@ -0,0 +1,1031 @@
+GLIBC_2.36 __clog10 F
+GLIBC_2.36 __clog10f F
+GLIBC_2.36 __clog10l F
+GLIBC_2.36 __finite F
+GLIBC_2.36 __finitef F
+GLIBC_2.36 __finitel F
+GLIBC_2.36 __fpclassify F
+GLIBC_2.36 __fpclassifyf F
+GLIBC_2.36 __fpclassifyl F
+GLIBC_2.36 __iseqsig F
+GLIBC_2.36 __iseqsigf F
+GLIBC_2.36 __iseqsigl F
+GLIBC_2.36 __issignaling F
+GLIBC_2.36 __issignalingf F
+GLIBC_2.36 __issignalingl F
+GLIBC_2.36 __signbit F
+GLIBC_2.36 __signbitf F
+GLIBC_2.36 __signbitl F
+GLIBC_2.36 __signgam D 0x4
+GLIBC_2.36 __sqrtl_finite F
+GLIBC_2.36 acos F
+GLIBC_2.36 acosf F
+GLIBC_2.36 acosf128 F
+GLIBC_2.36 acosf32 F
+GLIBC_2.36 acosf32x F
+GLIBC_2.36 acosf64 F
+GLIBC_2.36 acosf64x F
+GLIBC_2.36 acosh F
+GLIBC_2.36 acoshf F
+GLIBC_2.36 acoshf128 F
+GLIBC_2.36 acoshf32 F
+GLIBC_2.36 acoshf32x F
+GLIBC_2.36 acoshf64 F
+GLIBC_2.36 acoshf64x F
+GLIBC_2.36 acoshl F
+GLIBC_2.36 acosl F
+GLIBC_2.36 asin F
+GLIBC_2.36 asinf F
+GLIBC_2.36 asinf128 F
+GLIBC_2.36 asinf32 F
+GLIBC_2.36 asinf32x F
+GLIBC_2.36 asinf64 F
+GLIBC_2.36 asinf64x F
+GLIBC_2.36 asinh F
+GLIBC_2.36 asinhf F
+GLIBC_2.36 asinhf128 F
+GLIBC_2.36 asinhf32 F
+GLIBC_2.36 asinhf32x F
+GLIBC_2.36 asinhf64 F
+GLIBC_2.36 asinhf64x F
+GLIBC_2.36 asinhl F
+GLIBC_2.36 asinl F
+GLIBC_2.36 atan F
+GLIBC_2.36 atan2 F
+GLIBC_2.36 atan2f F
+GLIBC_2.36 atan2f128 F
+GLIBC_2.36 atan2f32 F
+GLIBC_2.36 atan2f32x F
+GLIBC_2.36 atan2f64 F
+GLIBC_2.36 atan2f64x F
+GLIBC_2.36 atan2l F
+GLIBC_2.36 atanf F
+GLIBC_2.36 atanf128 F
+GLIBC_2.36 atanf32 F
+GLIBC_2.36 atanf32x F
+GLIBC_2.36 atanf64 F
+GLIBC_2.36 atanf64x F
+GLIBC_2.36 atanh F
+GLIBC_2.36 atanhf F
+GLIBC_2.36 atanhf128 F
+GLIBC_2.36 atanhf32 F
+GLIBC_2.36 atanhf32x F
+GLIBC_2.36 atanhf64 F
+GLIBC_2.36 atanhf64x F
+GLIBC_2.36 atanhl F
+GLIBC_2.36 atanl F
+GLIBC_2.36 cabs F
+GLIBC_2.36 cabsf F
+GLIBC_2.36 cabsf128 F
+GLIBC_2.36 cabsf32 F
+GLIBC_2.36 cabsf32x F
+GLIBC_2.36 cabsf64 F
+GLIBC_2.36 cabsf64x F
+GLIBC_2.36 cabsl F
+GLIBC_2.36 cacos F
+GLIBC_2.36 cacosf F
+GLIBC_2.36 cacosf128 F
+GLIBC_2.36 cacosf32 F
+GLIBC_2.36 cacosf32x F
+GLIBC_2.36 cacosf64 F
+GLIBC_2.36 cacosf64x F
+GLIBC_2.36 cacosh F
+GLIBC_2.36 cacoshf F
+GLIBC_2.36 cacoshf128 F
+GLIBC_2.36 cacoshf32 F
+GLIBC_2.36 cacoshf32x F
+GLIBC_2.36 cacoshf64 F
+GLIBC_2.36 cacoshf64x F
+GLIBC_2.36 cacoshl F
+GLIBC_2.36 cacosl F
+GLIBC_2.36 canonicalize F
+GLIBC_2.36 canonicalizef F
+GLIBC_2.36 canonicalizef128 F
+GLIBC_2.36 canonicalizef32 F
+GLIBC_2.36 canonicalizef32x F
+GLIBC_2.36 canonicalizef64 F
+GLIBC_2.36 canonicalizef64x F
+GLIBC_2.36 canonicalizel F
+GLIBC_2.36 carg F
+GLIBC_2.36 cargf F
+GLIBC_2.36 cargf128 F
+GLIBC_2.36 cargf32 F
+GLIBC_2.36 cargf32x F
+GLIBC_2.36 cargf64 F
+GLIBC_2.36 cargf64x F
+GLIBC_2.36 cargl F
+GLIBC_2.36 casin F
+GLIBC_2.36 casinf F
+GLIBC_2.36 casinf128 F
+GLIBC_2.36 casinf32 F
+GLIBC_2.36 casinf32x F
+GLIBC_2.36 casinf64 F
+GLIBC_2.36 casinf64x F
+GLIBC_2.36 casinh F
+GLIBC_2.36 casinhf F
+GLIBC_2.36 casinhf128 F
+GLIBC_2.36 casinhf32 F
+GLIBC_2.36 casinhf32x F
+GLIBC_2.36 casinhf64 F
+GLIBC_2.36 casinhf64x F
+GLIBC_2.36 casinhl F
+GLIBC_2.36 casinl F
+GLIBC_2.36 catan F
+GLIBC_2.36 catanf F
+GLIBC_2.36 catanf128 F
+GLIBC_2.36 catanf32 F
+GLIBC_2.36 catanf32x F
+GLIBC_2.36 catanf64 F
+GLIBC_2.36 catanf64x F
+GLIBC_2.36 catanh F
+GLIBC_2.36 catanhf F
+GLIBC_2.36 catanhf128 F
+GLIBC_2.36 catanhf32 F
+GLIBC_2.36 catanhf32x F
+GLIBC_2.36 catanhf64 F
+GLIBC_2.36 catanhf64x F
+GLIBC_2.36 catanhl F
+GLIBC_2.36 catanl F
+GLIBC_2.36 cbrt F
+GLIBC_2.36 cbrtf F
+GLIBC_2.36 cbrtf128 F
+GLIBC_2.36 cbrtf32 F
+GLIBC_2.36 cbrtf32x F
+GLIBC_2.36 cbrtf64 F
+GLIBC_2.36 cbrtf64x F
+GLIBC_2.36 cbrtl F
+GLIBC_2.36 ccos F
+GLIBC_2.36 ccosf F
+GLIBC_2.36 ccosf128 F
+GLIBC_2.36 ccosf32 F
+GLIBC_2.36 ccosf32x F
+GLIBC_2.36 ccosf64 F
+GLIBC_2.36 ccosf64x F
+GLIBC_2.36 ccosh F
+GLIBC_2.36 ccoshf F
+GLIBC_2.36 ccoshf128 F
+GLIBC_2.36 ccoshf32 F
+GLIBC_2.36 ccoshf32x F
+GLIBC_2.36 ccoshf64 F
+GLIBC_2.36 ccoshf64x F
+GLIBC_2.36 ccoshl F
+GLIBC_2.36 ccosl F
+GLIBC_2.36 ceil F
+GLIBC_2.36 ceilf F
+GLIBC_2.36 ceilf128 F
+GLIBC_2.36 ceilf32 F
+GLIBC_2.36 ceilf32x F
+GLIBC_2.36 ceilf64 F
+GLIBC_2.36 ceilf64x F
+GLIBC_2.36 ceill F
+GLIBC_2.36 cexp F
+GLIBC_2.36 cexpf F
+GLIBC_2.36 cexpf128 F
+GLIBC_2.36 cexpf32 F
+GLIBC_2.36 cexpf32x F
+GLIBC_2.36 cexpf64 F
+GLIBC_2.36 cexpf64x F
+GLIBC_2.36 cexpl F
+GLIBC_2.36 cimag F
+GLIBC_2.36 cimagf F
+GLIBC_2.36 cimagf128 F
+GLIBC_2.36 cimagf32 F
+GLIBC_2.36 cimagf32x F
+GLIBC_2.36 cimagf64 F
+GLIBC_2.36 cimagf64x F
+GLIBC_2.36 cimagl F
+GLIBC_2.36 clog F
+GLIBC_2.36 clog10 F
+GLIBC_2.36 clog10f F
+GLIBC_2.36 clog10f128 F
+GLIBC_2.36 clog10f32 F
+GLIBC_2.36 clog10f32x F
+GLIBC_2.36 clog10f64 F
+GLIBC_2.36 clog10f64x F
+GLIBC_2.36 clog10l F
+GLIBC_2.36 clogf F
+GLIBC_2.36 clogf128 F
+GLIBC_2.36 clogf32 F
+GLIBC_2.36 clogf32x F
+GLIBC_2.36 clogf64 F
+GLIBC_2.36 clogf64x F
+GLIBC_2.36 clogl F
+GLIBC_2.36 conj F
+GLIBC_2.36 conjf F
+GLIBC_2.36 conjf128 F
+GLIBC_2.36 conjf32 F
+GLIBC_2.36 conjf32x F
+GLIBC_2.36 conjf64 F
+GLIBC_2.36 conjf64x F
+GLIBC_2.36 conjl F
+GLIBC_2.36 copysign F
+GLIBC_2.36 copysignf F
+GLIBC_2.36 copysignf128 F
+GLIBC_2.36 copysignf32 F
+GLIBC_2.36 copysignf32x F
+GLIBC_2.36 copysignf64 F
+GLIBC_2.36 copysignf64x F
+GLIBC_2.36 copysignl F
+GLIBC_2.36 cos F
+GLIBC_2.36 cosf F
+GLIBC_2.36 cosf128 F
+GLIBC_2.36 cosf32 F
+GLIBC_2.36 cosf32x F
+GLIBC_2.36 cosf64 F
+GLIBC_2.36 cosf64x F
+GLIBC_2.36 cosh F
+GLIBC_2.36 coshf F
+GLIBC_2.36 coshf128 F
+GLIBC_2.36 coshf32 F
+GLIBC_2.36 coshf32x F
+GLIBC_2.36 coshf64 F
+GLIBC_2.36 coshf64x F
+GLIBC_2.36 coshl F
+GLIBC_2.36 cosl F
+GLIBC_2.36 cpow F
+GLIBC_2.36 cpowf F
+GLIBC_2.36 cpowf128 F
+GLIBC_2.36 cpowf32 F
+GLIBC_2.36 cpowf32x F
+GLIBC_2.36 cpowf64 F
+GLIBC_2.36 cpowf64x F
+GLIBC_2.36 cpowl F
+GLIBC_2.36 cproj F
+GLIBC_2.36 cprojf F
+GLIBC_2.36 cprojf128 F
+GLIBC_2.36 cprojf32 F
+GLIBC_2.36 cprojf32x F
+GLIBC_2.36 cprojf64 F
+GLIBC_2.36 cprojf64x F
+GLIBC_2.36 cprojl F
+GLIBC_2.36 creal F
+GLIBC_2.36 crealf F
+GLIBC_2.36 crealf128 F
+GLIBC_2.36 crealf32 F
+GLIBC_2.36 crealf32x F
+GLIBC_2.36 crealf64 F
+GLIBC_2.36 crealf64x F
+GLIBC_2.36 creall F
+GLIBC_2.36 csin F
+GLIBC_2.36 csinf F
+GLIBC_2.36 csinf128 F
+GLIBC_2.36 csinf32 F
+GLIBC_2.36 csinf32x F
+GLIBC_2.36 csinf64 F
+GLIBC_2.36 csinf64x F
+GLIBC_2.36 csinh F
+GLIBC_2.36 csinhf F
+GLIBC_2.36 csinhf128 F
+GLIBC_2.36 csinhf32 F
+GLIBC_2.36 csinhf32x F
+GLIBC_2.36 csinhf64 F
+GLIBC_2.36 csinhf64x F
+GLIBC_2.36 csinhl F
+GLIBC_2.36 csinl F
+GLIBC_2.36 csqrt F
+GLIBC_2.36 csqrtf F
+GLIBC_2.36 csqrtf128 F
+GLIBC_2.36 csqrtf32 F
+GLIBC_2.36 csqrtf32x F
+GLIBC_2.36 csqrtf64 F
+GLIBC_2.36 csqrtf64x F
+GLIBC_2.36 csqrtl F
+GLIBC_2.36 ctan F
+GLIBC_2.36 ctanf F
+GLIBC_2.36 ctanf128 F
+GLIBC_2.36 ctanf32 F
+GLIBC_2.36 ctanf32x F
+GLIBC_2.36 ctanf64 F
+GLIBC_2.36 ctanf64x F
+GLIBC_2.36 ctanh F
+GLIBC_2.36 ctanhf F
+GLIBC_2.36 ctanhf128 F
+GLIBC_2.36 ctanhf32 F
+GLIBC_2.36 ctanhf32x F
+GLIBC_2.36 ctanhf64 F
+GLIBC_2.36 ctanhf64x F
+GLIBC_2.36 ctanhl F
+GLIBC_2.36 ctanl F
+GLIBC_2.36 daddl F
+GLIBC_2.36 ddivl F
+GLIBC_2.36 dfmal F
+GLIBC_2.36 dmull F
+GLIBC_2.36 drem F
+GLIBC_2.36 dremf F
+GLIBC_2.36 dreml F
+GLIBC_2.36 dsqrtl F
+GLIBC_2.36 dsubl F
+GLIBC_2.36 erf F
+GLIBC_2.36 erfc F
+GLIBC_2.36 erfcf F
+GLIBC_2.36 erfcf128 F
+GLIBC_2.36 erfcf32 F
+GLIBC_2.36 erfcf32x F
+GLIBC_2.36 erfcf64 F
+GLIBC_2.36 erfcf64x F
+GLIBC_2.36 erfcl F
+GLIBC_2.36 erff F
+GLIBC_2.36 erff128 F
+GLIBC_2.36 erff32 F
+GLIBC_2.36 erff32x F
+GLIBC_2.36 erff64 F
+GLIBC_2.36 erff64x F
+GLIBC_2.36 erfl F
+GLIBC_2.36 exp F
+GLIBC_2.36 exp10 F
+GLIBC_2.36 exp10f F
+GLIBC_2.36 exp10f128 F
+GLIBC_2.36 exp10f32 F
+GLIBC_2.36 exp10f32x F
+GLIBC_2.36 exp10f64 F
+GLIBC_2.36 exp10f64x F
+GLIBC_2.36 exp10l F
+GLIBC_2.36 exp2 F
+GLIBC_2.36 exp2f F
+GLIBC_2.36 exp2f128 F
+GLIBC_2.36 exp2f32 F
+GLIBC_2.36 exp2f32x F
+GLIBC_2.36 exp2f64 F
+GLIBC_2.36 exp2f64x F
+GLIBC_2.36 exp2l F
+GLIBC_2.36 expf F
+GLIBC_2.36 expf128 F
+GLIBC_2.36 expf32 F
+GLIBC_2.36 expf32x F
+GLIBC_2.36 expf64 F
+GLIBC_2.36 expf64x F
+GLIBC_2.36 expl F
+GLIBC_2.36 expm1 F
+GLIBC_2.36 expm1f F
+GLIBC_2.36 expm1f128 F
+GLIBC_2.36 expm1f32 F
+GLIBC_2.36 expm1f32x F
+GLIBC_2.36 expm1f64 F
+GLIBC_2.36 expm1f64x F
+GLIBC_2.36 expm1l F
+GLIBC_2.36 f32addf128 F
+GLIBC_2.36 f32addf32x F
+GLIBC_2.36 f32addf64 F
+GLIBC_2.36 f32addf64x F
+GLIBC_2.36 f32divf128 F
+GLIBC_2.36 f32divf32x F
+GLIBC_2.36 f32divf64 F
+GLIBC_2.36 f32divf64x F
+GLIBC_2.36 f32fmaf128 F
+GLIBC_2.36 f32fmaf32x F
+GLIBC_2.36 f32fmaf64 F
+GLIBC_2.36 f32fmaf64x F
+GLIBC_2.36 f32mulf128 F
+GLIBC_2.36 f32mulf32x F
+GLIBC_2.36 f32mulf64 F
+GLIBC_2.36 f32mulf64x F
+GLIBC_2.36 f32sqrtf128 F
+GLIBC_2.36 f32sqrtf32x F
+GLIBC_2.36 f32sqrtf64 F
+GLIBC_2.36 f32sqrtf64x F
+GLIBC_2.36 f32subf128 F
+GLIBC_2.36 f32subf32x F
+GLIBC_2.36 f32subf64 F
+GLIBC_2.36 f32subf64x F
+GLIBC_2.36 f32xaddf128 F
+GLIBC_2.36 f32xaddf64 F
+GLIBC_2.36 f32xaddf64x F
+GLIBC_2.36 f32xdivf128 F
+GLIBC_2.36 f32xdivf64 F
+GLIBC_2.36 f32xdivf64x F
+GLIBC_2.36 f32xfmaf128 F
+GLIBC_2.36 f32xfmaf64 F
+GLIBC_2.36 f32xfmaf64x F
+GLIBC_2.36 f32xmulf128 F
+GLIBC_2.36 f32xmulf64 F
+GLIBC_2.36 f32xmulf64x F
+GLIBC_2.36 f32xsqrtf128 F
+GLIBC_2.36 f32xsqrtf64 F
+GLIBC_2.36 f32xsqrtf64x F
+GLIBC_2.36 f32xsubf128 F
+GLIBC_2.36 f32xsubf64 F
+GLIBC_2.36 f32xsubf64x F
+GLIBC_2.36 f64addf128 F
+GLIBC_2.36 f64addf64x F
+GLIBC_2.36 f64divf128 F
+GLIBC_2.36 f64divf64x F
+GLIBC_2.36 f64fmaf128 F
+GLIBC_2.36 f64fmaf64x F
+GLIBC_2.36 f64mulf128 F
+GLIBC_2.36 f64mulf64x F
+GLIBC_2.36 f64sqrtf128 F
+GLIBC_2.36 f64sqrtf64x F
+GLIBC_2.36 f64subf128 F
+GLIBC_2.36 f64subf64x F
+GLIBC_2.36 f64xaddf128 F
+GLIBC_2.36 f64xdivf128 F
+GLIBC_2.36 f64xfmaf128 F
+GLIBC_2.36 f64xmulf128 F
+GLIBC_2.36 f64xsqrtf128 F
+GLIBC_2.36 f64xsubf128 F
+GLIBC_2.36 fabs F
+GLIBC_2.36 fabsf F
+GLIBC_2.36 fabsf128 F
+GLIBC_2.36 fabsf32 F
+GLIBC_2.36 fabsf32x F
+GLIBC_2.36 fabsf64 F
+GLIBC_2.36 fabsf64x F
+GLIBC_2.36 fabsl F
+GLIBC_2.36 fadd F
+GLIBC_2.36 faddl F
+GLIBC_2.36 fdim F
+GLIBC_2.36 fdimf F
+GLIBC_2.36 fdimf128 F
+GLIBC_2.36 fdimf32 F
+GLIBC_2.36 fdimf32x F
+GLIBC_2.36 fdimf64 F
+GLIBC_2.36 fdimf64x F
+GLIBC_2.36 fdiml F
+GLIBC_2.36 fdiv F
+GLIBC_2.36 fdivl F
+GLIBC_2.36 feclearexcept F
+GLIBC_2.36 fedisableexcept F
+GLIBC_2.36 feenableexcept F
+GLIBC_2.36 fegetenv F
+GLIBC_2.36 fegetexcept F
+GLIBC_2.36 fegetexceptflag F
+GLIBC_2.36 fegetmode F
+GLIBC_2.36 fegetround F
+GLIBC_2.36 feholdexcept F
+GLIBC_2.36 feraiseexcept F
+GLIBC_2.36 fesetenv F
+GLIBC_2.36 fesetexcept F
+GLIBC_2.36 fesetexceptflag F
+GLIBC_2.36 fesetmode F
+GLIBC_2.36 fesetround F
+GLIBC_2.36 fetestexcept F
+GLIBC_2.36 fetestexceptflag F
+GLIBC_2.36 feupdateenv F
+GLIBC_2.36 ffma F
+GLIBC_2.36 ffmal F
+GLIBC_2.36 finite F
+GLIBC_2.36 finitef F
+GLIBC_2.36 finitel F
+GLIBC_2.36 floor F
+GLIBC_2.36 floorf F
+GLIBC_2.36 floorf128 F
+GLIBC_2.36 floorf32 F
+GLIBC_2.36 floorf32x F
+GLIBC_2.36 floorf64 F
+GLIBC_2.36 floorf64x F
+GLIBC_2.36 floorl F
+GLIBC_2.36 fma F
+GLIBC_2.36 fmaf F
+GLIBC_2.36 fmaf128 F
+GLIBC_2.36 fmaf32 F
+GLIBC_2.36 fmaf32x F
+GLIBC_2.36 fmaf64 F
+GLIBC_2.36 fmaf64x F
+GLIBC_2.36 fmal F
+GLIBC_2.36 fmax F
+GLIBC_2.36 fmaxf F
+GLIBC_2.36 fmaxf128 F
+GLIBC_2.36 fmaxf32 F
+GLIBC_2.36 fmaxf32x F
+GLIBC_2.36 fmaxf64 F
+GLIBC_2.36 fmaxf64x F
+GLIBC_2.36 fmaximum F
+GLIBC_2.36 fmaximum_mag F
+GLIBC_2.36 fmaximum_mag_num F
+GLIBC_2.36 fmaximum_mag_numf F
+GLIBC_2.36 fmaximum_mag_numf128 F
+GLIBC_2.36 fmaximum_mag_numf32 F
+GLIBC_2.36 fmaximum_mag_numf32x F
+GLIBC_2.36 fmaximum_mag_numf64 F
+GLIBC_2.36 fmaximum_mag_numf64x F
+GLIBC_2.36 fmaximum_mag_numl F
+GLIBC_2.36 fmaximum_magf F
+GLIBC_2.36 fmaximum_magf128 F
+GLIBC_2.36 fmaximum_magf32 F
+GLIBC_2.36 fmaximum_magf32x F
+GLIBC_2.36 fmaximum_magf64 F
+GLIBC_2.36 fmaximum_magf64x F
+GLIBC_2.36 fmaximum_magl F
+GLIBC_2.36 fmaximum_num F
+GLIBC_2.36 fmaximum_numf F
+GLIBC_2.36 fmaximum_numf128 F
+GLIBC_2.36 fmaximum_numf32 F
+GLIBC_2.36 fmaximum_numf32x F
+GLIBC_2.36 fmaximum_numf64 F
+GLIBC_2.36 fmaximum_numf64x F
+GLIBC_2.36 fmaximum_numl F
+GLIBC_2.36 fmaximumf F
+GLIBC_2.36 fmaximumf128 F
+GLIBC_2.36 fmaximumf32 F
+GLIBC_2.36 fmaximumf32x F
+GLIBC_2.36 fmaximumf64 F
+GLIBC_2.36 fmaximumf64x F
+GLIBC_2.36 fmaximuml F
+GLIBC_2.36 fmaxl F
+GLIBC_2.36 fmaxmag F
+GLIBC_2.36 fmaxmagf F
+GLIBC_2.36 fmaxmagf128 F
+GLIBC_2.36 fmaxmagf32 F
+GLIBC_2.36 fmaxmagf32x F
+GLIBC_2.36 fmaxmagf64 F
+GLIBC_2.36 fmaxmagf64x F
+GLIBC_2.36 fmaxmagl F
+GLIBC_2.36 fmin F
+GLIBC_2.36 fminf F
+GLIBC_2.36 fminf128 F
+GLIBC_2.36 fminf32 F
+GLIBC_2.36 fminf32x F
+GLIBC_2.36 fminf64 F
+GLIBC_2.36 fminf64x F
+GLIBC_2.36 fminimum F
+GLIBC_2.36 fminimum_mag F
+GLIBC_2.36 fminimum_mag_num F
+GLIBC_2.36 fminimum_mag_numf F
+GLIBC_2.36 fminimum_mag_numf128 F
+GLIBC_2.36 fminimum_mag_numf32 F
+GLIBC_2.36 fminimum_mag_numf32x F
+GLIBC_2.36 fminimum_mag_numf64 F
+GLIBC_2.36 fminimum_mag_numf64x F
+GLIBC_2.36 fminimum_mag_numl F
+GLIBC_2.36 fminimum_magf F
+GLIBC_2.36 fminimum_magf128 F
+GLIBC_2.36 fminimum_magf32 F
+GLIBC_2.36 fminimum_magf32x F
+GLIBC_2.36 fminimum_magf64 F
+GLIBC_2.36 fminimum_magf64x F
+GLIBC_2.36 fminimum_magl F
+GLIBC_2.36 fminimum_num F
+GLIBC_2.36 fminimum_numf F
+GLIBC_2.36 fminimum_numf128 F
+GLIBC_2.36 fminimum_numf32 F
+GLIBC_2.36 fminimum_numf32x F
+GLIBC_2.36 fminimum_numf64 F
+GLIBC_2.36 fminimum_numf64x F
+GLIBC_2.36 fminimum_numl F
+GLIBC_2.36 fminimumf F
+GLIBC_2.36 fminimumf128 F
+GLIBC_2.36 fminimumf32 F
+GLIBC_2.36 fminimumf32x F
+GLIBC_2.36 fminimumf64 F
+GLIBC_2.36 fminimumf64x F
+GLIBC_2.36 fminimuml F
+GLIBC_2.36 fminl F
+GLIBC_2.36 fminmag F
+GLIBC_2.36 fminmagf F
+GLIBC_2.36 fminmagf128 F
+GLIBC_2.36 fminmagf32 F
+GLIBC_2.36 fminmagf32x F
+GLIBC_2.36 fminmagf64 F
+GLIBC_2.36 fminmagf64x F
+GLIBC_2.36 fminmagl F
+GLIBC_2.36 fmod F
+GLIBC_2.36 fmodf F
+GLIBC_2.36 fmodf128 F
+GLIBC_2.36 fmodf32 F
+GLIBC_2.36 fmodf32x F
+GLIBC_2.36 fmodf64 F
+GLIBC_2.36 fmodf64x F
+GLIBC_2.36 fmodl F
+GLIBC_2.36 fmul F
+GLIBC_2.36 fmull F
+GLIBC_2.36 frexp F
+GLIBC_2.36 frexpf F
+GLIBC_2.36 frexpf128 F
+GLIBC_2.36 frexpf32 F
+GLIBC_2.36 frexpf32x F
+GLIBC_2.36 frexpf64 F
+GLIBC_2.36 frexpf64x F
+GLIBC_2.36 frexpl F
+GLIBC_2.36 fromfp F
+GLIBC_2.36 fromfpf F
+GLIBC_2.36 fromfpf128 F
+GLIBC_2.36 fromfpf32 F
+GLIBC_2.36 fromfpf32x F
+GLIBC_2.36 fromfpf64 F
+GLIBC_2.36 fromfpf64x F
+GLIBC_2.36 fromfpl F
+GLIBC_2.36 fromfpx F
+GLIBC_2.36 fromfpxf F
+GLIBC_2.36 fromfpxf128 F
+GLIBC_2.36 fromfpxf32 F
+GLIBC_2.36 fromfpxf32x F
+GLIBC_2.36 fromfpxf64 F
+GLIBC_2.36 fromfpxf64x F
+GLIBC_2.36 fromfpxl F
+GLIBC_2.36 fsqrt F
+GLIBC_2.36 fsqrtl F
+GLIBC_2.36 fsub F
+GLIBC_2.36 fsubl F
+GLIBC_2.36 gamma F
+GLIBC_2.36 gammaf F
+GLIBC_2.36 gammal F
+GLIBC_2.36 getpayload F
+GLIBC_2.36 getpayloadf F
+GLIBC_2.36 getpayloadf128 F
+GLIBC_2.36 getpayloadf32 F
+GLIBC_2.36 getpayloadf32x F
+GLIBC_2.36 getpayloadf64 F
+GLIBC_2.36 getpayloadf64x F
+GLIBC_2.36 getpayloadl F
+GLIBC_2.36 hypot F
+GLIBC_2.36 hypotf F
+GLIBC_2.36 hypotf128 F
+GLIBC_2.36 hypotf32 F
+GLIBC_2.36 hypotf32x F
+GLIBC_2.36 hypotf64 F
+GLIBC_2.36 hypotf64x F
+GLIBC_2.36 hypotl F
+GLIBC_2.36 ilogb F
+GLIBC_2.36 ilogbf F
+GLIBC_2.36 ilogbf128 F
+GLIBC_2.36 ilogbf32 F
+GLIBC_2.36 ilogbf32x F
+GLIBC_2.36 ilogbf64 F
+GLIBC_2.36 ilogbf64x F
+GLIBC_2.36 ilogbl F
+GLIBC_2.36 j0 F
+GLIBC_2.36 j0f F
+GLIBC_2.36 j0f128 F
+GLIBC_2.36 j0f32 F
+GLIBC_2.36 j0f32x F
+GLIBC_2.36 j0f64 F
+GLIBC_2.36 j0f64x F
+GLIBC_2.36 j0l F
+GLIBC_2.36 j1 F
+GLIBC_2.36 j1f F
+GLIBC_2.36 j1f128 F
+GLIBC_2.36 j1f32 F
+GLIBC_2.36 j1f32x F
+GLIBC_2.36 j1f64 F
+GLIBC_2.36 j1f64x F
+GLIBC_2.36 j1l F
+GLIBC_2.36 jn F
+GLIBC_2.36 jnf F
+GLIBC_2.36 jnf128 F
+GLIBC_2.36 jnf32 F
+GLIBC_2.36 jnf32x F
+GLIBC_2.36 jnf64 F
+GLIBC_2.36 jnf64x F
+GLIBC_2.36 jnl F
+GLIBC_2.36 ldexp F
+GLIBC_2.36 ldexpf F
+GLIBC_2.36 ldexpf128 F
+GLIBC_2.36 ldexpf32 F
+GLIBC_2.36 ldexpf32x F
+GLIBC_2.36 ldexpf64 F
+GLIBC_2.36 ldexpf64x F
+GLIBC_2.36 ldexpl F
+GLIBC_2.36 lgamma F
+GLIBC_2.36 lgamma_r F
+GLIBC_2.36 lgammaf F
+GLIBC_2.36 lgammaf128 F
+GLIBC_2.36 lgammaf128_r F
+GLIBC_2.36 lgammaf32 F
+GLIBC_2.36 lgammaf32_r F
+GLIBC_2.36 lgammaf32x F
+GLIBC_2.36 lgammaf32x_r F
+GLIBC_2.36 lgammaf64 F
+GLIBC_2.36 lgammaf64_r F
+GLIBC_2.36 lgammaf64x F
+GLIBC_2.36 lgammaf64x_r F
+GLIBC_2.36 lgammaf_r F
+GLIBC_2.36 lgammal F
+GLIBC_2.36 lgammal_r F
+GLIBC_2.36 llogb F
+GLIBC_2.36 llogbf F
+GLIBC_2.36 llogbf128 F
+GLIBC_2.36 llogbf32 F
+GLIBC_2.36 llogbf32x F
+GLIBC_2.36 llogbf64 F
+GLIBC_2.36 llogbf64x F
+GLIBC_2.36 llogbl F
+GLIBC_2.36 llrint F
+GLIBC_2.36 llrintf F
+GLIBC_2.36 llrintf128 F
+GLIBC_2.36 llrintf32 F
+GLIBC_2.36 llrintf32x F
+GLIBC_2.36 llrintf64 F
+GLIBC_2.36 llrintf64x F
+GLIBC_2.36 llrintl F
+GLIBC_2.36 llround F
+GLIBC_2.36 llroundf F
+GLIBC_2.36 llroundf128 F
+GLIBC_2.36 llroundf32 F
+GLIBC_2.36 llroundf32x F
+GLIBC_2.36 llroundf64 F
+GLIBC_2.36 llroundf64x F
+GLIBC_2.36 llroundl F
+GLIBC_2.36 log F
+GLIBC_2.36 log10 F
+GLIBC_2.36 log10f F
+GLIBC_2.36 log10f128 F
+GLIBC_2.36 log10f32 F
+GLIBC_2.36 log10f32x F
+GLIBC_2.36 log10f64 F
+GLIBC_2.36 log10f64x F
+GLIBC_2.36 log10l F
+GLIBC_2.36 log1p F
+GLIBC_2.36 log1pf F
+GLIBC_2.36 log1pf128 F
+GLIBC_2.36 log1pf32 F
+GLIBC_2.36 log1pf32x F
+GLIBC_2.36 log1pf64 F
+GLIBC_2.36 log1pf64x F
+GLIBC_2.36 log1pl F
+GLIBC_2.36 log2 F
+GLIBC_2.36 log2f F
+GLIBC_2.36 log2f128 F
+GLIBC_2.36 log2f32 F
+GLIBC_2.36 log2f32x F
+GLIBC_2.36 log2f64 F
+GLIBC_2.36 log2f64x F
+GLIBC_2.36 log2l F
+GLIBC_2.36 logb F
+GLIBC_2.36 logbf F
+GLIBC_2.36 logbf128 F
+GLIBC_2.36 logbf32 F
+GLIBC_2.36 logbf32x F
+GLIBC_2.36 logbf64 F
+GLIBC_2.36 logbf64x F
+GLIBC_2.36 logbl F
+GLIBC_2.36 logf F
+GLIBC_2.36 logf128 F
+GLIBC_2.36 logf32 F
+GLIBC_2.36 logf32x F
+GLIBC_2.36 logf64 F
+GLIBC_2.36 logf64x F
+GLIBC_2.36 logl F
+GLIBC_2.36 lrint F
+GLIBC_2.36 lrintf F
+GLIBC_2.36 lrintf128 F
+GLIBC_2.36 lrintf32 F
+GLIBC_2.36 lrintf32x F
+GLIBC_2.36 lrintf64 F
+GLIBC_2.36 lrintf64x F
+GLIBC_2.36 lrintl F
+GLIBC_2.36 lround F
+GLIBC_2.36 lroundf F
+GLIBC_2.36 lroundf128 F
+GLIBC_2.36 lroundf32 F
+GLIBC_2.36 lroundf32x F
+GLIBC_2.36 lroundf64 F
+GLIBC_2.36 lroundf64x F
+GLIBC_2.36 lroundl F
+GLIBC_2.36 modf F
+GLIBC_2.36 modff F
+GLIBC_2.36 modff128 F
+GLIBC_2.36 modff32 F
+GLIBC_2.36 modff32x F
+GLIBC_2.36 modff64 F
+GLIBC_2.36 modff64x F
+GLIBC_2.36 modfl F
+GLIBC_2.36 nan F
+GLIBC_2.36 nanf F
+GLIBC_2.36 nanf128 F
+GLIBC_2.36 nanf32 F
+GLIBC_2.36 nanf32x F
+GLIBC_2.36 nanf64 F
+GLIBC_2.36 nanf64x F
+GLIBC_2.36 nanl F
+GLIBC_2.36 nearbyint F
+GLIBC_2.36 nearbyintf F
+GLIBC_2.36 nearbyintf128 F
+GLIBC_2.36 nearbyintf32 F
+GLIBC_2.36 nearbyintf32x F
+GLIBC_2.36 nearbyintf64 F
+GLIBC_2.36 nearbyintf64x F
+GLIBC_2.36 nearbyintl F
+GLIBC_2.36 nextafter F
+GLIBC_2.36 nextafterf F
+GLIBC_2.36 nextafterf128 F
+GLIBC_2.36 nextafterf32 F
+GLIBC_2.36 nextafterf32x F
+GLIBC_2.36 nextafterf64 F
+GLIBC_2.36 nextafterf64x F
+GLIBC_2.36 nextafterl F
+GLIBC_2.36 nextdown F
+GLIBC_2.36 nextdownf F
+GLIBC_2.36 nextdownf128 F
+GLIBC_2.36 nextdownf32 F
+GLIBC_2.36 nextdownf32x F
+GLIBC_2.36 nextdownf64 F
+GLIBC_2.36 nextdownf64x F
+GLIBC_2.36 nextdownl F
+GLIBC_2.36 nexttoward F
+GLIBC_2.36 nexttowardf F
+GLIBC_2.36 nexttowardl F
+GLIBC_2.36 nextup F
+GLIBC_2.36 nextupf F
+GLIBC_2.36 nextupf128 F
+GLIBC_2.36 nextupf32 F
+GLIBC_2.36 nextupf32x F
+GLIBC_2.36 nextupf64 F
+GLIBC_2.36 nextupf64x F
+GLIBC_2.36 nextupl F
+GLIBC_2.36 pow F
+GLIBC_2.36 powf F
+GLIBC_2.36 powf128 F
+GLIBC_2.36 powf32 F
+GLIBC_2.36 powf32x F
+GLIBC_2.36 powf64 F
+GLIBC_2.36 powf64x F
+GLIBC_2.36 powl F
+GLIBC_2.36 remainder F
+GLIBC_2.36 remainderf F
+GLIBC_2.36 remainderf128 F
+GLIBC_2.36 remainderf32 F
+GLIBC_2.36 remainderf32x F
+GLIBC_2.36 remainderf64 F
+GLIBC_2.36 remainderf64x F
+GLIBC_2.36 remainderl F
+GLIBC_2.36 remquo F
+GLIBC_2.36 remquof F
+GLIBC_2.36 remquof128 F
+GLIBC_2.36 remquof32 F
+GLIBC_2.36 remquof32x F
+GLIBC_2.36 remquof64 F
+GLIBC_2.36 remquof64x F
+GLIBC_2.36 remquol F
+GLIBC_2.36 rint F
+GLIBC_2.36 rintf F
+GLIBC_2.36 rintf128 F
+GLIBC_2.36 rintf32 F
+GLIBC_2.36 rintf32x F
+GLIBC_2.36 rintf64 F
+GLIBC_2.36 rintf64x F
+GLIBC_2.36 rintl F
+GLIBC_2.36 round F
+GLIBC_2.36 roundeven F
+GLIBC_2.36 roundevenf F
+GLIBC_2.36 roundevenf128 F
+GLIBC_2.36 roundevenf32 F
+GLIBC_2.36 roundevenf32x F
+GLIBC_2.36 roundevenf64 F
+GLIBC_2.36 roundevenf64x F
+GLIBC_2.36 roundevenl F
+GLIBC_2.36 roundf F
+GLIBC_2.36 roundf128 F
+GLIBC_2.36 roundf32 F
+GLIBC_2.36 roundf32x F
+GLIBC_2.36 roundf64 F
+GLIBC_2.36 roundf64x F
+GLIBC_2.36 roundl F
+GLIBC_2.36 scalb F
+GLIBC_2.36 scalbf F
+GLIBC_2.36 scalbl F
+GLIBC_2.36 scalbln F
+GLIBC_2.36 scalblnf F
+GLIBC_2.36 scalblnf128 F
+GLIBC_2.36 scalblnf32 F
+GLIBC_2.36 scalblnf32x F
+GLIBC_2.36 scalblnf64 F
+GLIBC_2.36 scalblnf64x F
+GLIBC_2.36 scalblnl F
+GLIBC_2.36 scalbn F
+GLIBC_2.36 scalbnf F
+GLIBC_2.36 scalbnf128 F
+GLIBC_2.36 scalbnf32 F
+GLIBC_2.36 scalbnf32x F
+GLIBC_2.36 scalbnf64 F
+GLIBC_2.36 scalbnf64x F
+GLIBC_2.36 scalbnl F
+GLIBC_2.36 setpayload F
+GLIBC_2.36 setpayloadf F
+GLIBC_2.36 setpayloadf128 F
+GLIBC_2.36 setpayloadf32 F
+GLIBC_2.36 setpayloadf32x F
+GLIBC_2.36 setpayloadf64 F
+GLIBC_2.36 setpayloadf64x F
+GLIBC_2.36 setpayloadl F
+GLIBC_2.36 setpayloadsig F
+GLIBC_2.36 setpayloadsigf F
+GLIBC_2.36 setpayloadsigf128 F
+GLIBC_2.36 setpayloadsigf32 F
+GLIBC_2.36 setpayloadsigf32x F
+GLIBC_2.36 setpayloadsigf64 F
+GLIBC_2.36 setpayloadsigf64x F
+GLIBC_2.36 setpayloadsigl F
+GLIBC_2.36 signgam D 0x4
+GLIBC_2.36 significand F
+GLIBC_2.36 significandf F
+GLIBC_2.36 significandl F
+GLIBC_2.36 sin F
+GLIBC_2.36 sincos F
+GLIBC_2.36 sincosf F
+GLIBC_2.36 sincosf128 F
+GLIBC_2.36 sincosf32 F
+GLIBC_2.36 sincosf32x F
+GLIBC_2.36 sincosf64 F
+GLIBC_2.36 sincosf64x F
+GLIBC_2.36 sincosl F
+GLIBC_2.36 sinf F
+GLIBC_2.36 sinf128 F
+GLIBC_2.36 sinf32 F
+GLIBC_2.36 sinf32x F
+GLIBC_2.36 sinf64 F
+GLIBC_2.36 sinf64x F
+GLIBC_2.36 sinh F
+GLIBC_2.36 sinhf F
+GLIBC_2.36 sinhf128 F
+GLIBC_2.36 sinhf32 F
+GLIBC_2.36 sinhf32x F
+GLIBC_2.36 sinhf64 F
+GLIBC_2.36 sinhf64x F
+GLIBC_2.36 sinhl F
+GLIBC_2.36 sinl F
+GLIBC_2.36 sqrt F
+GLIBC_2.36 sqrtf F
+GLIBC_2.36 sqrtf128 F
+GLIBC_2.36 sqrtf32 F
+GLIBC_2.36 sqrtf32x F
+GLIBC_2.36 sqrtf64 F
+GLIBC_2.36 sqrtf64x F
+GLIBC_2.36 sqrtl F
+GLIBC_2.36 tan F
+GLIBC_2.36 tanf F
+GLIBC_2.36 tanf128 F
+GLIBC_2.36 tanf32 F
+GLIBC_2.36 tanf32x F
+GLIBC_2.36 tanf64 F
+GLIBC_2.36 tanf64x F
+GLIBC_2.36 tanh F
+GLIBC_2.36 tanhf F
+GLIBC_2.36 tanhf128 F
+GLIBC_2.36 tanhf32 F
+GLIBC_2.36 tanhf32x F
+GLIBC_2.36 tanhf64 F
+GLIBC_2.36 tanhf64x F
+GLIBC_2.36 tanhl F
+GLIBC_2.36 tanl F
+GLIBC_2.36 tgamma F
+GLIBC_2.36 tgammaf F
+GLIBC_2.36 tgammaf128 F
+GLIBC_2.36 tgammaf32 F
+GLIBC_2.36 tgammaf32x F
+GLIBC_2.36 tgammaf64 F
+GLIBC_2.36 tgammaf64x F
+GLIBC_2.36 tgammal F
+GLIBC_2.36 totalorder F
+GLIBC_2.36 totalorderf F
+GLIBC_2.36 totalorderf128 F
+GLIBC_2.36 totalorderf32 F
+GLIBC_2.36 totalorderf32x F
+GLIBC_2.36 totalorderf64 F
+GLIBC_2.36 totalorderf64x F
+GLIBC_2.36 totalorderl F
+GLIBC_2.36 totalordermag F
+GLIBC_2.36 totalordermagf F
+GLIBC_2.36 totalordermagf128 F
+GLIBC_2.36 totalordermagf32 F
+GLIBC_2.36 totalordermagf32x F
+GLIBC_2.36 totalordermagf64 F
+GLIBC_2.36 totalordermagf64x F
+GLIBC_2.36 totalordermagl F
+GLIBC_2.36 trunc F
+GLIBC_2.36 truncf F
+GLIBC_2.36 truncf128 F
+GLIBC_2.36 truncf32 F
+GLIBC_2.36 truncf32x F
+GLIBC_2.36 truncf64 F
+GLIBC_2.36 truncf64x F
+GLIBC_2.36 truncl F
+GLIBC_2.36 ufromfp F
+GLIBC_2.36 ufromfpf F
+GLIBC_2.36 ufromfpf128 F
+GLIBC_2.36 ufromfpf32 F
+GLIBC_2.36 ufromfpf32x F
+GLIBC_2.36 ufromfpf64 F
+GLIBC_2.36 ufromfpf64x F
+GLIBC_2.36 ufromfpl F
+GLIBC_2.36 ufromfpx F
+GLIBC_2.36 ufromfpxf F
+GLIBC_2.36 ufromfpxf128 F
+GLIBC_2.36 ufromfpxf32 F
+GLIBC_2.36 ufromfpxf32x F
+GLIBC_2.36 ufromfpxf64 F
+GLIBC_2.36 ufromfpxf64x F
+GLIBC_2.36 ufromfpxl F
+GLIBC_2.36 y0 F
+GLIBC_2.36 y0f F
+GLIBC_2.36 y0f128 F
+GLIBC_2.36 y0f32 F
+GLIBC_2.36 y0f32x F
+GLIBC_2.36 y0f64 F
+GLIBC_2.36 y0f64x F
+GLIBC_2.36 y0l F
+GLIBC_2.36 y1 F
+GLIBC_2.36 y1f F
+GLIBC_2.36 y1f128 F
+GLIBC_2.36 y1f32 F
+GLIBC_2.36 y1f32x F
+GLIBC_2.36 y1f64 F
+GLIBC_2.36 y1f64x F
+GLIBC_2.36 y1l F
+GLIBC_2.36 yn F
+GLIBC_2.36 ynf F
+GLIBC_2.36 ynf128 F
+GLIBC_2.36 ynf32 F
+GLIBC_2.36 ynf32x F
+GLIBC_2.36 ynf64 F
+GLIBC_2.36 ynf64x F
+GLIBC_2.36 ynl F
diff --git a/sysdeps/unix/sysv/linux/loongarch/lp64/libpthread.abilist b/sysdeps/unix/sysv/linux/loongarch/lp64/libpthread.abilist
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/sysdeps/unix/sysv/linux/loongarch/lp64/libresolv.abilist b/sysdeps/unix/sysv/linux/loongarch/lp64/libresolv.abilist
new file mode 100644
index 0000000000..c30f54c0bf
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/loongarch/lp64/libresolv.abilist
@@ -0,0 +1,55 @@
+GLIBC_2.36 __b64_ntop F
+GLIBC_2.36 __b64_pton F
+GLIBC_2.36 __dn_count_labels F
+GLIBC_2.36 __fp_nquery F
+GLIBC_2.36 __fp_query F
+GLIBC_2.36 __fp_resstat F
+GLIBC_2.36 __hostalias F
+GLIBC_2.36 __loc_aton F
+GLIBC_2.36 __loc_ntoa F
+GLIBC_2.36 __p_cdname F
+GLIBC_2.36 __p_cdnname F
+GLIBC_2.36 __p_class F
+GLIBC_2.36 __p_class_syms D 0xa8
+GLIBC_2.36 __p_fqname F
+GLIBC_2.36 __p_fqnname F
+GLIBC_2.36 __p_option F
+GLIBC_2.36 __p_query F
+GLIBC_2.36 __p_rcode F
+GLIBC_2.36 __p_time F
+GLIBC_2.36 __p_type F
+GLIBC_2.36 __p_type_syms D 0x450
+GLIBC_2.36 __putlong F
+GLIBC_2.36 __putshort F
+GLIBC_2.36 __res_close F
+GLIBC_2.36 __res_hostalias F
+GLIBC_2.36 __res_isourserver F
+GLIBC_2.36 __res_nameinquery F
+GLIBC_2.36 __res_queriesmatch F
+GLIBC_2.36 __sym_ntop F
+GLIBC_2.36 __sym_ntos F
+GLIBC_2.36 __sym_ston F
+GLIBC_2.36 _getlong F
+GLIBC_2.36 _getshort F
+GLIBC_2.36 inet_net_ntop F
+GLIBC_2.36 inet_net_pton F
+GLIBC_2.36 inet_neta F
+GLIBC_2.36 ns_datetosecs F
+GLIBC_2.36 ns_format_ttl F
+GLIBC_2.36 ns_get16 F
+GLIBC_2.36 ns_get32 F
+GLIBC_2.36 ns_initparse F
+GLIBC_2.36 ns_makecanon F
+GLIBC_2.36 ns_msg_getflag F
+GLIBC_2.36 ns_name_ntol F
+GLIBC_2.36 ns_name_rollback F
+GLIBC_2.36 ns_parse_ttl F
+GLIBC_2.36 ns_parserr F
+GLIBC_2.36 ns_put16 F
+GLIBC_2.36 ns_put32 F
+GLIBC_2.36 ns_samedomain F
+GLIBC_2.36 ns_samename F
+GLIBC_2.36 ns_skiprr F
+GLIBC_2.36 ns_sprintrr F
+GLIBC_2.36 ns_sprintrrf F
+GLIBC_2.36 ns_subdomain F
diff --git a/sysdeps/unix/sysv/linux/loongarch/lp64/librt.abilist b/sysdeps/unix/sysv/linux/loongarch/lp64/librt.abilist
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/sysdeps/unix/sysv/linux/loongarch/lp64/libthread_db.abilist b/sysdeps/unix/sysv/linux/loongarch/lp64/libthread_db.abilist
new file mode 100644
index 0000000000..8658803d38
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/loongarch/lp64/libthread_db.abilist
@@ -0,0 +1,40 @@
+GLIBC_2.36 td_init F
+GLIBC_2.36 td_log F
+GLIBC_2.36 td_symbol_list F
+GLIBC_2.36 td_ta_clear_event F
+GLIBC_2.36 td_ta_delete F
+GLIBC_2.36 td_ta_enable_stats F
+GLIBC_2.36 td_ta_event_addr F
+GLIBC_2.36 td_ta_event_getmsg F
+GLIBC_2.36 td_ta_get_nthreads F
+GLIBC_2.36 td_ta_get_ph F
+GLIBC_2.36 td_ta_get_stats F
+GLIBC_2.36 td_ta_map_id2thr F
+GLIBC_2.36 td_ta_map_lwp2thr F
+GLIBC_2.36 td_ta_new F
+GLIBC_2.36 td_ta_reset_stats F
+GLIBC_2.36 td_ta_set_event F
+GLIBC_2.36 td_ta_setconcurrency F
+GLIBC_2.36 td_ta_thr_iter F
+GLIBC_2.36 td_ta_tsd_iter F
+GLIBC_2.36 td_thr_clear_event F
+GLIBC_2.36 td_thr_dbresume F
+GLIBC_2.36 td_thr_dbsuspend F
+GLIBC_2.36 td_thr_event_enable F
+GLIBC_2.36 td_thr_event_getmsg F
+GLIBC_2.36 td_thr_get_info F
+GLIBC_2.36 td_thr_getfpregs F
+GLIBC_2.36 td_thr_getgregs F
+GLIBC_2.36 td_thr_getxregs F
+GLIBC_2.36 td_thr_getxregsize F
+GLIBC_2.36 td_thr_set_event F
+GLIBC_2.36 td_thr_setfpregs F
+GLIBC_2.36 td_thr_setgregs F
+GLIBC_2.36 td_thr_setprio F
+GLIBC_2.36 td_thr_setsigpending F
+GLIBC_2.36 td_thr_setxregs F
+GLIBC_2.36 td_thr_sigsetmask F
+GLIBC_2.36 td_thr_tls_get_addr F
+GLIBC_2.36 td_thr_tlsbase F
+GLIBC_2.36 td_thr_tsd F
+GLIBC_2.36 td_thr_validate F
-- 
2.20.1


^ permalink raw reply	[flat|nested] 21+ messages in thread

* [PATCH v3 11/13] LoongArch: Build Infastructure
  2022-04-15  1:31 [PATCH v3 00/13] GLIBC LoongArch PATCHES caiyinyu
                   ` (9 preceding siblings ...)
  2022-04-15  1:31 ` [PATCH v3 10/13] LoongArch: Add ABI Lists caiyinyu
@ 2022-04-15  1:31 ` caiyinyu
  2022-04-15  1:31 ` [PATCH v3 12/13] LoongArch: Hard Float Support caiyinyu
  2022-04-15  1:31 ` [PATCH v3 13/13] LoongArch: Update build-many-glibcs.py for the LoongArch Port caiyinyu
  12 siblings, 0 replies; 21+ messages in thread
From: caiyinyu @ 2022-04-15  1:31 UTC (permalink / raw)
  To: libc-alpha, adhemerval.zanella; +Cc: joseph_myers, xuchenghua, caiyinyu

---
 sysdeps/loongarch/Implies                     |   3 +
 sysdeps/loongarch/Makefile                    |  15 ++
 sysdeps/loongarch/configure                   |   4 +
 sysdeps/loongarch/configure.ac                |   6 +
 sysdeps/loongarch/lp64/Implies-after          |   1 +
 sysdeps/loongarch/nptl/Makefile               |  21 ++
 sysdeps/loongarch/preconfigure                |  47 +++++
 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   | 199 ++++++++++++++++++
 .../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 +
 15 files changed, 429 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/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..1e5abf81a7
--- /dev/null
+++ b/sysdeps/loongarch/configure
@@ -0,0 +1,4 @@
+# This file is generated from configure.ac by Autoconf.  DO NOT EDIT!
+ # Local configure fragment for sysdeps/loongarch/elf.
+
+#AC_DEFINE(PI_STATIC_AND_HIDDEN)
diff --git a/sysdeps/loongarch/configure.ac b/sysdeps/loongarch/configure.ac
new file mode 100644
index 0000000000..67b46ce048
--- /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(PI_STATIC_AND_HIDDEN)
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..19983538ed
--- /dev/null
+++ b/sysdeps/loongarch/preconfigure
@@ -0,0 +1,47 @@
+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
+	echo "loongarch does not yet support soft floating-point  ABI!!" >&2
+	exit 1
+	;;
+    single)
+	echo "glibc does not yet support the single floating-point ABI" >&2
+	exit 1
+	;;
+    double)
+	abi_flen=64
+	;;
+    *)
+	echo "Unable to determine floating-point ABI" >&2
+	exit 1
+	;;
+    esac
+
+    case "$grlen" in
+    32)
+	echo "loongarch does not yet support ilp32 ABI!!" >&2
+	;;
+    64)
+	machine=loongarch/lp64
+	;;
+    *)
+	echo "Unable to determine GRLEN" >&2
+	exit 1
+	;;
+    esac
+
+    $as_echo "#define LOONGARCH_ABI_GRLEN $grlen" >>confdefs.h
+    $as_echo "#define LOONGARCH_ABI_FRLEN $abi_flen" >>confdefs.h
+
+    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..f4adec4ed9
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/loongarch/configure
@@ -0,0 +1,199 @@
+# This file is generated from configure.ac by Autoconf.  DO NOT EDIT!
+ # Local configure fragment for sysdeps/unix/sysv/linux/loongarch.
+
+arch_minimum_kernel=10.0.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 4 4" >/dev/null 2>&1; then :
+  libc_cv_loongarch_int_abi=lp32
+fi
+rm -f conftest*
+
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+__SIZEOF_INT__ __SIZEOF_LONG__ __SIZEOF_POINTER__
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "4 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
+lp32)
+  test -n "$libc_cv_slibdir" ||
+case "$prefix" in
+/usr | /usr/)
+  libc_cv_slibdir='/lib32'
+  libc_cv_rtlddir='/lib32'
+  if test "$libdir" = '${exec_prefix}/lib'; then
+    libdir='${exec_prefix}/lib32';
+    # Locale data can be shared between 32-bit and 64-bit libraries.
+    libc_cv_complocaledir='${exec_prefix}/lib/locale'
+  fi
+  ;;
+esac
+  ;;
+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=10.0.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
-- 
2.20.1


^ permalink raw reply	[flat|nested] 21+ messages in thread

* [PATCH v3 12/13] LoongArch: Hard Float Support
  2022-04-15  1:31 [PATCH v3 00/13] GLIBC LoongArch PATCHES caiyinyu
                   ` (10 preceding siblings ...)
  2022-04-15  1:31 ` [PATCH v3 11/13] LoongArch: Build Infastructure caiyinyu
@ 2022-04-15  1:31 ` caiyinyu
  2022-04-15  1:31 ` [PATCH v3 13/13] LoongArch: Update build-many-glibcs.py for the LoongArch Port caiyinyu
  12 siblings, 0 replies; 21+ messages in thread
From: caiyinyu @ 2022-04-15  1:31 UTC (permalink / raw)
  To: libc-alpha, adhemerval.zanella; +Cc: joseph_myers, xuchenghua, caiyinyu

---
 sysdeps/loongarch/fpu/fclrexcpt.c             |   46 +
 sysdeps/loongarch/fpu/fedisblxcpt.c           |   39 +
 sysdeps/loongarch/fpu/feenablxcpt.c           |   39 +
 sysdeps/loongarch/fpu/fegetenv.c              |   31 +
 sysdeps/loongarch/fpu/fegetexcept.c           |   32 +
 sysdeps/loongarch/fpu/fegetmode.c             |   27 +
 sysdeps/loongarch/fpu/fegetround.c            |   33 +
 sysdeps/loongarch/fpu/feholdexcpt.c           |   40 +
 sysdeps/loongarch/fpu/fenv_libc.h             |   30 +
 sysdeps/loongarch/fpu/fesetenv.c              |   42 +
 sysdeps/loongarch/fpu/fesetexcept.c           |   32 +
 sysdeps/loongarch/fpu/fesetmode.c             |   38 +
 sysdeps/loongarch/fpu/fesetround.c            |   44 +
 sysdeps/loongarch/fpu/feupdateenv.c           |   43 +
 sysdeps/loongarch/fpu/fgetexcptflg.c          |   38 +
 sysdeps/loongarch/fpu/fraiseexcpt.c           |   75 +
 sysdeps/loongarch/fpu/fsetexcptflg.c          |   41 +
 sysdeps/loongarch/fpu/ftestexcept.c           |   32 +
 .../loongarch/fpu/math-use-builtins-sqrt.h    |    4 +
 sysdeps/loongarch/lp64/libm-test-ulps         | 1412 +++++++++++++++++
 sysdeps/loongarch/lp64/libm-test-ulps-name    |    1 +
 sysdeps/loongarch/math_private.h              |  248 +++
 22 files changed, 2367 insertions(+)
 create mode 100644 sysdeps/loongarch/fpu/fclrexcpt.c
 create mode 100644 sysdeps/loongarch/fpu/fedisblxcpt.c
 create mode 100644 sysdeps/loongarch/fpu/feenablxcpt.c
 create mode 100644 sysdeps/loongarch/fpu/fegetenv.c
 create mode 100644 sysdeps/loongarch/fpu/fegetexcept.c
 create mode 100644 sysdeps/loongarch/fpu/fegetmode.c
 create mode 100644 sysdeps/loongarch/fpu/fegetround.c
 create mode 100644 sysdeps/loongarch/fpu/feholdexcpt.c
 create mode 100644 sysdeps/loongarch/fpu/fenv_libc.h
 create mode 100644 sysdeps/loongarch/fpu/fesetenv.c
 create mode 100644 sysdeps/loongarch/fpu/fesetexcept.c
 create mode 100644 sysdeps/loongarch/fpu/fesetmode.c
 create mode 100644 sysdeps/loongarch/fpu/fesetround.c
 create mode 100644 sysdeps/loongarch/fpu/feupdateenv.c
 create mode 100644 sysdeps/loongarch/fpu/fgetexcptflg.c
 create mode 100644 sysdeps/loongarch/fpu/fraiseexcpt.c
 create mode 100644 sysdeps/loongarch/fpu/fsetexcptflg.c
 create mode 100644 sysdeps/loongarch/fpu/ftestexcept.c
 create mode 100644 sysdeps/loongarch/fpu/math-use-builtins-sqrt.h
 create mode 100644 sysdeps/loongarch/lp64/libm-test-ulps
 create mode 100644 sysdeps/loongarch/lp64/libm-test-ulps-name
 create mode 100644 sysdeps/loongarch/math_private.h

diff --git a/sysdeps/loongarch/fpu/fclrexcpt.c b/sysdeps/loongarch/fpu/fclrexcpt.c
new file mode 100644
index 0000000000..e9f33a1658
--- /dev/null
+++ b/sysdeps/loongarch/fpu/fclrexcpt.c
@@ -0,0 +1,46 @@
+/* Clear given exceptions in current floating-point environment.
+   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/>.  */
+
+#include <fenv.h>
+#include <fenv_libc.h>
+#include <fpu_control.h>
+
+int
+feclearexcept (int excepts)
+{
+  int cw;
+
+  /* Mask out unsupported bits/exceptions.  */
+  excepts &= FE_ALL_EXCEPT;
+
+  /* Read the complete control word.  */
+  _FPU_GETCW (cw);
+
+  /* Clear exception flag bits and cause bits.  If the cause bit is not
+     cleared, the next CTC instruction (just below) will re-generate the
+     exception.  */
+
+  cw &= ~(excepts | (excepts << CAUSE_SHIFT));
+
+  /* Put the new data in effect.  */
+  _FPU_SETCW (cw);
+
+  /* Success.  */
+  return 0;
+}
+libm_hidden_def (feclearexcept)
diff --git a/sysdeps/loongarch/fpu/fedisblxcpt.c b/sysdeps/loongarch/fpu/fedisblxcpt.c
new file mode 100644
index 0000000000..add62946fd
--- /dev/null
+++ b/sysdeps/loongarch/fpu/fedisblxcpt.c
@@ -0,0 +1,39 @@
+/* Disable floating-point exceptions.
+   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/>.  */
+
+#include <fenv.h>
+#include <fenv_libc.h>
+#include <fpu_control.h>
+
+int
+fedisableexcept (int excepts)
+{
+  unsigned int new_exc, old_exc;
+
+  /* Get the current control word.  */
+  _FPU_GETCW (new_exc);
+
+  old_exc = (new_exc & ENABLE_MASK) << ENABLE_SHIFT;
+
+  excepts &= FE_ALL_EXCEPT;
+
+  new_exc &= ~(excepts >> ENABLE_SHIFT);
+  _FPU_SETCW (new_exc);
+
+  return old_exc;
+}
diff --git a/sysdeps/loongarch/fpu/feenablxcpt.c b/sysdeps/loongarch/fpu/feenablxcpt.c
new file mode 100644
index 0000000000..ed809341f6
--- /dev/null
+++ b/sysdeps/loongarch/fpu/feenablxcpt.c
@@ -0,0 +1,39 @@
+/* Enable floating-point exceptions.
+   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/>.  */
+
+#include <fenv.h>
+#include <fenv_libc.h>
+#include <fpu_control.h>
+
+int
+feenableexcept (int excepts)
+{
+  unsigned int new_exc, old_exc;
+
+  /* Get the current control word.  */
+  _FPU_GETCW (new_exc);
+
+  old_exc = (new_exc & ENABLE_MASK) << ENABLE_SHIFT;
+
+  excepts &= FE_ALL_EXCEPT;
+
+  new_exc |= excepts >> ENABLE_SHIFT;
+  _FPU_SETCW (new_exc);
+
+  return old_exc;
+}
diff --git a/sysdeps/loongarch/fpu/fegetenv.c b/sysdeps/loongarch/fpu/fegetenv.c
new file mode 100644
index 0000000000..5a2a3d34dc
--- /dev/null
+++ b/sysdeps/loongarch/fpu/fegetenv.c
@@ -0,0 +1,31 @@
+/* Store current floating-point environment.
+   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/>.  */
+
+#include <fenv.h>
+#include <fpu_control.h>
+
+int
+__fegetenv (fenv_t *envp)
+{
+  _FPU_GETCW (*envp);
+
+  /* Success.  */
+  return 0;
+}
+libm_hidden_def (__fegetenv) weak_alias (__fegetenv, fegetenv)
+libm_hidden_weak (fegetenv)
diff --git a/sysdeps/loongarch/fpu/fegetexcept.c b/sysdeps/loongarch/fpu/fegetexcept.c
new file mode 100644
index 0000000000..ba1c1466f4
--- /dev/null
+++ b/sysdeps/loongarch/fpu/fegetexcept.c
@@ -0,0 +1,32 @@
+/* Get enabled floating-point exceptions.
+   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/>.  */
+
+#include <fenv.h>
+#include <fenv_libc.h>
+#include <fpu_control.h>
+
+int
+fegetexcept (void)
+{
+  unsigned int exc;
+
+  /* Get the current control word.  */
+  _FPU_GETCW (exc);
+
+  return (exc & ENABLE_MASK) << ENABLE_SHIFT;
+}
diff --git a/sysdeps/loongarch/fpu/fegetmode.c b/sysdeps/loongarch/fpu/fegetmode.c
new file mode 100644
index 0000000000..e3517e34f6
--- /dev/null
+++ b/sysdeps/loongarch/fpu/fegetmode.c
@@ -0,0 +1,27 @@
+/* Store current floating-point control modes.
+   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/>.  */
+
+#include <fenv.h>
+#include <fpu_control.h>
+
+int
+fegetmode (femode_t *modep)
+{
+  _FPU_GETCW (*modep);
+  return 0;
+}
diff --git a/sysdeps/loongarch/fpu/fegetround.c b/sysdeps/loongarch/fpu/fegetround.c
new file mode 100644
index 0000000000..ff6113eb04
--- /dev/null
+++ b/sysdeps/loongarch/fpu/fegetround.c
@@ -0,0 +1,33 @@
+/* Return current rounding direction.
+   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/>.  */
+
+#include <fenv.h>
+#include <fpu_control.h>
+
+int
+__fegetround (void)
+{
+  int cw;
+
+  /* Get control word.  */
+  _FPU_GETCW (cw);
+
+  return cw & _FPU_RC_MASK;
+}
+libm_hidden_def (__fegetround) weak_alias (__fegetround, fegetround)
+libm_hidden_weak (fegetround)
diff --git a/sysdeps/loongarch/fpu/feholdexcpt.c b/sysdeps/loongarch/fpu/feholdexcpt.c
new file mode 100644
index 0000000000..e4f9f6a23b
--- /dev/null
+++ b/sysdeps/loongarch/fpu/feholdexcpt.c
@@ -0,0 +1,40 @@
+/* Store current floating-point environment and clear exceptions.
+   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/>.  */
+
+#include <fenv.h>
+#include <fpu_control.h>
+
+int
+__feholdexcept (fenv_t *envp)
+{
+  fpu_control_t cw;
+
+  /* Save the current state.  */
+  _FPU_GETCW (cw);
+  envp->__fp_control_register = cw;
+
+  /* Clear all exception enable bits and flags.  */
+  cw &= ~(_FPU_MASK_V | _FPU_MASK_Z | _FPU_MASK_O | _FPU_MASK_U | _FPU_MASK_I
+	  | FE_ALL_EXCEPT);
+  _FPU_SETCW (cw);
+
+  return 0;
+}
+
+libm_hidden_def (__feholdexcept) weak_alias (__feholdexcept, feholdexcept)
+libm_hidden_weak (feholdexcept)
diff --git a/sysdeps/loongarch/fpu/fenv_libc.h b/sysdeps/loongarch/fpu/fenv_libc.h
new file mode 100644
index 0000000000..8360ae0377
--- /dev/null
+++ b/sysdeps/loongarch/fpu/fenv_libc.h
@@ -0,0 +1,30 @@
+/* Internal libc stuff for floating point environment routines.
+   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 _FENV_LIBC_H
+#define _FENV_LIBC_H 1
+
+/* Mask for enabling exceptions and for the CAUSE bits.  */
+#define ENABLE_MASK 0x0000001FU
+#define CAUSE_MASK 0x1F000000U
+
+/* Shift for FE_* flags to get up to the ENABLE bits and the CAUSE bits.  */
+#define ENABLE_SHIFT 16
+#define CAUSE_SHIFT 8
+
+#endif /* _FENV_LIBC_H */
diff --git a/sysdeps/loongarch/fpu/fesetenv.c b/sysdeps/loongarch/fpu/fesetenv.c
new file mode 100644
index 0000000000..c10bd11ef9
--- /dev/null
+++ b/sysdeps/loongarch/fpu/fesetenv.c
@@ -0,0 +1,42 @@
+/* Install given floating-point environment.
+   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/>.  */
+
+#include <fenv.h>
+#include <fpu_control.h>
+
+int
+__fesetenv (const fenv_t *envp)
+{
+  fpu_control_t cw;
+
+  /* Read first current state to flush fpu pipeline.  */
+  _FPU_GETCW (cw);
+
+  if (envp == FE_DFL_ENV)
+    _FPU_SETCW (_FPU_DEFAULT);
+  else if (envp == FE_NOMASK_ENV)
+    _FPU_SETCW (_FPU_IEEE);
+  else
+    _FPU_SETCW (envp->__fp_control_register);
+
+  /* Success.  */
+  return 0;
+}
+
+libm_hidden_def (__fesetenv) weak_alias (__fesetenv, fesetenv)
+libm_hidden_weak (fesetenv)
diff --git a/sysdeps/loongarch/fpu/fesetexcept.c b/sysdeps/loongarch/fpu/fesetexcept.c
new file mode 100644
index 0000000000..ad76d52d9e
--- /dev/null
+++ b/sysdeps/loongarch/fpu/fesetexcept.c
@@ -0,0 +1,32 @@
+/* Set given exception flags.
+   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/>.  */
+
+#include <fenv.h>
+#include <fpu_control.h>
+
+int
+fesetexcept (int excepts)
+{
+  fpu_control_t temp;
+
+  _FPU_GETCW (temp);
+  temp |= excepts & FE_ALL_EXCEPT;
+  _FPU_SETCW (temp);
+
+  return 0;
+}
diff --git a/sysdeps/loongarch/fpu/fesetmode.c b/sysdeps/loongarch/fpu/fesetmode.c
new file mode 100644
index 0000000000..fc52fc114b
--- /dev/null
+++ b/sysdeps/loongarch/fpu/fesetmode.c
@@ -0,0 +1,38 @@
+/* Install given floating-point control modes.
+   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/>.  */
+
+#include <fenv.h>
+#include <fpu_control.h>
+
+#define FCSR_STATUS 0x1f1f0000
+
+int
+fesetmode (const femode_t *modep)
+{
+  fpu_control_t cw;
+
+  _FPU_GETCW (cw);
+  cw &= FCSR_STATUS;
+  if (modep == FE_DFL_MODE)
+    cw |= _FPU_DEFAULT;
+  else
+    cw |= *modep & ~FCSR_STATUS;
+  _FPU_SETCW (cw);
+
+  return 0;
+}
diff --git a/sysdeps/loongarch/fpu/fesetround.c b/sysdeps/loongarch/fpu/fesetround.c
new file mode 100644
index 0000000000..32acac5f96
--- /dev/null
+++ b/sysdeps/loongarch/fpu/fesetround.c
@@ -0,0 +1,44 @@
+/* Set current rounding direction.
+   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/>.  */
+
+#include <fenv.h>
+#include <fpu_control.h>
+
+int
+__fesetround (int round)
+{
+  fpu_control_t cw;
+
+  if ((round & ~_FPU_RC_MASK) != 0)
+    /* ROUND is no valid rounding mode.  */
+    return 1;
+
+  /* Get current state.  */
+  _FPU_GETCW (cw);
+
+  /* Set rounding bits.  */
+  cw &= ~_FPU_RC_MASK;
+  cw |= round;
+  /* Set new state.  */
+  _FPU_SETCW (cw);
+
+  return 0;
+}
+
+libm_hidden_def (__fesetround) weak_alias (__fesetround, fesetround)
+libm_hidden_weak (fesetround)
diff --git a/sysdeps/loongarch/fpu/feupdateenv.c b/sysdeps/loongarch/fpu/feupdateenv.c
new file mode 100644
index 0000000000..5ad862a61d
--- /dev/null
+++ b/sysdeps/loongarch/fpu/feupdateenv.c
@@ -0,0 +1,43 @@
+/* Install given floating-point environment and raise exceptions.
+   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/>.  */
+
+#include <fenv.h>
+#include <fpu_control.h>
+
+int
+__feupdateenv (const fenv_t *envp)
+{
+  int temp;
+
+  /* Save current exceptions.  */
+  _FPU_GETCW (temp);
+  temp &= FE_ALL_EXCEPT;
+
+  /* Install new environment.  */
+  __fesetenv (envp);
+
+  /* Raise the safed exception.  Incidently for us the implementation
+     defined format of the values in objects of type fexcept_t is the
+     same as the ones specified using the FE_* constants.  */
+  __feraiseexcept (temp);
+
+  /* Success.  */
+  return 0;
+}
+libm_hidden_def (__feupdateenv) weak_alias (__feupdateenv, feupdateenv)
+libm_hidden_weak (feupdateenv)
diff --git a/sysdeps/loongarch/fpu/fgetexcptflg.c b/sysdeps/loongarch/fpu/fgetexcptflg.c
new file mode 100644
index 0000000000..6130c632c9
--- /dev/null
+++ b/sysdeps/loongarch/fpu/fgetexcptflg.c
@@ -0,0 +1,38 @@
+/* Store current representation for exceptions.
+   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/>.  */
+
+#include <fenv.h>
+#include <fpu_control.h>
+
+int
+fegetexceptflag (fexcept_t *flagp, int excepts)
+{
+  fpu_control_t temp;
+
+  /* Get the current exceptions.  */
+  _FPU_GETCW (temp);
+
+  /* We only save the relevant bits here.  In particular, care has to be
+     taken with the CAUSE bits, as an inadvertent restore later on could
+     generate unexpected exceptions.  */
+
+  *flagp = temp & excepts & FE_ALL_EXCEPT;
+
+  /* Success.  */
+  return 0;
+}
diff --git a/sysdeps/loongarch/fpu/fraiseexcpt.c b/sysdeps/loongarch/fpu/fraiseexcpt.c
new file mode 100644
index 0000000000..135a848bb5
--- /dev/null
+++ b/sysdeps/loongarch/fpu/fraiseexcpt.c
@@ -0,0 +1,75 @@
+/* Raise given exceptions.
+   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/>.  */
+
+#include <fenv.h>
+#include <fpu_control.h>
+#include <float.h>
+
+int
+__feraiseexcept (int excepts)
+{
+  const float fp_zero = 0.0, fp_one = 1.0, fp_max = FLT_MAX, fp_min = FLT_MIN,
+		  fp_1e32 = 1.0e32f, fp_two = 2.0, fp_three = 3.0;
+
+  /* Raise exceptions represented by EXPECTS.  But we must raise only
+     one signal at a time.  It is important that if the overflow/underflow
+     exception and the inexact exception are given at the same time,
+     the overflow/underflow exception follows the inexact exception.  */
+
+  /* First: invalid exception.  */
+  if (FE_INVALID & excepts)
+    __asm__ __volatile__("fdiv.s $f0,%0,%0\n\t"
+			 :
+			 : "f"(fp_zero)
+			 : "$f0");
+
+  /* Next: division by zero.  */
+  if (FE_DIVBYZERO & excepts)
+    __asm__ __volatile__("fdiv.s $f0,%0,%1\n\t"
+			 :
+			 : "f"(fp_one), "f"(fp_zero)
+			 : "$f0");
+
+  /* Next: overflow.  */
+  if (FE_OVERFLOW & excepts)
+    /* There's no way to raise overflow without also raising inexact.  */
+    __asm__ __volatile__("fadd.s $f0,%0,%1\n\t"
+			 :
+			 : "f"(fp_max), "f"(fp_1e32)
+			 : "$f0");
+
+  /* Next: underflow.  */
+  if (FE_UNDERFLOW & excepts)
+    __asm__ __volatile__("fdiv.s $f0,%0,%1\n\t"
+			 :
+			 : "f"(fp_min), "f"(fp_three)
+			 : "$f0");
+
+  /* Last: inexact.  */
+  if (FE_INEXACT & excepts)
+    __asm__ __volatile__("fdiv.s $f0, %0, %1\n\t"
+			 :
+			 : "f"(fp_two), "f"(fp_three)
+			 : "$f0");
+
+  /* Success.  */
+  return 0;
+}
+
+libm_hidden_def (__feraiseexcept) weak_alias (__feraiseexcept, feraiseexcept)
+libm_hidden_weak (feraiseexcept)
diff --git a/sysdeps/loongarch/fpu/fsetexcptflg.c b/sysdeps/loongarch/fpu/fsetexcptflg.c
new file mode 100644
index 0000000000..9c135a663d
--- /dev/null
+++ b/sysdeps/loongarch/fpu/fsetexcptflg.c
@@ -0,0 +1,41 @@
+/* Set floating-point environment exception handling.
+   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/>.  */
+
+#include <fenv.h>
+#include <fpu_control.h>
+
+int
+fesetexceptflag (const fexcept_t *flagp, int excepts)
+{
+  fpu_control_t temp;
+
+  /* Get the current exceptions.  */
+  _FPU_GETCW (temp);
+
+  /* Make sure the flags we want restored are legal.  */
+  excepts &= FE_ALL_EXCEPT;
+
+  /* Now clear the bits called for, and copy them in from flagp.  Note that
+     we ignore all non-flag bits from *flagp, so they don't matter.  */
+  temp = (temp & ~excepts) | (*flagp & excepts);
+
+  _FPU_SETCW (temp);
+
+  /* Success.  */
+  return 0;
+}
diff --git a/sysdeps/loongarch/fpu/ftestexcept.c b/sysdeps/loongarch/fpu/ftestexcept.c
new file mode 100644
index 0000000000..b9563b7ae1
--- /dev/null
+++ b/sysdeps/loongarch/fpu/ftestexcept.c
@@ -0,0 +1,32 @@
+/* Test exception in current environment.
+   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/>.  */
+
+#include <fenv.h>
+#include <fpu_control.h>
+
+int
+fetestexcept (int excepts)
+{
+  int cw;
+
+  /* Get current control word.  */
+  _FPU_GETCW (cw);
+
+  return cw & excepts & FE_ALL_EXCEPT;
+}
+libm_hidden_def (fetestexcept)
diff --git a/sysdeps/loongarch/fpu/math-use-builtins-sqrt.h b/sysdeps/loongarch/fpu/math-use-builtins-sqrt.h
new file mode 100644
index 0000000000..e94c915ba6
--- /dev/null
+++ b/sysdeps/loongarch/fpu/math-use-builtins-sqrt.h
@@ -0,0 +1,4 @@
+#define USE_SQRT_BUILTIN 1
+#define USE_SQRTF_BUILTIN 1
+#define USE_SQRTL_BUILTIN 0
+#define USE_SQRTF128_BUILTIN 0
diff --git a/sysdeps/loongarch/lp64/libm-test-ulps b/sysdeps/loongarch/lp64/libm-test-ulps
new file mode 100644
index 0000000000..c7a9befa84
--- /dev/null
+++ b/sysdeps/loongarch/lp64/libm-test-ulps
@@ -0,0 +1,1412 @@
+# Begin of automatic generation
+
+# Maximal error of functions:
+Function: "acos":
+double: 1
+float: 1
+ldouble: 1
+
+Function: "acos_downward":
+double: 1
+float: 1
+ldouble: 1
+
+Function: "acos_towardzero":
+double: 1
+float: 1
+ldouble: 1
+
+Function: "acos_upward":
+double: 1
+float: 1
+ldouble: 1
+
+Function: "acosh":
+double: 2
+float: 2
+ldouble: 4
+
+Function: "acosh_downward":
+double: 2
+float: 2
+ldouble: 3
+
+Function: "acosh_towardzero":
+double: 2
+float: 2
+ldouble: 2
+
+Function: "acosh_upward":
+double: 2
+float: 2
+ldouble: 3
+
+Function: "asin":
+double: 1
+float: 1
+ldouble: 1
+
+Function: "asin_downward":
+double: 1
+float: 1
+ldouble: 2
+
+Function: "asin_towardzero":
+double: 1
+float: 1
+ldouble: 1
+
+Function: "asin_upward":
+double: 2
+float: 1
+ldouble: 2
+
+Function: "asinh":
+double: 2
+float: 2
+ldouble: 4
+
+Function: "asinh_downward":
+double: 3
+float: 3
+ldouble: 4
+
+Function: "asinh_towardzero":
+double: 2
+float: 2
+ldouble: 2
+
+Function: "asinh_upward":
+double: 3
+float: 3
+ldouble: 4
+
+Function: "atan":
+double: 1
+float: 1
+ldouble: 1
+
+Function: "atan2":
+float: 1
+ldouble: 2
+
+Function: "atan2_downward":
+double: 1
+float: 2
+ldouble: 2
+
+Function: "atan2_towardzero":
+double: 1
+float: 2
+ldouble: 3
+
+Function: "atan2_upward":
+double: 1
+float: 1
+ldouble: 2
+
+Function: "atan_downward":
+double: 1
+float: 2
+ldouble: 2
+
+Function: "atan_towardzero":
+double: 1
+float: 1
+ldouble: 1
+
+Function: "atan_upward":
+double: 1
+float: 2
+ldouble: 2
+
+Function: "atanh":
+double: 2
+float: 2
+ldouble: 4
+
+Function: "atanh_downward":
+double: 3
+float: 3
+ldouble: 4
+
+Function: "atanh_towardzero":
+double: 2
+float: 2
+ldouble: 2
+
+Function: "atanh_upward":
+double: 3
+float: 3
+ldouble: 4
+
+Function: "cabs":
+double: 1
+ldouble: 1
+
+Function: "cabs_downward":
+double: 1
+ldouble: 1
+
+Function: "cabs_towardzero":
+double: 1
+ldouble: 1
+
+Function: "cabs_upward":
+double: 1
+ldouble: 1
+
+Function: Real part of "cacos":
+double: 1
+float: 2
+ldouble: 2
+
+Function: Imaginary part of "cacos":
+double: 2
+float: 2
+ldouble: 2
+
+Function: Real part of "cacos_downward":
+double: 3
+float: 2
+ldouble: 3
+
+Function: Imaginary part of "cacos_downward":
+double: 5
+float: 3
+ldouble: 6
+
+Function: Real part of "cacos_towardzero":
+double: 3
+float: 2
+ldouble: 3
+
+Function: Imaginary part of "cacos_towardzero":
+double: 4
+float: 2
+ldouble: 5
+
+Function: Real part of "cacos_upward":
+double: 2
+float: 2
+ldouble: 3
+
+Function: Imaginary part of "cacos_upward":
+double: 5
+float: 5
+ldouble: 7
+
+Function: Real part of "cacosh":
+double: 2
+float: 2
+ldouble: 2
+
+Function: Imaginary part of "cacosh":
+double: 1
+float: 2
+ldouble: 2
+
+Function: Real part of "cacosh_downward":
+double: 4
+float: 2
+ldouble: 5
+
+Function: Imaginary part of "cacosh_downward":
+double: 3
+float: 3
+ldouble: 4
+
+Function: Real part of "cacosh_towardzero":
+double: 4
+float: 2
+ldouble: 5
+
+Function: Imaginary part of "cacosh_towardzero":
+double: 3
+float: 2
+ldouble: 3
+
+Function: Real part of "cacosh_upward":
+double: 4
+float: 3
+ldouble: 6
+
+Function: Imaginary part of "cacosh_upward":
+double: 3
+float: 2
+ldouble: 4
+
+Function: "carg":
+float: 1
+ldouble: 2
+
+Function: "carg_downward":
+double: 1
+float: 2
+ldouble: 2
+
+Function: "carg_towardzero":
+double: 1
+float: 2
+ldouble: 3
+
+Function: "carg_upward":
+double: 1
+float: 1
+ldouble: 2
+
+Function: Real part of "casin":
+double: 1
+float: 1
+ldouble: 2
+
+Function: Imaginary part of "casin":
+double: 2
+float: 2
+ldouble: 2
+
+Function: Real part of "casin_downward":
+double: 3
+float: 2
+ldouble: 3
+
+Function: Imaginary part of "casin_downward":
+double: 5
+float: 3
+ldouble: 6
+
+Function: Real part of "casin_towardzero":
+double: 3
+float: 1
+ldouble: 3
+
+Function: Imaginary part of "casin_towardzero":
+double: 4
+float: 2
+ldouble: 5
+
+Function: Real part of "casin_upward":
+double: 3
+float: 2
+ldouble: 3
+
+Function: Imaginary part of "casin_upward":
+double: 5
+float: 5
+ldouble: 7
+
+Function: Real part of "casinh":
+double: 2
+float: 2
+ldouble: 2
+
+Function: Imaginary part of "casinh":
+double: 1
+float: 1
+ldouble: 2
+
+Function: Real part of "casinh_downward":
+double: 5
+float: 3
+ldouble: 6
+
+Function: Imaginary part of "casinh_downward":
+double: 3
+float: 2
+ldouble: 3
+
+Function: Real part of "casinh_towardzero":
+double: 4
+float: 2
+ldouble: 5
+
+Function: Imaginary part of "casinh_towardzero":
+double: 3
+float: 1
+ldouble: 3
+
+Function: Real part of "casinh_upward":
+double: 5
+float: 5
+ldouble: 7
+
+Function: Imaginary part of "casinh_upward":
+double: 3
+float: 2
+ldouble: 3
+
+Function: Real part of "catan":
+double: 1
+float: 1
+ldouble: 1
+
+Function: Imaginary part of "catan":
+double: 1
+float: 1
+ldouble: 1
+
+Function: Real part of "catan_downward":
+double: 1
+float: 2
+ldouble: 2
+
+Function: Imaginary part of "catan_downward":
+double: 2
+float: 2
+ldouble: 2
+
+Function: Real part of "catan_towardzero":
+double: 1
+float: 2
+ldouble: 2
+
+Function: Imaginary part of "catan_towardzero":
+double: 2
+float: 2
+ldouble: 2
+
+Function: Real part of "catan_upward":
+double: 1
+float: 1
+ldouble: 2
+
+Function: Imaginary part of "catan_upward":
+double: 2
+float: 2
+ldouble: 3
+
+Function: Real part of "catanh":
+double: 1
+float: 1
+ldouble: 1
+
+Function: Imaginary part of "catanh":
+double: 1
+float: 1
+ldouble: 1
+
+Function: Real part of "catanh_downward":
+double: 2
+float: 2
+ldouble: 2
+
+Function: Imaginary part of "catanh_downward":
+double: 1
+float: 2
+ldouble: 2
+
+Function: Real part of "catanh_towardzero":
+double: 2
+float: 2
+ldouble: 2
+
+Function: Imaginary part of "catanh_towardzero":
+double: 1
+float: 2
+ldouble: 2
+
+Function: Real part of "catanh_upward":
+double: 4
+float: 4
+ldouble: 4
+
+Function: Imaginary part of "catanh_upward":
+double: 1
+float: 1
+ldouble: 2
+
+Function: "cbrt":
+double: 4
+float: 1
+ldouble: 1
+
+Function: "cbrt_downward":
+double: 4
+float: 1
+ldouble: 1
+
+Function: "cbrt_towardzero":
+double: 3
+float: 1
+ldouble: 1
+
+Function: "cbrt_upward":
+double: 5
+float: 1
+ldouble: 1
+
+Function: Real part of "ccos":
+double: 1
+float: 1
+ldouble: 1
+
+Function: Imaginary part of "ccos":
+double: 1
+float: 1
+ldouble: 1
+
+Function: Real part of "ccos_downward":
+double: 1
+float: 1
+ldouble: 2
+
+Function: Imaginary part of "ccos_downward":
+double: 3
+float: 3
+ldouble: 2
+
+Function: Real part of "ccos_towardzero":
+double: 1
+float: 2
+ldouble: 2
+
+Function: Imaginary part of "ccos_towardzero":
+double: 3
+float: 3
+ldouble: 2
+
+Function: Real part of "ccos_upward":
+double: 1
+float: 2
+ldouble: 3
+
+Function: Imaginary part of "ccos_upward":
+double: 2
+float: 2
+ldouble: 2
+
+Function: Real part of "ccosh":
+double: 1
+float: 1
+ldouble: 1
+
+Function: Imaginary part of "ccosh":
+double: 1
+float: 1
+ldouble: 1
+
+Function: Real part of "ccosh_downward":
+double: 2
+float: 2
+ldouble: 2
+
+Function: Imaginary part of "ccosh_downward":
+double: 3
+float: 3
+ldouble: 2
+
+Function: Real part of "ccosh_towardzero":
+double: 2
+float: 3
+ldouble: 2
+
+Function: Imaginary part of "ccosh_towardzero":
+double: 3
+float: 3
+ldouble: 2
+
+Function: Real part of "ccosh_upward":
+double: 1
+float: 2
+ldouble: 3
+
+Function: Imaginary part of "ccosh_upward":
+double: 2
+float: 2
+ldouble: 2
+
+Function: Real part of "cexp":
+double: 2
+float: 1
+ldouble: 1
+
+Function: Imaginary part of "cexp":
+double: 1
+float: 2
+ldouble: 1
+
+Function: Real part of "cexp_downward":
+double: 2
+float: 2
+ldouble: 2
+
+Function: Imaginary part of "cexp_downward":
+double: 3
+float: 3
+ldouble: 2
+
+Function: Real part of "cexp_towardzero":
+double: 2
+float: 2
+ldouble: 2
+
+Function: Imaginary part of "cexp_towardzero":
+double: 3
+float: 3
+ldouble: 2
+
+Function: Real part of "cexp_upward":
+double: 1
+float: 2
+ldouble: 3
+
+Function: Imaginary part of "cexp_upward":
+double: 3
+float: 2
+ldouble: 3
+
+Function: Real part of "clog":
+double: 3
+float: 3
+ldouble: 2
+
+Function: Imaginary part of "clog":
+double: 1
+float: 1
+ldouble: 1
+
+Function: Real part of "clog10":
+double: 3
+float: 4
+ldouble: 2
+
+Function: Imaginary part of "clog10":
+double: 2
+float: 2
+ldouble: 2
+
+Function: Real part of "clog10_downward":
+double: 5
+float: 5
+ldouble: 3
+
+Function: Imaginary part of "clog10_downward":
+double: 2
+float: 4
+ldouble: 3
+
+Function: Real part of "clog10_towardzero":
+double: 5
+float: 6
+ldouble: 4
+
+Function: Imaginary part of "clog10_towardzero":
+double: 2
+float: 4
+ldouble: 3
+
+Function: Real part of "clog10_upward":
+double: 6
+float: 5
+ldouble: 4
+
+Function: Imaginary part of "clog10_upward":
+double: 2
+float: 4
+ldouble: 3
+
+Function: Real part of "clog_downward":
+double: 4
+float: 3
+ldouble: 3
+
+Function: Imaginary part of "clog_downward":
+double: 1
+float: 2
+ldouble: 2
+
+Function: Real part of "clog_towardzero":
+double: 4
+float: 4
+ldouble: 3
+
+Function: Imaginary part of "clog_towardzero":
+double: 1
+float: 3
+ldouble: 2
+
+Function: Real part of "clog_upward":
+double: 4
+float: 3
+ldouble: 4
+
+Function: Imaginary part of "clog_upward":
+double: 1
+float: 2
+ldouble: 2
+
+Function: "cos":
+double: 1
+float: 1
+ldouble: 2
+
+Function: "cos_downward":
+double: 1
+float: 1
+ldouble: 3
+
+Function: "cos_towardzero":
+double: 1
+float: 1
+ldouble: 1
+
+Function: "cos_upward":
+double: 1
+float: 1
+ldouble: 2
+
+Function: "cosh":
+double: 2
+float: 2
+ldouble: 2
+
+Function: "cosh_downward":
+double: 3
+float: 1
+ldouble: 3
+
+Function: "cosh_towardzero":
+double: 3
+float: 1
+ldouble: 3
+
+Function: "cosh_upward":
+double: 2
+float: 2
+ldouble: 3
+
+Function: Real part of "cpow":
+double: 2
+float: 5
+ldouble: 4
+
+Function: Imaginary part of "cpow":
+float: 2
+ldouble: 1
+
+Function: Real part of "cpow_downward":
+double: 5
+float: 8
+ldouble: 6
+
+Function: Imaginary part of "cpow_downward":
+double: 1
+float: 2
+ldouble: 2
+
+Function: Real part of "cpow_towardzero":
+double: 5
+float: 8
+ldouble: 6
+
+Function: Imaginary part of "cpow_towardzero":
+double: 1
+float: 2
+ldouble: 2
+
+Function: Real part of "cpow_upward":
+double: 4
+float: 1
+ldouble: 3
+
+Function: Imaginary part of "cpow_upward":
+double: 1
+float: 2
+ldouble: 2
+
+Function: Real part of "csin":
+double: 1
+float: 1
+ldouble: 1
+
+Function: Imaginary part of "csin":
+ldouble: 1
+
+Function: Real part of "csin_downward":
+double: 3
+float: 3
+ldouble: 2
+
+Function: Imaginary part of "csin_downward":
+double: 1
+float: 1
+ldouble: 2
+
+Function: Real part of "csin_towardzero":
+double: 3
+float: 3
+ldouble: 2
+
+Function: Imaginary part of "csin_towardzero":
+double: 1
+float: 1
+ldouble: 2
+
+Function: Real part of "csin_upward":
+double: 2
+float: 2
+ldouble: 2
+
+Function: Imaginary part of "csin_upward":
+double: 1
+float: 2
+ldouble: 3
+
+Function: Real part of "csinh":
+float: 1
+ldouble: 1
+
+Function: Imaginary part of "csinh":
+double: 1
+float: 1
+ldouble: 1
+
+Function: Real part of "csinh_downward":
+double: 2
+float: 1
+ldouble: 2
+
+Function: Imaginary part of "csinh_downward":
+double: 3
+float: 3
+ldouble: 2
+
+Function: Real part of "csinh_towardzero":
+double: 2
+float: 2
+ldouble: 2
+
+Function: Imaginary part of "csinh_towardzero":
+double: 3
+float: 3
+ldouble: 2
+
+Function: Real part of "csinh_upward":
+double: 1
+float: 2
+ldouble: 3
+
+Function: Imaginary part of "csinh_upward":
+double: 2
+float: 2
+ldouble: 2
+
+Function: Real part of "csqrt":
+double: 2
+float: 2
+ldouble: 2
+
+Function: Imaginary part of "csqrt":
+double: 2
+float: 2
+ldouble: 2
+
+Function: Real part of "csqrt_downward":
+double: 5
+float: 4
+ldouble: 4
+
+Function: Imaginary part of "csqrt_downward":
+double: 4
+float: 3
+ldouble: 3
+
+Function: Real part of "csqrt_towardzero":
+double: 4
+float: 3
+ldouble: 3
+
+Function: Imaginary part of "csqrt_towardzero":
+double: 4
+float: 3
+ldouble: 3
+
+Function: Real part of "csqrt_upward":
+double: 5
+float: 4
+ldouble: 4
+
+Function: Imaginary part of "csqrt_upward":
+double: 3
+float: 3
+ldouble: 3
+
+Function: Real part of "ctan":
+double: 2
+float: 1
+ldouble: 3
+
+Function: Imaginary part of "ctan":
+double: 2
+float: 2
+ldouble: 3
+
+Function: Real part of "ctan_downward":
+double: 6
+float: 5
+ldouble: 4
+
+Function: Imaginary part of "ctan_downward":
+double: 2
+float: 2
+ldouble: 5
+
+Function: Real part of "ctan_towardzero":
+double: 5
+float: 2
+ldouble: 4
+
+Function: Imaginary part of "ctan_towardzero":
+double: 2
+float: 2
+ldouble: 5
+
+Function: Real part of "ctan_upward":
+double: 2
+float: 4
+ldouble: 5
+
+Function: Imaginary part of "ctan_upward":
+double: 2
+float: 2
+ldouble: 5
+
+Function: Real part of "ctanh":
+double: 2
+float: 2
+ldouble: 3
+
+Function: Imaginary part of "ctanh":
+double: 2
+float: 1
+ldouble: 3
+
+Function: Real part of "ctanh_downward":
+double: 4
+float: 2
+ldouble: 5
+
+Function: Imaginary part of "ctanh_downward":
+double: 6
+float: 5
+ldouble: 4
+
+Function: Real part of "ctanh_towardzero":
+double: 2
+float: 2
+ldouble: 5
+
+Function: Imaginary part of "ctanh_towardzero":
+double: 5
+float: 2
+ldouble: 3
+
+Function: Real part of "ctanh_upward":
+double: 2
+float: 2
+ldouble: 5
+
+Function: Imaginary part of "ctanh_upward":
+double: 2
+float: 3
+ldouble: 5
+
+Function: "erf":
+double: 1
+float: 1
+ldouble: 1
+
+Function: "erf_downward":
+double: 1
+float: 1
+ldouble: 2
+
+Function: "erf_towardzero":
+double: 1
+float: 1
+ldouble: 1
+
+Function: "erf_upward":
+double: 1
+float: 1
+ldouble: 2
+
+Function: "erfc":
+double: 2
+float: 2
+ldouble: 4
+
+Function: "erfc_downward":
+double: 4
+float: 4
+ldouble: 5
+
+Function: "erfc_towardzero":
+double: 3
+float: 3
+ldouble: 4
+
+Function: "erfc_upward":
+double: 4
+float: 4
+ldouble: 5
+
+Function: "exp":
+double: 1
+float: 1
+ldouble: 1
+
+Function: "exp10":
+double: 2
+ldouble: 2
+
+Function: "exp10_downward":
+double: 3
+float: 1
+ldouble: 3
+
+Function: "exp10_towardzero":
+double: 3
+float: 1
+ldouble: 3
+
+Function: "exp10_upward":
+double: 2
+float: 1
+ldouble: 3
+
+Function: "exp2":
+double: 1
+ldouble: 1
+
+Function: "exp2_downward":
+double: 1
+ldouble: 1
+
+Function: "exp2_towardzero":
+double: 1
+ldouble: 1
+
+Function: "exp2_upward":
+double: 1
+float: 1
+ldouble: 2
+
+Function: "exp_downward":
+double: 1
+float: 1
+
+Function: "exp_towardzero":
+double: 1
+float: 1
+
+Function: "exp_upward":
+double: 1
+float: 1
+
+Function: "expm1":
+double: 1
+float: 1
+ldouble: 2
+
+Function: "expm1_downward":
+double: 1
+float: 1
+ldouble: 2
+
+Function: "expm1_towardzero":
+double: 1
+float: 2
+ldouble: 4
+
+Function: "expm1_upward":
+double: 1
+float: 1
+ldouble: 3
+
+Function: "gamma":
+double: 3
+float: 3
+ldouble: 5
+
+Function: "gamma_downward":
+double: 4
+float: 4
+ldouble: 8
+
+Function: "gamma_towardzero":
+double: 4
+float: 3
+ldouble: 5
+
+Function: "gamma_upward":
+double: 4
+float: 5
+ldouble: 8
+
+Function: "hypot":
+double: 1
+ldouble: 1
+
+Function: "hypot_downward":
+double: 1
+ldouble: 1
+
+Function: "hypot_towardzero":
+double: 1
+ldouble: 1
+
+Function: "hypot_upward":
+double: 1
+ldouble: 1
+
+Function: "j0":
+double: 3
+float: 9
+ldouble: 2
+
+Function: "j0_downward":
+double: 6
+float: 9
+ldouble: 9
+
+Function: "j0_towardzero":
+double: 7
+float: 9
+ldouble: 9
+
+Function: "j0_upward":
+double: 9
+float: 9
+ldouble: 7
+
+Function: "j1":
+double: 4
+float: 9
+ldouble: 4
+
+Function: "j1_downward":
+double: 3
+float: 8
+ldouble: 4
+
+Function: "j1_towardzero":
+double: 4
+float: 8
+ldouble: 4
+
+Function: "j1_upward":
+double: 9
+float: 9
+ldouble: 3
+
+Function: "jn":
+double: 4
+float: 4
+ldouble: 7
+
+Function: "jn_downward":
+double: 4
+float: 5
+ldouble: 8
+
+Function: "jn_towardzero":
+double: 4
+float: 5
+ldouble: 8
+
+Function: "jn_upward":
+double: 5
+float: 4
+ldouble: 7
+
+Function: "lgamma":
+double: 3
+float: 3
+ldouble: 5
+
+Function: "lgamma_downward":
+double: 4
+float: 4
+ldouble: 8
+
+Function: "lgamma_towardzero":
+double: 4
+float: 3
+ldouble: 5
+
+Function: "lgamma_upward":
+double: 4
+float: 5
+ldouble: 8
+
+Function: "log":
+double: 1
+ldouble: 1
+
+Function: "log10":
+double: 2
+float: 2
+ldouble: 2
+
+Function: "log10_downward":
+double: 2
+float: 3
+ldouble: 1
+
+Function: "log10_towardzero":
+double: 2
+float: 1
+ldouble: 1
+
+Function: "log10_upward":
+double: 2
+float: 2
+ldouble: 1
+
+Function: "log1p":
+double: 1
+float: 1
+ldouble: 3
+
+Function: "log1p_downward":
+double: 1
+float: 2
+ldouble: 3
+
+Function: "log1p_towardzero":
+double: 2
+float: 2
+ldouble: 3
+
+Function: "log1p_upward":
+double: 2
+float: 2
+ldouble: 2
+
+Function: "log2":
+double: 1
+float: 1
+ldouble: 3
+
+Function: "log2_downward":
+double: 3
+ldouble: 3
+
+Function: "log2_towardzero":
+double: 2
+ldouble: 1
+
+Function: "log2_upward":
+double: 3
+ldouble: 1
+
+Function: "log_downward":
+ldouble: 1
+
+Function: "log_towardzero":
+ldouble: 2
+
+Function: "log_upward":
+double: 1
+ldouble: 2
+
+Function: "pow":
+double: 1
+ldouble: 2
+
+Function: "pow_downward":
+double: 1
+float: 1
+ldouble: 2
+
+Function: "pow_towardzero":
+double: 1
+float: 1
+ldouble: 2
+
+Function: "pow_upward":
+double: 1
+float: 1
+ldouble: 2
+
+Function: "sin":
+double: 1
+float: 1
+ldouble: 2
+
+Function: "sin_downward":
+double: 1
+float: 1
+ldouble: 3
+
+Function: "sin_towardzero":
+double: 1
+float: 1
+ldouble: 2
+
+Function: "sin_upward":
+double: 1
+float: 1
+ldouble: 3
+
+Function: "sincos":
+double: 1
+ldouble: 1
+
+Function: "sincos_downward":
+double: 1
+float: 1
+ldouble: 3
+
+Function: "sincos_towardzero":
+double: 1
+float: 1
+ldouble: 2
+
+Function: "sincos_upward":
+double: 1
+float: 1
+ldouble: 3
+
+Function: "sinh":
+double: 2
+float: 2
+ldouble: 2
+
+Function: "sinh_downward":
+double: 3
+float: 3
+ldouble: 3
+
+Function: "sinh_towardzero":
+double: 3
+float: 2
+ldouble: 3
+
+Function: "sinh_upward":
+double: 3
+float: 3
+ldouble: 4
+
+Function: "tan":
+double: 1
+float: 1
+ldouble: 1
+
+Function: "tan_downward":
+double: 1
+float: 2
+ldouble: 1
+
+Function: "tan_towardzero":
+double: 1
+float: 1
+ldouble: 1
+
+Function: "tan_upward":
+double: 1
+float: 1
+ldouble: 1
+
+Function: "tanh":
+double: 2
+float: 2
+ldouble: 2
+
+Function: "tanh_downward":
+double: 3
+float: 3
+ldouble: 4
+
+Function: "tanh_towardzero":
+double: 2
+float: 2
+ldouble: 3
+
+Function: "tanh_upward":
+double: 3
+float: 3
+ldouble: 3
+
+Function: "tgamma":
+double: 9
+float: 8
+ldouble: 4
+
+Function: "tgamma_downward":
+double: 9
+float: 7
+ldouble: 5
+
+Function: "tgamma_towardzero":
+double: 9
+float: 7
+ldouble: 5
+
+Function: "tgamma_upward":
+double: 9
+float: 8
+ldouble: 4
+
+Function: "y0":
+double: 2
+float: 8
+ldouble: 3
+
+Function: "y0_downward":
+double: 3
+float: 8
+ldouble: 7
+
+Function: "y0_towardzero":
+double: 3
+float: 8
+ldouble: 3
+
+Function: "y0_upward":
+double: 2
+float: 8
+ldouble: 4
+
+Function: "y1":
+double: 3
+float: 9
+ldouble: 5
+
+Function: "y1_downward":
+double: 6
+float: 8
+ldouble: 5
+
+Function: "y1_towardzero":
+double: 3
+float: 9
+ldouble: 2
+
+Function: "y1_upward":
+double: 6
+float: 9
+ldouble: 5
+
+Function: "yn":
+double: 3
+float: 3
+ldouble: 5
+
+Function: "yn_downward":
+double: 3
+float: 4
+ldouble: 5
+
+Function: "yn_towardzero":
+double: 3
+float: 3
+ldouble: 5
+
+Function: "yn_upward":
+double: 4
+float: 5
+ldouble: 5
+
+# end of automatic generation
diff --git a/sysdeps/loongarch/lp64/libm-test-ulps-name b/sysdeps/loongarch/lp64/libm-test-ulps-name
new file mode 100644
index 0000000000..ce02281eab
--- /dev/null
+++ b/sysdeps/loongarch/lp64/libm-test-ulps-name
@@ -0,0 +1 @@
+LoongArch 64-bit
diff --git a/sysdeps/loongarch/math_private.h b/sysdeps/loongarch/math_private.h
new file mode 100644
index 0000000000..cdf26a78dd
--- /dev/null
+++ b/sysdeps/loongarch/math_private.h
@@ -0,0 +1,248 @@
+/* Internal math stuff.
+   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 LOONGARCH_MATH_PRIVATE_H
+#define LOONGARCH_MATH_PRIVATE_H 1
+
+/* Inline functions to speed up the math library implementation.  The
+   default versions of these routines are in generic/math_private.h
+   and call fesetround, feholdexcept, etc.  These routines use inlined
+   code instead.  */
+
+#ifdef __loongarch_hard_float
+
+#include <fenv.h>
+#include <fenv_libc.h>
+#include <fpu_control.h>
+
+#define _FPU_MASK_ALL \
+  (_FPU_MASK_V | _FPU_MASK_Z | _FPU_MASK_O | _FPU_MASK_U | _FPU_MASK_I \
+   | FE_ALL_EXCEPT)
+
+static __always_inline void
+libc_feholdexcept_loongarch (fenv_t *envp)
+{
+  fpu_control_t cw;
+
+  /* Save the current state.  */
+  _FPU_GETCW (cw);
+  envp->__fp_control_register = cw;
+
+  /* Clear all exception enable bits and flags.  */
+  cw &= ~(_FPU_MASK_ALL);
+  _FPU_SETCW (cw);
+}
+#define libc_feholdexcept libc_feholdexcept_loongarch
+#define libc_feholdexceptf libc_feholdexcept_loongarch
+#define libc_feholdexceptl libc_feholdexcept_loongarch
+
+static __always_inline void
+libc_fesetround_loongarch (int round)
+{
+  fpu_control_t cw;
+
+  /* Get current state.  */
+  _FPU_GETCW (cw);
+
+  /* Set rounding bits.  */
+  cw &= ~_FPU_RC_MASK;
+  cw |= round;
+
+  /* Set new state.  */
+  _FPU_SETCW (cw);
+}
+#define libc_fesetround libc_fesetround_loongarch
+#define libc_fesetroundf libc_fesetround_loongarch
+#define libc_fesetroundl libc_fesetround_loongarch
+
+static __always_inline void
+libc_feholdexcept_setround_loongarch (fenv_t *envp, int round)
+{
+  fpu_control_t cw;
+
+  /* Save the current state.  */
+  _FPU_GETCW (cw);
+  envp->__fp_control_register = cw;
+
+  /* Clear all exception enable bits and flags.  */
+  cw &= ~(_FPU_MASK_ALL);
+
+  /* Set rounding bits.  */
+  cw &= ~_FPU_RC_MASK;
+  cw |= round;
+
+  /* Set new state.  */
+  _FPU_SETCW (cw);
+}
+#define libc_feholdexcept_setround libc_feholdexcept_setround_loongarch
+#define libc_feholdexcept_setroundf libc_feholdexcept_setround_loongarch
+#define libc_feholdexcept_setroundl libc_feholdexcept_setround_loongarch
+
+#define libc_feholdsetround libc_feholdexcept_setround_loongarch
+#define libc_feholdsetroundf libc_feholdexcept_setround_loongarch
+#define libc_feholdsetroundl libc_feholdexcept_setround_loongarch
+
+static __always_inline void
+libc_fesetenv_loongarch (fenv_t *envp)
+{
+  fpu_control_t cw __attribute__ ((unused));
+
+  /* Read current state to flush fpu pipeline.  */
+  _FPU_GETCW (cw);
+
+  _FPU_SETCW (envp->__fp_control_register);
+}
+#define libc_fesetenv libc_fesetenv_loongarch
+#define libc_fesetenvf libc_fesetenv_loongarch
+#define libc_fesetenvl libc_fesetenv_loongarch
+
+static __always_inline int
+libc_feupdateenv_test_loongarch (fenv_t *envp, int excepts)
+{
+  /* int ret = fetestexcept (excepts); feupdateenv (envp); return ret; */
+  int cw, temp;
+
+  /* Get current control word.  */
+  _FPU_GETCW (cw);
+
+  /* Set flag bits (which are accumulative), and *also* set the
+     cause bits.  The setting of the cause bits is what actually causes
+     the hardware to generate the exception, if the corresponding enable
+     bit is set as well.  */
+  temp = cw & FE_ALL_EXCEPT;
+  temp |= envp->__fp_control_register | (temp << CAUSE_SHIFT);
+
+  /* Set new state.  */
+  _FPU_SETCW (temp);
+
+  return cw & excepts & FE_ALL_EXCEPT;
+}
+#define libc_feupdateenv_test libc_feupdateenv_test_loongarch
+#define libc_feupdateenv_testf libc_feupdateenv_test_loongarch
+#define libc_feupdateenv_testl libc_feupdateenv_test_loongarch
+
+static __always_inline void
+libc_feupdateenv_loongarch (fenv_t *envp)
+{
+  libc_feupdateenv_test_loongarch (envp, 0);
+}
+#define libc_feupdateenv libc_feupdateenv_loongarch
+#define libc_feupdateenvf libc_feupdateenv_loongarch
+#define libc_feupdateenvl libc_feupdateenv_loongarch
+
+#define libc_feresetround libc_feupdateenv_loongarch
+#define libc_feresetroundf libc_feupdateenv_loongarch
+#define libc_feresetroundl libc_feupdateenv_loongarch
+
+static __always_inline int
+libc_fetestexcept_loongarch (int excepts)
+{
+  int cw;
+
+  /* Get current control word.  */
+  _FPU_GETCW (cw);
+
+  return cw & excepts & FE_ALL_EXCEPT;
+}
+#define libc_fetestexcept libc_fetestexcept_loongarch
+#define libc_fetestexceptf libc_fetestexcept_loongarch
+#define libc_fetestexceptl libc_fetestexcept_loongarch
+
+/*  Enable support for rounding mode context.  */
+#define HAVE_RM_CTX 1
+
+static __always_inline void
+libc_feholdexcept_setround_loongarch_ctx (struct rm_ctx *ctx, int round)
+{
+  fpu_control_t old, new;
+
+  /* Save the current state.  */
+  _FPU_GETCW (old);
+  ctx->env.__fp_control_register = old;
+
+  /* Clear all exception enable bits and flags.  */
+  new = old & ~(_FPU_MASK_ALL);
+
+  /* Set rounding bits.  */
+  new = (new & ~_FPU_RC_MASK) | round;
+
+  if (__glibc_unlikely (new != old))
+    {
+      _FPU_SETCW (new);
+      ctx->updated_status = true;
+    }
+  else
+    ctx->updated_status = false;
+}
+#define libc_feholdexcept_setround_ctx libc_feholdexcept_setround_loongarch_ctx
+#define libc_feholdexcept_setroundf_ctx \
+  libc_feholdexcept_setround_loongarch_ctx
+#define libc_feholdexcept_setroundl_ctx \
+  libc_feholdexcept_setround_loongarch_ctx
+
+static __always_inline void
+libc_fesetenv_loongarch_ctx (struct rm_ctx *ctx)
+{
+  libc_fesetenv_loongarch (&ctx->env);
+}
+#define libc_fesetenv_ctx libc_fesetenv_loongarch_ctx
+#define libc_fesetenvf_ctx libc_fesetenv_loongarch_ctx
+#define libc_fesetenvl_ctx libc_fesetenv_loongarch_ctx
+
+static __always_inline void
+libc_feupdateenv_loongarch_ctx (struct rm_ctx *ctx)
+{
+  if (__glibc_unlikely (ctx->updated_status))
+    libc_feupdateenv_test_loongarch (&ctx->env, 0);
+}
+#define libc_feupdateenv_ctx libc_feupdateenv_loongarch_ctx
+#define libc_feupdateenvf_ctx libc_feupdateenv_loongarch_ctx
+#define libc_feupdateenvl_ctx libc_feupdateenv_loongarch_ctx
+#define libc_feresetround_ctx libc_feupdateenv_loongarch_ctx
+#define libc_feresetroundf_ctx libc_feupdateenv_loongarch_ctx
+#define libc_feresetroundl_ctx libc_feupdateenv_loongarch_ctx
+
+static __always_inline void
+libc_feholdsetround_loongarch_ctx (struct rm_ctx *ctx, int round)
+{
+  fpu_control_t old, new;
+
+  /* Save the current state.  */
+  _FPU_GETCW (old);
+  ctx->env.__fp_control_register = old;
+
+  /* Set rounding bits.  */
+  new = (old & ~_FPU_RC_MASK) | round;
+
+  if (__glibc_unlikely (new != old))
+    {
+      _FPU_SETCW (new);
+      ctx->updated_status = true;
+    }
+  else
+    ctx->updated_status = false;
+}
+#define libc_feholdsetround_ctx libc_feholdsetround_loongarch_ctx
+#define libc_feholdsetroundf_ctx libc_feholdsetround_loongarch_ctx
+#define libc_feholdsetroundl_ctx libc_feholdsetround_loongarch_ctx
+
+#endif
+
+#include_next <math_private.h>
+
+#endif
-- 
2.20.1


^ permalink raw reply	[flat|nested] 21+ messages in thread

* [PATCH v3 13/13] LoongArch: Update build-many-glibcs.py for the LoongArch Port.
  2022-04-15  1:31 [PATCH v3 00/13] GLIBC LoongArch PATCHES caiyinyu
                   ` (11 preceding siblings ...)
  2022-04-15  1:31 ` [PATCH v3 12/13] LoongArch: Hard Float Support caiyinyu
@ 2022-04-15  1:31 ` caiyinyu
  12 siblings, 0 replies; 21+ messages in thread
From: caiyinyu @ 2022-04-15  1:31 UTC (permalink / raw)
  To: libc-alpha, adhemerval.zanella; +Cc: joseph_myers, xuchenghua, caiyinyu

---
 scripts/build-many-glibcs.py | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/scripts/build-many-glibcs.py b/scripts/build-many-glibcs.py
index 1fd616d4c0..89456bc8a6 100755
--- a/scripts/build-many-glibcs.py
+++ b/scripts/build-many-glibcs.py
@@ -218,6 +218,10 @@ class Context(object):
                         os_name='linux-gnu',
                         first_gcc_cfg=['--with-system-libunwind'],
                         binutils_cfg=['--enable-obsolete'])
+        self.add_config(arch='loongarch64',
+                        os_name='linux-gnu',
+                        variant='hard',
+                        gcc_cfg=['--with-abi=lp64d','--disable-multilib'])
         self.add_config(arch='m68k',
                         os_name='linux-gnu',
                         gcc_cfg=['--disable-multilib'])
@@ -1271,6 +1275,7 @@ def install_linux_headers(policy, cmdlist):
                 'i686': 'x86',
                 'i786': 'x86',
                 'ia64': 'ia64',
+                'loongarch64': 'loongarch',
                 'm68k': 'm68k',
                 'microblaze': 'microblaze',
                 'mips': 'mips',
-- 
2.20.1


^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [PATCH v3 01/13] LoongArch: Update NEWS and README for the LoongArch port.
  2022-04-15  1:31 ` [PATCH v3 01/13] LoongArch: Update NEWS and README for the LoongArch port caiyinyu
@ 2022-04-19 20:06   ` Joseph Myers
  2022-05-09  2:26     ` caiyinyu
  0 siblings, 1 reply; 21+ messages in thread
From: Joseph Myers @ 2022-04-19 20:06 UTC (permalink / raw)
  To: caiyinyu; +Cc: libc-alpha, adhemerval.zanella, xuchenghua

On Fri, 15 Apr 2022, caiyinyu wrote:

> --- a/NEWS
> +++ b/NEWS
> @@ -35,6 +35,15 @@ Version 2.35
>  
>  Major new features:
>  
> +* Support for LoongArch running on Linux has been added.  This port requires
> +  as least binutils 2.38, GCC 12, and Linux 10.0.0.  Currently only hard-float
> +  ABI is supported:
> +
> +    - loongarch64-linux-gnu
> +
> +  The LoongArch ABI is 64-bit little-endian and uses 64-bit time (y2038 safe) and
> +  64-bit file offsets (LFS default).

This now needs to go in the NEWS section for 2.36, not 2.35.

-- 
Joseph S. Myers
joseph@codesourcery.com

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [PATCH v3 01/13] LoongArch: Update NEWS and README for the LoongArch port.
  2022-04-19 20:06   ` Joseph Myers
@ 2022-05-09  2:26     ` caiyinyu
  0 siblings, 0 replies; 21+ messages in thread
From: caiyinyu @ 2022-05-09  2:26 UTC (permalink / raw)
  To: Joseph Myers; +Cc: libc-alpha, adhemerval.zanella, xuchenghua


在 2022/4/20 上午4:06, Joseph Myers 写道:
> On Fri, 15 Apr 2022, caiyinyu wrote:
>
>> --- a/NEWS
>> +++ b/NEWS
>> @@ -35,6 +35,15 @@ Version 2.35
>>   
>>   Major new features:
>>   
>> +* Support for LoongArch running on Linux has been added.  This port requires
>> +  as least binutils 2.38, GCC 12, and Linux 10.0.0.  Currently only hard-float
>> +  ABI is supported:
>> +
>> +    - loongarch64-linux-gnu
>> +
>> +  The LoongArch ABI is 64-bit little-endian and uses 64-bit time (y2038 safe) and
>> +  64-bit file offsets (LFS default).
> This now needs to go in the NEWS section for 2.36, not 2.35.
>
Fixed.


^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [PATCH v3 00/13] GLIBC LoongArch PATCHES
  2022-05-11  6:57   ` Arnd Bergmann
@ 2022-05-11 13:17     ` Adhemerval Zanella
  0 siblings, 0 replies; 21+ messages in thread
From: Adhemerval Zanella @ 2022-05-11 13:17 UTC (permalink / raw)
  To: libc-alpha



On 11/05/2022 03:57, Arnd Bergmann wrote:
> On Tue, May 10, 2022 at 9:37 PM Florian Weimer via Libc-alpha
> <libc-alpha@sourceware.org> wrote:
>>
>>> GCC and Binutils Loongarch parts have been into GNU Open Source community.
>>> Loongarch kernal may be no problem on 5.19:
>>
>> It seems that the Linux 5.19 release date could be really close to the
>> glibc 2.36 release date, or even after it.  I think we wouldn't want to
>> release with an ABI whose kernel interface is not in a mainline kernel
>> yet.
>>
>> We have the option to backdate ABIs, so we could release the port with a
>> GLIBC_2.36 ABI baseline in glibc 2.37.
>>
>> Or we could merge the port now, and back it out once more if Linux 5.19
>> does not get released in time.
>>
>> Maybe it's sufficient if the Linux port makes it to mainline during the
>> 5.19 rc phase?
>>
>> Thoughts?
> 
> From the kernel side, there is only one open question on the ABI:
> either this will include both clone() and clone3(), or just clone3().
> 
> This is a surprisingly hard decision. Normally the policy in the kernel
> is that new architectures only get the latest syscall interface, dropping
> earlier syscalls in favor of backward-compatible new interfaces.
> 
> For clone3(), this may not work out because
> - clone3 requires knowing the stack frame size for the child, but
>   when emulating clone() in libc, that information may not be there.
>   We need to work around this by allowing clone3 to be called without
>   a size argument

The clone is used internally without a stack only for fork
(sysdeps/unix/sysv/linux/arch-fork.h) and loongarch seems to be using
__ASSUME_CLONE_DEFAULT and exporting __NR_clone as a distinct syscall
(220).

> - some other architectures still don't implement clone3() since we
>   are missing the assembly bits for it. So unlike the other recently
>   added calls, there is no minimum kernel version that guarantees clone3
>   to be available.

If I understood correctly, Intel has added clone3 support on glibc mainly
to implement full CET (since it required stack size).  As far as I know
there is no pressing requirement to use clone3 internally, neither to
export as we did for clone; besides to support an new ABI that only 
defines clone3.

> - the seccomp/bfp infrastructure in the kernel cannot currently
>   introspect indirect syscall arguments. This has to be added at
>   some point anyway, but until then the chrome sandbox disallows
>   the clone3 syscall.
> 
> The easy way out of course is to include both in the kernel, though
> this feels like taking a step backwards. If libc developers feel strongly
> either way, please also reply on the kernel thread so we can come
> to a consensus more quickly.

I think if kernel allows fork like call for clone3, where if no starting
function is set there is no need for stack or stack size; we can adapt
internally fork to use __clone_internal (which first try to use clone3
and then fallbacks to clone).

Even for x86_64 and i686, clone3 is not used for fork (only for
pthread_create and posix_spawn).

> 
> There is still another open discussion that blocks merging the
> loongarch kernel port, but that is only for the bootloader and not
> visible to libc. We should merge it as soon as we have concluded
> both points, but it's unclear if that happens before the merge
> window.
> 
>       Arnd

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [PATCH v3 00/13] GLIBC LoongArch PATCHES
  2022-05-10 19:37 ` Florian Weimer
  2022-05-10 20:33   ` Joseph Myers
@ 2022-05-11  6:57   ` Arnd Bergmann
  2022-05-11 13:17     ` Adhemerval Zanella
  1 sibling, 1 reply; 21+ messages in thread
From: Arnd Bergmann @ 2022-05-11  6:57 UTC (permalink / raw)
  To: Florian Weimer; +Cc: caiyinyu, xuchenghua, joseph_myers, GNU C Library

On Tue, May 10, 2022 at 9:37 PM Florian Weimer via Libc-alpha
<libc-alpha@sourceware.org> wrote:
>
> > GCC and Binutils Loongarch parts have been into GNU Open Source community.
> > Loongarch kernal may be no problem on 5.19:
>
> It seems that the Linux 5.19 release date could be really close to the
> glibc 2.36 release date, or even after it.  I think we wouldn't want to
> release with an ABI whose kernel interface is not in a mainline kernel
> yet.
>
> We have the option to backdate ABIs, so we could release the port with a
> GLIBC_2.36 ABI baseline in glibc 2.37.
>
> Or we could merge the port now, and back it out once more if Linux 5.19
> does not get released in time.
>
> Maybe it's sufficient if the Linux port makes it to mainline during the
> 5.19 rc phase?
>
> Thoughts?

From the kernel side, there is only one open question on the ABI:
either this will include both clone() and clone3(), or just clone3().

This is a surprisingly hard decision. Normally the policy in the kernel
is that new architectures only get the latest syscall interface, dropping
earlier syscalls in favor of backward-compatible new interfaces.

For clone3(), this may not work out because
- clone3 requires knowing the stack frame size for the child, but
  when emulating clone() in libc, that information may not be there.
  We need to work around this by allowing clone3 to be called without
  a size argument
- some other architectures still don't implement clone3() since we
  are missing the assembly bits for it. So unlike the other recently
  added calls, there is no minimum kernel version that guarantees clone3
  to be available.
- the seccomp/bfp infrastructure in the kernel cannot currently
  introspect indirect syscall arguments. This has to be added at
  some point anyway, but until then the chrome sandbox disallows
  the clone3 syscall.

The easy way out of course is to include both in the kernel, though
this feels like taking a step backwards. If libc developers feel strongly
either way, please also reply on the kernel thread so we can come
to a consensus more quickly.

There is still another open discussion that blocks merging the
loongarch kernel port, but that is only for the bootloader and not
visible to libc. We should merge it as soon as we have concluded
both points, but it's unclear if that happens before the merge
window.

      Arnd

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [PATCH v3 00/13] GLIBC LoongArch PATCHES
  2022-05-10 19:37 ` Florian Weimer
@ 2022-05-10 20:33   ` Joseph Myers
  2022-05-11  6:57   ` Arnd Bergmann
  1 sibling, 0 replies; 21+ messages in thread
From: Joseph Myers @ 2022-05-10 20:33 UTC (permalink / raw)
  To: Florian Weimer; +Cc: caiyinyu, xuchenghua, libc-alpha

On Tue, 10 May 2022, Florian Weimer via Libc-alpha wrote:

> Maybe it's sufficient if the Linux port makes it to mainline during the
> 5.19 rc phase?

I think having the port in Linus's tree, but not yet in a release, ought 
to be sufficient.

-- 
Joseph S. Myers
joseph@codesourcery.com

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [PATCH v3 00/13] GLIBC LoongArch PATCHES
  2022-05-09  2:25 [PATCH v3 00/13] GLIBC LoongArch PATCHES caiyinyu
@ 2022-05-10 19:37 ` Florian Weimer
  2022-05-10 20:33   ` Joseph Myers
  2022-05-11  6:57   ` Arnd Bergmann
  0 siblings, 2 replies; 21+ messages in thread
From: Florian Weimer @ 2022-05-10 19:37 UTC (permalink / raw)
  To: caiyinyu; +Cc: libc-alpha, xuchenghua, joseph_myers

> GCC and Binutils Loongarch parts have been into GNU Open Source community.
> Loongarch kernal may be no problem on 5.19:

It seems that the Linux 5.19 release date could be really close to the
glibc 2.36 release date, or even after it.  I think we wouldn't want to
release with an ABI whose kernel interface is not in a mainline kernel
yet.

We have the option to backdate ABIs, so we could release the port with a
GLIBC_2.36 ABI baseline in glibc 2.37.

Or we could merge the port now, and back it out once more if Linux 5.19
does not get released in time.

Maybe it's sufficient if the Linux port makes it to mainline during the
5.19 rc phase?

Thoughts?

Thanks,
Florian


^ permalink raw reply	[flat|nested] 21+ messages in thread

* [PATCH v3 00/13] GLIBC LoongArch PATCHES
@ 2022-05-09  2:25 caiyinyu
  2022-05-10 19:37 ` Florian Weimer
  0 siblings, 1 reply; 21+ messages in thread
From: caiyinyu @ 2022-05-09  2:25 UTC (permalink / raw)
  To: libc-alpha; +Cc: joseph_myers, xuchenghua, caiyinyu, adhemerval.zanella

Hello, these are LoongArch patches v4, and we really need your futher suggestions:

HISTORY:
LoongArch patches v1: https://sourceware.org/pipermail/libc-alpha/2021-August/130262.html
LoongArch patches v2: https://sourceware.org/pipermail/libc-alpha/2021-December/134811.html
LoongArch patches v3: https://sourceware.org/pipermail/libc-alpha/2022-April/137888.html

LoongArch-Doc:  https://github.com/loongson/LoongArch-Documentation

We add new section: procedure calling convention.
https://loongson.github.io/LoongArch-Documentation/LoongArch-ELF-ABI-EN.html#_procedure_calling_convention

Source code:
linux:		https://github.com/loongson/linux/tree/loongarch-next
glibc:		https://github.com/loongson/glibc/tree/loongarch_2_36_upstream_v4

GCC and Binutils Loongarch parts have been into GNU Open Source community.
Loongarch kernal may be no problem on 5.19:
https://lore.kernel.org/linux-arch/20220319142759.1026237-1-chenhuacai@loongson.cn/T/#m9d06c1882053c313ced32eaddda61e2514c712e8
---------------------------------------------------------------------------
* Re: [PATCH V8 00/22] arch: Add basic LoongArch support
  2022-03-21 21:55     ` Arnd Bergmann
@ 2022-03-21 22:03       ` Linus Torvalds
  0 siblings, 0 replies; 46+ messages in thread
From: Linus Torvalds @ 2022-03-21 22:03 UTC (permalink / raw)
  To: Arnd Bergmann
  Cc: Huacai Chen, Andy Lutomirski, Thomas Gleixner, Peter Zijlstra,
	Andrew Morton, David Airlie, Jonathan Corbet, linux-arch,
	open list:DOCUMENTATION, Linux Kernel Mailing List, Xuefeng Li,
	Yanteng Si, Huacai Chen, Jiaxun Yang, Huacai Chen

On Mon, Mar 21, 2022 at 2:55 PM Arnd Bergmann <arnd@arndb.de> wrote:
>
> I can prepare a pull request when it gets to that, but I think the boot protocol
> should be fixed first, and that makes it 5.19 material.

Thanks. No problem on 5.19, it's not like I don't have enough pending
for this merge window already..

                 Linus
---------------------------------------------------------------------------

test result: all passed.

XPASS: conform/UNIX98/ndbm.h/linknamespace
XPASS: conform/XOPEN2K/ndbm.h/linknamespace
XPASS: conform/XOPEN2K8/ndbm.h/linknamespace
XPASS: conform/XPG42/ndbm.h/linknamespace
UNSUPPORTED: crypt/cert
UNSUPPORTED: elf/tst-env-setuid
UNSUPPORTED: elf/tst-env-setuid-tunables
XPASS: elf/tst-protected1a
XPASS: elf/tst-protected1b
UNSUPPORTED: elf/tst-valgrind-smoke
UNSUPPORTED: misc/tst-adjtimex
UNSUPPORTED: misc/tst-clock_adjtime
UNSUPPORTED: misc/tst-ntp_adjtime
UNSUPPORTED: misc/tst-pkey
UNSUPPORTED: misc/tst-rseq
UNSUPPORTED: misc/tst-rseq-disable
UNSUPPORTED: nptl/test-cond-printers
UNSUPPORTED: nptl/test-condattr-printers
UNSUPPORTED: nptl/test-mutex-printers
UNSUPPORTED: nptl/test-mutexattr-printers
UNSUPPORTED: nptl/test-rwlock-printers
UNSUPPORTED: nptl/test-rwlockattr-printers
UNSUPPORTED: nptl/tst-rseq-nptl
UNSUPPORTED: stdlib/tst-secure-getenv
UNSUPPORTED: time/tst-clock_settime
UNSUPPORTED: time/tst-settimeofday
Summary of test results:
   4556 PASS
     20 UNSUPPORTED
     12 XFAIL
      6 XPASS

caiyinyu (13):
  LoongArch: Update NEWS and README for the LoongArch port.
  LoongArch: Add LoongArch entries to config.h.in
  LoongArch: Add relocations and ELF flags to elf.h and
    scripts/glibcelf.py
  LoongArch: ABI Implementation
  LoongArch: Thread-Local Storage Support
  LoongArch: Generic <math.h> and soft-fp Routines
  LoongArch: Atomic and Locking Routines
  LoongArch: Linux Syscall Interface
  LoongArch: Linux ABI
  LoongArch: Add ABI Lists
  LoongArch: Build Infastructure
  LoongArch: Hard Float Support
  LoongArch: Update build-many-glibcs.py for the LoongArch Port.

 NEWS                                          |    9 +
 README                                        |    1 +
 config.h.in                                   |    6 +
 elf/elf.h                                     |   68 +-
 manual/math.texi                              |    2 +-
 scripts/build-many-glibcs.py                  |    5 +
 scripts/glibcelf.py                           |    3 +-
 sysdeps/loongarch/Implies                     |    3 +
 sysdeps/loongarch/Makefile                    |   15 +
 sysdeps/loongarch/__longjmp.S                 |   52 +
 sysdeps/loongarch/abort-instr.h               |    2 +
 sysdeps/loongarch/bits/endianness.h           |   11 +
 sysdeps/loongarch/bits/fenv.h                 |   90 +
 sysdeps/loongarch/bits/link.h                 |   58 +
 sysdeps/loongarch/bits/setjmp.h               |   42 +
 sysdeps/loongarch/bsd-_setjmp.c               |    1 +
 sysdeps/loongarch/bsd-setjmp.c                |    1 +
 sysdeps/loongarch/configure                   |    5 +
 sysdeps/loongarch/configure.ac                |    6 +
 sysdeps/loongarch/dl-irel.h                   |   48 +
 sysdeps/loongarch/dl-machine.h                |  362 +++
 sysdeps/loongarch/dl-tls.h                    |   46 +
 sysdeps/loongarch/dl-trampoline.S             |   91 +
 sysdeps/loongarch/e_sqrtl.c                   |   38 +
 sysdeps/loongarch/fpu/fclrexcpt.c             |   46 +
 sysdeps/loongarch/fpu/fedisblxcpt.c           |   39 +
 sysdeps/loongarch/fpu/feenablxcpt.c           |   39 +
 sysdeps/loongarch/fpu/fegetenv.c              |   31 +
 sysdeps/loongarch/fpu/fegetexcept.c           |   32 +
 sysdeps/loongarch/fpu/fegetmode.c             |   27 +
 sysdeps/loongarch/fpu/fegetround.c            |   33 +
 sysdeps/loongarch/fpu/feholdexcpt.c           |   40 +
 sysdeps/loongarch/fpu/fenv_libc.h             |   30 +
 sysdeps/loongarch/fpu/fesetenv.c              |   42 +
 sysdeps/loongarch/fpu/fesetexcept.c           |   32 +
 sysdeps/loongarch/fpu/fesetmode.c             |   38 +
 sysdeps/loongarch/fpu/fesetround.c            |   44 +
 sysdeps/loongarch/fpu/feupdateenv.c           |   43 +
 sysdeps/loongarch/fpu/fgetexcptflg.c          |   38 +
 sysdeps/loongarch/fpu/fraiseexcpt.c           |   75 +
 sysdeps/loongarch/fpu/fsetexcptflg.c          |   41 +
 sysdeps/loongarch/fpu/ftestexcept.c           |   32 +
 .../loongarch/fpu/math-use-builtins-sqrt.h    |    4 +
 sysdeps/loongarch/fpu_control.h               |  102 +
 sysdeps/loongarch/hp-timing.h                 |   42 +
 sysdeps/loongarch/jmpbuf-offsets.h            |   22 +
 sysdeps/loongarch/jmpbuf-unwind.h             |   45 +
 sysdeps/loongarch/ldsodefs.h                  |   41 +
 sysdeps/loongarch/libc-tls.c                  |   32 +
 sysdeps/loongarch/linkmap.h                   |   22 +
 sysdeps/loongarch/lp64/Implies-after          |    1 +
 sysdeps/loongarch/lp64/libm-test-ulps         | 1412 +++++++++++
 sysdeps/loongarch/lp64/libm-test-ulps-name    |    1 +
 sysdeps/loongarch/machine-gmon.h              |   37 +
 sysdeps/loongarch/math_private.h              |  248 ++
 sysdeps/loongarch/nptl/Makefile               |   21 +
 sysdeps/loongarch/nptl/pthreaddef.h           |   32 +
 sysdeps/loongarch/nptl/tcb-offsets.sym        |    6 +
 sysdeps/loongarch/nptl/tls.h                  |  138 ++
 sysdeps/loongarch/preconfigure                |   47 +
 sysdeps/loongarch/setjmp.S                    |   66 +
 sysdeps/loongarch/sfp-machine.h               |  102 +
 sysdeps/loongarch/sotruss-lib.c               |   50 +
 sysdeps/loongarch/stackinfo.h                 |   33 +
 sysdeps/loongarch/start.S                     |   67 +
 sysdeps/loongarch/sys/asm.h                   |   59 +
 sysdeps/loongarch/sys/regdef.h                |   93 +
 sysdeps/loongarch/tininess.h                  |    1 +
 sysdeps/loongarch/tst-audit.h                 |   23 +
 sysdeps/unix/sysv/linux/loongarch/Implies     |    1 +
 sysdeps/unix/sysv/linux/loongarch/Makefile    |    4 +
 .../unix/sysv/linux/loongarch/arch-syscall.h  |  303 +++
 .../sysv/linux/loongarch/atomic-machine.h     |  181 ++
 .../unix/sysv/linux/loongarch/bits/fcntl.h    |   61 +
 .../unix/sysv/linux/loongarch/bits/procfs.h   |   52 +
 .../linux/loongarch/bits/pthread_stack_min.h  |   20 +
 .../unix/sysv/linux/loongarch/bits/sigstack.h |   32 +
 sysdeps/unix/sysv/linux/loongarch/clone.S     |   96 +
 sysdeps/unix/sysv/linux/loongarch/clone3.S    |   83 +
 sysdeps/unix/sysv/linux/loongarch/configure   |  174 ++
 .../unix/sysv/linux/loongarch/configure.ac    |   22 +
 .../unix/sysv/linux/loongarch/getcontext.S    |   59 +
 sysdeps/unix/sysv/linux/loongarch/ldconfig.h  |   26 +
 .../unix/sysv/linux/loongarch/ldd-rewrite.sed |    3 +
 .../unix/sysv/linux/loongarch/localplt.data   |   12 +
 .../unix/sysv/linux/loongarch/lp64/Implies    |    3 +
 .../sysv/linux/loongarch/lp64/c++-types.data  |   67 +
 .../unix/sysv/linux/loongarch/lp64/ld.abilist |    8 +
 .../loongarch/lp64/libBrokenLocale.abilist    |    1 +
 .../sysv/linux/loongarch/lp64/libc.abilist    | 2139 +++++++++++++++++
 .../loongarch/lp64/libc_malloc_debug.abilist  |   26 +
 .../linux/loongarch/lp64/libcrypt.abilist     |    2 +
 .../sysv/linux/loongarch/lp64/libm.abilist    | 1031 ++++++++
 .../linux/loongarch/lp64/libpthread.abilist   |    0
 .../linux/loongarch/lp64/libresolv.abilist    |   55 +
 .../sysv/linux/loongarch/lp64/librt.abilist   |    0
 .../linux/loongarch/lp64/libthread_db.abilist |   40 +
 .../unix/sysv/linux/loongarch/makecontext.c   |   79 +
 .../unix/sysv/linux/loongarch/setcontext.S    |  100 +
 .../unix/sysv/linux/loongarch/shlib-versions  |    7 +
 .../sysv/linux/loongarch/sigcontextinfo.h     |   32 +
 .../unix/sysv/linux/loongarch/swapcontext.S   |   95 +
 .../unix/sysv/linux/loongarch/sys/ucontext.h  |   61 +
 sysdeps/unix/sysv/linux/loongarch/sys/user.h  |   42 +
 sysdeps/unix/sysv/linux/loongarch/sysdep.S    |   53 +
 sysdeps/unix/sysv/linux/loongarch/sysdep.h    |  321 +++
 .../sysv/linux/loongarch/ucontext-macros.h    |   32 +
 .../unix/sysv/linux/loongarch/ucontext_i.sym  |   31 +
 sysdeps/unix/sysv/linux/loongarch/vfork.S     |   50 +
 109 files changed, 9815 insertions(+), 3 deletions(-)
 create mode 100644 sysdeps/loongarch/Implies
 create mode 100644 sysdeps/loongarch/Makefile
 create mode 100644 sysdeps/loongarch/__longjmp.S
 create mode 100644 sysdeps/loongarch/abort-instr.h
 create mode 100644 sysdeps/loongarch/bits/endianness.h
 create mode 100644 sysdeps/loongarch/bits/fenv.h
 create mode 100644 sysdeps/loongarch/bits/link.h
 create mode 100644 sysdeps/loongarch/bits/setjmp.h
 create mode 100644 sysdeps/loongarch/bsd-_setjmp.c
 create mode 100644 sysdeps/loongarch/bsd-setjmp.c
 create mode 100644 sysdeps/loongarch/configure
 create mode 100644 sysdeps/loongarch/configure.ac
 create mode 100644 sysdeps/loongarch/dl-irel.h
 create mode 100644 sysdeps/loongarch/dl-machine.h
 create mode 100644 sysdeps/loongarch/dl-tls.h
 create mode 100644 sysdeps/loongarch/dl-trampoline.S
 create mode 100644 sysdeps/loongarch/e_sqrtl.c
 create mode 100644 sysdeps/loongarch/fpu/fclrexcpt.c
 create mode 100644 sysdeps/loongarch/fpu/fedisblxcpt.c
 create mode 100644 sysdeps/loongarch/fpu/feenablxcpt.c
 create mode 100644 sysdeps/loongarch/fpu/fegetenv.c
 create mode 100644 sysdeps/loongarch/fpu/fegetexcept.c
 create mode 100644 sysdeps/loongarch/fpu/fegetmode.c
 create mode 100644 sysdeps/loongarch/fpu/fegetround.c
 create mode 100644 sysdeps/loongarch/fpu/feholdexcpt.c
 create mode 100644 sysdeps/loongarch/fpu/fenv_libc.h
 create mode 100644 sysdeps/loongarch/fpu/fesetenv.c
 create mode 100644 sysdeps/loongarch/fpu/fesetexcept.c
 create mode 100644 sysdeps/loongarch/fpu/fesetmode.c
 create mode 100644 sysdeps/loongarch/fpu/fesetround.c
 create mode 100644 sysdeps/loongarch/fpu/feupdateenv.c
 create mode 100644 sysdeps/loongarch/fpu/fgetexcptflg.c
 create mode 100644 sysdeps/loongarch/fpu/fraiseexcpt.c
 create mode 100644 sysdeps/loongarch/fpu/fsetexcptflg.c
 create mode 100644 sysdeps/loongarch/fpu/ftestexcept.c
 create mode 100644 sysdeps/loongarch/fpu/math-use-builtins-sqrt.h
 create mode 100644 sysdeps/loongarch/fpu_control.h
 create mode 100644 sysdeps/loongarch/hp-timing.h
 create mode 100644 sysdeps/loongarch/jmpbuf-offsets.h
 create mode 100644 sysdeps/loongarch/jmpbuf-unwind.h
 create mode 100644 sysdeps/loongarch/ldsodefs.h
 create mode 100644 sysdeps/loongarch/libc-tls.c
 create mode 100644 sysdeps/loongarch/linkmap.h
 create mode 100644 sysdeps/loongarch/lp64/Implies-after
 create mode 100644 sysdeps/loongarch/lp64/libm-test-ulps
 create mode 100644 sysdeps/loongarch/lp64/libm-test-ulps-name
 create mode 100644 sysdeps/loongarch/machine-gmon.h
 create mode 100644 sysdeps/loongarch/math_private.h
 create mode 100644 sysdeps/loongarch/nptl/Makefile
 create mode 100644 sysdeps/loongarch/nptl/pthreaddef.h
 create mode 100644 sysdeps/loongarch/nptl/tcb-offsets.sym
 create mode 100644 sysdeps/loongarch/nptl/tls.h
 create mode 100644 sysdeps/loongarch/preconfigure
 create mode 100644 sysdeps/loongarch/setjmp.S
 create mode 100644 sysdeps/loongarch/sfp-machine.h
 create mode 100644 sysdeps/loongarch/sotruss-lib.c
 create mode 100644 sysdeps/loongarch/stackinfo.h
 create mode 100644 sysdeps/loongarch/start.S
 create mode 100644 sysdeps/loongarch/sys/asm.h
 create mode 100644 sysdeps/loongarch/sys/regdef.h
 create mode 100644 sysdeps/loongarch/tininess.h
 create mode 100644 sysdeps/loongarch/tst-audit.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/arch-syscall.h
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/atomic-machine.h
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/bits/fcntl.h
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/bits/procfs.h
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/bits/pthread_stack_min.h
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/bits/sigstack.h
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/clone.S
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/clone3.S
 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/getcontext.S
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/ldconfig.h
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/ldd-rewrite.sed
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/localplt.data
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/lp64/Implies
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/lp64/c++-types.data
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/lp64/ld.abilist
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/lp64/libBrokenLocale.abilist
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/lp64/libc.abilist
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/lp64/libc_malloc_debug.abilist
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/lp64/libcrypt.abilist
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/lp64/libm.abilist
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/lp64/libpthread.abilist
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/lp64/libresolv.abilist
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/lp64/librt.abilist
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/lp64/libthread_db.abilist
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/makecontext.c
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/setcontext.S
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/shlib-versions
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/sigcontextinfo.h
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/swapcontext.S
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/sys/ucontext.h
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/sys/user.h
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/sysdep.S
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/sysdep.h
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/ucontext-macros.h
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/ucontext_i.sym
 create mode 100644 sysdeps/unix/sysv/linux/loongarch/vfork.S

-- 
2.31.1


^ permalink raw reply	[flat|nested] 21+ messages in thread

end of thread, other threads:[~2022-05-11 13:17 UTC | newest]

Thread overview: 21+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-04-15  1:31 [PATCH v3 00/13] GLIBC LoongArch PATCHES caiyinyu
2022-04-15  1:31 ` [PATCH v3 01/13] LoongArch: Update NEWS and README for the LoongArch port caiyinyu
2022-04-19 20:06   ` Joseph Myers
2022-05-09  2:26     ` caiyinyu
2022-04-15  1:31 ` [PATCH v3 02/13] LoongArch: Add LoongArch entries to config.h.in caiyinyu
2022-04-15  1:31 ` [PATCH v3 03/13] LoongArch: Add relocations and ELF flags to elf.h caiyinyu
2022-04-15  1:31 ` [PATCH v3 04/13] LoongArch: ABI Implementation caiyinyu
2022-04-15  1:31 ` [PATCH v3 05/13] LoongArch: Thread-Local Storage Support caiyinyu
2022-04-15  1:31 ` [PATCH v3 06/13] LoongArch: Generic <math.h> and soft-fp Routines caiyinyu
2022-04-15  1:31 ` [PATCH v3 07/13] LoongArch: Atomic and Locking Routines caiyinyu
2022-04-15  1:31 ` [PATCH v3 08/13] LoongArch: Linux Syscall Interface caiyinyu
2022-04-15  1:31 ` [PATCH v3 09/13] LoongArch: Linux ABI caiyinyu
2022-04-15  1:31 ` [PATCH v3 10/13] LoongArch: Add ABI Lists caiyinyu
2022-04-15  1:31 ` [PATCH v3 11/13] LoongArch: Build Infastructure caiyinyu
2022-04-15  1:31 ` [PATCH v3 12/13] LoongArch: Hard Float Support caiyinyu
2022-04-15  1:31 ` [PATCH v3 13/13] LoongArch: Update build-many-glibcs.py for the LoongArch Port caiyinyu
2022-05-09  2:25 [PATCH v3 00/13] GLIBC LoongArch PATCHES caiyinyu
2022-05-10 19:37 ` Florian Weimer
2022-05-10 20:33   ` Joseph Myers
2022-05-11  6:57   ` Arnd Bergmann
2022-05-11 13:17     ` Adhemerval Zanella

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).