All runtime callbacks must be non-instrumented with the new tsan runtime (it's now more picky with respect to recursion into runtime). Disable instrumentation in Darwin tests as we do in all other tests now. Differential Revision: https://reviews.llvm.org/D114348
69 lines
2.2 KiB
C++
69 lines
2.2 KiB
C++
// RUN: %clangxx_tsan %s -o %t
|
|
// RUN: %deflake %run %t 2>&1 | FileCheck %s
|
|
|
|
#include <thread>
|
|
|
|
#import "../test.h"
|
|
|
|
|
|
extern "C" {
|
|
int __tsan_get_report_data(void *report, const char **description, int *count,
|
|
int *stack_count, int *mop_count, int *loc_count,
|
|
int *mutex_count, int *thread_count,
|
|
int *unique_tid_count, void **sleep_trace,
|
|
unsigned long trace_size);
|
|
int __tsan_get_report_tag(void *report, unsigned long *tag);
|
|
}
|
|
|
|
__attribute__((no_sanitize("thread"), noinline))
|
|
void ExternalWrite(void *addr) {
|
|
void *kSwiftAccessRaceTag = (void *)0x1;
|
|
__tsan_external_write(addr, nullptr, kSwiftAccessRaceTag);
|
|
}
|
|
|
|
int main(int argc, char *argv[]) {
|
|
barrier_init(&barrier, 2);
|
|
fprintf(stderr, "Start.\n");
|
|
// CHECK: Start.
|
|
|
|
void *opaque_object = malloc(16);
|
|
std::thread t1([opaque_object] {
|
|
ExternalWrite(opaque_object);
|
|
barrier_wait(&barrier);
|
|
});
|
|
std::thread t2([opaque_object] {
|
|
barrier_wait(&barrier);
|
|
ExternalWrite(opaque_object);
|
|
});
|
|
// CHECK: WARNING: ThreadSanitizer: Swift access race
|
|
// CHECK: Modifying access of Swift variable at {{.*}} by thread {{.*}}
|
|
// CHECK: Previous modifying access of Swift variable at {{.*}} by thread {{.*}}
|
|
// CHECK: SUMMARY: ThreadSanitizer: Swift access race
|
|
t1.join();
|
|
t2.join();
|
|
|
|
fprintf(stderr, "Done.\n");
|
|
}
|
|
|
|
extern "C" __attribute__((disable_sanitizer_instrumentation)) void
|
|
__tsan_on_report(void *report) {
|
|
const char *description;
|
|
int count;
|
|
int stack_count, mop_count, loc_count, mutex_count, thread_count,
|
|
unique_tid_count;
|
|
void *sleep_trace[16] = {0};
|
|
__tsan_get_report_data(report, &description, &count, &stack_count, &mop_count,
|
|
&loc_count, &mutex_count, &thread_count,
|
|
&unique_tid_count, sleep_trace, 16);
|
|
fprintf(stderr, "report type = '%s', count = %d\n", description, count);
|
|
// CHECK: report type = 'external-race', count = 0
|
|
|
|
unsigned long tag;
|
|
__tsan_get_report_tag(report, &tag);
|
|
fprintf(stderr, "tag = %ld\n", tag);
|
|
// CHECK: tag = 1
|
|
}
|
|
|
|
// CHECK: Done.
|
|
// CHECK: ThreadSanitizer: reported 1 warnings
|