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