From patchwork Tue Feb 3 15:05:40 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Zihong Yao X-Patchwork-Id: 129503 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from vm01.sourceware.org (localhost [127.0.0.1]) by sourceware.org (Postfix) with ESMTP id 532494BA2E08 for ; Tue, 3 Feb 2026 15:23:26 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 532494BA2E08 X-Original-To: libc-alpha@sourceware.org Delivered-To: libc-alpha@sourceware.org Received: from cstnet.cn (smtp21.cstnet.cn [159.226.251.21]) by sourceware.org (Postfix) with ESMTPS id AF4124BA2E10 for ; Tue, 3 Feb 2026 15:21:54 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org AF4124BA2E10 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=isrc.iscas.ac.cn Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=isrc.iscas.ac.cn ARC-Filter: OpenARC Filter v1.0.0 sourceware.org AF4124BA2E10 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=159.226.251.21 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1770132115; cv=none; b=oss6PHMTQb0AWXIpgD9zyn9H+nsvAbO43QkpnngjC5QhRPWAhD+JV2U1jeoaiZmsy3N3u31Atp7YqEOU51XNzWZIGyfu4KOMxMuEpnShhiyqSRWM8L6L63F81iHazUahU/evm15szyr/RFJPvnnRjhnLyXjcaH9b7NTEdsQMJ2w= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1770132115; c=relaxed/simple; bh=j5fkfeguRxFKiJO5Yo7azn+hfvxQZmC9h/gotFSJgy8=; h=From:To:Subject:Date:Message-ID:MIME-Version; b=SgXQkvNXEPFHq3wr9LemBmqWJz++0YOX2b5EbriYYvRibpuK0R/X8+5UQ4DpYbo8vpPNbt22a6btJfmqRc1HZ/bLaOhMPf+kytTrrtpT7wmM88IthN78VARKANvIMDPsV3FOu7YSdhkY+8bga5FVUQU6VWDDDGnvuwQInC8x3Q8= ARC-Authentication-Results: i=1; server2.sourceware.org DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org AF4124BA2E10 Received: from Mobilestation.localdomain (unknown [183.6.59.140]) by APP-01 (Coremail) with SMTP id qwCowADHbmriEIJpZ2EVBw--.24930S18; Tue, 03 Feb 2026 23:14:57 +0800 (CST) From: Yao Zihong To: libc-alpha@sourceware.org Cc: adhemerval.zanella@linaro.org, andrew@sifive.com, schwab@linux-m68k.org, bergner@tenstorrent.com, jlaw@ventanamicro.com, zhangyin2018@iscas.ac.cn, enh@google.com, zihongyao@outlook.com, Yao Zihong Subject: [PATCH v5 16/18] riscv: Add RVV strncpy for multiarch and non-multiarch Date: Tue, 3 Feb 2026 23:05:40 +0800 Message-ID: <20260203151406.27450-17-zihong.plct@isrc.iscas.ac.cn> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260203151406.27450-1-zihong.plct@isrc.iscas.ac.cn> References: <20260203151406.27450-1-zihong.plct@isrc.iscas.ac.cn> MIME-Version: 1.0 X-CM-TRANSID: qwCowADHbmriEIJpZ2EVBw--.24930S18 X-Coremail-Antispam: 1UD129KBjvJXoW3Cw4xtry3AF4DWw4xGw1fXrb_yoWkXw45pF Z5u3W7CF4kJryxGryIga1ag3W3JrWrJrn8Kr1Ykw4jyrWjqr4xGrsFvrsagFyfJrWru3y7 uFn8WFyUuF18A3DanT9S1TB71UUUUU7qnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDU0xBIdaVrnRJUUUmv14x267AKxVWrJVCq3wAFc2x0x2IEx4CE42xK8VAvwI8IcIk0 rVWrJVCq3wAFIxvE14AKwVWUJVWUGwA2048vs2IY020E87I2jVAFwI0_JF0E3s1l82xGYI kIc2x26xkF7I0E14v26ryj6s0DM28lY4IEw2IIxxk0rwA2F7IY1VAKz4vEj48ve4kI8wA2 z4x0Y4vE2Ix0cI8IcVAFwI0_Gr0_Xr1l84ACjcxK6xIIjxv20xvEc7CjxVAFwI0_Gr1j6F 4UJwA2z4x0Y4vEx4A2jsIE14v26r4j6F4UM28EF7xvwVC2z280aVCY1x0267AKxVW8Jr0_ Cr1UM2AIxVAIcxkEcVAq07x20xvEncxIr21l5I8CrVACY4xI64kE6c02F40Ex7xfMcIj6x IIjxv20xvE14v26r1j6r18McIj6I8E87Iv67AKxVWUJVW8JwAm72CE4IkC6x0Yz7v_Jr0_ Gr1lF7xvr2IYc2Ij64vIr41lF7I21c0EjII2zVCS5cI20VAGYxC7M4IIrI8v6xkF7I0E8c xan2IY04v7MxkF7I0En4kS14v26r1q6r43MxAIw28IcxkI7VAKI48JMxC20s026xCaFVCj c4AY6r1j6r4UMI8I3I0E5I8CrVAFwI0_Jr0_Jr4lx2IqxVCjr7xvwVAFwI0_JrI_JrWlx4 CE17CEb7AF67AKxVWUtVW8ZwCIc40Y0x0EwIxGrwCI42IY6xIIjxv20xvE14v26r4j6ryU MIIF0xvE2Ix0cI8IcVCY1x0267AKxVW8Jr0_Cr1UMIIF0xvE42xK8VAvwI8IcIk0rVWUJV WUCwCI42IY6I8E87Iv67AKxVW8JVWxJwCI42IY6I8E87Iv6xkF7I0E14v26r4UJVWxJrUv cSsGvfC2KfnxnUUI43ZEXa7VUbPC7UUUUUU== X-Originating-IP: [183.6.59.140] X-CM-SenderInfo: p2lk00vjoszunw6l223fol2u1dvotugofq/ X-Spam-Status: No, score=-11.7 required=5.0 tests=BAYES_00, GIT_PATCH_0, KAM_DMARC_STATUS, KAM_SHORT, RCVD_IN_DNSWL_BLOCKED, RCVD_IN_VALIDITY_RPBL_BLOCKED, RCVD_IN_VALIDITY_SAFE_BLOCKED, SPF_HELO_PASS, SPF_PASS, TXREP, URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on sourceware.org X-BeenThere: libc-alpha@sourceware.org X-Mailman-Version: 2.1.30 Precedence: list List-Id: Libc-alpha mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: libc-alpha-bounces~patchwork=sourceware.org@sourceware.org Signed-off-by: Yao Zihong --- sysdeps/riscv/multiarch/strncpy-generic.c | 26 +++++++++ sysdeps/riscv/multiarch/strncpy-vector.S | 24 ++++++++ sysdeps/riscv/rvv/stpncpy.S | 27 +++++++-- sysdeps/riscv/rvv/strncpy.S | 20 +++++++ .../unix/sysv/linux/riscv/multiarch/Makefile | 3 + .../linux/riscv/multiarch/ifunc-impl-list.c | 5 ++ .../unix/sysv/linux/riscv/multiarch/stpncpy.c | 15 ++--- .../unix/sysv/linux/riscv/multiarch/strncpy.c | 56 +++++++++++++++++++ 8 files changed, 164 insertions(+), 12 deletions(-) create mode 100644 sysdeps/riscv/multiarch/strncpy-generic.c create mode 100644 sysdeps/riscv/multiarch/strncpy-vector.S create mode 100644 sysdeps/riscv/rvv/strncpy.S create mode 100644 sysdeps/unix/sysv/linux/riscv/multiarch/strncpy.c diff --git a/sysdeps/riscv/multiarch/strncpy-generic.c b/sysdeps/riscv/multiarch/strncpy-generic.c new file mode 100644 index 0000000000..726ca9ed5f --- /dev/null +++ b/sysdeps/riscv/multiarch/strncpy-generic.c @@ -0,0 +1,26 @@ +/* Re-include the default strncpy implementation. + Copyright (C) 2026 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 STRNCPY __strncpy_generic +# undef libc_hidden_builtin_def +# define libc_hidden_builtin_def(x) +# include +#endif diff --git a/sysdeps/riscv/multiarch/strncpy-vector.S b/sysdeps/riscv/multiarch/strncpy-vector.S new file mode 100644 index 0000000000..32256f7695 --- /dev/null +++ b/sysdeps/riscv/multiarch/strncpy-vector.S @@ -0,0 +1,24 @@ +/* Re-include the RISC-V RVV based strncpy implementation. + Copyright (C) 2026 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 + . */ + +#if IS_IN(libc) +# define STRNCPY __strncpy_vector +# undef libc_hidden_builtin_def +# define libc_hidden_builtin_def(x) +# include +#endif diff --git a/sysdeps/riscv/rvv/stpncpy.S b/sysdeps/riscv/rvv/stpncpy.S index 57406685b0..d9004f2fba 100644 --- a/sysdeps/riscv/rvv/stpncpy.S +++ b/sysdeps/riscv/rvv/stpncpy.S @@ -19,12 +19,20 @@ #include #include -#ifndef STPNCPY -# ifdef weak_alias -# define STPNCPY __stpncpy +#ifndef USE_AS_STRNCPY +# ifndef STPNCPY +# ifdef weak_alias +# define STPNCPY __stpncpy weak_alias (__stpncpy, stpncpy) +# else +# define STPNCPY stpncpy +# endif +# endif +#else +# ifndef STRNCPY +# define STPNCPY strncpy # else -# define STPNCPY stpncpy +# define STPNCPY STRNCPY # endif #endif @@ -62,7 +70,9 @@ L(stpcpy_loop): add dst_ptr, dst_ptr, cur_vl bgez active_elem_pos, L(fill_zero) bnez length, L(stpcpy_loop) +#ifndef USE_AS_STRNCPY mv dst, dst_ptr +#endif ret /* Fill the tail zero. */ @@ -72,8 +82,10 @@ L(fill_zero): to get the correct remaining length for zero filling. */ sub temp, cur_vl, active_elem_pos addi temp, temp, -1 +#ifndef USE_AS_STRNCPY sub dst, dst_ptr, cur_vl add dst, dst, active_elem_pos +#endif add length, length, temp /* Have an earily return for `strlen(src) + 1 == count` case. */ bnez length, L(do_fill_zero) @@ -92,6 +104,11 @@ L(fill_zero_loop): ret .option pop END (STPNCPY) -#ifdef weak_alias + +#ifndef USE_AS_STRNCPY +# ifdef weak_alias libc_hidden_def (__stpncpy) +# endif +#else +libc_hidden_builtin_def (strncpy) #endif diff --git a/sysdeps/riscv/rvv/strncpy.S b/sysdeps/riscv/rvv/strncpy.S new file mode 100644 index 0000000000..961c16416e --- /dev/null +++ b/sysdeps/riscv/rvv/strncpy.S @@ -0,0 +1,20 @@ +/* RISC-V RVV based strncpy. + Copyright (C) 2026 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 USE_AS_STRNCPY +#include diff --git a/sysdeps/unix/sysv/linux/riscv/multiarch/Makefile b/sysdeps/unix/sysv/linux/riscv/multiarch/Makefile index bb3488e849..df33147de9 100644 --- a/sysdeps/unix/sysv/linux/riscv/multiarch/Makefile +++ b/sysdeps/unix/sysv/linux/riscv/multiarch/Makefile @@ -49,6 +49,9 @@ sysdep_routines += \ strncmp \ strncmp-generic \ strncmp-vector \ + strncpy \ + strncpy-generic \ + strncpy-vector \ # sysdep_routines CFLAGS-memcpy_noalignment.c += -mno-strict-align diff --git a/sysdeps/unix/sysv/linux/riscv/multiarch/ifunc-impl-list.c b/sysdeps/unix/sysv/linux/riscv/multiarch/ifunc-impl-list.c index 025b026cf3..26444cc99d 100644 --- a/sysdeps/unix/sysv/linux/riscv/multiarch/ifunc-impl-list.c +++ b/sysdeps/unix/sysv/linux/riscv/multiarch/ifunc-impl-list.c @@ -125,5 +125,10 @@ __libc_ifunc_impl_list (const char *name, struct libc_ifunc_impl *array, __strncmp_vector) IFUNC_IMPL_ADD (array, i, strncmp, 1, __strncmp_generic)) + IFUNC_IMPL (i, name, strncpy, + IFUNC_IMPL_ADD (array, i, strncpy, rvv_enabled, + __strncpy_vector) + IFUNC_IMPL_ADD (array, i, strncpy, 1, __strncpy_generic)) + return 0; } diff --git a/sysdeps/unix/sysv/linux/riscv/multiarch/stpncpy.c b/sysdeps/unix/sysv/linux/riscv/multiarch/stpncpy.c index e451391f1a..190b479a1b 100644 --- a/sysdeps/unix/sysv/linux/riscv/multiarch/stpncpy.c +++ b/sysdeps/unix/sysv/linux/riscv/multiarch/stpncpy.c @@ -22,14 +22,15 @@ mismatch with the IFUNC selector in strong_alias, below. */ # undef stpncpy # define stpncpy __redirect_stpncpy +# define __stpncpy __redirect___stpncpy # include # include +# undef stpncpy +# undef __stpncpy # include # include # include -extern __typeof (__redirect_stpncpy) __libc_stpncpy; - extern __typeof (__redirect_stpncpy) __stpncpy_generic attribute_hidden; extern __typeof (__redirect_stpncpy) __stpncpy_vector attribute_hidden; @@ -43,14 +44,14 @@ select_stpncpy_ifunc (uint64_t dl_hwcap, __riscv_hwprobe_t hwprobe_func) return __stpncpy_generic; } -riscv_libc_ifunc (__libc_stpncpy, select_stpncpy_ifunc); +riscv_libc_ifunc_redirected (__redirect___stpncpy, __stpncpy, + select_stpncpy_ifunc); # undef stpncpy -weak_alias (__libc_stpncpy, stpncpy); -libc_hidden_def (__stpncpy); +weak_alias (__stpncpy, stpncpy); # ifdef SHARED -__hidden_ver1 (stpncpy, __GI_stpncpy, __redirect_stpncpy) - __attribute__ ((visibility ("hidden"))) __attribute_copy__ (stpncpy); +__hidden_ver1 (__stpncpy, __GI___stpncpy, __redirect___stpncpy) + __attribute__ ((visibility ("hidden"))) __attribute_copy__ (__stpncpy); # endif #else # include diff --git a/sysdeps/unix/sysv/linux/riscv/multiarch/strncpy.c b/sysdeps/unix/sysv/linux/riscv/multiarch/strncpy.c new file mode 100644 index 0000000000..459032312f --- /dev/null +++ b/sysdeps/unix/sysv/linux/riscv/multiarch/strncpy.c @@ -0,0 +1,56 @@ +/* Multiple versions of strncpy. + All versions must be listed in ifunc-impl-list.c. + Copyright (C) 2026 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 + . */ + +#if IS_IN (libc) +/* Redefine strncpy so that the compiler won't complain about the type + mismatch with the IFUNC selector in strong_alias, below. */ +# undef strncpy +# define strncpy __redirect_strncpy +# include +# include +# include +# include +# include + +extern __typeof (__redirect_strncpy) __libc_strncpy; + +extern __typeof (__redirect_strncpy) __strncpy_generic attribute_hidden; +extern __typeof (__redirect_strncpy) __strncpy_vector attribute_hidden; + +static inline __typeof (__redirect_strncpy) * +select_strncpy_ifunc (uint64_t dl_hwcap, __riscv_hwprobe_t hwprobe_func) +{ + unsigned long long int v; + if (__riscv_hwprobe_one (hwprobe_func, RISCV_HWPROBE_KEY_IMA_EXT_0, &v) == 0 + && (v & RISCV_HWPROBE_IMA_V) == RISCV_HWPROBE_IMA_V) + return __strncpy_vector; + return __strncpy_generic; +} + +riscv_libc_ifunc (__libc_strncpy, select_strncpy_ifunc); + +# undef strncpy +strong_alias (__libc_strncpy, strncpy); +# ifdef SHARED +__hidden_ver1 (strncpy, __GI_strncpy, __redirect_strncpy) + __attribute__ ((visibility ("hidden"))) __attribute_copy__ (strncpy); +# endif +#else +# include +#endif