mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-18 00:26:42 +00:00

After https://reviews.llvm.org/rG463aa814182a23 tsan replaces llvm intrinsics with calls to glibc functions. However this approach is fragile, as slight changes in pipeline can return llvm intrinsics back. In particular InstCombine can do that. Msan/Asan already declare own version of these memory functions for the similar purpose. KCSAN, or anything that uses something else than compiler-rt, needs to implement this callbacks. Reviewed By: melver Differential Revision: https://reviews.llvm.org/D133268
37 lines
833 B
C++
37 lines
833 B
C++
// RUN: %clangxx_tsan -O1 %s -o %t && %deflake %run %t 2>&1 | FileCheck %s
|
|
#include "test.h"
|
|
#include <string.h>
|
|
|
|
int x[4], z[4];
|
|
|
|
void *MemCpyThread(void *a) {
|
|
memcpy((int*)a, z, 16);
|
|
barrier_wait(&barrier);
|
|
return NULL;
|
|
}
|
|
|
|
void *MemSetThread(void *a) {
|
|
barrier_wait(&barrier);
|
|
memset((int*)a, 0, 16);
|
|
return NULL;
|
|
}
|
|
|
|
int main() {
|
|
barrier_init(&barrier, 2);
|
|
pthread_t t[2];
|
|
// Race on x between memcpy and memset
|
|
pthread_create(&t[0], NULL, MemCpyThread, x);
|
|
pthread_create(&t[1], NULL, MemSetThread, x);
|
|
pthread_join(t[0], NULL);
|
|
pthread_join(t[1], NULL);
|
|
fprintf(stderr, "PASS\n");
|
|
return 0;
|
|
}
|
|
|
|
// CHECK: WARNING: ThreadSanitizer: data race
|
|
// CHECK: #0 {{.*}}memset
|
|
// CHECK: #{{[12]}} MemSetThread
|
|
// CHECK: Previous write
|
|
// CHECK: #0 {{.*mem(cpy|move)}}
|
|
// CHECK: #{{[12]}} MemCpyThread
|