diff options
Diffstat (limited to 'test/tsan/Darwin/external-swift-debugging.cc')
| -rw-r--r-- | test/tsan/Darwin/external-swift-debugging.cc | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/test/tsan/Darwin/external-swift-debugging.cc b/test/tsan/Darwin/external-swift-debugging.cc new file mode 100644 index 0000000000000..603734e5d0355 --- /dev/null +++ b/test/tsan/Darwin/external-swift-debugging.cc @@ -0,0 +1,68 @@ +// 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" +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 |
