* [PATCH v1] x86: Remove wcsnlen-sse4_1 from wcslen ifunc-impl-list [BZ #28064] @ 2021-07-08 8:13 Noah Goldstein 2021-07-08 12:21 ` H.J. Lu 2021-07-08 20:13 ` [PATCH v2 1/2] x86-64: Test strlen and wcslen with 0 in the RSI register " Noah Goldstein 0 siblings, 2 replies; 10+ messages in thread From: Noah Goldstein @ 2021-07-08 8:13 UTC (permalink / raw) To: libc-alpha The following commit commit 6f573a27b6c8b4236445810a44660612323f5a73 Author: Noah Goldstein <goldstein.w.n@gmail.com> Date: Wed Jun 23 01:19:34 2021 -0400 x86-64: Add wcslen optimize for sse4.1 Added wcsnlen-sse4.1 to the wcslen ifunc implementation list and did not add wcslen-sse4.1 to wcslen ifunc implementation list. This commit fixes that by removing wcsnlen-sse4.1 from the wcslen ifunc implementation list and adding wcslen-sse4.1 to the ifunc implementation list. Testing: test-wcslen.c is passing as well as all other tests in wcsmbs and string. Signed-off-by: Noah Goldstein <goldstein.w.n@gmail.com> --- I was unable to actually reproduce the bug on my machine, even after reordering ifunc-wcslen.h to prefer the sse4.1 implementation. Although this most definetly is a bug. I ran the following command. Is there an issue with the command? Or does rdx happen to always have a len >= actual length of the string? $> rm -rf build; mkdir -p build/glibc; (cd build/glibc/; unset LD_LIBRARY_PATH; /absolute/path/to/src/glibc/configure --prefix=/usr; make --silent; make xcheck; make -r -C /absolute/path/to/src/glibc/string/ objdir=`pwd` check; make -r -C /absolute/path/to/src/glibc/wcsmbs/ objdir=`pwd` check); sysdeps/x86_64/multiarch/ifunc-impl-list.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sysdeps/x86_64/multiarch/ifunc-impl-list.c b/sysdeps/x86_64/multiarch/ifunc-impl-list.c index dbd1ebf298..39ab10613b 100644 --- a/sysdeps/x86_64/multiarch/ifunc-impl-list.c +++ b/sysdeps/x86_64/multiarch/ifunc-impl-list.c @@ -684,9 +684,9 @@ __libc_ifunc_impl_list (const char *name, struct libc_ifunc_impl *array, && CPU_FEATURE_USABLE (AVX512BW) && CPU_FEATURE_USABLE (BMI2)), __wcslen_evex) - IFUNC_IMPL_ADD (array, i, wcsnlen, + IFUNC_IMPL_ADD (array, i, wcslen, CPU_FEATURE_USABLE (SSE4_1), - __wcsnlen_sse4_1) + __wcslen_sse4_1) IFUNC_IMPL_ADD (array, i, wcslen, 1, __wcslen_sse2)) /* Support sysdeps/x86_64/multiarch/wcsnlen.c. */ -- 2.25.1 ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH v1] x86: Remove wcsnlen-sse4_1 from wcslen ifunc-impl-list [BZ #28064] 2021-07-08 8:13 [PATCH v1] x86: Remove wcsnlen-sse4_1 from wcslen ifunc-impl-list [BZ #28064] Noah Goldstein @ 2021-07-08 12:21 ` H.J. Lu 2021-07-08 13:57 ` H.J. Lu 2021-07-08 20:13 ` [PATCH v2 1/2] x86-64: Test strlen and wcslen with 0 in the RSI register " Noah Goldstein 1 sibling, 1 reply; 10+ messages in thread From: H.J. Lu @ 2021-07-08 12:21 UTC (permalink / raw) To: Noah Goldstein; +Cc: GNU C Library, Carlos O'Donell On Thu, Jul 8, 2021 at 1:22 AM Noah Goldstein <goldstein.w.n@gmail.com> wrote: > > The following commit > > commit 6f573a27b6c8b4236445810a44660612323f5a73 > Author: Noah Goldstein <goldstein.w.n@gmail.com> > Date: Wed Jun 23 01:19:34 2021 -0400 > > x86-64: Add wcslen optimize for sse4.1 > > Added wcsnlen-sse4.1 to the wcslen ifunc implementation list and did > not add wcslen-sse4.1 to wcslen ifunc implementation list. This commit > fixes that by removing wcsnlen-sse4.1 from the wcslen ifunc > implementation list and adding wcslen-sse4.1 to the ifunc > implementation list. > > Testing: > test-wcslen.c is passing as well as all other tests in wcsmbs and > string. > > Signed-off-by: Noah Goldstein <goldstein.w.n@gmail.com> > --- > I was unable to actually reproduce the bug on my machine, even after > reordering ifunc-wcslen.h to prefer the sse4.1 > implementation. Although this most definetly is a bug. > > > I ran the following command. Is there an issue with the command? Or > does rdx happen to always have a len >= actual length of the string? That must be the case. We can do something similar to sysdeps/x86_64/x32/tst-size_t-strnlen.c to write a testcase. > $> rm -rf build; mkdir -p build/glibc; (cd build/glibc/; unset LD_LIBRARY_PATH; /absolute/path/to/src/glibc/configure --prefix=/usr; make --silent; make xcheck; make -r -C /absolute/path/to/src/glibc/string/ objdir=`pwd` check; make -r -C /absolute/path/to/src/glibc/wcsmbs/ objdir=`pwd` check); > > > > sysdeps/x86_64/multiarch/ifunc-impl-list.c | 4 ++-- > 1 file changed, 2 insertions(+), 2 deletions(-) > > diff --git a/sysdeps/x86_64/multiarch/ifunc-impl-list.c b/sysdeps/x86_64/multiarch/ifunc-impl-list.c > index dbd1ebf298..39ab10613b 100644 > --- a/sysdeps/x86_64/multiarch/ifunc-impl-list.c > +++ b/sysdeps/x86_64/multiarch/ifunc-impl-list.c > @@ -684,9 +684,9 @@ __libc_ifunc_impl_list (const char *name, struct libc_ifunc_impl *array, > && CPU_FEATURE_USABLE (AVX512BW) > && CPU_FEATURE_USABLE (BMI2)), > __wcslen_evex) > - IFUNC_IMPL_ADD (array, i, wcsnlen, > + IFUNC_IMPL_ADD (array, i, wcslen, > CPU_FEATURE_USABLE (SSE4_1), > - __wcsnlen_sse4_1) > + __wcslen_sse4_1) > IFUNC_IMPL_ADD (array, i, wcslen, 1, __wcslen_sse2)) > > /* Support sysdeps/x86_64/multiarch/wcsnlen.c. */ > -- > 2.25.1 > LGTM. Reviewed-by: H.J. Lu <hjl.tools@gmail.com> -- H.J. ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH v1] x86: Remove wcsnlen-sse4_1 from wcslen ifunc-impl-list [BZ #28064] 2021-07-08 12:21 ` H.J. Lu @ 2021-07-08 13:57 ` H.J. Lu 2021-07-08 15:08 ` H.J. Lu 0 siblings, 1 reply; 10+ messages in thread From: H.J. Lu @ 2021-07-08 13:57 UTC (permalink / raw) To: Noah Goldstein; +Cc: GNU C Library, Carlos O'Donell [-- Attachment #1: Type: text/plain, Size: 2978 bytes --] On Thu, Jul 8, 2021 at 5:21 AM H.J. Lu <hjl.tools@gmail.com> wrote: > > On Thu, Jul 8, 2021 at 1:22 AM Noah Goldstein <goldstein.w.n@gmail.com> wrote: > > > > The following commit > > > > commit 6f573a27b6c8b4236445810a44660612323f5a73 > > Author: Noah Goldstein <goldstein.w.n@gmail.com> > > Date: Wed Jun 23 01:19:34 2021 -0400 > > > > x86-64: Add wcslen optimize for sse4.1 > > > > Added wcsnlen-sse4.1 to the wcslen ifunc implementation list and did > > not add wcslen-sse4.1 to wcslen ifunc implementation list. This commit > > fixes that by removing wcsnlen-sse4.1 from the wcslen ifunc > > implementation list and adding wcslen-sse4.1 to the ifunc > > implementation list. > > > > Testing: > > test-wcslen.c is passing as well as all other tests in wcsmbs and > > string. > > > > Signed-off-by: Noah Goldstein <goldstein.w.n@gmail.com> > > --- > > I was unable to actually reproduce the bug on my machine, even after > > reordering ifunc-wcslen.h to prefer the sse4.1 > > implementation. Although this most definetly is a bug. > > > > > > I ran the following command. Is there an issue with the command? Or > > does rdx happen to always have a len >= actual length of the string? > > That must be the case. We can do something similar to > > sysdeps/x86_64/x32/tst-size_t-strnlen.c > > to write a testcase. Here is the patch with a testcase. Please include it in your fix and mention BZ #28064 in your commit log. > > $> rm -rf build; mkdir -p build/glibc; (cd build/glibc/; unset LD_LIBRARY_PATH; /absolute/path/to/src/glibc/configure --prefix=/usr; make --silent; make xcheck; make -r -C /absolute/path/to/src/glibc/string/ objdir=`pwd` check; make -r -C /absolute/path/to/src/glibc/wcsmbs/ objdir=`pwd` check); > > > > > > > > sysdeps/x86_64/multiarch/ifunc-impl-list.c | 4 ++-- > > 1 file changed, 2 insertions(+), 2 deletions(-) > > > > diff --git a/sysdeps/x86_64/multiarch/ifunc-impl-list.c b/sysdeps/x86_64/multiarch/ifunc-impl-list.c > > index dbd1ebf298..39ab10613b 100644 > > --- a/sysdeps/x86_64/multiarch/ifunc-impl-list.c > > +++ b/sysdeps/x86_64/multiarch/ifunc-impl-list.c > > @@ -684,9 +684,9 @@ __libc_ifunc_impl_list (const char *name, struct libc_ifunc_impl *array, > > && CPU_FEATURE_USABLE (AVX512BW) > > && CPU_FEATURE_USABLE (BMI2)), > > __wcslen_evex) > > - IFUNC_IMPL_ADD (array, i, wcsnlen, > > + IFUNC_IMPL_ADD (array, i, wcslen, > > CPU_FEATURE_USABLE (SSE4_1), > > - __wcsnlen_sse4_1) > > + __wcslen_sse4_1) > > IFUNC_IMPL_ADD (array, i, wcslen, 1, __wcslen_sse2)) > > > > /* Support sysdeps/x86_64/multiarch/wcsnlen.c. */ > > -- > > 2.25.1 > > > > LGTM. > > Reviewed-by: H.J. Lu <hjl.tools@gmail.com> > > -- > H.J. -- H.J. [-- Attachment #2: 0001-x86-64-Test-strlen-and-wcslen-with-0-in-the-RSI-regi.patch --] [-- Type: text/x-patch, Size: 4914 bytes --] From fa568b344d2d4a8c3130c2e49f2f8dcee62e24da Mon Sep 17 00:00:00 2001 From: "H.J. Lu" <hjl.tools@gmail.com> Date: Thu, 8 Jul 2021 06:50:37 -0700 Subject: [PATCH] x86-64: Test strlen and wcslen with 0 in the RSI register commit 6f573a27b6c8b4236445810a44660612323f5a73 Author: Noah Goldstein <goldstein.w.n@gmail.com> Date: Wed Jun 23 01:19:34 2021 -0400 x86-64: Add wcslen optimize for sse4.1 added wcsnlen-sse4.1 to the wcslen ifunc implementation list. Since the random value in the the RSI register is larger than the wide-character string length in the existing wcslen test, it didn't trigger the wcslen test failure. Add a test to force 0 into the RSI register before calling wcslen. --- sysdeps/x86_64/Makefile | 7 +++ sysdeps/x86_64/tst-rsi-strlen.c | 81 +++++++++++++++++++++++++++++++++ sysdeps/x86_64/tst-rsi-wcslen.c | 20 ++++++++ 3 files changed, 108 insertions(+) create mode 100644 sysdeps/x86_64/tst-rsi-strlen.c create mode 100644 sysdeps/x86_64/tst-rsi-wcslen.c diff --git a/sysdeps/x86_64/Makefile b/sysdeps/x86_64/Makefile index 06a444b6af..3fc03f4a19 100644 --- a/sysdeps/x86_64/Makefile +++ b/sysdeps/x86_64/Makefile @@ -20,6 +20,8 @@ endif ifeq ($(subdir),string) sysdep_routines += strcasecmp_l-nonascii strncase_l-nonascii gen-as-const-headers += locale-defines.sym +tests += \ + tst-rsi-strlen endif ifeq ($(subdir),elf) @@ -191,6 +193,11 @@ ifeq ($(subdir),csu) gen-as-const-headers += tlsdesc.sym rtld-offsets.sym endif +ifeq ($(subdir),wcsmbs) +tests += \ + tst-rsi-wcslen +endif + $(objpfx)x86_64/tst-x86_64mod-1.os: $(objpfx)tst-x86_64mod-1.os $(make-target-directory) rm -f $@ diff --git a/sysdeps/x86_64/tst-rsi-strlen.c b/sysdeps/x86_64/tst-rsi-strlen.c new file mode 100644 index 0000000000..0d3cc431a6 --- /dev/null +++ b/sysdeps/x86_64/tst-rsi-strlen.c @@ -0,0 +1,81 @@ +/* Test strlen with 0 in the RSI register. + Copyright (C) 2021 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <https://www.gnu.org/licenses/>. */ + +#ifdef WIDE +# define TEST_NAME "wcslen" +#else +# define TEST_NAME "strlen" +#endif /* WIDE */ + +#define TEST_MAIN +#include <string/test-string.h> + +#ifdef WIDE +# include <wchar.h> +# define STRLEN wcslen +# define CHAR wchar_t +#else +# define STRLEN strlen +# define CHAR char +#endif /* WIDE */ + +IMPL (STRLEN, 1) + +typedef size_t (*proto_t) (const CHAR *); + +typedef struct +{ + void (*fn) (void); +} parameter_t; + +size_t +__attribute__ ((weak, noinline, noclone)) +do_strlen (parameter_t a, int zero, const CHAR *str) +{ + return CALL (&a, str); +} + +static int +test_main (void) +{ + test_init (); + + size_t size = page_size / sizeof (CHAR) - 1; + CHAR *buf = (CHAR *) buf2; + buf[size] = 0; + + parameter_t a; + + int ret = 0; + FOR_EACH_IMPL (impl, 0) + { + a.fn = impl->fn; + /* NB: Pass 0 in RSI. */ + size_t res = do_strlen (a, 0, buf); + if (res != size) + { + error (0, 0, "Wrong result in function %s: %zu != %zu", + impl->name, res, size); + ret = 1; + } + } + + return ret ? EXIT_FAILURE : EXIT_SUCCESS; +} + +#include <support/test-driver.c> diff --git a/sysdeps/x86_64/tst-rsi-wcslen.c b/sysdeps/x86_64/tst-rsi-wcslen.c new file mode 100644 index 0000000000..f45a7dfb51 --- /dev/null +++ b/sysdeps/x86_64/tst-rsi-wcslen.c @@ -0,0 +1,20 @@ +/* Test wcslen with 0 in the RSI register. + Copyright (C) 2021 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <https://www.gnu.org/licenses/>. */ + +#define WIDE 1 +#include "tst-rsi-strlen.c" -- 2.31.1 ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH v1] x86: Remove wcsnlen-sse4_1 from wcslen ifunc-impl-list [BZ #28064] 2021-07-08 13:57 ` H.J. Lu @ 2021-07-08 15:08 ` H.J. Lu 2021-07-08 20:15 ` Noah Goldstein 0 siblings, 1 reply; 10+ messages in thread From: H.J. Lu @ 2021-07-08 15:08 UTC (permalink / raw) To: Noah Goldstein; +Cc: GNU C Library, Carlos O'Donell [-- Attachment #1: Type: text/plain, Size: 3283 bytes --] On Thu, Jul 8, 2021 at 6:57 AM H.J. Lu <hjl.tools@gmail.com> wrote: > > On Thu, Jul 8, 2021 at 5:21 AM H.J. Lu <hjl.tools@gmail.com> wrote: > > > > On Thu, Jul 8, 2021 at 1:22 AM Noah Goldstein <goldstein.w.n@gmail.com> wrote: > > > > > > The following commit > > > > > > commit 6f573a27b6c8b4236445810a44660612323f5a73 > > > Author: Noah Goldstein <goldstein.w.n@gmail.com> > > > Date: Wed Jun 23 01:19:34 2021 -0400 > > > > > > x86-64: Add wcslen optimize for sse4.1 > > > > > > Added wcsnlen-sse4.1 to the wcslen ifunc implementation list and did > > > not add wcslen-sse4.1 to wcslen ifunc implementation list. This commit > > > fixes that by removing wcsnlen-sse4.1 from the wcslen ifunc > > > implementation list and adding wcslen-sse4.1 to the ifunc > > > implementation list. > > > > > > Testing: > > > test-wcslen.c is passing as well as all other tests in wcsmbs and > > > string. > > > > > > Signed-off-by: Noah Goldstein <goldstein.w.n@gmail.com> > > > --- > > > I was unable to actually reproduce the bug on my machine, even after > > > reordering ifunc-wcslen.h to prefer the sse4.1 > > > implementation. Although this most definetly is a bug. > > > > > > > > > I ran the following command. Is there an issue with the command? Or > > > does rdx happen to always have a len >= actual length of the string? > > > > That must be the case. We can do something similar to > > > > sysdeps/x86_64/x32/tst-size_t-strnlen.c > > > > to write a testcase. > > Here is the patch with a testcase. Please include it in your fix and > mention BZ #28064 in your commit log. Please use this patch passing a pointer to do_strlen for x32. > > > $> rm -rf build; mkdir -p build/glibc; (cd build/glibc/; unset LD_LIBRARY_PATH; /absolute/path/to/src/glibc/configure --prefix=/usr; make --silent; make xcheck; make -r -C /absolute/path/to/src/glibc/string/ objdir=`pwd` check; make -r -C /absolute/path/to/src/glibc/wcsmbs/ objdir=`pwd` check); > > > > > > > > > > > > sysdeps/x86_64/multiarch/ifunc-impl-list.c | 4 ++-- > > > 1 file changed, 2 insertions(+), 2 deletions(-) > > > > > > diff --git a/sysdeps/x86_64/multiarch/ifunc-impl-list.c b/sysdeps/x86_64/multiarch/ifunc-impl-list.c > > > index dbd1ebf298..39ab10613b 100644 > > > --- a/sysdeps/x86_64/multiarch/ifunc-impl-list.c > > > +++ b/sysdeps/x86_64/multiarch/ifunc-impl-list.c > > > @@ -684,9 +684,9 @@ __libc_ifunc_impl_list (const char *name, struct libc_ifunc_impl *array, > > > && CPU_FEATURE_USABLE (AVX512BW) > > > && CPU_FEATURE_USABLE (BMI2)), > > > __wcslen_evex) > > > - IFUNC_IMPL_ADD (array, i, wcsnlen, > > > + IFUNC_IMPL_ADD (array, i, wcslen, > > > CPU_FEATURE_USABLE (SSE4_1), > > > - __wcsnlen_sse4_1) > > > + __wcslen_sse4_1) > > > IFUNC_IMPL_ADD (array, i, wcslen, 1, __wcslen_sse2)) > > > > > > /* Support sysdeps/x86_64/multiarch/wcsnlen.c. */ > > > -- > > > 2.25.1 > > > > > > > LGTM. > > > > Reviewed-by: H.J. Lu <hjl.tools@gmail.com> > > > > -- > > H.J. > > > > -- > H.J. -- H.J. [-- Attachment #2: 0001-x86-64-Test-strlen-and-wcslen-with-0-in-the-RSI-regi.patch --] [-- Type: text/x-patch, Size: 4915 bytes --] From 2611f991b9bef0111594849e50de27e7a3543e09 Mon Sep 17 00:00:00 2001 From: "H.J. Lu" <hjl.tools@gmail.com> Date: Thu, 8 Jul 2021 06:50:37 -0700 Subject: [PATCH] x86-64: Test strlen and wcslen with 0 in the RSI register commit 6f573a27b6c8b4236445810a44660612323f5a73 Author: Noah Goldstein <goldstein.w.n@gmail.com> Date: Wed Jun 23 01:19:34 2021 -0400 x86-64: Add wcslen optimize for sse4.1 added wcsnlen-sse4.1 to the wcslen ifunc implementation list. Since the random value in the the RSI register is larger than the wide-character string length in the existing wcslen test, it didn't trigger the wcslen test failure. Add a test to force 0 into the RSI register before calling wcslen. --- sysdeps/x86_64/Makefile | 7 +++ sysdeps/x86_64/tst-rsi-strlen.c | 81 +++++++++++++++++++++++++++++++++ sysdeps/x86_64/tst-rsi-wcslen.c | 20 ++++++++ 3 files changed, 108 insertions(+) create mode 100644 sysdeps/x86_64/tst-rsi-strlen.c create mode 100644 sysdeps/x86_64/tst-rsi-wcslen.c diff --git a/sysdeps/x86_64/Makefile b/sysdeps/x86_64/Makefile index 06a444b6af..3fc03f4a19 100644 --- a/sysdeps/x86_64/Makefile +++ b/sysdeps/x86_64/Makefile @@ -20,6 +20,8 @@ endif ifeq ($(subdir),string) sysdep_routines += strcasecmp_l-nonascii strncase_l-nonascii gen-as-const-headers += locale-defines.sym +tests += \ + tst-rsi-strlen endif ifeq ($(subdir),elf) @@ -191,6 +193,11 @@ ifeq ($(subdir),csu) gen-as-const-headers += tlsdesc.sym rtld-offsets.sym endif +ifeq ($(subdir),wcsmbs) +tests += \ + tst-rsi-wcslen +endif + $(objpfx)x86_64/tst-x86_64mod-1.os: $(objpfx)tst-x86_64mod-1.os $(make-target-directory) rm -f $@ diff --git a/sysdeps/x86_64/tst-rsi-strlen.c b/sysdeps/x86_64/tst-rsi-strlen.c new file mode 100644 index 0000000000..a80c4f85c2 --- /dev/null +++ b/sysdeps/x86_64/tst-rsi-strlen.c @@ -0,0 +1,81 @@ +/* Test strlen with 0 in the RSI register. + Copyright (C) 2021 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <https://www.gnu.org/licenses/>. */ + +#ifdef WIDE +# define TEST_NAME "wcslen" +#else +# define TEST_NAME "strlen" +#endif /* WIDE */ + +#define TEST_MAIN +#include <string/test-string.h> + +#ifdef WIDE +# include <wchar.h> +# define STRLEN wcslen +# define CHAR wchar_t +#else +# define STRLEN strlen +# define CHAR char +#endif /* WIDE */ + +IMPL (STRLEN, 1) + +typedef size_t (*proto_t) (const CHAR *); + +typedef struct +{ + void (*fn) (void); +} parameter_t; + +size_t +__attribute__ ((weak, noinline, noclone)) +do_strlen (parameter_t *a, int zero, const CHAR *str) +{ + return CALL (a, str); +} + +static int +test_main (void) +{ + test_init (); + + size_t size = page_size / sizeof (CHAR) - 1; + CHAR *buf = (CHAR *) buf2; + buf[size] = 0; + + parameter_t a; + + int ret = 0; + FOR_EACH_IMPL (impl, 0) + { + a.fn = impl->fn; + /* NB: Pass 0 in RSI. */ + size_t res = do_strlen (&a, 0, buf); + if (res != size) + { + error (0, 0, "Wrong result in function %s: %zu != %zu", + impl->name, res, size); + ret = 1; + } + } + + return ret ? EXIT_FAILURE : EXIT_SUCCESS; +} + +#include <support/test-driver.c> diff --git a/sysdeps/x86_64/tst-rsi-wcslen.c b/sysdeps/x86_64/tst-rsi-wcslen.c new file mode 100644 index 0000000000..f45a7dfb51 --- /dev/null +++ b/sysdeps/x86_64/tst-rsi-wcslen.c @@ -0,0 +1,20 @@ +/* Test wcslen with 0 in the RSI register. + Copyright (C) 2021 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <https://www.gnu.org/licenses/>. */ + +#define WIDE 1 +#include "tst-rsi-strlen.c" -- 2.31.1 ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH v1] x86: Remove wcsnlen-sse4_1 from wcslen ifunc-impl-list [BZ #28064] 2021-07-08 15:08 ` H.J. Lu @ 2021-07-08 20:15 ` Noah Goldstein 0 siblings, 0 replies; 10+ messages in thread From: Noah Goldstein @ 2021-07-08 20:15 UTC (permalink / raw) To: H.J. Lu; +Cc: GNU C Library, Carlos O'Donell On Thu, Jul 8, 2021 at 11:08 AM H.J. Lu <hjl.tools@gmail.com> wrote: > On Thu, Jul 8, 2021 at 6:57 AM H.J. Lu <hjl.tools@gmail.com> wrote: > > > > On Thu, Jul 8, 2021 at 5:21 AM H.J. Lu <hjl.tools@gmail.com> wrote: > > > > > > On Thu, Jul 8, 2021 at 1:22 AM Noah Goldstein <goldstein.w.n@gmail.com> > wrote: > > > > > > > > The following commit > > > > > > > > commit 6f573a27b6c8b4236445810a44660612323f5a73 > > > > Author: Noah Goldstein <goldstein.w.n@gmail.com> > > > > Date: Wed Jun 23 01:19:34 2021 -0400 > > > > > > > > x86-64: Add wcslen optimize for sse4.1 > > > > > > > > Added wcsnlen-sse4.1 to the wcslen ifunc implementation list and did > > > > not add wcslen-sse4.1 to wcslen ifunc implementation list. This > commit > > > > fixes that by removing wcsnlen-sse4.1 from the wcslen ifunc > > > > implementation list and adding wcslen-sse4.1 to the ifunc > > > > implementation list. > > > > > > > > Testing: > > > > test-wcslen.c is passing as well as all other tests in wcsmbs and > > > > string. > > > > > > > > Signed-off-by: Noah Goldstein <goldstein.w.n@gmail.com> > > > > --- > > > > I was unable to actually reproduce the bug on my machine, even after > > > > reordering ifunc-wcslen.h to prefer the sse4.1 > > > > implementation. Although this most definetly is a bug. > > > > > > > > > > > > I ran the following command. Is there an issue with the command? Or > > > > does rdx happen to always have a len >= actual length of the string? > > > > > > That must be the case. We can do something similar to > > > > > > sysdeps/x86_64/x32/tst-size_t-strnlen.c > > > > > > to write a testcase. > > > > Here is the patch with a testcase. Please include it in your fix and > > mention BZ #28064 in your commit log. > Done. > > Please use this patch passing a pointer to do_strlen for x32. > Done. Made it first patch in patchset. > > > > > $> rm -rf build; mkdir -p build/glibc; (cd build/glibc/; unset > LD_LIBRARY_PATH; /absolute/path/to/src/glibc/configure --prefix=/usr; make > --silent; make xcheck; make -r -C /absolute/path/to/src/glibc/string/ > objdir=`pwd` check; make -r -C /absolute/path/to/src/glibc/wcsmbs/ > objdir=`pwd` check); > > > > > > > > > > > > > > > > sysdeps/x86_64/multiarch/ifunc-impl-list.c | 4 ++-- > > > > 1 file changed, 2 insertions(+), 2 deletions(-) > > > > > > > > diff --git a/sysdeps/x86_64/multiarch/ifunc-impl-list.c > b/sysdeps/x86_64/multiarch/ifunc-impl-list.c > > > > index dbd1ebf298..39ab10613b 100644 > > > > --- a/sysdeps/x86_64/multiarch/ifunc-impl-list.c > > > > +++ b/sysdeps/x86_64/multiarch/ifunc-impl-list.c > > > > @@ -684,9 +684,9 @@ __libc_ifunc_impl_list (const char *name, struct > libc_ifunc_impl *array, > > > > && CPU_FEATURE_USABLE (AVX512BW) > > > > && CPU_FEATURE_USABLE (BMI2)), > > > > __wcslen_evex) > > > > - IFUNC_IMPL_ADD (array, i, wcsnlen, > > > > + IFUNC_IMPL_ADD (array, i, wcslen, > > > > CPU_FEATURE_USABLE (SSE4_1), > > > > - __wcsnlen_sse4_1) > > > > + __wcslen_sse4_1) > > > > IFUNC_IMPL_ADD (array, i, wcslen, 1, __wcslen_sse2)) > > > > > > > > /* Support sysdeps/x86_64/multiarch/wcsnlen.c. */ > > > > -- > > > > 2.25.1 > > > > > > > > > > LGTM. > > > > > > Reviewed-by: H.J. Lu <hjl.tools@gmail.com> > > > > > > -- > > > H.J. > > > > > > > > -- > > H.J. > > > > -- > H.J. > ^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH v2 1/2] x86-64: Test strlen and wcslen with 0 in the RSI register [BZ #28064] 2021-07-08 8:13 [PATCH v1] x86: Remove wcsnlen-sse4_1 from wcslen ifunc-impl-list [BZ #28064] Noah Goldstein 2021-07-08 12:21 ` H.J. Lu @ 2021-07-08 20:13 ` Noah Goldstein 2021-07-08 20:13 ` [PATCH v2 2/2] x86: Remove wcsnlen-sse4_1 from wcslen ifunc-impl-list " Noah Goldstein 2022-02-01 19:52 ` [PATCH v2 1/2] x86-64: Test strlen and wcslen with 0 in the RSI register " H.J. Lu 1 sibling, 2 replies; 10+ messages in thread From: Noah Goldstein @ 2021-07-08 20:13 UTC (permalink / raw) To: libc-alpha From: "H.J. Lu" <hjl.tools@gmail.com> commit 6f573a27b6c8b4236445810a44660612323f5a73 Author: Noah Goldstein <goldstein.w.n@gmail.com> Date: Wed Jun 23 01:19:34 2021 -0400 x86-64: Add wcslen optimize for sse4.1 added wcsnlen-sse4.1 to the wcslen ifunc implementation list. Since the random value in the the RSI register is larger than the wide-character string length in the existing wcslen test, it didn't trigger the wcslen test failure. Add a test to force 0 into the RSI register before calling wcslen. --- sysdeps/x86_64/Makefile | 7 +++ sysdeps/x86_64/tst-rsi-strlen.c | 81 +++++++++++++++++++++++++++++++++ sysdeps/x86_64/tst-rsi-wcslen.c | 20 ++++++++ 3 files changed, 108 insertions(+) create mode 100644 sysdeps/x86_64/tst-rsi-strlen.c create mode 100644 sysdeps/x86_64/tst-rsi-wcslen.c diff --git a/sysdeps/x86_64/Makefile b/sysdeps/x86_64/Makefile index 06a444b6af..3fc03f4a19 100644 --- a/sysdeps/x86_64/Makefile +++ b/sysdeps/x86_64/Makefile @@ -20,6 +20,8 @@ endif ifeq ($(subdir),string) sysdep_routines += strcasecmp_l-nonascii strncase_l-nonascii gen-as-const-headers += locale-defines.sym +tests += \ + tst-rsi-strlen endif ifeq ($(subdir),elf) @@ -191,6 +193,11 @@ ifeq ($(subdir),csu) gen-as-const-headers += tlsdesc.sym rtld-offsets.sym endif +ifeq ($(subdir),wcsmbs) +tests += \ + tst-rsi-wcslen +endif + $(objpfx)x86_64/tst-x86_64mod-1.os: $(objpfx)tst-x86_64mod-1.os $(make-target-directory) rm -f $@ diff --git a/sysdeps/x86_64/tst-rsi-strlen.c b/sysdeps/x86_64/tst-rsi-strlen.c new file mode 100644 index 0000000000..a80c4f85c2 --- /dev/null +++ b/sysdeps/x86_64/tst-rsi-strlen.c @@ -0,0 +1,81 @@ +/* Test strlen with 0 in the RSI register. + Copyright (C) 2021 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <https://www.gnu.org/licenses/>. */ + +#ifdef WIDE +# define TEST_NAME "wcslen" +#else +# define TEST_NAME "strlen" +#endif /* WIDE */ + +#define TEST_MAIN +#include <string/test-string.h> + +#ifdef WIDE +# include <wchar.h> +# define STRLEN wcslen +# define CHAR wchar_t +#else +# define STRLEN strlen +# define CHAR char +#endif /* WIDE */ + +IMPL (STRLEN, 1) + +typedef size_t (*proto_t) (const CHAR *); + +typedef struct +{ + void (*fn) (void); +} parameter_t; + +size_t +__attribute__ ((weak, noinline, noclone)) +do_strlen (parameter_t *a, int zero, const CHAR *str) +{ + return CALL (a, str); +} + +static int +test_main (void) +{ + test_init (); + + size_t size = page_size / sizeof (CHAR) - 1; + CHAR *buf = (CHAR *) buf2; + buf[size] = 0; + + parameter_t a; + + int ret = 0; + FOR_EACH_IMPL (impl, 0) + { + a.fn = impl->fn; + /* NB: Pass 0 in RSI. */ + size_t res = do_strlen (&a, 0, buf); + if (res != size) + { + error (0, 0, "Wrong result in function %s: %zu != %zu", + impl->name, res, size); + ret = 1; + } + } + + return ret ? EXIT_FAILURE : EXIT_SUCCESS; +} + +#include <support/test-driver.c> diff --git a/sysdeps/x86_64/tst-rsi-wcslen.c b/sysdeps/x86_64/tst-rsi-wcslen.c new file mode 100644 index 0000000000..f45a7dfb51 --- /dev/null +++ b/sysdeps/x86_64/tst-rsi-wcslen.c @@ -0,0 +1,20 @@ +/* Test wcslen with 0 in the RSI register. + Copyright (C) 2021 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <https://www.gnu.org/licenses/>. */ + +#define WIDE 1 +#include "tst-rsi-strlen.c" -- 2.25.1 ^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH v2 2/2] x86: Remove wcsnlen-sse4_1 from wcslen ifunc-impl-list [BZ #28064] 2021-07-08 20:13 ` [PATCH v2 1/2] x86-64: Test strlen and wcslen with 0 in the RSI register " Noah Goldstein @ 2021-07-08 20:13 ` Noah Goldstein 2021-07-08 20:30 ` H.J. Lu 2022-02-01 19:52 ` [PATCH v2 1/2] x86-64: Test strlen and wcslen with 0 in the RSI register " H.J. Lu 1 sibling, 1 reply; 10+ messages in thread From: Noah Goldstein @ 2021-07-08 20:13 UTC (permalink / raw) To: libc-alpha The following commit commit 6f573a27b6c8b4236445810a44660612323f5a73 Author: Noah Goldstein <goldstein.w.n@gmail.com> Date: Wed Jun 23 01:19:34 2021 -0400 x86-64: Add wcslen optimize for sse4.1 Added wcsnlen-sse4.1 to the wcslen ifunc implementation list and did not add wcslen-sse4.1 to wcslen ifunc implementation list. This commit fixes that by removing wcsnlen-sse4.1 from the wcslen ifunc implementation list and adding wcslen-sse4.1 to the ifunc implementation list. Testing: test-wcslen.c, test-rsi-wcslen.c, and test-rsi-strlen.c are passing as well as all other tests in wcsmbs and string. Signed-off-by: Noah Goldstein <goldstein.w.n@gmail.com> Reviewed-by: H.J. Lu <hjl.tools@gmail.com> --- Confirmed test-rsi-wcslen.c failed before this fix. sysdeps/x86_64/multiarch/ifunc-impl-list.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sysdeps/x86_64/multiarch/ifunc-impl-list.c b/sysdeps/x86_64/multiarch/ifunc-impl-list.c index dbd1ebf298..39ab10613b 100644 --- a/sysdeps/x86_64/multiarch/ifunc-impl-list.c +++ b/sysdeps/x86_64/multiarch/ifunc-impl-list.c @@ -684,9 +684,9 @@ __libc_ifunc_impl_list (const char *name, struct libc_ifunc_impl *array, && CPU_FEATURE_USABLE (AVX512BW) && CPU_FEATURE_USABLE (BMI2)), __wcslen_evex) - IFUNC_IMPL_ADD (array, i, wcsnlen, + IFUNC_IMPL_ADD (array, i, wcslen, CPU_FEATURE_USABLE (SSE4_1), - __wcsnlen_sse4_1) + __wcslen_sse4_1) IFUNC_IMPL_ADD (array, i, wcslen, 1, __wcslen_sse2)) /* Support sysdeps/x86_64/multiarch/wcsnlen.c. */ -- 2.25.1 ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH v2 2/2] x86: Remove wcsnlen-sse4_1 from wcslen ifunc-impl-list [BZ #28064] 2021-07-08 20:13 ` [PATCH v2 2/2] x86: Remove wcsnlen-sse4_1 from wcslen ifunc-impl-list " Noah Goldstein @ 2021-07-08 20:30 ` H.J. Lu 2022-02-01 19:45 ` H.J. Lu 0 siblings, 1 reply; 10+ messages in thread From: H.J. Lu @ 2021-07-08 20:30 UTC (permalink / raw) To: Noah Goldstein; +Cc: GNU C Library, Carlos O'Donell On Thu, Jul 8, 2021 at 1:14 PM Noah Goldstein <goldstein.w.n@gmail.com> wrote: > > The following commit > > commit 6f573a27b6c8b4236445810a44660612323f5a73 > Author: Noah Goldstein <goldstein.w.n@gmail.com> > Date: Wed Jun 23 01:19:34 2021 -0400 > > x86-64: Add wcslen optimize for sse4.1 > > Added wcsnlen-sse4.1 to the wcslen ifunc implementation list and did > not add wcslen-sse4.1 to wcslen ifunc implementation list. This commit > fixes that by removing wcsnlen-sse4.1 from the wcslen ifunc > implementation list and adding wcslen-sse4.1 to the ifunc > implementation list. > > Testing: > test-wcslen.c, test-rsi-wcslen.c, and test-rsi-strlen.c are passing as > well as all other tests in wcsmbs and string. > > Signed-off-by: Noah Goldstein <goldstein.w.n@gmail.com> > Reviewed-by: H.J. Lu <hjl.tools@gmail.com> > --- > Confirmed test-rsi-wcslen.c failed before this fix. Great. > sysdeps/x86_64/multiarch/ifunc-impl-list.c | 4 ++-- > 1 file changed, 2 insertions(+), 2 deletions(-) > > diff --git a/sysdeps/x86_64/multiarch/ifunc-impl-list.c b/sysdeps/x86_64/multiarch/ifunc-impl-list.c > index dbd1ebf298..39ab10613b 100644 > --- a/sysdeps/x86_64/multiarch/ifunc-impl-list.c > +++ b/sysdeps/x86_64/multiarch/ifunc-impl-list.c > @@ -684,9 +684,9 @@ __libc_ifunc_impl_list (const char *name, struct libc_ifunc_impl *array, > && CPU_FEATURE_USABLE (AVX512BW) > && CPU_FEATURE_USABLE (BMI2)), > __wcslen_evex) > - IFUNC_IMPL_ADD (array, i, wcsnlen, > + IFUNC_IMPL_ADD (array, i, wcslen, > CPU_FEATURE_USABLE (SSE4_1), > - __wcsnlen_sse4_1) > + __wcslen_sse4_1) > IFUNC_IMPL_ADD (array, i, wcslen, 1, __wcslen_sse2)) > > /* Support sysdeps/x86_64/multiarch/wcsnlen.c. */ > -- > 2.25.1 > LGTM. Please check in both patches. Reviewed-by: H.J. Lu <hjl.tools@gmail.com> Thanks. -- H.J. ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH v2 2/2] x86: Remove wcsnlen-sse4_1 from wcslen ifunc-impl-list [BZ #28064] 2021-07-08 20:30 ` H.J. Lu @ 2022-02-01 19:45 ` H.J. Lu 0 siblings, 0 replies; 10+ messages in thread From: H.J. Lu @ 2022-02-01 19:45 UTC (permalink / raw) To: Noah Goldstein, Libc-stable Mailing List Cc: GNU C Library, Carlos O'Donell On Thu, Jul 8, 2021 at 1:30 PM H.J. Lu <hjl.tools@gmail.com> wrote: > > On Thu, Jul 8, 2021 at 1:14 PM Noah Goldstein <goldstein.w.n@gmail.com> wrote: > > > > The following commit > > > > commit 6f573a27b6c8b4236445810a44660612323f5a73 > > Author: Noah Goldstein <goldstein.w.n@gmail.com> > > Date: Wed Jun 23 01:19:34 2021 -0400 > > > > x86-64: Add wcslen optimize for sse4.1 > > > > Added wcsnlen-sse4.1 to the wcslen ifunc implementation list and did > > not add wcslen-sse4.1 to wcslen ifunc implementation list. This commit > > fixes that by removing wcsnlen-sse4.1 from the wcslen ifunc > > implementation list and adding wcslen-sse4.1 to the ifunc > > implementation list. > > > > Testing: > > test-wcslen.c, test-rsi-wcslen.c, and test-rsi-strlen.c are passing as > > well as all other tests in wcsmbs and string. > > > > Signed-off-by: Noah Goldstein <goldstein.w.n@gmail.com> > > Reviewed-by: H.J. Lu <hjl.tools@gmail.com> > > --- > > Confirmed test-rsi-wcslen.c failed before this fix. > > Great. > > > sysdeps/x86_64/multiarch/ifunc-impl-list.c | 4 ++-- > > 1 file changed, 2 insertions(+), 2 deletions(-) > > > > diff --git a/sysdeps/x86_64/multiarch/ifunc-impl-list.c b/sysdeps/x86_64/multiarch/ifunc-impl-list.c > > index dbd1ebf298..39ab10613b 100644 > > --- a/sysdeps/x86_64/multiarch/ifunc-impl-list.c > > +++ b/sysdeps/x86_64/multiarch/ifunc-impl-list.c > > @@ -684,9 +684,9 @@ __libc_ifunc_impl_list (const char *name, struct libc_ifunc_impl *array, > > && CPU_FEATURE_USABLE (AVX512BW) > > && CPU_FEATURE_USABLE (BMI2)), > > __wcslen_evex) > > - IFUNC_IMPL_ADD (array, i, wcsnlen, > > + IFUNC_IMPL_ADD (array, i, wcslen, > > CPU_FEATURE_USABLE (SSE4_1), > > - __wcsnlen_sse4_1) > > + __wcslen_sse4_1) > > IFUNC_IMPL_ADD (array, i, wcslen, 1, __wcslen_sse2)) > > > > /* Support sysdeps/x86_64/multiarch/wcsnlen.c. */ > > -- > > 2.25.1 > > > > LGTM. Please check in both patches. > > Reviewed-by: H.J. Lu <hjl.tools@gmail.com> > I am backporting this to release branches. -- H.J. ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH v2 1/2] x86-64: Test strlen and wcslen with 0 in the RSI register [BZ #28064] 2021-07-08 20:13 ` [PATCH v2 1/2] x86-64: Test strlen and wcslen with 0 in the RSI register " Noah Goldstein 2021-07-08 20:13 ` [PATCH v2 2/2] x86: Remove wcsnlen-sse4_1 from wcslen ifunc-impl-list " Noah Goldstein @ 2022-02-01 19:52 ` H.J. Lu 1 sibling, 0 replies; 10+ messages in thread From: H.J. Lu @ 2022-02-01 19:52 UTC (permalink / raw) To: Noah Goldstein, Libc-stable Mailing List Cc: GNU C Library, Carlos O'Donell On Thu, Jul 8, 2021 at 1:13 PM Noah Goldstein <goldstein.w.n@gmail.com> wrote: > > From: "H.J. Lu" <hjl.tools@gmail.com> > > commit 6f573a27b6c8b4236445810a44660612323f5a73 > Author: Noah Goldstein <goldstein.w.n@gmail.com> > Date: Wed Jun 23 01:19:34 2021 -0400 > > x86-64: Add wcslen optimize for sse4.1 > > added wcsnlen-sse4.1 to the wcslen ifunc implementation list. Since the > random value in the the RSI register is larger than the wide-character > string length in the existing wcslen test, it didn't trigger the wcslen > test failure. Add a test to force 0 into the RSI register before calling > wcslen. > --- > sysdeps/x86_64/Makefile | 7 +++ > sysdeps/x86_64/tst-rsi-strlen.c | 81 +++++++++++++++++++++++++++++++++ > sysdeps/x86_64/tst-rsi-wcslen.c | 20 ++++++++ > 3 files changed, 108 insertions(+) > create mode 100644 sysdeps/x86_64/tst-rsi-strlen.c > create mode 100644 sysdeps/x86_64/tst-rsi-wcslen.c > > diff --git a/sysdeps/x86_64/Makefile b/sysdeps/x86_64/Makefile > index 06a444b6af..3fc03f4a19 100644 > --- a/sysdeps/x86_64/Makefile > +++ b/sysdeps/x86_64/Makefile > @@ -20,6 +20,8 @@ endif > ifeq ($(subdir),string) > sysdep_routines += strcasecmp_l-nonascii strncase_l-nonascii > gen-as-const-headers += locale-defines.sym > +tests += \ > + tst-rsi-strlen > endif > > ifeq ($(subdir),elf) > @@ -191,6 +193,11 @@ ifeq ($(subdir),csu) > gen-as-const-headers += tlsdesc.sym rtld-offsets.sym > endif > > +ifeq ($(subdir),wcsmbs) > +tests += \ > + tst-rsi-wcslen > +endif > + > $(objpfx)x86_64/tst-x86_64mod-1.os: $(objpfx)tst-x86_64mod-1.os > $(make-target-directory) > rm -f $@ > diff --git a/sysdeps/x86_64/tst-rsi-strlen.c b/sysdeps/x86_64/tst-rsi-strlen.c > new file mode 100644 > index 0000000000..a80c4f85c2 > --- /dev/null > +++ b/sysdeps/x86_64/tst-rsi-strlen.c > @@ -0,0 +1,81 @@ > +/* Test strlen with 0 in the RSI register. > + Copyright (C) 2021 Free Software Foundation, Inc. > + This file is part of the GNU C Library. > + > + The GNU C Library is free software; you can redistribute it and/or > + modify it under the terms of the GNU Lesser General Public > + License as published by the Free Software Foundation; either > + version 2.1 of the License, or (at your option) any later version. > + > + The GNU C Library is distributed in the hope that it will be useful, > + but WITHOUT ANY WARRANTY; without even the implied warranty of > + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU > + Lesser General Public License for more details. > + > + You should have received a copy of the GNU Lesser General Public > + License along with the GNU C Library; if not, see > + <https://www.gnu.org/licenses/>. */ > + > +#ifdef WIDE > +# define TEST_NAME "wcslen" > +#else > +# define TEST_NAME "strlen" > +#endif /* WIDE */ > + > +#define TEST_MAIN > +#include <string/test-string.h> > + > +#ifdef WIDE > +# include <wchar.h> > +# define STRLEN wcslen > +# define CHAR wchar_t > +#else > +# define STRLEN strlen > +# define CHAR char > +#endif /* WIDE */ > + > +IMPL (STRLEN, 1) > + > +typedef size_t (*proto_t) (const CHAR *); > + > +typedef struct > +{ > + void (*fn) (void); > +} parameter_t; > + > +size_t > +__attribute__ ((weak, noinline, noclone)) > +do_strlen (parameter_t *a, int zero, const CHAR *str) > +{ > + return CALL (a, str); > +} > + > +static int > +test_main (void) > +{ > + test_init (); > + > + size_t size = page_size / sizeof (CHAR) - 1; > + CHAR *buf = (CHAR *) buf2; > + buf[size] = 0; > + > + parameter_t a; > + > + int ret = 0; > + FOR_EACH_IMPL (impl, 0) > + { > + a.fn = impl->fn; > + /* NB: Pass 0 in RSI. */ > + size_t res = do_strlen (&a, 0, buf); > + if (res != size) > + { > + error (0, 0, "Wrong result in function %s: %zu != %zu", > + impl->name, res, size); > + ret = 1; > + } > + } > + > + return ret ? EXIT_FAILURE : EXIT_SUCCESS; > +} > + > +#include <support/test-driver.c> > diff --git a/sysdeps/x86_64/tst-rsi-wcslen.c b/sysdeps/x86_64/tst-rsi-wcslen.c > new file mode 100644 > index 0000000000..f45a7dfb51 > --- /dev/null > +++ b/sysdeps/x86_64/tst-rsi-wcslen.c > @@ -0,0 +1,20 @@ > +/* Test wcslen with 0 in the RSI register. > + Copyright (C) 2021 Free Software Foundation, Inc. > + This file is part of the GNU C Library. > + > + The GNU C Library is free software; you can redistribute it and/or > + modify it under the terms of the GNU Lesser General Public > + License as published by the Free Software Foundation; either > + version 2.1 of the License, or (at your option) any later version. > + > + The GNU C Library is distributed in the hope that it will be useful, > + but WITHOUT ANY WARRANTY; without even the implied warranty of > + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU > + Lesser General Public License for more details. > + > + You should have received a copy of the GNU Lesser General Public > + License along with the GNU C Library; if not, see > + <https://www.gnu.org/licenses/>. */ > + > +#define WIDE 1 > +#include "tst-rsi-strlen.c" > -- > 2.25.1 > I am backporting this patch to release branches. -- H.J. ^ permalink raw reply [flat|nested] 10+ messages in thread
end of thread, other threads:[~2022-02-01 19:53 UTC | newest] Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2021-07-08 8:13 [PATCH v1] x86: Remove wcsnlen-sse4_1 from wcslen ifunc-impl-list [BZ #28064] Noah Goldstein 2021-07-08 12:21 ` H.J. Lu 2021-07-08 13:57 ` H.J. Lu 2021-07-08 15:08 ` H.J. Lu 2021-07-08 20:15 ` Noah Goldstein 2021-07-08 20:13 ` [PATCH v2 1/2] x86-64: Test strlen and wcslen with 0 in the RSI register " Noah Goldstein 2021-07-08 20:13 ` [PATCH v2 2/2] x86: Remove wcsnlen-sse4_1 from wcslen ifunc-impl-list " Noah Goldstein 2021-07-08 20:30 ` H.J. Lu 2022-02-01 19:45 ` H.J. Lu 2022-02-01 19:52 ` [PATCH v2 1/2] x86-64: Test strlen and wcslen with 0 in the RSI register " H.J. Lu
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).