forked from OSchip/llvm-project
[tsan] Add TSan __tsan_atomic* functions to tsan_interface.h
To avoid using the public header (tsan_interface_atomic.h), which has different data types, let's add all the __tsan_atomic* functions to tsan_interface.h. Differential Revision: http://reviews.llvm.org/D18543 llvm-svn: 265663
This commit is contained in:
parent
399af93242
commit
06bbca9ec4
|
@ -25,6 +25,8 @@
|
|||
extern "C" {
|
||||
#endif
|
||||
|
||||
#ifndef SANITIZER_GO
|
||||
|
||||
// This function should be called at the very beginning of the process,
|
||||
// before any instrumented code is executed and before any call to malloc.
|
||||
SANITIZER_INTERFACE_ATTRIBUTE void __tsan_init();
|
||||
|
@ -130,8 +132,241 @@ int __tsan_get_report_thread(void *report, uptr idx, int *tid, uptr *pid,
|
|||
SANITIZER_INTERFACE_ATTRIBUTE
|
||||
int __tsan_get_report_unique_tid(void *report, uptr idx, int *tid);
|
||||
|
||||
#endif // SANITIZER_GO
|
||||
|
||||
#ifdef __cplusplus
|
||||
} // extern "C"
|
||||
#endif
|
||||
|
||||
namespace __tsan {
|
||||
|
||||
// These should match declarations from public tsan_interface_atomic.h header.
|
||||
typedef unsigned char a8;
|
||||
typedef unsigned short a16; // NOLINT
|
||||
typedef unsigned int a32;
|
||||
typedef unsigned long long a64; // NOLINT
|
||||
#if !defined(SANITIZER_GO) && (defined(__SIZEOF_INT128__) \
|
||||
|| (__clang_major__ * 100 + __clang_minor__ >= 302)) && !defined(__mips64)
|
||||
__extension__ typedef __int128 a128;
|
||||
# define __TSAN_HAS_INT128 1
|
||||
#else
|
||||
# define __TSAN_HAS_INT128 0
|
||||
#endif
|
||||
|
||||
// Part of ABI, do not change.
|
||||
// http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/atomic?view=markup
|
||||
typedef enum {
|
||||
mo_relaxed,
|
||||
mo_consume,
|
||||
mo_acquire,
|
||||
mo_release,
|
||||
mo_acq_rel,
|
||||
mo_seq_cst
|
||||
} morder;
|
||||
|
||||
struct ThreadState;
|
||||
|
||||
extern "C" {
|
||||
SANITIZER_INTERFACE_ATTRIBUTE
|
||||
a8 __tsan_atomic8_load(const volatile a8 *a, morder mo);
|
||||
SANITIZER_INTERFACE_ATTRIBUTE
|
||||
a16 __tsan_atomic16_load(const volatile a16 *a, morder mo);
|
||||
SANITIZER_INTERFACE_ATTRIBUTE
|
||||
a32 __tsan_atomic32_load(const volatile a32 *a, morder mo);
|
||||
SANITIZER_INTERFACE_ATTRIBUTE
|
||||
a64 __tsan_atomic64_load(const volatile a64 *a, morder mo);
|
||||
#if __TSAN_HAS_INT128
|
||||
SANITIZER_INTERFACE_ATTRIBUTE
|
||||
a128 __tsan_atomic128_load(const volatile a128 *a, morder mo);
|
||||
#endif
|
||||
|
||||
SANITIZER_INTERFACE_ATTRIBUTE
|
||||
void __tsan_atomic8_store(volatile a8 *a, a8 v, morder mo);
|
||||
SANITIZER_INTERFACE_ATTRIBUTE
|
||||
void __tsan_atomic16_store(volatile a16 *a, a16 v, morder mo);
|
||||
SANITIZER_INTERFACE_ATTRIBUTE
|
||||
void __tsan_atomic32_store(volatile a32 *a, a32 v, morder mo);
|
||||
SANITIZER_INTERFACE_ATTRIBUTE
|
||||
void __tsan_atomic64_store(volatile a64 *a, a64 v, morder mo);
|
||||
#if __TSAN_HAS_INT128
|
||||
SANITIZER_INTERFACE_ATTRIBUTE
|
||||
void __tsan_atomic128_store(volatile a128 *a, a128 v, morder mo);
|
||||
#endif
|
||||
|
||||
SANITIZER_INTERFACE_ATTRIBUTE
|
||||
a8 __tsan_atomic8_exchange(volatile a8 *a, a8 v, morder mo);
|
||||
SANITIZER_INTERFACE_ATTRIBUTE
|
||||
a16 __tsan_atomic16_exchange(volatile a16 *a, a16 v, morder mo);
|
||||
SANITIZER_INTERFACE_ATTRIBUTE
|
||||
a32 __tsan_atomic32_exchange(volatile a32 *a, a32 v, morder mo);
|
||||
SANITIZER_INTERFACE_ATTRIBUTE
|
||||
a64 __tsan_atomic64_exchange(volatile a64 *a, a64 v, morder mo);
|
||||
#if __TSAN_HAS_INT128
|
||||
SANITIZER_INTERFACE_ATTRIBUTE
|
||||
a128 __tsan_atomic128_exchange(volatile a128 *a, a128 v, morder mo);
|
||||
#endif
|
||||
|
||||
SANITIZER_INTERFACE_ATTRIBUTE
|
||||
a8 __tsan_atomic8_fetch_add(volatile a8 *a, a8 v, morder mo);
|
||||
SANITIZER_INTERFACE_ATTRIBUTE
|
||||
a16 __tsan_atomic16_fetch_add(volatile a16 *a, a16 v, morder mo);
|
||||
SANITIZER_INTERFACE_ATTRIBUTE
|
||||
a32 __tsan_atomic32_fetch_add(volatile a32 *a, a32 v, morder mo);
|
||||
SANITIZER_INTERFACE_ATTRIBUTE
|
||||
a64 __tsan_atomic64_fetch_add(volatile a64 *a, a64 v, morder mo);
|
||||
#if __TSAN_HAS_INT128
|
||||
SANITIZER_INTERFACE_ATTRIBUTE
|
||||
a128 __tsan_atomic128_fetch_add(volatile a128 *a, a128 v, morder mo);
|
||||
#endif
|
||||
|
||||
SANITIZER_INTERFACE_ATTRIBUTE
|
||||
a8 __tsan_atomic8_fetch_sub(volatile a8 *a, a8 v, morder mo);
|
||||
SANITIZER_INTERFACE_ATTRIBUTE
|
||||
a16 __tsan_atomic16_fetch_sub(volatile a16 *a, a16 v, morder mo);
|
||||
SANITIZER_INTERFACE_ATTRIBUTE
|
||||
a32 __tsan_atomic32_fetch_sub(volatile a32 *a, a32 v, morder mo);
|
||||
SANITIZER_INTERFACE_ATTRIBUTE
|
||||
a64 __tsan_atomic64_fetch_sub(volatile a64 *a, a64 v, morder mo);
|
||||
#if __TSAN_HAS_INT128
|
||||
SANITIZER_INTERFACE_ATTRIBUTE
|
||||
a128 __tsan_atomic128_fetch_sub(volatile a128 *a, a128 v, morder mo);
|
||||
#endif
|
||||
|
||||
SANITIZER_INTERFACE_ATTRIBUTE
|
||||
a8 __tsan_atomic8_fetch_and(volatile a8 *a, a8 v, morder mo);
|
||||
SANITIZER_INTERFACE_ATTRIBUTE
|
||||
a16 __tsan_atomic16_fetch_and(volatile a16 *a, a16 v, morder mo);
|
||||
SANITIZER_INTERFACE_ATTRIBUTE
|
||||
a32 __tsan_atomic32_fetch_and(volatile a32 *a, a32 v, morder mo);
|
||||
SANITIZER_INTERFACE_ATTRIBUTE
|
||||
a64 __tsan_atomic64_fetch_and(volatile a64 *a, a64 v, morder mo);
|
||||
#if __TSAN_HAS_INT128
|
||||
SANITIZER_INTERFACE_ATTRIBUTE
|
||||
a128 __tsan_atomic128_fetch_and(volatile a128 *a, a128 v, morder mo);
|
||||
#endif
|
||||
|
||||
SANITIZER_INTERFACE_ATTRIBUTE
|
||||
a8 __tsan_atomic8_fetch_or(volatile a8 *a, a8 v, morder mo);
|
||||
SANITIZER_INTERFACE_ATTRIBUTE
|
||||
a16 __tsan_atomic16_fetch_or(volatile a16 *a, a16 v, morder mo);
|
||||
SANITIZER_INTERFACE_ATTRIBUTE
|
||||
a32 __tsan_atomic32_fetch_or(volatile a32 *a, a32 v, morder mo);
|
||||
SANITIZER_INTERFACE_ATTRIBUTE
|
||||
a64 __tsan_atomic64_fetch_or(volatile a64 *a, a64 v, morder mo);
|
||||
#if __TSAN_HAS_INT128
|
||||
SANITIZER_INTERFACE_ATTRIBUTE
|
||||
a128 __tsan_atomic128_fetch_or(volatile a128 *a, a128 v, morder mo);
|
||||
#endif
|
||||
|
||||
SANITIZER_INTERFACE_ATTRIBUTE
|
||||
a8 __tsan_atomic8_fetch_xor(volatile a8 *a, a8 v, morder mo);
|
||||
SANITIZER_INTERFACE_ATTRIBUTE
|
||||
a16 __tsan_atomic16_fetch_xor(volatile a16 *a, a16 v, morder mo);
|
||||
SANITIZER_INTERFACE_ATTRIBUTE
|
||||
a32 __tsan_atomic32_fetch_xor(volatile a32 *a, a32 v, morder mo);
|
||||
SANITIZER_INTERFACE_ATTRIBUTE
|
||||
a64 __tsan_atomic64_fetch_xor(volatile a64 *a, a64 v, morder mo);
|
||||
#if __TSAN_HAS_INT128
|
||||
SANITIZER_INTERFACE_ATTRIBUTE
|
||||
a128 __tsan_atomic128_fetch_xor(volatile a128 *a, a128 v, morder mo);
|
||||
#endif
|
||||
|
||||
SANITIZER_INTERFACE_ATTRIBUTE
|
||||
a8 __tsan_atomic8_fetch_nand(volatile a8 *a, a8 v, morder mo);
|
||||
SANITIZER_INTERFACE_ATTRIBUTE
|
||||
a16 __tsan_atomic16_fetch_nand(volatile a16 *a, a16 v, morder mo);
|
||||
SANITIZER_INTERFACE_ATTRIBUTE
|
||||
a32 __tsan_atomic32_fetch_nand(volatile a32 *a, a32 v, morder mo);
|
||||
SANITIZER_INTERFACE_ATTRIBUTE
|
||||
a64 __tsan_atomic64_fetch_nand(volatile a64 *a, a64 v, morder mo);
|
||||
#if __TSAN_HAS_INT128
|
||||
SANITIZER_INTERFACE_ATTRIBUTE
|
||||
a128 __tsan_atomic128_fetch_nand(volatile a128 *a, a128 v, morder mo);
|
||||
#endif
|
||||
|
||||
SANITIZER_INTERFACE_ATTRIBUTE
|
||||
int __tsan_atomic8_compare_exchange_strong(volatile a8 *a, a8 *c, a8 v,
|
||||
morder mo, morder fmo);
|
||||
SANITIZER_INTERFACE_ATTRIBUTE
|
||||
int __tsan_atomic16_compare_exchange_strong(volatile a16 *a, a16 *c, a16 v,
|
||||
morder mo, morder fmo);
|
||||
SANITIZER_INTERFACE_ATTRIBUTE
|
||||
int __tsan_atomic32_compare_exchange_strong(volatile a32 *a, a32 *c, a32 v,
|
||||
morder mo, morder fmo);
|
||||
SANITIZER_INTERFACE_ATTRIBUTE
|
||||
int __tsan_atomic64_compare_exchange_strong(volatile a64 *a, a64 *c, a64 v,
|
||||
morder mo, morder fmo);
|
||||
#if __TSAN_HAS_INT128
|
||||
SANITIZER_INTERFACE_ATTRIBUTE
|
||||
int __tsan_atomic128_compare_exchange_strong(volatile a128 *a, a128 *c, a128 v,
|
||||
morder mo, morder fmo);
|
||||
#endif
|
||||
|
||||
SANITIZER_INTERFACE_ATTRIBUTE
|
||||
int __tsan_atomic8_compare_exchange_weak(volatile a8 *a, a8 *c, a8 v, morder mo,
|
||||
morder fmo);
|
||||
SANITIZER_INTERFACE_ATTRIBUTE
|
||||
int __tsan_atomic16_compare_exchange_weak(volatile a16 *a, a16 *c, a16 v,
|
||||
morder mo, morder fmo);
|
||||
SANITIZER_INTERFACE_ATTRIBUTE
|
||||
int __tsan_atomic32_compare_exchange_weak(volatile a32 *a, a32 *c, a32 v,
|
||||
morder mo, morder fmo);
|
||||
SANITIZER_INTERFACE_ATTRIBUTE
|
||||
int __tsan_atomic64_compare_exchange_weak(volatile a64 *a, a64 *c, a64 v,
|
||||
morder mo, morder fmo);
|
||||
#if __TSAN_HAS_INT128
|
||||
SANITIZER_INTERFACE_ATTRIBUTE
|
||||
int __tsan_atomic128_compare_exchange_weak(volatile a128 *a, a128 *c, a128 v,
|
||||
morder mo, morder fmo);
|
||||
#endif
|
||||
|
||||
SANITIZER_INTERFACE_ATTRIBUTE
|
||||
a8 __tsan_atomic8_compare_exchange_val(volatile a8 *a, a8 c, a8 v, morder mo,
|
||||
morder fmo);
|
||||
SANITIZER_INTERFACE_ATTRIBUTE
|
||||
a16 __tsan_atomic16_compare_exchange_val(volatile a16 *a, a16 c, a16 v,
|
||||
morder mo, morder fmo);
|
||||
SANITIZER_INTERFACE_ATTRIBUTE
|
||||
a32 __tsan_atomic32_compare_exchange_val(volatile a32 *a, a32 c, a32 v,
|
||||
morder mo, morder fmo);
|
||||
SANITIZER_INTERFACE_ATTRIBUTE
|
||||
a64 __tsan_atomic64_compare_exchange_val(volatile a64 *a, a64 c, a64 v,
|
||||
morder mo, morder fmo);
|
||||
#if __TSAN_HAS_INT128
|
||||
SANITIZER_INTERFACE_ATTRIBUTE
|
||||
a128 __tsan_atomic128_compare_exchange_val(volatile a128 *a, a128 c, a128 v,
|
||||
morder mo, morder fmo);
|
||||
#endif
|
||||
|
||||
SANITIZER_INTERFACE_ATTRIBUTE
|
||||
void __tsan_atomic_thread_fence(morder mo);
|
||||
SANITIZER_INTERFACE_ATTRIBUTE
|
||||
void __tsan_atomic_signal_fence(morder mo);
|
||||
|
||||
SANITIZER_INTERFACE_ATTRIBUTE
|
||||
void __tsan_go_atomic32_load(ThreadState *thr, uptr cpc, uptr pc, u8 *a);
|
||||
SANITIZER_INTERFACE_ATTRIBUTE
|
||||
void __tsan_go_atomic64_load(ThreadState *thr, uptr cpc, uptr pc, u8 *a);
|
||||
SANITIZER_INTERFACE_ATTRIBUTE
|
||||
void __tsan_go_atomic32_store(ThreadState *thr, uptr cpc, uptr pc, u8 *a);
|
||||
SANITIZER_INTERFACE_ATTRIBUTE
|
||||
void __tsan_go_atomic64_store(ThreadState *thr, uptr cpc, uptr pc, u8 *a);
|
||||
SANITIZER_INTERFACE_ATTRIBUTE
|
||||
void __tsan_go_atomic32_fetch_add(ThreadState *thr, uptr cpc, uptr pc, u8 *a);
|
||||
SANITIZER_INTERFACE_ATTRIBUTE
|
||||
void __tsan_go_atomic64_fetch_add(ThreadState *thr, uptr cpc, uptr pc, u8 *a);
|
||||
SANITIZER_INTERFACE_ATTRIBUTE
|
||||
void __tsan_go_atomic32_exchange(ThreadState *thr, uptr cpc, uptr pc, u8 *a);
|
||||
SANITIZER_INTERFACE_ATTRIBUTE
|
||||
void __tsan_go_atomic64_exchange(ThreadState *thr, uptr cpc, uptr pc, u8 *a);
|
||||
SANITIZER_INTERFACE_ATTRIBUTE
|
||||
void __tsan_go_atomic32_compare_exchange(ThreadState *thr, uptr cpc, uptr pc,
|
||||
u8 *a);
|
||||
SANITIZER_INTERFACE_ATTRIBUTE
|
||||
void __tsan_go_atomic64_compare_exchange(ThreadState *thr, uptr cpc, uptr pc,
|
||||
u8 *a);
|
||||
} // extern "C"
|
||||
|
||||
} // namespace __tsan
|
||||
|
||||
#endif // TSAN_INTERFACE_H
|
||||
|
|
|
@ -23,39 +23,16 @@
|
|||
#include "sanitizer_common/sanitizer_stacktrace.h"
|
||||
#include "sanitizer_common/sanitizer_mutex.h"
|
||||
#include "tsan_flags.h"
|
||||
#include "tsan_interface.h"
|
||||
#include "tsan_rtl.h"
|
||||
|
||||
using namespace __tsan; // NOLINT
|
||||
|
||||
// These should match declarations from public tsan_interface_atomic.h header.
|
||||
typedef unsigned char a8;
|
||||
typedef unsigned short a16; // NOLINT
|
||||
typedef unsigned int a32;
|
||||
typedef unsigned long long a64; // NOLINT
|
||||
#if !defined(SANITIZER_GO) && (defined(__SIZEOF_INT128__) \
|
||||
|| (__clang_major__ * 100 + __clang_minor__ >= 302)) && !defined(__mips64)
|
||||
__extension__ typedef __int128 a128;
|
||||
# define __TSAN_HAS_INT128 1
|
||||
#else
|
||||
# define __TSAN_HAS_INT128 0
|
||||
#endif
|
||||
|
||||
#if !defined(SANITIZER_GO) && __TSAN_HAS_INT128
|
||||
// Protects emulation of 128-bit atomic operations.
|
||||
static StaticSpinMutex mutex128;
|
||||
#endif
|
||||
|
||||
// Part of ABI, do not change.
|
||||
// http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/atomic?view=markup
|
||||
typedef enum {
|
||||
mo_relaxed,
|
||||
mo_consume,
|
||||
mo_acquire,
|
||||
mo_release,
|
||||
mo_acq_rel,
|
||||
mo_seq_cst
|
||||
} morder;
|
||||
|
||||
static bool IsLoadOrder(morder mo) {
|
||||
return mo == mo_relaxed || mo == mo_consume
|
||||
|| mo == mo_acquire || mo == mo_seq_cst;
|
||||
|
|
Loading…
Reference in New Issue