blob: 2ab260608bc2620c5ae75bd8c5a18f6b724c9e5f [file] [log] [blame]
/* { dg-do run { target { sysconf && mmap } } } */
/* { dg-options "-O2 -minline-all-stringops" } */
#include <stdint.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/mman.h>
#ifndef MAP_ANON
#define MAP_ANON 0
#endif
#ifndef MAP_FAILED
#define MAP_FAILED ((void *)-1)
#endif
int ret;
static void
do_one_test (char *dst, char *src, const char *orig_src, unsigned int len)
{
__builtin_memcpy (src, orig_src, len);
__builtin_memmove (dst, src, len);
if (__builtin_memcmp (dst, orig_src, len) != 0)
{
ret = 1;
return;
}
}
void
do_test (char *s1, char *s2, int n, unsigned int len)
{
int i;
for (i = 0; i < n; i++)
do_one_test (s2, s2, s1, len);
}
int
main (void)
{
unsigned char *buf1, *buf2;
size_t page_size = 2 * sysconf(_SC_PAGESIZE);
buf1 = mmap (0, (1 + 1) * page_size, PROT_READ | PROT_WRITE,
MAP_PRIVATE | MAP_ANON, -1, 0);
if (buf1 == MAP_FAILED)
return -1;
if (mprotect (buf1 + 1 * page_size, page_size, PROT_NONE))
return -1;
buf2 = mmap (0, 2 * page_size, PROT_READ | PROT_WRITE,
MAP_PRIVATE | MAP_ANON, -1, 0);
if (buf2 == MAP_FAILED)
return -1;
if (mprotect (buf2 + page_size, page_size, PROT_NONE))
return -1;
memset (buf1, 0xa5, 1 * page_size);
memset (buf2, 0x5a, page_size);
char *s1 = (char *) buf1;
char *s2 = (char *) buf2;
size_t len;
size_t i, j;
len = 1 << 2;
for (i = 0, j = 1; i < len; i++, j += 23)
s1[i] = j;
do_test (s1, s2, 10, 1 << 2);
len = 1 << 4;
for (i = 0, j = 1; i < len; i++, j += 23)
s1[i] = j;
do_test (s1, s2, 10, 1 << 4);
return ret;
}