xref: /aosp_15_r20/external/compiler-rt/test/tsan/bench_shadow_flush.cc (revision 7c3d14c8b49c529e04be81a3ce6f5cc23712e4c6)
1*7c3d14c8STreehugger Robot // RUN: %clangxx_tsan %s -o %t
2*7c3d14c8STreehugger Robot // RUN: %run %t 2>&1 | FileCheck %s
3*7c3d14c8STreehugger Robot 
4*7c3d14c8STreehugger Robot #include <pthread.h>
5*7c3d14c8STreehugger Robot #include <stdlib.h>
6*7c3d14c8STreehugger Robot #include <stddef.h>
7*7c3d14c8STreehugger Robot #include <unistd.h>
8*7c3d14c8STreehugger Robot #include <stdio.h>
9*7c3d14c8STreehugger Robot #include <time.h>
10*7c3d14c8STreehugger Robot #include <sys/mman.h>
11*7c3d14c8STreehugger Robot 
12*7c3d14c8STreehugger Robot const long kSmallPage = 4 << 10;
13*7c3d14c8STreehugger Robot const long kLargePage = 2 << 20;
14*7c3d14c8STreehugger Robot const long kStride    = 1 << 10;
15*7c3d14c8STreehugger Robot 
16*7c3d14c8STreehugger Robot typedef unsigned long uptr;
17*7c3d14c8STreehugger Robot 
main(int argc,const char ** argv)18*7c3d14c8STreehugger Robot int main(int argc, const char **argv) {
19*7c3d14c8STreehugger Robot   uptr mem_size = 4 << 20;
20*7c3d14c8STreehugger Robot   if (argc > 1)
21*7c3d14c8STreehugger Robot     mem_size = (uptr)atoi(argv[1]) << 20;
22*7c3d14c8STreehugger Robot   uptr stride = kSmallPage;
23*7c3d14c8STreehugger Robot   if (argc > 2)
24*7c3d14c8STreehugger Robot     stride = (uptr)atoi(argv[2]) << 10;
25*7c3d14c8STreehugger Robot   int niter = 1;
26*7c3d14c8STreehugger Robot   if (argc > 3)
27*7c3d14c8STreehugger Robot     niter = atoi(argv[3]);
28*7c3d14c8STreehugger Robot   int stride2 = 1;
29*7c3d14c8STreehugger Robot   if (argc > 4)
30*7c3d14c8STreehugger Robot     stride2 = atoi(argv[4]);
31*7c3d14c8STreehugger Robot 
32*7c3d14c8STreehugger Robot   uptr sz = mem_size + stride2 * kStride + kLargePage;
33*7c3d14c8STreehugger Robot   void *p = mmap(0, sz, PROT_READ | PROT_WRITE, MAP_ANON | MAP_PRIVATE, -1, 0);
34*7c3d14c8STreehugger Robot   uptr a = ((uptr)p + kLargePage - 1) & ~(kLargePage - 1);
35*7c3d14c8STreehugger Robot   volatile char *mem = (volatile char *)a;
36*7c3d14c8STreehugger Robot 
37*7c3d14c8STreehugger Robot   for (int i = 0; i < niter; i++) {
38*7c3d14c8STreehugger Robot     for (uptr off = 0; off < mem_size; off += stride) {
39*7c3d14c8STreehugger Robot       for (uptr off2 = 0; off2 < stride2; off2++)
40*7c3d14c8STreehugger Robot         mem[off + off2 * kStride] = 42;
41*7c3d14c8STreehugger Robot     }
42*7c3d14c8STreehugger Robot   }
43*7c3d14c8STreehugger Robot 
44*7c3d14c8STreehugger Robot   fprintf(stderr, "DONE\n");
45*7c3d14c8STreehugger Robot }
46*7c3d14c8STreehugger Robot 
47*7c3d14c8STreehugger Robot // CHECK: DONE
48*7c3d14c8STreehugger Robot 
49