From patchwork Tue Jul 19 01:20:44 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: caiyinyu X-Patchwork-Id: 56138 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 1FA663850204 for ; Tue, 19 Jul 2022 01:21:22 +0000 (GMT) X-Original-To: libc-alpha@sourceware.org Delivered-To: libc-alpha@sourceware.org Received: from loongson.cn (mail.loongson.cn [114.242.206.163]) by sourceware.org (Postfix) with ESMTP id 8C4103858400 for ; Tue, 19 Jul 2022 01:21:07 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 8C4103858400 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=loongson.cn Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=loongson.cn Received: from 5.5.5 (unknown [10.2.5.5]) by mail.loongson.cn (Coremail) with SMTP id AQAAf9Dxf+P5BtZicpcnAA--.9695S3; Tue, 19 Jul 2022 09:21:02 +0800 (CST) From: caiyinyu To: adhemerval.zanella@linaro.org, libc-alpha@sourceware.org, joseph_myers@mentor.com, carlos@redhat.com, i.swmail@xen0n.name Subject: [PATCH v7 01/13] LoongArch: Add LoongArch entries to config.h.in Date: Tue, 19 Jul 2022 09:20:44 +0800 Message-Id: <20220719012056.1461897-2-caiyinyu@loongson.cn> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220719012056.1461897-1-caiyinyu@loongson.cn> References: <20220719012056.1461897-1-caiyinyu@loongson.cn> MIME-Version: 1.0 X-CM-TRANSID: AQAAf9Dxf+P5BtZicpcnAA--.9695S3 X-Coremail-Antispam: 1UD129KBjDUn29KB7ZKAUJUUUUU529EdanIXcx71UUUUU7v73 VFW2AGmfu7bjvjm3AaLaJ3UjIYCTnIWjp_UUUYu7AC8VAFwI0_Gr0_Xr1l1xkIjI8I6I8E 6xAIw20EY4v20xvaj40_Wr0E3s1l1IIY67AEw4v_Jr0_Jr4l82xGYIkIc2x26280x7IE14 v26r18M28IrcIa0xkI8VCY1x0267AKxVWUCVW8JwA2ocxC64kIII0Yj41l84x0c7CEw4AK 67xGY2AK021l84ACjcxK6xIIjxv20xvE14v26F1j6w1UM28EF7xvwVC0I7IYx2IY6xkF7I 0E14v26F4j6r4UJwA2z4x0Y4vEx4A2jsIE14v26r4UJVWxJr1l84ACjcxK6I8E87Iv6xkF 7I0E14v26r4UJVWxJr1le2I262IYc4CY6c8Ij28IcVAaY2xG8wAqx4xG64xvF2IEw4CE5I 8CrVC2j2WlYx0E2Ix0cI8IcVAFwI0_Jr0_Jr4lYx0Ex4A2jsIE14v26r1j6r4UMcvjeVCF s4IE7xkEbVWUJVW8JwACjcxG0xvY0x0EwIxGrwACjI8F5VA0II8E6IAqYI8I648v4I1lc2 xSY4AK6svPMxAIw28IcxkI7VAKI48JMxC20s026xCaFVCjc4AY6r1j6r4UMI8I3I0E5I8C rVAFwI0_Jr0_Jr4lx2IqxVCjr7xvwVAFwI0_JrI_JrWlx4CE17CEb7AF67AKxVWUAVWUtw CIc40Y0x0EwIxGrwCI42IY6xIIjxv20xvE14v26r1j6r1xMIIF0xvE2Ix0cI8IcVCY1x02 67AKxVW8JVWxJwCI42IY6xAIw20EY4v20xvaj40_Jr0_JF4lIxAIcVC2z280aVAFwI0_Jr 0_Gr1lIxAIcVC2z280aVCY1x0267AKxVW8JVW8JrUvcSsGvfC2KfnxnUUI43ZEXa7VUbzB T7UUUUU== X-CM-SenderInfo: 5fdl5xhq1xqz5rrqw2lrqou0/ X-Spam-Status: No, score=-13.4 required=5.0 tests=BAYES_00, GIT_PATCH_0, KAM_DMARC_STATUS, SPF_HELO_PASS, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: libc-alpha@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Libc-alpha mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: caiyinyu Errors-To: libc-alpha-bounces+patchwork=sourceware.org@sourceware.org Sender: "Libc-alpha" --- config.h.in | 6 ++++++ 1 file changed, 6 insertions(+) Reviewed-by: Adhemerval Zanella diff --git a/config.h.in b/config.h.in index bf316439a0..43d32518ab 100644 --- a/config.h.in +++ b/config.h.in @@ -132,6 +132,12 @@ /* RISC-V floating-point ABI for ld.so. */ #undef RISCV_ABI_FLEN +/* LOONGARCH integer ABI for ld.so. */ +#undef LOONGARCH_ABI_GRLEN + +/* LOONGARCH floating-point ABI for ld.so. */ +#undef LOONGARCH_ABI_FRLEN + /* Linux specific: minimum supported kernel version. */ #undef __LINUX_KERNEL_VERSION From patchwork Tue Jul 19 01:20:45 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: caiyinyu X-Patchwork-Id: 56139 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 5D66F384D18D for ; Tue, 19 Jul 2022 01:21:23 +0000 (GMT) X-Original-To: libc-alpha@sourceware.org Delivered-To: libc-alpha@sourceware.org Received: from loongson.cn (mail.loongson.cn [114.242.206.163]) by sourceware.org (Postfix) with ESMTP id 890A53858C2D for ; Tue, 19 Jul 2022 01:21:07 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 890A53858C2D Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=loongson.cn Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=loongson.cn Received: from 5.5.5 (unknown [10.2.5.5]) by mail.loongson.cn (Coremail) with SMTP id AQAAf9Dxf+P5BtZicpcnAA--.9695S4; Tue, 19 Jul 2022 09:21:02 +0800 (CST) From: caiyinyu To: adhemerval.zanella@linaro.org, libc-alpha@sourceware.org, joseph_myers@mentor.com, carlos@redhat.com, i.swmail@xen0n.name Subject: [PATCH v7 02/13] LoongArch: Add relocations and ELF flags to elf.h and scripts/glibcelf.py Date: Tue, 19 Jul 2022 09:20:45 +0800 Message-Id: <20220719012056.1461897-3-caiyinyu@loongson.cn> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220719012056.1461897-1-caiyinyu@loongson.cn> References: <20220719012056.1461897-1-caiyinyu@loongson.cn> MIME-Version: 1.0 X-CM-TRANSID: AQAAf9Dxf+P5BtZicpcnAA--.9695S4 X-Coremail-Antispam: 1UD129KBjvJXoWxCF45KF1xuF47Ar43KF4fAFb_yoW5Zr4kpr nrZFyYyF40kFs7u3WSqF1rA3W7Xr10yrWUJryUX3yUtF1kJ34xCw13Wr43GrWUWrZYyryr X395Zw15Wr9rX37anT9S1TB71UUUUUUqnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDU0xBIdaVrnRJUUUBS14x267AKxVW5JVWrJwAFc2x0x2IEx4CE42xK8VAvwI8IcIk0 rVWrJVCq3wAFIxvE14AKwVWUJVWUGwA2048vs2IY020E87I2jVAFwI0_Jryl82xGYIkIc2 x26xkF7I0E14v26r4j6ryUM28lY4IEw2IIxxk0rwA2F7IY1VAKz4vEj48ve4kI8wA2z4x0 Y4vE2Ix0cI8IcVAFwI0_Ar0_tr1l84ACjcxK6xIIjxv20xvEc7CjxVAFwI0_Cr0_Gr1UM2 8EF7xvwVC2z280aVAFwI0_Gr1j6F4UJwA2z4x0Y4vEx4A2jsIEc7CjxVAFwI0_Gr1j6F4U JwAS0I0E0xvYzxvE52x082IY62kv0487Mc02F40EFcxC0VAKzVAqx4xG6I80ewAv7VC0I7 IYx2IY67AKxVWUJVWUGwAv7VC2z280aVAFwI0_Jr0_Gr1lOx8S6xCaFVCjc4AY6r1j6r4U M4x0Y48IcxkI7VAKI48JM4x0x7Aq67IIx4CEVc8vx2IErcIFxwCY02Avz4vE-syl42xK82 IYc2Ij64vIr41l4I8I3I0E4IkC6x0Yz7v_Jr0_Gr1lx2IqxVAqx4xG67AKxVWUJVWUGwC2 0s026x8GjcxK67AKxVWUGVWUWwC2zVAF1VAY17CE14v26r126r1DMIIYrxkI7VAKI48JMI IF0xvE2Ix0cI8IcVAFwI0_Jr0_JF4lIxAIcVC0I7IYx2IY6xkF7I0E14v26r4j6F4UMIIF 0xvE42xK8VAvwI8IcIk0rVWUJVWUCwCI42IY6I8E87Iv67AKxVWUJVW8JwCI42IY6I8E87 Iv6xkF7I0E14v26r4j6r4UJbIYCTnIWIevJa73UjIFyTuYvjfU873vUUUUU X-CM-SenderInfo: 5fdl5xhq1xqz5rrqw2lrqou0/ X-Spam-Status: No, score=-13.5 required=5.0 tests=BAYES_00, GIT_PATCH_0, KAM_DMARC_STATUS, SPF_HELO_PASS, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: libc-alpha@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Libc-alpha mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: caiyinyu Errors-To: libc-alpha-bounces+patchwork=sourceware.org@sourceware.org Sender: "Libc-alpha" --- elf/elf.h | 68 ++++++++++++++++++++++++++++++++++++++++++++- scripts/glibcelf.py | 3 +- 2 files changed, 69 insertions(+), 2 deletions(-) Reviewed-by: Adhemerval Zanella diff --git a/elf/elf.h b/elf/elf.h index 2b5c2c5fb6..02a1b3f52f 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. */ @@ -4083,6 +4084,71 @@ enum #define R_NDS32_TLS_TPOFF 102 #define R_NDS32_TLS_DESC 119 +/* LoongArch ELF Flags */ +#define EF_LARCH_ABI 0x07 +#define EF_LARCH_ABI_LP64D 0x03 + +/* LoongArch specific dynamic relocations */ +#define R_LARCH_NONE 0 +#define R_LARCH_32 1 +#define R_LARCH_64 2 +#define R_LARCH_RELATIVE 3 +#define R_LARCH_COPY 4 +#define R_LARCH_JUMP_SLOT 5 +#define R_LARCH_TLS_DTPMOD32 6 +#define R_LARCH_TLS_DTPMOD64 7 +#define R_LARCH_TLS_DTPREL32 8 +#define R_LARCH_TLS_DTPREL64 9 +#define R_LARCH_TLS_TPREL32 10 +#define R_LARCH_TLS_TPREL64 11 +#define R_LARCH_IRELATIVE 12 + +/* Reserved for future relocs that the dynamic linker must understand. */ + +/* used by the static linker for relocating .text. */ +#define R_LARCH_MARK_LA 20 +#define R_LARCH_MARK_PCREL 21 +#define R_LARCH_SOP_PUSH_PCREL 22 +#define R_LARCH_SOP_PUSH_ABSOLUTE 23 +#define R_LARCH_SOP_PUSH_DUP 24 +#define R_LARCH_SOP_PUSH_GPREL 25 +#define R_LARCH_SOP_PUSH_TLS_TPREL 26 +#define R_LARCH_SOP_PUSH_TLS_GOT 27 +#define R_LARCH_SOP_PUSH_TLS_GD 28 +#define R_LARCH_SOP_PUSH_PLT_PCREL 29 +#define R_LARCH_SOP_ASSERT 30 +#define R_LARCH_SOP_NOT 31 +#define R_LARCH_SOP_SUB 32 +#define R_LARCH_SOP_SL 33 +#define R_LARCH_SOP_SR 34 +#define R_LARCH_SOP_ADD 35 +#define R_LARCH_SOP_AND 36 +#define R_LARCH_SOP_IF_ELSE 37 +#define R_LARCH_SOP_POP_32_S_10_5 38 +#define R_LARCH_SOP_POP_32_U_10_12 39 +#define R_LARCH_SOP_POP_32_S_10_12 40 +#define R_LARCH_SOP_POP_32_S_10_16 41 +#define R_LARCH_SOP_POP_32_S_10_16_S2 42 +#define R_LARCH_SOP_POP_32_S_5_20 43 +#define R_LARCH_SOP_POP_32_S_0_5_10_16_S2 44 +#define R_LARCH_SOP_POP_32_S_0_10_10_16_S2 45 +#define R_LARCH_SOP_POP_32_U 46 + +/* used by the static linker for relocating non .text. */ +#define R_LARCH_ADD8 47 +#define R_LARCH_ADD16 48 +#define R_LARCH_ADD24 49 +#define R_LARCH_ADD32 50 +#define R_LARCH_ADD64 51 +#define R_LARCH_SUB8 52 +#define R_LARCH_SUB16 53 +#define R_LARCH_SUB24 54 +#define R_LARCH_SUB32 55 +#define R_LARCH_SUB64 56 +#define R_LARCH_GNU_VTINHERIT 57 +#define R_LARCH_GNU_VTENTRY 58 + + /* ARCompact/ARCv2 specific relocs. */ #define R_ARC_NONE 0x0 #define R_ARC_8 0x1 diff --git a/scripts/glibcelf.py b/scripts/glibcelf.py index 47f95d07ba..de0509130e 100644 --- a/scripts/glibcelf.py +++ b/scripts/glibcelf.py @@ -252,7 +252,8 @@ class Machine(_OpenIntEnum): EM_RISCV = 243 EM_BPF = 247 EM_CSKY = 252 - EM_NUM = 253 + EM_LOONGARCH = 258 + EM_NUM = 259 EM_ALPHA = 0x9026 class Et(_OpenIntEnum): From patchwork Tue Jul 19 01:20:46 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: caiyinyu X-Patchwork-Id: 56147 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 91790385625B for ; Tue, 19 Jul 2022 01:22:35 +0000 (GMT) X-Original-To: libc-alpha@sourceware.org Delivered-To: libc-alpha@sourceware.org Received: from loongson.cn (mail.loongson.cn [114.242.206.163]) by sourceware.org (Postfix) with ESMTP id 230203858436 for ; Tue, 19 Jul 2022 01:21:07 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 230203858436 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=loongson.cn Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=loongson.cn Received: from 5.5.5 (unknown [10.2.5.5]) by mail.loongson.cn (Coremail) with SMTP id AQAAf9Dxf+P5BtZicpcnAA--.9695S5; Tue, 19 Jul 2022 09:21:03 +0800 (CST) From: caiyinyu To: adhemerval.zanella@linaro.org, libc-alpha@sourceware.org, joseph_myers@mentor.com, carlos@redhat.com, i.swmail@xen0n.name Subject: [PATCH v7 03/13] LoongArch: ABI Implementation Date: Tue, 19 Jul 2022 09:20:46 +0800 Message-Id: <20220719012056.1461897-4-caiyinyu@loongson.cn> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220719012056.1461897-1-caiyinyu@loongson.cn> References: <20220719012056.1461897-1-caiyinyu@loongson.cn> MIME-Version: 1.0 X-CM-TRANSID: AQAAf9Dxf+P5BtZicpcnAA--.9695S5 X-Coremail-Antispam: 1UD129KBjvAXoWfur48KFW8Zr4xKFyDCFyrXrb_yoWrJr47Zo WfuFW3Jr48Krs7Crs8KwsrXr9rWr4jgrZrZ3y3Z397GFy0yr15GFyFy3WYqrZrCr1kWFs5 XFySqFZrAFWI9rn3n29KB7ZKAUJUUUUU529EdanIXcx71UUUUU7v73VFW2AGmfu7bjvjm3 AaLaJ3UjIYCTnIWjp_UUUYu7AC8VAFwI0_Wr0E3s1l1xkIjI8I6I8E6xAIw20EY4v20xva j40_Wr0E3s1l1IIY67AEw4v_Jr0_Jr4l82xGYIkIc2x26280x7IE14v26r1rM28IrcIa0x kI8VCY1x0267AKxVW8JVW5JwA2ocxC64kIII0Yj41l84x0c7CEw4AK67xGY2AK021l84AC jcxK6xIIjxv20xvE14v26F1j6w1UM28EF7xvwVC0I7IYx2IY6xkF7I0E14v26F4j6r4UJw A2z4x0Y4vEx4A2jsIE14v26r4UJVWxJr1l84ACjcxK6I8E87Iv6xkF7I0E14v26r4UJVWx Jr1le2I262IYc4CY6c8Ij28IcVAaY2xG8wAqx4xG64xvF2IEw4CE5I8CrVC2j2WlYx0E2I x0cI8IcVAFwI0_Jr0_Jr4lYx0Ex4A2jsIE14v26r1j6r4UMcvjeVCFs4IE7xkEbVWUJVW8 JwACjcxG0xvY0x0EwIxGrwACjI8F5VA0II8E6IAqYI8I648v4I1lc2xSY4AK6svPMxAIw2 8IcxkI7VAKI48JMxC20s026xCaFVCjc4AY6r1j6r4UMI8I3I0E5I8CrVAFwI0_Jr0_Jr4l x2IqxVCjr7xvwVAFwI0_JrI_JrWlx4CE17CEb7AF67AKxVWUAVWUtwCIc40Y0x0EwIxGrw CI42IY6xIIjxv20xvE14v26r1j6r1xMIIF0xvE2Ix0cI8IcVCY1x0267AKxVW8JVWxJwCI 42IY6xAIw20EY4v20xvaj40_Jr0_JF4lIxAIcVC2z280aVAFwI0_Jr0_Gr1lIxAIcVC2z2 80aVCY1x0267AKxVW8JVW8JrUvcSsGvfC2KfnxnUUI43ZEXa7VUjw0eJUUUUU== X-CM-SenderInfo: 5fdl5xhq1xqz5rrqw2lrqou0/ X-Spam-Status: No, score=-12.7 required=5.0 tests=BAYES_00, GIT_PATCH_0, KAM_DMARC_STATUS, KAM_SHORT, KAM_STOCKGEN, SPF_HELO_PASS, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: libc-alpha@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Libc-alpha mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: caiyinyu Errors-To: libc-alpha-bounces+patchwork=sourceware.org@sourceware.org Sender: "Libc-alpha" --- sysdeps/loongarch/__longjmp.S | 50 +++++ sysdeps/loongarch/bits/endianness.h | 11 ++ sysdeps/loongarch/bits/link.h | 58 ++++++ sysdeps/loongarch/bits/setjmp.h | 39 ++++ sysdeps/loongarch/bsd-_setjmp.c | 1 + sysdeps/loongarch/bsd-setjmp.c | 1 + sysdeps/loongarch/dl-machine.h | 288 ++++++++++++++++++++++++++++ sysdeps/loongarch/dl-trampoline.S | 83 ++++++++ sysdeps/loongarch/jmpbuf-offsets.h | 22 +++ sysdeps/loongarch/jmpbuf-unwind.h | 45 +++++ sysdeps/loongarch/ldsodefs.h | 41 ++++ sysdeps/loongarch/linkmap.h | 22 +++ sysdeps/loongarch/machine-gmon.h | 37 ++++ sysdeps/loongarch/setjmp.S | 64 +++++++ sysdeps/loongarch/sotruss-lib.c | 50 +++++ sysdeps/loongarch/start.S | 66 +++++++ sysdeps/loongarch/sys/asm.h | 59 ++++++ sysdeps/loongarch/tst-audit.h | 23 +++ 18 files changed, 960 insertions(+) create mode 100644 sysdeps/loongarch/__longjmp.S create mode 100644 sysdeps/loongarch/bits/endianness.h create mode 100644 sysdeps/loongarch/bits/link.h create mode 100644 sysdeps/loongarch/bits/setjmp.h create mode 100644 sysdeps/loongarch/bsd-_setjmp.c create mode 100644 sysdeps/loongarch/bsd-setjmp.c create mode 100644 sysdeps/loongarch/dl-machine.h create mode 100644 sysdeps/loongarch/dl-trampoline.S create mode 100644 sysdeps/loongarch/jmpbuf-offsets.h create mode 100644 sysdeps/loongarch/jmpbuf-unwind.h create mode 100644 sysdeps/loongarch/ldsodefs.h create mode 100644 sysdeps/loongarch/linkmap.h create mode 100644 sysdeps/loongarch/machine-gmon.h create mode 100644 sysdeps/loongarch/setjmp.S create mode 100644 sysdeps/loongarch/sotruss-lib.c create mode 100644 sysdeps/loongarch/start.S create mode 100644 sysdeps/loongarch/sys/asm.h create mode 100644 sysdeps/loongarch/tst-audit.h Reviewed-by: Adhemerval Zanella diff --git a/sysdeps/loongarch/__longjmp.S b/sysdeps/loongarch/__longjmp.S new file mode 100644 index 0000000000..37e7384413 --- /dev/null +++ b/sysdeps/loongarch/__longjmp.S @@ -0,0 +1,50 @@ +/* longjmp. + Copyright (C) 2022 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library. If not, see + . */ + +#include +#include + +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 + + 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 + + sltui a0,a1,1 + ADD a0, a0, a1 # a0 = (a1 == 0) ? 1 : a1 + jirl zero,ra,0 + +END (__longjmp) diff --git a/sysdeps/loongarch/bits/endianness.h b/sysdeps/loongarch/bits/endianness.h new file mode 100644 index 0000000000..7290be7b18 --- /dev/null +++ b/sysdeps/loongarch/bits/endianness.h @@ -0,0 +1,11 @@ +#ifndef _BITS_ENDIANNESS_H +#define _BITS_ENDIANNESS_H 1 + +#ifndef _BITS_ENDIAN_H +#error "Never use directly; include instead." +#endif + +/* LoongArch is little-endian. */ +#define __BYTE_ORDER __LITTLE_ENDIAN + +#endif /* bits/endianness.h */ diff --git a/sysdeps/loongarch/bits/link.h b/sysdeps/loongarch/bits/link.h new file mode 100644 index 0000000000..05c91575e9 --- /dev/null +++ b/sysdeps/loongarch/bits/link.h @@ -0,0 +1,58 @@ +/* Machine-specific declarations for dynamic linker interface. + Copyright (C) 2022 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library. If not, see + . */ + +#ifndef _LINK_H +#error "Never include directly; use instead." +#endif + +typedef struct La_loongarch_regs +{ + unsigned long int lr_reg[8]; /* a0 - a7 */ + double lr_fpreg[8]; /* fa0 - fa7 */ + unsigned long int lr_ra; + unsigned long int lr_sp; +} La_loongarch_regs; + +/* Return values for calls from PLT on LoongArch. */ +typedef struct La_loongarch_retval +{ + unsigned long int lrv_a0; + unsigned long int lrv_a1; + double lrv_fa0; + double lrv_fa1; +} La_loongarch_retval; + +__BEGIN_DECLS + +extern ElfW (Addr) la_loongarch_gnu_pltenter (ElfW (Sym) *__sym, + unsigned int __ndx, + uintptr_t *__refcook, + uintptr_t *__defcook, + La_loongarch_regs *__regs, + unsigned int *__flags, + const char *__symname, + long int *__framesizep); +extern unsigned int la_loongarch_gnu_pltexit (ElfW (Sym) *__sym, + unsigned int __ndx, + uintptr_t *__refcook, + uintptr_t *__defcook, + const La_loongarch_regs *__inregs, + La_loongarch_retval *__outregs, + const char *__symname); + +__END_DECLS diff --git a/sysdeps/loongarch/bits/setjmp.h b/sysdeps/loongarch/bits/setjmp.h new file mode 100644 index 0000000000..42f8fa7657 --- /dev/null +++ b/sysdeps/loongarch/bits/setjmp.h @@ -0,0 +1,39 @@ +/* Define the machine-dependent type `jmp_buf'. + Copyright (C) 2022 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library. If not, see + . */ + +#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]; + /* Callee-saved floating point registers. */ + double __fpregs[8]; + +} __jmp_buf[1]; + +#endif /* _LOONGARCH_BITS_SETJMP_H */ diff --git a/sysdeps/loongarch/bsd-_setjmp.c b/sysdeps/loongarch/bsd-_setjmp.c new file mode 100644 index 0000000000..32f49441c3 --- /dev/null +++ b/sysdeps/loongarch/bsd-_setjmp.c @@ -0,0 +1 @@ +/* _setjmp is implemented in setjmp.S. */ diff --git a/sysdeps/loongarch/bsd-setjmp.c b/sysdeps/loongarch/bsd-setjmp.c new file mode 100644 index 0000000000..45fd802aac --- /dev/null +++ b/sysdeps/loongarch/bsd-setjmp.c @@ -0,0 +1 @@ +/* setjmp is implemented in setjmp.S. */ diff --git a/sysdeps/loongarch/dl-machine.h b/sysdeps/loongarch/dl-machine.h new file mode 100644 index 0000000000..c69c72d0ff --- /dev/null +++ b/sysdeps/loongarch/dl-machine.h @@ -0,0 +1,288 @@ +/* Machine-dependent ELF dynamic relocation inline functions. + Copyright (C) 2022 Free Software Foundation, Inc. + + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library. If not, see + . */ + +#ifndef dl_machine_h +#define dl_machine_h + +#define ELF_MACHINE_NAME "LoongArch" + +#include +#include +#include +#include +#include +#include + +#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 +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, $v0, $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. */ + +static inline void __attribute__ ((always_inline)) +elf_machine_rela (struct link_map *map, struct r_scope_elem *scope[], + const ElfW (Rela) *reloc, + const ElfW (Sym) *sym, + const struct r_found_version *version, + void *const reloc_addr, int skip_ifunc) +{ + ElfW (Addr) r_info = reloc->r_info; + const unsigned long int r_type = ELFW (R_TYPE) (r_info); + ElfW (Addr) *addr_field = (ElfW (Addr) *) reloc_addr; + const ElfW (Sym) *const __attribute__ ((unused)) refsym = sym; + struct link_map *sym_map = RESOLVE_MAP (map, scope, &sym, version, r_type); + ElfW (Addr) value = 0; + if (sym_map != NULL) + value = SYMBOL_ADDRESS (sym_map, sym, true) + reloc->r_addend; + + if (sym != NULL + && __glibc_unlikely (ELFW (ST_TYPE) (sym->st_info) == STT_GNU_IFUNC) + && __glibc_likely (sym->st_shndx != SHN_UNDEF) + && __glibc_likely (!skip_ifunc)) + 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: + *addr_field = sym_map->l_tls_modid; + break; + + case __WORDSIZE == 64 ? R_LARCH_TLS_DTPREL64: + R_LARCH_TLS_DTPREL32: + *addr_field = TLS_DTPREL_VALUE (sym) + reloc->r_addend; + break; + + case __WORDSIZE == 64 ? R_LARCH_TLS_TPREL64: + R_LARCH_TLS_TPREL32: + CHECK_STATIC_TLS (map, sym_map); + *addr_field = TLS_TPREL_VALUE (sym_map, sym) + reloc->r_addend; + break; + + case R_LARCH_COPY: + { + if (sym == NULL) + /* This can happen in trace mode if an object could not be + found. */ + break; + if (__glibc_unlikely (sym->st_size > refsym->st_size) + || (__glibc_unlikely (sym->st_size < refsym->st_size) + && GLRO(dl_verbose))) + { + const char *strtab; + + strtab = (const char *) D_PTR (map, l_info[DT_STRTAB]); + _dl_error_printf ("\ +%s: Symbol `%s' has different size in shared object, consider re-linking\n", + rtld_progname ?: "", + strtab + refsym->st_name); + } + memcpy (reloc_addr, (void *) value, + MIN (sym->st_size, refsym->st_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; + } +} + +static inline void __attribute__ ((always_inline)) +elf_machine_rela_relative (ElfW (Addr) l_addr, const ElfW (Rela) *reloc, + void *const reloc_addr) +{ + *(ElfW (Addr) *) reloc_addr = l_addr + reloc->r_addend; +} + +static inline void __attribute__ ((always_inline)) +elf_machine_lazy_rel (struct link_map *map, struct r_scope_elem *scope[], + ElfW (Addr) l_addr, + const ElfW (Rela) *reloc, int skip_ifunc) +{ + ElfW (Addr) *const reloc_addr = (void *) (l_addr + reloc->r_offset); + const unsigned int r_type = ELFW (R_TYPE) (reloc->r_info); + + /* Check for unexpected PLT reloc type. */ + if (__glibc_likely (r_type == R_LARCH_JUMP_SLOT)) + { + if (__glibc_unlikely (map->l_mach.plt == 0)) + { + if (l_addr) + *reloc_addr += l_addr; + } + else + *reloc_addr = map->l_mach.plt; + } + else + _dl_reloc_bad_type (map, r_type, 1); +} + +/* Set up the loaded object described by L so its stub function + will jump to the on-demand fixup code __dl_runtime_resolve. */ + +static inline int __attribute__ ((always_inline)) +elf_machine_runtime_setup (struct link_map *l, struct r_scope_elem *scope[], + int lazy, int profile) +{ +#ifndef RTLD_BOOTSTRAP + /* If using PLTs, fill in the first two entries of .got.plt. */ + if (l->l_info[DT_JMPREL]) + { + extern void _dl_runtime_resolve (void) + __attribute__ ((visibility ("hidden"))); + ElfW (Addr) *gotplt = (ElfW (Addr) *) D_PTR (l, l_info[DT_PLTGOT]); + gotplt[0] = (ElfW (Addr)) & _dl_runtime_resolve; + gotplt[1] = (ElfW (Addr)) l; + } +#endif + + return lazy; +} + +#endif /* RESOLVE_MAP */ diff --git a/sysdeps/loongarch/dl-trampoline.S b/sysdeps/loongarch/dl-trampoline.S new file mode 100644 index 0000000000..ad8ab0fda7 --- /dev/null +++ b/sysdeps/loongarch/dl-trampoline.S @@ -0,0 +1,83 @@ +/* PLT trampolines. + Copyright (C) 2022 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library. If not, see + . */ + +#include +#include + +/* Assembler veneer called from the PLT header code for lazy loading. + The PLT header passes its own args in t0-t2. */ + +# define FRAME_SIZE (-((-10 * SZREG - 8 * SZFREG) & ALMASK)) + +ENTRY (_dl_runtime_resolve) + + /* Save arguments to stack. */ + ADDI sp, sp, -FRAME_SIZE + + REG_S ra, sp, 9*SZREG + REG_S a0, sp, 1*SZREG + REG_S a1, sp, 2*SZREG + REG_S a2, sp, 3*SZREG + REG_S a3, sp, 4*SZREG + REG_S a4, sp, 5*SZREG + REG_S a5, sp, 6*SZREG + REG_S a6, sp, 7*SZREG + REG_S a7, sp, 8*SZREG + + 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 + + /* Update .got.plt and obtain runtime address of callee */ + SLLI a1, t1, 1 + or a0, t0, zero + ADD a1, a1, t1 + la a2, _dl_fixup + jirl ra, a2, 0 + or t1, v0, zero + + /* Restore arguments from stack. */ + REG_L ra, sp, 9*SZREG + REG_L a0, sp, 1*SZREG + REG_L a1, sp, 2*SZREG + REG_L a2, sp, 3*SZREG + REG_L a3, sp, 4*SZREG + REG_L a4, sp, 5*SZREG + REG_L a5, sp, 6*SZREG + REG_L a6, sp, 7*SZREG + REG_L a7, sp, 8*SZREG + + 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 + + ADDI sp, sp, FRAME_SIZE + + /* Invoke the callee. */ + jirl zero, t1, 0 +END (_dl_runtime_resolve) diff --git a/sysdeps/loongarch/jmpbuf-offsets.h b/sysdeps/loongarch/jmpbuf-offsets.h new file mode 100644 index 0000000000..a4b8ea690e --- /dev/null +++ b/sysdeps/loongarch/jmpbuf-offsets.h @@ -0,0 +1,22 @@ +/* Private macros for accessing __jmp_buf contents. + Copyright (C) 2022 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public License as + published by the Free Software Foundation; either version 2.1 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library. If not, see + . */ + +#include + +/* Helper for generic ____longjmp_chk(). */ +#define JB_FRAME_ADDRESS(buf) ((void *) _jmpbuf_sp (buf)) diff --git a/sysdeps/loongarch/jmpbuf-unwind.h b/sysdeps/loongarch/jmpbuf-unwind.h new file mode 100644 index 0000000000..6fa509151d --- /dev/null +++ b/sysdeps/loongarch/jmpbuf-unwind.h @@ -0,0 +1,45 @@ +/* Examine __jmp_buf for unwinding frames. + Copyright (C) 2022 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library. If not, see + . */ + +#include +#include +#include +#include + +/* Test if longjmp to JMPBUF would unwind the frame + containing a local variable at ADDRESS. */ +#define _JMPBUF_UNWINDS(jmpbuf, address, demangle) \ + ((void *) (address) < (void *) demangle ((jmpbuf)[0].__sp)) + +#define _JMPBUF_CFA_UNWINDS_ADJ(_jmpbuf, _context, _adj) \ + _JMPBUF_UNWINDS_ADJ (_jmpbuf, (void *) _Unwind_GetCFA (_context), _adj) + +static inline uintptr_t __attribute__ ((unused)) _jmpbuf_sp (__jmp_buf regs) +{ + uintptr_t sp = regs[0].__sp; +#ifdef PTR_DEMANGLE + PTR_DEMANGLE (sp); +#endif + return sp; +} + +#define _JMPBUF_UNWINDS_ADJ(_jmpbuf, _address, _adj) \ + ((uintptr_t) (_address) - (_adj) < _jmpbuf_sp (_jmpbuf) - (_adj)) + +/* We use the normal longjmp for unwinding. */ +#define __libc_unwind_longjmp(buf, val) __libc_longjmp (buf, val) diff --git a/sysdeps/loongarch/ldsodefs.h b/sysdeps/loongarch/ldsodefs.h new file mode 100644 index 0000000000..36b1b25b9f --- /dev/null +++ b/sysdeps/loongarch/ldsodefs.h @@ -0,0 +1,41 @@ +/* Run-time dynamic linker data structures for loaded ELF shared objects. + Copyright (C) 2022 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library. If not, see + . */ + +#ifndef _LOONGARCH_LDSODEFS_H +#define _LOONGARCH_LDSODEFS_H 1 + +#include + +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 + +#endif diff --git a/sysdeps/loongarch/linkmap.h b/sysdeps/loongarch/linkmap.h new file mode 100644 index 0000000000..bbba73ed70 --- /dev/null +++ b/sysdeps/loongarch/linkmap.h @@ -0,0 +1,22 @@ +/* Definition of link_map_machine. + Copyright (C) 2022 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library. If not, see + . */ + +struct link_map_machine +{ + ElfW (Addr) plt; /* Address of .plt. */ +}; diff --git a/sysdeps/loongarch/machine-gmon.h b/sysdeps/loongarch/machine-gmon.h new file mode 100644 index 0000000000..4a3cdd964e --- /dev/null +++ b/sysdeps/loongarch/machine-gmon.h @@ -0,0 +1,37 @@ +/* LoongArch definitions for profiling support. + Copyright (C) 2022 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +/* Accept 'frompc' address as argument from the function that calls + _mcount for profiling. Use __builtin_return_address (0) + for the 'selfpc' address. */ + +#include + +static void mcount_internal (unsigned long int frompc, + unsigned long int selfpc); + +#define _MCOUNT_DECL(frompc, selfpc) \ + static inline void mcount_internal (unsigned long int frompc, \ + unsigned long int selfpc) + +#define MCOUNT \ + void _mcount (void *frompc) \ + { \ + mcount_internal ((unsigned long int) frompc, \ + (unsigned long int) RETURN_ADDRESS (0)); \ + } diff --git a/sysdeps/loongarch/setjmp.S b/sysdeps/loongarch/setjmp.S new file mode 100644 index 0000000000..3afb9f3948 --- /dev/null +++ b/sysdeps/loongarch/setjmp.S @@ -0,0 +1,64 @@ +/* setjmp for LoongArch. + Copyright (C) 2022 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library. If not, see + . */ + +#include +#include + +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 + + 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 + +#if !IS_IN (libc) && IS_IN(rtld) + li.w v0, 0 + jirl zero,ra,0 +#else + b __sigjmp_save +#endif +END (__sigsetjmp) + +hidden_def (__sigsetjmp) +weak_alias (_setjmp, __GI__setjmp) diff --git a/sysdeps/loongarch/sotruss-lib.c b/sysdeps/loongarch/sotruss-lib.c new file mode 100644 index 0000000000..ce752785f6 --- /dev/null +++ b/sysdeps/loongarch/sotruss-lib.c @@ -0,0 +1,50 @@ +/* Override generic sotruss-lib.c to define actual functions for LoongArch. + Copyright (C) 2022 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library. If not, see + . */ + +#define HAVE_ARCH_PLTENTER +#define HAVE_ARCH_PLTEXIT + +#include + +ElfW (Addr) +la_loongarch_gnu_pltenter (ElfW (Sym) *sym __attribute__ ((unused)), + unsigned int ndx __attribute__ ((unused)), + uintptr_t *refcook, uintptr_t *defcook, + La_loongarch_regs *regs, unsigned int *flags, + const char *symname, long int *framesizep) +{ + print_enter (refcook, defcook, symname, regs->lr_reg[0], regs->lr_reg[1], + regs->lr_reg[2], *flags); + + /* No need to copy anything, we will not need the parameters in any case. */ + *framesizep = 0; + + return sym->st_value; +} + +unsigned int +la_loongarch_gnu_pltexit (ElfW (Sym) *sym, unsigned int ndx, + uintptr_t *refcook, uintptr_t *defcook, + const struct La_loongarch_regs *inregs, + struct La_loongarch_retval *outregs, + const char *symname) +{ + print_exit (refcook, defcook, symname, outregs->lrv_a0); + + return 0; +} diff --git a/sysdeps/loongarch/start.S b/sysdeps/loongarch/start.S new file mode 100644 index 0000000000..280b5fab8c --- /dev/null +++ b/sysdeps/loongarch/start.S @@ -0,0 +1,66 @@ +/* Startup code compliant to the ELF LoongArch ABI. + Copyright (C) 2022 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library. If not, see + . */ + +#define __ASSEMBLY__ 1 +#include +#include + +/* The entry point's job is to call __libc_start_main. Per the ABI, + a0 contains the address of a function to be passed to atexit. + __libc_start_main wants this in a5. */ + +/* +int +__libc_start_main (int (*main) (int, char **, char **), + int argc, + char **argv, + __typeof (main) init, + void (*fini) (void), + void (*rtld_fini) (void), + void *stack_end); + */ + +ENTRY (ENTRY_POINT) + +/* Terminate call stack by noting ra is undefined. Use a dummy + .cfi_label to force starting the FDE. */ + .cfi_label .Ldummy + cfi_undefined (1) + or a5, a0, zero /* rtld_fini */ + +/* We must get symbol main through GOT table, since main may not be local. + For instance: googletest defines main in dynamic library. */ + la.got a0, t0, main + REG_L a1, sp, 0 + ADDI a2, sp, SZREG + + /* Adjust $sp for 16-aligned */ + BSTRINS sp, zero, 3, 0 + + move a3, zero /* used to be init */ + move a4, zero /* used to be fini */ + or a6, sp, zero /* stack_end */ + + la.got ra, t0, __libc_start_main + jirl ra, ra, 0 + + la.got ra, t0, abort + jirl ra, ra, 0 +END (ENTRY_POINT) + diff --git a/sysdeps/loongarch/sys/asm.h b/sysdeps/loongarch/sys/asm.h new file mode 100644 index 0000000000..b41ee59694 --- /dev/null +++ b/sysdeps/loongarch/sys/asm.h @@ -0,0 +1,59 @@ +/* Miscellaneous macros. + Copyright (C) 2022 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library. If not, see + . */ + +#ifndef _SYS_ASM_H +#define _SYS_ASM_H + +#include +#include + +/* Macros to handle different pointer/register sizes for 32/64-bit code. */ +#define SZREG 8 +#define SZFREG 8 +#define REG_L ld.d +#define REG_S st.d +#define SRLI srli.d +#define SLLI slli.d +#define ADDI addi.d +#define ADD add.d +#define BSTRINS bstrins.d +#define LI li.d +#define FREG_L fld.d +#define FREG_S fst.d + +/* Declare leaf routine. */ +#define LEAF(symbol) \ + .text; \ + .globl symbol; \ + .align 3; \ + cfi_startproc; \ + .type symbol, @function; \ + symbol: + +#define ENTRY(symbol) LEAF (symbol) + +/* Mark end of function. */ +#undef END +#define END(function) \ + cfi_endproc; \ + .size function, .- function; + +/* Stack alignment. */ +#define ALMASK ~15 + +#endif /* sys/asm.h */ diff --git a/sysdeps/loongarch/tst-audit.h b/sysdeps/loongarch/tst-audit.h new file mode 100644 index 0000000000..e71948c86e --- /dev/null +++ b/sysdeps/loongarch/tst-audit.h @@ -0,0 +1,23 @@ +/* Definitions for testing PLT entry/exit auditing. + Copyright (C) 2022 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library. If not, see + . */ + +#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 From patchwork Tue Jul 19 01:20:47 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: caiyinyu X-Patchwork-Id: 56142 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id C09E73838F2B for ; Tue, 19 Jul 2022 01:21:48 +0000 (GMT) X-Original-To: libc-alpha@sourceware.org Delivered-To: libc-alpha@sourceware.org Received: from loongson.cn (mail.loongson.cn [114.242.206.163]) by sourceware.org (Postfix) with ESMTP id 5C3353858437 for ; Tue, 19 Jul 2022 01:21:09 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 5C3353858437 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=loongson.cn Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=loongson.cn Received: from 5.5.5 (unknown [10.2.5.5]) by mail.loongson.cn (Coremail) with SMTP id AQAAf9Dxf+P5BtZicpcnAA--.9695S6; Tue, 19 Jul 2022 09:21:04 +0800 (CST) From: caiyinyu To: adhemerval.zanella@linaro.org, libc-alpha@sourceware.org, joseph_myers@mentor.com, carlos@redhat.com, i.swmail@xen0n.name Subject: [PATCH v7 04/13] LoongArch: Thread-Local Storage Support Date: Tue, 19 Jul 2022 09:20:47 +0800 Message-Id: <20220719012056.1461897-5-caiyinyu@loongson.cn> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220719012056.1461897-1-caiyinyu@loongson.cn> References: <20220719012056.1461897-1-caiyinyu@loongson.cn> MIME-Version: 1.0 X-CM-TRANSID: AQAAf9Dxf+P5BtZicpcnAA--.9695S6 X-Coremail-Antispam: 1UD129KBjvJXoW3ZrWkWrW3uF45Wr4kCF47CFg_yoWDWr48pF W5CFy5GF48GF4xC34xX3W7ZF1rJan3uF4jkry3Xr4UAan8K348XrsF9FWrWFWxCrZ5Cryj vrWavay7ua9rJaUanT9S1TB71UUUUUUqnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDU0xBIdaVrnRJUUUBm14x267AKxVWrJVCq3wAFc2x0x2IEx4CE42xK8VAvwI8IcIk0 rVWrJVCq3wAFIxvE14AKwVWUJVWUGwA2048vs2IY020E87I2jVAFwI0_JF0E3s1l82xGYI kIc2x26xkF7I0E14v26ryj6s0DM28lY4IEw2IIxxk0rwA2F7IY1VAKz4vEj48ve4kI8wA2 z4x0Y4vE2Ix0cI8IcVAFwI0_Ar0_tr1l84ACjcxK6xIIjxv20xvEc7CjxVAFwI0_Cr0_Gr 1UM28EF7xvwVC2z280aVAFwI0_Gr1j6F4UJwA2z4x0Y4vEx4A2jsIEc7CjxVAFwI0_Gr1j 6F4UJwAS0I0E0xvYzxvE52x082IY62kv0487Mc02F40EFcxC0VAKzVAqx4xG6I80ewAv7V C0I7IYx2IY67AKxVWUJVWUGwAv7VC2z280aVAFwI0_Jr0_Gr1lOx8S6xCaFVCjc4AY6r1j 6r4UM4x0Y48IcxkI7VAKI48JM4x0x7Aq67IIx4CEVc8vx2IErcIFxwCY02Avz4vE-syl42 xK82IYc2Ij64vIr41l4I8I3I0E4IkC6x0Yz7v_Jr0_Gr1lx2IqxVAqx4xG67AKxVWUJVWU GwC20s026x8GjcxK67AKxVWUGVWUWwC2zVAF1VAY17CE14v26r126r1DMIIYrxkI7VAKI4 8JMIIF0xvE2Ix0cI8IcVAFwI0_Jr0_JF4lIxAIcVC0I7IYx2IY6xkF7I0E14v26r4j6F4U MIIF0xvE42xK8VAvwI8IcIk0rVWUJVWUCwCI42IY6I8E87Iv67AKxVWUJVW8JwCI42IY6I 8E87Iv6xkF7I0E14v26r4j6r4UJbIYCTnIWIevJa73UjIFyTuYvjfUOBTYUUUUU X-CM-SenderInfo: 5fdl5xhq1xqz5rrqw2lrqou0/ X-Spam-Status: No, score=-13.5 required=5.0 tests=BAYES_00, GIT_PATCH_0, KAM_DMARC_STATUS, KAM_SHORT, SPF_HELO_PASS, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: libc-alpha@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Libc-alpha mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: caiyinyu Errors-To: libc-alpha-bounces+patchwork=sourceware.org@sourceware.org Sender: "Libc-alpha" --- sysdeps/loongarch/dl-tls.h | 46 ++++++++++++ sysdeps/loongarch/libc-tls.c | 32 ++++++++ sysdeps/loongarch/nptl/tls.h | 138 ++++++++++++++++++++++++++++++++++ sysdeps/loongarch/stackinfo.h | 33 ++++++++ 4 files changed, 249 insertions(+) create mode 100644 sysdeps/loongarch/dl-tls.h create mode 100644 sysdeps/loongarch/libc-tls.c create mode 100644 sysdeps/loongarch/nptl/tls.h create mode 100644 sysdeps/loongarch/stackinfo.h Reviewed-by: Adhemerval Zanella diff --git a/sysdeps/loongarch/dl-tls.h b/sysdeps/loongarch/dl-tls.h new file mode 100644 index 0000000000..f82edcae76 --- /dev/null +++ b/sysdeps/loongarch/dl-tls.h @@ -0,0 +1,46 @@ +/* Thread-local storage handling in the ELF dynamic linker. + Copyright (C) 2022 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library. If not, see + . */ + +/* Type used for the representation of TLS information in the GOT. */ +typedef struct +{ + unsigned long int ti_module; + unsigned long int ti_offset; +} tls_index; + +/* The thread pointer points to the first static TLS block. */ +#define TLS_TP_OFFSET 0 + +/* Dynamic thread vector pointers point to the start of each + TLS block. */ +#define TLS_DTV_OFFSET 0 + +/* Compute the value for a GOTTPREL reloc. */ +#define TLS_TPREL_VALUE(sym_map, sym) \ + ((sym_map)->l_tls_offset + (sym)->st_value - TLS_TP_OFFSET) + +/* Compute the value for a DTPREL reloc. */ +#define TLS_DTPREL_VALUE(sym) ((sym)->st_value - TLS_DTV_OFFSET) + +extern void *__tls_get_addr (tls_index *ti); + +#define GET_ADDR_OFFSET (ti->ti_offset + TLS_DTV_OFFSET) +#define __TLS_GET_ADDR(__ti) (__tls_get_addr (__ti) - TLS_DTV_OFFSET) + +/* Value used for dtv entries for which the allocation is delayed. */ +#define TLS_DTV_UNALLOCATED ((void *) -1l) diff --git a/sysdeps/loongarch/libc-tls.c b/sysdeps/loongarch/libc-tls.c new file mode 100644 index 0000000000..9285d11a7b --- /dev/null +++ b/sysdeps/loongarch/libc-tls.c @@ -0,0 +1,32 @@ +/* Thread-local storage handling in the ELF dynamic linker. + Copyright (C) 2022 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library. If not, see + . */ + +#include +#include + +/* On LoongArch, linker optimizations are not required, so __tls_get_addr + can be called even in statically linked binaries. In this case module + must be always 1 and PT_TLS segment exist in the binary, otherwise it + would not link. */ + +void * +__tls_get_addr (tls_index *ti) +{ + dtv_t *dtv = THREAD_DTV (); + return (char *) dtv[1].pointer.val + GET_ADDR_OFFSET; +} diff --git a/sysdeps/loongarch/nptl/tls.h b/sysdeps/loongarch/nptl/tls.h new file mode 100644 index 0000000000..3b271c4b60 --- /dev/null +++ b/sysdeps/loongarch/nptl/tls.h @@ -0,0 +1,138 @@ +/* Definition for thread-local data handling. + Copyright (C) 2022 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library. If not, see + . */ + +#ifndef _LOONGARCH_TLS_H +#define _LOONGARCH_TLS_H 1 + +#include + +#ifndef __ASSEMBLER__ +#include +#include +#include +#include + +register void *__thread_self asm ("$tp"); +#define READ_THREAD_POINTER() ({ __thread_self; }) + +/* Get system call information. */ +#include + +/* 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 + +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 + +/* l_tls_offset == 0 is perfectly valid, so we have to use some different + value to mean unset l_tls_offset. */ +#define NO_TLS_OFFSET -1 + +/* Get and set the global scope generation counter in struct pthread. */ +#define THREAD_GSCOPE_IN_TCB 1 +#define THREAD_GSCOPE_FLAG_UNUSED 0 +#define THREAD_GSCOPE_FLAG_USED 1 +#define THREAD_GSCOPE_FLAG_WAIT 2 +#define THREAD_GSCOPE_RESET_FLAG() \ + do \ + { \ + int __res = atomic_exchange_rel (&THREAD_SELF->header.gscope_flag, \ + THREAD_GSCOPE_FLAG_UNUSED); \ + if (__res == THREAD_GSCOPE_FLAG_WAIT) \ + lll_futex_wake (&THREAD_SELF->header.gscope_flag, 1, LLL_PRIVATE); \ + } \ + while (0) +#define THREAD_GSCOPE_SET_FLAG() \ + do \ + { \ + THREAD_SELF->header.gscope_flag = THREAD_GSCOPE_FLAG_USED; \ + atomic_write_barrier (); \ + } \ + while (0) + +#endif /* __ASSEMBLER__ */ + +#endif /* tls.h */ diff --git a/sysdeps/loongarch/stackinfo.h b/sysdeps/loongarch/stackinfo.h new file mode 100644 index 0000000000..ff8b9b7bf2 --- /dev/null +++ b/sysdeps/loongarch/stackinfo.h @@ -0,0 +1,33 @@ +/* Stack environment definitions for LoongArch. + Copyright (C) 2022 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library. If not, see + . */ + +/* This file contains a bit of information about the stack allocation + of the processor. */ + +#ifndef _STACKINFO_H +#define _STACKINFO_H 1 + +#include + +/* 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 */ From patchwork Tue Jul 19 01:20:48 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: caiyinyu X-Patchwork-Id: 56144 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id EF28A3835823 for ; Tue, 19 Jul 2022 01:22:11 +0000 (GMT) X-Original-To: libc-alpha@sourceware.org Delivered-To: libc-alpha@sourceware.org Received: from loongson.cn (mail.loongson.cn [114.242.206.163]) by sourceware.org (Postfix) with ESMTP id 6B9833858439 for ; Tue, 19 Jul 2022 01:21:09 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 6B9833858439 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=loongson.cn Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=loongson.cn Received: from 5.5.5 (unknown [10.2.5.5]) by mail.loongson.cn (Coremail) with SMTP id AQAAf9Dxf+P5BtZicpcnAA--.9695S7; Tue, 19 Jul 2022 09:21:05 +0800 (CST) From: caiyinyu To: adhemerval.zanella@linaro.org, libc-alpha@sourceware.org, joseph_myers@mentor.com, carlos@redhat.com, i.swmail@xen0n.name Subject: [PATCH v7 05/13] LoongArch: Generic and soft-fp Routines Date: Tue, 19 Jul 2022 09:20:48 +0800 Message-Id: <20220719012056.1461897-6-caiyinyu@loongson.cn> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220719012056.1461897-1-caiyinyu@loongson.cn> References: <20220719012056.1461897-1-caiyinyu@loongson.cn> MIME-Version: 1.0 X-CM-TRANSID: AQAAf9Dxf+P5BtZicpcnAA--.9695S7 X-Coremail-Antispam: 1UD129KBjvJXoW3CF1UJF48tr4Uury8CF48WFg_yoWkKF48pF Z5CFy5GF4xta1Sgwn3K3W5WF1fGFs3WF1jgr9xur48Arnxt34xWrn2k39YgFy8Xr1fu34j vF45Aa47CF93A3DanT9S1TB71UUUUUUqnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDU0xBIdaVrnRJUUUBl14x267AKxVWrJVCq3wAFc2x0x2IEx4CE42xK8VAvwI8IcIk0 rVWrJVCq3wAFIxvE14AKwVWUJVWUGwA2048vs2IY020E87I2jVAFwI0_JF0E3s1l82xGYI kIc2x26xkF7I0E14v26ryj6s0DM28lY4IEw2IIxxk0rwA2F7IY1VAKz4vEj48ve4kI8wA2 z4x0Y4vE2Ix0cI8IcVAFwI0_Ar0_tr1l84ACjcxK6xIIjxv20xvEc7CjxVAFwI0_Gr1j6F 4UJwA2z4x0Y4vEx4A2jsIE14v26r4UJVWxJr1l84ACjcxK6I8E87Iv6xkF7I0E14v26r4U JVWxJr1le2I262IYc4CY6c8Ij28IcVAaY2xG8wAqx4xG64xvF2IEw4CE5I8CrVC2j2WlYx 0E2Ix0cI8IcVAFwI0_Jr0_Jr4lYx0Ex4A2jsIE14v26r1j6r4UMcvjeVCFs4IE7xkEbVWU JVW8JwACjcxG0xvY0x0EwIxGrwACjI8F5VA0II8E6IAqYI8I648v4I1lc2xSY4AK6svPMx AIw28IcxkI7VAKI48JMxC20s026xCaFVCjc4AY6r1j6r4UMI8I3I0E5I8CrVAFwI0_Jr0_ Jr4lx2IqxVCjr7xvwVAFwI0_JrI_JrWlx4CE17CEb7AF67AKxVWUAVWUtwCIc40Y0x0EwI xGrwCI42IY6xIIjxv20xvE14v26r1I6r4UMIIF0xvE2Ix0cI8IcVCY1x0267AKxVW8JVWx JwCI42IY6xAIw20EY4v20xvaj40_Jr0_JF4lIxAIcVC2z280aVAFwI0_Jr0_Gr1lIxAIcV C2z280aVCY1x0267AKxVW8JVW8JrUvcSsGvfC2KfnxnUUI43ZEXa7VUbmZX7UUUUU== X-CM-SenderInfo: 5fdl5xhq1xqz5rrqw2lrqou0/ X-Spam-Status: No, score=-13.5 required=5.0 tests=BAYES_00, GIT_PATCH_0, KAM_DMARC_STATUS, KAM_SHORT, SPF_HELO_PASS, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: libc-alpha@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Libc-alpha mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: caiyinyu Errors-To: libc-alpha-bounces+patchwork=sourceware.org@sourceware.org Sender: "Libc-alpha" --- sysdeps/loongarch/bits/fenv.h | 90 ++++++++++++++++++++++++++++ sysdeps/loongarch/e_sqrtl.c | 39 ++++++++++++ sysdeps/loongarch/fpu_control.h | 90 ++++++++++++++++++++++++++++ sysdeps/loongarch/sfp-machine.h | 102 ++++++++++++++++++++++++++++++++ sysdeps/loongarch/tininess.h | 1 + 5 files changed, 322 insertions(+) create mode 100644 sysdeps/loongarch/bits/fenv.h create mode 100644 sysdeps/loongarch/e_sqrtl.c create mode 100644 sysdeps/loongarch/fpu_control.h create mode 100644 sysdeps/loongarch/sfp-machine.h create mode 100644 sysdeps/loongarch/tininess.h Reviewed-by: Adhemerval Zanella diff --git a/sysdeps/loongarch/bits/fenv.h b/sysdeps/loongarch/bits/fenv.h new file mode 100644 index 0000000000..7e223b402b --- /dev/null +++ b/sysdeps/loongarch/bits/fenv.h @@ -0,0 +1,90 @@ +/* Floating point environment. + Copyright (C) 2022 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library. If not, see + . */ + +#ifndef _FENV_H +#error "Never use directly; include instead." +#endif + +/* Define bits representing the exception. We use the bit positions + of the appropriate bits in the FPU control word. */ +enum +{ + FE_INEXACT = +#define FE_INEXACT 0x010000 + FE_INEXACT, + FE_UNDERFLOW = +#define FE_UNDERFLOW 0x020000 + FE_UNDERFLOW, + FE_OVERFLOW = +#define FE_OVERFLOW 0x040000 + FE_OVERFLOW, + FE_DIVBYZERO = +#define FE_DIVBYZERO 0x080000 + FE_DIVBYZERO, + FE_INVALID = +#define FE_INVALID 0x100000 + FE_INVALID, +}; + +#define FE_ALL_EXCEPT \ + (FE_INEXACT | FE_DIVBYZERO | FE_UNDERFLOW | FE_OVERFLOW | FE_INVALID) + +/* The LoongArch FPU supports all of the four defined rounding modes. We + use again the bit positions in the FPU control word as the values + for the appropriate macros. */ +enum +{ + FE_TONEAREST = +#define FE_TONEAREST 0x000 + FE_TONEAREST, + FE_TOWARDZERO = +#define FE_TOWARDZERO 0x100 + FE_TOWARDZERO, + FE_UPWARD = +#define FE_UPWARD 0x200 + FE_UPWARD, + FE_DOWNWARD = +#define FE_DOWNWARD 0x300 + FE_DOWNWARD +}; + +/* Type representing exception flags. */ +typedef unsigned int fexcept_t; + +/* Type representing floating-point environment. This function corresponds + to the layout of the block written by the `fstenv'. */ +typedef struct +{ + unsigned int __fp_control_register; +} fenv_t; + +/* If the default argument is used we use this value. */ +#define FE_DFL_ENV ((const fenv_t *) -1) + +#ifdef __USE_GNU +/* Floating-point environment where none of the exception is masked. */ +#define FE_NOMASK_ENV ((const fenv_t *) -257) +#endif + +#if __GLIBC_USE (IEC_60559_BFP_EXT_C2X) +/* Type representing floating-point control modes. */ +typedef unsigned int femode_t; + +/* Default floating-point control modes. */ +#define FE_DFL_MODE ((const femode_t *) -1L) +#endif diff --git a/sysdeps/loongarch/e_sqrtl.c b/sysdeps/loongarch/e_sqrtl.c new file mode 100644 index 0000000000..020c8911e6 --- /dev/null +++ b/sysdeps/loongarch/e_sqrtl.c @@ -0,0 +1,39 @@ +/* long double square root in software floating-point emulation. + Copyright (C) 2022 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library. If not, see + . */ + +#include +#include +#include +#include + +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_control.h b/sysdeps/loongarch/fpu_control.h new file mode 100644 index 0000000000..d34936c62b --- /dev/null +++ b/sysdeps/loongarch/fpu_control.h @@ -0,0 +1,90 @@ +/* FPU control word bits. + Copyright (C) 2022 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library. If not, see + . */ + +#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 + +/* 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 /* fpu_control.h */ + diff --git a/sysdeps/loongarch/sfp-machine.h b/sysdeps/loongarch/sfp-machine.h new file mode 100644 index 0000000000..5b92ac4ba2 --- /dev/null +++ b/sysdeps/loongarch/sfp-machine.h @@ -0,0 +1,102 @@ +/* LoongArch softfloat definitions + Copyright (C) 2022 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library. If not, see + . */ + +#include +#include + +#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 (__glibc_unlikely (_fex)) \ + _FPU_SETCW (_fcw | _fex | (_fex << 8)); \ + } \ + while (0) +#define FP_TRAPPING_EXCEPTIONS ((_fcw << 16) & 0x1f0000) +#else +#define FP_INIT_ROUNDMODE _fcw = FP_RND_NEAREST +#endif diff --git a/sysdeps/loongarch/tininess.h b/sysdeps/loongarch/tininess.h new file mode 100644 index 0000000000..90956c35f7 --- /dev/null +++ b/sysdeps/loongarch/tininess.h @@ -0,0 +1 @@ +#define TININESS_AFTER_ROUNDING 1 From patchwork Tue Jul 19 01:20:49 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: caiyinyu X-Patchwork-Id: 56140 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id CF48E383A366 for ; Tue, 19 Jul 2022 01:21:26 +0000 (GMT) X-Original-To: libc-alpha@sourceware.org Delivered-To: libc-alpha@sourceware.org Received: from loongson.cn (mail.loongson.cn [114.242.206.163]) by sourceware.org (Postfix) with ESMTP id A58EC3858284 for ; Tue, 19 Jul 2022 01:21:09 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org A58EC3858284 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=loongson.cn Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=loongson.cn Received: from 5.5.5 (unknown [10.2.5.5]) by mail.loongson.cn (Coremail) with SMTP id AQAAf9Dxf+P5BtZicpcnAA--.9695S8; Tue, 19 Jul 2022 09:21:06 +0800 (CST) From: caiyinyu To: adhemerval.zanella@linaro.org, libc-alpha@sourceware.org, joseph_myers@mentor.com, carlos@redhat.com, i.swmail@xen0n.name Subject: [PATCH v7 06/13] LoongArch: Atomic and Locking Routines Date: Tue, 19 Jul 2022 09:20:49 +0800 Message-Id: <20220719012056.1461897-7-caiyinyu@loongson.cn> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220719012056.1461897-1-caiyinyu@loongson.cn> References: <20220719012056.1461897-1-caiyinyu@loongson.cn> MIME-Version: 1.0 X-CM-TRANSID: AQAAf9Dxf+P5BtZicpcnAA--.9695S8 X-Coremail-Antispam: 1UD129KBjvJXoWxtryrurykKF4xtryrCw45KFg_yoW7tr1kpw 47Zrn3Grs0q3y3GaykC3W3Grn8Gr10kF48WayqkFy7W3srCwn7J3W0yFZIkFyUZFZxG3yr JF4Fqa4q93WfJwUanT9S1TB71UUUUUUqnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDU0xBIdaVrnRJUUUBl14x267AKxVWrJVCq3wAFc2x0x2IEx4CE42xK8VAvwI8IcIk0 rVWrJVCq3wAFIxvE14AKwVWUJVWUGwA2048vs2IY020E87I2jVAFwI0_JF0E3s1l82xGYI kIc2x26xkF7I0E14v26ryj6s0DM28lY4IEw2IIxxk0rwA2F7IY1VAKz4vEj48ve4kI8wA2 z4x0Y4vE2Ix0cI8IcVAFwI0_Ar0_tr1l84ACjcxK6xIIjxv20xvEc7CjxVAFwI0_Gr1j6F 4UJwA2z4x0Y4vEx4A2jsIE14v26r4UJVWxJr1l84ACjcxK6I8E87Iv6xkF7I0E14v26r4U JVWxJr1le2I262IYc4CY6c8Ij28IcVAaY2xG8wAqx4xG64xvF2IEw4CE5I8CrVC2j2WlYx 0E2Ix0cI8IcVAFwI0_Jr0_Jr4lYx0Ex4A2jsIE14v26r1j6r4UMcvjeVCFs4IE7xkEbVWU JVW8JwACjcxG0xvY0x0EwIxGrwACjI8F5VA0II8E6IAqYI8I648v4I1lc2xSY4AK6svPMx AIw28IcxkI7VAKI48JMxC20s026xCaFVCjc4AY6r1j6r4UMI8I3I0E5I8CrVAFwI0_Jr0_ Jr4lx2IqxVCjr7xvwVAFwI0_JrI_JrWlx4CE17CEb7AF67AKxVWUAVWUtwCIc40Y0x0EwI xGrwCI42IY6xIIjxv20xvE14v26r1I6r4UMIIF0xvE2Ix0cI8IcVCY1x0267AKxVW8JVWx JwCI42IY6xAIw20EY4v20xvaj40_Jr0_JF4lIxAIcVC2z280aVAFwI0_Jr0_Gr1lIxAIcV C2z280aVCY1x0267AKxVW8JVW8JrUvcSsGvfC2KfnxnUUI43ZEXa7VUbmZX7UUUUU== X-CM-SenderInfo: 5fdl5xhq1xqz5rrqw2lrqou0/ X-Spam-Status: No, score=-13.5 required=5.0 tests=BAYES_00, GIT_PATCH_0, KAM_DMARC_STATUS, KAM_SHORT, SPF_HELO_PASS, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: libc-alpha@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Libc-alpha mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: caiyinyu Errors-To: libc-alpha-bounces+patchwork=sourceware.org@sourceware.org Sender: "Libc-alpha" --- .../sysv/linux/loongarch/atomic-machine.h | 147 ++++++++++++++++++ 1 file changed, 147 insertions(+) create mode 100644 sysdeps/unix/sysv/linux/loongarch/atomic-machine.h Reviewed-by: Adhemerval Zanella diff --git a/sysdeps/unix/sysv/linux/loongarch/atomic-machine.h b/sysdeps/unix/sysv/linux/loongarch/atomic-machine.h new file mode 100644 index 0000000000..d1b8f1c11b --- /dev/null +++ b/sysdeps/unix/sysv/linux/loongarch/atomic-machine.h @@ -0,0 +1,147 @@ +/* Atomic operations. + Copyright (C) 2022 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library. If not, see + . */ + +#ifndef _LINUX_LOONGARCH_BITS_ATOMIC_H +#define _LINUX_LOONGARCH_BITS_ATOMIC_H 1 + +#define atomic_full_barrier() __sync_synchronize () + +#define __HAVE_64B_ATOMICS (__loongarch_grlen >= 64) +#define USE_ATOMIC_COMPILER_BUILTINS 1 +#define ATOMIC_EXCHANGE_USES_CAS 0 + +/* Compare and exchange. + For all "bool" routines, we return FALSE if exchange succesful. */ + +#define __arch_compare_and_exchange_bool_8_int(mem, newval, oldval, model) \ + ({ \ + typeof (*mem) __oldval = (oldval); \ + !__atomic_compare_exchange_n (mem, (void *) &__oldval, newval, 0, model, \ + __ATOMIC_RELAXED); \ + }) + +#define __arch_compare_and_exchange_bool_16_int(mem, newval, oldval, model) \ + ({ \ + typeof (*mem) __oldval = (oldval); \ + !__atomic_compare_exchange_n (mem, (void *) &__oldval, newval, 0, model, \ + __ATOMIC_RELAXED); \ + }) + +#define __arch_compare_and_exchange_bool_32_int(mem, newval, oldval, model) \ + ({ \ + typeof (*mem) __oldval = (oldval); \ + !__atomic_compare_exchange_n (mem, (void *) &__oldval, newval, 0, model, \ + __ATOMIC_RELAXED); \ + }) + +#define __arch_compare_and_exchange_bool_64_int(mem, newval, oldval, model) \ + ({ \ + typeof (*mem) __oldval = (oldval); \ + !__atomic_compare_exchange_n (mem, (void *) &__oldval, newval, 0, model, \ + __ATOMIC_RELAXED); \ + }) + +#define __arch_compare_and_exchange_val_8_int(mem, newval, oldval, model) \ + ({ \ + typeof (*mem) __oldval = (oldval); \ + __atomic_compare_exchange_n (mem, (void *) &__oldval, newval, 0, model, \ + __ATOMIC_RELAXED); \ + __oldval; \ + }) + +#define __arch_compare_and_exchange_val_16_int(mem, newval, oldval, model) \ + ({ \ + typeof (*mem) __oldval = (oldval); \ + __atomic_compare_exchange_n (mem, (void *) &__oldval, newval, 0, model, \ + __ATOMIC_RELAXED); \ + __oldval; \ + }) + +#define __arch_compare_and_exchange_val_32_int(mem, newval, oldval, model) \ + ({ \ + typeof (*mem) __oldval = (oldval); \ + __atomic_compare_exchange_n (mem, (void *) &__oldval, newval, 0, model, \ + __ATOMIC_RELAXED); \ + __oldval; \ + }) + +#define __arch_compare_and_exchange_val_64_int(mem, newval, oldval, model) \ + ({ \ + typeof (*mem) __oldval = (oldval); \ + __atomic_compare_exchange_n (mem, (void *) &__oldval, newval, 0, model, \ + __ATOMIC_RELAXED); \ + __oldval; \ + }) + +/* Atomic compare and exchange. */ + +#define atomic_compare_and_exchange_bool_acq(mem, new, old) \ + __atomic_bool_bysize (__arch_compare_and_exchange_bool, int, mem, new, old, \ + __ATOMIC_ACQUIRE) + +#define atomic_compare_and_exchange_val_acq(mem, new, old) \ + __atomic_val_bysize (__arch_compare_and_exchange_val, int, mem, new, old, \ + __ATOMIC_ACQUIRE) + +#define atomic_compare_and_exchange_val_rel(mem, new, old) \ + __atomic_val_bysize (__arch_compare_and_exchange_val, int, mem, new, old, \ + __ATOMIC_RELEASE) + +/* Atomic exchange (without compare). */ + +#define __arch_exchange_8_int(mem, newval, model) \ + __atomic_exchange_n (mem, newval, model) + +#define __arch_exchange_16_int(mem, newval, model) \ + __atomic_exchange_n (mem, newval, model) + +#define __arch_exchange_32_int(mem, newval, model) \ + __atomic_exchange_n (mem, newval, model) + +#define __arch_exchange_64_int(mem, newval, model) \ + __atomic_exchange_n (mem, newval, model) + +#define atomic_exchange_acq(mem, value) \ + __atomic_val_bysize (__arch_exchange, int, mem, value, __ATOMIC_ACQUIRE) + +#define atomic_exchange_rel(mem, value) \ + __atomic_val_bysize (__arch_exchange, int, mem, value, __ATOMIC_RELEASE) + +/* Atomically add value and return the previous (unincremented) value. */ + +#define __arch_exchange_and_add_8_int(mem, value, model) \ + __atomic_fetch_add (mem, value, model) + +#define __arch_exchange_and_add_16_int(mem, value, model) \ + __atomic_fetch_add (mem, value, model) + +#define __arch_exchange_and_add_32_int(mem, value, model) \ + __atomic_fetch_add (mem, value, model) + +#define __arch_exchange_and_add_64_int(mem, value, model) \ + __atomic_fetch_add (mem, value, model) + +#define atomic_exchange_and_add_acq(mem, value) \ + __atomic_val_bysize (__arch_exchange_and_add, int, mem, value, \ + __ATOMIC_ACQUIRE) + +#define atomic_exchange_and_add_rel(mem, value) \ + __atomic_val_bysize (__arch_exchange_and_add, int, mem, value, \ + __ATOMIC_RELEASE) + +#endif /* bits/atomic.h */ From patchwork Tue Jul 19 01:20:50 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: caiyinyu X-Patchwork-Id: 56149 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id CADFB388550C for ; Tue, 19 Jul 2022 01:22:58 +0000 (GMT) X-Original-To: libc-alpha@sourceware.org Delivered-To: libc-alpha@sourceware.org Received: from loongson.cn (mail.loongson.cn [114.242.206.163]) by sourceware.org (Postfix) with ESMTP id 2C0993858C2D for ; Tue, 19 Jul 2022 01:21:09 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 2C0993858C2D Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=loongson.cn Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=loongson.cn Received: from 5.5.5 (unknown [10.2.5.5]) by mail.loongson.cn (Coremail) with SMTP id AQAAf9Dxf+P5BtZicpcnAA--.9695S9; Tue, 19 Jul 2022 09:21:06 +0800 (CST) From: caiyinyu To: adhemerval.zanella@linaro.org, libc-alpha@sourceware.org, joseph_myers@mentor.com, carlos@redhat.com, i.swmail@xen0n.name Subject: [PATCH v7 07/13] LoongArch: Linux Syscall Interface Date: Tue, 19 Jul 2022 09:20:50 +0800 Message-Id: <20220719012056.1461897-8-caiyinyu@loongson.cn> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220719012056.1461897-1-caiyinyu@loongson.cn> References: <20220719012056.1461897-1-caiyinyu@loongson.cn> MIME-Version: 1.0 X-CM-TRANSID: AQAAf9Dxf+P5BtZicpcnAA--.9695S9 X-Coremail-Antispam: 1UD129KBjvAXoWftFW3KFW7tF4rCrW3CFyrXrb_yoW5CrW5Xo WxJF43Jws7Cr1xArs8CayxW3y7Ar4UWr18JF13X3yvkF17Jr1DKF18tFWrXr13GrW0gan8 GFyxtr1DJrZ0vrn8n29KB7ZKAUJUUUUU529EdanIXcx71UUUUU7v73VFW2AGmfu7bjvjm3 AaLaJ3UjIYCTnIWjp_UUUYM7AC8VAFwI0_Wr0E3s1l1xkIjI8I6I8E6xAIw20EY4v20xva j40_Wr0E3s1l1IIY67AEw4v_Jr0_Jr4l82xGYIkIc2x26280x7IE14v26r126s0DM28Irc Ia0xkI8VCY1x0267AKxVW5JVCq3wA2ocxC64kIII0Yj41l84x0c7CEw4AK67xGY2AK021l 84ACjcxK6xIIjxv20xvE14v26F1j6w1UM28EF7xvwVC0I7IYx2IY6xkF7I0E14v26r4UJV WxJr1l84ACjcxK6I8E87Iv67AKxVW8Jr0_Cr1UM28EF7xvwVC2z280aVCY1x0267AKxVW8 Jr0_Cr1UM2AIxVAIcxkEcVAq07x20xvEncxIr21l5I8CrVACY4xI64kE6c02F40Ex7xfMc Ij6xIIjxv20xvE14v26r1j6r18McIj6I8E87Iv67AKxVWUJVW8JwAm72CE4IkC6x0Yz7v_ Jr0_Gr1lF7xvr2IYc2Ij64vIr41lF7I21c0EjII2zVCS5cI20VAGYxC7MxkIecxEwVCm-w CF04k20xvY0x0EwIxGrwCFx2IqxVCFs4IE7xkEbVWUJVW8JwC20s026c02F40E14v26r1j 6r18MI8I3I0E7480Y4vE14v26r106r1rMI8E67AF67kF1VAFwI0_JF0_Jw1lIxkGc2Ij64 vIr41lIxAIcVC0I7IYx2IY67AKxVWUCVW8JwCI42IY6xIIjxv20xvEc7CjxVAFwI0_Gr0_ Cr1lIxAIcVCF04k26cxKx2IYs7xG6r1j6r1xMIIF0xvEx4A2jsIE14v26r1j6r4UMIIF0x vEx4A2jsIEc7CjxVAFwI0_Gr0_Gr1UYxBIdaVFxhVjvjDU0xZFpf9x0JUQSdkUUUUU= X-CM-SenderInfo: 5fdl5xhq1xqz5rrqw2lrqou0/ X-Spam-Status: No, score=-13.5 required=5.0 tests=BAYES_00, GIT_PATCH_0, KAM_DMARC_STATUS, KAM_SHORT, SPF_HELO_PASS, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: libc-alpha@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Libc-alpha mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: caiyinyu Errors-To: libc-alpha-bounces+patchwork=sourceware.org@sourceware.org Sender: "Libc-alpha" --- sysdeps/loongarch/abort-instr.h | 2 + sysdeps/loongarch/hp-timing.h | 42 +++ .../unix/sysv/linux/loongarch/arch-syscall.h | 301 ++++++++++++++++ sysdeps/unix/sysv/linux/loongarch/clone.S | 96 ++++++ sysdeps/unix/sysv/linux/loongarch/clone3.S | 83 +++++ sysdeps/unix/sysv/linux/loongarch/sysdep.S | 53 +++ sysdeps/unix/sysv/linux/loongarch/sysdep.h | 320 ++++++++++++++++++ sysdeps/unix/sysv/linux/loongarch/vfork.S | 50 +++ 8 files changed, 947 insertions(+) create mode 100644 sysdeps/loongarch/abort-instr.h create mode 100644 sysdeps/loongarch/hp-timing.h create mode 100644 sysdeps/unix/sysv/linux/loongarch/arch-syscall.h create mode 100644 sysdeps/unix/sysv/linux/loongarch/clone.S create mode 100644 sysdeps/unix/sysv/linux/loongarch/clone3.S create mode 100644 sysdeps/unix/sysv/linux/loongarch/sysdep.S create mode 100644 sysdeps/unix/sysv/linux/loongarch/sysdep.h create mode 100644 sysdeps/unix/sysv/linux/loongarch/vfork.S Reviewed-by: Adhemerval Zanella diff --git a/sysdeps/loongarch/abort-instr.h b/sysdeps/loongarch/abort-instr.h new file mode 100644 index 0000000000..46d3ad0871 --- /dev/null +++ b/sysdeps/loongarch/abort-instr.h @@ -0,0 +1,2 @@ +/* An instruction which should crash any program is a breakpoint. */ +#define ABORT_INSTRUCTION asm ("break 0") diff --git a/sysdeps/loongarch/hp-timing.h b/sysdeps/loongarch/hp-timing.h new file mode 100644 index 0000000000..af1da81024 --- /dev/null +++ b/sysdeps/loongarch/hp-timing.h @@ -0,0 +1,42 @@ +/* High precision, low overhead timing functions. + Copyright (C) 2022 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +#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 + +#endif /* hp-timing.h */ diff --git a/sysdeps/unix/sysv/linux/loongarch/arch-syscall.h b/sysdeps/unix/sysv/linux/loongarch/arch-syscall.h new file mode 100644 index 0000000000..6bb3c8adbc --- /dev/null +++ b/sysdeps/unix/sysv/linux/loongarch/arch-syscall.h @@ -0,0 +1,301 @@ +/* AUTOGENERATED by update-syscall-lists.py. */ +#define __NR_accept 202 +#define __NR_accept4 242 +#define __NR_acct 89 +#define __NR_add_key 217 +#define __NR_adjtimex 171 +#define __NR_bind 200 +#define __NR_bpf 280 +#define __NR_brk 214 +#define __NR_capget 90 +#define __NR_capset 91 +#define __NR_chdir 49 +#define __NR_chroot 51 +#define __NR_clock_adjtime 266 +#define __NR_clock_getres 114 +#define __NR_clock_gettime 113 +#define __NR_clock_nanosleep 115 +#define __NR_clock_settime 112 +#define __NR_clone 220 +#define __NR_clone3 435 +#define __NR_close 57 +#define __NR_close_range 436 +#define __NR_connect 203 +#define __NR_copy_file_range 285 +#define __NR_delete_module 106 +#define __NR_dup 23 +#define __NR_dup3 24 +#define __NR_epoll_create1 20 +#define __NR_epoll_ctl 21 +#define __NR_epoll_pwait 22 +#define __NR_epoll_pwait2 441 +#define __NR_eventfd2 19 +#define __NR_execve 221 +#define __NR_execveat 281 +#define __NR_exit 93 +#define __NR_exit_group 94 +#define __NR_faccessat 48 +#define __NR_faccessat2 439 +#define __NR_fadvise64 223 +#define __NR_fallocate 47 +#define __NR_fanotify_init 262 +#define __NR_fanotify_mark 263 +#define __NR_fchdir 50 +#define __NR_fchmod 52 +#define __NR_fchmodat 53 +#define __NR_fchown 55 +#define __NR_fchownat 54 +#define __NR_fcntl 25 +#define __NR_fdatasync 83 +#define __NR_fgetxattr 10 +#define __NR_finit_module 273 +#define __NR_flistxattr 13 +#define __NR_flock 32 +#define __NR_fremovexattr 16 +#define __NR_fsconfig 431 +#define __NR_fsetxattr 7 +#define __NR_fsmount 432 +#define __NR_fsopen 430 +#define __NR_fspick 433 +#define __NR_fstatfs 44 +#define __NR_fsync 82 +#define __NR_ftruncate 46 +#define __NR_futex 98 +#define __NR_futex_waitv 449 +#define __NR_get_mempolicy 236 +#define __NR_get_robust_list 100 +#define __NR_getcpu 168 +#define __NR_getcwd 17 +#define __NR_getdents64 61 +#define __NR_getegid 177 +#define __NR_geteuid 175 +#define __NR_getgid 176 +#define __NR_getgroups 158 +#define __NR_getitimer 102 +#define __NR_getpeername 205 +#define __NR_getpgid 155 +#define __NR_getpid 172 +#define __NR_getppid 173 +#define __NR_getpriority 141 +#define __NR_getrandom 278 +#define __NR_getresgid 150 +#define __NR_getresuid 148 +#define __NR_getrusage 165 +#define __NR_getsid 156 +#define __NR_getsockname 204 +#define __NR_getsockopt 209 +#define __NR_gettid 178 +#define __NR_gettimeofday 169 +#define __NR_getuid 174 +#define __NR_getxattr 8 +#define __NR_init_module 105 +#define __NR_inotify_add_watch 27 +#define __NR_inotify_init1 26 +#define __NR_inotify_rm_watch 28 +#define __NR_io_cancel 3 +#define __NR_io_destroy 1 +#define __NR_io_getevents 4 +#define __NR_io_pgetevents 292 +#define __NR_io_setup 0 +#define __NR_io_submit 2 +#define __NR_io_uring_enter 426 +#define __NR_io_uring_register 427 +#define __NR_io_uring_setup 425 +#define __NR_ioctl 29 +#define __NR_ioprio_get 31 +#define __NR_ioprio_set 30 +#define __NR_kcmp 272 +#define __NR_kexec_file_load 294 +#define __NR_kexec_load 104 +#define __NR_keyctl 219 +#define __NR_kill 129 +#define __NR_landlock_add_rule 445 +#define __NR_landlock_create_ruleset 444 +#define __NR_landlock_restrict_self 446 +#define __NR_lgetxattr 9 +#define __NR_linkat 37 +#define __NR_listen 201 +#define __NR_listxattr 11 +#define __NR_llistxattr 12 +#define __NR_lookup_dcookie 18 +#define __NR_lremovexattr 15 +#define __NR_lseek 62 +#define __NR_lsetxattr 6 +#define __NR_madvise 233 +#define __NR_mbind 235 +#define __NR_membarrier 283 +#define __NR_memfd_create 279 +#define __NR_migrate_pages 238 +#define __NR_mincore 232 +#define __NR_mkdirat 34 +#define __NR_mknodat 33 +#define __NR_mlock 228 +#define __NR_mlock2 284 +#define __NR_mlockall 230 +#define __NR_mmap 222 +#define __NR_mount 40 +#define __NR_mount_setattr 442 +#define __NR_move_mount 429 +#define __NR_move_pages 239 +#define __NR_mprotect 226 +#define __NR_mq_getsetattr 185 +#define __NR_mq_notify 184 +#define __NR_mq_open 180 +#define __NR_mq_timedreceive 183 +#define __NR_mq_timedsend 182 +#define __NR_mq_unlink 181 +#define __NR_mremap 216 +#define __NR_msgctl 187 +#define __NR_msgget 186 +#define __NR_msgrcv 188 +#define __NR_msgsnd 189 +#define __NR_msync 227 +#define __NR_munlock 229 +#define __NR_munlockall 231 +#define __NR_munmap 215 +#define __NR_name_to_handle_at 264 +#define __NR_nanosleep 101 +#define __NR_nfsservctl 42 +#define __NR_open_by_handle_at 265 +#define __NR_open_tree 428 +#define __NR_openat 56 +#define __NR_openat2 437 +#define __NR_perf_event_open 241 +#define __NR_personality 92 +#define __NR_pidfd_getfd 438 +#define __NR_pidfd_open 434 +#define __NR_pidfd_send_signal 424 +#define __NR_pipe2 59 +#define __NR_pivot_root 41 +#define __NR_pkey_alloc 289 +#define __NR_pkey_free 290 +#define __NR_pkey_mprotect 288 +#define __NR_ppoll 73 +#define __NR_prctl 167 +#define __NR_pread64 67 +#define __NR_preadv 69 +#define __NR_preadv2 286 +#define __NR_prlimit64 261 +#define __NR_process_madvise 440 +#define __NR_process_mrelease 448 +#define __NR_process_vm_readv 270 +#define __NR_process_vm_writev 271 +#define __NR_pselect6 72 +#define __NR_ptrace 117 +#define __NR_pwrite64 68 +#define __NR_pwritev 70 +#define __NR_pwritev2 287 +#define __NR_quotactl 60 +#define __NR_quotactl_fd 443 +#define __NR_read 63 +#define __NR_readahead 213 +#define __NR_readlinkat 78 +#define __NR_readv 65 +#define __NR_reboot 142 +#define __NR_recvfrom 207 +#define __NR_recvmmsg 243 +#define __NR_recvmsg 212 +#define __NR_remap_file_pages 234 +#define __NR_removexattr 14 +#define __NR_renameat2 276 +#define __NR_request_key 218 +#define __NR_restart_syscall 128 +#define __NR_rseq 293 +#define __NR_rt_sigaction 134 +#define __NR_rt_sigpending 136 +#define __NR_rt_sigprocmask 135 +#define __NR_rt_sigqueueinfo 138 +#define __NR_rt_sigreturn 139 +#define __NR_rt_sigsuspend 133 +#define __NR_rt_sigtimedwait 137 +#define __NR_rt_tgsigqueueinfo 240 +#define __NR_sched_get_priority_max 125 +#define __NR_sched_get_priority_min 126 +#define __NR_sched_getaffinity 123 +#define __NR_sched_getattr 275 +#define __NR_sched_getparam 121 +#define __NR_sched_getscheduler 120 +#define __NR_sched_rr_get_interval 127 +#define __NR_sched_setaffinity 122 +#define __NR_sched_setattr 274 +#define __NR_sched_setparam 118 +#define __NR_sched_setscheduler 119 +#define __NR_sched_yield 124 +#define __NR_seccomp 277 +#define __NR_semctl 191 +#define __NR_semget 190 +#define __NR_semop 193 +#define __NR_semtimedop 192 +#define __NR_sendfile 71 +#define __NR_sendmmsg 269 +#define __NR_sendmsg 211 +#define __NR_sendto 206 +#define __NR_set_mempolicy 237 +#define __NR_set_mempolicy_home_node 450 +#define __NR_set_robust_list 99 +#define __NR_set_tid_address 96 +#define __NR_setdomainname 162 +#define __NR_setfsgid 152 +#define __NR_setfsuid 151 +#define __NR_setgid 144 +#define __NR_setgroups 159 +#define __NR_sethostname 161 +#define __NR_setitimer 103 +#define __NR_setns 268 +#define __NR_setpgid 154 +#define __NR_setpriority 140 +#define __NR_setregid 143 +#define __NR_setresgid 149 +#define __NR_setresuid 147 +#define __NR_setreuid 145 +#define __NR_setsid 157 +#define __NR_setsockopt 208 +#define __NR_settimeofday 170 +#define __NR_setuid 146 +#define __NR_setxattr 5 +#define __NR_shmat 196 +#define __NR_shmctl 195 +#define __NR_shmdt 197 +#define __NR_shmget 194 +#define __NR_shutdown 210 +#define __NR_sigaltstack 132 +#define __NR_signalfd4 74 +#define __NR_socket 198 +#define __NR_socketpair 199 +#define __NR_splice 76 +#define __NR_statfs 43 +#define __NR_statx 291 +#define __NR_swapoff 225 +#define __NR_swapon 224 +#define __NR_symlinkat 36 +#define __NR_sync 81 +#define __NR_sync_file_range 84 +#define __NR_syncfs 267 +#define __NR_sysinfo 179 +#define __NR_syslog 116 +#define __NR_tee 77 +#define __NR_tgkill 131 +#define __NR_timer_create 107 +#define __NR_timer_delete 111 +#define __NR_timer_getoverrun 109 +#define __NR_timer_gettime 108 +#define __NR_timer_settime 110 +#define __NR_timerfd_create 85 +#define __NR_timerfd_gettime 87 +#define __NR_timerfd_settime 86 +#define __NR_times 153 +#define __NR_tkill 130 +#define __NR_truncate 45 +#define __NR_umask 166 +#define __NR_umount2 39 +#define __NR_uname 160 +#define __NR_unlinkat 35 +#define __NR_unshare 97 +#define __NR_userfaultfd 282 +#define __NR_utimensat 88 +#define __NR_vhangup 58 +#define __NR_vmsplice 75 +#define __NR_wait4 260 +#define __NR_waitid 95 +#define __NR_write 64 +#define __NR_writev 66 diff --git a/sysdeps/unix/sysv/linux/loongarch/clone.S b/sysdeps/unix/sysv/linux/loongarch/clone.S new file mode 100644 index 0000000000..c73245be82 --- /dev/null +++ b/sysdeps/unix/sysv/linux/loongarch/clone.S @@ -0,0 +1,96 @@ +/* The clone syscall wrapper. + Copyright (C) 2022 Free Software Foundation, Inc. + + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library. If not, see + . */ + +/* 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 +#include +#define _ERRNO_H 1 +#include +#include +#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. */ + BSTRINS a1, zero, 3, 0 + + /* Sanity check arguments. */ + beqz a0, L (invalid) /* No NULL function pointers. */ + beqz a1, L (invalid) /* No NULL stack pointers. */ + + ADDI a1, a1, -16 /* Reserve argument save space. */ + REG_S a0, a1, 0 /* Save function pointer. */ + REG_S a3, a1, SZREG /* Save argument pointer. */ + + /* The syscall expects the args to be in different slots. */ + or a0, a2, zero + or a2, a4, zero + or a3, a6, zero + or a4, a5, zero + + /* Do the system call. */ + LI a7,__NR_clone + syscall 0 + + blt a0, zero ,L (error) + beqz a0,L (thread_start) + + /* Successful return from the parent. */ + ret + +L (invalid): + LI a0, -EINVAL + + /* Something bad happened -- no child created. */ +L (error): + b __syscall_error + +END (__clone) + +/* Load up the arguments to the function. Put this block of code in + its own function so that we can terminate the stack trace with our + debug info. */ +ENTRY (__thread_start) +L (thread_start): + +/* Terminate call stack by noting ra is undefined. Use a dummy + .cfi_label to force starting the FDE. */ + .cfi_label .Ldummy + cfi_undefined (1) + + /* Restore the arg for user's function. */ + REG_L a1, sp, 0 /* Function pointer. */ + REG_L a0, sp, SZREG /* Argument pointer. */ + + /* Call the user's function. */ + jirl ra, a1, 0 + + /* Call exit with the function's return value. */ + LI a7, __NR_exit + syscall 0 + + END (__thread_start) + +libc_hidden_def (__clone) +weak_alias (__clone, clone) diff --git a/sysdeps/unix/sysv/linux/loongarch/clone3.S b/sysdeps/unix/sysv/linux/loongarch/clone3.S new file mode 100644 index 0000000000..38be4c809b --- /dev/null +++ b/sysdeps/unix/sysv/linux/loongarch/clone3.S @@ -0,0 +1,83 @@ +/* The clone3 syscall wrapper. + Copyright (C) 2022 Free Software Foundation, Inc. + + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library. If not, see + . */ + +/* 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 +#include +#define _ERRNO_H 1 +#include +#include +#include "tcb-offsets.h" + +/* int clone3(struct clone_args *cl_args, size_t size, + int (*func)(void *arg), void *arg); */ + +ENTRY (__clone3) + + /* Sanity check arguments. */ + beqz a0, L (invalid) /* No NULL cl_args pointer. */ + beqz a2, L (invalid) /* No NULL function pointer. */ + + /* Do the system call. */ + LI a7, __NR_clone3 + syscall 0 + + blt a0, zero ,L (error) + beqz a0, L (thread_start3) + + /* Successful return from the parent. */ + ret + +L (invalid): + LI a0, -EINVAL + + /* Something bad happened -- no child created. */ +L (error): + b __syscall_error + +END (__clone3) + +/* Load up the arguments to the function. Put this block of code in + its own function so that we can terminate the stack trace with our + debug info. */ +ENTRY (__thread_start3) +L (thread_start3): + +/* Terminate call stack by noting ra is undefined. Use a dummy + .cfi_label to force starting the FDE. */ + .cfi_label .Ldummy + cfi_undefined (1) + + /* Align stack to 16. */ + BSTRINS sp, zero, 3, 0 + + /* Set up arguments for the function call. */ + move a0, a3 /* Argument. */ + jirl ra, a2, 0 /* Call function. */ + + /* Call exit with the function's return value. */ + LI a7, __NR_exit + syscall 0 + + END (__thread_start3) + +libc_hidden_def (__clone3) +weak_alias (__clone3, clone3) diff --git a/sysdeps/unix/sysv/linux/loongarch/sysdep.S b/sysdeps/unix/sysv/linux/loongarch/sysdep.S new file mode 100644 index 0000000000..a4db2a97b5 --- /dev/null +++ b/sysdeps/unix/sysv/linux/loongarch/sysdep.S @@ -0,0 +1,53 @@ +/* syscall error handlers + Copyright (C) 2022 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library. If not, see + . */ + +#include + +#if IS_IN (libc) +# define errno __libc_errno +#endif + +ENTRY (__syscall_error) +/* Fall through to __syscall_set_errno */ +END (__syscall_error) + +/* Non-standard calling convention: argument in a0, return address in t0, + and clobber only t1. + */ +ENTRY (__syscall_set_errno) + +/* We got here because a0 < 0, but only codes in the range [-4095, -1] + represent errors. Otherwise, just return the result normally. + */ + li.d t1, -4096 + bgeu t1, a0, L (out) + sub.w a0, zero, a0 +#if RTLD_PRIVATE_ERRNO + la t1, rtld_errno +#elif defined(__PIC__) + la.tls.ie t1, errno + add.d t1, tp, t1 +#else + la.tls.le t1, errno + add.d t1, tp, t1 +#endif + st.w a0, t1, 0 + li.d a0, -1 +L (out): + ret +END (__syscall_set_errno) diff --git a/sysdeps/unix/sysv/linux/loongarch/sysdep.h b/sysdeps/unix/sysv/linux/loongarch/sysdep.h new file mode 100644 index 0000000000..c586df819c --- /dev/null +++ b/sysdeps/unix/sysv/linux/loongarch/sysdep.h @@ -0,0 +1,320 @@ +/* Assembly macros for LoongArch. + Copyright (C) 2022 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library. If not, see + . */ + +#ifndef _LINUX_LOONGARCH_SYSDEP_H +#define _LINUX_LOONGARCH_SYSDEP_H 1 + +#include +#include + +#ifdef __ASSEMBLER__ + +#include +#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 +#endif + +#include + +#undef SYS_ify +#define SYS_ify(syscall_name) __NR_##syscall_name + +#ifndef __ASSEMBLER__ + +#define VDSO_NAME "LINUX_2.6" +#define VDSO_HASH 61765110 + +/* List of system calls which are supported as vsyscalls. */ +#define HAVE_CLOCK_GETRES64_VSYSCALL "__vdso_clock_getres" +#define HAVE_CLOCK_GETTIME64_VSYSCALL "__vdso_clock_gettime" +#define HAVE_GETCPU_VSYSCALL "__vdso_getcpu" + +#define HAVE_CLONE3_WRAPPER 1 + +#define INTERNAL_SYSCALL(name, nr, args...) \ + internal_syscall##nr (SYS_ify (name), args) + +#define INTERNAL_SYSCALL_NCS(number, nr, args...) \ + internal_syscall##nr (number, args) + +#define internal_syscall0(number, dummy...) \ + ({ \ + long int _sys_result; \ +\ + { \ + register long int __a7 asm ("$a7") = number; \ + register long int __a0 asm ("$a0"); \ + __asm__ volatile ("syscall 0\n\t" \ + : "=r"(__a0) \ + : "r"(__a7) \ + : __SYSCALL_CLOBBERS); \ + _sys_result = __a0; \ + } \ + _sys_result; \ + }) + +#define internal_syscall1(number, arg0) \ + ({ \ + long int _sys_result; \ +\ + { \ + long int _arg0 = (long int) (arg0); \ + register long int __a7 asm ("$a7") = number; \ + register long int __a0 asm ("$a0") = _arg0; \ + __asm__ volatile ("syscall 0\n\t" \ + : "+r"(__a0) \ + : "r"(__a7) \ + : __SYSCALL_CLOBBERS); \ + _sys_result = __a0; \ + } \ + _sys_result; \ + }) + +#define internal_syscall2(number, arg0, arg1) \ + ({ \ + long int _sys_result; \ +\ + { \ + long int _arg0 = (long int) (arg0); \ + long int _arg1 = (long int) (arg1); \ + register long int __a7 asm ("$a7") = number; \ + register long int __a0 asm ("$a0") = _arg0; \ + register long int __a1 asm ("$a1") = _arg1; \ + __asm__ volatile ("syscall 0\n\t" \ + : "+r"(__a0) \ + : "r"(__a7), "r"(__a1) \ + : __SYSCALL_CLOBBERS); \ + _sys_result = __a0; \ + } \ + _sys_result; \ + }) + +#define internal_syscall3(number, arg0, arg1, arg2) \ + ({ \ + long int _sys_result; \ +\ + { \ + long int _arg0 = (long int) (arg0); \ + long int _arg1 = (long int) (arg1); \ + long int _arg2 = (long int) (arg2); \ + register long int __a7 asm ("$a7") = number; \ + register long int __a0 asm ("$a0") = _arg0; \ + register long int __a1 asm ("$a1") = _arg1; \ + register long int __a2 asm ("$a2") = _arg2; \ + __asm__ volatile ("syscall 0\n\t" \ + : "+r"(__a0) \ + : "r"(__a7), "r"(__a1), "r"(__a2) \ + : __SYSCALL_CLOBBERS); \ + _sys_result = __a0; \ + } \ + _sys_result; \ + }) + +#define internal_syscall4(number, arg0, arg1, arg2, arg3) \ + ({ \ + long int _sys_result; \ +\ + { \ + long int _arg0 = (long int) (arg0); \ + long int _arg1 = (long int) (arg1); \ + long int _arg2 = (long int) (arg2); \ + long int _arg3 = (long int) (arg3); \ + register long int __a7 asm ("$a7") = number; \ + register long int __a0 asm ("$a0") = _arg0; \ + register long int __a1 asm ("$a1") = _arg1; \ + register long int __a2 asm ("$a2") = _arg2; \ + register long int __a3 asm ("$a3") = _arg3; \ + __asm__ volatile ("syscall 0\n\t" \ + : "+r"(__a0) \ + : "r"(__a7), "r"(__a1), "r"(__a2), "r"(__a3) \ + : __SYSCALL_CLOBBERS); \ + _sys_result = __a0; \ + } \ + _sys_result; \ + }) + +#define internal_syscall5(number, arg0, arg1, arg2, arg3, arg4) \ + ({ \ + long int _sys_result; \ +\ + { \ + long int _arg0 = (long int) (arg0); \ + long int _arg1 = (long int) (arg1); \ + long int _arg2 = (long int) (arg2); \ + long int _arg3 = (long int) (arg3); \ + long int _arg4 = (long int) (arg4); \ + register long int __a7 asm ("$a7") = number; \ + register long int __a0 asm ("$a0") = _arg0; \ + register long int __a1 asm ("$a1") = _arg1; \ + register long int __a2 asm ("$a2") = _arg2; \ + register long int __a3 asm ("$a3") = _arg3; \ + register long int __a4 asm ("$a4") = _arg4; \ + __asm__ volatile ("syscall 0\n\t" \ + : "+r"(__a0) \ + : "r"(__a7), "r"(__a1), "r"(__a2), \ + "r"(__a3), "r"(__a4) \ + : __SYSCALL_CLOBBERS); \ + _sys_result = __a0; \ + } \ + _sys_result; \ + }) + +#define internal_syscall6(number, arg0, arg1, arg2, arg3, arg4, arg5) \ + ({ \ + long int _sys_result; \ +\ + { \ + long int _arg0 = (long int) (arg0); \ + long int _arg1 = (long int) (arg1); \ + long int _arg2 = (long int) (arg2); \ + long int _arg3 = (long int) (arg3); \ + long int _arg4 = (long int) (arg4); \ + long int _arg5 = (long int) (arg5); \ + register long int __a7 asm ("$a7") = number; \ + register long int __a0 asm ("$a0") = _arg0; \ + register long int __a1 asm ("$a1") = _arg1; \ + register long int __a2 asm ("$a2") = _arg2; \ + register long int __a3 asm ("$a3") = _arg3; \ + register long int __a4 asm ("$a4") = _arg4; \ + register long int __a5 asm ("$a5") = _arg5; \ + __asm__ volatile ("syscall 0\n\t" \ + : "+r"(__a0) \ + : "r"(__a7), "r"(__a1), "r"(__a2), "r"(__a3), \ + "r"(__a4), "r"(__a5) \ + : __SYSCALL_CLOBBERS); \ + _sys_result = __a0; \ + } \ + _sys_result; \ + }) + +#define internal_syscall7(number, arg0, arg1, arg2, arg3, arg4, arg5, arg6) \ + ({ \ + long int _sys_result; \ +\ + { \ + long int _arg0 = (long int) (arg0); \ + long int _arg1 = (long int) (arg1); \ + long int _arg2 = (long int) (arg2); \ + long int _arg3 = (long int) (arg3); \ + long int _arg4 = (long int) (arg4); \ + long int _arg5 = (long int) (arg5); \ + long int _arg6 = (long int) (arg6); \ + register long int __a7 asm ("$a7") = number; \ + register long int __a0 asm ("$a0") = _arg0; \ + register long int __a1 asm ("$a1") = _arg1; \ + register long int __a2 asm ("$a2") = _arg2; \ + register long int __a3 asm ("$a3") = _arg3; \ + register long int __a4 asm ("$a4") = _arg4; \ + register long int __a5 asm ("$a5") = _arg5; \ + register long int __a6 asm ("$a6") = _arg6; \ + __asm__ volatile ("syscall 0\n\t" \ + : "+r"(__a0) \ + : "r"(__a7), "r"(__a1), "r"(__a2), "r"(__a3), \ + "r"(__a4), "r"(__a5), "r"(__a6) \ + : __SYSCALL_CLOBBERS); \ + _sys_result = __a0; \ + } \ + _sys_result; \ + }) + +#define __SYSCALL_CLOBBERS \ + "$t0", "$t1", "$t2", "$t3", "$t4", "$t5", "$t6", "$t7", "$t8", "memory" + +extern long int __syscall_error (long int neg_errno); + +#endif /* ! __ASSEMBLER__ */ + +/* Pointer mangling is not supported. */ +#define PTR_MANGLE(var) (void) (var) +#define PTR_DEMANGLE(var) (void) (var) + +#endif /* linux/loongarch/sysdep.h */ diff --git a/sysdeps/unix/sysv/linux/loongarch/vfork.S b/sysdeps/unix/sysv/linux/loongarch/vfork.S new file mode 100644 index 0000000000..fcc84e3549 --- /dev/null +++ b/sysdeps/unix/sysv/linux/loongarch/vfork.S @@ -0,0 +1,50 @@ +/* vfork for Linux. + Copyright (C) 2022 Free Software Foundation, Inc. + + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public License as + published by the Free Software Foundation; either version 2.1 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +#include +#define _ERRNO_H 1 +#include + +/* 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) From patchwork Tue Jul 19 01:20:51 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: caiyinyu X-Patchwork-Id: 56143 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 4950C3850867 for ; Tue, 19 Jul 2022 01:22:00 +0000 (GMT) X-Original-To: libc-alpha@sourceware.org Delivered-To: libc-alpha@sourceware.org Received: from loongson.cn (mail.loongson.cn [114.242.206.163]) by sourceware.org (Postfix) with ESMTP id C5F9E3858285 for ; Tue, 19 Jul 2022 01:21:10 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org C5F9E3858285 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=loongson.cn Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=loongson.cn Received: from 5.5.5 (unknown [10.2.5.5]) by mail.loongson.cn (Coremail) with SMTP id AQAAf9Dxf+P5BtZicpcnAA--.9695S10; Tue, 19 Jul 2022 09:21:07 +0800 (CST) From: caiyinyu To: adhemerval.zanella@linaro.org, libc-alpha@sourceware.org, joseph_myers@mentor.com, carlos@redhat.com, i.swmail@xen0n.name Subject: [PATCH v7 08/13] LoongArch: Linux ABI Date: Tue, 19 Jul 2022 09:20:51 +0800 Message-Id: <20220719012056.1461897-9-caiyinyu@loongson.cn> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220719012056.1461897-1-caiyinyu@loongson.cn> References: <20220719012056.1461897-1-caiyinyu@loongson.cn> MIME-Version: 1.0 X-CM-TRANSID: AQAAf9Dxf+P5BtZicpcnAA--.9695S10 X-Coremail-Antispam: 1UD129KBjvAXoWfZryfuFykJF4fAFWDKrW5Awb_yoW5tr47Zo WfWFW7Jr48Gr47WF4Y9a9rJa47Wr429r1aqa1YvFZ7JF1rAr15CFZYya1Svw13Gry5uF4k Xa4xX3sxtF42krn3n29KB7ZKAUJUUUUU529EdanIXcx71UUUUU7v73VFW2AGmfu7bjvjm3 AaLaJ3UjIYCTnIWjp_UUUY_7AC8VAFwI0_Wr0E3s1l1xkIjI8I6I8E6xAIw20EY4v20xva j40_Wr0E3s1l1IIY67AEw4v_Jr0_Jr4l82xGYIkIc2x26280x7IE14v26r126s0DM28Irc Ia0xkI8VCY1x0267AKxVW5JVCq3wA2ocxC64kIII0Yj41l84x0c7CEw4AK67xGY2AK021l 84ACjcxK6xIIjxv20xvE14v26F1j6w1UM28EF7xvwVC0I7IYx2IY6xkF7I0E14v26r4UJV WxJr1l84ACjcxK6I8E87Iv67AKxVW8Jr0_Cr1UM28EF7xvwVC2z280aVCY1x0267AKxVW8 Jr0_Cr1UM2AIxVAIcxkEcVAq07x20xvEncxIr21l5I8CrVACY4xI64kE6c02F40Ex7xfMc Ij6xIIjxv20xvE14v26r1j6r18McIj6I8E87Iv67AKxVWUJVW8JwAm72CE4IkC6x0Yz7v_ Jr0_Gr1lF7xvr2IYc2Ij64vIr41lF7I21c0EjII2zVCS5cI20VAGYxC7MxkIecxEwVCm-w CF04k20xvY0x0EwIxGrwCFx2IqxVCFs4IE7xkEbVWUJVW8JwC20s026c02F40E14v26r1j 6r18MI8I3I0E7480Y4vE14v26r106r1rMI8E67AF67kF1VAFwI0_JF0_Jw1lIxkGc2Ij64 vIr41lIxAIcVC0I7IYx2IY67AKxVWUCVW8JwCI42IY6xIIjxv20xvEc7CjxVAFwI0_Cr0_ Gr1UMIIF0xvE42xK8VAvwI8IcIk0rVWUJVWUCwCI42IY6I8E87Iv67AKxVWUJVW8JwCI42 IY6I8E87Iv6xkF7I0E14v26r4j6r4UJbIYCTnIWIevJa73UjIFyTuYvjfUOBTYUUUUU X-CM-SenderInfo: 5fdl5xhq1xqz5rrqw2lrqou0/ X-Spam-Status: No, score=-12.7 required=5.0 tests=BAYES_00, GIT_PATCH_0, KAM_DMARC_STATUS, KAM_SHORT, SPF_HELO_PASS, SPF_PASS, TXREP, URIBL_BLACK autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: libc-alpha@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Libc-alpha mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: caiyinyu Errors-To: libc-alpha-bounces+patchwork=sourceware.org@sourceware.org Sender: "Libc-alpha" --- sysdeps/loongarch/dl-irel.h | 54 ++++++++++ sysdeps/loongarch/nptl/pthreaddef.h | 32 ++++++ sysdeps/loongarch/sys/ifunc.h | 30 ++++++ .../unix/sysv/linux/loongarch/bits/fcntl.h | 61 +++++++++++ .../unix/sysv/linux/loongarch/bits/procfs.h | 52 +++++++++ .../linux/loongarch/bits/pthread_stack_min.h | 20 ++++ .../unix/sysv/linux/loongarch/bits/sigstack.h | 32 ++++++ .../unix/sysv/linux/loongarch/getcontext.S | 59 +++++++++++ .../unix/sysv/linux/loongarch/localplt.data | 12 +++ .../unix/sysv/linux/loongarch/makecontext.c | 81 ++++++++++++++ .../unix/sysv/linux/loongarch/setcontext.S | 100 ++++++++++++++++++ .../sysv/linux/loongarch/sigcontextinfo.h | 32 ++++++ .../unix/sysv/linux/loongarch/swapcontext.S | 95 +++++++++++++++++ .../unix/sysv/linux/loongarch/sys/ucontext.h | 61 +++++++++++ sysdeps/unix/sysv/linux/loongarch/sys/user.h | 42 ++++++++ .../sysv/linux/loongarch/ucontext-macros.h | 32 ++++++ .../unix/sysv/linux/loongarch/ucontext_i.sym | 31 ++++++ 17 files changed, 826 insertions(+) create mode 100644 sysdeps/loongarch/dl-irel.h create mode 100644 sysdeps/loongarch/nptl/pthreaddef.h create mode 100644 sysdeps/loongarch/sys/ifunc.h create mode 100644 sysdeps/unix/sysv/linux/loongarch/bits/fcntl.h create mode 100644 sysdeps/unix/sysv/linux/loongarch/bits/procfs.h create mode 100644 sysdeps/unix/sysv/linux/loongarch/bits/pthread_stack_min.h create mode 100644 sysdeps/unix/sysv/linux/loongarch/bits/sigstack.h create mode 100644 sysdeps/unix/sysv/linux/loongarch/getcontext.S create mode 100644 sysdeps/unix/sysv/linux/loongarch/localplt.data create mode 100644 sysdeps/unix/sysv/linux/loongarch/makecontext.c create mode 100644 sysdeps/unix/sysv/linux/loongarch/setcontext.S create mode 100644 sysdeps/unix/sysv/linux/loongarch/sigcontextinfo.h create mode 100644 sysdeps/unix/sysv/linux/loongarch/swapcontext.S create mode 100644 sysdeps/unix/sysv/linux/loongarch/sys/ucontext.h create mode 100644 sysdeps/unix/sysv/linux/loongarch/sys/user.h create mode 100644 sysdeps/unix/sysv/linux/loongarch/ucontext-macros.h create mode 100644 sysdeps/unix/sysv/linux/loongarch/ucontext_i.sym Reviewed-by: Adhemerval Zanella diff --git a/sysdeps/loongarch/dl-irel.h b/sysdeps/loongarch/dl-irel.h new file mode 100644 index 0000000000..4440453f06 --- /dev/null +++ b/sysdeps/loongarch/dl-irel.h @@ -0,0 +1,54 @@ +/* Machine-dependent ELF indirect relocation inline functions. + Copyright (C) 2022 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +#ifndef _DL_IREL_H +#define _DL_IREL_H + +#include +#include +#include + +#define ELF_MACHINE_IRELA 1 + +static inline ElfW (Addr) __attribute ((always_inline)) +elf_ifunc_invoke (ElfW (Addr) addr) +{ + __ifunc_arg_t arg = + { + ._size = sizeof (__ifunc_arg_t), + ._hwcap = GLRO(dl_hwcap), + }; + return ((ElfW(Addr) (*) (const __ifunc_arg_t *)) (addr)) (&arg); +} + +static inline void __attribute ((always_inline)) +elf_irela (const ElfW (Rela) *reloc) +{ + ElfW (Addr) *const reloc_addr = (void *) reloc->r_offset; + const unsigned long int r_type = ELFW (R_TYPE) (reloc->r_info); + + if (__glibc_likely (r_type == R_LARCH_IRELATIVE)) + { + ElfW (Addr) value = elf_ifunc_invoke (reloc->r_addend); + *reloc_addr = value; + } + else + __libc_fatal ("Unexpected reloc type in static binary.\n"); +} + +#endif /* dl-irel.h */ diff --git a/sysdeps/loongarch/nptl/pthreaddef.h b/sysdeps/loongarch/nptl/pthreaddef.h new file mode 100644 index 0000000000..955566cddc --- /dev/null +++ b/sysdeps/loongarch/nptl/pthreaddef.h @@ -0,0 +1,32 @@ +/* pthread machine parameter definitions. + Copyright (C) 2022 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library. If not, see + . */ + +/* Default stack size. */ +#define ARCH_STACK_DEFAULT_SIZE (2 * 1024 * 1024) + +/* Minimum guard size. */ +#define ARCH_MIN_GUARD_SIZE 0 + +/* Required stack pointer alignment at beginning. */ +#define STACK_ALIGN 16 + +/* Minimal stack size after allocating thread descriptor and guard size. */ +#define MINIMAL_REST_STACK 2048 + +/* Location of current stack frame. */ +#define CURRENT_STACK_FRAME __builtin_frame_address (0) diff --git a/sysdeps/loongarch/sys/ifunc.h b/sysdeps/loongarch/sys/ifunc.h new file mode 100644 index 0000000000..461df20c96 --- /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 + . */ + +#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/unix/sysv/linux/loongarch/bits/fcntl.h b/sysdeps/unix/sysv/linux/loongarch/bits/fcntl.h new file mode 100644 index 0000000000..bf1e254234 --- /dev/null +++ b/sysdeps/unix/sysv/linux/loongarch/bits/fcntl.h @@ -0,0 +1,61 @@ +/* O_*, F_*, FD_* bit values for the generic Linux/LoongArch ABI. + Copyright (C) 2022 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library. If not, see + . */ + +#ifndef _FCNTL_H +#error "Never use directly; include instead." +#endif + +#include + +/* 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 diff --git a/sysdeps/unix/sysv/linux/loongarch/bits/procfs.h b/sysdeps/unix/sysv/linux/loongarch/bits/procfs.h new file mode 100644 index 0000000000..2db777b38c --- /dev/null +++ b/sysdeps/unix/sysv/linux/loongarch/bits/procfs.h @@ -0,0 +1,52 @@ +/* Types for registers for sys/procfs.h. + Copyright (C) 2022 Free Software Foundation, Inc. + + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library. If not, see + . */ + +#ifndef _SYS_PROCFS_H +# error "Never include directly; use instead." +#endif + +/* Type for a general-purpose register. */ +typedef __uint64_t elf_greg_t; + +/* And the whole bunch of them. We could have used `struct + pt_regs' directly in the typedef, but tradition says that + the register set is an array, which does have some peculiar + semantics, so leave it that way. */ +#define ELF_NGREG (sizeof (struct user_regs_struct) / sizeof (elf_greg_t)) +typedef elf_greg_t elf_gregset_t[ELF_NGREG]; + +#define ELF_NFPREG 34 /* 32 FPRs + 8-byte byte-vec for fcc + 4-byte FCR */ +typedef union +{ + double d; + float f; +} elf_fpreg_t; +typedef elf_fpreg_t elf_fpregset_t[ELF_NFPREG]; + +typedef union +{ + double d[2]; + float f[4]; +} __attribute__ ((__aligned__ (16))) elf_lsxregset_t[32]; + +typedef union +{ + double d[4]; + float f[8]; +} __attribute__ ((__aligned__ (32))) elf_lasxregset_t[32]; diff --git a/sysdeps/unix/sysv/linux/loongarch/bits/pthread_stack_min.h b/sysdeps/unix/sysv/linux/loongarch/bits/pthread_stack_min.h new file mode 100644 index 0000000000..072c2ade42 --- /dev/null +++ b/sysdeps/unix/sysv/linux/loongarch/bits/pthread_stack_min.h @@ -0,0 +1,20 @@ +/* Definition of PTHREAD_STACK_MIN. LoongArch Linux version. + Copyright (C) 2022 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public License as + published by the Free Software Foundation; either version 2.1 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library. If not, see + . */ + +/* Minimum size for a thread. At least two pages with 64k pages. */ +#define PTHREAD_STACK_MIN 131072 diff --git a/sysdeps/unix/sysv/linux/loongarch/bits/sigstack.h b/sysdeps/unix/sysv/linux/loongarch/bits/sigstack.h new file mode 100644 index 0000000000..238c1a98e6 --- /dev/null +++ b/sysdeps/unix/sysv/linux/loongarch/bits/sigstack.h @@ -0,0 +1,32 @@ +/* sigstack, sigaltstack definitions. + Copyright (C) 2022 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +#ifndef _BITS_SIGSTACK_H +#define _BITS_SIGSTACK_H 1 + +#if !defined _SIGNAL_H && !defined _SYS_UCONTEXT_H +# error "Never include this file directly. Use instead" +#endif + +/* Minimum stack size for a signal handler. */ +#define MINSIGSTKSZ 4096 + +/* System default stack size. */ +#define SIGSTKSZ 16384 + +#endif /* bits/sigstack.h */ diff --git a/sysdeps/unix/sysv/linux/loongarch/getcontext.S b/sysdeps/unix/sysv/linux/loongarch/getcontext.S new file mode 100644 index 0000000000..43b95e9715 --- /dev/null +++ b/sysdeps/unix/sysv/linux/loongarch/getcontext.S @@ -0,0 +1,59 @@ +/* Save current context. + Copyright (C) 2022 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library. If not, see + . */ + +#include "ucontext-macros.h" + +/* int getcontext (ucontext_t *ucp) */ + + .text +LEAF (__getcontext) + SAVE_INT_REG (ra, 1, a0) + SAVE_INT_REG (sp, 3, a0) + SAVE_INT_REG (zero, 4, a0) /* return 0 by overwriting a0. */ + SAVE_INT_REG (x, 21, a0) + SAVE_INT_REG (fp, 22, a0) + SAVE_INT_REG (s0, 23, a0) + SAVE_INT_REG (s1, 24, a0) + SAVE_INT_REG (s2, 25, a0) + SAVE_INT_REG (s3, 26, a0) + SAVE_INT_REG (s4, 27, a0) + SAVE_INT_REG (s5, 28, a0) + SAVE_INT_REG (s6, 29, a0) + SAVE_INT_REG (s7, 30, a0) + SAVE_INT_REG (s8, 31, a0) + st.d ra, a0, MCONTEXT_PC + +/* rt_sigprocmask (SIG_BLOCK, NULL, &ucp->uc_sigmask, _NSIG8) */ + li.d a3, _NSIG8 + li.d a2, UCONTEXT_SIGMASK + add.d a2, a2, a0 + ori a1, zero,0 + li.d a0, SIG_BLOCK + + li.d a7, SYS_ify (rt_sigprocmask) + syscall 0 + blt a0, zero, 99f + + jirl $r0, $r1, 0 + +99: + b __syscall_error + +PSEUDO_END (__getcontext) + +weak_alias (__getcontext, getcontext) diff --git a/sysdeps/unix/sysv/linux/loongarch/localplt.data b/sysdeps/unix/sysv/linux/loongarch/localplt.data new file mode 100644 index 0000000000..817ab2659a --- /dev/null +++ b/sysdeps/unix/sysv/linux/loongarch/localplt.data @@ -0,0 +1,12 @@ +# See scripts/check-localplt.awk for how this file is processed. +# PLT use is required for the malloc family and for matherr because +# users can define their own functions and have library internals call them. +libc.so: calloc +libc.so: free +libc.so: malloc +libc.so: realloc +# The TLS-enabled version of these functions is interposed from libc.so. +ld.so: _dl_signal_error +ld.so: _dl_catch_error +ld.so: _dl_signal_exception +ld.so: _dl_catch_exception diff --git a/sysdeps/unix/sysv/linux/loongarch/makecontext.c b/sysdeps/unix/sysv/linux/loongarch/makecontext.c new file mode 100644 index 0000000000..94a45bf4ad --- /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 + . */ + +#include +#include +#include +#include +#include + +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/setcontext.S b/sysdeps/unix/sysv/linux/loongarch/setcontext.S new file mode 100644 index 0000000000..7295900149 --- /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 + . */ +#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/sigcontextinfo.h b/sysdeps/unix/sysv/linux/loongarch/sigcontextinfo.h new file mode 100644 index 0000000000..5e202bc0b4 --- /dev/null +++ b/sysdeps/unix/sysv/linux/loongarch/sigcontextinfo.h @@ -0,0 +1,32 @@ +/* LoongArch definitions for signal handling calling conventions. + Copyright (C) 2022 Free Software Foundation, Inc. + + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library. If not, see + . */ + +#ifndef _SIGCONTEXTINFO_H +#define _SIGCONTEXTINFO_H + +#include +#include + +static inline uintptr_t +sigcontext_get_pc (const ucontext_t *ctx) +{ + return ctx->uc_mcontext.__pc; +} + +#endif diff --git a/sysdeps/unix/sysv/linux/loongarch/swapcontext.S b/sysdeps/unix/sysv/linux/loongarch/swapcontext.S new file mode 100644 index 0000000000..bb22cd2f00 --- /dev/null +++ b/sysdeps/unix/sysv/linux/loongarch/swapcontext.S @@ -0,0 +1,95 @@ +/* Save and set current context. + Copyright (C) 2022 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library. If not, see + . */ + +#include "ucontext-macros.h" + +/* int swapcontext (ucontext_t *oucp, const ucontext_t *ucp) */ + +LEAF (__swapcontext) + ori a2, sp, 0 /* Save sp to a2 */ + addi.d sp, sp, -16 + st.d a1, sp, 0 + ori t0, a1, 0 + + SAVE_INT_REG (ra, 1, a0) + SAVE_INT_REG (a2, 3, a0) /* Store sp */ + SAVE_INT_REG (zero, 4, a0) /* return 0 by overwriting a0 */ + SAVE_INT_REG (x, 21, a0) + SAVE_INT_REG (fp, 22, a0) + SAVE_INT_REG (s0, 23, a0) + SAVE_INT_REG (s1, 24, a0) + SAVE_INT_REG (s2, 25, a0) + SAVE_INT_REG (s3, 26, a0) + SAVE_INT_REG (s4, 27, a0) + SAVE_INT_REG (s5, 28, a0) + SAVE_INT_REG (s6, 29, a0) + SAVE_INT_REG (s7, 30, a0) + SAVE_INT_REG (s8, 31, a0) + + st.d ra, a0, MCONTEXT_PC + +/* rt_sigprocmask (SIG_SETMASK, &ucp->uc_sigmask, &oucp->uc_sigmask, _NSIG8) */ + li.d a3, _NSIG8 + li.d a2, UCONTEXT_SIGMASK + add.d a2, a2, a0 + li.d a1, UCONTEXT_SIGMASK + add.d a1, a1, t0 + li.d a0, SIG_SETMASK + + li.d a7, SYS_ify (rt_sigprocmask) + syscall 0 + + blt a0, zero, 99f + + ld.d t0, sp, 0 /* Load a1 to t0 */ + +/* Note the contents of argument registers will be random + unless makecontext() has been called. */ + RESTORE_INT_REG (ra, 1, t0) + RESTORE_INT_REG (sp, 3, t0) + RESTORE_INT_REG (a0, 4, t0) + RESTORE_INT_REG (a1, 5, t0) + RESTORE_INT_REG (a2, 6, t0) + RESTORE_INT_REG (a3, 7, t0) + RESTORE_INT_REG (a4, 8, t0) + RESTORE_INT_REG (a5, 9, t0) + RESTORE_INT_REG (a6, 10, t0) + RESTORE_INT_REG (a7, 11, t0) + RESTORE_INT_REG (x, 21, t0) + RESTORE_INT_REG (fp, 22, t0) + RESTORE_INT_REG (s0, 23, t0) + RESTORE_INT_REG (s1, 24, t0) + RESTORE_INT_REG (s2, 25, t0) + RESTORE_INT_REG (s3, 26, t0) + RESTORE_INT_REG (s4, 27, t0) + RESTORE_INT_REG (s5, 28, t0) + RESTORE_INT_REG (s6, 29, t0) + RESTORE_INT_REG (s7, 30, t0) + RESTORE_INT_REG (s8, 31, t0) + + ld.d t1, t0, MCONTEXT_PC + jirl $r0, t1, 0 + + +99: + addi.d sp, sp, 16 + b __syscall_error + +PSEUDO_END (__swapcontext) + +weak_alias (__swapcontext, swapcontext) diff --git a/sysdeps/unix/sysv/linux/loongarch/sys/ucontext.h b/sysdeps/unix/sysv/linux/loongarch/sys/ucontext.h new file mode 100644 index 0000000000..e334a45a44 --- /dev/null +++ b/sysdeps/unix/sysv/linux/loongarch/sys/ucontext.h @@ -0,0 +1,61 @@ +/* struct ucontext definition. + Copyright (C) 2022 Free Software Foundation, Inc. + + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library. If not, see + . */ + +/* 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 + +#include +#include + +#ifdef __USE_MISC +#define LARCH_NGREG 32 + +#define LARCH_REG_RA 1 +#define LARCH_REG_SP 3 +#define LARCH_REG_S0 23 +#define LARCH_REG_S1 24 +#define LARCH_REG_A0 4 +#define LARCH_REG_S2 25 +#define LARCH_REG_NARGS 8 + +#endif + +typedef struct mcontext_t +{ + unsigned long long __pc; + unsigned long long __gregs[32]; + unsigned int __flags; + unsigned long long __extcontext[0] __attribute__((__aligned__(16))); +} mcontext_t; + +/* Userlevel context. */ +typedef struct ucontext_t +{ + unsigned long int __uc_flags; + struct ucontext_t *uc_link; + stack_t uc_stack; + sigset_t uc_sigmask; + mcontext_t uc_mcontext; +} ucontext_t; + +#endif /* sys/ucontext.h */ diff --git a/sysdeps/unix/sysv/linux/loongarch/sys/user.h b/sysdeps/unix/sysv/linux/loongarch/sys/user.h new file mode 100644 index 0000000000..55181de816 --- /dev/null +++ b/sysdeps/unix/sysv/linux/loongarch/sys/user.h @@ -0,0 +1,42 @@ +/* struct user_regs_struct definition for LoongArch. + Copyright (C) 2022 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +#ifndef _SYS_USER_H +#define _SYS_USER_H 1 + +#include + +struct user_regs_struct +{ + /* Saved main processor registers. */ + uint64_t regs[32]; + + /* Saved special registers. */ + uint64_t orig_a0; + uint64_t csr_era; + uint64_t csr_badv; + uint64_t reserved[10]; +}; + +struct user_fp_struct { + uint64_t fpr[32]; + uint64_t fcc; + uint32_t fcsr; +}; + +#endif /* _SYS_USER_H */ diff --git a/sysdeps/unix/sysv/linux/loongarch/ucontext-macros.h b/sysdeps/unix/sysv/linux/loongarch/ucontext-macros.h new file mode 100644 index 0000000000..859eba464b --- /dev/null +++ b/sysdeps/unix/sysv/linux/loongarch/ucontext-macros.h @@ -0,0 +1,32 @@ +/* Macros for ucontext routines. + Copyright (C) 2022 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library. If not, see + . */ + +#ifndef _LINUX_LOONGARCH_UCONTEXT_MACROS_H +#define _LINUX_LOONGARCH_UCONTEXT_MACROS_H + +#include +#include +#include "ucontext_i.h" + +#define SAVE_INT_REG(name, num, base) \ + REG_S name, base, ((num) *SZREG + MCONTEXT_GREGS) + +#define RESTORE_INT_REG(name, num, base) \ + REG_L name, base, ((num) *SZREG + MCONTEXT_GREGS) + +#endif /* _LINUX_LOONGARCH_UCONTEXT_MACROS_H */ diff --git a/sysdeps/unix/sysv/linux/loongarch/ucontext_i.sym b/sysdeps/unix/sysv/linux/loongarch/ucontext_i.sym new file mode 100644 index 0000000000..f27afad56f --- /dev/null +++ b/sysdeps/unix/sysv/linux/loongarch/ucontext_i.sym @@ -0,0 +1,31 @@ +#include +#include +#include +#include + +-- 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) From patchwork Tue Jul 19 01:22:06 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: caiyinyu X-Patchwork-Id: 56148 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id CF297388552C for ; Tue, 19 Jul 2022 01:22:39 +0000 (GMT) X-Original-To: libc-alpha@sourceware.org Delivered-To: libc-alpha@sourceware.org Received: from loongson.cn (mail.loongson.cn [114.242.206.163]) by sourceware.org (Postfix) with ESMTP id 66B8D383A369 for ; Tue, 19 Jul 2022 01:22:18 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 66B8D383A369 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=loongson.cn Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=loongson.cn Received: from 5.5.5 (unknown [10.2.5.5]) by mail.loongson.cn (Coremail) with SMTP id AQAAf9Axn+JEB9ZixJcnAA--.10106S2; Tue, 19 Jul 2022 09:22:12 +0800 (CST) From: caiyinyu To: adhemerval.zanella@linaro.org, libc-alpha@sourceware.org, joseph_myers@mentor.com, carlos@redhat.com, i.swmail@xen0n.name Subject: [PATCH v7 09/13] LoongArch: Add ABI Lists Date: Tue, 19 Jul 2022 09:22:06 +0800 Message-Id: <20220719012210.1464764-1-caiyinyu@loongson.cn> X-Mailer: git-send-email 2.31.1 MIME-Version: 1.0 X-CM-TRANSID: AQAAf9Axn+JEB9ZixJcnAA--.10106S2 X-Coremail-Antispam: 1UD129KBjvAXoWDuFWrZw1rKr43ZFy7ArWUJwb_yoWftw4UJo W2qF15JF17Arn3Jr15AFy5Xw4DXw48Jw18G3srAr18Jr1UJw1UJr45Jr1UJrWjqwsxZr4r JryUGr1UAr15Gry5n29KB7ZKAUJUUUUU529EdanIXcx71UUUUU7v73VFW2AGmfu7bjvjm3 AaLaJ3UjIYCTnIWjp_UUUYo7AC8VAFwI0_Jr0_Gr1l1xkIjI8I6I8E6xAIw20EY4v20xva j40_Wr0E3s1l1IIY67AEw4v_Jr0_Jr4l8cAvFVAK0II2c7xJM28CjxkF64kEwVA0rcxSw2 x7M28EF7xvwVC0I7IYx2IY67AKxVW7JVWDJwA2z4x0Y4vE2Ix0cI8IcVCY1x0267AKxVW8 Jr0_Cr1UM28EF7xvwVC2z280aVAFwI0_Gr1j6F4UJwA2z4x0Y4vEx4A2jsIEc7CjxVAFwI 0_Gr1j6F4UJwAS0I0E0xvYzxvE52x082IY62kv0487Mc02F40EFcxC0VAKzVAqx4xG6I80 ewAv7VC0I7IYx2IY67AKxVWUGVWUXwAv7VC2z280aVAFwI0_Jr0_Gr1lOx8S6xCaFVCjc4 AY6r1j6r4UM4x0Y48IcxkI7VAKI48JM4x0x7Aq67IIx4CEVc8vx2IErcIFxwCY02Avz4vE -syl42xK82IYc2Ij64vIr41l4I8I3I0E4IkC6x0Yz7v_Jr0_Gr1lx2IqxVAqx4xG67AKxV WUJVWUGwC20s026x8GjcxK67AKxVWUGVWUWwC2zVAF1VAY17CE14v26r126r1DMIIYrxkI 7VAKI48JMIIF0xvE2Ix0cI8IcVAFwI0_JFI_Gr1lIxAIcVC0I7IYx2IY6xkF7I0E14v26F 4j6r4UJwCI42IY6xAIw20EY4v20xvaj40_Zr0_Wr1UMIIF0xvEx4A2jsIE14v26r1j6r4U MIIF0xvEx4A2jsIEc7CjxVAFwI0_Gr0_Gr1UYxBIdaVFxhVjvjDU0xZFpf9x0JUdEfOUUU UU= X-CM-SenderInfo: 5fdl5xhq1xqz5rrqw2lrqou0/ X-Spam-Status: No, score=-13.5 required=5.0 tests=BAYES_00, GIT_PATCH_0, KAM_DMARC_STATUS, SPF_HELO_PASS, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: libc-alpha@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Libc-alpha mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: caiyinyu Errors-To: libc-alpha-bounces+patchwork=sourceware.org@sourceware.org Sender: "Libc-alpha" --- .../sysv/linux/loongarch/lp64/c++-types.data | 67 + .../unix/sysv/linux/loongarch/lp64/ld.abilist | 8 + .../loongarch/lp64/libBrokenLocale.abilist | 1 + .../sysv/linux/loongarch/lp64/libc.abilist | 2153 +++++++++++++++++ .../loongarch/lp64/libc_malloc_debug.abilist | 26 + .../linux/loongarch/lp64/libcrypt.abilist | 2 + .../sysv/linux/loongarch/lp64/libm.abilist | 1030 ++++++++ .../linux/loongarch/lp64/libpthread.abilist | 0 .../linux/loongarch/lp64/libresolv.abilist | 55 + .../sysv/linux/loongarch/lp64/librt.abilist | 0 .../linux/loongarch/lp64/libthread_db.abilist | 40 + 11 files changed, 3382 insertions(+) create mode 100644 sysdeps/unix/sysv/linux/loongarch/lp64/c++-types.data create mode 100644 sysdeps/unix/sysv/linux/loongarch/lp64/ld.abilist create mode 100644 sysdeps/unix/sysv/linux/loongarch/lp64/libBrokenLocale.abilist create mode 100644 sysdeps/unix/sysv/linux/loongarch/lp64/libc.abilist create mode 100644 sysdeps/unix/sysv/linux/loongarch/lp64/libc_malloc_debug.abilist create mode 100644 sysdeps/unix/sysv/linux/loongarch/lp64/libcrypt.abilist create mode 100644 sysdeps/unix/sysv/linux/loongarch/lp64/libm.abilist create mode 100644 sysdeps/unix/sysv/linux/loongarch/lp64/libpthread.abilist create mode 100644 sysdeps/unix/sysv/linux/loongarch/lp64/libresolv.abilist create mode 100644 sysdeps/unix/sysv/linux/loongarch/lp64/librt.abilist create mode 100644 sysdeps/unix/sysv/linux/loongarch/lp64/libthread_db.abilist diff --git a/sysdeps/unix/sysv/linux/loongarch/lp64/c++-types.data b/sysdeps/unix/sysv/linux/loongarch/lp64/c++-types.data new file mode 100644 index 0000000000..ac925ccb36 --- /dev/null +++ b/sysdeps/unix/sysv/linux/loongarch/lp64/c++-types.data @@ -0,0 +1,67 @@ +blkcnt64_t:l +blkcnt_t:l +blksize_t:i +caddr_t:Pc +clockid_t:i +clock_t:l +daddr_t:i +dev_t:m +fd_mask:l +fsblkcnt64_t:m +fsblkcnt_t:m +fsfilcnt64_t:m +fsfilcnt_t:m +fsid_t:8__fsid_t +gid_t:j +id_t:j +ino64_t:m +ino_t:m +int16_t:s +int32_t:i +int64_t:l +int8_t:a +intptr_t:l +key_t:i +loff_t:l +mode_t:j +nlink_t:j +off64_t:l +off_t:l +pid_t:i +pthread_attr_t:14pthread_attr_t +pthread_barrier_t:17pthread_barrier_t +pthread_barrierattr_t:21pthread_barrierattr_t +pthread_cond_t:14pthread_cond_t +pthread_condattr_t:18pthread_condattr_t +pthread_key_t:j +pthread_mutex_t:15pthread_mutex_t +pthread_mutexattr_t:19pthread_mutexattr_t +pthread_once_t:i +pthread_rwlock_t:16pthread_rwlock_t +pthread_rwlockattr_t:20pthread_rwlockattr_t +pthread_spinlock_t:i +pthread_t:m +quad_t:l +register_t:l +rlim64_t:m +rlim_t:m +sigset_t:10__sigset_t +size_t:m +socklen_t:j +ssize_t:l +suseconds_t:l +time_t:l +u_char:h +uid_t:j +uint:j +u_int:j +u_int16_t:t +u_int32_t:j +u_int64_t:m +u_int8_t:h +ulong:m +u_long:m +u_quad_t:m +useconds_t:j +ushort:t +u_short:t diff --git a/sysdeps/unix/sysv/linux/loongarch/lp64/ld.abilist b/sysdeps/unix/sysv/linux/loongarch/lp64/ld.abilist new file mode 100644 index 0000000000..93fcd64eee --- /dev/null +++ b/sysdeps/unix/sysv/linux/loongarch/lp64/ld.abilist @@ -0,0 +1,8 @@ +GLIBC_2.36 __libc_stack_end D 0x8 +GLIBC_2.36 __rseq_flags D 0x4 +GLIBC_2.36 __rseq_offset D 0x8 +GLIBC_2.36 __rseq_size D 0x4 +GLIBC_2.36 __stack_chk_guard D 0x8 +GLIBC_2.36 __tls_get_addr F +GLIBC_2.36 _dl_mcount F +GLIBC_2.36 _r_debug D 0x28 diff --git a/sysdeps/unix/sysv/linux/loongarch/lp64/libBrokenLocale.abilist b/sysdeps/unix/sysv/linux/loongarch/lp64/libBrokenLocale.abilist new file mode 100644 index 0000000000..404afa3683 --- /dev/null +++ b/sysdeps/unix/sysv/linux/loongarch/lp64/libBrokenLocale.abilist @@ -0,0 +1 @@ +GLIBC_2.36 __ctype_get_mb_cur_max F diff --git a/sysdeps/unix/sysv/linux/loongarch/lp64/libc.abilist b/sysdeps/unix/sysv/linux/loongarch/lp64/libc.abilist new file mode 100644 index 0000000000..b02bc6ddc8 --- /dev/null +++ b/sysdeps/unix/sysv/linux/loongarch/lp64/libc.abilist @@ -0,0 +1,2153 @@ +GLIBC_2.36 _Exit F +GLIBC_2.36 _Fork F +GLIBC_2.36 _IO_2_1_stderr_ D 0xe0 +GLIBC_2.36 _IO_2_1_stdin_ D 0xe0 +GLIBC_2.36 _IO_2_1_stdout_ D 0xe0 +GLIBC_2.36 _IO_adjust_column F +GLIBC_2.36 _IO_adjust_wcolumn F +GLIBC_2.36 _IO_default_doallocate F +GLIBC_2.36 _IO_default_finish F +GLIBC_2.36 _IO_default_pbackfail F +GLIBC_2.36 _IO_default_uflow F +GLIBC_2.36 _IO_default_xsgetn F +GLIBC_2.36 _IO_default_xsputn F +GLIBC_2.36 _IO_do_write F +GLIBC_2.36 _IO_doallocbuf F +GLIBC_2.36 _IO_fclose F +GLIBC_2.36 _IO_fdopen F +GLIBC_2.36 _IO_feof F +GLIBC_2.36 _IO_ferror F +GLIBC_2.36 _IO_fflush F +GLIBC_2.36 _IO_fgetpos F +GLIBC_2.36 _IO_fgetpos64 F +GLIBC_2.36 _IO_fgets F +GLIBC_2.36 _IO_file_attach F +GLIBC_2.36 _IO_file_close F +GLIBC_2.36 _IO_file_close_it F +GLIBC_2.36 _IO_file_doallocate F +GLIBC_2.36 _IO_file_finish F +GLIBC_2.36 _IO_file_fopen F +GLIBC_2.36 _IO_file_init F +GLIBC_2.36 _IO_file_jumps D 0xa8 +GLIBC_2.36 _IO_file_open F +GLIBC_2.36 _IO_file_overflow F +GLIBC_2.36 _IO_file_read F +GLIBC_2.36 _IO_file_seek F +GLIBC_2.36 _IO_file_seekoff F +GLIBC_2.36 _IO_file_setbuf F +GLIBC_2.36 _IO_file_stat F +GLIBC_2.36 _IO_file_sync F +GLIBC_2.36 _IO_file_underflow F +GLIBC_2.36 _IO_file_write F +GLIBC_2.36 _IO_file_xsputn F +GLIBC_2.36 _IO_flockfile F +GLIBC_2.36 _IO_flush_all F +GLIBC_2.36 _IO_flush_all_linebuffered F +GLIBC_2.36 _IO_fopen F +GLIBC_2.36 _IO_fprintf F +GLIBC_2.36 _IO_fputs F +GLIBC_2.36 _IO_fread F +GLIBC_2.36 _IO_free_backup_area F +GLIBC_2.36 _IO_free_wbackup_area F +GLIBC_2.36 _IO_fsetpos F +GLIBC_2.36 _IO_fsetpos64 F +GLIBC_2.36 _IO_ftell F +GLIBC_2.36 _IO_ftrylockfile F +GLIBC_2.36 _IO_funlockfile F +GLIBC_2.36 _IO_fwrite F +GLIBC_2.36 _IO_getc F +GLIBC_2.36 _IO_getline F +GLIBC_2.36 _IO_getline_info F +GLIBC_2.36 _IO_gets F +GLIBC_2.36 _IO_init F +GLIBC_2.36 _IO_init_marker F +GLIBC_2.36 _IO_init_wmarker F +GLIBC_2.36 _IO_iter_begin F +GLIBC_2.36 _IO_iter_end F +GLIBC_2.36 _IO_iter_file F +GLIBC_2.36 _IO_iter_next F +GLIBC_2.36 _IO_least_wmarker F +GLIBC_2.36 _IO_link_in F +GLIBC_2.36 _IO_list_all D 0x8 +GLIBC_2.36 _IO_list_lock F +GLIBC_2.36 _IO_list_resetlock F +GLIBC_2.36 _IO_list_unlock F +GLIBC_2.36 _IO_marker_delta F +GLIBC_2.36 _IO_marker_difference F +GLIBC_2.36 _IO_padn F +GLIBC_2.36 _IO_peekc_locked F +GLIBC_2.36 _IO_popen F +GLIBC_2.36 _IO_printf F +GLIBC_2.36 _IO_proc_close F +GLIBC_2.36 _IO_proc_open F +GLIBC_2.36 _IO_putc F +GLIBC_2.36 _IO_puts F +GLIBC_2.36 _IO_remove_marker F +GLIBC_2.36 _IO_seekmark F +GLIBC_2.36 _IO_seekoff F +GLIBC_2.36 _IO_seekpos F +GLIBC_2.36 _IO_seekwmark F +GLIBC_2.36 _IO_setb F +GLIBC_2.36 _IO_setbuffer F +GLIBC_2.36 _IO_setvbuf F +GLIBC_2.36 _IO_sgetn F +GLIBC_2.36 _IO_sprintf F +GLIBC_2.36 _IO_sputbackc F +GLIBC_2.36 _IO_sputbackwc F +GLIBC_2.36 _IO_sscanf F +GLIBC_2.36 _IO_str_init_readonly F +GLIBC_2.36 _IO_str_init_static F +GLIBC_2.36 _IO_str_overflow F +GLIBC_2.36 _IO_str_pbackfail F +GLIBC_2.36 _IO_str_seekoff F +GLIBC_2.36 _IO_str_underflow F +GLIBC_2.36 _IO_sungetc F +GLIBC_2.36 _IO_sungetwc F +GLIBC_2.36 _IO_switch_to_get_mode F +GLIBC_2.36 _IO_switch_to_main_wget_area F +GLIBC_2.36 _IO_switch_to_wbackup_area F +GLIBC_2.36 _IO_switch_to_wget_mode F +GLIBC_2.36 _IO_un_link F +GLIBC_2.36 _IO_ungetc F +GLIBC_2.36 _IO_unsave_markers F +GLIBC_2.36 _IO_unsave_wmarkers F +GLIBC_2.36 _IO_vfprintf F +GLIBC_2.36 _IO_vsprintf F +GLIBC_2.36 _IO_wdefault_doallocate F +GLIBC_2.36 _IO_wdefault_finish F +GLIBC_2.36 _IO_wdefault_pbackfail F +GLIBC_2.36 _IO_wdefault_uflow F +GLIBC_2.36 _IO_wdefault_xsgetn F +GLIBC_2.36 _IO_wdefault_xsputn F +GLIBC_2.36 _IO_wdo_write F +GLIBC_2.36 _IO_wdoallocbuf F +GLIBC_2.36 _IO_wfile_jumps D 0xa8 +GLIBC_2.36 _IO_wfile_overflow F +GLIBC_2.36 _IO_wfile_seekoff F +GLIBC_2.36 _IO_wfile_sync F +GLIBC_2.36 _IO_wfile_underflow F +GLIBC_2.36 _IO_wfile_xsputn F +GLIBC_2.36 _IO_wmarker_delta F +GLIBC_2.36 _IO_wsetb F +GLIBC_2.36 __adjtimex F +GLIBC_2.36 __argz_count F +GLIBC_2.36 __argz_next F +GLIBC_2.36 __argz_stringify F +GLIBC_2.36 __asprintf F +GLIBC_2.36 __asprintf_chk F +GLIBC_2.36 __assert F +GLIBC_2.36 __assert_fail F +GLIBC_2.36 __assert_perror_fail F +GLIBC_2.36 __backtrace F +GLIBC_2.36 __backtrace_symbols F +GLIBC_2.36 __backtrace_symbols_fd F +GLIBC_2.36 __bsd_getpgrp F +GLIBC_2.36 __bzero F +GLIBC_2.36 __check_rhosts_file D 0x4 +GLIBC_2.36 __chk_fail F +GLIBC_2.36 __clone F +GLIBC_2.36 __close F +GLIBC_2.36 __cmsg_nxthdr F +GLIBC_2.36 __confstr_chk F +GLIBC_2.36 __connect F +GLIBC_2.36 __ctype_b_loc F +GLIBC_2.36 __ctype_get_mb_cur_max F +GLIBC_2.36 __ctype_tolower_loc F +GLIBC_2.36 __ctype_toupper_loc F +GLIBC_2.36 __curbrk D 0x8 +GLIBC_2.36 __cxa_at_quick_exit F +GLIBC_2.36 __cxa_atexit F +GLIBC_2.36 __cxa_finalize F +GLIBC_2.36 __cxa_thread_atexit_impl F +GLIBC_2.36 __cyg_profile_func_enter F +GLIBC_2.36 __cyg_profile_func_exit F +GLIBC_2.36 __daylight D 0x4 +GLIBC_2.36 __dcgettext F +GLIBC_2.36 __dgettext F +GLIBC_2.36 __dprintf_chk F +GLIBC_2.36 __dup2 F +GLIBC_2.36 __duplocale F +GLIBC_2.36 __endmntent F +GLIBC_2.36 __environ D 0x8 +GLIBC_2.36 __errno_location F +GLIBC_2.36 __explicit_bzero_chk F +GLIBC_2.36 __fbufsize F +GLIBC_2.36 __fcntl F +GLIBC_2.36 __fdelt_chk F +GLIBC_2.36 __fdelt_warn F +GLIBC_2.36 __ffs F +GLIBC_2.36 __fgets_chk F +GLIBC_2.36 __fgets_unlocked_chk F +GLIBC_2.36 __fgetws_chk F +GLIBC_2.36 __fgetws_unlocked_chk F +GLIBC_2.36 __finite F +GLIBC_2.36 __finitef F +GLIBC_2.36 __finitel F +GLIBC_2.36 __flbf F +GLIBC_2.36 __fork F +GLIBC_2.36 __fpending F +GLIBC_2.36 __fprintf_chk F +GLIBC_2.36 __fpu_control D 0x4 +GLIBC_2.36 __fpurge F +GLIBC_2.36 __fread_chk F +GLIBC_2.36 __fread_unlocked_chk F +GLIBC_2.36 __freadable F +GLIBC_2.36 __freading F +GLIBC_2.36 __freelocale F +GLIBC_2.36 __fsetlocking F +GLIBC_2.36 __fwprintf_chk F +GLIBC_2.36 __fwritable F +GLIBC_2.36 __fwriting F +GLIBC_2.36 __getauxval F +GLIBC_2.36 __getcwd_chk F +GLIBC_2.36 __getdelim F +GLIBC_2.36 __getdomainname_chk F +GLIBC_2.36 __getgroups_chk F +GLIBC_2.36 __gethostname_chk F +GLIBC_2.36 __getlogin_r_chk F +GLIBC_2.36 __getmntent_r F +GLIBC_2.36 __getpagesize F +GLIBC_2.36 __getpgid F +GLIBC_2.36 __getpid F +GLIBC_2.36 __gets_chk F +GLIBC_2.36 __gettimeofday F +GLIBC_2.36 __getwd_chk F +GLIBC_2.36 __gmtime_r F +GLIBC_2.36 __h_errno_location F +GLIBC_2.36 __isalnum_l F +GLIBC_2.36 __isalpha_l F +GLIBC_2.36 __isascii_l F +GLIBC_2.36 __isblank_l F +GLIBC_2.36 __iscntrl_l F +GLIBC_2.36 __isctype F +GLIBC_2.36 __isdigit_l F +GLIBC_2.36 __isgraph_l F +GLIBC_2.36 __isinf F +GLIBC_2.36 __isinff F +GLIBC_2.36 __isinfl F +GLIBC_2.36 __islower_l F +GLIBC_2.36 __isnan F +GLIBC_2.36 __isnanf F +GLIBC_2.36 __isnanl F +GLIBC_2.36 __isoc99_fscanf F +GLIBC_2.36 __isoc99_fwscanf F +GLIBC_2.36 __isoc99_scanf F +GLIBC_2.36 __isoc99_sscanf F +GLIBC_2.36 __isoc99_swscanf F +GLIBC_2.36 __isoc99_vfscanf F +GLIBC_2.36 __isoc99_vfwscanf F +GLIBC_2.36 __isoc99_vscanf F +GLIBC_2.36 __isoc99_vsscanf F +GLIBC_2.36 __isoc99_vswscanf F +GLIBC_2.36 __isoc99_vwscanf F +GLIBC_2.36 __isoc99_wscanf F +GLIBC_2.36 __isprint_l F +GLIBC_2.36 __ispunct_l F +GLIBC_2.36 __isspace_l F +GLIBC_2.36 __isupper_l F +GLIBC_2.36 __iswalnum_l F +GLIBC_2.36 __iswalpha_l F +GLIBC_2.36 __iswblank_l F +GLIBC_2.36 __iswcntrl_l F +GLIBC_2.36 __iswctype F +GLIBC_2.36 __iswctype_l F +GLIBC_2.36 __iswdigit_l F +GLIBC_2.36 __iswgraph_l F +GLIBC_2.36 __iswlower_l F +GLIBC_2.36 __iswprint_l F +GLIBC_2.36 __iswpunct_l F +GLIBC_2.36 __iswspace_l F +GLIBC_2.36 __iswupper_l F +GLIBC_2.36 __iswxdigit_l F +GLIBC_2.36 __isxdigit_l F +GLIBC_2.36 __ivaliduser F +GLIBC_2.36 __libc_allocate_rtsig F +GLIBC_2.36 __libc_calloc F +GLIBC_2.36 __libc_current_sigrtmax F +GLIBC_2.36 __libc_current_sigrtmin F +GLIBC_2.36 __libc_free F +GLIBC_2.36 __libc_freeres F +GLIBC_2.36 __libc_init_first F +GLIBC_2.36 __libc_mallinfo F +GLIBC_2.36 __libc_malloc F +GLIBC_2.36 __libc_mallopt F +GLIBC_2.36 __libc_memalign F +GLIBC_2.36 __libc_pvalloc F +GLIBC_2.36 __libc_realloc F +GLIBC_2.36 __libc_sa_len F +GLIBC_2.36 __libc_single_threaded D 0x1 +GLIBC_2.36 __libc_start_main F +GLIBC_2.36 __libc_valloc F +GLIBC_2.36 __longjmp_chk F +GLIBC_2.36 __lseek F +GLIBC_2.36 __mbrlen F +GLIBC_2.36 __mbrtowc F +GLIBC_2.36 __mbsnrtowcs_chk F +GLIBC_2.36 __mbsrtowcs_chk F +GLIBC_2.36 __mbstowcs_chk F +GLIBC_2.36 __memcmpeq F +GLIBC_2.36 __memcpy_chk F +GLIBC_2.36 __memmove_chk F +GLIBC_2.36 __mempcpy F +GLIBC_2.36 __mempcpy_chk F +GLIBC_2.36 __memset_chk F +GLIBC_2.36 __monstartup F +GLIBC_2.36 __mq_open_2 F +GLIBC_2.36 __nanosleep F +GLIBC_2.36 __newlocale F +GLIBC_2.36 __nl_langinfo_l F +GLIBC_2.36 __nss_configure_lookup F +GLIBC_2.36 __nss_hostname_digits_dots F +GLIBC_2.36 __obstack_printf_chk F +GLIBC_2.36 __obstack_vprintf_chk F +GLIBC_2.36 __open F +GLIBC_2.36 __open64 F +GLIBC_2.36 __open64_2 F +GLIBC_2.36 __open_2 F +GLIBC_2.36 __openat64_2 F +GLIBC_2.36 __openat_2 F +GLIBC_2.36 __overflow F +GLIBC_2.36 __pipe F +GLIBC_2.36 __poll F +GLIBC_2.36 __poll_chk F +GLIBC_2.36 __posix_getopt F +GLIBC_2.36 __ppoll_chk F +GLIBC_2.36 __pread64 F +GLIBC_2.36 __pread64_chk F +GLIBC_2.36 __pread_chk F +GLIBC_2.36 __printf_chk F +GLIBC_2.36 __printf_fp F +GLIBC_2.36 __profile_frequency F +GLIBC_2.36 __progname D 0x8 +GLIBC_2.36 __progname_full D 0x8 +GLIBC_2.36 __pthread_cleanup_routine F +GLIBC_2.36 __pthread_key_create F +GLIBC_2.36 __pthread_register_cancel F +GLIBC_2.36 __pthread_register_cancel_defer F +GLIBC_2.36 __pthread_rwlock_unlock F +GLIBC_2.36 __pthread_unregister_cancel F +GLIBC_2.36 __pthread_unregister_cancel_restore F +GLIBC_2.36 __pthread_unwind_next F +GLIBC_2.36 __ptsname_r_chk F +GLIBC_2.36 __pwrite64 F +GLIBC_2.36 __rawmemchr F +GLIBC_2.36 __rcmd_errstr D 0x8 +GLIBC_2.36 __read F +GLIBC_2.36 __read_chk F +GLIBC_2.36 __readlink_chk F +GLIBC_2.36 __readlinkat_chk F +GLIBC_2.36 __realpath_chk F +GLIBC_2.36 __recv_chk F +GLIBC_2.36 __recvfrom_chk F +GLIBC_2.36 __register_atfork F +GLIBC_2.36 __res_init F +GLIBC_2.36 __res_nclose F +GLIBC_2.36 __res_ninit F +GLIBC_2.36 __res_randomid F +GLIBC_2.36 __res_state F +GLIBC_2.36 __sbrk F +GLIBC_2.36 __sched_cpualloc F +GLIBC_2.36 __sched_cpucount F +GLIBC_2.36 __sched_cpufree F +GLIBC_2.36 __sched_get_priority_max F +GLIBC_2.36 __sched_get_priority_min F +GLIBC_2.36 __sched_getparam F +GLIBC_2.36 __sched_getscheduler F +GLIBC_2.36 __sched_setscheduler F +GLIBC_2.36 __sched_yield F +GLIBC_2.36 __select F +GLIBC_2.36 __send F +GLIBC_2.36 __setmntent F +GLIBC_2.36 __setpgid F +GLIBC_2.36 __sigaction F +GLIBC_2.36 __signbit F +GLIBC_2.36 __signbitf F +GLIBC_2.36 __signbitl F +GLIBC_2.36 __sigpause F +GLIBC_2.36 __sigsetjmp F +GLIBC_2.36 __sigsuspend F +GLIBC_2.36 __snprintf_chk F +GLIBC_2.36 __sprintf_chk F +GLIBC_2.36 __stack_chk_fail F +GLIBC_2.36 __statfs F +GLIBC_2.36 __stpcpy F +GLIBC_2.36 __stpcpy_chk F +GLIBC_2.36 __stpncpy F +GLIBC_2.36 __stpncpy_chk F +GLIBC_2.36 __strcasecmp F +GLIBC_2.36 __strcasecmp_l F +GLIBC_2.36 __strcasestr F +GLIBC_2.36 __strcat_chk F +GLIBC_2.36 __strcoll_l F +GLIBC_2.36 __strcpy_chk F +GLIBC_2.36 __strdup F +GLIBC_2.36 __strerror_r F +GLIBC_2.36 __strfmon_l F +GLIBC_2.36 __strftime_l F +GLIBC_2.36 __strncasecmp_l F +GLIBC_2.36 __strncat_chk F +GLIBC_2.36 __strncpy_chk F +GLIBC_2.36 __strndup F +GLIBC_2.36 __strsep_g F +GLIBC_2.36 __strtod_internal F +GLIBC_2.36 __strtod_l F +GLIBC_2.36 __strtof_internal F +GLIBC_2.36 __strtof_l F +GLIBC_2.36 __strtok_r F +GLIBC_2.36 __strtol_internal F +GLIBC_2.36 __strtol_l F +GLIBC_2.36 __strtold_internal F +GLIBC_2.36 __strtold_l F +GLIBC_2.36 __strtoll_internal F +GLIBC_2.36 __strtoll_l F +GLIBC_2.36 __strtoul_internal F +GLIBC_2.36 __strtoul_l F +GLIBC_2.36 __strtoull_internal F +GLIBC_2.36 __strtoull_l F +GLIBC_2.36 __strverscmp F +GLIBC_2.36 __strxfrm_l F +GLIBC_2.36 __swprintf_chk F +GLIBC_2.36 __sysconf F +GLIBC_2.36 __syslog_chk F +GLIBC_2.36 __sysv_signal F +GLIBC_2.36 __timezone D 0x8 +GLIBC_2.36 __toascii_l F +GLIBC_2.36 __tolower_l F +GLIBC_2.36 __toupper_l F +GLIBC_2.36 __towctrans F +GLIBC_2.36 __towctrans_l F +GLIBC_2.36 __towlower_l F +GLIBC_2.36 __towupper_l F +GLIBC_2.36 __ttyname_r_chk F +GLIBC_2.36 __tzname D 0x10 +GLIBC_2.36 __uflow F +GLIBC_2.36 __underflow F +GLIBC_2.36 __uselocale F +GLIBC_2.36 __vasprintf_chk F +GLIBC_2.36 __vdprintf_chk F +GLIBC_2.36 __vfork F +GLIBC_2.36 __vfprintf_chk F +GLIBC_2.36 __vfscanf F +GLIBC_2.36 __vfwprintf_chk F +GLIBC_2.36 __vprintf_chk F +GLIBC_2.36 __vsnprintf F +GLIBC_2.36 __vsnprintf_chk F +GLIBC_2.36 __vsprintf_chk F +GLIBC_2.36 __vsscanf F +GLIBC_2.36 __vswprintf_chk F +GLIBC_2.36 __vsyslog_chk F +GLIBC_2.36 __vwprintf_chk F +GLIBC_2.36 __wait F +GLIBC_2.36 __waitpid F +GLIBC_2.36 __wcpcpy_chk F +GLIBC_2.36 __wcpncpy_chk F +GLIBC_2.36 __wcrtomb_chk F +GLIBC_2.36 __wcscasecmp_l F +GLIBC_2.36 __wcscat_chk F +GLIBC_2.36 __wcscoll_l F +GLIBC_2.36 __wcscpy_chk F +GLIBC_2.36 __wcsftime_l F +GLIBC_2.36 __wcsncasecmp_l F +GLIBC_2.36 __wcsncat_chk F +GLIBC_2.36 __wcsncpy_chk F +GLIBC_2.36 __wcsnrtombs_chk F +GLIBC_2.36 __wcsrtombs_chk F +GLIBC_2.36 __wcstod_internal F +GLIBC_2.36 __wcstod_l F +GLIBC_2.36 __wcstof_internal F +GLIBC_2.36 __wcstof_l F +GLIBC_2.36 __wcstol_internal F +GLIBC_2.36 __wcstol_l F +GLIBC_2.36 __wcstold_internal F +GLIBC_2.36 __wcstold_l F +GLIBC_2.36 __wcstoll_internal F +GLIBC_2.36 __wcstoll_l F +GLIBC_2.36 __wcstombs_chk F +GLIBC_2.36 __wcstoul_internal F +GLIBC_2.36 __wcstoul_l F +GLIBC_2.36 __wcstoull_internal F +GLIBC_2.36 __wcstoull_l F +GLIBC_2.36 __wcsxfrm_l F +GLIBC_2.36 __wctomb_chk F +GLIBC_2.36 __wctrans_l F +GLIBC_2.36 __wctype_l F +GLIBC_2.36 __wmemcpy_chk F +GLIBC_2.36 __wmemmove_chk F +GLIBC_2.36 __wmempcpy_chk F +GLIBC_2.36 __wmemset_chk F +GLIBC_2.36 __woverflow F +GLIBC_2.36 __wprintf_chk F +GLIBC_2.36 __write F +GLIBC_2.36 __wuflow F +GLIBC_2.36 __wunderflow F +GLIBC_2.36 __xpg_basename F +GLIBC_2.36 __xpg_sigpause F +GLIBC_2.36 __xpg_strerror_r F +GLIBC_2.36 _dl_find_object F +GLIBC_2.36 _dl_mcount_wrapper F +GLIBC_2.36 _dl_mcount_wrapper_check F +GLIBC_2.36 _environ D 0x8 +GLIBC_2.36 _exit F +GLIBC_2.36 _flushlbf F +GLIBC_2.36 _libc_intl_domainname D 0x5 +GLIBC_2.36 _longjmp F +GLIBC_2.36 _mcleanup F +GLIBC_2.36 _mcount F +GLIBC_2.36 _nl_default_dirname D 0x12 +GLIBC_2.36 _nl_domain_bindings D 0x8 +GLIBC_2.36 _nl_msg_cat_cntr D 0x4 +GLIBC_2.36 _obstack_allocated_p F +GLIBC_2.36 _obstack_begin F +GLIBC_2.36 _obstack_begin_1 F +GLIBC_2.36 _obstack_free F +GLIBC_2.36 _obstack_memory_used F +GLIBC_2.36 _obstack_newchunk F +GLIBC_2.36 _pthread_cleanup_pop F +GLIBC_2.36 _pthread_cleanup_push F +GLIBC_2.36 _res D 0x238 +GLIBC_2.36 _res_hconf D 0x48 +GLIBC_2.36 _setjmp F +GLIBC_2.36 _tolower F +GLIBC_2.36 _toupper F +GLIBC_2.36 a64l F +GLIBC_2.36 abort F +GLIBC_2.36 abs F +GLIBC_2.36 accept F +GLIBC_2.36 accept4 F +GLIBC_2.36 access F +GLIBC_2.36 acct F +GLIBC_2.36 addmntent F +GLIBC_2.36 addseverity F +GLIBC_2.36 adjtime F +GLIBC_2.36 adjtimex F +GLIBC_2.36 aio_cancel F +GLIBC_2.36 aio_cancel64 F +GLIBC_2.36 aio_error F +GLIBC_2.36 aio_error64 F +GLIBC_2.36 aio_fsync F +GLIBC_2.36 aio_fsync64 F +GLIBC_2.36 aio_init F +GLIBC_2.36 aio_read F +GLIBC_2.36 aio_read64 F +GLIBC_2.36 aio_return F +GLIBC_2.36 aio_return64 F +GLIBC_2.36 aio_suspend F +GLIBC_2.36 aio_suspend64 F +GLIBC_2.36 aio_write F +GLIBC_2.36 aio_write64 F +GLIBC_2.36 alarm F +GLIBC_2.36 aligned_alloc F +GLIBC_2.36 alphasort F +GLIBC_2.36 alphasort64 F +GLIBC_2.36 argp_err_exit_status D 0x4 +GLIBC_2.36 argp_error F +GLIBC_2.36 argp_failure F +GLIBC_2.36 argp_help F +GLIBC_2.36 argp_parse F +GLIBC_2.36 argp_program_bug_address D 0x8 +GLIBC_2.36 argp_program_version D 0x8 +GLIBC_2.36 argp_program_version_hook D 0x8 +GLIBC_2.36 argp_state_help F +GLIBC_2.36 argp_usage F +GLIBC_2.36 argz_add F +GLIBC_2.36 argz_add_sep F +GLIBC_2.36 argz_append F +GLIBC_2.36 argz_count F +GLIBC_2.36 argz_create F +GLIBC_2.36 argz_create_sep F +GLIBC_2.36 argz_delete F +GLIBC_2.36 argz_extract F +GLIBC_2.36 argz_insert F +GLIBC_2.36 argz_next F +GLIBC_2.36 argz_replace F +GLIBC_2.36 argz_stringify F +GLIBC_2.36 asctime F +GLIBC_2.36 asctime_r F +GLIBC_2.36 asprintf F +GLIBC_2.36 atof F +GLIBC_2.36 atoi F +GLIBC_2.36 atol F +GLIBC_2.36 atoll F +GLIBC_2.36 backtrace F +GLIBC_2.36 backtrace_symbols F +GLIBC_2.36 backtrace_symbols_fd F +GLIBC_2.36 basename F +GLIBC_2.36 bcmp F +GLIBC_2.36 bcopy F +GLIBC_2.36 bind F +GLIBC_2.36 bind_textdomain_codeset F +GLIBC_2.36 bindresvport F +GLIBC_2.36 bindtextdomain F +GLIBC_2.36 brk F +GLIBC_2.36 bsd_signal F +GLIBC_2.36 bsearch F +GLIBC_2.36 btowc F +GLIBC_2.36 bzero F +GLIBC_2.36 c16rtomb F +GLIBC_2.36 c32rtomb F +GLIBC_2.36 c8rtomb F +GLIBC_2.36 call_once F +GLIBC_2.36 calloc F +GLIBC_2.36 canonicalize_file_name F +GLIBC_2.36 capget F +GLIBC_2.36 capset F +GLIBC_2.36 catclose F +GLIBC_2.36 catgets F +GLIBC_2.36 catopen F +GLIBC_2.36 cfgetispeed F +GLIBC_2.36 cfgetospeed F +GLIBC_2.36 cfmakeraw F +GLIBC_2.36 cfsetispeed F +GLIBC_2.36 cfsetospeed F +GLIBC_2.36 cfsetspeed F +GLIBC_2.36 chdir F +GLIBC_2.36 chflags F +GLIBC_2.36 chmod F +GLIBC_2.36 chown F +GLIBC_2.36 chroot F +GLIBC_2.36 clearenv F +GLIBC_2.36 clearerr F +GLIBC_2.36 clearerr_unlocked F +GLIBC_2.36 clock F +GLIBC_2.36 clock_adjtime F +GLIBC_2.36 clock_getcpuclockid F +GLIBC_2.36 clock_getres F +GLIBC_2.36 clock_gettime F +GLIBC_2.36 clock_nanosleep F +GLIBC_2.36 clock_settime F +GLIBC_2.36 clone F +GLIBC_2.36 close F +GLIBC_2.36 close_range F +GLIBC_2.36 closedir F +GLIBC_2.36 closefrom F +GLIBC_2.36 closelog F +GLIBC_2.36 cnd_broadcast F +GLIBC_2.36 cnd_destroy F +GLIBC_2.36 cnd_init F +GLIBC_2.36 cnd_signal F +GLIBC_2.36 cnd_timedwait F +GLIBC_2.36 cnd_wait F +GLIBC_2.36 confstr F +GLIBC_2.36 connect F +GLIBC_2.36 copy_file_range F +GLIBC_2.36 copysign F +GLIBC_2.36 copysignf F +GLIBC_2.36 copysignl F +GLIBC_2.36 creat F +GLIBC_2.36 creat64 F +GLIBC_2.36 ctermid F +GLIBC_2.36 ctime F +GLIBC_2.36 ctime_r F +GLIBC_2.36 cuserid F +GLIBC_2.36 daemon F +GLIBC_2.36 daylight D 0x4 +GLIBC_2.36 dcgettext F +GLIBC_2.36 dcngettext F +GLIBC_2.36 delete_module F +GLIBC_2.36 dgettext F +GLIBC_2.36 difftime F +GLIBC_2.36 dirfd F +GLIBC_2.36 dirname F +GLIBC_2.36 div F +GLIBC_2.36 dl_iterate_phdr F +GLIBC_2.36 dladdr F +GLIBC_2.36 dladdr1 F +GLIBC_2.36 dlclose F +GLIBC_2.36 dlerror F +GLIBC_2.36 dlinfo F +GLIBC_2.36 dlmopen F +GLIBC_2.36 dlopen F +GLIBC_2.36 dlsym F +GLIBC_2.36 dlvsym F +GLIBC_2.36 dn_comp F +GLIBC_2.36 dn_expand F +GLIBC_2.36 dn_skipname F +GLIBC_2.36 dngettext F +GLIBC_2.36 dprintf F +GLIBC_2.36 drand48 F +GLIBC_2.36 drand48_r F +GLIBC_2.36 dup F +GLIBC_2.36 dup2 F +GLIBC_2.36 dup3 F +GLIBC_2.36 duplocale F +GLIBC_2.36 dysize F +GLIBC_2.36 eaccess F +GLIBC_2.36 ecvt F +GLIBC_2.36 ecvt_r F +GLIBC_2.36 endaliasent F +GLIBC_2.36 endfsent F +GLIBC_2.36 endgrent F +GLIBC_2.36 endhostent F +GLIBC_2.36 endmntent F +GLIBC_2.36 endnetent F +GLIBC_2.36 endnetgrent F +GLIBC_2.36 endprotoent F +GLIBC_2.36 endpwent F +GLIBC_2.36 endrpcent F +GLIBC_2.36 endservent F +GLIBC_2.36 endsgent F +GLIBC_2.36 endspent F +GLIBC_2.36 endttyent F +GLIBC_2.36 endusershell F +GLIBC_2.36 endutent F +GLIBC_2.36 endutxent F +GLIBC_2.36 environ D 0x8 +GLIBC_2.36 envz_add F +GLIBC_2.36 envz_entry F +GLIBC_2.36 envz_get F +GLIBC_2.36 envz_merge F +GLIBC_2.36 envz_remove F +GLIBC_2.36 envz_strip F +GLIBC_2.36 epoll_create F +GLIBC_2.36 epoll_create1 F +GLIBC_2.36 epoll_ctl F +GLIBC_2.36 epoll_pwait F +GLIBC_2.36 epoll_pwait2 F +GLIBC_2.36 epoll_wait F +GLIBC_2.36 erand48 F +GLIBC_2.36 erand48_r F +GLIBC_2.36 err F +GLIBC_2.36 error F +GLIBC_2.36 error_at_line F +GLIBC_2.36 error_message_count D 0x4 +GLIBC_2.36 error_one_per_line D 0x4 +GLIBC_2.36 error_print_progname D 0x8 +GLIBC_2.36 errx F +GLIBC_2.36 ether_aton F +GLIBC_2.36 ether_aton_r F +GLIBC_2.36 ether_hostton F +GLIBC_2.36 ether_line F +GLIBC_2.36 ether_ntoa F +GLIBC_2.36 ether_ntoa_r F +GLIBC_2.36 ether_ntohost F +GLIBC_2.36 euidaccess F +GLIBC_2.36 eventfd F +GLIBC_2.36 eventfd_read F +GLIBC_2.36 eventfd_write F +GLIBC_2.36 execl F +GLIBC_2.36 execle F +GLIBC_2.36 execlp F +GLIBC_2.36 execv F +GLIBC_2.36 execve F +GLIBC_2.36 execveat F +GLIBC_2.36 execvp F +GLIBC_2.36 execvpe F +GLIBC_2.36 exit F +GLIBC_2.36 explicit_bzero F +GLIBC_2.36 faccessat F +GLIBC_2.36 fallocate F +GLIBC_2.36 fallocate64 F +GLIBC_2.36 fanotify_init F +GLIBC_2.36 fanotify_mark F +GLIBC_2.36 fchdir F +GLIBC_2.36 fchflags F +GLIBC_2.36 fchmod F +GLIBC_2.36 fchmodat F +GLIBC_2.36 fchown F +GLIBC_2.36 fchownat F +GLIBC_2.36 fclose F +GLIBC_2.36 fcloseall F +GLIBC_2.36 fcntl F +GLIBC_2.36 fcntl64 F +GLIBC_2.36 fcvt F +GLIBC_2.36 fcvt_r F +GLIBC_2.36 fdatasync F +GLIBC_2.36 fdopen F +GLIBC_2.36 fdopendir F +GLIBC_2.36 feof F +GLIBC_2.36 feof_unlocked F +GLIBC_2.36 ferror F +GLIBC_2.36 ferror_unlocked F +GLIBC_2.36 fexecve F +GLIBC_2.36 fflush F +GLIBC_2.36 fflush_unlocked F +GLIBC_2.36 ffs F +GLIBC_2.36 ffsl F +GLIBC_2.36 ffsll F +GLIBC_2.36 fgetc F +GLIBC_2.36 fgetc_unlocked F +GLIBC_2.36 fgetgrent F +GLIBC_2.36 fgetgrent_r F +GLIBC_2.36 fgetpos F +GLIBC_2.36 fgetpos64 F +GLIBC_2.36 fgetpwent F +GLIBC_2.36 fgetpwent_r F +GLIBC_2.36 fgets F +GLIBC_2.36 fgets_unlocked F +GLIBC_2.36 fgetsgent F +GLIBC_2.36 fgetsgent_r F +GLIBC_2.36 fgetspent F +GLIBC_2.36 fgetspent_r F +GLIBC_2.36 fgetwc F +GLIBC_2.36 fgetwc_unlocked F +GLIBC_2.36 fgetws F +GLIBC_2.36 fgetws_unlocked F +GLIBC_2.36 fgetxattr F +GLIBC_2.36 fileno F +GLIBC_2.36 fileno_unlocked F +GLIBC_2.36 finite F +GLIBC_2.36 finitef F +GLIBC_2.36 finitel F +GLIBC_2.36 flistxattr F +GLIBC_2.36 flock F +GLIBC_2.36 flockfile F +GLIBC_2.36 fmemopen F +GLIBC_2.36 fmtmsg F +GLIBC_2.36 fnmatch F +GLIBC_2.36 fopen F +GLIBC_2.36 fopen64 F +GLIBC_2.36 fopencookie F +GLIBC_2.36 fork F +GLIBC_2.36 forkpty F +GLIBC_2.36 fpathconf F +GLIBC_2.36 fprintf F +GLIBC_2.36 fputc F +GLIBC_2.36 fputc_unlocked F +GLIBC_2.36 fputs F +GLIBC_2.36 fputs_unlocked F +GLIBC_2.36 fputwc F +GLIBC_2.36 fputwc_unlocked F +GLIBC_2.36 fputws F +GLIBC_2.36 fputws_unlocked F +GLIBC_2.36 fread F +GLIBC_2.36 fread_unlocked F +GLIBC_2.36 free F +GLIBC_2.36 freeaddrinfo F +GLIBC_2.36 freeifaddrs F +GLIBC_2.36 freelocale F +GLIBC_2.36 fremovexattr F +GLIBC_2.36 freopen F +GLIBC_2.36 freopen64 F +GLIBC_2.36 frexp F +GLIBC_2.36 frexpf F +GLIBC_2.36 frexpl F +GLIBC_2.36 fscanf F +GLIBC_2.36 fsconfig 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 fsmount F +GLIBC_2.36 fsopen F +GLIBC_2.36 fspick 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 mbrtoc8 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 mount_setattr F +GLIBC_2.36 move_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_tree 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 pidfd_getfd F +GLIBC_2.36 pidfd_open F +GLIBC_2.36 pidfd_send_signal F +GLIBC_2.36 pipe F +GLIBC_2.36 pipe2 F +GLIBC_2.36 pivot_root F +GLIBC_2.36 pkey_alloc F +GLIBC_2.36 pkey_free F +GLIBC_2.36 pkey_get F +GLIBC_2.36 pkey_mprotect F +GLIBC_2.36 pkey_set F +GLIBC_2.36 poll F +GLIBC_2.36 popen F +GLIBC_2.36 posix_fadvise F +GLIBC_2.36 posix_fadvise64 F +GLIBC_2.36 posix_fallocate F +GLIBC_2.36 posix_fallocate64 F +GLIBC_2.36 posix_madvise F +GLIBC_2.36 posix_memalign F +GLIBC_2.36 posix_openpt F +GLIBC_2.36 posix_spawn F +GLIBC_2.36 posix_spawn_file_actions_addchdir_np F +GLIBC_2.36 posix_spawn_file_actions_addclose F +GLIBC_2.36 posix_spawn_file_actions_addclosefrom_np F +GLIBC_2.36 posix_spawn_file_actions_adddup2 F +GLIBC_2.36 posix_spawn_file_actions_addfchdir_np F +GLIBC_2.36 posix_spawn_file_actions_addopen F +GLIBC_2.36 posix_spawn_file_actions_addtcsetpgrp_np F +GLIBC_2.36 posix_spawn_file_actions_destroy F +GLIBC_2.36 posix_spawn_file_actions_init F +GLIBC_2.36 posix_spawnattr_destroy F +GLIBC_2.36 posix_spawnattr_getflags F +GLIBC_2.36 posix_spawnattr_getpgroup F +GLIBC_2.36 posix_spawnattr_getschedparam F +GLIBC_2.36 posix_spawnattr_getschedpolicy F +GLIBC_2.36 posix_spawnattr_getsigdefault F +GLIBC_2.36 posix_spawnattr_getsigmask F +GLIBC_2.36 posix_spawnattr_init F +GLIBC_2.36 posix_spawnattr_setflags F +GLIBC_2.36 posix_spawnattr_setpgroup F +GLIBC_2.36 posix_spawnattr_setschedparam F +GLIBC_2.36 posix_spawnattr_setschedpolicy F +GLIBC_2.36 posix_spawnattr_setsigdefault F +GLIBC_2.36 posix_spawnattr_setsigmask F +GLIBC_2.36 posix_spawnp F +GLIBC_2.36 ppoll F +GLIBC_2.36 prctl F +GLIBC_2.36 pread F +GLIBC_2.36 pread64 F +GLIBC_2.36 preadv F +GLIBC_2.36 preadv2 F +GLIBC_2.36 preadv64 F +GLIBC_2.36 preadv64v2 F +GLIBC_2.36 printf F +GLIBC_2.36 printf_size F +GLIBC_2.36 printf_size_info F +GLIBC_2.36 prlimit F +GLIBC_2.36 prlimit64 F +GLIBC_2.36 process_madvise F +GLIBC_2.36 process_mrelease F +GLIBC_2.36 process_vm_readv F +GLIBC_2.36 process_vm_writev F +GLIBC_2.36 profil F +GLIBC_2.36 program_invocation_name D 0x8 +GLIBC_2.36 program_invocation_short_name D 0x8 +GLIBC_2.36 pselect F +GLIBC_2.36 psiginfo F +GLIBC_2.36 psignal F +GLIBC_2.36 pthread_attr_destroy F +GLIBC_2.36 pthread_attr_getaffinity_np F +GLIBC_2.36 pthread_attr_getdetachstate F +GLIBC_2.36 pthread_attr_getguardsize F +GLIBC_2.36 pthread_attr_getinheritsched F +GLIBC_2.36 pthread_attr_getschedparam F +GLIBC_2.36 pthread_attr_getschedpolicy F +GLIBC_2.36 pthread_attr_getscope F +GLIBC_2.36 pthread_attr_getsigmask_np F +GLIBC_2.36 pthread_attr_getstack F +GLIBC_2.36 pthread_attr_getstackaddr F +GLIBC_2.36 pthread_attr_getstacksize F +GLIBC_2.36 pthread_attr_init F +GLIBC_2.36 pthread_attr_setaffinity_np F +GLIBC_2.36 pthread_attr_setdetachstate F +GLIBC_2.36 pthread_attr_setguardsize F +GLIBC_2.36 pthread_attr_setinheritsched F +GLIBC_2.36 pthread_attr_setschedparam F +GLIBC_2.36 pthread_attr_setschedpolicy F +GLIBC_2.36 pthread_attr_setscope F +GLIBC_2.36 pthread_attr_setsigmask_np F +GLIBC_2.36 pthread_attr_setstack F +GLIBC_2.36 pthread_attr_setstackaddr F +GLIBC_2.36 pthread_attr_setstacksize F +GLIBC_2.36 pthread_barrier_destroy F +GLIBC_2.36 pthread_barrier_init F +GLIBC_2.36 pthread_barrier_wait F +GLIBC_2.36 pthread_barrierattr_destroy F +GLIBC_2.36 pthread_barrierattr_getpshared F +GLIBC_2.36 pthread_barrierattr_init F +GLIBC_2.36 pthread_barrierattr_setpshared F +GLIBC_2.36 pthread_cancel F +GLIBC_2.36 pthread_clockjoin_np F +GLIBC_2.36 pthread_cond_broadcast F +GLIBC_2.36 pthread_cond_clockwait F +GLIBC_2.36 pthread_cond_destroy F +GLIBC_2.36 pthread_cond_init F +GLIBC_2.36 pthread_cond_signal F +GLIBC_2.36 pthread_cond_timedwait F +GLIBC_2.36 pthread_cond_wait F +GLIBC_2.36 pthread_condattr_destroy F +GLIBC_2.36 pthread_condattr_getclock F +GLIBC_2.36 pthread_condattr_getpshared F +GLIBC_2.36 pthread_condattr_init F +GLIBC_2.36 pthread_condattr_setclock F +GLIBC_2.36 pthread_condattr_setpshared F +GLIBC_2.36 pthread_create F +GLIBC_2.36 pthread_detach F +GLIBC_2.36 pthread_equal F +GLIBC_2.36 pthread_exit F +GLIBC_2.36 pthread_getaffinity_np F +GLIBC_2.36 pthread_getattr_default_np F +GLIBC_2.36 pthread_getattr_np F +GLIBC_2.36 pthread_getconcurrency F +GLIBC_2.36 pthread_getcpuclockid F +GLIBC_2.36 pthread_getname_np F +GLIBC_2.36 pthread_getschedparam F +GLIBC_2.36 pthread_getspecific F +GLIBC_2.36 pthread_join F +GLIBC_2.36 pthread_key_create F +GLIBC_2.36 pthread_key_delete F +GLIBC_2.36 pthread_kill F +GLIBC_2.36 pthread_mutex_clocklock F +GLIBC_2.36 pthread_mutex_consistent F +GLIBC_2.36 pthread_mutex_destroy F +GLIBC_2.36 pthread_mutex_getprioceiling F +GLIBC_2.36 pthread_mutex_init F +GLIBC_2.36 pthread_mutex_lock F +GLIBC_2.36 pthread_mutex_setprioceiling F +GLIBC_2.36 pthread_mutex_timedlock F +GLIBC_2.36 pthread_mutex_trylock F +GLIBC_2.36 pthread_mutex_unlock F +GLIBC_2.36 pthread_mutexattr_destroy F +GLIBC_2.36 pthread_mutexattr_getprioceiling F +GLIBC_2.36 pthread_mutexattr_getprotocol F +GLIBC_2.36 pthread_mutexattr_getpshared F +GLIBC_2.36 pthread_mutexattr_getrobust F +GLIBC_2.36 pthread_mutexattr_gettype F +GLIBC_2.36 pthread_mutexattr_init F +GLIBC_2.36 pthread_mutexattr_setprioceiling F +GLIBC_2.36 pthread_mutexattr_setprotocol F +GLIBC_2.36 pthread_mutexattr_setpshared F +GLIBC_2.36 pthread_mutexattr_setrobust F +GLIBC_2.36 pthread_mutexattr_settype F +GLIBC_2.36 pthread_once F +GLIBC_2.36 pthread_rwlock_clockrdlock F +GLIBC_2.36 pthread_rwlock_clockwrlock F +GLIBC_2.36 pthread_rwlock_destroy F +GLIBC_2.36 pthread_rwlock_init F +GLIBC_2.36 pthread_rwlock_rdlock F +GLIBC_2.36 pthread_rwlock_timedrdlock F +GLIBC_2.36 pthread_rwlock_timedwrlock F +GLIBC_2.36 pthread_rwlock_tryrdlock F +GLIBC_2.36 pthread_rwlock_trywrlock F +GLIBC_2.36 pthread_rwlock_unlock F +GLIBC_2.36 pthread_rwlock_wrlock F +GLIBC_2.36 pthread_rwlockattr_destroy F +GLIBC_2.36 pthread_rwlockattr_getkind_np F +GLIBC_2.36 pthread_rwlockattr_getpshared F +GLIBC_2.36 pthread_rwlockattr_init F +GLIBC_2.36 pthread_rwlockattr_setkind_np F +GLIBC_2.36 pthread_rwlockattr_setpshared F +GLIBC_2.36 pthread_self F +GLIBC_2.36 pthread_setaffinity_np F +GLIBC_2.36 pthread_setattr_default_np F +GLIBC_2.36 pthread_setcancelstate F +GLIBC_2.36 pthread_setcanceltype F +GLIBC_2.36 pthread_setconcurrency F +GLIBC_2.36 pthread_setname_np F +GLIBC_2.36 pthread_setschedparam F +GLIBC_2.36 pthread_setschedprio F +GLIBC_2.36 pthread_setspecific F +GLIBC_2.36 pthread_sigmask F +GLIBC_2.36 pthread_sigqueue F +GLIBC_2.36 pthread_spin_destroy F +GLIBC_2.36 pthread_spin_init F +GLIBC_2.36 pthread_spin_lock F +GLIBC_2.36 pthread_spin_trylock F +GLIBC_2.36 pthread_spin_unlock F +GLIBC_2.36 pthread_testcancel F +GLIBC_2.36 pthread_timedjoin_np F +GLIBC_2.36 pthread_tryjoin_np F +GLIBC_2.36 ptrace F +GLIBC_2.36 ptsname F +GLIBC_2.36 ptsname_r F +GLIBC_2.36 putc F +GLIBC_2.36 putc_unlocked F +GLIBC_2.36 putchar F +GLIBC_2.36 putchar_unlocked F +GLIBC_2.36 putenv F +GLIBC_2.36 putgrent F +GLIBC_2.36 putpwent F +GLIBC_2.36 puts F +GLIBC_2.36 putsgent F +GLIBC_2.36 putspent F +GLIBC_2.36 pututline F +GLIBC_2.36 pututxline F +GLIBC_2.36 putw F +GLIBC_2.36 putwc F +GLIBC_2.36 putwc_unlocked F +GLIBC_2.36 putwchar F +GLIBC_2.36 putwchar_unlocked F +GLIBC_2.36 pvalloc F +GLIBC_2.36 pwrite F +GLIBC_2.36 pwrite64 F +GLIBC_2.36 pwritev F +GLIBC_2.36 pwritev2 F +GLIBC_2.36 pwritev64 F +GLIBC_2.36 pwritev64v2 F +GLIBC_2.36 qecvt F +GLIBC_2.36 qecvt_r F +GLIBC_2.36 qfcvt F +GLIBC_2.36 qfcvt_r F +GLIBC_2.36 qgcvt F +GLIBC_2.36 qsort F +GLIBC_2.36 qsort_r F +GLIBC_2.36 quick_exit F +GLIBC_2.36 quotactl F +GLIBC_2.36 raise F +GLIBC_2.36 rand F +GLIBC_2.36 rand_r F +GLIBC_2.36 random F +GLIBC_2.36 random_r F +GLIBC_2.36 rawmemchr F +GLIBC_2.36 rcmd F +GLIBC_2.36 rcmd_af F +GLIBC_2.36 re_comp F +GLIBC_2.36 re_compile_fastmap F +GLIBC_2.36 re_compile_pattern F +GLIBC_2.36 re_exec F +GLIBC_2.36 re_match F +GLIBC_2.36 re_match_2 F +GLIBC_2.36 re_search F +GLIBC_2.36 re_search_2 F +GLIBC_2.36 re_set_registers F +GLIBC_2.36 re_set_syntax F +GLIBC_2.36 re_syntax_options D 0x8 +GLIBC_2.36 read F +GLIBC_2.36 readahead F +GLIBC_2.36 readdir F +GLIBC_2.36 readdir64 F +GLIBC_2.36 readdir64_r F +GLIBC_2.36 readdir_r F +GLIBC_2.36 readlink F +GLIBC_2.36 readlinkat F +GLIBC_2.36 readv F +GLIBC_2.36 realloc F +GLIBC_2.36 reallocarray F +GLIBC_2.36 realpath F +GLIBC_2.36 reboot F +GLIBC_2.36 recv F +GLIBC_2.36 recvfrom F +GLIBC_2.36 recvmmsg F +GLIBC_2.36 recvmsg F +GLIBC_2.36 regcomp F +GLIBC_2.36 regerror F +GLIBC_2.36 regexec F +GLIBC_2.36 regfree F +GLIBC_2.36 register_printf_function F +GLIBC_2.36 register_printf_modifier F +GLIBC_2.36 register_printf_specifier F +GLIBC_2.36 register_printf_type F +GLIBC_2.36 remap_file_pages F +GLIBC_2.36 remove F +GLIBC_2.36 removexattr F +GLIBC_2.36 remque F +GLIBC_2.36 rename F +GLIBC_2.36 renameat F +GLIBC_2.36 renameat2 F +GLIBC_2.36 res_dnok F +GLIBC_2.36 res_hnok F +GLIBC_2.36 res_mailok F +GLIBC_2.36 res_mkquery F +GLIBC_2.36 res_nmkquery F +GLIBC_2.36 res_nquery F +GLIBC_2.36 res_nquerydomain F +GLIBC_2.36 res_nsearch F +GLIBC_2.36 res_nsend F +GLIBC_2.36 res_ownok F +GLIBC_2.36 res_query F +GLIBC_2.36 res_querydomain F +GLIBC_2.36 res_search F +GLIBC_2.36 res_send F +GLIBC_2.36 revoke F +GLIBC_2.36 rewind F +GLIBC_2.36 rewinddir F +GLIBC_2.36 rexec F +GLIBC_2.36 rexec_af F +GLIBC_2.36 rexecoptions D 0x4 +GLIBC_2.36 rindex F +GLIBC_2.36 rmdir F +GLIBC_2.36 rpmatch F +GLIBC_2.36 rresvport F +GLIBC_2.36 rresvport_af F +GLIBC_2.36 ruserok F +GLIBC_2.36 ruserok_af F +GLIBC_2.36 ruserpass F +GLIBC_2.36 sbrk F +GLIBC_2.36 scalbn F +GLIBC_2.36 scalbnf F +GLIBC_2.36 scalbnl F +GLIBC_2.36 scandir F +GLIBC_2.36 scandir64 F +GLIBC_2.36 scandirat F +GLIBC_2.36 scandirat64 F +GLIBC_2.36 scanf F +GLIBC_2.36 sched_get_priority_max F +GLIBC_2.36 sched_get_priority_min F +GLIBC_2.36 sched_getaffinity F +GLIBC_2.36 sched_getcpu F +GLIBC_2.36 sched_getparam F +GLIBC_2.36 sched_getscheduler F +GLIBC_2.36 sched_rr_get_interval F +GLIBC_2.36 sched_setaffinity F +GLIBC_2.36 sched_setparam F +GLIBC_2.36 sched_setscheduler F +GLIBC_2.36 sched_yield F +GLIBC_2.36 secure_getenv F +GLIBC_2.36 seed48 F +GLIBC_2.36 seed48_r F +GLIBC_2.36 seekdir F +GLIBC_2.36 select F +GLIBC_2.36 sem_clockwait F +GLIBC_2.36 sem_close F +GLIBC_2.36 sem_destroy F +GLIBC_2.36 sem_getvalue F +GLIBC_2.36 sem_init F +GLIBC_2.36 sem_open F +GLIBC_2.36 sem_post F +GLIBC_2.36 sem_timedwait F +GLIBC_2.36 sem_trywait F +GLIBC_2.36 sem_unlink F +GLIBC_2.36 sem_wait F +GLIBC_2.36 semctl F +GLIBC_2.36 semget F +GLIBC_2.36 semop F +GLIBC_2.36 semtimedop F +GLIBC_2.36 send F +GLIBC_2.36 sendfile F +GLIBC_2.36 sendfile64 F +GLIBC_2.36 sendmmsg F +GLIBC_2.36 sendmsg F +GLIBC_2.36 sendto F +GLIBC_2.36 setaliasent F +GLIBC_2.36 setbuf F +GLIBC_2.36 setbuffer F +GLIBC_2.36 setcontext F +GLIBC_2.36 setdomainname F +GLIBC_2.36 setegid F +GLIBC_2.36 setenv F +GLIBC_2.36 seteuid F +GLIBC_2.36 setfsent F +GLIBC_2.36 setfsgid F +GLIBC_2.36 setfsuid F +GLIBC_2.36 setgid F +GLIBC_2.36 setgrent F +GLIBC_2.36 setgroups F +GLIBC_2.36 sethostent F +GLIBC_2.36 sethostid F +GLIBC_2.36 sethostname F +GLIBC_2.36 setipv4sourcefilter F +GLIBC_2.36 setitimer F +GLIBC_2.36 setjmp F +GLIBC_2.36 setlinebuf F +GLIBC_2.36 setlocale F +GLIBC_2.36 setlogin F +GLIBC_2.36 setlogmask F +GLIBC_2.36 setmntent F +GLIBC_2.36 setnetent F +GLIBC_2.36 setnetgrent F +GLIBC_2.36 setns F +GLIBC_2.36 setpgid F +GLIBC_2.36 setpgrp F +GLIBC_2.36 setpriority F +GLIBC_2.36 setprotoent F +GLIBC_2.36 setpwent F +GLIBC_2.36 setregid F +GLIBC_2.36 setresgid F +GLIBC_2.36 setresuid F +GLIBC_2.36 setreuid F +GLIBC_2.36 setrlimit F +GLIBC_2.36 setrlimit64 F +GLIBC_2.36 setrpcent F +GLIBC_2.36 setservent F +GLIBC_2.36 setsgent F +GLIBC_2.36 setsid F +GLIBC_2.36 setsockopt F +GLIBC_2.36 setsourcefilter F +GLIBC_2.36 setspent F +GLIBC_2.36 setstate F +GLIBC_2.36 setstate_r F +GLIBC_2.36 settimeofday F +GLIBC_2.36 setttyent F +GLIBC_2.36 setuid F +GLIBC_2.36 setusershell F +GLIBC_2.36 setutent F +GLIBC_2.36 setutxent F +GLIBC_2.36 setvbuf F +GLIBC_2.36 setxattr F +GLIBC_2.36 sgetsgent F +GLIBC_2.36 sgetsgent_r F +GLIBC_2.36 sgetspent F +GLIBC_2.36 sgetspent_r F +GLIBC_2.36 shm_open F +GLIBC_2.36 shm_unlink F +GLIBC_2.36 shmat F +GLIBC_2.36 shmctl F +GLIBC_2.36 shmdt F +GLIBC_2.36 shmget F +GLIBC_2.36 shutdown F +GLIBC_2.36 sigabbrev_np F +GLIBC_2.36 sigaction F +GLIBC_2.36 sigaddset F +GLIBC_2.36 sigaltstack F +GLIBC_2.36 sigandset F +GLIBC_2.36 sigblock F +GLIBC_2.36 sigdelset F +GLIBC_2.36 sigdescr_np F +GLIBC_2.36 sigemptyset F +GLIBC_2.36 sigfillset F +GLIBC_2.36 siggetmask F +GLIBC_2.36 sighold F +GLIBC_2.36 sigignore F +GLIBC_2.36 siginterrupt F +GLIBC_2.36 sigisemptyset F +GLIBC_2.36 sigismember F +GLIBC_2.36 siglongjmp F +GLIBC_2.36 signal F +GLIBC_2.36 signalfd F +GLIBC_2.36 sigorset F +GLIBC_2.36 sigpause F +GLIBC_2.36 sigpending F +GLIBC_2.36 sigprocmask F +GLIBC_2.36 sigqueue F +GLIBC_2.36 sigrelse F +GLIBC_2.36 sigreturn F +GLIBC_2.36 sigset F +GLIBC_2.36 sigsetmask F +GLIBC_2.36 sigstack F +GLIBC_2.36 sigsuspend F +GLIBC_2.36 sigtimedwait F +GLIBC_2.36 sigwait F +GLIBC_2.36 sigwaitinfo F +GLIBC_2.36 sleep F +GLIBC_2.36 snprintf F +GLIBC_2.36 sockatmark F +GLIBC_2.36 socket F +GLIBC_2.36 socketpair F +GLIBC_2.36 splice F +GLIBC_2.36 sprintf F +GLIBC_2.36 sprofil F +GLIBC_2.36 srand F +GLIBC_2.36 srand48 F +GLIBC_2.36 srand48_r F +GLIBC_2.36 srandom F +GLIBC_2.36 srandom_r F +GLIBC_2.36 sscanf F +GLIBC_2.36 ssignal F +GLIBC_2.36 stat F +GLIBC_2.36 stat64 F +GLIBC_2.36 statfs F +GLIBC_2.36 statfs64 F +GLIBC_2.36 statvfs F +GLIBC_2.36 statvfs64 F +GLIBC_2.36 statx F +GLIBC_2.36 stderr D 0x8 +GLIBC_2.36 stdin D 0x8 +GLIBC_2.36 stdout D 0x8 +GLIBC_2.36 stpcpy F +GLIBC_2.36 stpncpy F +GLIBC_2.36 strcasecmp F +GLIBC_2.36 strcasecmp_l F +GLIBC_2.36 strcasestr F +GLIBC_2.36 strcat F +GLIBC_2.36 strchr F +GLIBC_2.36 strchrnul F +GLIBC_2.36 strcmp F +GLIBC_2.36 strcoll F +GLIBC_2.36 strcoll_l F +GLIBC_2.36 strcpy F +GLIBC_2.36 strcspn F +GLIBC_2.36 strdup F +GLIBC_2.36 strerror F +GLIBC_2.36 strerror_l F +GLIBC_2.36 strerror_r F +GLIBC_2.36 strerrordesc_np F +GLIBC_2.36 strerrorname_np F +GLIBC_2.36 strfmon F +GLIBC_2.36 strfmon_l F +GLIBC_2.36 strfromd F +GLIBC_2.36 strfromf F +GLIBC_2.36 strfromf128 F +GLIBC_2.36 strfromf32 F +GLIBC_2.36 strfromf32x F +GLIBC_2.36 strfromf64 F +GLIBC_2.36 strfromf64x F +GLIBC_2.36 strfroml F +GLIBC_2.36 strfry F +GLIBC_2.36 strftime F +GLIBC_2.36 strftime_l F +GLIBC_2.36 strlen F +GLIBC_2.36 strncasecmp F +GLIBC_2.36 strncasecmp_l F +GLIBC_2.36 strncat F +GLIBC_2.36 strncmp F +GLIBC_2.36 strncpy F +GLIBC_2.36 strndup F +GLIBC_2.36 strnlen F +GLIBC_2.36 strpbrk F +GLIBC_2.36 strptime F +GLIBC_2.36 strptime_l F +GLIBC_2.36 strrchr F +GLIBC_2.36 strsep F +GLIBC_2.36 strsignal F +GLIBC_2.36 strspn F +GLIBC_2.36 strstr F +GLIBC_2.36 strtod F +GLIBC_2.36 strtod_l F +GLIBC_2.36 strtof F +GLIBC_2.36 strtof128 F +GLIBC_2.36 strtof128_l F +GLIBC_2.36 strtof32 F +GLIBC_2.36 strtof32_l F +GLIBC_2.36 strtof32x F +GLIBC_2.36 strtof32x_l F +GLIBC_2.36 strtof64 F +GLIBC_2.36 strtof64_l F +GLIBC_2.36 strtof64x F +GLIBC_2.36 strtof64x_l F +GLIBC_2.36 strtof_l F +GLIBC_2.36 strtoimax F +GLIBC_2.36 strtok F +GLIBC_2.36 strtok_r F +GLIBC_2.36 strtol F +GLIBC_2.36 strtol_l F +GLIBC_2.36 strtold F +GLIBC_2.36 strtold_l F +GLIBC_2.36 strtoll F +GLIBC_2.36 strtoll_l F +GLIBC_2.36 strtoq F +GLIBC_2.36 strtoul F +GLIBC_2.36 strtoul_l F +GLIBC_2.36 strtoull F +GLIBC_2.36 strtoull_l F +GLIBC_2.36 strtoumax F +GLIBC_2.36 strtouq F +GLIBC_2.36 strverscmp F +GLIBC_2.36 strxfrm F +GLIBC_2.36 strxfrm_l F +GLIBC_2.36 stty F +GLIBC_2.36 swab F +GLIBC_2.36 swapcontext F +GLIBC_2.36 swapoff F +GLIBC_2.36 swapon F +GLIBC_2.36 swprintf F +GLIBC_2.36 swscanf F +GLIBC_2.36 symlink F +GLIBC_2.36 symlinkat F +GLIBC_2.36 sync F +GLIBC_2.36 sync_file_range F +GLIBC_2.36 syncfs F +GLIBC_2.36 syscall F +GLIBC_2.36 sysconf F +GLIBC_2.36 sysinfo F +GLIBC_2.36 syslog F +GLIBC_2.36 system F +GLIBC_2.36 sysv_signal F +GLIBC_2.36 tcdrain F +GLIBC_2.36 tcflow F +GLIBC_2.36 tcflush F +GLIBC_2.36 tcgetattr F +GLIBC_2.36 tcgetpgrp F +GLIBC_2.36 tcgetsid F +GLIBC_2.36 tcsendbreak F +GLIBC_2.36 tcsetattr F +GLIBC_2.36 tcsetpgrp F +GLIBC_2.36 tdelete F +GLIBC_2.36 tdestroy F +GLIBC_2.36 tee F +GLIBC_2.36 telldir F +GLIBC_2.36 tempnam F +GLIBC_2.36 textdomain F +GLIBC_2.36 tfind F +GLIBC_2.36 tgkill F +GLIBC_2.36 thrd_create F +GLIBC_2.36 thrd_current F +GLIBC_2.36 thrd_detach F +GLIBC_2.36 thrd_equal F +GLIBC_2.36 thrd_exit F +GLIBC_2.36 thrd_join F +GLIBC_2.36 thrd_sleep F +GLIBC_2.36 thrd_yield F +GLIBC_2.36 time F +GLIBC_2.36 timegm F +GLIBC_2.36 timelocal F +GLIBC_2.36 timer_create F +GLIBC_2.36 timer_delete F +GLIBC_2.36 timer_getoverrun F +GLIBC_2.36 timer_gettime F +GLIBC_2.36 timer_settime F +GLIBC_2.36 timerfd_create F +GLIBC_2.36 timerfd_gettime F +GLIBC_2.36 timerfd_settime F +GLIBC_2.36 times F +GLIBC_2.36 timespec_get F +GLIBC_2.36 timespec_getres F +GLIBC_2.36 timezone D 0x8 +GLIBC_2.36 tmpfile F +GLIBC_2.36 tmpfile64 F +GLIBC_2.36 tmpnam F +GLIBC_2.36 tmpnam_r F +GLIBC_2.36 toascii F +GLIBC_2.36 tolower F +GLIBC_2.36 tolower_l F +GLIBC_2.36 toupper F +GLIBC_2.36 toupper_l F +GLIBC_2.36 towctrans F +GLIBC_2.36 towctrans_l F +GLIBC_2.36 towlower F +GLIBC_2.36 towlower_l F +GLIBC_2.36 towupper F +GLIBC_2.36 towupper_l F +GLIBC_2.36 truncate F +GLIBC_2.36 truncate64 F +GLIBC_2.36 tsearch F +GLIBC_2.36 tss_create F +GLIBC_2.36 tss_delete F +GLIBC_2.36 tss_get F +GLIBC_2.36 tss_set F +GLIBC_2.36 ttyname F +GLIBC_2.36 ttyname_r F +GLIBC_2.36 ttyslot F +GLIBC_2.36 twalk F +GLIBC_2.36 twalk_r F +GLIBC_2.36 tzname D 0x10 +GLIBC_2.36 tzset F +GLIBC_2.36 ualarm F +GLIBC_2.36 ulckpwdf F +GLIBC_2.36 ulimit F +GLIBC_2.36 umask F +GLIBC_2.36 umount F +GLIBC_2.36 umount2 F +GLIBC_2.36 uname F +GLIBC_2.36 ungetc F +GLIBC_2.36 ungetwc F +GLIBC_2.36 unlink F +GLIBC_2.36 unlinkat F +GLIBC_2.36 unlockpt F +GLIBC_2.36 unsetenv F +GLIBC_2.36 unshare F +GLIBC_2.36 updwtmp F +GLIBC_2.36 updwtmpx F +GLIBC_2.36 uselocale F +GLIBC_2.36 usleep F +GLIBC_2.36 utime F +GLIBC_2.36 utimensat F +GLIBC_2.36 utimes F +GLIBC_2.36 utmpname F +GLIBC_2.36 utmpxname F +GLIBC_2.36 valloc F +GLIBC_2.36 vasprintf F +GLIBC_2.36 vdprintf F +GLIBC_2.36 verr F +GLIBC_2.36 verrx F +GLIBC_2.36 versionsort F +GLIBC_2.36 versionsort64 F +GLIBC_2.36 vfork F +GLIBC_2.36 vfprintf F +GLIBC_2.36 vfscanf F +GLIBC_2.36 vfwprintf F +GLIBC_2.36 vfwscanf F +GLIBC_2.36 vhangup F +GLIBC_2.36 vlimit F +GLIBC_2.36 vmsplice F +GLIBC_2.36 vprintf F +GLIBC_2.36 vscanf F +GLIBC_2.36 vsnprintf F +GLIBC_2.36 vsprintf F +GLIBC_2.36 vsscanf F +GLIBC_2.36 vswprintf F +GLIBC_2.36 vswscanf F +GLIBC_2.36 vsyslog F +GLIBC_2.36 vwarn F +GLIBC_2.36 vwarnx F +GLIBC_2.36 vwprintf F +GLIBC_2.36 vwscanf F +GLIBC_2.36 wait F +GLIBC_2.36 wait3 F +GLIBC_2.36 wait4 F +GLIBC_2.36 waitid F +GLIBC_2.36 waitpid F +GLIBC_2.36 warn F +GLIBC_2.36 warnx F +GLIBC_2.36 wcpcpy F +GLIBC_2.36 wcpncpy F +GLIBC_2.36 wcrtomb F +GLIBC_2.36 wcscasecmp F +GLIBC_2.36 wcscasecmp_l F +GLIBC_2.36 wcscat F +GLIBC_2.36 wcschr F +GLIBC_2.36 wcschrnul F +GLIBC_2.36 wcscmp F +GLIBC_2.36 wcscoll F +GLIBC_2.36 wcscoll_l F +GLIBC_2.36 wcscpy F +GLIBC_2.36 wcscspn F +GLIBC_2.36 wcsdup F +GLIBC_2.36 wcsftime F +GLIBC_2.36 wcsftime_l F +GLIBC_2.36 wcslen F +GLIBC_2.36 wcsncasecmp F +GLIBC_2.36 wcsncasecmp_l F +GLIBC_2.36 wcsncat F +GLIBC_2.36 wcsncmp F +GLIBC_2.36 wcsncpy F +GLIBC_2.36 wcsnlen F +GLIBC_2.36 wcsnrtombs F +GLIBC_2.36 wcspbrk F +GLIBC_2.36 wcsrchr F +GLIBC_2.36 wcsrtombs F +GLIBC_2.36 wcsspn F +GLIBC_2.36 wcsstr F +GLIBC_2.36 wcstod F +GLIBC_2.36 wcstod_l F +GLIBC_2.36 wcstof F +GLIBC_2.36 wcstof128 F +GLIBC_2.36 wcstof128_l F +GLIBC_2.36 wcstof32 F +GLIBC_2.36 wcstof32_l F +GLIBC_2.36 wcstof32x F +GLIBC_2.36 wcstof32x_l F +GLIBC_2.36 wcstof64 F +GLIBC_2.36 wcstof64_l F +GLIBC_2.36 wcstof64x F +GLIBC_2.36 wcstof64x_l F +GLIBC_2.36 wcstof_l F +GLIBC_2.36 wcstoimax F +GLIBC_2.36 wcstok F +GLIBC_2.36 wcstol F +GLIBC_2.36 wcstol_l F +GLIBC_2.36 wcstold F +GLIBC_2.36 wcstold_l F +GLIBC_2.36 wcstoll F +GLIBC_2.36 wcstoll_l F +GLIBC_2.36 wcstombs F +GLIBC_2.36 wcstoq F +GLIBC_2.36 wcstoul F +GLIBC_2.36 wcstoul_l F +GLIBC_2.36 wcstoull F +GLIBC_2.36 wcstoull_l F +GLIBC_2.36 wcstoumax F +GLIBC_2.36 wcstouq F +GLIBC_2.36 wcswcs F +GLIBC_2.36 wcswidth F +GLIBC_2.36 wcsxfrm F +GLIBC_2.36 wcsxfrm_l F +GLIBC_2.36 wctob F +GLIBC_2.36 wctomb F +GLIBC_2.36 wctrans F +GLIBC_2.36 wctrans_l F +GLIBC_2.36 wctype F +GLIBC_2.36 wctype_l F +GLIBC_2.36 wcwidth F +GLIBC_2.36 wmemchr F +GLIBC_2.36 wmemcmp F +GLIBC_2.36 wmemcpy F +GLIBC_2.36 wmemmove F +GLIBC_2.36 wmempcpy F +GLIBC_2.36 wmemset F +GLIBC_2.36 wordexp F +GLIBC_2.36 wordfree F +GLIBC_2.36 wprintf F +GLIBC_2.36 write F +GLIBC_2.36 writev F +GLIBC_2.36 wscanf F diff --git a/sysdeps/unix/sysv/linux/loongarch/lp64/libc_malloc_debug.abilist b/sysdeps/unix/sysv/linux/loongarch/lp64/libc_malloc_debug.abilist new file mode 100644 index 0000000000..6ddfd162b3 --- /dev/null +++ b/sysdeps/unix/sysv/linux/loongarch/lp64/libc_malloc_debug.abilist @@ -0,0 +1,26 @@ +GLIBC_2.36 __free_hook D 0x8 +GLIBC_2.36 __malloc_hook D 0x8 +GLIBC_2.36 __memalign_hook D 0x8 +GLIBC_2.36 __realloc_hook D 0x8 +GLIBC_2.36 aligned_alloc F +GLIBC_2.36 calloc F +GLIBC_2.36 free F +GLIBC_2.36 mallinfo F +GLIBC_2.36 mallinfo2 F +GLIBC_2.36 malloc F +GLIBC_2.36 malloc_info F +GLIBC_2.36 malloc_stats F +GLIBC_2.36 malloc_trim F +GLIBC_2.36 malloc_usable_size F +GLIBC_2.36 mallopt F +GLIBC_2.36 mcheck F +GLIBC_2.36 mcheck_check_all F +GLIBC_2.36 mcheck_pedantic F +GLIBC_2.36 memalign F +GLIBC_2.36 mprobe F +GLIBC_2.36 mtrace F +GLIBC_2.36 muntrace F +GLIBC_2.36 posix_memalign F +GLIBC_2.36 pvalloc F +GLIBC_2.36 realloc F +GLIBC_2.36 valloc F diff --git a/sysdeps/unix/sysv/linux/loongarch/lp64/libcrypt.abilist b/sysdeps/unix/sysv/linux/loongarch/lp64/libcrypt.abilist new file mode 100644 index 0000000000..4d4332dab7 --- /dev/null +++ b/sysdeps/unix/sysv/linux/loongarch/lp64/libcrypt.abilist @@ -0,0 +1,2 @@ +GLIBC_2.36 crypt F +GLIBC_2.36 crypt_r F diff --git a/sysdeps/unix/sysv/linux/loongarch/lp64/libm.abilist b/sysdeps/unix/sysv/linux/loongarch/lp64/libm.abilist new file mode 100644 index 0000000000..b3dbd00001 --- /dev/null +++ b/sysdeps/unix/sysv/linux/loongarch/lp64/libm.abilist @@ -0,0 +1,1030 @@ +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 dfmal F +GLIBC_2.36 dmull F +GLIBC_2.36 drem F +GLIBC_2.36 dremf F +GLIBC_2.36 dreml F +GLIBC_2.36 dsqrtl F +GLIBC_2.36 dsubl F +GLIBC_2.36 erf F +GLIBC_2.36 erfc F +GLIBC_2.36 erfcf F +GLIBC_2.36 erfcf128 F +GLIBC_2.36 erfcf32 F +GLIBC_2.36 erfcf32x F +GLIBC_2.36 erfcf64 F +GLIBC_2.36 erfcf64x F +GLIBC_2.36 erfcl F +GLIBC_2.36 erff F +GLIBC_2.36 erff128 F +GLIBC_2.36 erff32 F +GLIBC_2.36 erff32x F +GLIBC_2.36 erff64 F +GLIBC_2.36 erff64x F +GLIBC_2.36 erfl F +GLIBC_2.36 exp F +GLIBC_2.36 exp10 F +GLIBC_2.36 exp10f F +GLIBC_2.36 exp10f128 F +GLIBC_2.36 exp10f32 F +GLIBC_2.36 exp10f32x F +GLIBC_2.36 exp10f64 F +GLIBC_2.36 exp10f64x F +GLIBC_2.36 exp10l F +GLIBC_2.36 exp2 F +GLIBC_2.36 exp2f F +GLIBC_2.36 exp2f128 F +GLIBC_2.36 exp2f32 F +GLIBC_2.36 exp2f32x F +GLIBC_2.36 exp2f64 F +GLIBC_2.36 exp2f64x F +GLIBC_2.36 exp2l F +GLIBC_2.36 expf F +GLIBC_2.36 expf128 F +GLIBC_2.36 expf32 F +GLIBC_2.36 expf32x F +GLIBC_2.36 expf64 F +GLIBC_2.36 expf64x F +GLIBC_2.36 expl F +GLIBC_2.36 expm1 F +GLIBC_2.36 expm1f F +GLIBC_2.36 expm1f128 F +GLIBC_2.36 expm1f32 F +GLIBC_2.36 expm1f32x F +GLIBC_2.36 expm1f64 F +GLIBC_2.36 expm1f64x F +GLIBC_2.36 expm1l F +GLIBC_2.36 f32addf128 F +GLIBC_2.36 f32addf32x F +GLIBC_2.36 f32addf64 F +GLIBC_2.36 f32addf64x F +GLIBC_2.36 f32divf128 F +GLIBC_2.36 f32divf32x F +GLIBC_2.36 f32divf64 F +GLIBC_2.36 f32divf64x F +GLIBC_2.36 f32fmaf128 F +GLIBC_2.36 f32fmaf32x F +GLIBC_2.36 f32fmaf64 F +GLIBC_2.36 f32fmaf64x F +GLIBC_2.36 f32mulf128 F +GLIBC_2.36 f32mulf32x F +GLIBC_2.36 f32mulf64 F +GLIBC_2.36 f32mulf64x F +GLIBC_2.36 f32sqrtf128 F +GLIBC_2.36 f32sqrtf32x F +GLIBC_2.36 f32sqrtf64 F +GLIBC_2.36 f32sqrtf64x F +GLIBC_2.36 f32subf128 F +GLIBC_2.36 f32subf32x F +GLIBC_2.36 f32subf64 F +GLIBC_2.36 f32subf64x F +GLIBC_2.36 f32xaddf128 F +GLIBC_2.36 f32xaddf64 F +GLIBC_2.36 f32xaddf64x F +GLIBC_2.36 f32xdivf128 F +GLIBC_2.36 f32xdivf64 F +GLIBC_2.36 f32xdivf64x F +GLIBC_2.36 f32xfmaf128 F +GLIBC_2.36 f32xfmaf64 F +GLIBC_2.36 f32xfmaf64x F +GLIBC_2.36 f32xmulf128 F +GLIBC_2.36 f32xmulf64 F +GLIBC_2.36 f32xmulf64x F +GLIBC_2.36 f32xsqrtf128 F +GLIBC_2.36 f32xsqrtf64 F +GLIBC_2.36 f32xsqrtf64x F +GLIBC_2.36 f32xsubf128 F +GLIBC_2.36 f32xsubf64 F +GLIBC_2.36 f32xsubf64x F +GLIBC_2.36 f64addf128 F +GLIBC_2.36 f64addf64x F +GLIBC_2.36 f64divf128 F +GLIBC_2.36 f64divf64x F +GLIBC_2.36 f64fmaf128 F +GLIBC_2.36 f64fmaf64x F +GLIBC_2.36 f64mulf128 F +GLIBC_2.36 f64mulf64x F +GLIBC_2.36 f64sqrtf128 F +GLIBC_2.36 f64sqrtf64x F +GLIBC_2.36 f64subf128 F +GLIBC_2.36 f64subf64x F +GLIBC_2.36 f64xaddf128 F +GLIBC_2.36 f64xdivf128 F +GLIBC_2.36 f64xfmaf128 F +GLIBC_2.36 f64xmulf128 F +GLIBC_2.36 f64xsqrtf128 F +GLIBC_2.36 f64xsubf128 F +GLIBC_2.36 fabs F +GLIBC_2.36 fabsf F +GLIBC_2.36 fabsf128 F +GLIBC_2.36 fabsf32 F +GLIBC_2.36 fabsf32x F +GLIBC_2.36 fabsf64 F +GLIBC_2.36 fabsf64x F +GLIBC_2.36 fabsl F +GLIBC_2.36 fadd F +GLIBC_2.36 faddl F +GLIBC_2.36 fdim F +GLIBC_2.36 fdimf F +GLIBC_2.36 fdimf128 F +GLIBC_2.36 fdimf32 F +GLIBC_2.36 fdimf32x F +GLIBC_2.36 fdimf64 F +GLIBC_2.36 fdimf64x F +GLIBC_2.36 fdiml F +GLIBC_2.36 fdiv F +GLIBC_2.36 fdivl F +GLIBC_2.36 feclearexcept F +GLIBC_2.36 fedisableexcept F +GLIBC_2.36 feenableexcept F +GLIBC_2.36 fegetenv F +GLIBC_2.36 fegetexcept F +GLIBC_2.36 fegetexceptflag F +GLIBC_2.36 fegetmode F +GLIBC_2.36 fegetround F +GLIBC_2.36 feholdexcept F +GLIBC_2.36 feraiseexcept F +GLIBC_2.36 fesetenv F +GLIBC_2.36 fesetexcept F +GLIBC_2.36 fesetexceptflag F +GLIBC_2.36 fesetmode F +GLIBC_2.36 fesetround F +GLIBC_2.36 fetestexcept F +GLIBC_2.36 fetestexceptflag F +GLIBC_2.36 feupdateenv F +GLIBC_2.36 ffma F +GLIBC_2.36 ffmal F +GLIBC_2.36 finite F +GLIBC_2.36 finitef F +GLIBC_2.36 finitel F +GLIBC_2.36 floor F +GLIBC_2.36 floorf F +GLIBC_2.36 floorf128 F +GLIBC_2.36 floorf32 F +GLIBC_2.36 floorf32x F +GLIBC_2.36 floorf64 F +GLIBC_2.36 floorf64x F +GLIBC_2.36 floorl F +GLIBC_2.36 fma F +GLIBC_2.36 fmaf F +GLIBC_2.36 fmaf128 F +GLIBC_2.36 fmaf32 F +GLIBC_2.36 fmaf32x F +GLIBC_2.36 fmaf64 F +GLIBC_2.36 fmaf64x F +GLIBC_2.36 fmal F +GLIBC_2.36 fmax F +GLIBC_2.36 fmaxf F +GLIBC_2.36 fmaxf128 F +GLIBC_2.36 fmaxf32 F +GLIBC_2.36 fmaxf32x F +GLIBC_2.36 fmaxf64 F +GLIBC_2.36 fmaxf64x F +GLIBC_2.36 fmaximum F +GLIBC_2.36 fmaximum_mag F +GLIBC_2.36 fmaximum_mag_num F +GLIBC_2.36 fmaximum_mag_numf F +GLIBC_2.36 fmaximum_mag_numf128 F +GLIBC_2.36 fmaximum_mag_numf32 F +GLIBC_2.36 fmaximum_mag_numf32x F +GLIBC_2.36 fmaximum_mag_numf64 F +GLIBC_2.36 fmaximum_mag_numf64x F +GLIBC_2.36 fmaximum_mag_numl F +GLIBC_2.36 fmaximum_magf F +GLIBC_2.36 fmaximum_magf128 F +GLIBC_2.36 fmaximum_magf32 F +GLIBC_2.36 fmaximum_magf32x F +GLIBC_2.36 fmaximum_magf64 F +GLIBC_2.36 fmaximum_magf64x F +GLIBC_2.36 fmaximum_magl F +GLIBC_2.36 fmaximum_num F +GLIBC_2.36 fmaximum_numf F +GLIBC_2.36 fmaximum_numf128 F +GLIBC_2.36 fmaximum_numf32 F +GLIBC_2.36 fmaximum_numf32x F +GLIBC_2.36 fmaximum_numf64 F +GLIBC_2.36 fmaximum_numf64x F +GLIBC_2.36 fmaximum_numl F +GLIBC_2.36 fmaximumf F +GLIBC_2.36 fmaximumf128 F +GLIBC_2.36 fmaximumf32 F +GLIBC_2.36 fmaximumf32x F +GLIBC_2.36 fmaximumf64 F +GLIBC_2.36 fmaximumf64x F +GLIBC_2.36 fmaximuml F +GLIBC_2.36 fmaxl F +GLIBC_2.36 fmaxmag F +GLIBC_2.36 fmaxmagf F +GLIBC_2.36 fmaxmagf128 F +GLIBC_2.36 fmaxmagf32 F +GLIBC_2.36 fmaxmagf32x F +GLIBC_2.36 fmaxmagf64 F +GLIBC_2.36 fmaxmagf64x F +GLIBC_2.36 fmaxmagl F +GLIBC_2.36 fmin F +GLIBC_2.36 fminf F +GLIBC_2.36 fminf128 F +GLIBC_2.36 fminf32 F +GLIBC_2.36 fminf32x F +GLIBC_2.36 fminf64 F +GLIBC_2.36 fminf64x F +GLIBC_2.36 fminimum F +GLIBC_2.36 fminimum_mag F +GLIBC_2.36 fminimum_mag_num F +GLIBC_2.36 fminimum_mag_numf F +GLIBC_2.36 fminimum_mag_numf128 F +GLIBC_2.36 fminimum_mag_numf32 F +GLIBC_2.36 fminimum_mag_numf32x F +GLIBC_2.36 fminimum_mag_numf64 F +GLIBC_2.36 fminimum_mag_numf64x F +GLIBC_2.36 fminimum_mag_numl F +GLIBC_2.36 fminimum_magf F +GLIBC_2.36 fminimum_magf128 F +GLIBC_2.36 fminimum_magf32 F +GLIBC_2.36 fminimum_magf32x F +GLIBC_2.36 fminimum_magf64 F +GLIBC_2.36 fminimum_magf64x F +GLIBC_2.36 fminimum_magl F +GLIBC_2.36 fminimum_num F +GLIBC_2.36 fminimum_numf F +GLIBC_2.36 fminimum_numf128 F +GLIBC_2.36 fminimum_numf32 F +GLIBC_2.36 fminimum_numf32x F +GLIBC_2.36 fminimum_numf64 F +GLIBC_2.36 fminimum_numf64x F +GLIBC_2.36 fminimum_numl F +GLIBC_2.36 fminimumf F +GLIBC_2.36 fminimumf128 F +GLIBC_2.36 fminimumf32 F +GLIBC_2.36 fminimumf32x F +GLIBC_2.36 fminimumf64 F +GLIBC_2.36 fminimumf64x F +GLIBC_2.36 fminimuml F +GLIBC_2.36 fminl F +GLIBC_2.36 fminmag F +GLIBC_2.36 fminmagf F +GLIBC_2.36 fminmagf128 F +GLIBC_2.36 fminmagf32 F +GLIBC_2.36 fminmagf32x F +GLIBC_2.36 fminmagf64 F +GLIBC_2.36 fminmagf64x F +GLIBC_2.36 fminmagl F +GLIBC_2.36 fmod F +GLIBC_2.36 fmodf F +GLIBC_2.36 fmodf128 F +GLIBC_2.36 fmodf32 F +GLIBC_2.36 fmodf32x F +GLIBC_2.36 fmodf64 F +GLIBC_2.36 fmodf64x F +GLIBC_2.36 fmodl F +GLIBC_2.36 fmul F +GLIBC_2.36 fmull F +GLIBC_2.36 frexp F +GLIBC_2.36 frexpf F +GLIBC_2.36 frexpf128 F +GLIBC_2.36 frexpf32 F +GLIBC_2.36 frexpf32x F +GLIBC_2.36 frexpf64 F +GLIBC_2.36 frexpf64x F +GLIBC_2.36 frexpl F +GLIBC_2.36 fromfp F +GLIBC_2.36 fromfpf F +GLIBC_2.36 fromfpf128 F +GLIBC_2.36 fromfpf32 F +GLIBC_2.36 fromfpf32x F +GLIBC_2.36 fromfpf64 F +GLIBC_2.36 fromfpf64x F +GLIBC_2.36 fromfpl F +GLIBC_2.36 fromfpx F +GLIBC_2.36 fromfpxf F +GLIBC_2.36 fromfpxf128 F +GLIBC_2.36 fromfpxf32 F +GLIBC_2.36 fromfpxf32x F +GLIBC_2.36 fromfpxf64 F +GLIBC_2.36 fromfpxf64x F +GLIBC_2.36 fromfpxl F +GLIBC_2.36 fsqrt F +GLIBC_2.36 fsqrtl F +GLIBC_2.36 fsub F +GLIBC_2.36 fsubl F +GLIBC_2.36 gamma F +GLIBC_2.36 gammaf F +GLIBC_2.36 gammal F +GLIBC_2.36 getpayload F +GLIBC_2.36 getpayloadf F +GLIBC_2.36 getpayloadf128 F +GLIBC_2.36 getpayloadf32 F +GLIBC_2.36 getpayloadf32x F +GLIBC_2.36 getpayloadf64 F +GLIBC_2.36 getpayloadf64x F +GLIBC_2.36 getpayloadl F +GLIBC_2.36 hypot F +GLIBC_2.36 hypotf F +GLIBC_2.36 hypotf128 F +GLIBC_2.36 hypotf32 F +GLIBC_2.36 hypotf32x F +GLIBC_2.36 hypotf64 F +GLIBC_2.36 hypotf64x F +GLIBC_2.36 hypotl F +GLIBC_2.36 ilogb F +GLIBC_2.36 ilogbf F +GLIBC_2.36 ilogbf128 F +GLIBC_2.36 ilogbf32 F +GLIBC_2.36 ilogbf32x F +GLIBC_2.36 ilogbf64 F +GLIBC_2.36 ilogbf64x F +GLIBC_2.36 ilogbl F +GLIBC_2.36 j0 F +GLIBC_2.36 j0f F +GLIBC_2.36 j0f128 F +GLIBC_2.36 j0f32 F +GLIBC_2.36 j0f32x F +GLIBC_2.36 j0f64 F +GLIBC_2.36 j0f64x F +GLIBC_2.36 j0l F +GLIBC_2.36 j1 F +GLIBC_2.36 j1f F +GLIBC_2.36 j1f128 F +GLIBC_2.36 j1f32 F +GLIBC_2.36 j1f32x F +GLIBC_2.36 j1f64 F +GLIBC_2.36 j1f64x F +GLIBC_2.36 j1l F +GLIBC_2.36 jn F +GLIBC_2.36 jnf F +GLIBC_2.36 jnf128 F +GLIBC_2.36 jnf32 F +GLIBC_2.36 jnf32x F +GLIBC_2.36 jnf64 F +GLIBC_2.36 jnf64x F +GLIBC_2.36 jnl F +GLIBC_2.36 ldexp F +GLIBC_2.36 ldexpf F +GLIBC_2.36 ldexpf128 F +GLIBC_2.36 ldexpf32 F +GLIBC_2.36 ldexpf32x F +GLIBC_2.36 ldexpf64 F +GLIBC_2.36 ldexpf64x F +GLIBC_2.36 ldexpl F +GLIBC_2.36 lgamma F +GLIBC_2.36 lgamma_r F +GLIBC_2.36 lgammaf F +GLIBC_2.36 lgammaf128 F +GLIBC_2.36 lgammaf128_r F +GLIBC_2.36 lgammaf32 F +GLIBC_2.36 lgammaf32_r F +GLIBC_2.36 lgammaf32x F +GLIBC_2.36 lgammaf32x_r F +GLIBC_2.36 lgammaf64 F +GLIBC_2.36 lgammaf64_r F +GLIBC_2.36 lgammaf64x F +GLIBC_2.36 lgammaf64x_r F +GLIBC_2.36 lgammaf_r F +GLIBC_2.36 lgammal F +GLIBC_2.36 lgammal_r F +GLIBC_2.36 llogb F +GLIBC_2.36 llogbf F +GLIBC_2.36 llogbf128 F +GLIBC_2.36 llogbf32 F +GLIBC_2.36 llogbf32x F +GLIBC_2.36 llogbf64 F +GLIBC_2.36 llogbf64x F +GLIBC_2.36 llogbl F +GLIBC_2.36 llrint F +GLIBC_2.36 llrintf F +GLIBC_2.36 llrintf128 F +GLIBC_2.36 llrintf32 F +GLIBC_2.36 llrintf32x F +GLIBC_2.36 llrintf64 F +GLIBC_2.36 llrintf64x F +GLIBC_2.36 llrintl F +GLIBC_2.36 llround F +GLIBC_2.36 llroundf F +GLIBC_2.36 llroundf128 F +GLIBC_2.36 llroundf32 F +GLIBC_2.36 llroundf32x F +GLIBC_2.36 llroundf64 F +GLIBC_2.36 llroundf64x F +GLIBC_2.36 llroundl F +GLIBC_2.36 log F +GLIBC_2.36 log10 F +GLIBC_2.36 log10f F +GLIBC_2.36 log10f128 F +GLIBC_2.36 log10f32 F +GLIBC_2.36 log10f32x F +GLIBC_2.36 log10f64 F +GLIBC_2.36 log10f64x F +GLIBC_2.36 log10l F +GLIBC_2.36 log1p F +GLIBC_2.36 log1pf F +GLIBC_2.36 log1pf128 F +GLIBC_2.36 log1pf32 F +GLIBC_2.36 log1pf32x F +GLIBC_2.36 log1pf64 F +GLIBC_2.36 log1pf64x F +GLIBC_2.36 log1pl F +GLIBC_2.36 log2 F +GLIBC_2.36 log2f F +GLIBC_2.36 log2f128 F +GLIBC_2.36 log2f32 F +GLIBC_2.36 log2f32x F +GLIBC_2.36 log2f64 F +GLIBC_2.36 log2f64x F +GLIBC_2.36 log2l F +GLIBC_2.36 logb F +GLIBC_2.36 logbf F +GLIBC_2.36 logbf128 F +GLIBC_2.36 logbf32 F +GLIBC_2.36 logbf32x F +GLIBC_2.36 logbf64 F +GLIBC_2.36 logbf64x F +GLIBC_2.36 logbl F +GLIBC_2.36 logf F +GLIBC_2.36 logf128 F +GLIBC_2.36 logf32 F +GLIBC_2.36 logf32x F +GLIBC_2.36 logf64 F +GLIBC_2.36 logf64x F +GLIBC_2.36 logl F +GLIBC_2.36 lrint F +GLIBC_2.36 lrintf F +GLIBC_2.36 lrintf128 F +GLIBC_2.36 lrintf32 F +GLIBC_2.36 lrintf32x F +GLIBC_2.36 lrintf64 F +GLIBC_2.36 lrintf64x F +GLIBC_2.36 lrintl F +GLIBC_2.36 lround F +GLIBC_2.36 lroundf F +GLIBC_2.36 lroundf128 F +GLIBC_2.36 lroundf32 F +GLIBC_2.36 lroundf32x F +GLIBC_2.36 lroundf64 F +GLIBC_2.36 lroundf64x F +GLIBC_2.36 lroundl F +GLIBC_2.36 modf F +GLIBC_2.36 modff F +GLIBC_2.36 modff128 F +GLIBC_2.36 modff32 F +GLIBC_2.36 modff32x F +GLIBC_2.36 modff64 F +GLIBC_2.36 modff64x F +GLIBC_2.36 modfl F +GLIBC_2.36 nan F +GLIBC_2.36 nanf F +GLIBC_2.36 nanf128 F +GLIBC_2.36 nanf32 F +GLIBC_2.36 nanf32x F +GLIBC_2.36 nanf64 F +GLIBC_2.36 nanf64x F +GLIBC_2.36 nanl F +GLIBC_2.36 nearbyint F +GLIBC_2.36 nearbyintf F +GLIBC_2.36 nearbyintf128 F +GLIBC_2.36 nearbyintf32 F +GLIBC_2.36 nearbyintf32x F +GLIBC_2.36 nearbyintf64 F +GLIBC_2.36 nearbyintf64x F +GLIBC_2.36 nearbyintl F +GLIBC_2.36 nextafter F +GLIBC_2.36 nextafterf F +GLIBC_2.36 nextafterf128 F +GLIBC_2.36 nextafterf32 F +GLIBC_2.36 nextafterf32x F +GLIBC_2.36 nextafterf64 F +GLIBC_2.36 nextafterf64x F +GLIBC_2.36 nextafterl F +GLIBC_2.36 nextdown F +GLIBC_2.36 nextdownf F +GLIBC_2.36 nextdownf128 F +GLIBC_2.36 nextdownf32 F +GLIBC_2.36 nextdownf32x F +GLIBC_2.36 nextdownf64 F +GLIBC_2.36 nextdownf64x F +GLIBC_2.36 nextdownl F +GLIBC_2.36 nexttoward F +GLIBC_2.36 nexttowardf F +GLIBC_2.36 nexttowardl F +GLIBC_2.36 nextup F +GLIBC_2.36 nextupf F +GLIBC_2.36 nextupf128 F +GLIBC_2.36 nextupf32 F +GLIBC_2.36 nextupf32x F +GLIBC_2.36 nextupf64 F +GLIBC_2.36 nextupf64x F +GLIBC_2.36 nextupl F +GLIBC_2.36 pow F +GLIBC_2.36 powf F +GLIBC_2.36 powf128 F +GLIBC_2.36 powf32 F +GLIBC_2.36 powf32x F +GLIBC_2.36 powf64 F +GLIBC_2.36 powf64x F +GLIBC_2.36 powl F +GLIBC_2.36 remainder F +GLIBC_2.36 remainderf F +GLIBC_2.36 remainderf128 F +GLIBC_2.36 remainderf32 F +GLIBC_2.36 remainderf32x F +GLIBC_2.36 remainderf64 F +GLIBC_2.36 remainderf64x F +GLIBC_2.36 remainderl F +GLIBC_2.36 remquo F +GLIBC_2.36 remquof F +GLIBC_2.36 remquof128 F +GLIBC_2.36 remquof32 F +GLIBC_2.36 remquof32x F +GLIBC_2.36 remquof64 F +GLIBC_2.36 remquof64x F +GLIBC_2.36 remquol F +GLIBC_2.36 rint F +GLIBC_2.36 rintf F +GLIBC_2.36 rintf128 F +GLIBC_2.36 rintf32 F +GLIBC_2.36 rintf32x F +GLIBC_2.36 rintf64 F +GLIBC_2.36 rintf64x F +GLIBC_2.36 rintl F +GLIBC_2.36 round F +GLIBC_2.36 roundeven F +GLIBC_2.36 roundevenf F +GLIBC_2.36 roundevenf128 F +GLIBC_2.36 roundevenf32 F +GLIBC_2.36 roundevenf32x F +GLIBC_2.36 roundevenf64 F +GLIBC_2.36 roundevenf64x F +GLIBC_2.36 roundevenl F +GLIBC_2.36 roundf F +GLIBC_2.36 roundf128 F +GLIBC_2.36 roundf32 F +GLIBC_2.36 roundf32x F +GLIBC_2.36 roundf64 F +GLIBC_2.36 roundf64x F +GLIBC_2.36 roundl F +GLIBC_2.36 scalb F +GLIBC_2.36 scalbf F +GLIBC_2.36 scalbl F +GLIBC_2.36 scalbln F +GLIBC_2.36 scalblnf F +GLIBC_2.36 scalblnf128 F +GLIBC_2.36 scalblnf32 F +GLIBC_2.36 scalblnf32x F +GLIBC_2.36 scalblnf64 F +GLIBC_2.36 scalblnf64x F +GLIBC_2.36 scalblnl F +GLIBC_2.36 scalbn F +GLIBC_2.36 scalbnf F +GLIBC_2.36 scalbnf128 F +GLIBC_2.36 scalbnf32 F +GLIBC_2.36 scalbnf32x F +GLIBC_2.36 scalbnf64 F +GLIBC_2.36 scalbnf64x F +GLIBC_2.36 scalbnl F +GLIBC_2.36 setpayload F +GLIBC_2.36 setpayloadf F +GLIBC_2.36 setpayloadf128 F +GLIBC_2.36 setpayloadf32 F +GLIBC_2.36 setpayloadf32x F +GLIBC_2.36 setpayloadf64 F +GLIBC_2.36 setpayloadf64x F +GLIBC_2.36 setpayloadl F +GLIBC_2.36 setpayloadsig F +GLIBC_2.36 setpayloadsigf F +GLIBC_2.36 setpayloadsigf128 F +GLIBC_2.36 setpayloadsigf32 F +GLIBC_2.36 setpayloadsigf32x F +GLIBC_2.36 setpayloadsigf64 F +GLIBC_2.36 setpayloadsigf64x F +GLIBC_2.36 setpayloadsigl F +GLIBC_2.36 signgam D 0x4 +GLIBC_2.36 significand F +GLIBC_2.36 significandf F +GLIBC_2.36 significandl F +GLIBC_2.36 sin F +GLIBC_2.36 sincos F +GLIBC_2.36 sincosf F +GLIBC_2.36 sincosf128 F +GLIBC_2.36 sincosf32 F +GLIBC_2.36 sincosf32x F +GLIBC_2.36 sincosf64 F +GLIBC_2.36 sincosf64x F +GLIBC_2.36 sincosl F +GLIBC_2.36 sinf F +GLIBC_2.36 sinf128 F +GLIBC_2.36 sinf32 F +GLIBC_2.36 sinf32x F +GLIBC_2.36 sinf64 F +GLIBC_2.36 sinf64x F +GLIBC_2.36 sinh F +GLIBC_2.36 sinhf F +GLIBC_2.36 sinhf128 F +GLIBC_2.36 sinhf32 F +GLIBC_2.36 sinhf32x F +GLIBC_2.36 sinhf64 F +GLIBC_2.36 sinhf64x F +GLIBC_2.36 sinhl F +GLIBC_2.36 sinl F +GLIBC_2.36 sqrt F +GLIBC_2.36 sqrtf F +GLIBC_2.36 sqrtf128 F +GLIBC_2.36 sqrtf32 F +GLIBC_2.36 sqrtf32x F +GLIBC_2.36 sqrtf64 F +GLIBC_2.36 sqrtf64x F +GLIBC_2.36 sqrtl F +GLIBC_2.36 tan F +GLIBC_2.36 tanf F +GLIBC_2.36 tanf128 F +GLIBC_2.36 tanf32 F +GLIBC_2.36 tanf32x F +GLIBC_2.36 tanf64 F +GLIBC_2.36 tanf64x F +GLIBC_2.36 tanh F +GLIBC_2.36 tanhf F +GLIBC_2.36 tanhf128 F +GLIBC_2.36 tanhf32 F +GLIBC_2.36 tanhf32x F +GLIBC_2.36 tanhf64 F +GLIBC_2.36 tanhf64x F +GLIBC_2.36 tanhl F +GLIBC_2.36 tanl F +GLIBC_2.36 tgamma F +GLIBC_2.36 tgammaf F +GLIBC_2.36 tgammaf128 F +GLIBC_2.36 tgammaf32 F +GLIBC_2.36 tgammaf32x F +GLIBC_2.36 tgammaf64 F +GLIBC_2.36 tgammaf64x F +GLIBC_2.36 tgammal F +GLIBC_2.36 totalorder F +GLIBC_2.36 totalorderf F +GLIBC_2.36 totalorderf128 F +GLIBC_2.36 totalorderf32 F +GLIBC_2.36 totalorderf32x F +GLIBC_2.36 totalorderf64 F +GLIBC_2.36 totalorderf64x F +GLIBC_2.36 totalorderl F +GLIBC_2.36 totalordermag F +GLIBC_2.36 totalordermagf F +GLIBC_2.36 totalordermagf128 F +GLIBC_2.36 totalordermagf32 F +GLIBC_2.36 totalordermagf32x F +GLIBC_2.36 totalordermagf64 F +GLIBC_2.36 totalordermagf64x F +GLIBC_2.36 totalordermagl F +GLIBC_2.36 trunc F +GLIBC_2.36 truncf F +GLIBC_2.36 truncf128 F +GLIBC_2.36 truncf32 F +GLIBC_2.36 truncf32x F +GLIBC_2.36 truncf64 F +GLIBC_2.36 truncf64x F +GLIBC_2.36 truncl F +GLIBC_2.36 ufromfp F +GLIBC_2.36 ufromfpf F +GLIBC_2.36 ufromfpf128 F +GLIBC_2.36 ufromfpf32 F +GLIBC_2.36 ufromfpf32x F +GLIBC_2.36 ufromfpf64 F +GLIBC_2.36 ufromfpf64x F +GLIBC_2.36 ufromfpl F +GLIBC_2.36 ufromfpx F +GLIBC_2.36 ufromfpxf F +GLIBC_2.36 ufromfpxf128 F +GLIBC_2.36 ufromfpxf32 F +GLIBC_2.36 ufromfpxf32x F +GLIBC_2.36 ufromfpxf64 F +GLIBC_2.36 ufromfpxf64x F +GLIBC_2.36 ufromfpxl F +GLIBC_2.36 y0 F +GLIBC_2.36 y0f F +GLIBC_2.36 y0f128 F +GLIBC_2.36 y0f32 F +GLIBC_2.36 y0f32x F +GLIBC_2.36 y0f64 F +GLIBC_2.36 y0f64x F +GLIBC_2.36 y0l F +GLIBC_2.36 y1 F +GLIBC_2.36 y1f F +GLIBC_2.36 y1f128 F +GLIBC_2.36 y1f32 F +GLIBC_2.36 y1f32x F +GLIBC_2.36 y1f64 F +GLIBC_2.36 y1f64x F +GLIBC_2.36 y1l F +GLIBC_2.36 yn F +GLIBC_2.36 ynf F +GLIBC_2.36 ynf128 F +GLIBC_2.36 ynf32 F +GLIBC_2.36 ynf32x F +GLIBC_2.36 ynf64 F +GLIBC_2.36 ynf64x F +GLIBC_2.36 ynl F diff --git a/sysdeps/unix/sysv/linux/loongarch/lp64/libpthread.abilist b/sysdeps/unix/sysv/linux/loongarch/lp64/libpthread.abilist new file mode 100644 index 0000000000..e69de29bb2 diff --git a/sysdeps/unix/sysv/linux/loongarch/lp64/libresolv.abilist b/sysdeps/unix/sysv/linux/loongarch/lp64/libresolv.abilist new file mode 100644 index 0000000000..c30f54c0bf --- /dev/null +++ b/sysdeps/unix/sysv/linux/loongarch/lp64/libresolv.abilist @@ -0,0 +1,55 @@ +GLIBC_2.36 __b64_ntop F +GLIBC_2.36 __b64_pton F +GLIBC_2.36 __dn_count_labels F +GLIBC_2.36 __fp_nquery F +GLIBC_2.36 __fp_query F +GLIBC_2.36 __fp_resstat F +GLIBC_2.36 __hostalias F +GLIBC_2.36 __loc_aton F +GLIBC_2.36 __loc_ntoa F +GLIBC_2.36 __p_cdname F +GLIBC_2.36 __p_cdnname F +GLIBC_2.36 __p_class F +GLIBC_2.36 __p_class_syms D 0xa8 +GLIBC_2.36 __p_fqname F +GLIBC_2.36 __p_fqnname F +GLIBC_2.36 __p_option F +GLIBC_2.36 __p_query F +GLIBC_2.36 __p_rcode F +GLIBC_2.36 __p_time F +GLIBC_2.36 __p_type F +GLIBC_2.36 __p_type_syms D 0x450 +GLIBC_2.36 __putlong F +GLIBC_2.36 __putshort F +GLIBC_2.36 __res_close F +GLIBC_2.36 __res_hostalias F +GLIBC_2.36 __res_isourserver F +GLIBC_2.36 __res_nameinquery F +GLIBC_2.36 __res_queriesmatch F +GLIBC_2.36 __sym_ntop F +GLIBC_2.36 __sym_ntos F +GLIBC_2.36 __sym_ston F +GLIBC_2.36 _getlong F +GLIBC_2.36 _getshort F +GLIBC_2.36 inet_net_ntop F +GLIBC_2.36 inet_net_pton F +GLIBC_2.36 inet_neta F +GLIBC_2.36 ns_datetosecs F +GLIBC_2.36 ns_format_ttl F +GLIBC_2.36 ns_get16 F +GLIBC_2.36 ns_get32 F +GLIBC_2.36 ns_initparse F +GLIBC_2.36 ns_makecanon F +GLIBC_2.36 ns_msg_getflag F +GLIBC_2.36 ns_name_ntol F +GLIBC_2.36 ns_name_rollback F +GLIBC_2.36 ns_parse_ttl F +GLIBC_2.36 ns_parserr F +GLIBC_2.36 ns_put16 F +GLIBC_2.36 ns_put32 F +GLIBC_2.36 ns_samedomain F +GLIBC_2.36 ns_samename F +GLIBC_2.36 ns_skiprr F +GLIBC_2.36 ns_sprintrr F +GLIBC_2.36 ns_sprintrrf F +GLIBC_2.36 ns_subdomain F diff --git a/sysdeps/unix/sysv/linux/loongarch/lp64/librt.abilist b/sysdeps/unix/sysv/linux/loongarch/lp64/librt.abilist new file mode 100644 index 0000000000..e69de29bb2 diff --git a/sysdeps/unix/sysv/linux/loongarch/lp64/libthread_db.abilist b/sysdeps/unix/sysv/linux/loongarch/lp64/libthread_db.abilist new file mode 100644 index 0000000000..8658803d38 --- /dev/null +++ b/sysdeps/unix/sysv/linux/loongarch/lp64/libthread_db.abilist @@ -0,0 +1,40 @@ +GLIBC_2.36 td_init F +GLIBC_2.36 td_log F +GLIBC_2.36 td_symbol_list F +GLIBC_2.36 td_ta_clear_event F +GLIBC_2.36 td_ta_delete F +GLIBC_2.36 td_ta_enable_stats F +GLIBC_2.36 td_ta_event_addr F +GLIBC_2.36 td_ta_event_getmsg F +GLIBC_2.36 td_ta_get_nthreads F +GLIBC_2.36 td_ta_get_ph F +GLIBC_2.36 td_ta_get_stats F +GLIBC_2.36 td_ta_map_id2thr F +GLIBC_2.36 td_ta_map_lwp2thr F +GLIBC_2.36 td_ta_new F +GLIBC_2.36 td_ta_reset_stats F +GLIBC_2.36 td_ta_set_event F +GLIBC_2.36 td_ta_setconcurrency F +GLIBC_2.36 td_ta_thr_iter F +GLIBC_2.36 td_ta_tsd_iter F +GLIBC_2.36 td_thr_clear_event F +GLIBC_2.36 td_thr_dbresume F +GLIBC_2.36 td_thr_dbsuspend F +GLIBC_2.36 td_thr_event_enable F +GLIBC_2.36 td_thr_event_getmsg F +GLIBC_2.36 td_thr_get_info F +GLIBC_2.36 td_thr_getfpregs F +GLIBC_2.36 td_thr_getgregs F +GLIBC_2.36 td_thr_getxregs F +GLIBC_2.36 td_thr_getxregsize F +GLIBC_2.36 td_thr_set_event F +GLIBC_2.36 td_thr_setfpregs F +GLIBC_2.36 td_thr_setgregs F +GLIBC_2.36 td_thr_setprio F +GLIBC_2.36 td_thr_setsigpending F +GLIBC_2.36 td_thr_setxregs F +GLIBC_2.36 td_thr_sigsetmask F +GLIBC_2.36 td_thr_tls_get_addr F +GLIBC_2.36 td_thr_tlsbase F +GLIBC_2.36 td_thr_tsd F +GLIBC_2.36 td_thr_validate F From patchwork Tue Jul 19 01:22:07 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: caiyinyu X-Patchwork-Id: 56151 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id A6016384D190 for ; Tue, 19 Jul 2022 01:23:22 +0000 (GMT) X-Original-To: libc-alpha@sourceware.org Delivered-To: libc-alpha@sourceware.org Received: from loongson.cn (mail.loongson.cn [114.242.206.163]) by sourceware.org (Postfix) with ESMTP id 0733C3850221 for ; Tue, 19 Jul 2022 01:22:19 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 0733C3850221 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=loongson.cn Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=loongson.cn Received: from 5.5.5 (unknown [10.2.5.5]) by mail.loongson.cn (Coremail) with SMTP id AQAAf9Axn+JEB9ZixJcnAA--.10106S3; Tue, 19 Jul 2022 09:22:14 +0800 (CST) From: caiyinyu To: adhemerval.zanella@linaro.org, libc-alpha@sourceware.org, joseph_myers@mentor.com, carlos@redhat.com, i.swmail@xen0n.name Subject: [PATCH v7 10/13] LoongArch: Build Infastructure Date: Tue, 19 Jul 2022 09:22:07 +0800 Message-Id: <20220719012210.1464764-2-caiyinyu@loongson.cn> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220719012210.1464764-1-caiyinyu@loongson.cn> References: <20220719012210.1464764-1-caiyinyu@loongson.cn> MIME-Version: 1.0 X-CM-TRANSID: AQAAf9Axn+JEB9ZixJcnAA--.10106S3 X-Coremail-Antispam: 1UD129KBjvAXoW3Cw15JrWrCFWfAFyfKrWfXwb_yoW8AFyUWo WfCFW2qw48CrsF9rsaganxWrW2gr1UAF4UJay3ZayrGF1fAF1UGFyIkayY9ryayr98WF4r Ga4q9rsrtrW2yrnxn29KB7ZKAUJUUUUU529EdanIXcx71UUUUU7v73VFW2AGmfu7bjvjm3 AaLaJ3UjIYCTnIWjp_UUUYK7AC8VAFwI0_Gr0_Xr1l1xkIjI8I6I8E6xAIw20EY4v20xva j40_Wr0E3s1l1IIY67AEw4v_Jr0_Jr4l82xGYIkIc2x26280x7IE14v26r18M28IrcIa0x kI8VCY1x0267AKxVWUCVW8JwA2ocxC64kIII0Yj41l84x0c7CEw4AK67xGY2AK021l84AC jcxK6xIIjxv20xvE14v26F1j6w1UM28EF7xvwVC0I7IYx2IY6xkF7I0E14v26r4UJVWxJr 1l84ACjcxK6I8E87Iv67AKxVW8Jr0_Cr1UM28EF7xvwVC2z280aVCY1x0267AKxVW8Jr0_ Cr1UM2AIxVAIcxkEcVAq07x20xvEncxIr21l5I8CrVACY4xI64kE6c02F40Ex7xfMcIj6x IIjxv20xvE14v26r106r15McIj6I8E87Iv67AKxVWUJVW8JwAm72CE4IkC6x0Yz7v_Jr0_ Gr1lF7xvr2IYc2Ij64vIr41lF7I21c0EjII2zVCS5cI20VAGYxC7MxkIecxEwVCm-wCF04 k20xvY0x0EwIxGrwCFx2IqxVCFs4IE7xkEbVWUJVW8JwC20s026c02F40E14v26r1j6r18 MI8I3I0E7480Y4vE14v26r106r1rMI8E67AF67kF1VAFwI0_JF0_Jw1lIxkGc2Ij64vIr4 1lIxAIcVC0I7IYx2IY67AKxVW8JVW5JwCI42IY6xIIjxv20xvEc7CjxVAFwI0_Cr0_Gr1U MIIF0xvE42xK8VAvwI8IcIk0rVWUJVWUCwCI42IY6I8E87Iv67AKxVW8JVWxJwCI42IY6I 8E87Iv6xkF7I0E14v26r4j6r4UJbIYCTnIWIevJa73UjIFyTuYvjfUo-eoUUUUU X-CM-SenderInfo: 5fdl5xhq1xqz5rrqw2lrqou0/ X-Spam-Status: No, score=-13.5 required=5.0 tests=BAYES_00, GIT_PATCH_0, KAM_DMARC_STATUS, KAM_SHORT, SPF_HELO_PASS, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: libc-alpha@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Libc-alpha mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: caiyinyu Errors-To: libc-alpha-bounces+patchwork=sourceware.org@sourceware.org Sender: "Libc-alpha" --- sysdeps/loongarch/Implies | 3 + sysdeps/loongarch/Makefile | 15 ++ sysdeps/loongarch/configure | 5 + sysdeps/loongarch/configure.ac | 6 + sysdeps/loongarch/lp64/Implies-after | 1 + sysdeps/loongarch/preconfigure | 53 ++++++ sysdeps/loongarch/preconfigure.ac | 47 +++++ sysdeps/loongarch/sys/regdef.h | 93 ++++++++++ sysdeps/unix/sysv/linux/loongarch/Implies | 1 + sysdeps/unix/sysv/linux/loongarch/Makefile | 4 + sysdeps/unix/sysv/linux/loongarch/configure | 174 ++++++++++++++++++ .../unix/sysv/linux/loongarch/configure.ac | 22 +++ .../unix/sysv/linux/loongarch/ldd-rewrite.sed | 1 + .../unix/sysv/linux/loongarch/lp64/Implies | 3 + .../unix/sysv/linux/loongarch/shlib-versions | 7 + 15 files changed, 435 insertions(+) create mode 100644 sysdeps/loongarch/Implies create mode 100644 sysdeps/loongarch/Makefile create mode 100644 sysdeps/loongarch/configure create mode 100644 sysdeps/loongarch/configure.ac create mode 100644 sysdeps/loongarch/lp64/Implies-after create mode 100644 sysdeps/loongarch/preconfigure create mode 100644 sysdeps/loongarch/preconfigure.ac create mode 100644 sysdeps/loongarch/sys/regdef.h create mode 100644 sysdeps/unix/sysv/linux/loongarch/Implies create mode 100644 sysdeps/unix/sysv/linux/loongarch/Makefile create mode 100644 sysdeps/unix/sysv/linux/loongarch/configure create mode 100644 sysdeps/unix/sysv/linux/loongarch/configure.ac create mode 100644 sysdeps/unix/sysv/linux/loongarch/ldd-rewrite.sed create mode 100644 sysdeps/unix/sysv/linux/loongarch/lp64/Implies create mode 100644 sysdeps/unix/sysv/linux/loongarch/shlib-versions Reviewed-by: Adhemerval Zanella diff --git a/sysdeps/loongarch/Implies b/sysdeps/loongarch/Implies new file mode 100644 index 0000000000..1945b1f4bb --- /dev/null +++ b/sysdeps/loongarch/Implies @@ -0,0 +1,3 @@ +ieee754/ldbl-128 +ieee754/dbl-64 +ieee754/flt-32 diff --git a/sysdeps/loongarch/Makefile b/sysdeps/loongarch/Makefile new file mode 100644 index 0000000000..41c3449670 --- /dev/null +++ b/sysdeps/loongarch/Makefile @@ -0,0 +1,15 @@ +ifeq ($(subdir),misc) +sysdep_headers += sys/asm.h +endif + +# LoongArch's assembler also needs to know about PIC as it changes the +# definition of some assembler macros. +ASFLAGS-.os += $(pic-ccflag) + +abi-variants := lp64 + +ifeq (,$(filter $(default-abi),$(abi-variants))) +$(error Unknown ABI $(default-abi), must be one of $(abi-variants)) +endif + +abi-lp64-condition := defined __loongarch_lp64 diff --git a/sysdeps/loongarch/configure b/sysdeps/loongarch/configure new file mode 100644 index 0000000000..43b54d4965 --- /dev/null +++ b/sysdeps/loongarch/configure @@ -0,0 +1,5 @@ +# This file is generated from configure.ac by Autoconf. DO NOT EDIT! + # Local configure fragment for sysdeps/loongarch/elf. + +$as_echo "#define HIDDEN_VAR_NEEDS_DYNAMIC_RELOC 1" >>confdefs.h + diff --git a/sysdeps/loongarch/configure.ac b/sysdeps/loongarch/configure.ac new file mode 100644 index 0000000000..f744367bf3 --- /dev/null +++ b/sysdeps/loongarch/configure.ac @@ -0,0 +1,6 @@ +GLIBC_PROVIDES dnl See aclocal.m4 in the top level source directory. +# Local configure fragment for sysdeps/loongarch/elf. + +dnl It is always possible to access static and hidden symbols in an +dnl position independent way. +AC_DEFINE(HIDDEN_VAR_NEEDS_DYNAMIC_RELOC) diff --git a/sysdeps/loongarch/lp64/Implies-after b/sysdeps/loongarch/lp64/Implies-after new file mode 100644 index 0000000000..a8cae95f9d --- /dev/null +++ b/sysdeps/loongarch/lp64/Implies-after @@ -0,0 +1 @@ +wordsize-64 diff --git a/sysdeps/loongarch/preconfigure b/sysdeps/loongarch/preconfigure new file mode 100644 index 0000000000..118963cda6 --- /dev/null +++ b/sysdeps/loongarch/preconfigure @@ -0,0 +1,53 @@ +# 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/preconfigure.ac b/sysdeps/loongarch/preconfigure.ac new file mode 100644 index 0000000000..1aba743c15 --- /dev/null +++ b/sysdeps/loongarch/preconfigure.ac @@ -0,0 +1,47 @@ +GLIBC_PROVIDES[]dnl See aclocal.m4 in the top level source directory. +# 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 + AC_MSG_ERROR([loongarch does not yet support soft floating-point ABI!!], 1) + ;; + single) + AC_MSG_ERROR([glibc does not yet support the single floating-point ABI!!], 1) + ;; + double) + abi_flen=64 + ;; + *) + AC_MSG_ERROR([Unable to determine floating-point ABI!!], 1) + ;; + esac + + case "$abi" in + ilp32) + AC_MSG_ERROR([loongarch does not yet support ilp32 ABI!!], 1) + ;; + lp64) + grlen=64 + machine=loongarch/lp64 + ;; + *) + AC_MSG_ERROR([Unable to determine GRLEN!!], 1) + ;; + esac + + AC_DEFINE_UNQUOTED([LOONGARCH_ABI_GRLEN], [$grlen]) + AC_DEFINE_UNQUOTED([LOONGARCH_ABI_FRLEN], [$abi_flen]) + + base_machine=loongarch + ;; +esac + diff --git a/sysdeps/loongarch/sys/regdef.h b/sysdeps/loongarch/sys/regdef.h new file mode 100644 index 0000000000..d266df372d --- /dev/null +++ b/sysdeps/loongarch/sys/regdef.h @@ -0,0 +1,93 @@ +/* Register Macro definitions + Copyright (C) 2022 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library. If not, see + . */ + +#ifndef _SYS_REGDEF_H +#define _SYS_REGDEF_H + +#define zero $r0 +#define ra $r1 +#define tp $r2 +#define sp $r3 +#define a0 $r4 +#define a1 $r5 +#define a2 $r6 +#define a3 $r7 +#define a4 $r8 +#define a5 $r9 +#define a6 $r10 +#define a7 $r11 +#define v0 $r4 +#define v1 $r5 +#define t0 $r12 +#define t1 $r13 +#define t2 $r14 +#define t3 $r15 +#define t4 $r16 +#define t5 $r17 +#define t6 $r18 +#define t7 $r19 +#define t8 $r20 +#define x $r21 +#define fp $r22 +#define s0 $r23 +#define s1 $r24 +#define s2 $r25 +#define s3 $r26 +#define s4 $r27 +#define s5 $r28 +#define s6 $r29 +#define s7 $r30 +#define s8 $r31 + +#define fa0 $f0 +#define fa1 $f1 +#define fa2 $f2 +#define fa3 $f3 +#define fa4 $f4 +#define fa5 $f5 +#define fa6 $f6 +#define fa7 $f7 +#define fv0 $f0 +#define fv1 $f1 +#define ft0 $f8 +#define ft1 $f9 +#define ft2 $f10 +#define ft3 $f11 +#define ft4 $f12 +#define ft5 $f13 +#define ft6 $f14 +#define ft7 $f15 +#define ft8 $f16 +#define ft9 $f17 +#define ft10 $f18 +#define ft11 $f19 +#define ft12 $f20 +#define ft13 $f21 +#define ft14 $f22 +#define ft15 $f23 +#define fs0 $f24 +#define fs1 $f25 +#define fs2 $f26 +#define fs3 $f27 +#define fs4 $f28 +#define fs5 $f29 +#define fs6 $f30 +#define fs7 $f31 + +#endif /* _SYS_REGDEF_H */ diff --git a/sysdeps/unix/sysv/linux/loongarch/Implies b/sysdeps/unix/sysv/linux/loongarch/Implies new file mode 100644 index 0000000000..e52b1ac310 --- /dev/null +++ b/sysdeps/unix/sysv/linux/loongarch/Implies @@ -0,0 +1 @@ +loongarch/nptl diff --git a/sysdeps/unix/sysv/linux/loongarch/Makefile b/sysdeps/unix/sysv/linux/loongarch/Makefile new file mode 100644 index 0000000000..730bfa7465 --- /dev/null +++ b/sysdeps/unix/sysv/linux/loongarch/Makefile @@ -0,0 +1,4 @@ +ifeq ($(subdir),stdlib) +gen-as-const-headers += ucontext_i.sym +endif + diff --git a/sysdeps/unix/sysv/linux/loongarch/configure b/sysdeps/unix/sysv/linux/loongarch/configure new file mode 100644 index 0000000000..60a410303e --- /dev/null +++ b/sysdeps/unix/sysv/linux/loongarch/configure @@ -0,0 +1,174 @@ +# This file is generated from configure.ac by Autoconf. DO NOT EDIT! + # Local configure fragment for sysdeps/unix/sysv/linux/loongarch. + +arch_minimum_kernel=5.19.0 + +libc_cv_loongarch_int_abi=no + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 +$as_echo_n "checking for grep that handles long lines and -e... " >&6; } +if ${ac_cv_path_GREP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$GREP"; then + ac_path_GREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in grep ggrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_GREP" || continue +# Check for GNU ac_path_GREP and select it if it is found. + # Check for GNU $ac_path_GREP +case `"$ac_path_GREP" --version 2>&1` in +*GNU*) + ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo 'GREP' >> "conftest.nl" + "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_GREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_GREP="$ac_path_GREP" + ac_path_GREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_GREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_GREP"; then + as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_GREP=$GREP +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 +$as_echo "$ac_cv_path_GREP" >&6; } + GREP="$ac_cv_path_GREP" + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 +$as_echo_n "checking for egrep... " >&6; } +if ${ac_cv_path_EGREP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 + then ac_cv_path_EGREP="$GREP -E" + else + if test -z "$EGREP"; then + ac_path_EGREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in egrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_EGREP" || continue +# Check for GNU ac_path_EGREP and select it if it is found. + # Check for GNU $ac_path_EGREP +case `"$ac_path_EGREP" --version 2>&1` in +*GNU*) + ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo 'EGREP' >> "conftest.nl" + "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_EGREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_EGREP="$ac_path_EGREP" + ac_path_EGREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_EGREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_EGREP"; then + as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_EGREP=$EGREP +fi + + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 +$as_echo "$ac_cv_path_EGREP" >&6; } + EGREP="$ac_cv_path_EGREP" + + +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +__SIZEOF_INT__ __SIZEOF_LONG__ __SIZEOF_POINTER__ + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "4 8 8" >/dev/null 2>&1; then : + libc_cv_loongarch_int_abi=lp64 +fi +rm -f conftest* + +if test $libc_cv_loongarch_int_abi = no; then + as_fn_error $? "Unable to determine integer ABI" "$LINENO" 5 +fi + +config_vars="$config_vars +default-abi = $libc_cv_loongarch_int_abi" + +case $libc_cv_loongarch_int_abi in +lp64) + test -n "$libc_cv_slibdir" || +case "$prefix" in +/usr | /usr/) + libc_cv_slibdir='/lib64' + libc_cv_rtlddir='/lib64' + if test "$libdir" = '${exec_prefix}/lib'; then + libdir='${exec_prefix}/lib64'; + # Locale data can be shared between 32-bit and 64-bit libraries. + libc_cv_complocaledir='${exec_prefix}/lib/locale' + fi + ;; +esac + ;; +esac + +ldd_rewrite_script=sysdeps/unix/sysv/linux/loongarch/ldd-rewrite.sed diff --git a/sysdeps/unix/sysv/linux/loongarch/configure.ac b/sysdeps/unix/sysv/linux/loongarch/configure.ac new file mode 100644 index 0000000000..7de1e95ff6 --- /dev/null +++ b/sysdeps/unix/sysv/linux/loongarch/configure.ac @@ -0,0 +1,22 @@ +sinclude(./aclocal.m4)dnl Autoconf lossage +GLIBC_PROVIDES dnl See aclocal.m4 in the top level source directory. +# Local configure fragment for sysdeps/unix/sysv/linux/loongarch. + +arch_minimum_kernel=5.19.0 + +libc_cv_loongarch_int_abi=no +AC_EGREP_CPP(4 8 8, [__SIZEOF_INT__ __SIZEOF_LONG__ __SIZEOF_POINTER__ + ], libc_cv_loongarch_int_abi=lp64) +if test $libc_cv_loongarch_int_abi = no; then + AC_MSG_ERROR([Unable to determine integer ABI]) +fi + +LIBC_CONFIG_VAR([default-abi], [$libc_cv_loongarch_int_abi]) + +case $libc_cv_loongarch_int_abi in +lp64) + LIBC_SLIBDIR_RTLDDIR([lib64], [lib64]) + ;; +esac + +ldd_rewrite_script=sysdeps/unix/sysv/linux/loongarch/ldd-rewrite.sed diff --git a/sysdeps/unix/sysv/linux/loongarch/ldd-rewrite.sed b/sysdeps/unix/sysv/linux/loongarch/ldd-rewrite.sed new file mode 100644 index 0000000000..f8976fd239 --- /dev/null +++ b/sysdeps/unix/sysv/linux/loongarch/ldd-rewrite.sed @@ -0,0 +1 @@ +s_^\(RTLDLIST=\)\(.*lib\)\(\|64\|32\)\(/[^/]*\)\(-loongarch\)\(64\|32\)\(\.so\.[0-9.]*\)[[:blank:]]*$_\1"\2\4\7 \264\4-loongarch64\7 \232\4-loongarch32\7"_ diff --git a/sysdeps/unix/sysv/linux/loongarch/lp64/Implies b/sysdeps/unix/sysv/linux/loongarch/lp64/Implies new file mode 100644 index 0000000000..117c2b8efe --- /dev/null +++ b/sysdeps/unix/sysv/linux/loongarch/lp64/Implies @@ -0,0 +1,3 @@ +unix/sysv/linux/loongarch +unix/sysv/linux/generic +unix/sysv/linux/wordsize-64 diff --git a/sysdeps/unix/sysv/linux/loongarch/shlib-versions b/sysdeps/unix/sysv/linux/loongarch/shlib-versions new file mode 100644 index 0000000000..dc2220b4be --- /dev/null +++ b/sysdeps/unix/sysv/linux/loongarch/shlib-versions @@ -0,0 +1,7 @@ +DEFAULT GLIBC_2.36 + +%if LOONGARCH_ABI_GRLEN == 64 && LOONGARCH_ABI_FRLEN == 64 +ld=ld-linux-loongarch-lp64d.so.1 +%else +%error cannot determine ABI +%endif From patchwork Tue Jul 19 01:22:08 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: caiyinyu X-Patchwork-Id: 56150 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id C1E27388881D for ; Tue, 19 Jul 2022 01:23:05 +0000 (GMT) X-Original-To: libc-alpha@sourceware.org Delivered-To: libc-alpha@sourceware.org Received: from loongson.cn (mail.loongson.cn [114.242.206.163]) by sourceware.org (Postfix) with ESMTP id D352E38768A6 for ; Tue, 19 Jul 2022 01:22:20 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org D352E38768A6 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=loongson.cn Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=loongson.cn Received: from 5.5.5 (unknown [10.2.5.5]) by mail.loongson.cn (Coremail) with SMTP id AQAAf9Axn+JEB9ZixJcnAA--.10106S4; Tue, 19 Jul 2022 09:22:16 +0800 (CST) From: caiyinyu To: adhemerval.zanella@linaro.org, libc-alpha@sourceware.org, joseph_myers@mentor.com, carlos@redhat.com, i.swmail@xen0n.name Subject: [PATCH v7 11/13] LoongArch: Hard Float Support Date: Tue, 19 Jul 2022 09:22:08 +0800 Message-Id: <20220719012210.1464764-3-caiyinyu@loongson.cn> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220719012210.1464764-1-caiyinyu@loongson.cn> References: <20220719012210.1464764-1-caiyinyu@loongson.cn> MIME-Version: 1.0 X-CM-TRANSID: AQAAf9Axn+JEB9ZixJcnAA--.10106S4 X-Coremail-Antispam: 1UD129KBjvAXoWDCr48WFyfArW8CFWruFWUXFb_yoW7tr4xWo WFvFyUAw1Ikwnrtrs5KFZ3Xry7Ca4rXrZFqrZxZa1fJ34Dtw1j9ayqka1rJws8Jr15CFy5 Was2qw1DZa1xKF1fn29KB7ZKAUJUUUUU529EdanIXcx71UUUUU7v73VFW2AGmfu7bjvjm3 AaLaJ3UjIYCTnIWjp_UUUYK7AC8VAFwI0_Xr0_Wr1l1xkIjI8I6I8E6xAIw20EY4v20xva j40_Wr0E3s1l1IIY67AEw4v_Jr0_Jr4l82xGYIkIc2x26280x7IE14v26r15M28IrcIa0x kI8VCY1x0267AKxVW8JVW5JwA2ocxC64kIII0Yj41l84x0c7CEw4AK67xGY2AK021l84AC jcxK6xIIjxv20xvE14v26F1j6w1UM28EF7xvwVC0I7IYx2IY6xkF7I0E14v26r4UJVWxJr 1l84ACjcxK6I8E87Iv67AKxVW8Jr0_Cr1UM28EF7xvwVC2z280aVCY1x0267AKxVW8Jr0_ Cr1UM2AIxVAIcxkEcVAq07x20xvEncxIr21l5I8CrVACY4xI64kE6c02F40Ex7xfMcIj6x IIjxv20xvE14v26r106r15McIj6I8E87Iv67AKxVWUJVW8JwAm72CE4IkC6x0Yz7v_Jr0_ Gr1lF7xvr2IYc2Ij64vIr41lF7I21c0EjII2zVCS5cI20VAGYxC7MxkIecxEwVCm-wCF04 k20xvY0x0EwIxGrwCFx2IqxVCFs4IE7xkEbVWUJVW8JwC20s026c02F40E14v26r1j6r18 MI8I3I0E7480Y4vE14v26r106r1rMI8E67AF67kF1VAFwI0_JF0_Jw1lIxkGc2Ij64vIr4 1lIxAIcVC0I7IYx2IY67AKxVW8JVW5JwCI42IY6xIIjxv20xvEc7CjxVAFwI0_Cr0_Gr1U MIIF0xvE42xK8VAvwI8IcIk0rVWUJVWUCwCI42IY6I8E87Iv67AKxVW8JVWxJwCI42IY6I 8E87Iv6xkF7I0E14v26r4j6r4UJbIYCTnIWIevJa73UjIFyTuYvjfUndb1UUUUU X-CM-SenderInfo: 5fdl5xhq1xqz5rrqw2lrqou0/ X-Spam-Status: No, score=-13.5 required=5.0 tests=BAYES_00, GIT_PATCH_0, KAM_DMARC_STATUS, KAM_SHORT, SPF_HELO_PASS, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: libc-alpha@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Libc-alpha mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: caiyinyu Errors-To: libc-alpha-bounces+patchwork=sourceware.org@sourceware.org Sender: "Libc-alpha" --- 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 | 80 + sysdeps/loongarch/fpu/fsetexcptflg.c | 41 + sysdeps/loongarch/fpu/ftestexcept.c | 32 + .../loongarch/fpu/math-use-builtins-sqrt.h | 4 + sysdeps/loongarch/lp64/libm-test-ulps | 1412 +++++++++++++++++ sysdeps/loongarch/lp64/libm-test-ulps-name | 1 + sysdeps/loongarch/math_private.h | 248 +++ 22 files changed, 2372 insertions(+) create mode 100644 sysdeps/loongarch/fpu/fclrexcpt.c create mode 100644 sysdeps/loongarch/fpu/fedisblxcpt.c create mode 100644 sysdeps/loongarch/fpu/feenablxcpt.c create mode 100644 sysdeps/loongarch/fpu/fegetenv.c create mode 100644 sysdeps/loongarch/fpu/fegetexcept.c create mode 100644 sysdeps/loongarch/fpu/fegetmode.c create mode 100644 sysdeps/loongarch/fpu/fegetround.c create mode 100644 sysdeps/loongarch/fpu/feholdexcpt.c create mode 100644 sysdeps/loongarch/fpu/fenv_libc.h create mode 100644 sysdeps/loongarch/fpu/fesetenv.c create mode 100644 sysdeps/loongarch/fpu/fesetexcept.c create mode 100644 sysdeps/loongarch/fpu/fesetmode.c create mode 100644 sysdeps/loongarch/fpu/fesetround.c create mode 100644 sysdeps/loongarch/fpu/feupdateenv.c create mode 100644 sysdeps/loongarch/fpu/fgetexcptflg.c create mode 100644 sysdeps/loongarch/fpu/fraiseexcpt.c create mode 100644 sysdeps/loongarch/fpu/fsetexcptflg.c create mode 100644 sysdeps/loongarch/fpu/ftestexcept.c create mode 100644 sysdeps/loongarch/fpu/math-use-builtins-sqrt.h create mode 100644 sysdeps/loongarch/lp64/libm-test-ulps create mode 100644 sysdeps/loongarch/lp64/libm-test-ulps-name create mode 100644 sysdeps/loongarch/math_private.h Reviewed-by: Adhemerval Zanella diff --git a/sysdeps/loongarch/fpu/fclrexcpt.c b/sysdeps/loongarch/fpu/fclrexcpt.c new file mode 100644 index 0000000000..e9f33a1658 --- /dev/null +++ b/sysdeps/loongarch/fpu/fclrexcpt.c @@ -0,0 +1,46 @@ +/* Clear given exceptions in current floating-point environment. + Copyright (C) 2022 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library. If not, see + . */ + +#include +#include +#include + +int +feclearexcept (int excepts) +{ + int cw; + + /* Mask out unsupported bits/exceptions. */ + excepts &= FE_ALL_EXCEPT; + + /* Read the complete control word. */ + _FPU_GETCW (cw); + + /* Clear exception flag bits and cause bits. If the cause bit is not + cleared, the next CTC instruction (just below) will re-generate the + exception. */ + + cw &= ~(excepts | (excepts << CAUSE_SHIFT)); + + /* Put the new data in effect. */ + _FPU_SETCW (cw); + + /* Success. */ + return 0; +} +libm_hidden_def (feclearexcept) diff --git a/sysdeps/loongarch/fpu/fedisblxcpt.c b/sysdeps/loongarch/fpu/fedisblxcpt.c new file mode 100644 index 0000000000..add62946fd --- /dev/null +++ b/sysdeps/loongarch/fpu/fedisblxcpt.c @@ -0,0 +1,39 @@ +/* Disable floating-point exceptions. + Copyright (C) 2022 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library. If not, see + . */ + +#include +#include +#include + +int +fedisableexcept (int excepts) +{ + unsigned int new_exc, old_exc; + + /* Get the current control word. */ + _FPU_GETCW (new_exc); + + old_exc = (new_exc & ENABLE_MASK) << ENABLE_SHIFT; + + excepts &= FE_ALL_EXCEPT; + + new_exc &= ~(excepts >> ENABLE_SHIFT); + _FPU_SETCW (new_exc); + + return old_exc; +} diff --git a/sysdeps/loongarch/fpu/feenablxcpt.c b/sysdeps/loongarch/fpu/feenablxcpt.c new file mode 100644 index 0000000000..ed809341f6 --- /dev/null +++ b/sysdeps/loongarch/fpu/feenablxcpt.c @@ -0,0 +1,39 @@ +/* Enable floating-point exceptions. + Copyright (C) 2022 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library. If not, see + . */ + +#include +#include +#include + +int +feenableexcept (int excepts) +{ + unsigned int new_exc, old_exc; + + /* Get the current control word. */ + _FPU_GETCW (new_exc); + + old_exc = (new_exc & ENABLE_MASK) << ENABLE_SHIFT; + + excepts &= FE_ALL_EXCEPT; + + new_exc |= excepts >> ENABLE_SHIFT; + _FPU_SETCW (new_exc); + + return old_exc; +} diff --git a/sysdeps/loongarch/fpu/fegetenv.c b/sysdeps/loongarch/fpu/fegetenv.c new file mode 100644 index 0000000000..5a2a3d34dc --- /dev/null +++ b/sysdeps/loongarch/fpu/fegetenv.c @@ -0,0 +1,31 @@ +/* Store current floating-point environment. + Copyright (C) 2022 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library. If not, see + . */ + +#include +#include + +int +__fegetenv (fenv_t *envp) +{ + _FPU_GETCW (*envp); + + /* Success. */ + return 0; +} +libm_hidden_def (__fegetenv) weak_alias (__fegetenv, fegetenv) +libm_hidden_weak (fegetenv) diff --git a/sysdeps/loongarch/fpu/fegetexcept.c b/sysdeps/loongarch/fpu/fegetexcept.c new file mode 100644 index 0000000000..ba1c1466f4 --- /dev/null +++ b/sysdeps/loongarch/fpu/fegetexcept.c @@ -0,0 +1,32 @@ +/* Get enabled floating-point exceptions. + Copyright (C) 2022 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library. If not, see + . */ + +#include +#include +#include + +int +fegetexcept (void) +{ + unsigned int exc; + + /* Get the current control word. */ + _FPU_GETCW (exc); + + return (exc & ENABLE_MASK) << ENABLE_SHIFT; +} diff --git a/sysdeps/loongarch/fpu/fegetmode.c b/sysdeps/loongarch/fpu/fegetmode.c new file mode 100644 index 0000000000..e3517e34f6 --- /dev/null +++ b/sysdeps/loongarch/fpu/fegetmode.c @@ -0,0 +1,27 @@ +/* Store current floating-point control modes. + Copyright (C) 2022 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +#include +#include + +int +fegetmode (femode_t *modep) +{ + _FPU_GETCW (*modep); + return 0; +} diff --git a/sysdeps/loongarch/fpu/fegetround.c b/sysdeps/loongarch/fpu/fegetround.c new file mode 100644 index 0000000000..ff6113eb04 --- /dev/null +++ b/sysdeps/loongarch/fpu/fegetround.c @@ -0,0 +1,33 @@ +/* Return current rounding direction. + Copyright (C) 2022 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library. If not, see + . */ + +#include +#include + +int +__fegetround (void) +{ + int cw; + + /* Get control word. */ + _FPU_GETCW (cw); + + return cw & _FPU_RC_MASK; +} +libm_hidden_def (__fegetround) weak_alias (__fegetround, fegetround) +libm_hidden_weak (fegetround) diff --git a/sysdeps/loongarch/fpu/feholdexcpt.c b/sysdeps/loongarch/fpu/feholdexcpt.c new file mode 100644 index 0000000000..e4f9f6a23b --- /dev/null +++ b/sysdeps/loongarch/fpu/feholdexcpt.c @@ -0,0 +1,40 @@ +/* Store current floating-point environment and clear exceptions. + Copyright (C) 2022 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library. If not, see + . */ + +#include +#include + +int +__feholdexcept (fenv_t *envp) +{ + fpu_control_t cw; + + /* Save the current state. */ + _FPU_GETCW (cw); + envp->__fp_control_register = cw; + + /* Clear all exception enable bits and flags. */ + cw &= ~(_FPU_MASK_V | _FPU_MASK_Z | _FPU_MASK_O | _FPU_MASK_U | _FPU_MASK_I + | FE_ALL_EXCEPT); + _FPU_SETCW (cw); + + return 0; +} + +libm_hidden_def (__feholdexcept) weak_alias (__feholdexcept, feholdexcept) +libm_hidden_weak (feholdexcept) diff --git a/sysdeps/loongarch/fpu/fenv_libc.h b/sysdeps/loongarch/fpu/fenv_libc.h new file mode 100644 index 0000000000..8360ae0377 --- /dev/null +++ b/sysdeps/loongarch/fpu/fenv_libc.h @@ -0,0 +1,30 @@ +/* Internal libc stuff for floating point environment routines. + Copyright (C) 2022 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library. If not, see + . */ + +#ifndef _FENV_LIBC_H +#define _FENV_LIBC_H 1 + +/* Mask for enabling exceptions and for the CAUSE bits. */ +#define ENABLE_MASK 0x0000001FU +#define CAUSE_MASK 0x1F000000U + +/* Shift for FE_* flags to get up to the ENABLE bits and the CAUSE bits. */ +#define ENABLE_SHIFT 16 +#define CAUSE_SHIFT 8 + +#endif /* _FENV_LIBC_H */ diff --git a/sysdeps/loongarch/fpu/fesetenv.c b/sysdeps/loongarch/fpu/fesetenv.c new file mode 100644 index 0000000000..c10bd11ef9 --- /dev/null +++ b/sysdeps/loongarch/fpu/fesetenv.c @@ -0,0 +1,42 @@ +/* Install given floating-point environment. + Copyright (C) 2022 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library. If not, see + . */ + +#include +#include + +int +__fesetenv (const fenv_t *envp) +{ + fpu_control_t cw; + + /* Read first current state to flush fpu pipeline. */ + _FPU_GETCW (cw); + + if (envp == FE_DFL_ENV) + _FPU_SETCW (_FPU_DEFAULT); + else if (envp == FE_NOMASK_ENV) + _FPU_SETCW (_FPU_IEEE); + else + _FPU_SETCW (envp->__fp_control_register); + + /* Success. */ + return 0; +} + +libm_hidden_def (__fesetenv) weak_alias (__fesetenv, fesetenv) +libm_hidden_weak (fesetenv) diff --git a/sysdeps/loongarch/fpu/fesetexcept.c b/sysdeps/loongarch/fpu/fesetexcept.c new file mode 100644 index 0000000000..ad76d52d9e --- /dev/null +++ b/sysdeps/loongarch/fpu/fesetexcept.c @@ -0,0 +1,32 @@ +/* Set given exception flags. + Copyright (C) 2022 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +#include +#include + +int +fesetexcept (int excepts) +{ + fpu_control_t temp; + + _FPU_GETCW (temp); + temp |= excepts & FE_ALL_EXCEPT; + _FPU_SETCW (temp); + + return 0; +} diff --git a/sysdeps/loongarch/fpu/fesetmode.c b/sysdeps/loongarch/fpu/fesetmode.c new file mode 100644 index 0000000000..fc52fc114b --- /dev/null +++ b/sysdeps/loongarch/fpu/fesetmode.c @@ -0,0 +1,38 @@ +/* Install given floating-point control modes. + Copyright (C) 2022 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +#include +#include + +#define FCSR_STATUS 0x1f1f0000 + +int +fesetmode (const femode_t *modep) +{ + fpu_control_t cw; + + _FPU_GETCW (cw); + cw &= FCSR_STATUS; + if (modep == FE_DFL_MODE) + cw |= _FPU_DEFAULT; + else + cw |= *modep & ~FCSR_STATUS; + _FPU_SETCW (cw); + + return 0; +} diff --git a/sysdeps/loongarch/fpu/fesetround.c b/sysdeps/loongarch/fpu/fesetround.c new file mode 100644 index 0000000000..32acac5f96 --- /dev/null +++ b/sysdeps/loongarch/fpu/fesetround.c @@ -0,0 +1,44 @@ +/* Set current rounding direction. + Copyright (C) 2022 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library. If not, see + . */ + +#include +#include + +int +__fesetround (int round) +{ + fpu_control_t cw; + + if ((round & ~_FPU_RC_MASK) != 0) + /* ROUND is no valid rounding mode. */ + return 1; + + /* Get current state. */ + _FPU_GETCW (cw); + + /* Set rounding bits. */ + cw &= ~_FPU_RC_MASK; + cw |= round; + /* Set new state. */ + _FPU_SETCW (cw); + + return 0; +} + +libm_hidden_def (__fesetround) weak_alias (__fesetround, fesetround) +libm_hidden_weak (fesetround) diff --git a/sysdeps/loongarch/fpu/feupdateenv.c b/sysdeps/loongarch/fpu/feupdateenv.c new file mode 100644 index 0000000000..5ad862a61d --- /dev/null +++ b/sysdeps/loongarch/fpu/feupdateenv.c @@ -0,0 +1,43 @@ +/* Install given floating-point environment and raise exceptions. + Copyright (C) 2022 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library. If not, see + . */ + +#include +#include + +int +__feupdateenv (const fenv_t *envp) +{ + int temp; + + /* Save current exceptions. */ + _FPU_GETCW (temp); + temp &= FE_ALL_EXCEPT; + + /* Install new environment. */ + __fesetenv (envp); + + /* Raise the safed exception. Incidently for us the implementation + defined format of the values in objects of type fexcept_t is the + same as the ones specified using the FE_* constants. */ + __feraiseexcept (temp); + + /* Success. */ + return 0; +} +libm_hidden_def (__feupdateenv) weak_alias (__feupdateenv, feupdateenv) +libm_hidden_weak (feupdateenv) diff --git a/sysdeps/loongarch/fpu/fgetexcptflg.c b/sysdeps/loongarch/fpu/fgetexcptflg.c new file mode 100644 index 0000000000..6130c632c9 --- /dev/null +++ b/sysdeps/loongarch/fpu/fgetexcptflg.c @@ -0,0 +1,38 @@ +/* Store current representation for exceptions. + Copyright (C) 2022 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library. If not, see + . */ + +#include +#include + +int +fegetexceptflag (fexcept_t *flagp, int excepts) +{ + fpu_control_t temp; + + /* Get the current exceptions. */ + _FPU_GETCW (temp); + + /* We only save the relevant bits here. In particular, care has to be + taken with the CAUSE bits, as an inadvertent restore later on could + generate unexpected exceptions. */ + + *flagp = temp & excepts & FE_ALL_EXCEPT; + + /* Success. */ + return 0; +} diff --git a/sysdeps/loongarch/fpu/fraiseexcpt.c b/sysdeps/loongarch/fpu/fraiseexcpt.c new file mode 100644 index 0000000000..c1c612242f --- /dev/null +++ b/sysdeps/loongarch/fpu/fraiseexcpt.c @@ -0,0 +1,80 @@ +/* Raise given exceptions. + Copyright (C) 2022 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library. If not, see + . */ + +#include +#include +#include + +int +__feraiseexcept (int excepts) +{ + const float fp_zero = 0.0f; + const float fp_one = 1.0f; + const float fp_max = FLT_MAX; + const float fp_min = FLT_MIN; + const float fp_1e32 = 1.0e32f; + const float fp_two = 2.0f; + const float fp_three = 3.0f; + + /* Raise exceptions represented by EXPECTS. But we must raise only + one signal at a time. It is important that if the overflow/underflow + exception and the inexact exception are given at the same time, + the overflow/underflow exception follows the inexact exception. */ + + /* First: invalid exception. */ + if (FE_INVALID & excepts) + __asm__ __volatile__("fdiv.s $f0,%0,%0\n\t" + : + : "f"(fp_zero) + : "$f0"); + + /* Next: division by zero. */ + if (FE_DIVBYZERO & excepts) + __asm__ __volatile__("fdiv.s $f0,%0,%1\n\t" + : + : "f"(fp_one), "f"(fp_zero) + : "$f0"); + + /* Next: overflow. */ + if (FE_OVERFLOW & excepts) + /* There's no way to raise overflow without also raising inexact. */ + __asm__ __volatile__("fadd.s $f0,%0,%1\n\t" + : + : "f"(fp_max), "f"(fp_1e32) + : "$f0"); + + /* Next: underflow. */ + if (FE_UNDERFLOW & excepts) + __asm__ __volatile__("fdiv.s $f0,%0,%1\n\t" + : + : "f"(fp_min), "f"(fp_three) + : "$f0"); + + /* Last: inexact. */ + if (FE_INEXACT & excepts) + __asm__ __volatile__("fdiv.s $f0, %0, %1\n\t" + : + : "f"(fp_two), "f"(fp_three) + : "$f0"); + + /* Success. */ + return 0; +} + +libm_hidden_def (__feraiseexcept) weak_alias (__feraiseexcept, feraiseexcept) +libm_hidden_weak (feraiseexcept) diff --git a/sysdeps/loongarch/fpu/fsetexcptflg.c b/sysdeps/loongarch/fpu/fsetexcptflg.c new file mode 100644 index 0000000000..9c135a663d --- /dev/null +++ b/sysdeps/loongarch/fpu/fsetexcptflg.c @@ -0,0 +1,41 @@ +/* Set floating-point environment exception handling. + Copyright (C) 2022 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library. If not, see + . */ + +#include +#include + +int +fesetexceptflag (const fexcept_t *flagp, int excepts) +{ + fpu_control_t temp; + + /* Get the current exceptions. */ + _FPU_GETCW (temp); + + /* Make sure the flags we want restored are legal. */ + excepts &= FE_ALL_EXCEPT; + + /* Now clear the bits called for, and copy them in from flagp. Note that + we ignore all non-flag bits from *flagp, so they don't matter. */ + temp = (temp & ~excepts) | (*flagp & excepts); + + _FPU_SETCW (temp); + + /* Success. */ + return 0; +} diff --git a/sysdeps/loongarch/fpu/ftestexcept.c b/sysdeps/loongarch/fpu/ftestexcept.c new file mode 100644 index 0000000000..b9563b7ae1 --- /dev/null +++ b/sysdeps/loongarch/fpu/ftestexcept.c @@ -0,0 +1,32 @@ +/* Test exception in current environment. + Copyright (C) 2022 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library. If not, see + . */ + +#include +#include + +int +fetestexcept (int excepts) +{ + int cw; + + /* Get current control word. */ + _FPU_GETCW (cw); + + return cw & excepts & FE_ALL_EXCEPT; +} +libm_hidden_def (fetestexcept) diff --git a/sysdeps/loongarch/fpu/math-use-builtins-sqrt.h b/sysdeps/loongarch/fpu/math-use-builtins-sqrt.h new file mode 100644 index 0000000000..e94c915ba6 --- /dev/null +++ b/sysdeps/loongarch/fpu/math-use-builtins-sqrt.h @@ -0,0 +1,4 @@ +#define USE_SQRT_BUILTIN 1 +#define USE_SQRTF_BUILTIN 1 +#define USE_SQRTL_BUILTIN 0 +#define USE_SQRTF128_BUILTIN 0 diff --git a/sysdeps/loongarch/lp64/libm-test-ulps b/sysdeps/loongarch/lp64/libm-test-ulps new file mode 100644 index 0000000000..c711531eec --- /dev/null +++ b/sysdeps/loongarch/lp64/libm-test-ulps @@ -0,0 +1,1412 @@ +# Begin of automatic generation + +# Maximal error of functions: +Function: "acos": +double: 1 +float: 1 +ldouble: 1 + +Function: "acos_downward": +double: 1 +float: 1 +ldouble: 1 + +Function: "acos_towardzero": +double: 1 +float: 1 +ldouble: 1 + +Function: "acos_upward": +double: 1 +float: 1 +ldouble: 1 + +Function: "acosh": +double: 2 +float: 2 +ldouble: 4 + +Function: "acosh_downward": +double: 2 +float: 2 +ldouble: 3 + +Function: "acosh_towardzero": +double: 2 +float: 2 +ldouble: 2 + +Function: "acosh_upward": +double: 2 +float: 2 +ldouble: 3 + +Function: "asin": +double: 1 +float: 1 +ldouble: 1 + +Function: "asin_downward": +double: 1 +float: 1 +ldouble: 2 + +Function: "asin_towardzero": +double: 1 +float: 1 +ldouble: 1 + +Function: "asin_upward": +double: 2 +float: 1 +ldouble: 2 + +Function: "asinh": +double: 2 +float: 2 +ldouble: 4 + +Function: "asinh_downward": +double: 3 +float: 3 +ldouble: 4 + +Function: "asinh_towardzero": +double: 2 +float: 2 +ldouble: 2 + +Function: "asinh_upward": +double: 3 +float: 3 +ldouble: 4 + +Function: "atan": +double: 1 +float: 1 +ldouble: 1 + +Function: "atan2": +float: 2 +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: 2 +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: 7 +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: 2 +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: 7 +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: 7 +ldouble: 7 + +Function: Imaginary part of "casinh_upward": +double: 3 +float: 2 +ldouble: 3 + +Function: Real part of "catan": +double: 1 +float: 1 +ldouble: 1 + +Function: Imaginary part of "catan": +double: 1 +float: 1 +ldouble: 1 + +Function: Real part of "catan_downward": +double: 1 +float: 2 +ldouble: 2 + +Function: Imaginary part of "catan_downward": +double: 2 +float: 2 +ldouble: 2 + +Function: Real part of "catan_towardzero": +double: 1 +float: 2 +ldouble: 2 + +Function: Imaginary part of "catan_towardzero": +double: 2 +float: 2 +ldouble: 2 + +Function: Real part of "catan_upward": +double: 1 +float: 1 +ldouble: 2 + +Function: Imaginary part of "catan_upward": +double: 2 +float: 2 +ldouble: 3 + +Function: Real part of "catanh": +double: 1 +float: 1 +ldouble: 1 + +Function: Imaginary part of "catanh": +double: 1 +float: 1 +ldouble: 1 + +Function: Real part of "catanh_downward": +double: 2 +float: 2 +ldouble: 2 + +Function: Imaginary part of "catanh_downward": +double: 1 +float: 2 +ldouble: 2 + +Function: Real part of "catanh_towardzero": +double: 2 +float: 2 +ldouble: 2 + +Function: Imaginary part of "catanh_towardzero": +double: 1 +float: 2 +ldouble: 2 + +Function: Real part of "catanh_upward": +double: 4 +float: 4 +ldouble: 4 + +Function: Imaginary part of "catanh_upward": +double: 1 +float: 1 +ldouble: 2 + +Function: "cbrt": +double: 4 +float: 1 +ldouble: 1 + +Function: "cbrt_downward": +double: 4 +float: 1 +ldouble: 1 + +Function: "cbrt_towardzero": +double: 3 +float: 1 +ldouble: 1 + +Function: "cbrt_upward": +double: 5 +float: 1 +ldouble: 1 + +Function: Real part of "ccos": +double: 1 +float: 1 +ldouble: 1 + +Function: Imaginary part of "ccos": +double: 1 +float: 1 +ldouble: 1 + +Function: Real part of "ccos_downward": +double: 1 +float: 1 +ldouble: 2 + +Function: Imaginary part of "ccos_downward": +double: 3 +float: 3 +ldouble: 2 + +Function: Real part of "ccos_towardzero": +double: 1 +float: 2 +ldouble: 2 + +Function: Imaginary part of "ccos_towardzero": +double: 3 +float: 3 +ldouble: 2 + +Function: Real part of "ccos_upward": +double: 1 +float: 2 +ldouble: 3 + +Function: Imaginary part of "ccos_upward": +double: 2 +float: 2 +ldouble: 2 + +Function: Real part of "ccosh": +double: 1 +float: 1 +ldouble: 1 + +Function: Imaginary part of "ccosh": +double: 1 +float: 1 +ldouble: 1 + +Function: Real part of "ccosh_downward": +double: 2 +float: 2 +ldouble: 2 + +Function: Imaginary part of "ccosh_downward": +double: 3 +float: 3 +ldouble: 2 + +Function: Real part of "ccosh_towardzero": +double: 2 +float: 3 +ldouble: 2 + +Function: Imaginary part of "ccosh_towardzero": +double: 3 +float: 3 +ldouble: 2 + +Function: Real part of "ccosh_upward": +double: 1 +float: 2 +ldouble: 3 + +Function: Imaginary part of "ccosh_upward": +double: 2 +float: 2 +ldouble: 2 + +Function: Real part of "cexp": +double: 2 +float: 1 +ldouble: 1 + +Function: Imaginary part of "cexp": +double: 1 +float: 2 +ldouble: 1 + +Function: Real part of "cexp_downward": +double: 2 +float: 2 +ldouble: 2 + +Function: Imaginary part of "cexp_downward": +double: 3 +float: 3 +ldouble: 2 + +Function: Real part of "cexp_towardzero": +double: 2 +float: 2 +ldouble: 2 + +Function: Imaginary part of "cexp_towardzero": +double: 3 +float: 3 +ldouble: 2 + +Function: Real part of "cexp_upward": +double: 1 +float: 2 +ldouble: 3 + +Function: Imaginary part of "cexp_upward": +double: 3 +float: 2 +ldouble: 3 + +Function: Real part of "clog": +double: 3 +float: 3 +ldouble: 2 + +Function: Imaginary part of "clog": +double: 1 +float: 1 +ldouble: 1 + +Function: Real part of "clog10": +double: 3 +float: 4 +ldouble: 2 + +Function: Imaginary part of "clog10": +double: 2 +float: 2 +ldouble: 2 + +Function: Real part of "clog10_downward": +double: 5 +float: 5 +ldouble: 3 + +Function: Imaginary part of "clog10_downward": +double: 2 +float: 4 +ldouble: 3 + +Function: Real part of "clog10_towardzero": +double: 5 +float: 6 +ldouble: 4 + +Function: Imaginary part of "clog10_towardzero": +double: 2 +float: 4 +ldouble: 3 + +Function: Real part of "clog10_upward": +double: 6 +float: 5 +ldouble: 4 + +Function: Imaginary part of "clog10_upward": +double: 2 +float: 4 +ldouble: 3 + +Function: Real part of "clog_downward": +double: 4 +float: 3 +ldouble: 3 + +Function: Imaginary part of "clog_downward": +double: 1 +float: 2 +ldouble: 2 + +Function: Real part of "clog_towardzero": +double: 4 +float: 4 +ldouble: 3 + +Function: Imaginary part of "clog_towardzero": +double: 1 +float: 3 +ldouble: 2 + +Function: Real part of "clog_upward": +double: 4 +float: 3 +ldouble: 4 + +Function: Imaginary part of "clog_upward": +double: 1 +float: 2 +ldouble: 2 + +Function: "cos": +double: 1 +float: 1 +ldouble: 2 + +Function: "cos_downward": +double: 1 +float: 1 +ldouble: 3 + +Function: "cos_towardzero": +double: 1 +float: 1 +ldouble: 1 + +Function: "cos_upward": +double: 1 +float: 1 +ldouble: 2 + +Function: "cosh": +double: 2 +float: 2 +ldouble: 2 + +Function: "cosh_downward": +double: 3 +float: 1 +ldouble: 3 + +Function: "cosh_towardzero": +double: 3 +float: 1 +ldouble: 3 + +Function: "cosh_upward": +double: 2 +float: 2 +ldouble: 3 + +Function: Real part of "cpow": +double: 2 +float: 5 +ldouble: 4 + +Function: Imaginary part of "cpow": +float: 2 +ldouble: 1 + +Function: Real part of "cpow_downward": +double: 5 +float: 8 +ldouble: 6 + +Function: Imaginary part of "cpow_downward": +double: 1 +float: 2 +ldouble: 2 + +Function: Real part of "cpow_towardzero": +double: 5 +float: 8 +ldouble: 6 + +Function: Imaginary part of "cpow_towardzero": +double: 1 +float: 2 +ldouble: 2 + +Function: Real part of "cpow_upward": +double: 4 +float: 1 +ldouble: 3 + +Function: Imaginary part of "cpow_upward": +double: 1 +float: 2 +ldouble: 2 + +Function: Real part of "csin": +double: 1 +float: 1 +ldouble: 1 + +Function: Imaginary part of "csin": +ldouble: 1 + +Function: Real part of "csin_downward": +double: 3 +float: 3 +ldouble: 2 + +Function: Imaginary part of "csin_downward": +double: 1 +float: 1 +ldouble: 2 + +Function: Real part of "csin_towardzero": +double: 3 +float: 3 +ldouble: 2 + +Function: Imaginary part of "csin_towardzero": +double: 1 +float: 1 +ldouble: 2 + +Function: Real part of "csin_upward": +double: 2 +float: 2 +ldouble: 2 + +Function: Imaginary part of "csin_upward": +double: 1 +float: 2 +ldouble: 3 + +Function: Real part of "csinh": +float: 1 +ldouble: 1 + +Function: Imaginary part of "csinh": +double: 1 +float: 1 +ldouble: 1 + +Function: Real part of "csinh_downward": +double: 2 +float: 1 +ldouble: 2 + +Function: Imaginary part of "csinh_downward": +double: 3 +float: 3 +ldouble: 2 + +Function: Real part of "csinh_towardzero": +double: 2 +float: 2 +ldouble: 2 + +Function: Imaginary part of "csinh_towardzero": +double: 3 +float: 3 +ldouble: 2 + +Function: Real part of "csinh_upward": +double: 1 +float: 2 +ldouble: 3 + +Function: Imaginary part of "csinh_upward": +double: 2 +float: 2 +ldouble: 2 + +Function: Real part of "csqrt": +double: 2 +float: 2 +ldouble: 2 + +Function: Imaginary part of "csqrt": +double: 2 +float: 2 +ldouble: 2 + +Function: Real part of "csqrt_downward": +double: 5 +float: 4 +ldouble: 4 + +Function: Imaginary part of "csqrt_downward": +double: 4 +float: 3 +ldouble: 3 + +Function: Real part of "csqrt_towardzero": +double: 4 +float: 3 +ldouble: 3 + +Function: Imaginary part of "csqrt_towardzero": +double: 4 +float: 3 +ldouble: 3 + +Function: Real part of "csqrt_upward": +double: 5 +float: 4 +ldouble: 4 + +Function: Imaginary part of "csqrt_upward": +double: 3 +float: 3 +ldouble: 3 + +Function: Real part of "ctan": +double: 2 +float: 1 +ldouble: 3 + +Function: Imaginary part of "ctan": +double: 2 +float: 2 +ldouble: 3 + +Function: Real part of "ctan_downward": +double: 6 +float: 5 +ldouble: 4 + +Function: Imaginary part of "ctan_downward": +double: 2 +float: 2 +ldouble: 5 + +Function: Real part of "ctan_towardzero": +double: 5 +float: 3 +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: 2 +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: 3 +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: 5 +float: 3 +ldouble: 4 + +Function: "erfc_downward": +double: 5 +float: 6 +ldouble: 5 + +Function: "erfc_towardzero": +double: 3 +float: 4 +ldouble: 4 + +Function: "erfc_upward": +double: 5 +float: 6 +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: 4 +float: 7 +ldouble: 5 + +Function: "gamma_downward": +double: 5 +float: 7 +ldouble: 8 + +Function: "gamma_towardzero": +double: 5 +float: 6 +ldouble: 5 + +Function: "gamma_upward": +double: 5 +float: 6 +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: 5 +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: 5 +float: 5 +ldouble: 8 + +Function: "jn_towardzero": +double: 5 +float: 5 +ldouble: 8 + +Function: "jn_upward": +double: 5 +float: 4 +ldouble: 7 + +Function: "lgamma": +double: 4 +float: 7 +ldouble: 5 + +Function: "lgamma_downward": +double: 5 +float: 7 +ldouble: 8 + +Function: "lgamma_towardzero": +double: 5 +float: 6 +ldouble: 5 + +Function: "lgamma_upward": +double: 5 +float: 6 +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: 2 +float: 2 +ldouble: 3 + +Function: "log1p_towardzero": +double: 2 +float: 2 +ldouble: 3 + +Function: "log1p_upward": +double: 2 +float: 2 +ldouble: 2 + +Function: "log2": +double: 1 +float: 1 +ldouble: 3 + +Function: "log2_downward": +double: 3 +ldouble: 3 + +Function: "log2_towardzero": +double: 2 +ldouble: 1 + +Function: "log2_upward": +double: 3 +ldouble: 1 + +Function: "log_downward": +ldouble: 1 + +Function: "log_towardzero": +ldouble: 2 + +Function: "log_upward": +double: 1 +ldouble: 2 + +Function: "pow": +double: 1 +ldouble: 2 + +Function: "pow_downward": +double: 1 +float: 1 +ldouble: 2 + +Function: "pow_towardzero": +double: 1 +float: 1 +ldouble: 2 + +Function: "pow_upward": +double: 1 +float: 1 +ldouble: 2 + +Function: "sin": +double: 1 +float: 1 +ldouble: 2 + +Function: "sin_downward": +double: 1 +float: 1 +ldouble: 3 + +Function: "sin_towardzero": +double: 1 +float: 1 +ldouble: 2 + +Function: "sin_upward": +double: 1 +float: 1 +ldouble: 3 + +Function: "sincos": +double: 1 +ldouble: 1 + +Function: "sincos_downward": +double: 1 +float: 1 +ldouble: 3 + +Function: "sincos_towardzero": +double: 1 +float: 1 +ldouble: 2 + +Function: "sincos_upward": +double: 1 +float: 1 +ldouble: 3 + +Function: "sinh": +double: 2 +float: 2 +ldouble: 2 + +Function: "sinh_downward": +double: 3 +float: 3 +ldouble: 3 + +Function: "sinh_towardzero": +double: 3 +float: 2 +ldouble: 3 + +Function: "sinh_upward": +double: 3 +float: 3 +ldouble: 4 + +Function: "tan": +double: 1 +float: 1 +ldouble: 1 + +Function: "tan_downward": +double: 1 +float: 2 +ldouble: 1 + +Function: "tan_towardzero": +double: 1 +float: 1 +ldouble: 1 + +Function: "tan_upward": +double: 1 +float: 1 +ldouble: 1 + +Function: "tanh": +double: 2 +float: 2 +ldouble: 2 + +Function: "tanh_downward": +double: 3 +float: 3 +ldouble: 4 + +Function: "tanh_towardzero": +double: 2 +float: 2 +ldouble: 3 + +Function: "tanh_upward": +double: 3 +float: 3 +ldouble: 3 + +Function: "tgamma": +double: 9 +float: 8 +ldouble: 4 + +Function: "tgamma_downward": +double: 9 +float: 7 +ldouble: 5 + +Function: "tgamma_towardzero": +double: 9 +float: 7 +ldouble: 5 + +Function: "tgamma_upward": +double: 9 +float: 8 +ldouble: 4 + +Function: "y0": +double: 3 +float: 9 +ldouble: 3 + +Function: "y0_downward": +double: 3 +float: 9 +ldouble: 7 + +Function: "y0_towardzero": +double: 4 +float: 9 +ldouble: 3 + +Function: "y0_upward": +double: 3 +float: 9 +ldouble: 4 + +Function: "y1": +double: 3 +float: 9 +ldouble: 5 + +Function: "y1_downward": +double: 6 +float: 9 +ldouble: 5 + +Function: "y1_towardzero": +double: 3 +float: 9 +ldouble: 2 + +Function: "y1_upward": +double: 7 +float: 9 +ldouble: 5 + +Function: "yn": +double: 3 +float: 3 +ldouble: 5 + +Function: "yn_downward": +double: 3 +float: 4 +ldouble: 5 + +Function: "yn_towardzero": +double: 3 +float: 3 +ldouble: 5 + +Function: "yn_upward": +double: 4 +float: 5 +ldouble: 5 + +# end of automatic generation diff --git a/sysdeps/loongarch/lp64/libm-test-ulps-name b/sysdeps/loongarch/lp64/libm-test-ulps-name new file mode 100644 index 0000000000..ce02281eab --- /dev/null +++ b/sysdeps/loongarch/lp64/libm-test-ulps-name @@ -0,0 +1 @@ +LoongArch 64-bit diff --git a/sysdeps/loongarch/math_private.h b/sysdeps/loongarch/math_private.h new file mode 100644 index 0000000000..cdf26a78dd --- /dev/null +++ b/sysdeps/loongarch/math_private.h @@ -0,0 +1,248 @@ +/* Internal math stuff. + Copyright (C) 2022 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +#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 +#include +#include + +#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 + +#endif From patchwork Tue Jul 19 01:22:09 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: caiyinyu X-Patchwork-Id: 56145 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id C12313884601 for ; Tue, 19 Jul 2022 01:22:33 +0000 (GMT) X-Original-To: libc-alpha@sourceware.org Delivered-To: libc-alpha@sourceware.org Received: from loongson.cn (mail.loongson.cn [114.242.206.163]) by sourceware.org (Postfix) with ESMTP id C766838768A5 for ; Tue, 19 Jul 2022 01:22:20 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org C766838768A5 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=loongson.cn Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=loongson.cn Received: from 5.5.5 (unknown [10.2.5.5]) by mail.loongson.cn (Coremail) with SMTP id AQAAf9Axn+JEB9ZixJcnAA--.10106S5; Tue, 19 Jul 2022 09:22:17 +0800 (CST) From: caiyinyu To: adhemerval.zanella@linaro.org, libc-alpha@sourceware.org, joseph_myers@mentor.com, carlos@redhat.com, i.swmail@xen0n.name Subject: [PATCH v7 12/13] LoongArch: Update build-many-glibcs.py for the LoongArch Port. Date: Tue, 19 Jul 2022 09:22:09 +0800 Message-Id: <20220719012210.1464764-4-caiyinyu@loongson.cn> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220719012210.1464764-1-caiyinyu@loongson.cn> References: <20220719012210.1464764-1-caiyinyu@loongson.cn> MIME-Version: 1.0 X-CM-TRANSID: AQAAf9Axn+JEB9ZixJcnAA--.10106S5 X-Coremail-Antispam: 1UD129KBjvdXoWruF4DAw4rWw1fAry3Cry8Zrb_yoWfZrbEv3 Z2vwsrZFZxtws8Kws7Wan5tr1UWrW7Zr1Fgr4DJrsFqFnFkan7Xa9ayFnxAw1DCwsYyF1f XFW2yF1FkF17KjkaLaAFLSUrUUUUUb8apTn2vfkv8UJUUUU8Yxn0WfASr-VFAUDa7-sFnT 9fnUUIcSsGvfJTRUUUbhxFF20E14v26rWj6s0DM7CY07I20VC2zVCF04k26cxKx2IYs7xG 6rWj6s0DM7CIcVAFz4kK6r1j6r18M28IrcIa0xkI8VA2jI8067AKxVWUWwA2048vs2IY02 0Ec7CjxVAFwI0_Gr0_Xr1l8cAvFVAK0II2c7xJM28CjxkF64kEwVA0rcxSw2x7M28EF7xv wVC0I7IYx2IY67AKxVW7JVWDJwA2z4x0Y4vE2Ix0cI8IcVCY1x0267AKxVW8Jr0_Cr1UM2 8EF7xvwVC2z280aVAFwI0_Gr1j6F4UJwA2z4x0Y4vEx4A2jsIEc7CjxVAFwI0_Gr1j6F4U JwAS0I0E0xvYzxvE52x082IY62kv0487Mc02F40EFcxC0VAKzVAqx4xG6I80ewAv7VC0I7 IYx2IY67AKxVWUGVWUXwAv7VC2z280aVAFwI0_Jr0_Gr1lOx8S6xCaFVCjc4AY6r1j6r4U M4x0Y48IcxkI7VAKI48JM4x0x7Aq67IIx4CEVc8vx2IErcIFxwCY02Avz4vE-syl42xK82 IYc2Ij64vIr41l4I8I3I0E4IkC6x0Yz7v_Jr0_Gr1lx2IqxVAqx4xG67AKxVWUJVWUGwC2 0s026x8GjcxK67AKxVWUGVWUWwC2zVAF1VAY17CE14v26r126r1DMIIYrxkI7VAKI48JMI IF0xvE2Ix0cI8IcVAFwI0_Gr0_Xr1lIxAIcVC0I7IYx2IY6xkF7I0E14v26F4j6r4UJwCI 42IY6xAIw20EY4v20xvaj40_Jr0_JF4lIxAIcVC2z280aVAFwI0_Gr0_Cr1lIxAIcVC2z2 80aVCY1x0267AKxVW8JVW8JrUvcSsGvfC2KfnxnUUI43ZEXa7VUjAR67UUUUU== X-CM-SenderInfo: 5fdl5xhq1xqz5rrqw2lrqou0/ X-Spam-Status: No, score=-13.5 required=5.0 tests=BAYES_00, GIT_PATCH_0, KAM_DMARC_STATUS, SPF_HELO_PASS, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: libc-alpha@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Libc-alpha mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: caiyinyu Errors-To: libc-alpha-bounces+patchwork=sourceware.org@sourceware.org Sender: "Libc-alpha" --- scripts/build-many-glibcs.py | 5 +++++ 1 file changed, 5 insertions(+) Reviewed-by: Adhemerval Zanella diff --git a/scripts/build-many-glibcs.py b/scripts/build-many-glibcs.py index cc058e115c..da9b905900 100755 --- a/scripts/build-many-glibcs.py +++ b/scripts/build-many-glibcs.py @@ -218,6 +218,10 @@ class Context(object): os_name='linux-gnu', first_gcc_cfg=['--with-system-libunwind'], binutils_cfg=['--enable-obsolete']) + self.add_config(arch='loongarch64', + os_name='linux-gnu', + variant='lp64d', + gcc_cfg=['--with-abi=lp64d','--disable-multilib']) self.add_config(arch='m68k', os_name='linux-gnu', gcc_cfg=['--disable-multilib']) @@ -1271,6 +1275,7 @@ def install_linux_headers(policy, cmdlist): 'i686': 'x86', 'i786': 'x86', 'ia64': 'ia64', + 'loongarch64': 'loongarch', 'm68k': 'm68k', 'microblaze': 'microblaze', 'mips': 'mips', From patchwork Tue Jul 19 01:22:10 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: caiyinyu X-Patchwork-Id: 56146 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id CADB9387689B for ; Tue, 19 Jul 2022 01:22:34 +0000 (GMT) X-Original-To: libc-alpha@sourceware.org Delivered-To: libc-alpha@sourceware.org Received: from loongson.cn (mail.loongson.cn [114.242.206.163]) by sourceware.org (Postfix) with ESMTP id 1F6213851A8B for ; Tue, 19 Jul 2022 01:22:20 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 1F6213851A8B Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=loongson.cn Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=loongson.cn Received: from 5.5.5 (unknown [10.2.5.5]) by mail.loongson.cn (Coremail) with SMTP id AQAAf9Axn+JEB9ZixJcnAA--.10106S6; Tue, 19 Jul 2022 09:22:17 +0800 (CST) From: caiyinyu To: adhemerval.zanella@linaro.org, libc-alpha@sourceware.org, joseph_myers@mentor.com, carlos@redhat.com, i.swmail@xen0n.name Subject: [PATCH v7 13/13] LoongArch: Update NEWS and README for the LoongArch port. Date: Tue, 19 Jul 2022 09:22:10 +0800 Message-Id: <20220719012210.1464764-5-caiyinyu@loongson.cn> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220719012210.1464764-1-caiyinyu@loongson.cn> References: <20220719012210.1464764-1-caiyinyu@loongson.cn> MIME-Version: 1.0 X-CM-TRANSID: AQAAf9Axn+JEB9ZixJcnAA--.10106S6 X-Coremail-Antispam: 1UD129KBjvJXoW7Cr4xWr1DGrW3XrW3Jry3twb_yoW8Aw1xpa n3WFn5tr9xJF9rAw1Duw48uw43X3Z3Was8Ga4jg348C34UAr97Wwn5Ka90qF4DXayfZF47 t340qr1DCa4UuaDanT9S1TB71UUUUUUqnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDU0xBIdaVrnRJUUUBG14x267AKxVWrJVCq3wAFc2x0x2IEx4CE42xK8VAvwI8IcIk0 rVWrJVCq3wAFIxvE14AKwVWUJVWUGwA2048vs2IY020E87I2jVAFwI0_JF0E3s1l82xGYI kIc2x26xkF7I0E14v26ryj6s0DM28lY4IEw2IIxxk0rwA2F7IY1VAKz4vEj48ve4kI8wA2 z4x0Y4vE2Ix0cI8IcVAFwI0_Ar0_tr1l84ACjcxK6xIIjxv20xvEc7CjxVAFwI0_Gr1j6F 4UJwA2z4x0Y4vEx4A2jsIE14v26r4UJVWxJr1l84ACjcxK6I8E87Iv6xkF7I0E14v26r4U JVWxJr1le2I262IYc4CY6c8Ij28IcVAaY2xG8wAqx4xG64xvF2IEw4CE5I8CrVC2j2WlYx 0E2Ix0cI8IcVAFwI0_JrI_JrylYx0Ex4A2jsIE14v26r1j6r4UMcvjeVCFs4IE7xkEbVWU JVW8JwACjcxG0xvY0x0EwIxGrwACjI8F5VA0II8E6IAqYI8I648v4I1lc2xSY4AK6svPMx AIw28IcxkI7VAKI48JMxC20s026xCaFVCjc4AY6r1j6r4UMI8I3I0E5I8CrVAFwI0_Jr0_ Jr4lx2IqxVCjr7xvwVAFwI0_JrI_JrWlx4CE17CEb7AF67AKxVWUAVWUtwCIc40Y0x0EwI xGrwCI42IY6xIIjxv20xvE14v26r4j6ryUMIIF0xvE2Ix0cI8IcVCY1x0267AKxVWxJVW8 Jr1lIxAIcVCF04k26cxKx2IYs7xG6r1j6r1xMIIF0xvEx4A2jsIE14v26r4j6F4UMIIF0x vEx4A2jsIEc7CjxVAFwI0_Gr0_Gr1UYxBIdaVFxhVjvjDU0xZFpf9x0JUArcfUUUUU= X-CM-SenderInfo: 5fdl5xhq1xqz5rrqw2lrqou0/ X-Spam-Status: No, score=-13.5 required=5.0 tests=BAYES_00, GIT_PATCH_0, KAM_DMARC_STATUS, SPF_HELO_PASS, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: libc-alpha@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Libc-alpha mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: caiyinyu Errors-To: libc-alpha-bounces+patchwork=sourceware.org@sourceware.org Sender: "Libc-alpha" --- NEWS | 8 ++++++++ README | 1 + manual/math.texi | 2 +- 3 files changed, 10 insertions(+), 1 deletion(-) Reviewed-by: Adhemerval Zanella diff --git a/NEWS b/NEWS index df882ec243..d2f913da06 100644 --- a/NEWS +++ b/NEWS @@ -60,6 +60,14 @@ Major new features: _GNU_SOURCE macro is defined and the C++20 __cpp_char8_t feature test macro is not defined (if __cpp_char8_t is defined, then char8_t is a builtin type). +* Support for LoongArch running on Linux has been added. This port requires + as least binutils 2.38, GCC 12, and Linux 5.19. Currently only hard-float + ABI is supported: + + - loongarch64-linux-gnu + + The LoongArch ABI is 64-bit little-endian. + Deprecated and removed features, and other changes affecting compatibility: * Support for prelink will be removed in the next release; this includes diff --git a/README b/README index 3d5a78ccff..63f3a1bebf 100644 --- a/README +++ b/README @@ -31,6 +31,7 @@ The GNU C Library supports these configurations for using Linux kernels: i[4567]86-*-linux-gnu x86_64-*-linux-gnu Can build either x86_64 or x32 ia64-*-linux-gnu + loongarch64-*-linux-gnu Hardware floating point, LE only. m68k-*-linux-gnu microblaze*-*-linux-gnu mips-*-linux-gnu diff --git a/manual/math.texi b/manual/math.texi index 477a18b6d1..105d6122df 100644 --- a/manual/math.texi +++ b/manual/math.texi @@ -70,7 +70,7 @@ provided for @code{_Float32}, @code{_Float64} and @code{_Float32x} on all platforms. It is also provided for @code{_Float128} and @code{_Float64x} on powerpc64le (PowerPC 64-bits little-endian), x86_64, x86, ia64, -aarch64, alpha, mips64, riscv, s390 and sparc. +aarch64, alpha, loongarch, mips64, riscv, s390 and sparc. @menu * Mathematical Constants:: Precise numeric values for often-used