1 // RUN: %clangxx_tsan -O1 %s -o %t
2 // RUN: %deflake %run %t 2>&1 | FileCheck %s
13 void __tsan_on_report(void *report
);
14 void *__tsan_get_current_report();
15 int __tsan_get_report_data(void *report
, const char **description
, int *count
,
16 int *stack_count
, int *mop_count
, int *loc_count
,
17 int *mutex_count
, int *thread_count
,
18 int *unique_tid_count
, void **sleep_trace
,
19 unsigned long trace_size
);
20 int __tsan_get_report_mop(void *report
, unsigned long idx
, int *tid
,
21 void **addr
, int *size
, int *write
, int *atomic
,
22 void **trace
, unsigned long trace_size
);
23 int __tsan_get_report_thread(void *report
, unsigned long idx
, int *tid
,
24 uint64_t *os_id
, int *running
,
25 const char **name
, int *parent_tid
, void **trace
,
26 unsigned long trace_size
);
31 void *Thread(void *a
) {
32 barrier_wait(&barrier
);
38 barrier_init(&barrier
, 2);
39 fprintf(stderr
, "&my_global = %p\n", &my_global
);
40 // CHECK: &my_global = [[GLOBAL:0x[0-9a-f]+]]
42 pthread_create(&t
, 0, Thread
, 0);
44 barrier_wait(&barrier
);
46 fprintf(stderr
, "Done.\n");
49 // Required for dyld macOS 12.0+
53 __attribute__((disable_sanitizer_instrumentation
))
55 __tsan_on_report(void *report
) {
56 fprintf(stderr
, "__tsan_on_report(%p)\n", report
);
57 fprintf(stderr
, "__tsan_get_current_report() = %p\n",
58 __tsan_get_current_report());
59 // CHECK: __tsan_on_report([[REPORT:0x[0-9a-f]+]])
60 // CHECK: __tsan_get_current_report() = [[REPORT]]
62 const char *description
;
64 int stack_count
, mop_count
, loc_count
, mutex_count
, thread_count
,
66 void *sleep_trace
[16] = {0};
67 __tsan_get_report_data(report
, &description
, &count
, &stack_count
, &mop_count
,
68 &loc_count
, &mutex_count
, &thread_count
,
69 &unique_tid_count
, sleep_trace
, 16);
70 fprintf(stderr
, "report type = '%s', count = %d\n", description
, count
);
71 // CHECK: report type = 'data-race', count = 0
73 fprintf(stderr
, "mop_count = %d\n", mop_count
);
74 // CHECK: mop_count = 2
78 int size
, write
, atomic
;
79 void *trace
[16] = {0};
81 __tsan_get_report_mop(report
, 0, &tid
, &addr
, &size
, &write
, &atomic
, trace
,
83 fprintf(stderr
, "tid = %d, addr = %p, size = %d, write = %d, atomic = %d\n",
84 tid
, addr
, size
, write
, atomic
);
85 // CHECK: tid = 1, addr = [[GLOBAL]], size = 8, write = 1, atomic = 0
86 fprintf(stderr
, "trace[0] = %p, trace[1] = %p\n", trace
[0], trace
[1]);
87 // CHECK: trace[0] = 0x{{[0-9a-f]+}}, trace[1] = {{0x0|\(nil\)|\(null\)}}
89 __tsan_get_report_mop(report
, 1, &tid
, &addr
, &size
, &write
, &atomic
, trace
,
91 fprintf(stderr
, "tid = %d, addr = %p, size = %d, write = %d, atomic = %d\n",
92 tid
, addr
, size
, write
, atomic
);
93 // CHECK: tid = 0, addr = [[GLOBAL]], size = 8, write = 1, atomic = 0
94 fprintf(stderr
, "trace[0] = %p, trace[1] = %p\n", trace
[0], trace
[1]);
95 // CHECK: trace[0] = 0x{{[0-9a-f]+}}, trace[1] = {{0x0|\(nil\)|\(null\)}}
97 fprintf(stderr
, "thread_count = %d\n", thread_count
);
98 // CHECK: thread_count = 2
105 __tsan_get_report_thread(report
, 0, &tid
, &os_id
, &running
, &name
, &parent_tid
, trace
, 16);
106 fprintf(stderr
, "tid = %d\n", tid
);
109 __tsan_get_report_thread(report
, 1, &tid
, &os_id
, &running
, &name
, &parent_tid
, trace
, 16);
110 fprintf(stderr
, "tid = %d\n", tid
);
115 // CHECK: ThreadSanitizer: reported 1 warnings