xref: /llvm-project/compiler-rt/test/tsan/deep_stack2.cpp (revision dcc6db22d8508a85ecd2b8bdcc5ae5646968c083)
1*dcc6db22SDmitry Vyukov // RUN: %clangxx_tsan -O1 %s -o %t && %deflake %run %t | FileCheck %s
2*dcc6db22SDmitry Vyukov #include "test.h"
3*dcc6db22SDmitry Vyukov 
4*dcc6db22SDmitry Vyukov volatile long X;
5*dcc6db22SDmitry Vyukov volatile long Y;
6*dcc6db22SDmitry Vyukov volatile int N1 = 2 << 10;
7*dcc6db22SDmitry Vyukov volatile int N2 = 32 << 10;
8*dcc6db22SDmitry Vyukov void (*volatile F)();
9*dcc6db22SDmitry Vyukov void (*volatile G)();
10*dcc6db22SDmitry Vyukov 
foo()11*dcc6db22SDmitry Vyukov static void foo() {
12*dcc6db22SDmitry Vyukov   if (--N1)
13*dcc6db22SDmitry Vyukov     return F();
14*dcc6db22SDmitry Vyukov   while (--N2)
15*dcc6db22SDmitry Vyukov     G();
16*dcc6db22SDmitry Vyukov }
17*dcc6db22SDmitry Vyukov 
bar()18*dcc6db22SDmitry Vyukov static void bar() { Y++; }
19*dcc6db22SDmitry Vyukov 
Thread(void * p)20*dcc6db22SDmitry Vyukov void *Thread(void *p) {
21*dcc6db22SDmitry Vyukov   F();
22*dcc6db22SDmitry Vyukov   X = 43;
23*dcc6db22SDmitry Vyukov   barrier_wait(&barrier);
24*dcc6db22SDmitry Vyukov   return 0;
25*dcc6db22SDmitry Vyukov }
26*dcc6db22SDmitry Vyukov 
main()27*dcc6db22SDmitry Vyukov int main() {
28*dcc6db22SDmitry Vyukov   barrier_init(&barrier, 2);
29*dcc6db22SDmitry Vyukov   F = foo;
30*dcc6db22SDmitry Vyukov   G = bar;
31*dcc6db22SDmitry Vyukov   pthread_t t;
32*dcc6db22SDmitry Vyukov   pthread_create(&t, 0, Thread, 0);
33*dcc6db22SDmitry Vyukov   barrier_wait(&barrier);
34*dcc6db22SDmitry Vyukov   X = 43;
35*dcc6db22SDmitry Vyukov   pthread_join(t, 0);
36*dcc6db22SDmitry Vyukov }
37*dcc6db22SDmitry Vyukov 
38*dcc6db22SDmitry Vyukov // CHECK: WARNING: ThreadSanitizer: data race
39*dcc6db22SDmitry Vyukov // CHECK:   Write
40*dcc6db22SDmitry Vyukov // CHECK:     #0 main
41*dcc6db22SDmitry Vyukov // CHECK:   Previous write
42*dcc6db22SDmitry Vyukov // CHECK:     #0 Thread
43