mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-16 18:16:35 +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
43 lines
1.1 KiB
C++
43 lines
1.1 KiB
C++
// RUN: %clangxx_tsan -O1 %s -o %t && %deflake %run %t | FileCheck %s
|
|
#include "test.h"
|
|
#include <string.h>
|
|
|
|
char *data0 = new char[10];
|
|
char *data1 = new char[10];
|
|
char *data2 = new char[10];
|
|
|
|
void *Thread1(void *x) {
|
|
static volatile int size = 1;
|
|
static volatile int sink;
|
|
sink = memcmp(data0+5, data1, size);
|
|
barrier_wait(&barrier);
|
|
return NULL;
|
|
}
|
|
|
|
void *Thread2(void *x) {
|
|
static volatile int size = 4;
|
|
barrier_wait(&barrier);
|
|
memcpy(data0+5, data2, size);
|
|
return NULL;
|
|
}
|
|
|
|
int main() {
|
|
barrier_init(&barrier, 2);
|
|
print_address("addr=", 1, &data0[5]);
|
|
pthread_t t[2];
|
|
pthread_create(&t[0], NULL, Thread1, NULL);
|
|
pthread_create(&t[1], NULL, Thread2, NULL);
|
|
pthread_join(t[0], NULL);
|
|
pthread_join(t[1], NULL);
|
|
return 0;
|
|
}
|
|
|
|
// CHECK: addr=[[ADDR:0x[0-9,a-f]+]]
|
|
// CHECK: WARNING: ThreadSanitizer: data race
|
|
// CHECK: Write of size 3 at [[ADDR]] by thread T2:
|
|
// CHECK: #0 {{.*mem(cpy|move)}}
|
|
// CHECK: #{{[12]}} Thread2
|
|
// CHECK: Previous read of size 1 at [[ADDR]] by thread T1:
|
|
// CHECK: #0 {{.*}}memcmp
|
|
// CHECK: #{{[12]}} Thread1
|