Add tsan for fast interp and aot (#2679)
To run it locally: ```bash export TSAN_OPTIONS=suppressions=<path_to_tsan_suppressions.txt> ./test_wamr.sh <your flags> -T tsan ``` An example for wasi-threads would look like: ```bash export TSAN_OPTIONS=suppressions=<path_to_tsan_suppressions.txt> ./test_wamr.sh -w -s wasi_certification -t fast-interp -T tsan ```
This commit is contained in:
@ -12,6 +12,7 @@
|
||||
#include "wasm_native.h"
|
||||
#include "../include/wasm_export.h"
|
||||
#include "../interpreter/wasm.h"
|
||||
|
||||
#if WASM_ENABLE_LIBC_WASI != 0
|
||||
#if WASM_ENABLE_UVWASI == 0
|
||||
#include "wasmtime_ssp.h"
|
||||
@ -44,15 +45,16 @@ extern "C" {
|
||||
|
||||
/* For STORE opcodes */
|
||||
#define STORE_I64 PUT_I64_TO_ADDR
|
||||
#define STORE_U32(addr, value) \
|
||||
do { \
|
||||
*(uint32 *)(addr) = (uint32)(value); \
|
||||
} while (0)
|
||||
#define STORE_U16(addr, value) \
|
||||
do { \
|
||||
*(uint16 *)(addr) = (uint16)(value); \
|
||||
} while (0)
|
||||
|
||||
static inline void
|
||||
STORE_U32(void *addr, uint32_t value)
|
||||
{
|
||||
*(uint32_t *)(addr) = (uint32_t)(value);
|
||||
}
|
||||
static inline void
|
||||
STORE_U16(void *addr, uint16_t value)
|
||||
{
|
||||
*(uint16_t *)(addr) = (uint16_t)(value);
|
||||
}
|
||||
/* For LOAD opcodes */
|
||||
#define LOAD_I64(addr) (*(int64 *)(addr))
|
||||
#define LOAD_F64(addr) (*(float64 *)(addr))
|
||||
@ -147,42 +149,42 @@ GET_F64_FROM_ADDR(uint32 *addr)
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
#define STORE_U32(addr, value) \
|
||||
do { \
|
||||
uintptr_t addr_ = (uintptr_t)(addr); \
|
||||
union { \
|
||||
uint32 val; \
|
||||
uint16 u16[2]; \
|
||||
uint8 u8[4]; \
|
||||
} u; \
|
||||
if ((addr_ & (uintptr_t)3) == 0) \
|
||||
*(uint32 *)(addr) = (uint32)(value); \
|
||||
else { \
|
||||
u.val = (uint32)(value); \
|
||||
if ((addr_ & (uintptr_t)1) == 0) { \
|
||||
((uint16 *)(addr))[0] = u.u16[0]; \
|
||||
((uint16 *)(addr))[1] = u.u16[1]; \
|
||||
} \
|
||||
else { \
|
||||
((uint8 *)(addr))[0] = u.u8[0]; \
|
||||
((uint8 *)(addr))[1] = u.u8[1]; \
|
||||
((uint8 *)(addr))[2] = u.u8[2]; \
|
||||
((uint8 *)(addr))[3] = u.u8[3]; \
|
||||
} \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
#define STORE_U16(addr, value) \
|
||||
do { \
|
||||
union { \
|
||||
uint16 val; \
|
||||
uint8 u8[2]; \
|
||||
} u; \
|
||||
u.val = (uint16)(value); \
|
||||
((uint8 *)(addr))[0] = u.u8[0]; \
|
||||
((uint8 *)(addr))[1] = u.u8[1]; \
|
||||
} while (0)
|
||||
|
||||
static inline void
|
||||
STORE_U32(void *addr, uint32_t value)
|
||||
{
|
||||
uintptr_t addr_ = (uintptr_t)(addr);
|
||||
union {
|
||||
uint32_t val;
|
||||
uint16_t u16[2];
|
||||
uint8_t u8[4];
|
||||
} u;
|
||||
if ((addr_ & (uintptr_t)3) == 0)
|
||||
*(uint32_t *)(addr) = (uint32_t)(value);
|
||||
else {
|
||||
u.val = (uint32_t)(value);
|
||||
if ((addr_ & (uintptr_t)1) == 0) {
|
||||
((uint16_t *)(addr))[0] = u.u16[0];
|
||||
((uint16_t *)(addr))[1] = u.u16[1];
|
||||
}
|
||||
else {
|
||||
((uint8_t *)(addr))[0] = u.u8[0];
|
||||
((uint8_t *)(addr))[1] = u.u8[1];
|
||||
((uint8_t *)(addr))[2] = u.u8[2];
|
||||
((uint8_t *)(addr))[3] = u.u8[3];
|
||||
}
|
||||
}
|
||||
}
|
||||
static inline void
|
||||
STORE_U16(void *addr, uint16_t value)
|
||||
{
|
||||
union {
|
||||
uint16_t val;
|
||||
uint8_t u8[2];
|
||||
} u;
|
||||
u.val = (uint16_t)(value);
|
||||
((uint8_t *)(addr))[0] = u.u8[0];
|
||||
((uint8_t *)(addr))[1] = u.u8[1];
|
||||
}
|
||||
/* For LOAD opcodes */
|
||||
static inline int64
|
||||
LOAD_I64(void *addr)
|
||||
|
||||
Reference in New Issue
Block a user