1*7c3d14c8STreehugger Robot // RUN: %clangxx_tsan -O1 %s -o %t -DORDER1 && %deflake %run %t | FileCheck %s 2*7c3d14c8STreehugger Robot // RUN: %clangxx_tsan -O1 %s -o %t -DORDER2 && %deflake %run %t | FileCheck %s 3*7c3d14c8STreehugger Robot #include "test.h" 4*7c3d14c8STreehugger Robot 5*7c3d14c8STreehugger Robot volatile int X; 6*7c3d14c8STreehugger Robot volatile int N; 7*7c3d14c8STreehugger Robot void (*volatile F)(); 8*7c3d14c8STreehugger Robot foo()9*7c3d14c8STreehugger Robotstatic void foo() { 10*7c3d14c8STreehugger Robot if (--N == 0) 11*7c3d14c8STreehugger Robot X = 42; 12*7c3d14c8STreehugger Robot else 13*7c3d14c8STreehugger Robot F(); 14*7c3d14c8STreehugger Robot } 15*7c3d14c8STreehugger Robot Thread(void * p)16*7c3d14c8STreehugger Robotvoid *Thread(void *p) { 17*7c3d14c8STreehugger Robot #ifdef ORDER1 18*7c3d14c8STreehugger Robot barrier_wait(&barrier); 19*7c3d14c8STreehugger Robot #endif 20*7c3d14c8STreehugger Robot F(); 21*7c3d14c8STreehugger Robot #ifdef ORDER2 22*7c3d14c8STreehugger Robot barrier_wait(&barrier); 23*7c3d14c8STreehugger Robot #endif 24*7c3d14c8STreehugger Robot return 0; 25*7c3d14c8STreehugger Robot } 26*7c3d14c8STreehugger Robot main()27*7c3d14c8STreehugger Robotint main() { 28*7c3d14c8STreehugger Robot barrier_init(&barrier, 2); 29*7c3d14c8STreehugger Robot N = 50000; 30*7c3d14c8STreehugger Robot F = foo; 31*7c3d14c8STreehugger Robot pthread_t t; 32*7c3d14c8STreehugger Robot pthread_attr_t a; 33*7c3d14c8STreehugger Robot pthread_attr_init(&a); 34*7c3d14c8STreehugger Robot pthread_attr_setstacksize(&a, N * 256 + (1 << 20)); 35*7c3d14c8STreehugger Robot pthread_create(&t, &a, Thread, 0); 36*7c3d14c8STreehugger Robot #ifdef ORDER2 37*7c3d14c8STreehugger Robot barrier_wait(&barrier); 38*7c3d14c8STreehugger Robot #endif 39*7c3d14c8STreehugger Robot X = 43; 40*7c3d14c8STreehugger Robot #ifdef ORDER1 41*7c3d14c8STreehugger Robot barrier_wait(&barrier); 42*7c3d14c8STreehugger Robot #endif 43*7c3d14c8STreehugger Robot 44*7c3d14c8STreehugger Robot pthread_join(t, 0); 45*7c3d14c8STreehugger Robot } 46*7c3d14c8STreehugger Robot 47*7c3d14c8STreehugger Robot // CHECK: WARNING: ThreadSanitizer: data race 48*7c3d14c8STreehugger Robot // CHECK: #100 foo 49*7c3d14c8STreehugger Robot // We must output suffucuently large stack (at least 100 frames) 50*7c3d14c8STreehugger Robot 51