1*bcaeed49SFangrui Song // RUN: %clangxx_tsan %s -o %t 2*bcaeed49SFangrui Song // RUN: %deflake %run %t 2>&1 | FileCheck %s 3*bcaeed49SFangrui Song 4*bcaeed49SFangrui Song #include <thread> 5*bcaeed49SFangrui Song 6*bcaeed49SFangrui Song #import "../test.h" 7*bcaeed49SFangrui Song 8*bcaeed49SFangrui Song extern "C" { 9*bcaeed49SFangrui Song void __tsan_write8(void *addr); 10*bcaeed49SFangrui Song } 11*bcaeed49SFangrui Song 12*bcaeed49SFangrui Song static void *tag = (void *)0x1; 13*bcaeed49SFangrui Song 14*bcaeed49SFangrui Song __attribute__((no_sanitize("thread"))) ExternalWrite(void * addr)15*bcaeed49SFangrui Songvoid ExternalWrite(void *addr) { 16*bcaeed49SFangrui Song __tsan_external_write(addr, nullptr, tag); 17*bcaeed49SFangrui Song } 18*bcaeed49SFangrui Song 19*bcaeed49SFangrui Song __attribute__((no_sanitize("thread"))) RegularWrite(void * addr)20*bcaeed49SFangrui Songvoid RegularWrite(void *addr) { 21*bcaeed49SFangrui Song __tsan_write8(addr); 22*bcaeed49SFangrui Song } 23*bcaeed49SFangrui Song main(int argc,char * argv[])24*bcaeed49SFangrui Songint main(int argc, char *argv[]) { 25*bcaeed49SFangrui Song barrier_init(&barrier, 2); 26*bcaeed49SFangrui Song fprintf(stderr, "Start.\n"); 27*bcaeed49SFangrui Song // CHECK: Start. 28*bcaeed49SFangrui Song 29*bcaeed49SFangrui Song { 30*bcaeed49SFangrui Song void *opaque_object = malloc(16); 31*bcaeed49SFangrui Song std::thread t1([opaque_object] { 32*bcaeed49SFangrui Song ExternalWrite(opaque_object); 33*bcaeed49SFangrui Song barrier_wait(&barrier); 34*bcaeed49SFangrui Song }); 35*bcaeed49SFangrui Song std::thread t2([opaque_object] { 36*bcaeed49SFangrui Song barrier_wait(&barrier); 37*bcaeed49SFangrui Song ExternalWrite(opaque_object); 38*bcaeed49SFangrui Song }); 39*bcaeed49SFangrui Song // CHECK: WARNING: ThreadSanitizer: Swift access race 40*bcaeed49SFangrui Song // CHECK: Modifying access of Swift variable at {{.*}} by thread {{.*}} 41*bcaeed49SFangrui Song // CHECK: Previous modifying access of Swift variable at {{.*}} by thread {{.*}} 42*bcaeed49SFangrui Song // CHECK: SUMMARY: ThreadSanitizer: Swift access race 43*bcaeed49SFangrui Song t1.join(); 44*bcaeed49SFangrui Song t2.join(); 45*bcaeed49SFangrui Song } 46*bcaeed49SFangrui Song 47*bcaeed49SFangrui Song fprintf(stderr, "external+external test done.\n"); 48*bcaeed49SFangrui Song // CHECK: external+external test done. 49*bcaeed49SFangrui Song 50*bcaeed49SFangrui Song { 51*bcaeed49SFangrui Song void *opaque_object = malloc(16); 52*bcaeed49SFangrui Song std::thread t1([opaque_object] { 53*bcaeed49SFangrui Song ExternalWrite(opaque_object); 54*bcaeed49SFangrui Song barrier_wait(&barrier); 55*bcaeed49SFangrui Song }); 56*bcaeed49SFangrui Song std::thread t2([opaque_object] { 57*bcaeed49SFangrui Song barrier_wait(&barrier); 58*bcaeed49SFangrui Song RegularWrite(opaque_object); 59*bcaeed49SFangrui Song }); 60*bcaeed49SFangrui Song // CHECK: WARNING: ThreadSanitizer: Swift access race 61*bcaeed49SFangrui Song // CHECK: Write of size 8 at {{.*}} by thread {{.*}} 62*bcaeed49SFangrui Song // CHECK: Previous modifying access of Swift variable at {{.*}} by thread {{.*}} 63*bcaeed49SFangrui Song // CHECK: SUMMARY: ThreadSanitizer: Swift access race 64*bcaeed49SFangrui Song t1.join(); 65*bcaeed49SFangrui Song t2.join(); 66*bcaeed49SFangrui Song } 67*bcaeed49SFangrui Song 68*bcaeed49SFangrui Song fprintf(stderr, "external+regular test done.\n"); 69*bcaeed49SFangrui Song // CHECK: external+regular test done. 70*bcaeed49SFangrui Song 71*bcaeed49SFangrui Song { 72*bcaeed49SFangrui Song void *opaque_object = malloc(16); 73*bcaeed49SFangrui Song std::thread t1([opaque_object] { 74*bcaeed49SFangrui Song RegularWrite(opaque_object); 75*bcaeed49SFangrui Song barrier_wait(&barrier); 76*bcaeed49SFangrui Song }); 77*bcaeed49SFangrui Song std::thread t2([opaque_object] { 78*bcaeed49SFangrui Song barrier_wait(&barrier); 79*bcaeed49SFangrui Song ExternalWrite(opaque_object); 80*bcaeed49SFangrui Song }); 81*bcaeed49SFangrui Song // CHECK: WARNING: ThreadSanitizer: Swift access race 82*bcaeed49SFangrui Song // CHECK: Modifying access of Swift variable at {{.*}} by thread {{.*}} 83*bcaeed49SFangrui Song // CHECK: Previous write of size 8 at {{.*}} by thread {{.*}} 84*bcaeed49SFangrui Song // CHECK: SUMMARY: ThreadSanitizer: Swift access race 85*bcaeed49SFangrui Song t1.join(); 86*bcaeed49SFangrui Song t2.join(); 87*bcaeed49SFangrui Song } 88*bcaeed49SFangrui Song 89*bcaeed49SFangrui Song fprintf(stderr, "regular+external test done.\n"); 90*bcaeed49SFangrui Song // CHECK: regular+external test done. 91*bcaeed49SFangrui Song } 92*bcaeed49SFangrui Song 93