implement atomic opcode in AOT/JIT (#329)
This commit is contained in:
@ -13,6 +13,22 @@ typedef struct {
|
||||
#define REG_SYM(symbol) { #symbol, (void*)symbol }
|
||||
|
||||
#if WASM_ENABLE_BULK_MEMORY != 0
|
||||
#define REG_BULK_MEMORY_SYM() \
|
||||
REG_SYM(aot_memory_init), \
|
||||
REG_SYM(aot_data_drop),
|
||||
#else
|
||||
#define REG_BULK_MEMORY_SYM()
|
||||
#endif
|
||||
|
||||
#if WASM_ENABLE_SHARED_MEMORY != 0
|
||||
#include "wasm_shared_memory.h"
|
||||
#define REG_ATOMIC_WAIT_SYM() \
|
||||
REG_SYM(wasm_runtime_atomic_wait), \
|
||||
REG_SYM(wasm_runtime_atomic_notify),
|
||||
#else
|
||||
#define REG_ATOMIC_WAIT_SYM()
|
||||
#endif
|
||||
|
||||
#define REG_COMMON_SYMBOLS \
|
||||
REG_SYM(aot_set_exception_with_id), \
|
||||
REG_SYM(aot_invoke_native), \
|
||||
@ -31,30 +47,8 @@ typedef struct {
|
||||
REG_SYM(truncf), \
|
||||
REG_SYM(rint), \
|
||||
REG_SYM(rintf), \
|
||||
REG_SYM(memset), \
|
||||
REG_SYM(memmove), \
|
||||
REG_SYM(aot_memory_init), \
|
||||
REG_SYM(aot_data_drop)
|
||||
#else
|
||||
#define REG_COMMON_SYMBOLS \
|
||||
REG_SYM(aot_set_exception_with_id), \
|
||||
REG_SYM(aot_invoke_native), \
|
||||
REG_SYM(aot_call_indirect), \
|
||||
REG_SYM(wasm_runtime_enlarge_memory), \
|
||||
REG_SYM(wasm_runtime_set_exception), \
|
||||
REG_SYM(fmin), \
|
||||
REG_SYM(fminf), \
|
||||
REG_SYM(fmax), \
|
||||
REG_SYM(fmaxf), \
|
||||
REG_SYM(ceil), \
|
||||
REG_SYM(ceilf), \
|
||||
REG_SYM(floor), \
|
||||
REG_SYM(floorf), \
|
||||
REG_SYM(trunc), \
|
||||
REG_SYM(truncf), \
|
||||
REG_SYM(rint), \
|
||||
REG_SYM(rintf)
|
||||
#endif
|
||||
REG_BULK_MEMORY_SYM() \
|
||||
REG_ATOMIC_WAIT_SYM()
|
||||
|
||||
#define CHECK_RELOC_OFFSET(data_size) do { \
|
||||
if (!check_reloc_offset(target_section_size, reloc_offset, data_size, \
|
||||
|
||||
@ -1124,6 +1124,9 @@ aot_set_exception_with_id(AOTModuleInstance *module_inst,
|
||||
case EXCE_NATIVE_STACK_OVERFLOW:
|
||||
aot_set_exception(module_inst, "native stack overflow");
|
||||
break;
|
||||
case EXCE_UNALIGNED_ATOMIC:
|
||||
aot_set_exception(module_inst, "unaligned atomic");
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
@ -31,6 +31,7 @@ typedef enum AOTExceptionID {
|
||||
EXCE_UNINITIALIZED_ELEMENT,
|
||||
EXCE_CALL_UNLINKED_IMPORT_FUNC,
|
||||
EXCE_NATIVE_STACK_OVERFLOW,
|
||||
EXCE_UNALIGNED_ATOMIC,
|
||||
EXCE_NUM,
|
||||
} AOTExceptionID;
|
||||
|
||||
|
||||
@ -56,7 +56,7 @@ void __aeabi_f2iz();
|
||||
void __aeabi_f2d();
|
||||
|
||||
static SymbolMap target_sym_map[] = {
|
||||
REG_COMMON_SYMBOLS,
|
||||
REG_COMMON_SYMBOLS
|
||||
/* compiler-rt symbols that come from compiler(e.g. gcc) */
|
||||
REG_SYM(__divdi3),
|
||||
REG_SYM(__udivdi3),
|
||||
|
||||
@ -55,7 +55,7 @@ void __aeabi_f2iz();
|
||||
void __aeabi_f2d();
|
||||
|
||||
static SymbolMap target_sym_map[] = {
|
||||
REG_COMMON_SYMBOLS,
|
||||
REG_COMMON_SYMBOLS
|
||||
/* compiler-rt symbols that come from compiler(e.g. gcc) */
|
||||
REG_SYM(__divdi3),
|
||||
REG_SYM(__udivdi3),
|
||||
|
||||
@ -14,7 +14,7 @@ void __moddi3();
|
||||
void __umoddi3();
|
||||
|
||||
static SymbolMap target_sym_map[] = {
|
||||
REG_COMMON_SYMBOLS,
|
||||
REG_COMMON_SYMBOLS
|
||||
/* compiler-rt symbols that come from compiler(e.g. gcc) */
|
||||
REG_SYM(__divdi3),
|
||||
REG_SYM(__udivdi3),
|
||||
|
||||
@ -22,7 +22,7 @@ void __modsi3();
|
||||
void __divdi3();
|
||||
|
||||
static SymbolMap target_sym_map[] = {
|
||||
REG_COMMON_SYMBOLS,
|
||||
REG_COMMON_SYMBOLS
|
||||
|
||||
/* API's for soft-float */
|
||||
/* TODO: only register these symbols when Floating-Point Coprocessor
|
||||
|
||||
Reference in New Issue
Block a user