1*bcaeed49SFangrui Song // RUN: %clangxx_tsan -c -O1 -fno-sanitize=thread %s -o %t.o
2*bcaeed49SFangrui Song // RUN: %clangxx_tsan -O1 %s %t.o -o %t && %run %t 2>&1 | FileCheck %s
3*bcaeed49SFangrui Song 
4*bcaeed49SFangrui Song #include <stdio.h>
5*bcaeed49SFangrui Song #include <stdlib.h>
6*bcaeed49SFangrui Song 
7*bcaeed49SFangrui Song #if !__has_feature(thread_sanitizer)
8*bcaeed49SFangrui Song 
9*bcaeed49SFangrui Song // Defined by tsan.
10*bcaeed49SFangrui Song extern "C" void *__interceptor_malloc(unsigned long size);
11*bcaeed49SFangrui Song extern "C" void __interceptor_free(void *p);
malloc(unsigned long size)12*bcaeed49SFangrui Song extern "C" void *malloc(unsigned long size) {
13*bcaeed49SFangrui Song   static int first = 0;
14*bcaeed49SFangrui Song   if (__sync_lock_test_and_set(&first, 1) == 0)
15*bcaeed49SFangrui Song     fprintf(stderr, "user malloc\n");
16*bcaeed49SFangrui Song   return __interceptor_malloc(size);
17*bcaeed49SFangrui Song }
18*bcaeed49SFangrui Song 
free(void * p)19*bcaeed49SFangrui Song extern "C" void free(void *p) {
20*bcaeed49SFangrui Song   __interceptor_free(p);
21*bcaeed49SFangrui Song }
22*bcaeed49SFangrui Song 
23*bcaeed49SFangrui Song #else
24*bcaeed49SFangrui Song 
main()25*bcaeed49SFangrui Song int main() {
26*bcaeed49SFangrui Song   volatile char *p = (char*)malloc(10);
27*bcaeed49SFangrui Song   p[0] = 0;
28*bcaeed49SFangrui Song   free((void*)p);
29*bcaeed49SFangrui Song }
30*bcaeed49SFangrui Song 
31*bcaeed49SFangrui Song #endif
32*bcaeed49SFangrui Song 
33*bcaeed49SFangrui Song // CHECK: user malloc
34*bcaeed49SFangrui Song // CHECK-NOT: ThreadSanitizer
35*bcaeed49SFangrui Song 
36