brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.9 KiB · 9d247a2 Raw
116 lines · cpp
1// RUN: %clangxx_tsan -O1 %s -o %t2// RUN: %deflake %run %t 2>&1 | FileCheck %s3 4#include <pthread.h>5#include <stdint.h>6#include <stdio.h>7#include <stdlib.h>8#include <string.h>9 10#include "test.h"11 12extern "C" {13void __tsan_on_report(void *report);14void *__tsan_get_current_report();15int __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);20int __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);23int __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);27}28 29long my_global;30 31void *Thread(void *a) {32  barrier_wait(&barrier);33  my_global = 42;34  return NULL;35}36 37int main() {38  barrier_init(&barrier, 2);39  fprintf(stderr, "&my_global = %p\n", &my_global);40  // CHECK: &my_global = [[GLOBAL:0x[0-9a-f]+]]41  pthread_t t;42  pthread_create(&t, 0, Thread, 0);43  my_global = 41;44  barrier_wait(&barrier);45  pthread_join(t, 0);46  fprintf(stderr, "Done.\n");47}48 49// Required for dyld macOS 12.0+50#if (__APPLE__)51__attribute__((weak))52#endif53__attribute__((disable_sanitizer_instrumentation))54extern "C" void55__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]]61 62  const char *description;63  int count;64  int stack_count, mop_count, loc_count, mutex_count, thread_count,65      unique_tid_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 = 072 73  fprintf(stderr, "mop_count = %d\n", mop_count);74  // CHECK: mop_count = 275 76  int tid;77  void *addr;78  int size, write, atomic;79  void *trace[16] = {0};80 81  __tsan_get_report_mop(report, 0, &tid, &addr, &size, &write, &atomic, trace,82                        16);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 = 086  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\)}}88 89  __tsan_get_report_mop(report, 1, &tid, &addr, &size, &write, &atomic, trace,90                        16);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 = 094  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\)}}96 97  fprintf(stderr, "thread_count = %d\n", thread_count);98  // CHECK: thread_count = 299 100  uint64_t os_id;101  int running;102  const char *name;103  int parent_tid;104 105  __tsan_get_report_thread(report, 0, &tid, &os_id, &running, &name, &parent_tid, trace, 16);106  fprintf(stderr, "tid = %d\n", tid);107  // CHECK: tid = 1108 109  __tsan_get_report_thread(report, 1, &tid, &os_id, &running, &name, &parent_tid, trace, 16);110  fprintf(stderr, "tid = %d\n", tid);111  // CHECK: tid = 0112}113 114// CHECK: Done.115// CHECK: ThreadSanitizer: reported 1 warnings116