From: H.J. Lu Date: Sun, 17 May 2020 13:52:02 +0000 (-0700) Subject: x86: Add gcc.target/i386/strncmp-1.c X-Git-Tag: misc/first-auto-changelog~178 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=cc558e28014f0d85247398c89e7cf75d92df1bd3;p=thirdparty%2Fgcc.git x86: Add gcc.target/i386/strncmp-1.c Add a strncmp test for the cmpstrn pattern with neither of the strings is a constant string. We can expand the cmpstrn pattern to "repz cmpsb" only if one of the strings is a constant so that expand_builtin_strncmp() can write the length argument to be the minimum of the const string length and the actual length argument. Otherwise, "repz cmpsb" may pass the 0 byte. * gcc.target/i386/strncmp-1.c: New test. --- diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 9d757c47e192..fa3d018cb2e6 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2020-05-17 H.J. Lu + + * gcc.target/i386/strncmp-1.c: New test. + 2020-05-16 Iain Sandoe * g++.dg/coroutines/co-return-syntax-10-movable.C: New test. diff --git a/gcc/testsuite/gcc.target/i386/strncmp-1.c b/gcc/testsuite/gcc.target/i386/strncmp-1.c new file mode 100644 index 000000000000..044fc5cc5fa1 --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/strncmp-1.c @@ -0,0 +1,47 @@ +/* { dg-do run { target mmap } } */ +/* { dg-options "-O2" } */ + +#include +#include +#include +#include +#include + +#ifndef MAP_ANONYMOUS +#define MAP_ANONYMOUS MAP_ANON +#endif + +int +__attribute__ ((noclone, noinline)) +compare (char *d, char *s, unsigned int l) +{ + return __builtin_strncmp (d, s, l); +} + +int +main () +{ + size_t page_size = sysconf(_SC_PAGESIZE); + char *buf = mmap (0, 2 * page_size, PROT_READ | PROT_WRITE, + MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); + if (buf == MAP_FAILED) + { + perror ("mmap"); + abort (); + } + + if (mprotect (buf + page_size, page_size, PROT_NONE)) + { + perror ("mprotect"); + abort (); + } + + char *src1 = buf + page_size - sizeof ("foo"); + char *src2 = buf; + memcpy (src1, "foo", sizeof ("foo")); + memcpy (src2, "foo", sizeof ("foo")); + int result = compare (src1, src2, sizeof ("foo") + 16); + if (result != 0) + abort (); + return 0; +}