(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.target/
i386/
pr95443-2.c
       1  /* { dg-do run { target { sysconf && mmap } } } */
       2  /* { dg-options "-O2 -minline-all-stringops" } */
       3  
       4  #include <stdint.h>
       5  #include <string.h>
       6  #include <stdlib.h>
       7  #include <unistd.h>
       8  #include <sys/mman.h>
       9  #ifndef MAP_ANON
      10  #define MAP_ANON 0
      11  #endif
      12  #ifndef MAP_FAILED
      13  #define MAP_FAILED ((void *)-1)
      14  #endif
      15  
      16  int ret;
      17  
      18  static void
      19  do_one_test (char *dst, char *src, const char *orig_src, unsigned int len)
      20  {
      21    __builtin_memcpy (src, orig_src, len);
      22    __builtin_memmove (dst, src, len);
      23  
      24    if (__builtin_memcmp (dst, orig_src, len) != 0)
      25      {
      26        ret = 1;
      27        return;
      28      }
      29  }
      30  
      31  void
      32  do_test (char *s1, char *s2, int n, unsigned int len)
      33  {
      34    int i;
      35    for (i = 0; i < n; i++)
      36      do_one_test (s2, s2, s1, len);
      37  }
      38  
      39  int
      40  main (void)
      41  {
      42    unsigned char *buf1, *buf2;
      43    size_t page_size = 2 * sysconf(_SC_PAGESIZE);
      44  
      45    buf1 = mmap (0, (1 + 1) * page_size, PROT_READ | PROT_WRITE,
      46  	       MAP_PRIVATE | MAP_ANON, -1, 0);
      47    if (buf1 == MAP_FAILED)
      48      return -1;
      49    if (mprotect (buf1 + 1 * page_size, page_size, PROT_NONE))
      50      return -1;
      51    buf2 = mmap (0, 2 * page_size, PROT_READ | PROT_WRITE,
      52  	       MAP_PRIVATE | MAP_ANON, -1, 0);
      53    if (buf2 == MAP_FAILED)
      54      return -1;
      55    if (mprotect (buf2 + page_size, page_size, PROT_NONE))
      56      return -1;
      57  
      58    memset (buf1, 0xa5, 1 * page_size);
      59    memset (buf2, 0x5a, page_size);
      60  
      61    char *s1 = (char *) buf1;
      62    char *s2 = (char *) buf2;
      63  
      64    size_t len;
      65    size_t i, j;
      66    len = 1 << 2;
      67    for (i = 0, j = 1; i < len; i++, j += 23)
      68      s1[i] = j;
      69  
      70    do_test (s1, s2, 10, 1 << 2);
      71  
      72    len = 1 << 4;
      73    for (i = 0, j = 1; i < len; i++, j += 23)
      74      s1[i] = j;
      75  
      76    do_test (s1, s2, 10, 1 << 4);
      77  
      78    return ret;
      79  }