[PATCH v3] string: Add support for __memsetzero on all targets

H.J. Lu hjl.tools@gmail.com
Tue Feb 15 00:01:52 GMT 2022


On Mon, Feb 14, 2022 at 3:56 PM Noah Goldstein <goldstein.w.n@gmail.com> wrote:
>
> On Mon, Feb 14, 2022 at 1:09 PM H.J. Lu via Libc-alpha
> <libc-alpha@sourceware.org> wrote:
> >
> > Changes in v3:
> >
> > 1. Change __memsetzero to return "void *", instead of "void", so that
> > compiler can replace all memset calls with 0 input with __memsetzero.
> > 2. Add memsetzero.c to implement the generic __memsetzero.
> > 3. x86-64: Replace IFUNC bzero with IFUNC __memsetzero and make bzero
> > an alias of __memsetzero.
> >
> > ---
> > To optimize for data erase, add
> >
> > void *__memsetzero (void *s, size_t n);
> >
> Is the void * return necessary?
>
> We can still make `bzero` an alias without it so AFAICT it just adds extra
> required logic to the implementation.

It allows compiler to optimize all memset (0) calls with __memsetzero.

> > with the default implementation:
> >
> > void *
> > __memsetzero (void *s, size_t len)
> > {
> >   return memset (s, '\0', len);
> > }
> >
> > If __memsetzero is available, compilers can generate call to __memsetzero
> > to erase data, instead of memset.
> >
> > Tested with build-many-glibcs.py and natively on x86-64, x32 and i686.
> > ---
> >  NEWS                                          |  3 +-
> >  include/string.h                              |  1 +
> >  string/Makefile                               |  2 +
> >  string/Versions                               |  3 ++
> >  string/memsetzero.c                           | 27 ++++++++++++
> >  string/string.h                               |  3 ++
> >  string/test-memset.c                          | 27 +++++++++++-
> >  string/test-memsetzero.c                      | 19 ++++++++
> >  sysdeps/mach/hurd/i386/libc.abilist           |  1 +
> >  sysdeps/unix/sysv/linux/aarch64/libc.abilist  |  1 +
> >  sysdeps/unix/sysv/linux/alpha/libc.abilist    |  1 +
> >  sysdeps/unix/sysv/linux/arc/libc.abilist      |  1 +
> >  sysdeps/unix/sysv/linux/arm/be/libc.abilist   |  1 +
> >  sysdeps/unix/sysv/linux/arm/le/libc.abilist   |  1 +
> >  sysdeps/unix/sysv/linux/csky/libc.abilist     |  1 +
> >  sysdeps/unix/sysv/linux/hppa/libc.abilist     |  1 +
> >  sysdeps/unix/sysv/linux/i386/libc.abilist     |  1 +
> >  sysdeps/unix/sysv/linux/ia64/libc.abilist     |  1 +
> >  .../sysv/linux/m68k/coldfire/libc.abilist     |  1 +
> >  .../unix/sysv/linux/m68k/m680x0/libc.abilist  |  1 +
> >  .../sysv/linux/microblaze/be/libc.abilist     |  1 +
> >  .../sysv/linux/microblaze/le/libc.abilist     |  1 +
> >  .../sysv/linux/mips/mips32/fpu/libc.abilist   |  1 +
> >  .../sysv/linux/mips/mips32/nofpu/libc.abilist |  1 +
> >  .../sysv/linux/mips/mips64/n32/libc.abilist   |  1 +
> >  .../sysv/linux/mips/mips64/n64/libc.abilist   |  1 +
> >  sysdeps/unix/sysv/linux/nios2/libc.abilist    |  1 +
> >  sysdeps/unix/sysv/linux/or1k/libc.abilist     |  1 +
> >  .../linux/powerpc/powerpc32/fpu/libc.abilist  |  1 +
> >  .../powerpc/powerpc32/nofpu/libc.abilist      |  1 +
> >  .../linux/powerpc/powerpc64/be/libc.abilist   |  1 +
> >  .../linux/powerpc/powerpc64/le/libc.abilist   |  1 +
> >  .../unix/sysv/linux/riscv/rv32/libc.abilist   |  1 +
> >  .../unix/sysv/linux/riscv/rv64/libc.abilist   |  1 +
> >  .../unix/sysv/linux/s390/s390-32/libc.abilist |  1 +
> >  .../unix/sysv/linux/s390/s390-64/libc.abilist |  1 +
> >  sysdeps/unix/sysv/linux/sh/be/libc.abilist    |  1 +
> >  sysdeps/unix/sysv/linux/sh/le/libc.abilist    |  1 +
> >  .../sysv/linux/sparc/sparc32/libc.abilist     |  1 +
> >  .../sysv/linux/sparc/sparc64/libc.abilist     |  1 +
> >  .../unix/sysv/linux/x86_64/64/libc.abilist    |  1 +
> >  .../unix/sysv/linux/x86_64/x32/libc.abilist   |  1 +
> >  sysdeps/x86_64/memset.S                       | 11 ++---
> >  sysdeps/x86_64/memsetzero.S                   |  1 +
> >  sysdeps/x86_64/multiarch/Makefile             |  1 -
> >  sysdeps/x86_64/multiarch/ifunc-impl-list.c    | 44 +++++++++----------
> >  .../memset-avx2-unaligned-erms-rtm.S          |  2 +-
> >  .../multiarch/memset-avx2-unaligned-erms.S    |  6 +--
> >  .../multiarch/memset-avx512-unaligned-erms.S  |  2 +-
> >  .../multiarch/memset-evex-unaligned-erms.S    |  2 +-
> >  .../multiarch/memset-sse2-unaligned-erms.S    |  2 +-
> >  .../multiarch/memset-vec-unaligned-erms.S     | 22 +++++-----
> >  .../multiarch/{bzero.c => memsetzero.c}       | 22 +++++++---
> >  53 files changed, 180 insertions(+), 54 deletions(-)
> >  create mode 100644 string/memsetzero.c
> >  create mode 100644 string/test-memsetzero.c
> >  create mode 100644 sysdeps/x86_64/memsetzero.S
> >  rename sysdeps/x86_64/multiarch/{bzero.c => memsetzero.c} (85%)
> >
> > diff --git a/NEWS b/NEWS
> > index 626eeabf5d..ae66e4146e 100644
> > --- a/NEWS
> > +++ b/NEWS
> > @@ -9,7 +9,8 @@ Version 2.36
> >
> >  Major new features:
> >
> > -  [Add new features here]
> > +* ABI support for a new function '__memsetzero'. '__memsetzero' is meant
> > +  to be used by compilers to erase data.
> >
> >  Deprecated and removed features, and other changes affecting compatibility:
> >
> > diff --git a/include/string.h b/include/string.h
> > index 21f641a413..608928ac65 100644
> > --- a/include/string.h
> > +++ b/include/string.h
> > @@ -113,6 +113,7 @@ libc_hidden_proto (__strsep_g)
> >  libc_hidden_proto (strnlen)
> >  libc_hidden_proto (__strnlen)
> >  libc_hidden_proto (__memcmpeq)
> > +libc_hidden_proto (__memsetzero)
> >  libc_hidden_proto (memmem)
> >  extern __typeof (memmem) __memmem;
> >  libc_hidden_proto (__memmem)
> > diff --git a/string/Makefile b/string/Makefile
> > index 641e062bbb..c5b0c329c5 100644
> > --- a/string/Makefile
> > +++ b/string/Makefile
> > @@ -69,6 +69,7 @@ routines := \
> >    mempcpy \
> >    memrchr \
> >    memset \
> > +  memsetzero \
> >    rawmemchr \
> >    sigabbrev_np \
> >    sigdescr_np \
> > @@ -145,6 +146,7 @@ tests := \
> >    test-mempcpy \
> >    test-memrchr \
> >    test-memset \
> > +  test-memsetzero \
> >    test-rawmemchr \
> >    test-sig_np \
> >    test-stpcpy \
> > diff --git a/string/Versions b/string/Versions
> > index 864c4cf7a4..0abd7262c5 100644
> > --- a/string/Versions
> > +++ b/string/Versions
> > @@ -92,4 +92,7 @@ libc {
> >    GLIBC_2.35 {
> >      __memcmpeq;
> >    }
> > +  GLIBC_2.36 {
> > +    __memsetzero;
> > +  }
> >  }
> > diff --git a/string/memsetzero.c b/string/memsetzero.c
> > new file mode 100644
> > index 0000000000..8a7f6b82ec
> > --- /dev/null
> > +++ b/string/memsetzero.c
> > @@ -0,0 +1,27 @@
> > +/* Copyright (C) 2022 Free Software Foundation, Inc.
> > +   This file is part of the GNU C Library.
> > +
> > +   The GNU C Library is free software; you can redistribute it and/or
> > +   modify it under the terms of the GNU Lesser General Public
> > +   License as published by the Free Software Foundation; either
> > +   version 2.1 of the License, or (at your option) any later version.
> > +
> > +   The GNU C Library is distributed in the hope that it will be useful,
> > +   but WITHOUT ANY WARRANTY; without even the implied warranty of
> > +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> > +   Lesser General Public License for more details.
> > +
> > +   You should have received a copy of the GNU Lesser General Public
> > +   License along with the GNU C Library; if not, see
> > +   <https://www.gnu.org/licenses/>.  */
> > +
> > +#include <string.h>
> > +
> > +/* Set N bytes of S to 0.  */
> > +void *
> > +__memsetzero (void *s, size_t len)
> > +{
> > +  return memset (s, '\0', len);
> > +}
> > +
> > +libc_hidden_def (__memsetzero)
> > diff --git a/string/string.h b/string/string.h
> > index d494a1d5f9..559f421268 100644
> > --- a/string/string.h
> > +++ b/string/string.h
> > @@ -60,6 +60,9 @@ extern void *memccpy (void *__restrict __dest, const void *__restrict __src,
> >  /* Set N bytes of S to C.  */
> >  extern void *memset (void *__s, int __c, size_t __n) __THROW __nonnull ((1));
> >
> > +/* Set N bytes of S to 0.  */
> > +extern void *__memsetzero (void *__s, size_t __n) __THROW __nonnull ((1));
> > +
> >  /* Compare N bytes of S1 and S2.  */
> >  extern int memcmp (const void *__s1, const void *__s2, size_t __n)
> >       __THROW __attribute_pure__ __nonnull ((1, 2));
> > diff --git a/string/test-memset.c b/string/test-memset.c
> > index 8498b1bc97..6d0ec57447 100644
> > --- a/string/test-memset.c
> > +++ b/string/test-memset.c
> > @@ -23,6 +23,8 @@
> >  # else
> >  #  define TEST_NAME "bzero"
> >  # endif
> > +#elif defined TEST_MEMSETZERO
> > +# define TEST_NAME "__memsetzero"
> >  #else
> >  # ifndef WIDE
> >  #  define TEST_NAME "memset"
> > @@ -76,6 +78,17 @@ builtin_bzero (char *s, size_t n)
> >  {
> >    __builtin_bzero (s, n);
> >  }
> > +#elif defined TEST_MEMSETZERO
> > +typedef void *(*proto_t) (char *, size_t);
> > +
> > +void *
> > +simple_memsetzero (char *s, size_t n)
> > +{
> > +  return SIMPLE_MEMSET (s, 0, n);
> > +}
> > +
> > +IMPL (__memsetzero, 1)
> > +IMPL (simple_memsetzero, 0)
> >  #else
> >  typedef CHAR *(*proto_t) (CHAR *, int, size_t);
> >
> > @@ -120,7 +133,11 @@ do_one_test (impl_t *impl, CHAR *s, int c __attribute ((unused)), size_t n)
> >        || buf[0] != sentinel
> >        || buf[n + 1] != sentinel)
> >  #else
> > +# ifdef TEST_MEMSETZERO
> > +  CHAR *res = CALL (impl, s, n);
> > +# else
> >    CHAR *res = CALL (impl, s, c, n);
> > +# endif
> >    if (res != s
> >        || SIMPLE_MEMSET (tstbuf, c, n) != tstbuf
> >        || MEMCMP (s, tstbuf, n) != 0
> > @@ -170,10 +187,14 @@ do_random_tests (void)
> >         align = size - len;
> >        if ((random () & 7) == 0)
> >         align &= ~63;
> > +# ifdef TEST_MEMSETZERO
> > +      c = 0;
> > +# else
> >        if ((random () & 7) == 0)
> >         c = 0;
> >        else
> >         c = random () & BIG_CHAR;
> > +# endif
> >        o = random () & BIG_CHAR;
> >        if (o == c)
> >         o = (c + 1) & BIG_CHAR;
> > @@ -197,7 +218,11 @@ do_random_tests (void)
> >               if (p[i + align] == c)
> >                 p[i + align] = o;
> >             }
> > +# ifdef TEST_MEMSETZERO
> > +         res = (UCHAR *) CALL (impl, (CHAR *) p + align, len);
> > +# else
> >           res = (UCHAR *) CALL (impl, (CHAR *) p + align, c, len);
> > +# endif
> >           if (res != p + align)
> >             {
> >               error (0, 0, "Iteration %zd - wrong result in function %s (%zd, %d, %zd) %p != %p",
> > @@ -246,7 +271,7 @@ test_main (void)
> >      printf ("\t%s", impl->name);
> >    putchar ('\n');
> >
> > -#ifndef TEST_BZERO
> > +#if !defined TEST_BZERO && !defined TEST_MEMSETZERO
> >    for (c = -65; c <= 130; c += 65)
> >  #endif
> >      {
> > diff --git a/string/test-memsetzero.c b/string/test-memsetzero.c
> > new file mode 100644
> > index 0000000000..074501065f
> > --- /dev/null
> > +++ b/string/test-memsetzero.c
> > @@ -0,0 +1,19 @@
> > +/* Test and measure __memsetzero functions.
> > +   Copyright (C) 2022 Free Software Foundation, Inc.
> > +   This file is part of the GNU C Library.
> > +
> > +   The GNU C Library is free software; you can redistribute it and/or
> > +   modify it under the terms of the GNU Lesser General Public
> > +   License as published by the Free Software Foundation; either
> > +   version 2.1 of the License, or (at your option) any later version.
> > +
> > +   The GNU C Library is distributed in the hope that it will be useful,
> > +   but WITHOUT ANY WARRANTY; without even the implied warranty of
> > +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> > +   Lesser General Public License for more details.
> > +
> > +   You should have received a copy of the GNU Lesser General Public
> > +   License along with the GNU C Library; if not, see
> > +   <https://www.gnu.org/licenses/>.  */
> > +#define TEST_MEMSETZERO
> > +#include "test-memset.c"
> > diff --git a/sysdeps/mach/hurd/i386/libc.abilist b/sysdeps/mach/hurd/i386/libc.abilist
> > index 4dc87e9061..9a39a5c342 100644
> > --- a/sysdeps/mach/hurd/i386/libc.abilist
> > +++ b/sysdeps/mach/hurd/i386/libc.abilist
> > @@ -2289,6 +2289,7 @@ GLIBC_2.35 __memcmpeq F
> >  GLIBC_2.35 _dl_find_object F
> >  GLIBC_2.35 close_range F
> >  GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F
> > +GLIBC_2.36 __memsetzero F
> >  GLIBC_2.4 __confstr_chk F
> >  GLIBC_2.4 __fgets_chk F
> >  GLIBC_2.4 __fgets_unlocked_chk F
> > diff --git a/sysdeps/unix/sysv/linux/aarch64/libc.abilist b/sysdeps/unix/sysv/linux/aarch64/libc.abilist
> > index 1b63d9e447..68b86b22c9 100644
> > --- a/sysdeps/unix/sysv/linux/aarch64/libc.abilist
> > +++ b/sysdeps/unix/sysv/linux/aarch64/libc.abilist
> > @@ -2616,3 +2616,4 @@ GLIBC_2.35 __memcmpeq F
> >  GLIBC_2.35 _dl_find_object F
> >  GLIBC_2.35 epoll_pwait2 F
> >  GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F
> > +GLIBC_2.36 __memsetzero F
> > diff --git a/sysdeps/unix/sysv/linux/alpha/libc.abilist b/sysdeps/unix/sysv/linux/alpha/libc.abilist
> > index e7e4cf7d2a..1714ca23fe 100644
> > --- a/sysdeps/unix/sysv/linux/alpha/libc.abilist
> > +++ b/sysdeps/unix/sysv/linux/alpha/libc.abilist
> > @@ -2713,6 +2713,7 @@ GLIBC_2.35 __memcmpeq F
> >  GLIBC_2.35 _dl_find_object F
> >  GLIBC_2.35 epoll_pwait2 F
> >  GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F
> > +GLIBC_2.36 __memsetzero F
> >  GLIBC_2.4 _IO_fprintf F
> >  GLIBC_2.4 _IO_printf F
> >  GLIBC_2.4 _IO_sprintf F
> > diff --git a/sysdeps/unix/sysv/linux/arc/libc.abilist b/sysdeps/unix/sysv/linux/arc/libc.abilist
> > index bc3d228e31..8891587282 100644
> > --- a/sysdeps/unix/sysv/linux/arc/libc.abilist
> > +++ b/sysdeps/unix/sysv/linux/arc/libc.abilist
> > @@ -2377,3 +2377,4 @@ GLIBC_2.35 __memcmpeq F
> >  GLIBC_2.35 _dl_find_object F
> >  GLIBC_2.35 epoll_pwait2 F
> >  GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F
> > +GLIBC_2.36 __memsetzero F
> > diff --git a/sysdeps/unix/sysv/linux/arm/be/libc.abilist b/sysdeps/unix/sysv/linux/arm/be/libc.abilist
> > index db7039c4ab..4adeec6ca6 100644
> > --- a/sysdeps/unix/sysv/linux/arm/be/libc.abilist
> > +++ b/sysdeps/unix/sysv/linux/arm/be/libc.abilist
> > @@ -496,6 +496,7 @@ GLIBC_2.35 __memcmpeq F
> >  GLIBC_2.35 _dl_find_object F
> >  GLIBC_2.35 epoll_pwait2 F
> >  GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F
> > +GLIBC_2.36 __memsetzero F
> >  GLIBC_2.4 _Exit F
> >  GLIBC_2.4 _IO_2_1_stderr_ D 0xa0
> >  GLIBC_2.4 _IO_2_1_stdin_ D 0xa0
> > diff --git a/sysdeps/unix/sysv/linux/arm/le/libc.abilist b/sysdeps/unix/sysv/linux/arm/le/libc.abilist
> > index d2add4fb49..1b2573e690 100644
> > --- a/sysdeps/unix/sysv/linux/arm/le/libc.abilist
> > +++ b/sysdeps/unix/sysv/linux/arm/le/libc.abilist
> > @@ -493,6 +493,7 @@ GLIBC_2.35 __memcmpeq F
> >  GLIBC_2.35 _dl_find_object F
> >  GLIBC_2.35 epoll_pwait2 F
> >  GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F
> > +GLIBC_2.36 __memsetzero F
> >  GLIBC_2.4 _Exit F
> >  GLIBC_2.4 _IO_2_1_stderr_ D 0xa0
> >  GLIBC_2.4 _IO_2_1_stdin_ D 0xa0
> > diff --git a/sysdeps/unix/sysv/linux/csky/libc.abilist b/sysdeps/unix/sysv/linux/csky/libc.abilist
> > index 355d72a30c..f3dab9746f 100644
> > --- a/sysdeps/unix/sysv/linux/csky/libc.abilist
> > +++ b/sysdeps/unix/sysv/linux/csky/libc.abilist
> > @@ -2652,3 +2652,4 @@ GLIBC_2.35 __memcmpeq F
> >  GLIBC_2.35 _dl_find_object F
> >  GLIBC_2.35 epoll_pwait2 F
> >  GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F
> > +GLIBC_2.36 __memsetzero F
> > diff --git a/sysdeps/unix/sysv/linux/hppa/libc.abilist b/sysdeps/unix/sysv/linux/hppa/libc.abilist
> > index 3df39bb28c..21e22081fe 100644
> > --- a/sysdeps/unix/sysv/linux/hppa/libc.abilist
> > +++ b/sysdeps/unix/sysv/linux/hppa/libc.abilist
> > @@ -2601,6 +2601,7 @@ GLIBC_2.35 __memcmpeq F
> >  GLIBC_2.35 _dl_find_object F
> >  GLIBC_2.35 epoll_pwait2 F
> >  GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F
> > +GLIBC_2.36 __memsetzero F
> >  GLIBC_2.4 __confstr_chk F
> >  GLIBC_2.4 __fgets_chk F
> >  GLIBC_2.4 __fgets_unlocked_chk F
> > diff --git a/sysdeps/unix/sysv/linux/i386/libc.abilist b/sysdeps/unix/sysv/linux/i386/libc.abilist
> > index c4da358f80..43b37f2ef1 100644
> > --- a/sysdeps/unix/sysv/linux/i386/libc.abilist
> > +++ b/sysdeps/unix/sysv/linux/i386/libc.abilist
> > @@ -2785,6 +2785,7 @@ GLIBC_2.35 __memcmpeq F
> >  GLIBC_2.35 _dl_find_object F
> >  GLIBC_2.35 epoll_pwait2 F
> >  GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F
> > +GLIBC_2.36 __memsetzero F
> >  GLIBC_2.4 __confstr_chk F
> >  GLIBC_2.4 __fgets_chk F
> >  GLIBC_2.4 __fgets_unlocked_chk F
> > diff --git a/sysdeps/unix/sysv/linux/ia64/libc.abilist b/sysdeps/unix/sysv/linux/ia64/libc.abilist
> > index 241bac70ea..2ee6184fab 100644
> > --- a/sysdeps/unix/sysv/linux/ia64/libc.abilist
> > +++ b/sysdeps/unix/sysv/linux/ia64/libc.abilist
> > @@ -2551,6 +2551,7 @@ GLIBC_2.35 __memcmpeq F
> >  GLIBC_2.35 _dl_find_object F
> >  GLIBC_2.35 epoll_pwait2 F
> >  GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F
> > +GLIBC_2.36 __memsetzero F
> >  GLIBC_2.4 __confstr_chk F
> >  GLIBC_2.4 __fgets_chk F
> >  GLIBC_2.4 __fgets_unlocked_chk F
> > diff --git a/sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist b/sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist
> > index 78bf372b72..fc43c9d49c 100644
> > --- a/sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist
> > +++ b/sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist
> > @@ -497,6 +497,7 @@ GLIBC_2.35 __memcmpeq F
> >  GLIBC_2.35 _dl_find_object F
> >  GLIBC_2.35 epoll_pwait2 F
> >  GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F
> > +GLIBC_2.36 __memsetzero F
> >  GLIBC_2.4 _Exit F
> >  GLIBC_2.4 _IO_2_1_stderr_ D 0x98
> >  GLIBC_2.4 _IO_2_1_stdin_ D 0x98
> > diff --git a/sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist b/sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist
> > index 00df5c901f..f0e94f92bd 100644
> > --- a/sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist
> > +++ b/sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist
> > @@ -2728,6 +2728,7 @@ GLIBC_2.35 __memcmpeq F
> >  GLIBC_2.35 _dl_find_object F
> >  GLIBC_2.35 epoll_pwait2 F
> >  GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F
> > +GLIBC_2.36 __memsetzero F
> >  GLIBC_2.4 __confstr_chk F
> >  GLIBC_2.4 __fgets_chk F
> >  GLIBC_2.4 __fgets_unlocked_chk F
> > diff --git a/sysdeps/unix/sysv/linux/microblaze/be/libc.abilist b/sysdeps/unix/sysv/linux/microblaze/be/libc.abilist
> > index e8118569c3..7b309378da 100644
> > --- a/sysdeps/unix/sysv/linux/microblaze/be/libc.abilist
> > +++ b/sysdeps/unix/sysv/linux/microblaze/be/libc.abilist
> > @@ -2701,3 +2701,4 @@ GLIBC_2.35 __memcmpeq F
> >  GLIBC_2.35 _dl_find_object F
> >  GLIBC_2.35 epoll_pwait2 F
> >  GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F
> > +GLIBC_2.36 __memsetzero F
> > diff --git a/sysdeps/unix/sysv/linux/microblaze/le/libc.abilist b/sysdeps/unix/sysv/linux/microblaze/le/libc.abilist
> > index c0d2373e64..6d414b32dc 100644
> > --- a/sysdeps/unix/sysv/linux/microblaze/le/libc.abilist
> > +++ b/sysdeps/unix/sysv/linux/microblaze/le/libc.abilist
> > @@ -2698,3 +2698,4 @@ GLIBC_2.35 __memcmpeq F
> >  GLIBC_2.35 _dl_find_object F
> >  GLIBC_2.35 epoll_pwait2 F
> >  GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F
> > +GLIBC_2.36 __memsetzero F
> > diff --git a/sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist b/sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist
> > index 2d0fd04f54..0c12abffa1 100644
> > --- a/sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist
> > +++ b/sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist
> > @@ -2693,6 +2693,7 @@ GLIBC_2.35 __memcmpeq F
> >  GLIBC_2.35 _dl_find_object F
> >  GLIBC_2.35 epoll_pwait2 F
> >  GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F
> > +GLIBC_2.36 __memsetzero F
> >  GLIBC_2.4 __confstr_chk F
> >  GLIBC_2.4 __fgets_chk F
> >  GLIBC_2.4 __fgets_unlocked_chk F
> > diff --git a/sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist b/sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist
> > index e39ccfb312..1876d86269 100644
> > --- a/sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist
> > +++ b/sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist
> > @@ -2691,6 +2691,7 @@ GLIBC_2.35 __memcmpeq F
> >  GLIBC_2.35 _dl_find_object F
> >  GLIBC_2.35 epoll_pwait2 F
> >  GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F
> > +GLIBC_2.36 __memsetzero F
> >  GLIBC_2.4 __confstr_chk F
> >  GLIBC_2.4 __fgets_chk F
> >  GLIBC_2.4 __fgets_unlocked_chk F
> > diff --git a/sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist b/sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist
> > index 1e900f86e4..301941d0cc 100644
> > --- a/sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist
> > +++ b/sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist
> > @@ -2699,6 +2699,7 @@ GLIBC_2.35 __memcmpeq F
> >  GLIBC_2.35 _dl_find_object F
> >  GLIBC_2.35 epoll_pwait2 F
> >  GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F
> > +GLIBC_2.36 __memsetzero F
> >  GLIBC_2.4 __confstr_chk F
> >  GLIBC_2.4 __fgets_chk F
> >  GLIBC_2.4 __fgets_unlocked_chk F
> > diff --git a/sysdeps/unix/sysv/linux/mips/mips64/n64/libc.abilist b/sysdeps/unix/sysv/linux/mips/mips64/n64/libc.abilist
> > index 9145ba7931..906491a531 100644
> > --- a/sysdeps/unix/sysv/linux/mips/mips64/n64/libc.abilist
> > +++ b/sysdeps/unix/sysv/linux/mips/mips64/n64/libc.abilist
> > @@ -2602,6 +2602,7 @@ GLIBC_2.35 __memcmpeq F
> >  GLIBC_2.35 _dl_find_object F
> >  GLIBC_2.35 epoll_pwait2 F
> >  GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F
> > +GLIBC_2.36 __memsetzero F
> >  GLIBC_2.4 __confstr_chk F
> >  GLIBC_2.4 __fgets_chk F
> >  GLIBC_2.4 __fgets_unlocked_chk F
> > diff --git a/sysdeps/unix/sysv/linux/nios2/libc.abilist b/sysdeps/unix/sysv/linux/nios2/libc.abilist
> > index e95d60d926..13b9299c87 100644
> > --- a/sysdeps/unix/sysv/linux/nios2/libc.abilist
> > +++ b/sysdeps/unix/sysv/linux/nios2/libc.abilist
> > @@ -2740,3 +2740,4 @@ GLIBC_2.35 __memcmpeq F
> >  GLIBC_2.35 _dl_find_object F
> >  GLIBC_2.35 epoll_pwait2 F
> >  GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F
> > +GLIBC_2.36 __memsetzero F
> > diff --git a/sysdeps/unix/sysv/linux/or1k/libc.abilist b/sysdeps/unix/sysv/linux/or1k/libc.abilist
> > index ca934e374b..3cc2db60a5 100644
> > --- a/sysdeps/unix/sysv/linux/or1k/libc.abilist
> > +++ b/sysdeps/unix/sysv/linux/or1k/libc.abilist
> > @@ -2123,3 +2123,4 @@ GLIBC_2.35 wprintf F
> >  GLIBC_2.35 write F
> >  GLIBC_2.35 writev F
> >  GLIBC_2.35 wscanf F
> > +GLIBC_2.36 __memsetzero F
> > diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist
> > index 3820b9f235..fab9acf53f 100644
> > --- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist
> > +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist
> > @@ -2755,6 +2755,7 @@ GLIBC_2.35 __memcmpeq F
> >  GLIBC_2.35 _dl_find_object F
> >  GLIBC_2.35 epoll_pwait2 F
> >  GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F
> > +GLIBC_2.36 __memsetzero F
> >  GLIBC_2.4 _IO_fprintf F
> >  GLIBC_2.4 _IO_printf F
> >  GLIBC_2.4 _IO_sprintf F
> > diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist
> > index 464dc27fcd..fd2d98b1e6 100644
> > --- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist
> > +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist
> > @@ -2788,6 +2788,7 @@ GLIBC_2.35 __memcmpeq F
> >  GLIBC_2.35 _dl_find_object F
> >  GLIBC_2.35 epoll_pwait2 F
> >  GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F
> > +GLIBC_2.36 __memsetzero F
> >  GLIBC_2.4 _IO_fprintf F
> >  GLIBC_2.4 _IO_printf F
> >  GLIBC_2.4 _IO_sprintf F
> > diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/libc.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/libc.abilist
> > index 2f7e58747f..24b8f2ad81 100644
> > --- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/libc.abilist
> > +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/libc.abilist
> > @@ -2510,6 +2510,7 @@ GLIBC_2.35 __memcmpeq F
> >  GLIBC_2.35 _dl_find_object F
> >  GLIBC_2.35 epoll_pwait2 F
> >  GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F
> > +GLIBC_2.36 __memsetzero F
> >  GLIBC_2.4 _IO_fprintf F
> >  GLIBC_2.4 _IO_printf F
> >  GLIBC_2.4 _IO_sprintf F
> > diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/libc.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/libc.abilist
> > index 4f3043d913..50a36c4e52 100644
> > --- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/libc.abilist
> > +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/libc.abilist
> > @@ -2812,3 +2812,4 @@ GLIBC_2.35 __memcmpeq F
> >  GLIBC_2.35 _dl_find_object F
> >  GLIBC_2.35 epoll_pwait2 F
> >  GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F
> > +GLIBC_2.36 __memsetzero F
> > diff --git a/sysdeps/unix/sysv/linux/riscv/rv32/libc.abilist b/sysdeps/unix/sysv/linux/riscv/rv32/libc.abilist
> > index 84b6ac815a..da5f3f83e0 100644
> > --- a/sysdeps/unix/sysv/linux/riscv/rv32/libc.abilist
> > +++ b/sysdeps/unix/sysv/linux/riscv/rv32/libc.abilist
> > @@ -2379,3 +2379,4 @@ GLIBC_2.35 __memcmpeq F
> >  GLIBC_2.35 _dl_find_object F
> >  GLIBC_2.35 epoll_pwait2 F
> >  GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F
> > +GLIBC_2.36 __memsetzero F
> > diff --git a/sysdeps/unix/sysv/linux/riscv/rv64/libc.abilist b/sysdeps/unix/sysv/linux/riscv/rv64/libc.abilist
> > index 4d5c19c56a..f8477073b2 100644
> > --- a/sysdeps/unix/sysv/linux/riscv/rv64/libc.abilist
> > +++ b/sysdeps/unix/sysv/linux/riscv/rv64/libc.abilist
> > @@ -2579,3 +2579,4 @@ GLIBC_2.35 __memcmpeq F
> >  GLIBC_2.35 _dl_find_object F
> >  GLIBC_2.35 epoll_pwait2 F
> >  GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F
> > +GLIBC_2.36 __memsetzero F
> > diff --git a/sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist b/sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist
> > index 7c5ee8d569..92a70e2473 100644
> > --- a/sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist
> > +++ b/sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist
> > @@ -2753,6 +2753,7 @@ GLIBC_2.35 __memcmpeq F
> >  GLIBC_2.35 _dl_find_object F
> >  GLIBC_2.35 epoll_pwait2 F
> >  GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F
> > +GLIBC_2.36 __memsetzero F
> >  GLIBC_2.4 _IO_fprintf F
> >  GLIBC_2.4 _IO_printf F
> >  GLIBC_2.4 _IO_sprintf F
> > diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist b/sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist
> > index 50de0b46cf..8dfb6ccdc5 100644
> > --- a/sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist
> > +++ b/sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist
> > @@ -2547,6 +2547,7 @@ GLIBC_2.35 __memcmpeq F
> >  GLIBC_2.35 _dl_find_object F
> >  GLIBC_2.35 epoll_pwait2 F
> >  GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F
> > +GLIBC_2.36 __memsetzero F
> >  GLIBC_2.4 _IO_fprintf F
> >  GLIBC_2.4 _IO_printf F
> >  GLIBC_2.4 _IO_sprintf F
> > diff --git a/sysdeps/unix/sysv/linux/sh/be/libc.abilist b/sysdeps/unix/sysv/linux/sh/be/libc.abilist
> > index 66fba013ca..3c7c4b79d6 100644
> > --- a/sysdeps/unix/sysv/linux/sh/be/libc.abilist
> > +++ b/sysdeps/unix/sysv/linux/sh/be/libc.abilist
> > @@ -2608,6 +2608,7 @@ GLIBC_2.35 __memcmpeq F
> >  GLIBC_2.35 _dl_find_object F
> >  GLIBC_2.35 epoll_pwait2 F
> >  GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F
> > +GLIBC_2.36 __memsetzero F
> >  GLIBC_2.4 __confstr_chk F
> >  GLIBC_2.4 __fgets_chk F
> >  GLIBC_2.4 __fgets_unlocked_chk F
> > diff --git a/sysdeps/unix/sysv/linux/sh/le/libc.abilist b/sysdeps/unix/sysv/linux/sh/le/libc.abilist
> > index 38703f8aa0..48b4993fb6 100644
> > --- a/sysdeps/unix/sysv/linux/sh/le/libc.abilist
> > +++ b/sysdeps/unix/sysv/linux/sh/le/libc.abilist
> > @@ -2605,6 +2605,7 @@ GLIBC_2.35 __memcmpeq F
> >  GLIBC_2.35 _dl_find_object F
> >  GLIBC_2.35 epoll_pwait2 F
> >  GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F
> > +GLIBC_2.36 __memsetzero F
> >  GLIBC_2.4 __confstr_chk F
> >  GLIBC_2.4 __fgets_chk F
> >  GLIBC_2.4 __fgets_unlocked_chk F
> > diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist b/sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist
> > index 6df55eb765..011b7cda7e 100644
> > --- a/sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist
> > +++ b/sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist
> > @@ -2748,6 +2748,7 @@ GLIBC_2.35 __memcmpeq F
> >  GLIBC_2.35 _dl_find_object F
> >  GLIBC_2.35 epoll_pwait2 F
> >  GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F
> > +GLIBC_2.36 __memsetzero F
> >  GLIBC_2.4 _IO_fprintf F
> >  GLIBC_2.4 _IO_printf F
> >  GLIBC_2.4 _IO_sprintf F
> > diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist b/sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist
> > index b90569d881..b1156d801e 100644
> > --- a/sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist
> > +++ b/sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist
> > @@ -2574,6 +2574,7 @@ GLIBC_2.35 __memcmpeq F
> >  GLIBC_2.35 _dl_find_object F
> >  GLIBC_2.35 epoll_pwait2 F
> >  GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F
> > +GLIBC_2.36 __memsetzero F
> >  GLIBC_2.4 __confstr_chk F
> >  GLIBC_2.4 __fgets_chk F
> >  GLIBC_2.4 __fgets_unlocked_chk F
> > diff --git a/sysdeps/unix/sysv/linux/x86_64/64/libc.abilist b/sysdeps/unix/sysv/linux/x86_64/64/libc.abilist
> > index e88b0f101f..d7c7667768 100644
> > --- a/sysdeps/unix/sysv/linux/x86_64/64/libc.abilist
> > +++ b/sysdeps/unix/sysv/linux/x86_64/64/libc.abilist
> > @@ -2525,6 +2525,7 @@ GLIBC_2.35 __memcmpeq F
> >  GLIBC_2.35 _dl_find_object F
> >  GLIBC_2.35 epoll_pwait2 F
> >  GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F
> > +GLIBC_2.36 __memsetzero F
> >  GLIBC_2.4 __confstr_chk F
> >  GLIBC_2.4 __fgets_chk F
> >  GLIBC_2.4 __fgets_unlocked_chk F
> > diff --git a/sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist b/sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist
> > index e0755272eb..67619a0d9a 100644
> > --- a/sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist
> > +++ b/sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist
> > @@ -2631,3 +2631,4 @@ GLIBC_2.35 __memcmpeq F
> >  GLIBC_2.35 _dl_find_object F
> >  GLIBC_2.35 epoll_pwait2 F
> >  GLIBC_2.35 posix_spawn_file_actions_addtcsetpgrp_np F
> > +GLIBC_2.36 __memsetzero F
> > diff --git a/sysdeps/x86_64/memset.S b/sysdeps/x86_64/memset.S
> > index af26e9cedc..d1ed63c554 100644
> > --- a/sysdeps/x86_64/memset.S
> > +++ b/sysdeps/x86_64/memset.S
> > @@ -1,4 +1,4 @@
> > -/* memset/bzero -- set memory area to CH/0
> > +/* memset/__memsetzero -- set memory area to CH/0
> >     Optimized version for x86-64.
> >     Copyright (C) 2002-2022 Free Software Foundation, Inc.
> >     This file is part of the GNU C Library.
> > @@ -35,7 +35,7 @@
> >    punpcklwd %xmm0, %xmm0; \
> >    pshufd $0, %xmm0, %xmm0
> >
> > -# define BZERO_ZERO_VEC0() \
> > +# define MEMSETZERO_ZERO_VEC0() \
> >    pxor %xmm0, %xmm0
> >
> >  # define WMEMSET_SET_VEC0_AND_SET_RETURN(d, r) \
> > @@ -56,8 +56,8 @@
> >  # define MEMSET_SYMBOL(p,s)    memset
> >  #endif
> >
> > -#ifndef BZERO_SYMBOL
> > -# define BZERO_SYMBOL(p,s)     __bzero
> > +#ifndef MEMSETZERO_SYMBOL
> > +# define MEMSETZERO_SYMBOL(p,s)        __memsetzero
> >  #endif
> >
> >  #ifndef WMEMSET_SYMBOL
> > @@ -70,7 +70,8 @@
> >  libc_hidden_builtin_def (memset)
> >
> >  #if IS_IN (libc)
> > -weak_alias (__bzero, bzero)
> > +weak_alias (__memsetzero, bzero)
> > +strong_alias (__memsetzero, __bzero)
> >  libc_hidden_def (__wmemset)
> >  weak_alias (__wmemset, wmemset)
> >  libc_hidden_weak (wmemset)
> > diff --git a/sysdeps/x86_64/memsetzero.S b/sysdeps/x86_64/memsetzero.S
> > new file mode 100644
> > index 0000000000..f96d567fd8
> > --- /dev/null
> > +++ b/sysdeps/x86_64/memsetzero.S
> > @@ -0,0 +1 @@
> > +/* Implemented in memset.S.  */
> > diff --git a/sysdeps/x86_64/multiarch/Makefile b/sysdeps/x86_64/multiarch/Makefile
> > index e7b413edad..4274bfdd0d 100644
> > --- a/sysdeps/x86_64/multiarch/Makefile
> > +++ b/sysdeps/x86_64/multiarch/Makefile
> > @@ -1,7 +1,6 @@
> >  ifeq ($(subdir),string)
> >
> >  sysdep_routines += \
> > -  bzero \
> >    memchr-avx2 \
> >    memchr-avx2-rtm \
> >    memchr-evex \
> > diff --git a/sysdeps/x86_64/multiarch/ifunc-impl-list.c b/sysdeps/x86_64/multiarch/ifunc-impl-list.c
> > index a594f4176e..2144cf58c0 100644
> > --- a/sysdeps/x86_64/multiarch/ifunc-impl-list.c
> > +++ b/sysdeps/x86_64/multiarch/ifunc-impl-list.c
> > @@ -300,46 +300,46 @@ __libc_ifunc_impl_list (const char *name, struct libc_ifunc_impl *array,
> >                               __memset_avx512_no_vzeroupper)
> >              )
> >
> > -  /* Support sysdeps/x86_64/multiarch/bzero.c.  */
> > -  IFUNC_IMPL (i, name, bzero,
> > -             IFUNC_IMPL_ADD (array, i, bzero, 1,
> > -                             __bzero_sse2_unaligned)
> > -             IFUNC_IMPL_ADD (array, i, bzero, 1,
> > -                             __bzero_sse2_unaligned_erms)
> > -             IFUNC_IMPL_ADD (array, i, bzero,
> > +  /* Support sysdeps/x86_64/multiarch/memsetzero.c.  */
> > +  IFUNC_IMPL (i, name, __memsetzero,
> > +             IFUNC_IMPL_ADD (array, i, __memsetzero, 1,
> > +                             __memsetzero_sse2_unaligned)
> > +             IFUNC_IMPL_ADD (array, i, __memsetzero, 1,
> > +                             __memsetzero_sse2_unaligned_erms)
> > +             IFUNC_IMPL_ADD (array, i, __memsetzero,
> >                               CPU_FEATURE_USABLE (AVX2),
> > -                             __bzero_avx2_unaligned)
> > -             IFUNC_IMPL_ADD (array, i, bzero,
> > +                             __memsetzero_avx2_unaligned)
> > +             IFUNC_IMPL_ADD (array, i, __memsetzero,
> >                               CPU_FEATURE_USABLE (AVX2),
> > -                             __bzero_avx2_unaligned_erms)
> > -             IFUNC_IMPL_ADD (array, i, bzero,
> > +                             __memsetzero_avx2_unaligned_erms)
> > +             IFUNC_IMPL_ADD (array, i, __memsetzero,
> >                               (CPU_FEATURE_USABLE (AVX2)
> >                                && CPU_FEATURE_USABLE (RTM)),
> > -                             __bzero_avx2_unaligned_rtm)
> > -             IFUNC_IMPL_ADD (array, i, bzero,
> > +                             __memsetzero_avx2_unaligned_rtm)
> > +             IFUNC_IMPL_ADD (array, i, __memsetzero,
> >                               (CPU_FEATURE_USABLE (AVX2)
> >                                && CPU_FEATURE_USABLE (RTM)),
> > -                             __bzero_avx2_unaligned_erms_rtm)
> > -             IFUNC_IMPL_ADD (array, i, bzero,
> > +                             __memsetzero_avx2_unaligned_erms_rtm)
> > +             IFUNC_IMPL_ADD (array, i, __memsetzero,
> >                               (CPU_FEATURE_USABLE (AVX512VL)
> >                                && CPU_FEATURE_USABLE (AVX512BW)
> >                                && CPU_FEATURE_USABLE (BMI2)),
> > -                             __bzero_evex_unaligned)
> > -             IFUNC_IMPL_ADD (array, i, bzero,
> > +                             __memsetzero_evex_unaligned)
> > +             IFUNC_IMPL_ADD (array, i, __memsetzero,
> >                               (CPU_FEATURE_USABLE (AVX512VL)
> >                                && CPU_FEATURE_USABLE (AVX512BW)
> >                                && CPU_FEATURE_USABLE (BMI2)),
> > -                             __bzero_evex_unaligned_erms)
> > -             IFUNC_IMPL_ADD (array, i, bzero,
> > +                             __memsetzero_evex_unaligned_erms)
> > +             IFUNC_IMPL_ADD (array, i, __memsetzero,
> >                               (CPU_FEATURE_USABLE (AVX512VL)
> >                                && CPU_FEATURE_USABLE (AVX512BW)
> >                                && CPU_FEATURE_USABLE (BMI2)),
> > -                             __bzero_avx512_unaligned_erms)
> > -             IFUNC_IMPL_ADD (array, i, bzero,
> > +                             __memsetzero_avx512_unaligned_erms)
> > +             IFUNC_IMPL_ADD (array, i, __memsetzero,
> >                               (CPU_FEATURE_USABLE (AVX512VL)
> >                                && CPU_FEATURE_USABLE (AVX512BW)
> >                                && CPU_FEATURE_USABLE (BMI2)),
> > -                             __bzero_avx512_unaligned)
> > +                             __memsetzero_avx512_unaligned)
> >              )
> >
> >    /* Support sysdeps/x86_64/multiarch/rawmemchr.c.  */
> > diff --git a/sysdeps/x86_64/multiarch/memset-avx2-unaligned-erms-rtm.S b/sysdeps/x86_64/multiarch/memset-avx2-unaligned-erms-rtm.S
> > index 5a5ee6f672..a3da136a09 100644
> > --- a/sysdeps/x86_64/multiarch/memset-avx2-unaligned-erms-rtm.S
> > +++ b/sysdeps/x86_64/multiarch/memset-avx2-unaligned-erms-rtm.S
> > @@ -5,7 +5,7 @@
> >
> >  #define SECTION(p) p##.avx.rtm
> >  #define MEMSET_SYMBOL(p,s)     p##_avx2_##s##_rtm
> > -#define BZERO_SYMBOL(p,s)      p##_avx2_##s##_rtm
> > +#define MEMSETZERO_SYMBOL(p,s) p##_avx2_##s##_rtm
> >  #define WMEMSET_SYMBOL(p,s)    p##_avx2_##s##_rtm
> >
> >  #include "memset-avx2-unaligned-erms.S"
> > diff --git a/sysdeps/x86_64/multiarch/memset-avx2-unaligned-erms.S b/sysdeps/x86_64/multiarch/memset-avx2-unaligned-erms.S
> > index a093a2831f..7df4c7ae7c 100644
> > --- a/sysdeps/x86_64/multiarch/memset-avx2-unaligned-erms.S
> > +++ b/sysdeps/x86_64/multiarch/memset-avx2-unaligned-erms.S
> > @@ -14,7 +14,7 @@
> >    vmovd d, %xmm0; \
> >    movq r, %rax;
> >
> > -# define BZERO_ZERO_VEC0() \
> > +# define MEMSETZERO_ZERO_VEC0() \
> >    vpxor %xmm0, %xmm0, %xmm0
> >
> >  # define WMEMSET_SET_VEC0_AND_SET_RETURN(d, r) \
> > @@ -32,8 +32,8 @@
> >  # ifndef MEMSET_SYMBOL
> >  #  define MEMSET_SYMBOL(p,s)   p##_avx2_##s
> >  # endif
> > -# ifndef BZERO_SYMBOL
> > -#  define BZERO_SYMBOL(p,s)    p##_avx2_##s
> > +# ifndef MEMSETZERO_SYMBOL
> > +#  define MEMSETZERO_SYMBOL(p,s) p##_avx2_##s
> >  # endif
> >  # ifndef WMEMSET_SYMBOL
> >  #  define WMEMSET_SYMBOL(p,s)  p##_avx2_##s
> > diff --git a/sysdeps/x86_64/multiarch/memset-avx512-unaligned-erms.S b/sysdeps/x86_64/multiarch/memset-avx512-unaligned-erms.S
> > index 727c92133a..cf0f27424c 100644
> > --- a/sysdeps/x86_64/multiarch/memset-avx512-unaligned-erms.S
> > +++ b/sysdeps/x86_64/multiarch/memset-avx512-unaligned-erms.S
> > @@ -19,7 +19,7 @@
> >    vpbroadcastb d, %VEC0; \
> >    movq r, %rax
> >
> > -# define BZERO_ZERO_VEC0() \
> > +# define MEMSETZERO_ZERO_VEC0() \
> >    vpxorq %XMM0, %XMM0, %XMM0
> >
> >  # define WMEMSET_SET_VEC0_AND_SET_RETURN(d, r) \
> > diff --git a/sysdeps/x86_64/multiarch/memset-evex-unaligned-erms.S b/sysdeps/x86_64/multiarch/memset-evex-unaligned-erms.S
> > index 5d8fa78f05..96ffa0a29e 100644
> > --- a/sysdeps/x86_64/multiarch/memset-evex-unaligned-erms.S
> > +++ b/sysdeps/x86_64/multiarch/memset-evex-unaligned-erms.S
> > @@ -19,7 +19,7 @@
> >    vpbroadcastb d, %VEC0; \
> >    movq r, %rax
> >
> > -# define BZERO_ZERO_VEC0() \
> > +# define MEMSETZERO_ZERO_VEC0() \
> >    vpxorq %XMM0, %XMM0, %XMM0
> >
> >  # define WMEMSET_SET_VEC0_AND_SET_RETURN(d, r) \
> > diff --git a/sysdeps/x86_64/multiarch/memset-sse2-unaligned-erms.S b/sysdeps/x86_64/multiarch/memset-sse2-unaligned-erms.S
> > index 329c58ee46..eb1f5a4928 100644
> > --- a/sysdeps/x86_64/multiarch/memset-sse2-unaligned-erms.S
> > +++ b/sysdeps/x86_64/multiarch/memset-sse2-unaligned-erms.S
> > @@ -22,7 +22,7 @@
> >
> >  #if IS_IN (libc)
> >  # define MEMSET_SYMBOL(p,s)    p##_sse2_##s
> > -# define BZERO_SYMBOL(p,s)     MEMSET_SYMBOL (p, s)
> > +# define MEMSETZERO_SYMBOL(p,s)        MEMSET_SYMBOL (p, s)
> >  # define WMEMSET_SYMBOL(p,s)   p##_sse2_##s
> >
> >  # ifdef SHARED
> > diff --git a/sysdeps/x86_64/multiarch/memset-vec-unaligned-erms.S b/sysdeps/x86_64/multiarch/memset-vec-unaligned-erms.S
> > index 785fee1d57..3db1b3f7d5 100644
> > --- a/sysdeps/x86_64/multiarch/memset-vec-unaligned-erms.S
> > +++ b/sysdeps/x86_64/multiarch/memset-vec-unaligned-erms.S
> > @@ -1,4 +1,4 @@
> > -/* memset/bzero with unaligned store and rep stosb
> > +/* memset/__memsetzero with unaligned store and rep stosb
> >     Copyright (C) 2016-2022 Free Software Foundation, Inc.
> >     This file is part of the GNU C Library.
> >
> > @@ -26,8 +26,8 @@
> >
> >  #include <sysdep.h>
> >
> > -#ifndef BZERO_SYMBOL
> > -# define BZERO_SYMBOL(p,s)             MEMSET_SYMBOL (p, s)
> > +#ifndef MEMSETZERO_SYMBOL
> > +# define MEMSETZERO_SYMBOL(p,s)                MEMSET_SYMBOL (p, s)
> >  #endif
> >
> >  #ifndef MEMSET_CHK_SYMBOL
> > @@ -134,9 +134,9 @@ ENTRY (WMEMSET_SYMBOL (__wmemset, unaligned))
> >  END (WMEMSET_SYMBOL (__wmemset, unaligned))
> >  #endif
> >
> > -ENTRY (BZERO_SYMBOL(__bzero, unaligned))
> > +ENTRY (MEMSETZERO_SYMBOL(__memsetzero, unaligned))
> >  #if VEC_SIZE > 16
> > -       BZERO_ZERO_VEC0 ()
> > +       MEMSETZERO_ZERO_VEC0 ()
> >  #endif
> >         mov     %RDI_LP, %RAX_LP
> >         mov     %RSI_LP, %RDX_LP
> > @@ -149,7 +149,7 @@ ENTRY (BZERO_SYMBOL(__bzero, unaligned))
> >         xorl    %esi, %esi
> >  #endif
> >  #if VEC_SIZE <= 16
> > -       BZERO_ZERO_VEC0 ()
> > +       MEMSETZERO_ZERO_VEC0 ()
> >  #endif
> >         cmp     $(VEC_SIZE * 2), %RDX_LP
> >         ja      L(more_2x_vec)
> > @@ -157,7 +157,7 @@ ENTRY (BZERO_SYMBOL(__bzero, unaligned))
> >         VMOVU   %VEC(0), (%rdi)
> >         VMOVU   %VEC(0), (VEC_SIZE * -1)(%rdi, %rdx)
> >         VZEROUPPER_RETURN
> > -END (BZERO_SYMBOL(__bzero, unaligned))
> > +END (MEMSETZERO_SYMBOL(__memsetzero, unaligned))
> >
> >  #if defined SHARED && IS_IN (libc)
> >  ENTRY_CHK (MEMSET_CHK_SYMBOL (__memset_chk, unaligned))
> > @@ -216,9 +216,9 @@ END (__memset_erms)
> >  END (MEMSET_SYMBOL (__memset, erms))
> >  # endif
> >
> > -ENTRY_P2ALIGN (BZERO_SYMBOL(__bzero, unaligned_erms), 6)
> > +ENTRY_P2ALIGN (MEMSETZERO_SYMBOL(__memsetzero, unaligned_erms), 6)
> >  # if VEC_SIZE > 16
> > -       BZERO_ZERO_VEC0 ()
> > +       MEMSETZERO_ZERO_VEC0 ()
> >  # endif
> >         mov     %RDI_LP, %RAX_LP
> >         mov     %RSI_LP, %RDX_LP
> > @@ -231,7 +231,7 @@ ENTRY_P2ALIGN (BZERO_SYMBOL(__bzero, unaligned_erms), 6)
> >         xorl    %esi, %esi
> >  # endif
> >  # if VEC_SIZE <= 16
> > -       BZERO_ZERO_VEC0 ()
> > +       MEMSETZERO_ZERO_VEC0 ()
> >  # endif
> >         cmp     $(VEC_SIZE * 2), %RDX_LP
> >         ja      L(stosb_more_2x_vec)
> > @@ -239,7 +239,7 @@ ENTRY_P2ALIGN (BZERO_SYMBOL(__bzero, unaligned_erms), 6)
> >         VMOVU   %VEC(0), (%rdi)
> >         VMOVU   %VEC(0), (VEC_SIZE * -1)(%rdi, %rdx)
> >         VZEROUPPER_RETURN
> > -END (BZERO_SYMBOL(__bzero, unaligned_erms))
> > +END (MEMSETZERO_SYMBOL(__memsetzero, unaligned_erms))
> >
> >  # if defined SHARED && IS_IN (libc)
> >  ENTRY_CHK (MEMSET_CHK_SYMBOL (__memset_chk, unaligned_erms))
> > diff --git a/sysdeps/x86_64/multiarch/bzero.c b/sysdeps/x86_64/multiarch/memsetzero.c
> > similarity index 85%
> > rename from sysdeps/x86_64/multiarch/bzero.c
> > rename to sysdeps/x86_64/multiarch/memsetzero.c
> > index 58a14b2c33..ae4f0209fc 100644
> > --- a/sysdeps/x86_64/multiarch/bzero.c
> > +++ b/sysdeps/x86_64/multiarch/memsetzero.c
> > @@ -1,4 +1,4 @@
> > -/* Multiple versions of bzero.
> > +/* Multiple versions of __memsetzero.
> >     All versions must be listed in ifunc-impl-list.c.
> >     Copyright (C) 2022 Free Software Foundation, Inc.
> >     This file is part of the GNU C Library.
> > @@ -19,11 +19,11 @@
> >
> >  /* Define multiple versions only for the definition in libc.  */
> >  #if IS_IN (libc)
> > -# define __bzero __redirect___bzero
> > +# define __memsetzero __redirect___memsetzero
> >  # include <string.h>
> > -# undef __bzero
> > +# undef __memsetzero
> >
> > -# define SYMBOL_NAME __bzero
> > +# define SYMBOL_NAME __memsetzero
> >  # include <init-arch.h>
> >
> >  extern __typeof (REDIRECT_NAME) OPTIMIZE1 (sse2_unaligned)
> > @@ -100,7 +100,17 @@ IFUNC_SELECTOR (void)
> >    return OPTIMIZE1 (sse2_unaligned);
> >  }
> >
> > -libc_ifunc_redirected (__redirect___bzero, __bzero, IFUNC_SELECTOR ());
> > +libc_ifunc_redirected (__redirect___memsetzero, __memsetzero,
> > +                      IFUNC_SELECTOR ());
> >
> > -weak_alias (__bzero, bzero)
> > +/* NB: bzero returns void and __memsetzero returns void *.  */
> > +asm (".weak bzero");
> > +asm ("bzero = __memsetzero");
> > +asm (".global __bzero");
> > +asm ("__bzero = __memsetzero");
> > +
> > +# ifdef SHARED
> > +__hidden_ver1 (__memsetzero, __GI___memsetzero, __redirect___memsetzero)
> > +  __attribute__ ((visibility ("hidden"))) __attribute_copy__ (__memsetzero);
> > +# endif
> >  #endif
> > --
> > 2.34.1
> >



-- 
H.J.


More information about the Libc-alpha mailing list