brintos

brintos / llvm-project-archived public Read only

0
0
Text · 4.3 KiB · 6fd5524 Raw
143 lines · c
1#ifndef __TSAN_TEST_H__2#define __TSAN_TEST_H__3 4#include <pthread.h>5#include <stdlib.h>6#include <stdio.h>7#include <unistd.h>8#include <dlfcn.h>9#include <stddef.h>10#include <sched.h>11#include <stdarg.h>12#include "sanitizer_common/print_address.h"13 14#include <sanitizer/tsan_interface.h>15 16#ifdef __APPLE__17#include <mach/mach_time.h>18#endif19 20#ifndef TSAN_VECTORIZE21#  define TSAN_VECTORIZE __SSE4_2__22#endif23 24#if TSAN_VECTORIZE25#  include <emmintrin.h>26#  include <smmintrin.h>27#else28struct __m128i {29  unsigned long long x[2];30};31#endif32 33// TSan-invisible barrier.34// Tests use it to establish necessary execution order in a way that does not35// interfere with tsan (does not establish synchronization between threads).36typedef unsigned invisible_barrier_t;37 38#ifdef __cplusplus39extern "C" {40#endif41void __tsan_testonly_barrier_init(invisible_barrier_t *barrier,42    unsigned count);43void __tsan_testonly_barrier_wait(invisible_barrier_t *barrier);44unsigned long __tsan_testonly_shadow_stack_current_size();45#ifdef __cplusplus46}47#endif48 49static inline void barrier_init(invisible_barrier_t *barrier, unsigned count) {50  __tsan_testonly_barrier_init(barrier, count);51}52 53static inline void barrier_wait(invisible_barrier_t *barrier) {54  __tsan_testonly_barrier_wait(barrier);55}56 57// Default instance of the barrier, but a test can declare more manually.58invisible_barrier_t barrier;59 60#ifdef __APPLE__61unsigned long long monotonic_clock_ns() {62  static mach_timebase_info_data_t timebase_info;63  if (timebase_info.denom == 0) mach_timebase_info(&timebase_info);64  return (mach_absolute_time() * timebase_info.numer) / timebase_info.denom;65}66#else67unsigned long long monotonic_clock_ns() {68  struct timespec t;69  clock_gettime(CLOCK_MONOTONIC, &t);70  return (unsigned long long)t.tv_sec * 1000000000ull + t.tv_nsec;71}72#endif73 74//The const kPCInc must be in sync with StackTrace::GetPreviousInstructionPc75#if defined(__s390__) || defined(__i386__) || defined(__x86_64__)76const int kPCInc = 1;77#elif defined(__sparc__) || defined(__mips__)78const int kPCInc = 8;79#elif defined(__riscv) && __riscv_xlen == 6480const int kPCInc = 2;81#else82const int kPCInc = 4;83#endif84 85#ifdef __cplusplus86extern "C" {87#endif88 89void AnnotateThreadName(const char *f, int l, const char *name);90 91void AnnotateRWLockCreate(const char *f, int l, void *m);92void AnnotateRWLockCreateStatic(const char *f, int l, void *m);93void AnnotateRWLockDestroy(const char *f, int l, void *m);94void AnnotateRWLockAcquired(const char *f, int l, void *m, long is_w);95void AnnotateRWLockReleased(const char *f, int l, void *m, long is_w);96 97void AnnotateIgnoreReadsBegin(const char *f, int l);98void AnnotateIgnoreReadsEnd(const char *f, int l);99void AnnotateIgnoreWritesBegin(const char *f, int l);100void AnnotateIgnoreWritesEnd(const char *f, int l);101 102void AnnotateIgnoreSyncBegin(const char *f, int l);103void AnnotateIgnoreSyncEnd(const char *f, int l);104 105void AnnotateHappensBefore(const char *f, int l, void *addr);106void AnnotateHappensAfter(const char *f, int l, void *addr);107 108void AnnotateBenignRaceSized(const char *f, int l, const volatile void *mem,109                             unsigned int size, const char *desc);110void WTFAnnotateBenignRaceSized(const char *f, int l, const volatile void *mem,111                                unsigned int size, const char *desc);112 113#ifdef __cplusplus114}115#endif116 117#define ANNOTATE_RWLOCK_CREATE(m) \118    AnnotateRWLockCreate(__FILE__, __LINE__, m)119#define ANNOTATE_RWLOCK_CREATE_STATIC(m) \120    AnnotateRWLockCreateStatic(__FILE__, __LINE__, m)121#define ANNOTATE_RWLOCK_DESTROY(m) \122    AnnotateRWLockDestroy(__FILE__, __LINE__, m)123#define ANNOTATE_RWLOCK_ACQUIRED(m, is_w) \124    AnnotateRWLockAcquired(__FILE__, __LINE__, m, is_w)125#define ANNOTATE_RWLOCK_RELEASED(m, is_w) \126    AnnotateRWLockReleased(__FILE__, __LINE__, m, is_w)127#define ANNOTATE_HAPPENS_BEFORE(addr) \128  AnnotateHappensBefore(__FILE__, __LINE__, (void *)(addr))129#define ANNOTATE_HAPPENS_AFTER(addr) \130  AnnotateHappensAfter(__FILE__, __LINE__, (void *)(addr))131#define ANNOTATE_BENIGN_RACE(var) \132  AnnotateBenignRaceSized(__FILE__, __LINE__, &(var), sizeof(var), #var)133#define WTF_ANNOTATE_BENIGN_RACE(var) \134  WTFAnnotateBenignRaceSized(__FILE__, __LINE__, &(var), sizeof(var), #var)135 136#ifdef __APPLE__137#define ASM_SYMBOL(symbol) "_" #symbol138#else139#define ASM_SYMBOL(symbol) #symbol140#endif141 142#endif // __TSAN_TEST_H__143