summaryrefslogtreecommitdiff
path: root/LoongArch-Port.patch
diff options
context:
space:
mode:
Diffstat (limited to 'LoongArch-Port.patch')
-rw-r--r--LoongArch-Port.patch11388
1 files changed, 11388 insertions, 0 deletions
diff --git a/LoongArch-Port.patch b/LoongArch-Port.patch
new file mode 100644
index 0000000..b7076c3
--- /dev/null
+++ b/LoongArch-Port.patch
@@ -0,0 +1,11388 @@
+From c79112989afeadee37d64698eb4a922290b4e436 Mon Sep 17 00:00:00 2001
+From: wanghongliang <wanghongliang@loongson.cn>
+Date: Wed, 21 Dec 2022 14:39:59 +0800
+Subject: [PATCH] LoongArch Port.
+
+Signed-off-by: wanghongliang <wanghongliang@loongson.cn>
+Change-Id: Ia618b0101a483a2e07b8ecd114130907eb8ca5db
+---
+ config.h.in | 6 +
+ elf/elf.h | 71 +-
+ scripts/config.guess | 3 +
+ scripts/config.sub | 1 +
+ 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/bits/wordsize.h | 25 +
+ 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 | 305 +++
+ sysdeps/loongarch/dl-tls.h | 46 +
+ sysdeps/loongarch/dl-trampoline.S | 103 +
+ sysdeps/loongarch/e_sqrtl.c | 39 +
+ 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/gccframe.h | 21 +
+ 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-start.h | 25 +
+ sysdeps/loongarch/libc-tls.c | 32 +
+ sysdeps/loongarch/linkmap.h | 4 +
+ sysdeps/loongarch/lp64/Implies-after | 1 +
+ sysdeps/loongarch/lp64/libm-test-ulps | 1411 +++++++++++
+ sysdeps/loongarch/lp64/libm-test-ulps-name | 1 +
+ sysdeps/loongarch/machine-gmon.h | 37 +
+ sysdeps/loongarch/math_private.h | 248 ++
+ sysdeps/loongarch/memusage.h | 25 +
+ sysdeps/loongarch/nptl/Makefile | 21 +
+ .../loongarch/nptl/bits/pthreadtypes-arch.h | 41 +
+ sysdeps/loongarch/nptl/bits/semaphore.h | 32 +
+ sysdeps/loongarch/nptl/bits/struct_rwlock.h | 44 +
+ sysdeps/loongarch/nptl/pthread-offsets.h | 15 +
+ sysdeps/loongarch/nptl/pthreaddef.h | 34 +
+ sysdeps/loongarch/nptl/tcb-offsets.sym | 6 +
+ sysdeps/loongarch/nptl/tls.h | 138 ++
+ sysdeps/loongarch/preconfigure | 52 +
+ 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 | 69 +
+ sysdeps/loongarch/sys/asm.h | 58 +
+ sysdeps/loongarch/sys/ifunc.h | 30 +
+ sysdeps/loongarch/sys/regdef.h | 98 +
+ sysdeps/loongarch/tininess.h | 1 +
+ sysdeps/loongarch/tls-macros.h | 49 +
+ sysdeps/loongarch/tst-audit.h | 23 +
+ sysdeps/unix/sysv/linux/loongarch/Implies | 1 +
+ sysdeps/unix/sysv/linux/loongarch/Makefile | 10 +
+ .../unix/sysv/linux/loongarch/arch-syscall.h | 292 +++
+ .../sysv/linux/loongarch/atomic-machine.h | 196 ++
+ .../unix/sysv/linux/loongarch/bits/fcntl.h | 61 +
+ sysdeps/unix/sysv/linux/loongarch/bits/mman.h | 42 +
+ .../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 | 100 +
+ sysdeps/unix/sysv/linux/loongarch/clone3.S | 87 +
+ sysdeps/unix/sysv/linux/loongarch/configure | 199 ++
+ .../unix/sysv/linux/loongarch/configure.ac | 27 +
+ sysdeps/unix/sysv/linux/loongarch/dl-static.c | 80 +
+ .../unix/sysv/linux/loongarch/getcontext.S | 59 +
+ sysdeps/unix/sysv/linux/loongarch/ldconfig.h | 30 +
+ .../unix/sysv/linux/loongarch/ldd-rewrite.sed | 3 +
+ sysdeps/unix/sysv/linux/loongarch/ldsodefs.h | 33 +
+ .../unix/sysv/linux/loongarch/localplt.data | 12 +
+ .../unix/sysv/linux/loongarch/lp64/Implies | 3 +
+ .../sysv/linux/loongarch/lp64/c++-types.data | 67 +
+ .../linux/loongarch/lp64/fpu/jmp_buf-macros.h | 44 +
+ .../unix/sysv/linux/loongarch/lp64/ld.abilist | 9 +
+ .../loongarch/lp64/libBrokenLocale.abilist | 1 +
+ .../sysv/linux/loongarch/lp64/libanl.abilist | 1 +
+ .../sysv/linux/loongarch/lp64/libc.abilist | 2135 +++++++++++++++++
+ .../loongarch/lp64/libc_malloc_debug.abilist | 26 +
+ .../linux/loongarch/lp64/libcrypt.abilist | 2 +
+ .../sysv/linux/loongarch/lp64/libdl.abilist | 0
+ .../sysv/linux/loongarch/lp64/libm.abilist | 940 ++++++++
+ .../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 +
+ .../loongarch/lp64/nofpu/jmp_buf-macros.h | 41 +
+ .../unix/sysv/linux/loongarch/makecontext.c | 81 +
+ .../unix/sysv/linux/loongarch/register-dump.h | 61 +
+ .../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 | 64 +
+ sysdeps/unix/sysv/linux/loongarch/sys/user.h | 42 +
+ sysdeps/unix/sysv/linux/loongarch/syscall.c | 35 +
+ sysdeps/unix/sysv/linux/loongarch/sysdep.S | 53 +
+ sysdeps/unix/sysv/linux/loongarch/sysdep.h | 320 +++
+ .../sysv/linux/loongarch/ucontext-macros.h | 32 +
+ .../unix/sysv/linux/loongarch/ucontext_i.sym | 31 +
+ sysdeps/unix/sysv/linux/loongarch/vfork.S | 50 +
+ 125 files changed, 10359 insertions(+), 1 deletion(-)
+ 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/bits/wordsize.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/gccframe.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-start.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/memusage.h
+ create mode 100644 sysdeps/loongarch/nptl/Makefile
+ create mode 100644 sysdeps/loongarch/nptl/bits/pthreadtypes-arch.h
+ create mode 100644 sysdeps/loongarch/nptl/bits/semaphore.h
+ create mode 100644 sysdeps/loongarch/nptl/bits/struct_rwlock.h
+ create mode 100644 sysdeps/loongarch/nptl/pthread-offsets.h
+ 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/ifunc.h
+ create mode 100644 sysdeps/loongarch/sys/regdef.h
+ create mode 100644 sysdeps/loongarch/tininess.h
+ create mode 100644 sysdeps/loongarch/tls-macros.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/mman.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/dl-static.c
+ 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/ldsodefs.h
+ 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/fpu/jmp_buf-macros.h
+ 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/libanl.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/libdl.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/lp64/nofpu/jmp_buf-macros.h
+ create mode 100644 sysdeps/unix/sysv/linux/loongarch/makecontext.c
+ create mode 100644 sysdeps/unix/sysv/linux/loongarch/register-dump.h
+ 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/syscall.c
+ 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
+
+diff --git a/config.h.in b/config.h.in
+index 13101496..89596a83 100644
+--- a/config.h.in
++++ b/config.h.in
+@@ -144,6 +144,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
+
+diff --git a/elf/elf.h b/elf/elf.h
+index a64576bb..088f9764 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. */
+
+@@ -4038,6 +4039,74 @@ enum
+ #define R_NDS32_TLS_TPOFF 102
+ #define R_NDS32_TLS_DESC 119
+
++/* LoongArch ELF Flags */
++#define EF_LARCH_ABI_MODIFIER_MASK 0x07
++#define EF_LARCH_ABI_SOFT_FLOAT 0x01
++#define EF_LARCH_ABI_SINGLE_FLOAT 0x02
++#define EF_LARCH_ABI_DOUBLE_FLOAT 0x03
++#define EF_LARCH_OBJABI_V1 0x40
++
++/* 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
+diff --git a/scripts/config.guess b/scripts/config.guess
+index 0f9b29c8..ddbb6095 100755
+--- a/scripts/config.guess
++++ b/scripts/config.guess
+@@ -977,6 +977,9 @@ EOF
+ k1om:Linux:*:*)
+ echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
+ exit ;;
++ loongarch32:Linux:*:* | loongarch64:Linux:*:* | loongarchx32:Linux:*:*)
++ echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
++ exit ;;
+ m32r*:Linux:*:*)
+ echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
+ exit ;;
+diff --git a/scripts/config.sub b/scripts/config.sub
+index a8f3f7e7..15731891 100755
+--- a/scripts/config.sub
++++ b/scripts/config.sub
+@@ -1182,6 +1182,7 @@ case $cpu-$vendor in
+ | k1om \
+ | le32 | le64 \
+ | lm32 \
++ | loongarch32 | loongarch64 | loongarchx32 \
+ | m32c | m32r | m32rle \
+ | m5200 | m68000 | m680[012346]0 | m68360 | m683?2 | m68k | v70 | w65 \
+ | m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | nvptx | picochip \
+diff --git a/sysdeps/loongarch/Implies b/sysdeps/loongarch/Implies
+new file mode 100644
+index 00000000..1945b1f4
+--- /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 00000000..41c34496
+--- /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/__longjmp.S b/sysdeps/loongarch/__longjmp.S
+new file mode 100644
+index 00000000..5cc1bc78
+--- /dev/null
++++ b/sysdeps/loongarch/__longjmp.S
+@@ -0,0 +1,52 @@
++/* longjmp.
++ Copyright (C) 2021 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.d a0, a0, a1 # a0 = (a1 == 0) ? 1 : a1
++ jirl zero,ra,0
++
++END (__longjmp)
+diff --git a/sysdeps/loongarch/abort-instr.h b/sysdeps/loongarch/abort-instr.h
+new file mode 100644
+index 00000000..92e22edf
+--- /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/bits/endianness.h b/sysdeps/loongarch/bits/endianness.h
+new file mode 100644
+index 00000000..7290be7b
+--- /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/fenv.h b/sysdeps/loongarch/bits/fenv.h
+new file mode 100644
+index 00000000..35433bec
+--- /dev/null
++++ b/sysdeps/loongarch/bits/fenv.h
+@@ -0,0 +1,90 @@
++/* Floating point environment.
++ Copyright (C) 2021 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/bits/link.h b/sysdeps/loongarch/bits/link.h
+new file mode 100644
+index 00000000..3f2834d3
+--- /dev/null
++++ b/sysdeps/loongarch/bits/link.h
+@@ -0,0 +1,58 @@
++/* Machine-specific declarations for dynamic linker interface.
++ Copyright (C) 2021 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 00000000..b098ac6f
+--- /dev/null
++++ b/sysdeps/loongarch/bits/setjmp.h
+@@ -0,0 +1,42 @@
++/* Define the machine-dependent type `jmp_buf'.
++ Copyright (C) 2021 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/bits/wordsize.h b/sysdeps/loongarch/bits/wordsize.h
+new file mode 100644
+index 00000000..0a83454b
+--- /dev/null
++++ b/sysdeps/loongarch/bits/wordsize.h
+@@ -0,0 +1,25 @@
++/* Determine the wordsize from the preprocessor defines.
++ Copyright (C) 2021 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/>. */
++
++#ifdef __LP64__
++#define __WORDSIZE 64
++#else
++#define __WORDSIZE 32
++#endif
++
++#define __WORDSIZE_TIME64_COMPAT32 0
+diff --git a/sysdeps/loongarch/bsd-_setjmp.c b/sysdeps/loongarch/bsd-_setjmp.c
+new file mode 100644
+index 00000000..32f49441
+--- /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 00000000..45fd802a
+--- /dev/null
++++ b/sysdeps/loongarch/bsd-setjmp.c
+@@ -0,0 +1 @@
++/* setjmp is implemented in setjmp.S. */
+diff --git a/sysdeps/loongarch/configure b/sysdeps/loongarch/configure
+new file mode 100644
+index 00000000..1e5abf81
+--- /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 00000000..67b46ce0
+--- /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/dl-irel.h b/sysdeps/loongarch/dl-irel.h
+new file mode 100644
+index 00000000..9fd106a3
+--- /dev/null
++++ b/sysdeps/loongarch/dl-irel.h
+@@ -0,0 +1,48 @@
++/* Machine-dependent ELF indirect relocation inline functions.
++ Copyright (C) 2021 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/dl-machine.h b/sysdeps/loongarch/dl-machine.h
+new file mode 100644
+index 00000000..b6eac3ae
+--- /dev/null
++++ b/sysdeps/loongarch/dl-machine.h
+@@ -0,0 +1,305 @@
++/* Machine-dependent ELF dynamic relocation inline functions.
++ Copyright (C) 2021 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>
++
++#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)) \
++ | (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;
++}
++
++/* Return the run-time load address of the shared object. */
++static inline ElfW (Addr) elf_machine_load_address (void)
++{
++ extern const ElfW(Ehdr) __ehdr_start attribute_hidden;
++ return (ElfW(Addr)) &__ehdr_start;
++}
++
++/* Return the link-time address of _DYNAMIC. */
++static inline ElfW (Addr) elf_machine_dynamic (void)
++{
++ extern ElfW(Dyn) _DYNAMIC[] attribute_hidden;
++ return (ElfW(Addr)) _DYNAMIC - elf_machine_load_address ();
++}
++
++/* 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, $a0, $zero \n\
++ # Load the original argument count. \n\
++ ld.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\
++ # Stash the stack pointer in s1.\n\
++ or $s1, $sp, $zero \n\
++ # Adjust $sp for 16-aligned \n\
++ bstrins.d $sp, $zero, 3, 0 \n\
++ # Call the function to run the initializers. \n\
++ bl _dl_init \n\
++ # Restore the stack pointer for _start.\n\
++ or $sp, $s1, $zero \n\
++ # Pass our finalizer function to _start. \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. */
++
++auto inline void __attribute__ ((always_inline))
++elf_machine_rela (struct link_map *map,
++ 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 (&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)
++ {
++ case R_LARCH_JUMP_SLOT:
++ case __WORDSIZE == 64 ? R_LARCH_64 : R_LARCH_32:
++ *addr_field = value;
++ break;
++
++ case R_LARCH_NONE:
++ break;
++
++#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;
++ }
++ case R_LARCH_RELATIVE:
++ {
++ *addr_field = map->l_addr + reloc->r_addend;
++ 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;
++#endif
++
++ default:
++ _dl_reloc_bad_type (map, r_type, 0);
++ break;
++ }
++}
++
++auto 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;
++}
++
++auto inline void __attribute__ ((always_inline))
++elf_machine_lazy_rel (struct link_map *map,
++ 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
++ _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. */
++
++auto inline int __attribute__ ((always_inline))
++elf_machine_runtime_setup (struct link_map *l,
++ 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-tls.h b/sysdeps/loongarch/dl-tls.h
+new file mode 100644
+index 00000000..ee7d78a3
+--- /dev/null
++++ b/sysdeps/loongarch/dl-tls.h
+@@ -0,0 +1,46 @@
++/* Thread-local storage handling in the ELF dynamic linker.
++ Copyright (C) 2021 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/dl-trampoline.S b/sysdeps/loongarch/dl-trampoline.S
+new file mode 100644
+index 00000000..84b1fa1f
+--- /dev/null
++++ b/sysdeps/loongarch/dl-trampoline.S
+@@ -0,0 +1,103 @@
++/* PLT trampolines.
++ Copyright (C) 2021 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. */
++#ifdef __loongarch_lp64
++ addi.d sp, sp, -FRAME_SIZE
++#else
++#error "32bit LoongArch systems are not supported"
++#endif
++
++ 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 */
++#ifdef __loongarch_lp64
++ slli.d a1, t1, 1
++ or a0, t0, zero
++ add.d a1, a1, t1
++ la a2, _dl_fixup
++ jirl ra, a2, 0
++ or t1, v0, zero
++#else
++#error "32bit LoongArch systems are not supported"
++#endif
++
++ /* 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
++
++#ifdef __loongarch_lp64
++ addi.d sp, sp, FRAME_SIZE
++#else
++#error "32bit LoongArch systems are not supported"
++#endif
++
++ /* Invoke the callee. */
++ jirl zero, t1, 0
++END (_dl_runtime_resolve)
+diff --git a/sysdeps/loongarch/e_sqrtl.c b/sysdeps/loongarch/e_sqrtl.c
+new file mode 100644
+index 00000000..801af70b
+--- /dev/null
++++ b/sysdeps/loongarch/e_sqrtl.c
+@@ -0,0 +1,39 @@
++/* long double square root in software floating-point emulation.
++ Copyright (C) 2021 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>
++#include <libm-alias-finite.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;
++}
++libm_alias_finite (__ieee754_sqrtl, __sqrtl)
+diff --git a/sysdeps/loongarch/fpu/fclrexcpt.c b/sysdeps/loongarch/fpu/fclrexcpt.c
+new file mode 100644
+index 00000000..6f77e9a3
+--- /dev/null
++++ b/sysdeps/loongarch/fpu/fclrexcpt.c
+@@ -0,0 +1,46 @@
++/* Clear given exceptions in current floating-point environment.
++ Copyright (C) 2021 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 00000000..532274bc
+--- /dev/null
++++ b/sysdeps/loongarch/fpu/fedisblxcpt.c
+@@ -0,0 +1,39 @@
++/* Disable floating-point exceptions.
++ Copyright (C) 2021 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 00000000..565ebd4d
+--- /dev/null
++++ b/sysdeps/loongarch/fpu/feenablxcpt.c
+@@ -0,0 +1,39 @@
++/* Enable floating-point exceptions.
++ Copyright (C) 2021 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 00000000..5e8c095f
+--- /dev/null
++++ b/sysdeps/loongarch/fpu/fegetenv.c
+@@ -0,0 +1,31 @@
++/* Store current floating-point environment.
++ Copyright (C) 2021 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 00000000..782e9d80
+--- /dev/null
++++ b/sysdeps/loongarch/fpu/fegetexcept.c
+@@ -0,0 +1,32 @@
++/* Get enabled floating-point exceptions.
++ Copyright (C) 2021 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 00000000..f39c4c31
+--- /dev/null
++++ b/sysdeps/loongarch/fpu/fegetmode.c
+@@ -0,0 +1,27 @@
++/* Store current floating-point control modes.
++ Copyright (C) 2021 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 00000000..61a793a8
+--- /dev/null
++++ b/sysdeps/loongarch/fpu/fegetround.c
+@@ -0,0 +1,33 @@
++/* Return current rounding direction.
++ Copyright (C) 2021 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 00000000..59791ba9
+--- /dev/null
++++ b/sysdeps/loongarch/fpu/feholdexcpt.c
+@@ -0,0 +1,40 @@
++/* Store current floating-point environment and clear exceptions.
++ Copyright (C) 2021 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 00000000..60eedc93
+--- /dev/null
++++ b/sysdeps/loongarch/fpu/fenv_libc.h
+@@ -0,0 +1,30 @@
++/* Internal libc stuff for floating point environment routines.
++ Copyright (C) 2021 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 00000000..2a73a17d
+--- /dev/null
++++ b/sysdeps/loongarch/fpu/fesetenv.c
+@@ -0,0 +1,42 @@
++/* Install given floating-point environment.
++ Copyright (C) 2021 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 00000000..63c65e8f
+--- /dev/null
++++ b/sysdeps/loongarch/fpu/fesetexcept.c
+@@ -0,0 +1,32 @@
++/* Set given exception flags.
++ Copyright (C) 2021 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 00000000..8948876a
+--- /dev/null
++++ b/sysdeps/loongarch/fpu/fesetmode.c
+@@ -0,0 +1,38 @@
++/* Install given floating-point control modes.
++ Copyright (C) 2021 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 00000000..dddac1cc
+--- /dev/null
++++ b/sysdeps/loongarch/fpu/fesetround.c
+@@ -0,0 +1,44 @@
++/* Set current rounding direction.
++ Copyright (C) 2021 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 00000000..ad147cbd
+--- /dev/null
++++ b/sysdeps/loongarch/fpu/feupdateenv.c
+@@ -0,0 +1,43 @@
++/* Install given floating-point environment and raise exceptions.
++ Copyright (C) 2021 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 00000000..85733765
+--- /dev/null
++++ b/sysdeps/loongarch/fpu/fgetexcptflg.c
+@@ -0,0 +1,38 @@
++/* Store current representation for exceptions.
++ Copyright (C) 2021 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 00000000..ac01dc70
+--- /dev/null
++++ b/sysdeps/loongarch/fpu/fraiseexcpt.c
+@@ -0,0 +1,75 @@
++/* Raise given exceptions.
++ Copyright (C) 2021 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 00000000..eef2faa6
+--- /dev/null
++++ b/sysdeps/loongarch/fpu/fsetexcptflg.c
+@@ -0,0 +1,41 @@
++/* Set floating-point environment exception handling.
++ Copyright (C) 2021 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 00000000..3abd75ee
+--- /dev/null
++++ b/sysdeps/loongarch/fpu/ftestexcept.c
+@@ -0,0 +1,32 @@
++/* Test exception in current environment.
++ Copyright (C) 2021 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 00000000..e94c915b
+--- /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/fpu_control.h b/sysdeps/loongarch/fpu_control.h
+new file mode 100644
+index 00000000..d26e27ab
+--- /dev/null
++++ b/sysdeps/loongarch/fpu_control.h
+@@ -0,0 +1,102 @@
++/* FPU control word bits.
++ Copyright (C) 2021 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/gccframe.h b/sysdeps/loongarch/gccframe.h
+new file mode 100644
+index 00000000..19996f3c
+--- /dev/null
++++ b/sysdeps/loongarch/gccframe.h
+@@ -0,0 +1,21 @@
++/* Definition of object in frame unwind info.
++ Copyright (C) 2021 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 FIRST_PSEUDO_REGISTER 74
++
++#include <sysdeps/generic/gccframe.h>
+diff --git a/sysdeps/loongarch/hp-timing.h b/sysdeps/loongarch/hp-timing.h
+new file mode 100644
+index 00000000..7b36a539
+--- /dev/null
++++ b/sysdeps/loongarch/hp-timing.h
+@@ -0,0 +1,42 @@
++/* High precision, low overhead timing functions.
++ Copyright (C) 2021 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/loongarch/jmpbuf-offsets.h b/sysdeps/loongarch/jmpbuf-offsets.h
+new file mode 100644
+index 00000000..4df42dfa
+--- /dev/null
++++ b/sysdeps/loongarch/jmpbuf-offsets.h
+@@ -0,0 +1,22 @@
++/* Private macros for accessing __jmp_buf contents.
++ Copyright (C) 2021 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 00000000..a37bef1d
+--- /dev/null
++++ b/sysdeps/loongarch/jmpbuf-unwind.h
+@@ -0,0 +1,45 @@
++/* Examine __jmp_buf for unwinding frames.
++ Copyright (C) 2021 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 00000000..ec91f640
+--- /dev/null
++++ b/sysdeps/loongarch/ldsodefs.h
+@@ -0,0 +1,41 @@
++/* Run-time dynamic linker data structures for loaded ELF shared objects.
++ Copyright (C) 2021 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/libc-start.h b/sysdeps/loongarch/libc-start.h
+new file mode 100644
+index 00000000..961d0b4d
+--- /dev/null
++++ b/sysdeps/loongarch/libc-start.h
+@@ -0,0 +1,25 @@
++/* LoongArch definitions for libc main startup.
++ Copyright (C) 2021 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 SHARED
++#define ARCH_SETUP_IREL()
++#define ARCH_APPLY_IREL() apply_irel ()
++#ifndef ARCH_SETUP_TLS
++#define ARCH_SETUP_TLS() __libc_setup_tls ()
++#endif
++#endif /* !SHARED */
+diff --git a/sysdeps/loongarch/libc-tls.c b/sysdeps/loongarch/libc-tls.c
+new file mode 100644
+index 00000000..32e303ec
+--- /dev/null
++++ b/sysdeps/loongarch/libc-tls.c
+@@ -0,0 +1,32 @@
++/* Thread-local storage handling in the ELF dynamic linker.
++ Copyright (C) 2021 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/linkmap.h b/sysdeps/loongarch/linkmap.h
+new file mode 100644
+index 00000000..f88ce501
+--- /dev/null
++++ b/sysdeps/loongarch/linkmap.h
+@@ -0,0 +1,4 @@
++struct link_map_machine
++{
++ ElfW (Addr) plt; /* Address of .plt. */
++};
+diff --git a/sysdeps/loongarch/lp64/Implies-after b/sysdeps/loongarch/lp64/Implies-after
+new file mode 100644
+index 00000000..a8cae95f
+--- /dev/null
++++ b/sysdeps/loongarch/lp64/Implies-after
+@@ -0,0 +1 @@
++wordsize-64
+diff --git a/sysdeps/loongarch/lp64/libm-test-ulps b/sysdeps/loongarch/lp64/libm-test-ulps
+new file mode 100644
+index 00000000..d0dfd076
+--- /dev/null
++++ b/sysdeps/loongarch/lp64/libm-test-ulps
+@@ -0,0 +1,1411 @@
++# 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: 1
++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":
++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 00000000..ce02281e
+--- /dev/null
++++ b/sysdeps/loongarch/lp64/libm-test-ulps-name
+@@ -0,0 +1 @@
++LoongArch 64-bit
+diff --git a/sysdeps/loongarch/machine-gmon.h b/sysdeps/loongarch/machine-gmon.h
+new file mode 100644
+index 00000000..d330fd6e
+--- /dev/null
++++ b/sysdeps/loongarch/machine-gmon.h
+@@ -0,0 +1,37 @@
++/* LoongArch definitions for profiling support.
++ Copyright (C) 2021 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/math_private.h b/sysdeps/loongarch/math_private.h
+new file mode 100644
+index 00000000..5665624b
+--- /dev/null
++++ b/sysdeps/loongarch/math_private.h
+@@ -0,0 +1,248 @@
++/* Internal math stuff.
++ Copyright (C) 2021 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
+diff --git a/sysdeps/loongarch/memusage.h b/sysdeps/loongarch/memusage.h
+new file mode 100644
+index 00000000..bdf24bb2
+--- /dev/null
++++ b/sysdeps/loongarch/memusage.h
+@@ -0,0 +1,25 @@
++/* Machine-specific definitions for memory usage profiling.
++ Copyright (C) 2021 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 GETSP() \
++ ({ \
++ register uintptr_t stack_ptr asm("$sp"); \
++ stack_ptr; \
++ })
++
++#include <sysdeps/generic/memusage.h>
+diff --git a/sysdeps/loongarch/nptl/Makefile b/sysdeps/loongarch/nptl/Makefile
+new file mode 100644
+index 00000000..86d57110
+--- /dev/null
++++ b/sysdeps/loongarch/nptl/Makefile
+@@ -0,0 +1,21 @@
++# Makefile for sysdeps/loongarch/nptl.
++# Copyright (C) 2021 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/nptl/bits/pthreadtypes-arch.h b/sysdeps/loongarch/nptl/bits/pthreadtypes-arch.h
+new file mode 100644
+index 00000000..e57f122a
+--- /dev/null
++++ b/sysdeps/loongarch/nptl/bits/pthreadtypes-arch.h
+@@ -0,0 +1,41 @@
++/* Machine-specific pthread type layouts.
++ Copyright (C) 2021 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_PTHREADTYPES_ARCH_H
++#define _BITS_PTHREADTYPES_ARCH_H 1
++
++#include <bits/endian.h>
++
++#ifdef __loongarch_lp64
++#define __SIZEOF_PTHREAD_ATTR_T 56
++#define __SIZEOF_PTHREAD_MUTEX_T 40
++#define __SIZEOF_PTHREAD_MUTEXATTR_T 4
++#define __SIZEOF_PTHREAD_COND_T 48
++#define __SIZEOF_PTHREAD_CONDATTR_T 4
++#define __SIZEOF_PTHREAD_RWLOCK_T 56
++#define __SIZEOF_PTHREAD_RWLOCKATTR_T 8
++#define __SIZEOF_PTHREAD_BARRIER_T 32
++#define __SIZEOF_PTHREAD_BARRIERATTR_T 4
++#else
++#error "32bit LoongArch systems are not supported"
++#endif
++
++#define __LOCK_ALIGNMENT
++#define __ONCE_ALIGNMENT
++
++#endif /* bits/pthreadtypes.h */
+diff --git a/sysdeps/loongarch/nptl/bits/semaphore.h b/sysdeps/loongarch/nptl/bits/semaphore.h
+new file mode 100644
+index 00000000..510f3b0e
+--- /dev/null
++++ b/sysdeps/loongarch/nptl/bits/semaphore.h
+@@ -0,0 +1,32 @@
++/* POSIX semaphore type layout
++ Copyright (C) 2021 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 _SEMAPHORE_H
++#error "Never use <bits/semaphore.h> directly; include <semaphore.h> instead."
++#endif
++
++#define __SIZEOF_SEM_T (4 * __SIZEOF_POINTER__)
++
++/* Value returned if `sem_open' failed. */
++#define SEM_FAILED ((sem_t *) 0)
++
++typedef union
++{
++ char __size[__SIZEOF_SEM_T];
++ long int __align;
++} sem_t;
+diff --git a/sysdeps/loongarch/nptl/bits/struct_rwlock.h b/sysdeps/loongarch/nptl/bits/struct_rwlock.h
+new file mode 100644
+index 00000000..12b6a469
+--- /dev/null
++++ b/sysdeps/loongarch/nptl/bits/struct_rwlock.h
+@@ -0,0 +1,44 @@
++/* LoongArch internal rwlock struct definitions.
++ Copyright (C) 2021 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 _RWLOCK_INTERNAL_H
++#define _RWLOCK_INTERNAL_H
++
++/* There is a lot of padding in this structure. While it's not strictly
++ necessary on LoongArch, we're going to leave it in to be on the safe side in
++ case it's needed in the future. Most other architectures have the padding,
++ so this gives us the same extensibility as everyone else has. */
++struct __pthread_rwlock_arch_t
++{
++ unsigned int __readers;
++ unsigned int __writers;
++ unsigned int __wrphase_futex;
++ unsigned int __writers_futex;
++ unsigned int __pad3;
++ unsigned int __pad4;
++ int __cur_writer;
++ int __shared;
++ unsigned long int __pad1;
++ unsigned long int __pad2;
++ unsigned int __flags;
++};
++
++#define __PTHREAD_RWLOCK_INITIALIZER(__flags) \
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, __flags
++
++#endif
+diff --git a/sysdeps/loongarch/nptl/pthread-offsets.h b/sysdeps/loongarch/nptl/pthread-offsets.h
+new file mode 100644
+index 00000000..415c3c11
+--- /dev/null
++++ b/sysdeps/loongarch/nptl/pthread-offsets.h
+@@ -0,0 +1,15 @@
++#if __WORDSIZE == 64
++#define __PTHREAD_MUTEX_KIND_OFFSET 16
++#else
++#define __PTHREAD_MUTEX_KIND_OFFSET 12
++#endif
++
++#if __WORDSIZE == 64
++#define __PTHREAD_RWLOCK_FLAGS_OFFSET 48
++#else
++#if __BYTE_ORDER == __BIG_ENDIAN
++#define __PTHREAD_RWLOCK_FLAGS_OFFSET 27
++#else
++#define __PTHREAD_RWLOCK_FLAGS_OFFSET 24
++#endif
++#endif
+diff --git a/sysdeps/loongarch/nptl/pthreaddef.h b/sysdeps/loongarch/nptl/pthreaddef.h
+new file mode 100644
+index 00000000..674ba844
+--- /dev/null
++++ b/sysdeps/loongarch/nptl/pthreaddef.h
+@@ -0,0 +1,34 @@
++/* pthread machine parameter definitions.
++ Copyright (C) 2021 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
++
++#define TCB_ALIGNMENT 16
++
++/* Location of current stack frame. */
++#define CURRENT_STACK_FRAME __builtin_frame_address (0)
+diff --git a/sysdeps/loongarch/nptl/tcb-offsets.sym b/sysdeps/loongarch/nptl/tcb-offsets.sym
+new file mode 100644
+index 00000000..7d0c7596
+--- /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 00000000..3b17e0b7
+--- /dev/null
++++ b/sysdeps/loongarch/nptl/tls.h
+@@ -0,0 +1,138 @@
++/* Definition for thread-local data handling.
++ Copyright (C) 2021 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"); /* FIXME */
++#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/preconfigure b/sysdeps/loongarch/preconfigure
+new file mode 100644
+index 00000000..2e3abb9e
+--- /dev/null
++++ b/sysdeps/loongarch/preconfigure
+@@ -0,0 +1,52 @@
++# This file is generated from configure.ac by Autoconf. DO NOT EDIT!
++# Local preconfigure fragment for sysdeps/loongarch
++
++case "$machine" in
++loongarch*)
++
++ abi=`$CC $CFLAGS $CPPFLAGS -E -dM -xc /dev/null | sed -n 's/^#define __loongarch_\(lp64\|ilp32\).*/\1/p'`
++ float_abi=`$CC $CFLAGS $CPPFLAGS -E -dM -xc /dev/null | sed -n 's/^#define __loongarch_\(soft\|single\|double\)_float.*/\1/p'`
++
++ with_fp_cond="!defined __loongarch_soft_float"
++
++ case "$float_abi" in
++ soft)
++ abi_flen=0
++ as_fn_error 1 "loongarch does not yet support soft floating-point ABI!!" "$LINENO" 5
++ ;;
++ single)
++ as_fn_error 1 "glibc does not yet support the single floating-point ABI!!" "$LINENO" 5
++ ;;
++ double)
++ abi_flen=64
++ ;;
++ *)
++ as_fn_error 1 "Unable to determine floating-point ABI!!" "$LINENO" 5
++ ;;
++ esac
++
++ case "$abi" in
++ ilp32)
++ as_fn_error 1 "loongarch does not yet support ilp32 ABI!!" "$LINENO" 5
++ ;;
++ lp64)
++ grlen=64
++ machine=loongarch/lp64
++ ;;
++ *)
++ as_fn_error 1 "Unable to determine GRLEN!!" "$LINENO" 5
++ ;;
++ esac
++
++ cat >>confdefs.h <<_ACEOF
++#define LOONGARCH_ABI_GRLEN $grlen
++_ACEOF
++
++ cat >>confdefs.h <<_ACEOF
++#define LOONGARCH_ABI_FRLEN $abi_flen
++_ACEOF
++
++
++ base_machine=loongarch
++ ;;
++esac
+diff --git a/sysdeps/loongarch/setjmp.S b/sysdeps/loongarch/setjmp.S
+new file mode 100644
+index 00000000..00ea14b2
+--- /dev/null
++++ b/sysdeps/loongarch/setjmp.S
+@@ -0,0 +1,66 @@
++/* setjmp for LoongArch.
++ Copyright (C) 2021 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 HIDDEN_JUMPTARGET (__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/sfp-machine.h b/sysdeps/loongarch/sfp-machine.h
+new file mode 100644
+index 00000000..61f11dd0
+--- /dev/null
++++ b/sysdeps/loongarch/sfp-machine.h
+@@ -0,0 +1,102 @@
++/* LoongArch softfloat definitions
++ Copyright (C) 2021 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/sotruss-lib.c b/sysdeps/loongarch/sotruss-lib.c
+new file mode 100644
+index 00000000..8a7a438b
+--- /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) 2021 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/stackinfo.h b/sysdeps/loongarch/stackinfo.h
+new file mode 100644
+index 00000000..a990a471
+--- /dev/null
++++ b/sysdeps/loongarch/stackinfo.h
+@@ -0,0 +1,33 @@
++/* Stack environment definitions for LoongArch.
++ Copyright (C) 2021 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 */
+diff --git a/sysdeps/loongarch/start.S b/sysdeps/loongarch/start.S
+new file mode 100644
+index 00000000..0deda78a
+--- /dev/null
++++ b/sysdeps/loongarch/start.S
+@@ -0,0 +1,69 @@
++/* Startup code compliant to the ELF LoongArch ABI.
++ Copyright (C) 2021 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
++#ifdef __loongarch_lp64
++ ld.d a1, sp, 0
++ addi.d a2, sp, SZREG
++#else
++#error "32bit LoongArch systems are not supported"
++#endif
++ /* Adjust $sp for 16-aligned */
++ srli.d sp, sp, 4
++ slli.d 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 00000000..1133f761
+--- /dev/null
++++ b/sysdeps/loongarch/sys/asm.h
+@@ -0,0 +1,58 @@
++/* Miscellaneous macros.
++ Copyright (C) 2021 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. */
++#ifdef __loongarch_lp64
++#define PTRLOG 3
++#define SZREG 8
++#define SZFREG 8
++#define REG_L ld.d
++#define REG_S st.d
++#define FREG_L fld.d
++#define FREG_S fst.d
++#else
++#error "32bit LoongArch systems are not supported"
++#endif
++
++/* 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/sys/ifunc.h b/sysdeps/loongarch/sys/ifunc.h
+new file mode 100644
+index 00000000..461df20c
+--- /dev/null
++++ b/sysdeps/loongarch/sys/ifunc.h
+@@ -0,0 +1,30 @@
++/* Definitions used by LoongArch indirect function resolvers.
++ 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_IFUNC_H
++#define _SYS_IFUNC_H
++
++struct __ifunc_arg_t
++{
++ unsigned long _size; /* Size of the struct, so it can grow. */
++ unsigned long _hwcap;
++};
++
++typedef struct __ifunc_arg_t __ifunc_arg_t;
++
++#endif
+diff --git a/sysdeps/loongarch/sys/regdef.h b/sysdeps/loongarch/sys/regdef.h
+new file mode 100644
+index 00000000..f53447db
+--- /dev/null
++++ b/sysdeps/loongarch/sys/regdef.h
+@@ -0,0 +1,98 @@
++/* Register Macro definitions
++ Copyright (C) 2021 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
++
++#ifdef __loongarch_lp64
++#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
++
++#else
++#error "32bit LoongArch systems are not supported"
++#endif
++
++#endif /* _SYS_REGDEF_H */
+diff --git a/sysdeps/loongarch/tininess.h b/sysdeps/loongarch/tininess.h
+new file mode 100644
+index 00000000..90956c35
+--- /dev/null
++++ b/sysdeps/loongarch/tininess.h
+@@ -0,0 +1 @@
++#define TININESS_AFTER_ROUNDING 1
+diff --git a/sysdeps/loongarch/tls-macros.h b/sysdeps/loongarch/tls-macros.h
+new file mode 100644
+index 00000000..af5eb6b7
+--- /dev/null
++++ b/sysdeps/loongarch/tls-macros.h
+@@ -0,0 +1,49 @@
++/* Macros to support TLS testing in times of missing compiler support.
++ Copyright (C) 2021 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/cdefs.h>
++#include <sys/asm.h>
++#include <sysdep.h>
++#include "dl-tls.h"
++
++#define TLS_GD(x) \
++ ({ \
++ void *__result; \
++ asm("la.tls.gd %0, " #x "\n\t" : "=r"(__result)); \
++ __tls_get_addr (__result); \
++ })
++
++#define TLS_LD(x) TLS_GD (x)
++
++#define TLS_IE(x) \
++ ({ \
++ void *__result; \
++ asm("la.tls.ie %0, " #x "\n\t" \
++ "add.d %0, %0, $tp\n\t" \
++ : "=r"(__result)); \
++ __result; \
++ })
++
++#define TLS_LE(x) \
++ ({ \
++ void *__result; \
++ asm("la.tls.le %0, " #x "\n\t" \
++ "add.d %0, %0, $tp\n\t" \
++ : "=r"(__result)); \
++ __result; \
++ })
+diff --git a/sysdeps/loongarch/tst-audit.h b/sysdeps/loongarch/tst-audit.h
+new file mode 100644
+index 00000000..de120d8a
+--- /dev/null
++++ b/sysdeps/loongarch/tst-audit.h
+@@ -0,0 +1,23 @@
++/* Definitions for testing PLT entry/exit auditing.
++ Copyright (C) 2021 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/Implies b/sysdeps/unix/sysv/linux/loongarch/Implies
+new file mode 100644
+index 00000000..e52b1ac3
+--- /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 00000000..e205ce83
+--- /dev/null
++++ b/sysdeps/unix/sysv/linux/loongarch/Makefile
+@@ -0,0 +1,10 @@
++ifeq ($(subdir),elf)
++ifeq ($(build-shared),yes)
++# This is needed for DSO loading from static binaries.
++sysdep-dl-routines += dl-static
++endif
++endif
++
++ifeq ($(subdir),stdlib)
++gen-as-const-headers += ucontext_i.sym
++endif
+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 00000000..c1ff6cb6
+--- /dev/null
++++ b/sysdeps/unix/sysv/linux/loongarch/arch-syscall.h
+@@ -0,0 +1,292 @@
++/* 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_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_fstatfs 44
++#define __NR_fsync 82
++#define __NR_ftruncate 46
++#define __NR_futex 98
++#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_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_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_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_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_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_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/atomic-machine.h b/sysdeps/unix/sysv/linux/loongarch/atomic-machine.h
+new file mode 100644
+index 00000000..dbae608e
+--- /dev/null
++++ b/sysdeps/unix/sysv/linux/loongarch/atomic-machine.h
+@@ -0,0 +1,196 @@
++/* Atomic operations.
++ Copyright (C) 2021 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
++
++#include <stdint.h>
++
++typedef int32_t atomic32_t;
++typedef uint32_t uatomic32_t;
++
++typedef int64_t atomic64_t;
++typedef uint64_t uatomic64_t;
++
++typedef intptr_t atomicptr_t;
++typedef uintptr_t uatomicptr_t;
++typedef intmax_t atomic_max_t;
++typedef uintmax_t uatomic_max_t;
++
++#define atomic_full_barrier() __sync_synchronize ()
++
++#ifdef __LP64__
++#define __HAVE_64B_ATOMICS 1
++#endif
++#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 */
+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 00000000..a39985e1
+--- /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) 2021 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/mman.h b/sysdeps/unix/sysv/linux/loongarch/bits/mman.h
+new file mode 100644
+index 00000000..1f2f76fc
+--- /dev/null
++++ b/sysdeps/unix/sysv/linux/loongarch/bits/mman.h
+@@ -0,0 +1,42 @@
++/* Definitions for POSIX memory map interface.
++ Copyright (C) 2021 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_MMAN_H
++#error "Never use <bits/mman.h> directly; include <sys/mman.h> instead."
++#endif
++
++#ifdef __USE_MISC
++#define MAP_GROWSDOWN 0x00100 /* Stack-like segment. */
++#define MAP_DENYWRITE 0x00800 /* ETXTBSY. */
++#define MAP_EXECUTABLE 0x01000 /* Mark it as an executable. */
++#define MAP_LOCKED 0x02000 /* Lock the mapping. */
++#define MAP_NORESERVE 0x04000 /* Don't check for reservations. */
++#define MAP_POPULATE 0x08000 /* Populate (prefault) pagetables. */
++#define MAP_NONBLOCK 0x10000 /* Do not block on IO. */
++#define MAP_STACK 0x20000 /* Allocation is for a stack. */
++#define MAP_HUGETLB 0x40000 /* Create huge page mapping. */
++#define MAP_SYNC \
++ 0x80000 /* Perform synchronous page \
++ faults for the mapping. */
++#define MAP_FIXED_NOREPLACE \
++ 0x100000 /* MAP_FIXED but do not unmap \
++ underlying mapping. */
++#endif
++
++/* Include generic Linux declarations. */
++#include <bits/mman-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 00000000..2db777b3
+--- /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 00000000..ccab36ca
+--- /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) 2021 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 00000000..d59632de
+--- /dev/null
++++ b/sysdeps/unix/sysv/linux/loongarch/bits/sigstack.h
+@@ -0,0 +1,32 @@
++/* sigstack, sigaltstack definitions.
++ Copyright (C) 1998-2021 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/clone.S b/sysdeps/unix/sysv/linux/loongarch/clone.S
+new file mode 100644
+index 00000000..d2bed244
+--- /dev/null
++++ b/sysdeps/unix/sysv/linux/loongarch/clone.S
+@@ -0,0 +1,100 @@
++/* The clone syscall wrapper.
++ Copyright (C) 2021 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. */
++#ifdef __loongarch_lp64
++ bstrins.d a1, zero, 3, 0
++#else
++#error "32bit LoongArch systems are not supported"
++#endif
++
++ /* Sanity check arguments. */
++ beqz a0, L (invalid) /* No NULL function pointers. */
++ beqz a1, L (invalid) /* No NULL stack pointers. */
++
++ addi.d a1, a1, -16 /* Reserve argument save space. */
++ st.d a0, a1, 0 /* Save function pointer. */
++ st.d 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.d a7,__NR_clone
++ syscall 0
++
++ blt a0, zero ,L (error)
++ beqz a0,L (thread_start)
++
++ /* Successful return from the parent. */
++ ret
++
++L (invalid):
++ li.d 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. */
++ ld.d a1, sp, 0 /* Function pointer. */
++ ld.d a0, sp, SZREG /* Argument pointer. */
++
++ /* Call the user's function. */
++ jirl ra, a1, 0
++
++ /* Call exit with the function's return value. */
++ li.d 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 00000000..5eaaa546
+--- /dev/null
++++ b/sysdeps/unix/sysv/linux/loongarch/clone3.S
+@@ -0,0 +1,87 @@
++/* The clone3 syscall wrapper.
++ Copyright (C) 2021 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.d a7, __NR_clone3
++ syscall 0
++
++ blt a0, zero ,L (error)
++ beqz a0, L (thread_start3)
++
++ /* Successful return from the parent. */
++ ret
++
++L (invalid):
++ li.d 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. */
++#ifdef __loongarch_lp64
++ bstrins.d sp, zero, 3, 0
++#else
++#error "32bit LoongArch systems are not supported"
++#endif
++
++ /* 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.d a7, __NR_exit
++ syscall 0
++
++ END (__thread_start3)
++
++libc_hidden_def (__clone3)
++weak_alias (__clone3, clone3)
+diff --git a/sysdeps/unix/sysv/linux/loongarch/configure b/sysdeps/unix/sysv/linux/loongarch/configure
+new file mode 100644
+index 00000000..23b44a8c
+--- /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=5.10.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 00000000..55ccb504
+--- /dev/null
++++ b/sysdeps/unix/sysv/linux/loongarch/configure.ac
+@@ -0,0 +1,27 @@
++sinclude(./aclocal.m4)dnl Autoconf lossage
++GLIBC_PROVIDES dnl See aclocal.m4 in the top level source directory.
++# Local configure fragment for sysdeps/unix/sysv/linux/loongarch.
++
++arch_minimum_kernel=5.10.0
++
++libc_cv_loongarch_int_abi=no
++AC_EGREP_CPP(4 4 4, [__SIZEOF_INT__ __SIZEOF_LONG__ __SIZEOF_POINTER__
++ ], libc_cv_loongarch_int_abi=ilp32)
++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
++ilp32)
++ LIBC_SLIBDIR_RTLDDIR([lib32], [lib32])
++ ;;
++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/dl-static.c b/sysdeps/unix/sysv/linux/loongarch/dl-static.c
+new file mode 100644
+index 00000000..b9a7b2a6
+--- /dev/null
++++ b/sysdeps/unix/sysv/linux/loongarch/dl-static.c
+@@ -0,0 +1,80 @@
++/* dl_static_init for loongarch.
++ Copyright (C) 2021 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 <ldsodefs.h>
++
++#ifdef SHARED
++
++void
++_dl_var_init (void *array[])
++{
++ /* It has to match "variables" below. */
++ enum
++ {
++ DL_PAGESIZE = 0
++ };
++
++ GLRO (dl_pagesize) = *((size_t *) array[DL_PAGESIZE]);
++}
++
++#else
++
++static void *variables[] = {&GLRO (dl_pagesize)};
++
++static void _dl_unprotect_relro (struct link_map *l)
++{
++ ElfW (Addr) start = ((l->l_addr + l->l_relro_addr)
++ & ~(GLRO (dl_pagesize) - 1));
++ ElfW (Addr) end = ((l->l_addr + l->l_relro_addr + l->l_relro_size)
++ & ~(GLRO (dl_pagesize) - 1));
++
++ if (start != end)
++ __mprotect ((void *) start, end - start, PROT_READ | PROT_WRITE);
++}
++
++void dl_static_init (struct link_map *l)
++{
++ struct link_map *rtld_map = l;
++ struct r_scope_elem **scope;
++ const ElfW (Sym) *ref = NULL;
++ lookup_t loadbase;
++ void (*f) (void *[]);
++ size_t i;
++
++ loadbase = _dl_lookup_symbol_x ("_dl_var_init", l, &ref, l->l_local_scope,
++ NULL, 0, 1, NULL);
++
++ for (scope = l->l_local_scope; *scope != NULL; scope++)
++ for (i = 0; i < (*scope)->r_nlist; i++)
++ if ((*scope)->r_list[i] == loadbase)
++ {
++ rtld_map = (*scope)->r_list[i];
++ break;
++ }
++
++ if (ref != NULL)
++ {
++ f = (void (*) (void *[])) DL_SYMBOL_ADDRESS (loadbase, ref);
++ _dl_unprotect_relro (rtld_map);
++ f (variables);
++ _dl_protect_relro (rtld_map);
++ }
++}
++
++#endif
+diff --git a/sysdeps/unix/sysv/linux/loongarch/getcontext.S b/sysdeps/unix/sysv/linux/loongarch/getcontext.S
+new file mode 100644
+index 00000000..43b95e97
+--- /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/ldconfig.h b/sysdeps/unix/sysv/linux/loongarch/ldconfig.h
+new file mode 100644
+index 00000000..126f0860
+--- /dev/null
++++ b/sysdeps/unix/sysv/linux/loongarch/ldconfig.h
+@@ -0,0 +1,30 @@
++/* ldconfig default paths and libraries.
++ Copyright (C) 2001-2021 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>
++
++#ifdef __loongarch_lp64
++#define SYSDEP_KNOWN_INTERPRETER_NAMES \
++ { "/lib64/ld-linux-loongarch-lp64d.so.1", FLAG_ELF_LIBC6 },
++#else
++#error cannot determine ABI
++#endif
++
++#define SYSDEP_KNOWN_LIBRARY_NAMES \
++ { "libc.so.6", FLAG_ELF_LIBC6 }, \
++ { "libm.so.6", FLAG_ELF_LIBC6 },
+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 00000000..d42a13e0
+--- /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/ldsodefs.h b/sysdeps/unix/sysv/linux/loongarch/ldsodefs.h
+new file mode 100644
+index 00000000..680baf2e
+--- /dev/null
++++ b/sysdeps/unix/sysv/linux/loongarch/ldsodefs.h
+@@ -0,0 +1,33 @@
++/* Run-time dynamic linker data structures for loaded ELF shared objects.
++ Copyright (C) 2021 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 _LDSODEFS_H
++
++/* Get the real definitions. */
++#include_next <ldsodefs.h>
++
++/* Now define our stuff. */
++
++/* We need special support to initialize DSO loaded for statically linked
++ binaries. */
++extern void _dl_static_init (struct link_map *map);
++#undef DL_STATIC_INIT
++#define DL_STATIC_INIT(map) _dl_static_init (map)
++
++#endif /* ldsodefs.h */
+diff --git a/sysdeps/unix/sysv/linux/loongarch/localplt.data b/sysdeps/unix/sysv/linux/loongarch/localplt.data
+new file mode 100644
+index 00000000..817ab265
+--- /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/lp64/Implies b/sysdeps/unix/sysv/linux/loongarch/lp64/Implies
+new file mode 100644
+index 00000000..117c2b8e
+--- /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/lp64/c++-types.data b/sysdeps/unix/sysv/linux/loongarch/lp64/c++-types.data
+new file mode 100644
+index 00000000..ac925ccb
+--- /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/fpu/jmp_buf-macros.h b/sysdeps/unix/sysv/linux/loongarch/lp64/fpu/jmp_buf-macros.h
+new file mode 100644
+index 00000000..a02865b4
+--- /dev/null
++++ b/sysdeps/unix/sysv/linux/loongarch/lp64/fpu/jmp_buf-macros.h
+@@ -0,0 +1,44 @@
++/* jump buffer constants for LoongArch.
++ Copyright (C) 2021 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/>. */
++
++/* Produced by this program:
++
++ #include <stdio.h>
++ #include <unistd.h>
++ #include <setjmp.h>
++ #include <stddef.h>
++
++ int main (int argc, char **argv)
++ {
++ printf ("#define JMP_BUF_SIZE %d\n", sizeof (jmp_buf));
++ printf ("#define JMP_BUF_ALIGN %d\n", __alignof__ (jmp_buf));
++ printf ("#define SIGJMP_BUF_SIZE %d\n", sizeof (sigjmp_buf));
++ printf ("#define SIGJMP_BUF_ALIGN %d\n", __alignof__ (sigjmp_buf));
++ printf ("#define MASK_WAS_SAVED_OFFSET %d\n",
++ offsetof (struct __jmp_buf_tag, __mask_was_saved));
++ printf ("#define SAVED_MASK_OFFSET %d\n",
++ offsetof (struct __jmp_buf_tag, __saved_mask));
++ } */
++
++#define JMP_BUF_SIZE 304
++#define JMP_BUF_ALIGN 8
++#define SIGJMP_BUF_SIZE 304
++#define SIGJMP_BUF_ALIGN 8
++#define MASK_WAS_SAVED_OFFSET 168
++#define SAVED_MASK_OFFSET 176
+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 00000000..a6a0faff
+--- /dev/null
++++ b/sysdeps/unix/sysv/linux/loongarch/lp64/ld.abilist
+@@ -0,0 +1,9 @@
++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 __rtld_version_placeholder F
++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 00000000..404afa36
+--- /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/libanl.abilist b/sysdeps/unix/sysv/linux/loongarch/lp64/libanl.abilist
+new file mode 100644
+index 00000000..377e03d4
+--- /dev/null
++++ b/sysdeps/unix/sysv/linux/loongarch/lp64/libanl.abilist
+@@ -0,0 +1 @@
++GLIBC_2.36 __libanl_version_placeholder 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 00000000..e1640cd7
+--- /dev/null
++++ b/sysdeps/unix/sysv/linux/loongarch/lp64/libc.abilist
+@@ -0,0 +1,2135 @@
++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 __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_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_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_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 00000000..6ddfd162
+--- /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 00000000..4d4332da
+--- /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/libdl.abilist b/sysdeps/unix/sysv/linux/loongarch/lp64/libdl.abilist
+new file mode 100644
+index 00000000..e69de29b
+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 00000000..b566624d
+--- /dev/null
++++ b/sysdeps/unix/sysv/linux/loongarch/lp64/libm.abilist
+@@ -0,0 +1,940 @@
++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 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 dmull F
++GLIBC_2.36 drem F
++GLIBC_2.36 dremf F
++GLIBC_2.36 dreml 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 f32mulf128 F
++GLIBC_2.36 f32mulf32x F
++GLIBC_2.36 f32mulf64 F
++GLIBC_2.36 f32mulf64x 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 f32xmulf128 F
++GLIBC_2.36 f32xmulf64 F
++GLIBC_2.36 f32xmulf64x 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 f64mulf128 F
++GLIBC_2.36 f64mulf64x F
++GLIBC_2.36 f64subf128 F
++GLIBC_2.36 f64subf64x F
++GLIBC_2.36 f64xaddf128 F
++GLIBC_2.36 f64xdivf128 F
++GLIBC_2.36 f64xmulf128 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 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 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 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 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 00000000..e69de29b
+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 00000000..c30f54c0
+--- /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 00000000..e69de29b
+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 00000000..8658803d
+--- /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
+diff --git a/sysdeps/unix/sysv/linux/loongarch/lp64/nofpu/jmp_buf-macros.h b/sysdeps/unix/sysv/linux/loongarch/lp64/nofpu/jmp_buf-macros.h
+new file mode 100644
+index 00000000..835df05c
+--- /dev/null
++++ b/sysdeps/unix/sysv/linux/loongarch/lp64/nofpu/jmp_buf-macros.h
+@@ -0,0 +1,41 @@
++/* Copyright (C) 2020-2021 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/>. */
++
++/* Produced by this program:
++
++ #include <stdio.h>
++ #include <unistd.h>
++ #include <setjmp.h>
++ #include <stddef.h>
++
++ int main (int argc, char **argv)
++ {
++ printf ("#define JMP_BUF_SIZE %d\n", sizeof (jmp_buf));
++ printf ("#define JMP_BUF_ALIGN %d\n", __alignof__ (jmp_buf));
++ printf ("#define SIGJMP_BUF_SIZE %d\n", sizeof (sigjmp_buf));
++ printf ("#define SIGJMP_BUF_ALIGN %d\n", __alignof__ (sigjmp_buf));
++ printf ("#define MASK_WAS_SAVED_OFFSET %d\n", offsetof (struct __jmp_buf_tag, __mask_was_saved));
++ printf ("#define SAVED_MASK_OFFSET %d\n", offsetof (struct __jmp_buf_tag, __saved_mask));
++ } */
++
++# define JMP_BUF_SIZE 240
++# define JMP_BUF_ALIGN 8
++# define SIGJMP_BUF_SIZE 240
++# define SIGJMP_BUF_ALIGN 8
++# define MASK_WAS_SAVED_OFFSET 104
++# define SAVED_MASK_OFFSET 112
+diff --git a/sysdeps/unix/sysv/linux/loongarch/makecontext.c b/sysdeps/unix/sysv/linux/loongarch/makecontext.c
+new file mode 100644
+index 00000000..94a45bf4
+--- /dev/null
++++ b/sysdeps/unix/sysv/linux/loongarch/makecontext.c
+@@ -0,0 +1,81 @@
++/* 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;
++ unsigned long int *sp;
++
++ _Static_assert(LARCH_REG_NARGS == 8,
++ "__makecontext assumes 8 argument registers");
++
++ /* Set up the stack. */
++ sp = (unsigned long int *)
++ (((uintptr_t) 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] = (uintptr_t) 0;
++ ucp->uc_mcontext.__gregs[LARCH_REG_S0] = (uintptr_t) 0;
++ ucp->uc_mcontext.__gregs[LARCH_REG_S1] = (uintptr_t) func;
++ ucp->uc_mcontext.__gregs[LARCH_REG_S2] = (uintptr_t) ucp->uc_link;
++ ucp->uc_mcontext.__gregs[LARCH_REG_SP] = (uintptr_t) sp;
++ ucp->uc_mcontext.__pc = (uintptr_t) &__start_context;
++
++ /* Put args in a0-a7, then put any remaining args on the stack. */
++ ucp->uc_mcontext.__gregs[LARCH_REG_A0 + 0] = (uintptr_t) a0;
++ ucp->uc_mcontext.__gregs[LARCH_REG_A0 + 1] = (uintptr_t) a1;
++ ucp->uc_mcontext.__gregs[LARCH_REG_A0 + 2] = (uintptr_t) a2;
++ ucp->uc_mcontext.__gregs[LARCH_REG_A0 + 3] = (uintptr_t) a3;
++ ucp->uc_mcontext.__gregs[LARCH_REG_A0 + 4] = (uintptr_t) a4;
++
++ if (__glibc_unlikely (argc > 5))
++ {
++ va_list vl;
++ va_start (vl, a4);
++
++ long int reg_args = argc < LARCH_REG_NARGS ? argc : LARCH_REG_NARGS;
++ for (long int i = 5; i < reg_args; i++)
++ ucp->uc_mcontext.__gregs[LARCH_REG_A0 + i] = va_arg (vl, unsigned long int);
++
++ long int stack_args = argc - reg_args;
++ if (stack_args > 0)
++ {
++ sp = (unsigned long int *)
++ (((uintptr_t) sp - stack_args * sizeof (long int)) & ALMASK);
++ ucp->uc_mcontext.__gregs[LARCH_REG_SP] = (uintptr_t) sp;
++ for (long int i = 0; i < stack_args; i++)
++ sp[i] = va_arg (vl, unsigned long int);
++ }
++
++ va_end (vl);
++ }
++}
++
++weak_alias (__makecontext, makecontext)
+diff --git a/sysdeps/unix/sysv/linux/loongarch/register-dump.h b/sysdeps/unix/sysv/linux/loongarch/register-dump.h
+new file mode 100644
+index 00000000..9000fc31
+--- /dev/null
++++ b/sysdeps/unix/sysv/linux/loongarch/register-dump.h
+@@ -0,0 +1,61 @@
++/* Dump registers.
++ Copyright (C) 2021 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 <unistd.h>
++#include <string.h>
++#include <_itoa.h>
++
++static void
++hexvalue (unsigned long int value, char *buf, size_t len)
++{
++ char *cp = _itoa_word (value, buf + len, 16, 0);
++ while (cp > buf)
++ *--cp = '0';
++}
++
++#define REGDUMP_NREGS 32
++#define REGDUMP_PER_LINE (80 / (__WORDSIZE / 4 + 4))
++
++static void
++register_dump (int fd, ucontext_t *ctx)
++{
++ int i;
++ char regvalue[__WORDSIZE / 4 + 1];
++ char str[82 * ((REGDUMP_NREGS + REGDUMP_PER_LINE - 1) / REGDUMP_PER_LINE)];
++
++ static const char names[REGDUMP_NREGS][4]
++ = {"pc", "ra", "tp", "sp", "a0", "a1", "a2", "a3", "a4", "a5", "a6",
++ "a7", "t0", "t1", "t2", "t3", "t4", "t5", "t6", "t7", "t8", "x",
++ "fp", "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8"};
++
++ str[0] = 0;
++ for (i = 0; i < REGDUMP_NREGS; i++)
++ {
++ strcat (str, names[i]);
++ strcat (str, " ");
++ hexvalue (ctx->uc_mcontext.__gregs[i], regvalue, __WORDSIZE / 4);
++ strcat (str, regvalue);
++
++ if ((i + 1) % REGDUMP_PER_LINE == 0)
++ strcat (str, "\n");
++ }
++
++ write (fd, str, strlen (str));
++}
++
++#define REGISTER_DUMP register_dump (fd, ctx)
+diff --git a/sysdeps/unix/sysv/linux/loongarch/setcontext.S b/sysdeps/unix/sysv/linux/loongarch/setcontext.S
+new file mode 100644
+index 00000000..31d6de0f
+--- /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 HIDDEN_JUMPTARGET (exit)
++
++PSEUDO_END (__start_context)
+diff --git a/sysdeps/unix/sysv/linux/loongarch/shlib-versions b/sysdeps/unix/sysv/linux/loongarch/shlib-versions
+new file mode 100644
+index 00000000..dc2220b4
+--- /dev/null
++++ b/sysdeps/unix/sysv/linux/loongarch/shlib-versions
+@@ -0,0 +1,7 @@
++DEFAULT GLIBC_2.36
++
++%if LOONGARCH_ABI_GRLEN == 64 && LOONGARCH_ABI_FRLEN == 64
++ld=ld-linux-loongarch-lp64d.so.1
++%else
++%error cannot determine ABI
++%endif
+diff --git a/sysdeps/unix/sysv/linux/loongarch/sigcontextinfo.h b/sysdeps/unix/sysv/linux/loongarch/sigcontextinfo.h
+new file mode 100644
+index 00000000..5e202bc0
+--- /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 00000000..bb22cd2f
+--- /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 00000000..db86380d
+--- /dev/null
++++ b/sysdeps/unix/sysv/linux/loongarch/sys/ucontext.h
+@@ -0,0 +1,64 @@
++/* 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
++
++typedef unsigned long int greg_t;
++/* Container for all general registers. */
++typedef greg_t gregset_t[32];
++#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 00000000..640b9b33
+--- /dev/null
++++ b/sysdeps/unix/sysv/linux/loongarch/sys/user.h
+@@ -0,0 +1,42 @@
++/* struct user_regs_struct definition for LoongArch.
++ Copyright (C) 2021 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/syscall.c b/sysdeps/unix/sysv/linux/loongarch/syscall.c
+new file mode 100644
+index 00000000..d0067bc2
+--- /dev/null
++++ b/sysdeps/unix/sysv/linux/loongarch/syscall.c
+@@ -0,0 +1,35 @@
++/* system call interface.
++ Copyright (C) 2021 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>
++
++long int
++syscall (long int syscall_number, long int arg1, long int arg2, long int arg3,
++ long int arg4, long int arg5, long int arg6, long int arg7)
++{
++ long int ret;
++
++ ret = INTERNAL_SYSCALL_NCS (syscall_number, 7, arg1, arg2, arg3, arg4, arg5,
++ arg6, arg7);
++
++ if (INTERNAL_SYSCALL_ERROR_P (ret))
++ return __syscall_error (ret);
++
++ return ret;
++}
+diff --git a/sysdeps/unix/sysv/linux/loongarch/sysdep.S b/sysdeps/unix/sysv/linux/loongarch/sysdep.S
+new file mode 100644
+index 00000000..865de9b2
+--- /dev/null
++++ b/sysdeps/unix/sysv/linux/loongarch/sysdep.S
+@@ -0,0 +1,53 @@
++/* syscall error handlers
++ Copyright (C) 2021 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 00000000..b2587091
+--- /dev/null
++++ b/sysdeps/unix/sysv/linux/loongarch/sysdep.h
+@@ -0,0 +1,320 @@
++/* Assembly macros for LoongArch.
++ Copyright (C) 2021 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_5.10"
++#define VDSO_HASH 182947696
++
++/* 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_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/ucontext-macros.h b/sysdeps/unix/sysv/linux/loongarch/ucontext-macros.h
+new file mode 100644
+index 00000000..859eba46
+--- /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 00000000..f27afad5
+--- /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)
+diff --git a/sysdeps/unix/sysv/linux/loongarch/vfork.S b/sysdeps/unix/sysv/linux/loongarch/vfork.S
+new file mode 100644
+index 00000000..585f98ee
+--- /dev/null
++++ b/sysdeps/unix/sysv/linux/loongarch/vfork.S
+@@ -0,0 +1,50 @@
++/* vfork for Linux.
++ Copyright (C) 2021 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.33.0
+