Index: test/tsan/Linux/lit.local.cfg =================================================================== --- test/tsan/Linux/lit.local.cfg +++ test/tsan/Linux/lit.local.cfg @@ -0,0 +1,9 @@ +def getRoot(config): + if not config.parent: + return config + return getRoot(config.parent) + +root = getRoot(config) + +if root.host_os not in ['Linux']: + config.unsupported = True Index: test/tsan/Linux/user_fopen.cc =================================================================== --- test/tsan/Linux/user_fopen.cc +++ test/tsan/Linux/user_fopen.cc @@ -0,0 +1,34 @@ +// RUN: %clangxx_tsan -O1 %s -o %t && %run %t 2>&1 | FileCheck %s +#include +#include + +// Defined by tsan. +extern "C" FILE *__interceptor_fopen(const char *file, const char *mode); +extern "C" int __interceptor_fileno(FILE *f); + +extern "C" FILE *fopen(const char *file, const char *mode) { + static int first = 0; + if (__sync_lock_test_and_set(&first, 1) == 0) + printf("user fopen\n"); + return __interceptor_fopen(file, mode); +} + +extern "C" int fileno(FILE *f) { + static int first = 0; + if (__sync_lock_test_and_set(&first, 1) == 0) + printf("user fileno\n"); + return 1; +} + +int main() { + FILE *f = fopen("/dev/zero", "r"); + if (f) { + char buf; + fread(&buf, 1, 1, f); + fclose(f); + } +} + +// CHECK: user fopen +// CHECK-NOT: ThreadSanitizer + Index: test/tsan/Linux/user_malloc.cc =================================================================== --- test/tsan/Linux/user_malloc.cc +++ test/tsan/Linux/user_malloc.cc @@ -0,0 +1,27 @@ +// RUN: %clangxx_tsan -O1 %s -o %t && %run %t 2>&1 | FileCheck %s +#include + +// Defined by tsan. +extern "C" void *__interceptor_malloc(unsigned long size); +extern "C" void __interceptor_free(void *p); + +extern "C" void *malloc(unsigned long size) { + static int first = 0; + if (__sync_lock_test_and_set(&first, 1) == 0) + printf("user malloc\n"); + return __interceptor_malloc(size); +} + +extern "C" void free(void *p) { + __interceptor_free(p); +} + +int main() { + volatile char *p = (char*)malloc(10); + p[0] = 0; + free((void*)p); +} + +// CHECK: user malloc +// CHECK-NOT: ThreadSanitizer + Index: test/tsan/user_fopen.cc =================================================================== --- test/tsan/user_fopen.cc +++ test/tsan/user_fopen.cc @@ -1,34 +0,0 @@ -// RUN: %clangxx_tsan -O1 %s -o %t && %run %t 2>&1 | FileCheck %s -#include -#include - -// defined by tsan. -extern "C" FILE *__interceptor_fopen(const char *file, const char *mode); -extern "C" int __interceptor_fileno(FILE *f); - -extern "C" FILE *fopen(const char *file, const char *mode) { - static int first = 0; - if (__sync_lock_test_and_set(&first, 1) == 0) - printf("user fopen\n"); - return __interceptor_fopen(file, mode); -} - -extern "C" int fileno(FILE *f) { - static int first = 0; - if (__sync_lock_test_and_set(&first, 1) == 0) - printf("user fileno\n"); - return 1; -} - -int main() { - FILE *f = fopen("/dev/zero", "r"); - if (f) { - char buf; - fread(&buf, 1, 1, f); - fclose(f); - } -} - -// CHECK: user fopen -// CHECK-NOT: ThreadSanitizer - Index: test/tsan/user_malloc.cc =================================================================== --- test/tsan/user_malloc.cc +++ test/tsan/user_malloc.cc @@ -1,27 +0,0 @@ -// RUN: %clangxx_tsan -O1 %s -o %t && %run %t 2>&1 | FileCheck %s -#include - -// defined by tsan. -extern "C" void *__interceptor_malloc(unsigned long size); -extern "C" void __interceptor_free(void *p); - -extern "C" void *malloc(unsigned long size) { - static int first = 0; - if (__sync_lock_test_and_set(&first, 1) == 0) - printf("user malloc\n"); - return __interceptor_malloc(size); -} - -extern "C" void free(void *p) { - __interceptor_free(p); -} - -int main() { - volatile char *p = (char*)malloc(10); - p[0] = 0; - free((void*)p); -} - -// CHECK: user malloc -// CHECK-NOT: ThreadSanitizer -