16d1862363c88c183b0ed7740fca876342cf0474bStephen Hines// RUN: %clangxx_tsan -O1 %s -o %T/simple_stack2.cc.exe && %deflake %run %T/simple_stack2.cc.exe | 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() {
115092682c3a6902e460a6e439cf48b3dc7d48dc65Alexey Samsonov  volatile int tmp = 42;
125092682c3a6902e460a6e439cf48b3dc7d48dc65Alexey Samsonov  int tmp2 = tmp;
135092682c3a6902e460a6e439cf48b3dc7d48dc65Alexey Samsonov  (void)tmp2;
14da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany  foo1();
15da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany}
16da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany
17da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryanyvoid __attribute__((noinline)) foo2() {
185092682c3a6902e460a6e439cf48b3dc7d48dc65Alexey Samsonov  volatile int tmp = Global;
195092682c3a6902e460a6e439cf48b3dc7d48dc65Alexey Samsonov  int tmp2 = tmp;
205092682c3a6902e460a6e439cf48b3dc7d48dc65Alexey Samsonov  (void)tmp2;
21da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany}
22da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany
23da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryanyvoid __attribute__((noinline)) bar2() {
245092682c3a6902e460a6e439cf48b3dc7d48dc65Alexey Samsonov  volatile int tmp = 42;
255092682c3a6902e460a6e439cf48b3dc7d48dc65Alexey Samsonov  int tmp2 = tmp;
265092682c3a6902e460a6e439cf48b3dc7d48dc65Alexey Samsonov  (void)tmp2;
27da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany  foo2();
28da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany}
29da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany
30da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryanyvoid *Thread1(void *x) {
3186277eb844c4983c81de62d7c050e92fe7155788Stephen Hines  barrier_wait(&barrier);
32da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany  bar1();
33da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany  return NULL;
34da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany}
35da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany
36da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryanyint main() {
3786277eb844c4983c81de62d7c050e92fe7155788Stephen Hines  barrier_init(&barrier, 2);
38da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany  pthread_t t;
39da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany  pthread_create(&t, NULL, Thread1, NULL);
40da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany  bar2();
4186277eb844c4983c81de62d7c050e92fe7155788Stephen Hines  barrier_wait(&barrier);
42da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany  pthread_join(t, NULL);
43da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany}
44da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany
45da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany// CHECK:      WARNING: ThreadSanitizer: data race
46ad9da372f962495b3487685232d09390be841b1cDmitry Vyukov// CHECK-NEXT:   Write of size 4 at {{.*}} by thread T1:
4786277eb844c4983c81de62d7c050e92fe7155788Stephen Hines// CHECK-NEXT:     #0 foo1{{.*}} {{.*}}simple_stack2.cc:7{{(:10)?}} (simple_stack2.cc.exe+{{.*}})
4886277eb844c4983c81de62d7c050e92fe7155788Stephen Hines// CHECK-NEXT:     #1 bar1{{.*}} {{.*}}simple_stack2.cc:14{{(:3)?}} (simple_stack2.cc.exe+{{.*}})
4986277eb844c4983c81de62d7c050e92fe7155788Stephen Hines// CHECK-NEXT:     #2 Thread1{{.*}} {{.*}}simple_stack2.cc:32{{(:3)?}} (simple_stack2.cc.exe+{{.*}})
50ff35f1d82b4f145b3477ef27a7a2e7b63c486988Dmitry Vyukov// CHECK:        Previous read of size 4 at {{.*}} by main thread:
5186277eb844c4983c81de62d7c050e92fe7155788Stephen Hines// CHECK-NEXT:     #0 foo2{{.*}} {{.*}}simple_stack2.cc:18{{(:22)?}} (simple_stack2.cc.exe+{{.*}})
5286277eb844c4983c81de62d7c050e92fe7155788Stephen Hines// CHECK-NEXT:     #1 bar2{{.*}} {{.*}}simple_stack2.cc:27{{(:3)?}} (simple_stack2.cc.exe+{{.*}})
5386277eb844c4983c81de62d7c050e92fe7155788Stephen Hines// CHECK-NEXT:     #2 main{{.*}} {{.*}}simple_stack2.cc:40{{(:3)?}} (simple_stack2.cc.exe+{{.*}})
54