16a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines// RUN: %clang_tsan -O1 %s -o %t && %deflake %run %t | FileCheck %s
286277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#include "test.h"
3da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany
4da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryanyint Global;
5da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany
6da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryanyvoid __attribute__((noinline)) foo1() {
7da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany  Global = 42;
8da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany}
9da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany
10da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryanyvoid __attribute__((noinline)) bar1() {
11da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany  volatile int tmp = 42; (void)tmp;
12da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany  foo1();
13da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany}
14da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany
15da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryanyvoid __attribute__((noinline)) foo2() {
16da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany  volatile int v = Global; (void)v;
17da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany}
18da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany
19da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryanyvoid __attribute__((noinline)) bar2() {
20da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany  volatile int tmp = 42; (void)tmp;
21da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany  foo2();
22da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany}
23da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany
24da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryanyvoid *Thread1(void *x) {
2586277eb844c4983c81de62d7c050e92fe7155788Stephen Hines  barrier_wait(&barrier);
26da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany  bar1();
27da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany  return NULL;
28da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany}
29da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany
30da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryanyvoid *Thread2(void *x) {
31da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany  bar2();
3286277eb844c4983c81de62d7c050e92fe7155788Stephen Hines  barrier_wait(&barrier);
33da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany  return NULL;
34da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany}
35da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany
36da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryanyvoid StartThread(pthread_t *t, void *(*f)(void*)) {
37da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany  pthread_create(t, NULL, f, NULL);
38da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany}
39da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany
40da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryanyint main() {
4186277eb844c4983c81de62d7c050e92fe7155788Stephen Hines  barrier_init(&barrier, 2);
42da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany  pthread_t t[2];
43da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany  StartThread(&t[0], Thread1);
44da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany  StartThread(&t[1], Thread2);
45da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany  pthread_join(t[0], NULL);
46da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany  pthread_join(t[1], NULL);
47da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany  return 0;
48da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany}
49da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany
50da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany// CHECK:      WARNING: ThreadSanitizer: data race
51ad9da372f962495b3487685232d09390be841b1cDmitry Vyukov// CHECK-NEXT:   Write of size 4 at {{.*}} by thread T1:
5286277eb844c4983c81de62d7c050e92fe7155788Stephen Hines// CHECK-NEXT:     #0 foo1{{.*}} {{.*}}simple_stack.c:7{{(:10)?}} ({{.*}})
5386277eb844c4983c81de62d7c050e92fe7155788Stephen Hines// CHECK-NEXT:     #1 bar1{{.*}} {{.*}}simple_stack.c:12{{(:3)?}} ({{.*}})
5486277eb844c4983c81de62d7c050e92fe7155788Stephen Hines// CHECK-NEXT:     #2 Thread1{{.*}} {{.*}}simple_stack.c:26{{(:3)?}} ({{.*}})
55ad9da372f962495b3487685232d09390be841b1cDmitry Vyukov// CHECK:        Previous read of size 4 at {{.*}} by thread T2:
5686277eb844c4983c81de62d7c050e92fe7155788Stephen Hines// CHECK-NEXT:     #0 foo2{{.*}} {{.*}}simple_stack.c:16{{(:20)?}} ({{.*}})
5786277eb844c4983c81de62d7c050e92fe7155788Stephen Hines// CHECK-NEXT:     #1 bar2{{.*}} {{.*}}simple_stack.c:21{{(:3)?}} ({{.*}})
5886277eb844c4983c81de62d7c050e92fe7155788Stephen Hines// CHECK-NEXT:     #2 Thread2{{.*}} {{.*}}simple_stack.c:31{{(:3)?}} ({{.*}})
59da3503782901d30bd6e48885055b51b38cf5126cDmitry Vyukov// CHECK:        Thread T1 (tid={{.*}}, running) created by main thread at:
60da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany// CHECK-NEXT:     #0 pthread_create {{.*}} ({{.*}})
6186277eb844c4983c81de62d7c050e92fe7155788Stephen Hines// CHECK-NEXT:     #1 StartThread{{.*}} {{.*}}simple_stack.c:37{{(:3)?}} ({{.*}})
623168586f24f2d275e6fae167d9a4d98238004f43Alexey Samsonov// CHECK-NEXT:     #2 main{{.*}} {{.*}}simple_stack.c:43{{(:3)?}} ({{.*}})
63da3503782901d30bd6e48885055b51b38cf5126cDmitry Vyukov// CHECK:        Thread T2 ({{.*}}) created by main thread at:
64da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany// CHECK-NEXT:     #0 pthread_create {{.*}} ({{.*}})
6586277eb844c4983c81de62d7c050e92fe7155788Stephen Hines// CHECK-NEXT:     #1 StartThread{{.*}} {{.*}}simple_stack.c:37{{(:3)?}} ({{.*}})
663168586f24f2d275e6fae167d9a4d98238004f43Alexey Samsonov// CHECK-NEXT:     #2 main{{.*}} {{.*}}simple_stack.c:44{{(:3)?}} ({{.*}})
67