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