mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-16 22:46:37 +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
52 lines
1.4 KiB
C++
52 lines
1.4 KiB
C++
// RUN: %clangxx_tsan -O1 %s -o %t && %deflake %run %t 2>&1 | FileCheck %s
|
|
#include "../test.h"
|
|
#include <memory.h>
|
|
|
|
// A reproducer for a known issue.
|
|
// See reference to double_race.cpp in tsan_rtl_report.cpp for an explanation.
|
|
|
|
long long buf[2];
|
|
volatile int nreport;
|
|
|
|
__attribute__((disable_sanitizer_instrumentation)) void
|
|
__sanitizer_report_error_summary(const char *summary) {
|
|
nreport++;
|
|
}
|
|
|
|
const int kEventPCBits = 61;
|
|
|
|
extern "C" __attribute__((disable_sanitizer_instrumentation)) bool
|
|
__tsan_symbolize_external(unsigned long pc, char *func_buf,
|
|
unsigned long func_siz, char *file_buf,
|
|
unsigned long file_siz, int *line, int *col) {
|
|
if (pc >> kEventPCBits) {
|
|
printf("bad PC passed to __tsan_symbolize_external: %lx\n", pc);
|
|
_exit(1);
|
|
}
|
|
return true;
|
|
}
|
|
|
|
void *Thread(void *arg) {
|
|
barrier_wait(&barrier);
|
|
memset(buf, 2, sizeof(buf));
|
|
return 0;
|
|
}
|
|
|
|
int main() {
|
|
barrier_init(&barrier, 2);
|
|
pthread_t t;
|
|
pthread_create(&t, 0, Thread, 0);
|
|
memset(buf, 1, sizeof(buf));
|
|
barrier_wait(&barrier);
|
|
pthread_join(t, 0);
|
|
return 0;
|
|
}
|
|
|
|
// CHECK: WARNING: ThreadSanitizer: data race
|
|
// CHECK: Write of size 8 at {{.*}} by thread T1:
|
|
// CHECK: #0 {{.*}}memset
|
|
// CHECK: #{{[12]}} Thread
|
|
// CHECK-NOT: bad PC passed to __tsan_symbolize_external
|
|
// CHECK-NOT: __sanitizer_report_error_summary
|
|
// CHECK-NOT: WARNING: ThreadSanitizer: data race
|