Vitaly Buka b4257d3bf5 [tsan] Replace mem intrinsics with calls to interceptors
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
2022-09-06 13:09:31 -07:00

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