mirror of
https://github.com/bytecodealliance/wasm-micro-runtime.git
synced 2025-05-09 21:26:21 +00:00
Merge main into dev/fast_jit
This commit is contained in:
commit
1a826f39a2
|
@ -25,9 +25,11 @@ if (NOT DEFINED WAMR_BUILD_TARGET)
|
||||||
elseif (CMAKE_SIZEOF_VOID_P EQUAL 8)
|
elseif (CMAKE_SIZEOF_VOID_P EQUAL 8)
|
||||||
# Build as X86_64 by default in 64-bit platform
|
# Build as X86_64 by default in 64-bit platform
|
||||||
set (WAMR_BUILD_TARGET "X86_64")
|
set (WAMR_BUILD_TARGET "X86_64")
|
||||||
else ()
|
elseif (CMAKE_SIZEOF_VOID_P EQUAL 4)
|
||||||
# Build as X86_32 by default in 32-bit platform
|
# Build as X86_32 by default in 32-bit platform
|
||||||
set (WAMR_BUILD_TARGET "X86_32")
|
set (WAMR_BUILD_TARGET "X86_32")
|
||||||
|
else ()
|
||||||
|
message(SEND_ERROR "Unsupported build target platform!")
|
||||||
endif ()
|
endif ()
|
||||||
endif ()
|
endif ()
|
||||||
|
|
||||||
|
|
|
@ -41,9 +41,11 @@ if (NOT DEFINED WAMR_BUILD_TARGET)
|
||||||
elseif (CMAKE_SIZEOF_VOID_P EQUAL 8)
|
elseif (CMAKE_SIZEOF_VOID_P EQUAL 8)
|
||||||
# Build as X86_64 by default in 64-bit platform
|
# Build as X86_64 by default in 64-bit platform
|
||||||
set (WAMR_BUILD_TARGET "X86_64")
|
set (WAMR_BUILD_TARGET "X86_64")
|
||||||
else ()
|
elseif (CMAKE_SIZEOF_VOID_P EQUAL 4)
|
||||||
# Build as X86_32 by default in 32-bit platform
|
# Build as X86_32 by default in 32-bit platform
|
||||||
set (WAMR_BUILD_TARGET "X86_32")
|
set (WAMR_BUILD_TARGET "X86_32")
|
||||||
|
else ()
|
||||||
|
message(SEND_ERROR "Unsupported build target platform!")
|
||||||
endif ()
|
endif ()
|
||||||
endif ()
|
endif ()
|
||||||
|
|
||||||
|
|
|
@ -1511,7 +1511,9 @@ aot_call_function(WASMExecEnv *exec_env, AOTFunctionInstance *function,
|
||||||
|
|
||||||
#if WASM_ENABLE_DUMP_CALL_STACK != 0
|
#if WASM_ENABLE_DUMP_CALL_STACK != 0
|
||||||
if (!ret) {
|
if (!ret) {
|
||||||
aot_dump_call_stack(exec_env);
|
if (aot_create_call_stack(exec_env)) {
|
||||||
|
aot_dump_call_stack(exec_env, true, NULL, 0);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -1568,7 +1570,9 @@ aot_call_function(WASMExecEnv *exec_env, AOTFunctionInstance *function,
|
||||||
|
|
||||||
#if WASM_ENABLE_DUMP_CALL_STACK != 0
|
#if WASM_ENABLE_DUMP_CALL_STACK != 0
|
||||||
if (aot_get_exception(module_inst)) {
|
if (aot_get_exception(module_inst)) {
|
||||||
aot_dump_call_stack(exec_env);
|
if (aot_create_call_stack(exec_env)) {
|
||||||
|
aot_dump_call_stack(exec_env, true, NULL, 0);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -3018,38 +3022,24 @@ aot_free_frame(WASMExecEnv *exec_env)
|
||||||
|| (WASM_ENABLE_PERF_PROFILING != 0) */
|
|| (WASM_ENABLE_PERF_PROFILING != 0) */
|
||||||
|
|
||||||
#if WASM_ENABLE_DUMP_CALL_STACK != 0
|
#if WASM_ENABLE_DUMP_CALL_STACK != 0
|
||||||
void
|
bool
|
||||||
aot_dump_call_stack(WASMExecEnv *exec_env)
|
aot_create_call_stack(struct WASMExecEnv *exec_env)
|
||||||
{
|
{
|
||||||
AOTFrame *cur_frame = (AOTFrame *)exec_env->cur_frame,
|
AOTFrame *cur_frame = (AOTFrame *)exec_env->cur_frame,
|
||||||
*first_frame = cur_frame;
|
*first_frame = cur_frame;
|
||||||
AOTModuleInstance *module_inst = (AOTModuleInstance *)exec_env->module_inst;
|
AOTModuleInstance *module_inst = (AOTModuleInstance *)exec_env->module_inst;
|
||||||
const char *func_name;
|
|
||||||
uint32 n = 0;
|
uint32 n = 0;
|
||||||
|
|
||||||
os_printf("\n");
|
|
||||||
while (cur_frame) {
|
while (cur_frame) {
|
||||||
func_name =
|
|
||||||
get_func_name_from_index(module_inst, cur_frame->func_index);
|
|
||||||
|
|
||||||
/* function name not exported, print number instead */
|
|
||||||
if (func_name == NULL) {
|
|
||||||
os_printf("#%02d $f%d \n", n, cur_frame->func_index);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
os_printf("#%02d %s \n", n, func_name);
|
|
||||||
}
|
|
||||||
|
|
||||||
cur_frame = cur_frame->prev_frame;
|
cur_frame = cur_frame->prev_frame;
|
||||||
n++;
|
n++;
|
||||||
}
|
}
|
||||||
os_printf("\n");
|
|
||||||
|
|
||||||
/* release previous stack frames and create new ones */
|
/* release previous stack frames and create new ones */
|
||||||
if (!bh_vector_destroy(module_inst->frames.ptr)
|
if (!bh_vector_destroy(module_inst->frames.ptr)
|
||||||
|| !bh_vector_init(module_inst->frames.ptr, n, sizeof(WASMCApiFrame),
|
|| !bh_vector_init(module_inst->frames.ptr, n, sizeof(WASMCApiFrame),
|
||||||
false)) {
|
false)) {
|
||||||
return;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
cur_frame = first_frame;
|
cur_frame = first_frame;
|
||||||
|
@ -3059,14 +3049,85 @@ aot_dump_call_stack(WASMExecEnv *exec_env)
|
||||||
frame.module_offset = 0;
|
frame.module_offset = 0;
|
||||||
frame.func_index = cur_frame->func_index;
|
frame.func_index = cur_frame->func_index;
|
||||||
frame.func_offset = 0;
|
frame.func_offset = 0;
|
||||||
|
frame.func_name_wp =
|
||||||
|
get_func_name_from_index(module_inst, cur_frame->func_index);
|
||||||
|
|
||||||
if (!bh_vector_append(module_inst->frames.ptr, &frame)) {
|
if (!bh_vector_append(module_inst->frames.ptr, &frame)) {
|
||||||
bh_vector_destroy(module_inst->frames.ptr);
|
bh_vector_destroy(module_inst->frames.ptr);
|
||||||
return;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
cur_frame = cur_frame->prev_frame;
|
cur_frame = cur_frame->prev_frame;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
#define PRINT_OR_DUMP() \
|
||||||
|
do { \
|
||||||
|
total_len += \
|
||||||
|
wasm_runtime_dump_line_buf_impl(line_buf, print, &buf, &len); \
|
||||||
|
if ((!print) && buf && (len == 0)) { \
|
||||||
|
return total_len; \
|
||||||
|
} \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
uint32
|
||||||
|
aot_dump_call_stack(WASMExecEnv *exec_env, bool print, char *buf, uint32 len)
|
||||||
|
{
|
||||||
|
AOTModuleInstance *module_inst = (AOTModuleInstance *)exec_env->module_inst;
|
||||||
|
uint32 n = 0, total_len = 0, total_frames;
|
||||||
|
/* reserve 256 bytes for line buffer, any line longer than 256 bytes
|
||||||
|
* will be truncated */
|
||||||
|
char line_buf[256];
|
||||||
|
|
||||||
|
if (!module_inst->frames.ptr) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
total_frames = bh_vector_size(module_inst->frames.ptr);
|
||||||
|
if (total_frames == 0) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
snprintf(line_buf, sizeof(line_buf), "\n");
|
||||||
|
PRINT_OR_DUMP();
|
||||||
|
|
||||||
|
while (n < total_frames) {
|
||||||
|
WASMCApiFrame frame = { 0 };
|
||||||
|
uint32 line_length, i;
|
||||||
|
|
||||||
|
if (!bh_vector_get(module_inst->frames.ptr, n, &frame)) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* function name not exported, print number instead */
|
||||||
|
if (frame.func_name_wp == NULL) {
|
||||||
|
line_length = snprintf(line_buf, sizeof(line_buf), "#%02d $f%d\n",
|
||||||
|
n, frame.func_index);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
line_length = snprintf(line_buf, sizeof(line_buf), "#%02d %s\n", n,
|
||||||
|
frame.func_name_wp);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (line_length >= sizeof(line_buf)) {
|
||||||
|
uint32 line_buffer_len = sizeof(line_buf);
|
||||||
|
/* If line too long, ensure the last character is '\n' */
|
||||||
|
for (i = line_buffer_len - 5; i < line_buffer_len - 2; i++) {
|
||||||
|
line_buf[i] = '.';
|
||||||
|
}
|
||||||
|
line_buf[line_buffer_len - 2] = '\n';
|
||||||
|
}
|
||||||
|
|
||||||
|
PRINT_OR_DUMP();
|
||||||
|
|
||||||
|
n++;
|
||||||
|
}
|
||||||
|
snprintf(line_buf, sizeof(line_buf), "\n");
|
||||||
|
PRINT_OR_DUMP();
|
||||||
|
|
||||||
|
return total_len + 1;
|
||||||
}
|
}
|
||||||
#endif /* end of WASM_ENABLE_DUMP_CALL_STACK */
|
#endif /* end of WASM_ENABLE_DUMP_CALL_STACK */
|
||||||
|
|
||||||
|
|
|
@ -731,8 +731,24 @@ aot_alloc_frame(WASMExecEnv *exec_env, uint32 func_index);
|
||||||
void
|
void
|
||||||
aot_free_frame(WASMExecEnv *exec_env);
|
aot_free_frame(WASMExecEnv *exec_env);
|
||||||
|
|
||||||
void
|
bool
|
||||||
aot_dump_call_stack(WASMExecEnv *exec_env);
|
aot_create_call_stack(struct WASMExecEnv *exec_env);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Dump wasm call stack or get the size
|
||||||
|
*
|
||||||
|
* @param exec_env the execution environment
|
||||||
|
* @param print whether to print to stdout or not
|
||||||
|
* @param buf buffer to store the dumped content
|
||||||
|
* @param len length of the buffer
|
||||||
|
*
|
||||||
|
* @return when print is true, return the bytes printed out to stdout; when
|
||||||
|
* print is false and buf is NULL, return the size required to store the
|
||||||
|
* callstack content; when print is false and buf is not NULL, return the size
|
||||||
|
* dumped to the buffer, 0 means error and data in buf may be invalid
|
||||||
|
*/
|
||||||
|
uint32
|
||||||
|
aot_dump_call_stack(WASMExecEnv *exec_env, bool print, char *buf, uint32 len);
|
||||||
|
|
||||||
void
|
void
|
||||||
aot_dump_perf_profiling(const AOTModuleInstance *module_inst);
|
aot_dump_perf_profiling(const AOTModuleInstance *module_inst);
|
||||||
|
|
|
@ -3068,7 +3068,7 @@ fail:
|
||||||
|| defined(BUILD_TARGET_RISCV32_ILP32D) \
|
|| defined(BUILD_TARGET_RISCV32_ILP32D) \
|
||||||
|| defined(BUILD_TARGET_RISCV32_ILP32) || defined(BUILD_TARGET_ARC)
|
|| defined(BUILD_TARGET_RISCV32_ILP32) || defined(BUILD_TARGET_ARC)
|
||||||
typedef void (*GenericFunctionPointer)();
|
typedef void (*GenericFunctionPointer)();
|
||||||
int64
|
void
|
||||||
invokeNative(GenericFunctionPointer f, uint32 *args, uint32 n_stacks);
|
invokeNative(GenericFunctionPointer f, uint32 *args, uint32 n_stacks);
|
||||||
|
|
||||||
typedef float64 (*Float64FuncPtr)(GenericFunctionPointer, uint32 *, uint32);
|
typedef float64 (*Float64FuncPtr)(GenericFunctionPointer, uint32 *, uint32);
|
||||||
|
@ -3077,13 +3077,16 @@ typedef int64 (*Int64FuncPtr)(GenericFunctionPointer, uint32 *, uint32);
|
||||||
typedef int32 (*Int32FuncPtr)(GenericFunctionPointer, uint32 *, uint32);
|
typedef int32 (*Int32FuncPtr)(GenericFunctionPointer, uint32 *, uint32);
|
||||||
typedef void (*VoidFuncPtr)(GenericFunctionPointer, uint32 *, uint32);
|
typedef void (*VoidFuncPtr)(GenericFunctionPointer, uint32 *, uint32);
|
||||||
|
|
||||||
static Float64FuncPtr invokeNative_Float64 =
|
static volatile Float64FuncPtr invokeNative_Float64 =
|
||||||
(Float64FuncPtr)(uintptr_t)invokeNative;
|
(Float64FuncPtr)(uintptr_t)invokeNative;
|
||||||
static Float32FuncPtr invokeNative_Float32 =
|
static volatile Float32FuncPtr invokeNative_Float32 =
|
||||||
(Float32FuncPtr)(uintptr_t)invokeNative;
|
(Float32FuncPtr)(uintptr_t)invokeNative;
|
||||||
static Int64FuncPtr invokeNative_Int64 = (Int64FuncPtr)(uintptr_t)invokeNative;
|
static volatile Int64FuncPtr invokeNative_Int64 =
|
||||||
static Int32FuncPtr invokeNative_Int32 = (Int32FuncPtr)(uintptr_t)invokeNative;
|
(Int64FuncPtr)(uintptr_t)invokeNative;
|
||||||
static VoidFuncPtr invokeNative_Void = (VoidFuncPtr)(uintptr_t)invokeNative;
|
static volatile Int32FuncPtr invokeNative_Int32 =
|
||||||
|
(Int32FuncPtr)(uintptr_t)invokeNative;
|
||||||
|
static volatile VoidFuncPtr invokeNative_Void =
|
||||||
|
(VoidFuncPtr)(uintptr_t)invokeNative;
|
||||||
|
|
||||||
#if defined(BUILD_TARGET_ARM_VFP) || defined(BUILD_TARGET_THUMB_VFP)
|
#if defined(BUILD_TARGET_ARM_VFP) || defined(BUILD_TARGET_THUMB_VFP)
|
||||||
#define MAX_REG_INTS 4
|
#define MAX_REG_INTS 4
|
||||||
|
@ -3539,7 +3542,7 @@ fail:
|
||||||
|| defined(BUILD_TARGET_THUMB) || defined(BUILD_TARGET_MIPS) \
|
|| defined(BUILD_TARGET_THUMB) || defined(BUILD_TARGET_MIPS) \
|
||||||
|| defined(BUILD_TARGET_XTENSA)
|
|| defined(BUILD_TARGET_XTENSA)
|
||||||
typedef void (*GenericFunctionPointer)();
|
typedef void (*GenericFunctionPointer)();
|
||||||
int64
|
void
|
||||||
invokeNative(GenericFunctionPointer f, uint32 *args, uint32 sz);
|
invokeNative(GenericFunctionPointer f, uint32 *args, uint32 sz);
|
||||||
|
|
||||||
typedef float64 (*Float64FuncPtr)(GenericFunctionPointer f, uint32 *, uint32);
|
typedef float64 (*Float64FuncPtr)(GenericFunctionPointer f, uint32 *, uint32);
|
||||||
|
@ -3548,13 +3551,16 @@ typedef int64 (*Int64FuncPtr)(GenericFunctionPointer f, uint32 *, uint32);
|
||||||
typedef int32 (*Int32FuncPtr)(GenericFunctionPointer f, uint32 *, uint32);
|
typedef int32 (*Int32FuncPtr)(GenericFunctionPointer f, uint32 *, uint32);
|
||||||
typedef void (*VoidFuncPtr)(GenericFunctionPointer f, uint32 *, uint32);
|
typedef void (*VoidFuncPtr)(GenericFunctionPointer f, uint32 *, uint32);
|
||||||
|
|
||||||
static Int64FuncPtr invokeNative_Int64 = (Int64FuncPtr)invokeNative;
|
static volatile Int64FuncPtr invokeNative_Int64 =
|
||||||
static Int32FuncPtr invokeNative_Int32 = (Int32FuncPtr)(uintptr_t)invokeNative;
|
(Int64FuncPtr)(uintptr_t)invokeNative;
|
||||||
static Float64FuncPtr invokeNative_Float64 =
|
static volatile Int32FuncPtr invokeNative_Int32 =
|
||||||
|
(Int32FuncPtr)(uintptr_t)invokeNative;
|
||||||
|
static volatile Float64FuncPtr invokeNative_Float64 =
|
||||||
(Float64FuncPtr)(uintptr_t)invokeNative;
|
(Float64FuncPtr)(uintptr_t)invokeNative;
|
||||||
static Float32FuncPtr invokeNative_Float32 =
|
static volatile Float32FuncPtr invokeNative_Float32 =
|
||||||
(Float32FuncPtr)(uintptr_t)invokeNative;
|
(Float32FuncPtr)(uintptr_t)invokeNative;
|
||||||
static VoidFuncPtr invokeNative_Void = (VoidFuncPtr)(uintptr_t)invokeNative;
|
static volatile VoidFuncPtr invokeNative_Void =
|
||||||
|
(VoidFuncPtr)(uintptr_t)invokeNative;
|
||||||
|
|
||||||
static inline void
|
static inline void
|
||||||
word_copy(uint32 *dest, uint32 *src, unsigned num)
|
word_copy(uint32 *dest, uint32 *src, unsigned num)
|
||||||
|
@ -3781,19 +3787,8 @@ typedef uint32x4_t __m128i;
|
||||||
#endif /* end of WASM_ENABLE_SIMD != 0 */
|
#endif /* end of WASM_ENABLE_SIMD != 0 */
|
||||||
|
|
||||||
typedef void (*GenericFunctionPointer)();
|
typedef void (*GenericFunctionPointer)();
|
||||||
#if defined(__APPLE__) || defined(__MACH__)
|
|
||||||
/**
|
|
||||||
* Define the return type as 'void' in MacOS, since after converting
|
|
||||||
* 'int64 invokeNative' into 'float64 invokeNative_Float64', the
|
|
||||||
* return value passing might be invalid, the caller reads the return
|
|
||||||
* value from register rax but not xmm0.
|
|
||||||
*/
|
|
||||||
void
|
void
|
||||||
invokeNative(GenericFunctionPointer f, uint64 *args, uint64 n_stacks);
|
invokeNative(GenericFunctionPointer f, uint64 *args, uint64 n_stacks);
|
||||||
#else
|
|
||||||
int64
|
|
||||||
invokeNative(GenericFunctionPointer f, uint64 *args, uint64 n_stacks);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
typedef float64 (*Float64FuncPtr)(GenericFunctionPointer, uint64 *, uint64);
|
typedef float64 (*Float64FuncPtr)(GenericFunctionPointer, uint64 *, uint64);
|
||||||
typedef float32 (*Float32FuncPtr)(GenericFunctionPointer, uint64 *, uint64);
|
typedef float32 (*Float32FuncPtr)(GenericFunctionPointer, uint64 *, uint64);
|
||||||
|
@ -3801,13 +3796,16 @@ typedef int64 (*Int64FuncPtr)(GenericFunctionPointer, uint64 *, uint64);
|
||||||
typedef int32 (*Int32FuncPtr)(GenericFunctionPointer, uint64 *, uint64);
|
typedef int32 (*Int32FuncPtr)(GenericFunctionPointer, uint64 *, uint64);
|
||||||
typedef void (*VoidFuncPtr)(GenericFunctionPointer, uint64 *, uint64);
|
typedef void (*VoidFuncPtr)(GenericFunctionPointer, uint64 *, uint64);
|
||||||
|
|
||||||
static Float64FuncPtr invokeNative_Float64 =
|
static volatile Float64FuncPtr invokeNative_Float64 =
|
||||||
(Float64FuncPtr)(uintptr_t)invokeNative;
|
(Float64FuncPtr)(uintptr_t)invokeNative;
|
||||||
static Float32FuncPtr invokeNative_Float32 =
|
static volatile Float32FuncPtr invokeNative_Float32 =
|
||||||
(Float32FuncPtr)(uintptr_t)invokeNative;
|
(Float32FuncPtr)(uintptr_t)invokeNative;
|
||||||
static Int64FuncPtr invokeNative_Int64 = (Int64FuncPtr)(uintptr_t)invokeNative;
|
static volatile Int64FuncPtr invokeNative_Int64 =
|
||||||
static Int32FuncPtr invokeNative_Int32 = (Int32FuncPtr)(uintptr_t)invokeNative;
|
(Int64FuncPtr)(uintptr_t)invokeNative;
|
||||||
static VoidFuncPtr invokeNative_Void = (VoidFuncPtr)(uintptr_t)invokeNative;
|
static volatile Int32FuncPtr invokeNative_Int32 =
|
||||||
|
(Int32FuncPtr)(uintptr_t)invokeNative;
|
||||||
|
static volatile VoidFuncPtr invokeNative_Void =
|
||||||
|
(VoidFuncPtr)(uintptr_t)invokeNative;
|
||||||
|
|
||||||
#if WASM_ENABLE_SIMD != 0
|
#if WASM_ENABLE_SIMD != 0
|
||||||
typedef v128 (*V128FuncPtr)(GenericFunctionPointer, uint64 *, uint64);
|
typedef v128 (*V128FuncPtr)(GenericFunctionPointer, uint64 *, uint64);
|
||||||
|
@ -4546,6 +4544,30 @@ wasm_externref_retain(uint32 externref_idx)
|
||||||
#endif /* end of WASM_ENABLE_REF_TYPES */
|
#endif /* end of WASM_ENABLE_REF_TYPES */
|
||||||
|
|
||||||
#if WASM_ENABLE_DUMP_CALL_STACK != 0
|
#if WASM_ENABLE_DUMP_CALL_STACK != 0
|
||||||
|
uint32
|
||||||
|
wasm_runtime_dump_line_buf_impl(const char *line_buf, bool dump_or_print,
|
||||||
|
char **buf, uint32 *len)
|
||||||
|
{
|
||||||
|
if (dump_or_print) {
|
||||||
|
return (uint32)os_printf("%s", line_buf);
|
||||||
|
}
|
||||||
|
else if (*buf) {
|
||||||
|
uint32 dump_len;
|
||||||
|
|
||||||
|
dump_len = snprintf(*buf, *len, "%s", line_buf);
|
||||||
|
if (dump_len >= *len) {
|
||||||
|
dump_len = *len;
|
||||||
|
}
|
||||||
|
|
||||||
|
*len = *len - dump_len;
|
||||||
|
*buf = *buf + dump_len;
|
||||||
|
return dump_len;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return strlen(line_buf);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
wasm_runtime_dump_call_stack(WASMExecEnv *exec_env)
|
wasm_runtime_dump_call_stack(WASMExecEnv *exec_env)
|
||||||
{
|
{
|
||||||
|
@ -4553,15 +4575,56 @@ wasm_runtime_dump_call_stack(WASMExecEnv *exec_env)
|
||||||
wasm_exec_env_get_module_inst(exec_env);
|
wasm_exec_env_get_module_inst(exec_env);
|
||||||
#if WASM_ENABLE_INTERP != 0
|
#if WASM_ENABLE_INTERP != 0
|
||||||
if (module_inst->module_type == Wasm_Module_Bytecode) {
|
if (module_inst->module_type == Wasm_Module_Bytecode) {
|
||||||
wasm_interp_dump_call_stack(exec_env);
|
wasm_interp_dump_call_stack(exec_env, true, NULL, 0);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
#if WASM_ENABLE_AOT != 0
|
#if WASM_ENABLE_AOT != 0
|
||||||
if (module_inst->module_type == Wasm_Module_AoT) {
|
if (module_inst->module_type == Wasm_Module_AoT) {
|
||||||
aot_dump_call_stack(exec_env);
|
aot_dump_call_stack(exec_env, true, NULL, 0);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint32
|
||||||
|
wasm_runtime_get_call_stack_buf_size(wasm_exec_env_t exec_env)
|
||||||
|
{
|
||||||
|
WASMModuleInstanceCommon *module_inst =
|
||||||
|
wasm_exec_env_get_module_inst(exec_env);
|
||||||
|
|
||||||
|
#if WASM_ENABLE_INTERP != 0
|
||||||
|
if (module_inst->module_type == Wasm_Module_Bytecode) {
|
||||||
|
return wasm_interp_dump_call_stack(exec_env, false, NULL, 0);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#if WASM_ENABLE_AOT != 0
|
||||||
|
if (module_inst->module_type == Wasm_Module_AoT) {
|
||||||
|
return aot_dump_call_stack(exec_env, false, NULL, 0);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32
|
||||||
|
wasm_runtime_dump_call_stack_to_buf(wasm_exec_env_t exec_env, char *buf,
|
||||||
|
uint32 len)
|
||||||
|
{
|
||||||
|
WASMModuleInstanceCommon *module_inst =
|
||||||
|
wasm_exec_env_get_module_inst(exec_env);
|
||||||
|
|
||||||
|
#if WASM_ENABLE_INTERP != 0
|
||||||
|
if (module_inst->module_type == Wasm_Module_Bytecode) {
|
||||||
|
return wasm_interp_dump_call_stack(exec_env, false, buf, len);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#if WASM_ENABLE_AOT != 0
|
||||||
|
if (module_inst->module_type == Wasm_Module_AoT) {
|
||||||
|
return aot_dump_call_stack(exec_env, false, buf, len);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
#endif /* end of WASM_ENABLE_DUMP_CALL_STACK */
|
#endif /* end of WASM_ENABLE_DUMP_CALL_STACK */
|
||||||
|
|
||||||
bool
|
bool
|
||||||
|
|
|
@ -404,6 +404,7 @@ typedef struct wasm_frame_t {
|
||||||
uint32 module_offset;
|
uint32 module_offset;
|
||||||
uint32 func_index;
|
uint32 func_index;
|
||||||
uint32 func_offset;
|
uint32 func_offset;
|
||||||
|
const char *func_name_wp;
|
||||||
} WASMCApiFrame;
|
} WASMCApiFrame;
|
||||||
|
|
||||||
/* See wasm_export.h for description */
|
/* See wasm_export.h for description */
|
||||||
|
@ -803,6 +804,28 @@ void
|
||||||
wasm_externref_cleanup(WASMModuleInstanceCommon *module_inst);
|
wasm_externref_cleanup(WASMModuleInstanceCommon *module_inst);
|
||||||
#endif /* end of WASM_ENABLE_REF_TYPES */
|
#endif /* end of WASM_ENABLE_REF_TYPES */
|
||||||
|
|
||||||
|
#if WASM_ENABLE_DUMP_CALL_STACK != 0
|
||||||
|
/**
|
||||||
|
* @brief Internal implementation for dumping or printing callstack line
|
||||||
|
*
|
||||||
|
* @note if dump_or_print is true, then print to stdout directly;
|
||||||
|
* if dump_or_print is false, but *buf is NULL, then return the length of the
|
||||||
|
* line;
|
||||||
|
* if dump_or_print is false, and *buf is not NULL, then dump content to
|
||||||
|
* the memory pointed by *buf, and adjust *buf and *len according to actual
|
||||||
|
* bytes dumped, and return the actual dumped length
|
||||||
|
*
|
||||||
|
* @param line_buf current line to dump or print
|
||||||
|
* @param dump_or_print whether to print to stdout or dump to buf
|
||||||
|
* @param buf [INOUT] pointer to the buffer
|
||||||
|
* @param len [INOUT] pointer to remaining length
|
||||||
|
* @return bytes printed to stdout or dumped to buf
|
||||||
|
*/
|
||||||
|
uint32
|
||||||
|
wasm_runtime_dump_line_buf_impl(const char *line_buf, bool dump_or_print,
|
||||||
|
char **buf, uint32 *len);
|
||||||
|
#endif /* end of WASM_ENABLE_DUMP_CALL_STACK != 0 */
|
||||||
|
|
||||||
/* Get module of the current exec_env */
|
/* Get module of the current exec_env */
|
||||||
WASMModuleCommon *
|
WASMModuleCommon *
|
||||||
wasm_exec_env_get_module(WASMExecEnv *exec_env);
|
wasm_exec_env_get_module(WASMExecEnv *exec_env);
|
||||||
|
|
|
@ -2641,7 +2641,12 @@ apply_func_passes(AOTCompContext *comp_ctx)
|
||||||
LLVMAddLoopVectorizePass(pass_mgr);
|
LLVMAddLoopVectorizePass(pass_mgr);
|
||||||
LLVMAddSLPVectorizePass(pass_mgr);
|
LLVMAddSLPVectorizePass(pass_mgr);
|
||||||
LLVMAddLoopRotatePass(pass_mgr);
|
LLVMAddLoopRotatePass(pass_mgr);
|
||||||
|
#if LLVM_VERSION_MAJOR < 15
|
||||||
LLVMAddLoopUnswitchPass(pass_mgr);
|
LLVMAddLoopUnswitchPass(pass_mgr);
|
||||||
|
/* Binding disabled in LLVM 15, don't add the pass util we can either
|
||||||
|
add a binding to SimpleLoopUnswitchPass, or add it to
|
||||||
|
aot_llvm_extra.cpp */
|
||||||
|
#endif
|
||||||
LLVMAddInstructionCombiningPass(pass_mgr);
|
LLVMAddInstructionCombiningPass(pass_mgr);
|
||||||
LLVMAddCFGSimplificationPass(pass_mgr);
|
LLVMAddCFGSimplificationPass(pass_mgr);
|
||||||
if (!comp_ctx->enable_thread_mgr) {
|
if (!comp_ctx->enable_thread_mgr) {
|
||||||
|
@ -2694,8 +2699,10 @@ apply_lto_passes(AOTCompContext *comp_ctx)
|
||||||
LLVMPassManagerBuilderSetOptLevel(pass_mgr_builder, comp_ctx->opt_level);
|
LLVMPassManagerBuilderSetOptLevel(pass_mgr_builder, comp_ctx->opt_level);
|
||||||
LLVMPassManagerBuilderPopulateModulePassManager(pass_mgr_builder,
|
LLVMPassManagerBuilderPopulateModulePassManager(pass_mgr_builder,
|
||||||
common_pass_mgr);
|
common_pass_mgr);
|
||||||
|
#if LLVM_VERSION_MAJOR < 15
|
||||||
LLVMPassManagerBuilderPopulateLTOPassManager(pass_mgr_builder,
|
LLVMPassManagerBuilderPopulateLTOPassManager(pass_mgr_builder,
|
||||||
common_pass_mgr, true, true);
|
common_pass_mgr, true, true);
|
||||||
|
#endif
|
||||||
|
|
||||||
#if WASM_ENABLE_LAZY_JIT == 0
|
#if WASM_ENABLE_LAZY_JIT == 0
|
||||||
LLVMRunPassManager(common_pass_mgr, comp_ctx->module);
|
LLVMRunPassManager(common_pass_mgr, comp_ctx->module);
|
||||||
|
|
|
@ -72,7 +72,8 @@ aot_compile_op_f32_const(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx,
|
||||||
aot_set_last_error("llvm build bitcast failed.");
|
aot_set_last_error("llvm build bitcast failed.");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (!(value = LLVMBuildLoad(comp_ctx->builder, alloca, ""))) {
|
if (!(value =
|
||||||
|
LLVMBuildLoad2(comp_ctx->builder, F32_TYPE, alloca, ""))) {
|
||||||
aot_set_last_error("llvm build load failed.");
|
aot_set_last_error("llvm build load failed.");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -127,7 +128,8 @@ aot_compile_op_f64_const(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx,
|
||||||
aot_set_last_error("llvm build bitcast failed.");
|
aot_set_last_error("llvm build bitcast failed.");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (!(value = LLVMBuildLoad(comp_ctx->builder, alloca, ""))) {
|
if (!(value =
|
||||||
|
LLVMBuildLoad2(comp_ctx->builder, F64_TYPE, alloca, ""))) {
|
||||||
aot_set_last_error("llvm build load failed.");
|
aot_set_last_error("llvm build load failed.");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
|
@ -677,9 +677,9 @@ check_suspend_flags(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx)
|
||||||
/* Offset of suspend_flags */
|
/* Offset of suspend_flags */
|
||||||
offset = I32_FIVE;
|
offset = I32_FIVE;
|
||||||
|
|
||||||
if (!(terminate_addr =
|
if (!(terminate_addr = LLVMBuildInBoundsGEP2(
|
||||||
LLVMBuildInBoundsGEP(comp_ctx->builder, func_ctx->exec_env,
|
comp_ctx->builder, OPQ_PTR_TYPE, func_ctx->exec_env, &offset, 1,
|
||||||
&offset, 1, "terminate_addr"))) {
|
"terminate_addr"))) {
|
||||||
aot_set_last_error("llvm build in bounds gep failed");
|
aot_set_last_error("llvm build in bounds gep failed");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -690,8 +690,9 @@ check_suspend_flags(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(terminate_flags = LLVMBuildLoad(comp_ctx->builder, terminate_addr,
|
if (!(terminate_flags =
|
||||||
"terminate_flags"))) {
|
LLVMBuildLoad2(comp_ctx->builder, I32_TYPE, terminate_addr,
|
||||||
|
"terminate_flags"))) {
|
||||||
aot_set_last_error("llvm build bit cast failed");
|
aot_set_last_error("llvm build bit cast failed");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
|
@ -96,7 +96,8 @@ aot_emit_exception(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx,
|
||||||
/* Call the aot_set_exception_with_id() function */
|
/* Call the aot_set_exception_with_id() function */
|
||||||
param_values[0] = func_ctx->aot_inst;
|
param_values[0] = func_ctx->aot_inst;
|
||||||
param_values[1] = func_ctx->exception_id_phi;
|
param_values[1] = func_ctx->exception_id_phi;
|
||||||
if (!LLVMBuildCall(comp_ctx->builder, func, param_values, 2, "")) {
|
if (!LLVMBuildCall2(comp_ctx->builder, func_type, func, param_values, 2,
|
||||||
|
"")) {
|
||||||
aot_set_last_error("llvm build call failed.");
|
aot_set_last_error("llvm build call failed.");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
|
@ -57,8 +57,8 @@ check_exception_thrown(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx)
|
||||||
|
|
||||||
/* Load the first byte of aot_module_inst->cur_exception, and check
|
/* Load the first byte of aot_module_inst->cur_exception, and check
|
||||||
whether it is '\0'. If yes, no exception was thrown. */
|
whether it is '\0'. If yes, no exception was thrown. */
|
||||||
if (!(value = LLVMBuildLoad(comp_ctx->builder, func_ctx->cur_exception,
|
if (!(value = LLVMBuildLoad2(comp_ctx->builder, INT8_TYPE,
|
||||||
"exce_value"))
|
func_ctx->cur_exception, "exce_value"))
|
||||||
|| !(cmp = LLVMBuildICmp(comp_ctx->builder, LLVMIntEQ, value, I8_ZERO,
|
|| !(cmp = LLVMBuildICmp(comp_ctx->builder, LLVMIntEQ, value, I8_ZERO,
|
||||||
"cmp"))) {
|
"cmp"))) {
|
||||||
aot_set_last_error("llvm build icmp failed.");
|
aot_set_last_error("llvm build icmp failed.");
|
||||||
|
@ -207,8 +207,9 @@ call_aot_invoke_native_func(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx,
|
||||||
}
|
}
|
||||||
|
|
||||||
snprintf(buf, sizeof(buf), "%s%d", "elem", i);
|
snprintf(buf, sizeof(buf), "%s%d", "elem", i);
|
||||||
if (!(elem_ptr = LLVMBuildInBoundsGEP(
|
if (!(elem_ptr =
|
||||||
comp_ctx->builder, func_ctx->argv_buf, &elem_idx, 1, buf))
|
LLVMBuildInBoundsGEP2(comp_ctx->builder, I32_TYPE,
|
||||||
|
func_ctx->argv_buf, &elem_idx, 1, buf))
|
||||||
|| !(elem_ptr = LLVMBuildBitCast(comp_ctx->builder, elem_ptr,
|
|| !(elem_ptr = LLVMBuildBitCast(comp_ctx->builder, elem_ptr,
|
||||||
elem_ptr_type, buf))) {
|
elem_ptr_type, buf))) {
|
||||||
aot_set_last_error("llvm build bit cast failed.");
|
aot_set_last_error("llvm build bit cast failed.");
|
||||||
|
@ -236,8 +237,8 @@ call_aot_invoke_native_func(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx,
|
||||||
}
|
}
|
||||||
|
|
||||||
/* call aot_invoke_native() function */
|
/* call aot_invoke_native() function */
|
||||||
if (!(res = LLVMBuildCall(comp_ctx->builder, func, func_param_values, 4,
|
if (!(res = LLVMBuildCall2(comp_ctx->builder, func_type, func,
|
||||||
"res"))) {
|
func_param_values, 4, "res"))) {
|
||||||
aot_set_last_error("llvm build call failed.");
|
aot_set_last_error("llvm build call failed.");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -255,8 +256,8 @@ call_aot_invoke_native_func(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx,
|
||||||
aot_set_last_error("llvm build bit cast failed.");
|
aot_set_last_error("llvm build bit cast failed.");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (!(*p_value_ret =
|
if (!(*p_value_ret = LLVMBuildLoad2(comp_ctx->builder, ret_type,
|
||||||
LLVMBuildLoad(comp_ctx->builder, value_ret, "value_ret"))) {
|
value_ret, "value_ret"))) {
|
||||||
aot_set_last_error("llvm build load failed.");
|
aot_set_last_error("llvm build load failed.");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -299,14 +300,15 @@ lookup_orcjit_func(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx,
|
||||||
LLVMPositionBuilderAtEnd(comp_ctx->builder, block_curr);
|
LLVMPositionBuilderAtEnd(comp_ctx->builder, block_curr);
|
||||||
|
|
||||||
/* Load function pointer */
|
/* Load function pointer */
|
||||||
if (!(func_ptr =
|
if (!(func_ptr = LLVMBuildInBoundsGEP2(comp_ctx->builder, OPQ_PTR_TYPE,
|
||||||
LLVMBuildInBoundsGEP(comp_ctx->builder, func_ctx->func_ptrs,
|
func_ctx->func_ptrs, &func_idx, 1,
|
||||||
&func_idx, 1, "func_ptr_tmp"))) {
|
"func_ptr_tmp"))) {
|
||||||
aot_set_last_error("llvm build inbounds gep failed.");
|
aot_set_last_error("llvm build inbounds gep failed.");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(func = LLVMBuildLoad(comp_ctx->builder, func_ptr, "func_ptr"))) {
|
if (!(func = LLVMBuildLoad2(comp_ctx->builder, OPQ_PTR_TYPE, func_ptr,
|
||||||
|
"func_ptr"))) {
|
||||||
aot_set_last_error("llvm build load failed.");
|
aot_set_last_error("llvm build load failed.");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -364,8 +366,8 @@ lookup_orcjit_func(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx,
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Call the function */
|
/* Call the function */
|
||||||
if (!(func = LLVMBuildCall(comp_ctx->builder, func, param_values, 3,
|
if (!(func = LLVMBuildCall2(comp_ctx->builder, func_type, func,
|
||||||
"call_orcjit_lookup"))) {
|
param_values, 3, "call_orcjit_lookup"))) {
|
||||||
aot_set_last_error("LLVM build call failed.");
|
aot_set_last_error("LLVM build call failed.");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -410,8 +412,9 @@ call_aot_alloc_frame_func(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx,
|
||||||
param_values[0] = func_ctx->exec_env;
|
param_values[0] = func_ctx->exec_env;
|
||||||
param_values[1] = func_idx;
|
param_values[1] = func_idx;
|
||||||
|
|
||||||
if (!(ret_value = LLVMBuildCall(comp_ctx->builder, func, param_values, 2,
|
if (!(ret_value =
|
||||||
"call_aot_alloc_frame"))) {
|
LLVMBuildCall2(comp_ctx->builder, func_type, func, param_values,
|
||||||
|
2, "call_aot_alloc_frame"))) {
|
||||||
aot_set_last_error("llvm build call failed.");
|
aot_set_last_error("llvm build call failed.");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -462,8 +465,8 @@ call_aot_free_frame_func(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx)
|
||||||
|
|
||||||
param_values[0] = func_ctx->exec_env;
|
param_values[0] = func_ctx->exec_env;
|
||||||
|
|
||||||
if (!(ret_value = LLVMBuildCall(comp_ctx->builder, func, param_values, 1,
|
if (!(ret_value = LLVMBuildCall2(comp_ctx->builder, func_type, func,
|
||||||
"call_aot_free_frame"))) {
|
param_values, 1, "call_aot_free_frame"))) {
|
||||||
aot_set_last_error("llvm build call failed.");
|
aot_set_last_error("llvm build call failed.");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -488,8 +491,8 @@ check_stack_boundary(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx,
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(stack_bound = LLVMBuildInBoundsGEP(
|
if (!(stack_bound = LLVMBuildInBoundsGEP2(
|
||||||
comp_ctx->builder, func_ctx->native_stack_bound,
|
comp_ctx->builder, INT8_TYPE, func_ctx->native_stack_bound,
|
||||||
&callee_local_size, 1, "stack_bound"))) {
|
&callee_local_size, 1, "stack_bound"))) {
|
||||||
aot_set_last_error("llvm build inbound gep failed.");
|
aot_set_last_error("llvm build inbound gep failed.");
|
||||||
return false;
|
return false;
|
||||||
|
@ -603,8 +606,8 @@ check_app_addr_and_convert(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx,
|
||||||
}
|
}
|
||||||
|
|
||||||
/* call aot_check_app_addr_and_convert() function */
|
/* call aot_check_app_addr_and_convert() function */
|
||||||
if (!(res = LLVMBuildCall(comp_ctx->builder, func, func_param_values, 5,
|
if (!(res = LLVMBuildCall2(comp_ctx->builder, func_type, func,
|
||||||
"res"))) {
|
func_param_values, 5, "res"))) {
|
||||||
aot_set_last_error("llvm build call failed.");
|
aot_set_last_error("llvm build call failed.");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -614,8 +617,9 @@ check_app_addr_and_convert(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx,
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(*p_native_addr_converted = LLVMBuildLoad(
|
if (!(*p_native_addr_converted =
|
||||||
comp_ctx->builder, native_addr_ptr, "native_addr"))) {
|
LLVMBuildLoad2(comp_ctx->builder, OPQ_PTR_TYPE, native_addr_ptr,
|
||||||
|
"native_addr"))) {
|
||||||
aot_set_last_error("llvm build load failed.");
|
aot_set_last_error("llvm build load failed.");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -734,9 +738,9 @@ aot_compile_op_call(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx,
|
||||||
}
|
}
|
||||||
|
|
||||||
snprintf(buf, sizeof(buf), "ext_ret%d_ptr", i);
|
snprintf(buf, sizeof(buf), "ext_ret%d_ptr", i);
|
||||||
if (!(ext_ret_ptr = LLVMBuildInBoundsGEP(comp_ctx->builder,
|
if (!(ext_ret_ptr = LLVMBuildInBoundsGEP2(
|
||||||
func_ctx->argv_buf,
|
comp_ctx->builder, I32_TYPE, func_ctx->argv_buf,
|
||||||
&ext_ret_idx, 1, buf))) {
|
&ext_ret_idx, 1, buf))) {
|
||||||
aot_set_last_error("llvm build GEP failed.");
|
aot_set_last_error("llvm build GEP failed.");
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
@ -841,15 +845,15 @@ aot_compile_op_call(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx,
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Load function pointer */
|
/* Load function pointer */
|
||||||
if (!(func_ptr = LLVMBuildInBoundsGEP(
|
if (!(func_ptr = LLVMBuildInBoundsGEP2(
|
||||||
comp_ctx->builder, func_ctx->func_ptrs, &import_func_idx,
|
comp_ctx->builder, OPQ_PTR_TYPE, func_ctx->func_ptrs,
|
||||||
1, "native_func_ptr_tmp"))) {
|
&import_func_idx, 1, "native_func_ptr_tmp"))) {
|
||||||
aot_set_last_error("llvm build inbounds gep failed.");
|
aot_set_last_error("llvm build inbounds gep failed.");
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(func_ptr = LLVMBuildLoad(comp_ctx->builder, func_ptr,
|
if (!(func_ptr = LLVMBuildLoad2(comp_ctx->builder, OPQ_PTR_TYPE,
|
||||||
"native_func_ptr"))) {
|
func_ptr, "native_func_ptr"))) {
|
||||||
aot_set_last_error("llvm build load failed.");
|
aot_set_last_error("llvm build load failed.");
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
@ -861,8 +865,8 @@ aot_compile_op_call(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx,
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Call the function */
|
/* Call the function */
|
||||||
if (!(value_ret = LLVMBuildCall(
|
if (!(value_ret = LLVMBuildCall2(
|
||||||
comp_ctx->builder, func, param_values,
|
comp_ctx->builder, native_func_type, func, param_values,
|
||||||
(uint32)param_count + 1 + ext_ret_count,
|
(uint32)param_count + 1 + ext_ret_count,
|
||||||
(func_type->result_count > 0 ? "call" : "")))) {
|
(func_type->result_count > 0 ? "call" : "")))) {
|
||||||
aot_set_last_error("LLVM build call failed.");
|
aot_set_last_error("LLVM build call failed.");
|
||||||
|
@ -877,6 +881,9 @@ aot_compile_op_call(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
#if LLVM_VERSION_MAJOR >= 14
|
||||||
|
LLVMTypeRef llvm_func_type;
|
||||||
|
#endif
|
||||||
bool recursive_call =
|
bool recursive_call =
|
||||||
(func_ctx == func_ctxes[func_idx - import_func_count]) ? true
|
(func_ctx == func_ctxes[func_idx - import_func_count]) ? true
|
||||||
: false;
|
: false;
|
||||||
|
@ -943,11 +950,15 @@ aot_compile_op_call(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx,
|
||||||
&& !check_stack_boundary(comp_ctx, func_ctx, callee_cell_num))
|
&& !check_stack_boundary(comp_ctx, func_ctx, callee_cell_num))
|
||||||
goto fail;
|
goto fail;
|
||||||
|
|
||||||
|
#if LLVM_VERSION_MAJOR >= 14
|
||||||
|
llvm_func_type = func_ctxes[func_idx - import_func_count]->func_type;
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Call the function */
|
/* Call the function */
|
||||||
if (!(value_ret =
|
if (!(value_ret = LLVMBuildCall2(
|
||||||
LLVMBuildCall(comp_ctx->builder, func, param_values,
|
comp_ctx->builder, llvm_func_type, func, param_values,
|
||||||
(uint32)param_count + 1 + ext_ret_count,
|
(uint32)param_count + 1 + ext_ret_count,
|
||||||
(func_type->result_count > 0 ? "call" : "")))) {
|
(func_type->result_count > 0 ? "call" : "")))) {
|
||||||
aot_set_last_error("LLVM build call failed.");
|
aot_set_last_error("LLVM build call failed.");
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
@ -972,9 +983,9 @@ aot_compile_op_call(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx,
|
||||||
/* Load extra result from its address and push to stack */
|
/* Load extra result from its address and push to stack */
|
||||||
for (i = 0; i < ext_ret_count; i++) {
|
for (i = 0; i < ext_ret_count; i++) {
|
||||||
snprintf(buf, sizeof(buf), "func%d_ext_ret%d", func_idx, i);
|
snprintf(buf, sizeof(buf), "func%d_ext_ret%d", func_idx, i);
|
||||||
if (!(ext_ret =
|
if (!(ext_ret = LLVMBuildLoad2(
|
||||||
LLVMBuildLoad(comp_ctx->builder,
|
comp_ctx->builder, TO_LLVM_TYPE(ext_ret_types[i]),
|
||||||
param_values[1 + param_count + i], buf))) {
|
param_values[1 + param_count + i], buf))) {
|
||||||
aot_set_last_error("llvm build load failed.");
|
aot_set_last_error("llvm build load failed.");
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
@ -1084,8 +1095,9 @@ call_aot_call_indirect_func(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx,
|
||||||
}
|
}
|
||||||
|
|
||||||
snprintf(buf, sizeof(buf), "%s%d", "elem", i);
|
snprintf(buf, sizeof(buf), "%s%d", "elem", i);
|
||||||
if (!(elem_ptr = LLVMBuildInBoundsGEP(
|
if (!(elem_ptr =
|
||||||
comp_ctx->builder, func_ctx->argv_buf, &elem_idx, 1, buf))
|
LLVMBuildInBoundsGEP2(comp_ctx->builder, I32_TYPE,
|
||||||
|
func_ctx->argv_buf, &elem_idx, 1, buf))
|
||||||
|| !(elem_ptr = LLVMBuildBitCast(comp_ctx->builder, elem_ptr,
|
|| !(elem_ptr = LLVMBuildBitCast(comp_ctx->builder, elem_ptr,
|
||||||
elem_ptr_type, buf))) {
|
elem_ptr_type, buf))) {
|
||||||
aot_set_last_error("llvm build bit cast failed.");
|
aot_set_last_error("llvm build bit cast failed.");
|
||||||
|
@ -1114,8 +1126,8 @@ call_aot_call_indirect_func(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx,
|
||||||
}
|
}
|
||||||
|
|
||||||
/* call aot_call_indirect() function */
|
/* call aot_call_indirect() function */
|
||||||
if (!(res = LLVMBuildCall(comp_ctx->builder, func, func_param_values, 5,
|
if (!(res = LLVMBuildCall2(comp_ctx->builder, func_type, func,
|
||||||
"res"))) {
|
func_param_values, 5, "res"))) {
|
||||||
aot_set_last_error("llvm build call failed.");
|
aot_set_last_error("llvm build call failed.");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -1131,8 +1143,9 @@ call_aot_call_indirect_func(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx,
|
||||||
}
|
}
|
||||||
|
|
||||||
snprintf(buf, sizeof(buf), "argv_ret%d", i);
|
snprintf(buf, sizeof(buf), "argv_ret%d", i);
|
||||||
if (!(ret_ptr = LLVMBuildInBoundsGEP(
|
if (!(ret_ptr =
|
||||||
comp_ctx->builder, func_ctx->argv_buf, &ret_idx, 1, buf))
|
LLVMBuildInBoundsGEP2(comp_ctx->builder, I32_TYPE,
|
||||||
|
func_ctx->argv_buf, &ret_idx, 1, buf))
|
||||||
|| !(ret_ptr = LLVMBuildBitCast(comp_ctx->builder, ret_ptr,
|
|| !(ret_ptr = LLVMBuildBitCast(comp_ctx->builder, ret_ptr,
|
||||||
ret_ptr_type, buf))) {
|
ret_ptr_type, buf))) {
|
||||||
aot_set_last_error("llvm build GEP or bit cast failed.");
|
aot_set_last_error("llvm build GEP or bit cast failed.");
|
||||||
|
@ -1140,7 +1153,8 @@ call_aot_call_indirect_func(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx,
|
||||||
}
|
}
|
||||||
|
|
||||||
snprintf(buf, sizeof(buf), "ret%d", i);
|
snprintf(buf, sizeof(buf), "ret%d", i);
|
||||||
if (!(value_rets[i] = LLVMBuildLoad(comp_ctx->builder, ret_ptr, buf))) {
|
if (!(value_rets[i] =
|
||||||
|
LLVMBuildLoad2(comp_ctx->builder, ret_type, ret_ptr, buf))) {
|
||||||
aot_set_last_error("llvm build load failed.");
|
aot_set_last_error("llvm build load failed.");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -1208,8 +1222,9 @@ aot_compile_op_call_indirect(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx,
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(table_size_const = LLVMBuildGEP(comp_ctx->builder, func_ctx->aot_inst,
|
if (!(table_size_const = LLVMBuildInBoundsGEP2(comp_ctx->builder, INT8_TYPE,
|
||||||
&offset, 1, "cur_size_i8p"))) {
|
func_ctx->aot_inst, &offset,
|
||||||
|
1, "cur_size_i8p"))) {
|
||||||
HANDLE_FAILURE("LLVMBuildGEP");
|
HANDLE_FAILURE("LLVMBuildGEP");
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
@ -1221,8 +1236,8 @@ aot_compile_op_call_indirect(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx,
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(table_size_const =
|
if (!(table_size_const = LLVMBuildLoad2(comp_ctx->builder, I32_TYPE,
|
||||||
LLVMBuildLoad(comp_ctx->builder, table_size_const, "cur_size"))) {
|
table_size_const, "cur_size"))) {
|
||||||
HANDLE_FAILURE("LLVMBuildLoad");
|
HANDLE_FAILURE("LLVMBuildLoad");
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
@ -1255,8 +1270,9 @@ aot_compile_op_call_indirect(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx,
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(table_elem = LLVMBuildGEP(comp_ctx->builder, func_ctx->aot_inst,
|
if (!(table_elem = LLVMBuildInBoundsGEP2(comp_ctx->builder, INT8_TYPE,
|
||||||
&offset, 1, "table_elem_i8p"))) {
|
func_ctx->aot_inst, &offset, 1,
|
||||||
|
"table_elem_i8p"))) {
|
||||||
aot_set_last_error("llvm build add failed.");
|
aot_set_last_error("llvm build add failed.");
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
@ -1268,14 +1284,15 @@ aot_compile_op_call_indirect(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx,
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Load function index */
|
/* Load function index */
|
||||||
if (!(table_elem = LLVMBuildGEP(comp_ctx->builder, table_elem, &elem_idx, 1,
|
if (!(table_elem =
|
||||||
"table_elem"))) {
|
LLVMBuildInBoundsGEP2(comp_ctx->builder, I32_TYPE, table_elem,
|
||||||
|
&elem_idx, 1, "table_elem"))) {
|
||||||
HANDLE_FAILURE("LLVMBuildNUWAdd");
|
HANDLE_FAILURE("LLVMBuildNUWAdd");
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(func_idx =
|
if (!(func_idx = LLVMBuildLoad2(comp_ctx->builder, I32_TYPE, table_elem,
|
||||||
LLVMBuildLoad(comp_ctx->builder, table_elem, "func_idx"))) {
|
"func_idx"))) {
|
||||||
aot_set_last_error("llvm build load failed.");
|
aot_set_last_error("llvm build load failed.");
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
@ -1302,15 +1319,15 @@ aot_compile_op_call_indirect(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx,
|
||||||
goto fail;
|
goto fail;
|
||||||
|
|
||||||
/* Load function type index */
|
/* Load function type index */
|
||||||
if (!(ftype_idx_ptr = LLVMBuildInBoundsGEP(
|
if (!(ftype_idx_ptr = LLVMBuildInBoundsGEP2(
|
||||||
comp_ctx->builder, func_ctx->func_type_indexes, &func_idx, 1,
|
comp_ctx->builder, I32_TYPE, func_ctx->func_type_indexes,
|
||||||
"ftype_idx_ptr"))) {
|
&func_idx, 1, "ftype_idx_ptr"))) {
|
||||||
aot_set_last_error("llvm build inbounds gep failed.");
|
aot_set_last_error("llvm build inbounds gep failed.");
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(ftype_idx =
|
if (!(ftype_idx = LLVMBuildLoad2(comp_ctx->builder, I32_TYPE, ftype_idx_ptr,
|
||||||
LLVMBuildLoad(comp_ctx->builder, ftype_idx_ptr, "ftype_idx"))) {
|
"ftype_idx"))) {
|
||||||
aot_set_last_error("llvm build load failed.");
|
aot_set_last_error("llvm build load failed.");
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
@ -1399,9 +1416,9 @@ aot_compile_op_call_indirect(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx,
|
||||||
CHECK_LLVM_CONST(ext_ret_offset);
|
CHECK_LLVM_CONST(ext_ret_offset);
|
||||||
|
|
||||||
snprintf(buf, sizeof(buf), "ext_ret%d_ptr", i - 1);
|
snprintf(buf, sizeof(buf), "ext_ret%d_ptr", i - 1);
|
||||||
if (!(ext_ret_ptr =
|
if (!(ext_ret_ptr = LLVMBuildInBoundsGEP2(comp_ctx->builder, I32_TYPE,
|
||||||
LLVMBuildInBoundsGEP(comp_ctx->builder, func_ctx->argv_buf,
|
func_ctx->argv_buf,
|
||||||
&ext_ret_offset, 1, buf))) {
|
&ext_ret_offset, 1, buf))) {
|
||||||
aot_set_last_error("llvm build GEP failed.");
|
aot_set_last_error("llvm build GEP failed.");
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
@ -1553,14 +1570,15 @@ aot_compile_op_call_indirect(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx,
|
||||||
|
|
||||||
#if WASM_ENABLE_LAZY_JIT == 0
|
#if WASM_ENABLE_LAZY_JIT == 0
|
||||||
/* Load function pointer */
|
/* Load function pointer */
|
||||||
if (!(func_ptr =
|
if (!(func_ptr = LLVMBuildInBoundsGEP2(comp_ctx->builder, OPQ_PTR_TYPE,
|
||||||
LLVMBuildInBoundsGEP(comp_ctx->builder, func_ctx->func_ptrs,
|
func_ctx->func_ptrs, &func_idx, 1,
|
||||||
&func_idx, 1, "func_ptr_tmp"))) {
|
"func_ptr_tmp"))) {
|
||||||
aot_set_last_error("llvm build inbounds gep failed.");
|
aot_set_last_error("llvm build inbounds gep failed.");
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(func_ptr = LLVMBuildLoad(comp_ctx->builder, func_ptr, "func_ptr"))) {
|
if (!(func_ptr = LLVMBuildLoad2(comp_ctx->builder, OPQ_PTR_TYPE, func_ptr,
|
||||||
|
"func_ptr"))) {
|
||||||
aot_set_last_error("llvm build load failed.");
|
aot_set_last_error("llvm build load failed.");
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
@ -1584,9 +1602,9 @@ aot_compile_op_call_indirect(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx,
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(value_ret = LLVMBuildCall(comp_ctx->builder, func, param_values,
|
if (!(value_ret = LLVMBuildCall2(comp_ctx->builder, llvm_func_type, func,
|
||||||
total_param_count,
|
param_values, total_param_count,
|
||||||
func_result_count > 0 ? "ret" : ""))) {
|
func_result_count > 0 ? "ret" : ""))) {
|
||||||
aot_set_last_error("llvm build call failed.");
|
aot_set_last_error("llvm build call failed.");
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
@ -1603,10 +1621,11 @@ aot_compile_op_call_indirect(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx,
|
||||||
|
|
||||||
/* Load extra result from its address and push to stack */
|
/* Load extra result from its address and push to stack */
|
||||||
for (i = 1; i < func_result_count; i++) {
|
for (i = 1; i < func_result_count; i++) {
|
||||||
|
ret_type = TO_LLVM_TYPE(func_type->types[func_param_count + i]);
|
||||||
snprintf(buf, sizeof(buf), "ext_ret%d", i - 1);
|
snprintf(buf, sizeof(buf), "ext_ret%d", i - 1);
|
||||||
if (!(ext_ret =
|
if (!(ext_ret = LLVMBuildLoad2(comp_ctx->builder, ret_type,
|
||||||
LLVMBuildLoad(comp_ctx->builder,
|
param_values[func_param_count + i],
|
||||||
param_values[func_param_count + i], buf))) {
|
buf))) {
|
||||||
aot_set_last_error("llvm build load failed.");
|
aot_set_last_error("llvm build load failed.");
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
|
@ -65,8 +65,10 @@ get_memory_check_bound(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx,
|
||||||
if (func_ctx->mem_space_unchanged)
|
if (func_ctx->mem_space_unchanged)
|
||||||
return mem_check_bound;
|
return mem_check_bound;
|
||||||
|
|
||||||
if (!(mem_check_bound = LLVMBuildLoad(comp_ctx->builder, mem_check_bound,
|
if (!(mem_check_bound = LLVMBuildLoad2(
|
||||||
"mem_check_bound"))) {
|
comp_ctx->builder,
|
||||||
|
(comp_ctx->pointer_size == sizeof(uint64)) ? I64_TYPE : I32_TYPE,
|
||||||
|
mem_check_bound, "mem_check_bound"))) {
|
||||||
aot_set_last_error("llvm build load failed.");
|
aot_set_last_error("llvm build load failed.");
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
@ -106,9 +108,9 @@ aot_check_memory_overflow(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx,
|
||||||
mem_base_addr = func_ctx->mem_info[0].mem_base_addr;
|
mem_base_addr = func_ctx->mem_info[0].mem_base_addr;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if (!(mem_base_addr = LLVMBuildLoad(comp_ctx->builder,
|
if (!(mem_base_addr = LLVMBuildLoad2(
|
||||||
func_ctx->mem_info[0].mem_base_addr,
|
comp_ctx->builder, OPQ_PTR_TYPE,
|
||||||
"mem_base"))) {
|
func_ctx->mem_info[0].mem_base_addr, "mem_base"))) {
|
||||||
aot_set_last_error("llvm build load failed.");
|
aot_set_last_error("llvm build load failed.");
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
@ -147,8 +149,9 @@ aot_check_memory_overflow(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx,
|
||||||
/* inside memory space */
|
/* inside memory space */
|
||||||
offset1 = I32_CONST((uint32)mem_offset);
|
offset1 = I32_CONST((uint32)mem_offset);
|
||||||
CHECK_LLVM_CONST(offset1);
|
CHECK_LLVM_CONST(offset1);
|
||||||
if (!(maddr = LLVMBuildInBoundsGEP(comp_ctx->builder, mem_base_addr,
|
if (!(maddr = LLVMBuildInBoundsGEP2(comp_ctx->builder, INT8_TYPE,
|
||||||
&offset1, 1, "maddr"))) {
|
mem_base_addr, &offset1, 1,
|
||||||
|
"maddr"))) {
|
||||||
aot_set_last_error("llvm build add failed.");
|
aot_set_last_error("llvm build add failed.");
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
@ -229,8 +232,8 @@ aot_check_memory_overflow(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx,
|
||||||
}
|
}
|
||||||
|
|
||||||
/* maddr = mem_base_addr + offset1 */
|
/* maddr = mem_base_addr + offset1 */
|
||||||
if (!(maddr = LLVMBuildInBoundsGEP(comp_ctx->builder, mem_base_addr,
|
if (!(maddr = LLVMBuildInBoundsGEP2(comp_ctx->builder, INT8_TYPE,
|
||||||
&offset1, 1, "maddr"))) {
|
mem_base_addr, &offset1, 1, "maddr"))) {
|
||||||
aot_set_last_error("llvm build add failed.");
|
aot_set_last_error("llvm build add failed.");
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
@ -248,9 +251,10 @@ fail:
|
||||||
} \
|
} \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
#define BUILD_LOAD() \
|
#define BUILD_LOAD(data_type) \
|
||||||
do { \
|
do { \
|
||||||
if (!(value = LLVMBuildLoad(comp_ctx->builder, maddr, "data"))) { \
|
if (!(value = LLVMBuildLoad2(comp_ctx->builder, data_type, maddr, \
|
||||||
|
"data"))) { \
|
||||||
aot_set_last_error("llvm build load failed."); \
|
aot_set_last_error("llvm build load failed."); \
|
||||||
goto fail; \
|
goto fail; \
|
||||||
} \
|
} \
|
||||||
|
@ -333,12 +337,13 @@ fail:
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
#define BUILD_ATOMIC_LOAD(align) \
|
#define BUILD_ATOMIC_LOAD(align, data_type) \
|
||||||
do { \
|
do { \
|
||||||
if (!(check_memory_alignment(comp_ctx, func_ctx, maddr, align))) { \
|
if (!(check_memory_alignment(comp_ctx, func_ctx, maddr, align))) { \
|
||||||
goto fail; \
|
goto fail; \
|
||||||
} \
|
} \
|
||||||
if (!(value = LLVMBuildLoad(comp_ctx->builder, maddr, "data"))) { \
|
if (!(value = LLVMBuildLoad2(comp_ctx->builder, data_type, maddr, \
|
||||||
|
"data"))) { \
|
||||||
aot_set_last_error("llvm build load failed."); \
|
aot_set_last_error("llvm build load failed."); \
|
||||||
goto fail; \
|
goto fail; \
|
||||||
} \
|
} \
|
||||||
|
@ -369,6 +374,7 @@ aot_compile_op_i32_load(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx,
|
||||||
bool atomic)
|
bool atomic)
|
||||||
{
|
{
|
||||||
LLVMValueRef maddr, value = NULL;
|
LLVMValueRef maddr, value = NULL;
|
||||||
|
LLVMTypeRef data_type;
|
||||||
|
|
||||||
if (!(maddr = aot_check_memory_overflow(comp_ctx, func_ctx, offset, bytes)))
|
if (!(maddr = aot_check_memory_overflow(comp_ctx, func_ctx, offset, bytes)))
|
||||||
return false;
|
return false;
|
||||||
|
@ -378,26 +384,31 @@ aot_compile_op_i32_load(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx,
|
||||||
BUILD_PTR_CAST(INT32_PTR_TYPE);
|
BUILD_PTR_CAST(INT32_PTR_TYPE);
|
||||||
#if WASM_ENABLE_SHARED_MEMORY != 0
|
#if WASM_ENABLE_SHARED_MEMORY != 0
|
||||||
if (atomic)
|
if (atomic)
|
||||||
BUILD_ATOMIC_LOAD(align);
|
BUILD_ATOMIC_LOAD(align, I32_TYPE);
|
||||||
else
|
else
|
||||||
#endif
|
#endif
|
||||||
BUILD_LOAD();
|
BUILD_LOAD(I32_TYPE);
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
case 1:
|
case 1:
|
||||||
if (bytes == 2)
|
if (bytes == 2) {
|
||||||
BUILD_PTR_CAST(INT16_PTR_TYPE);
|
BUILD_PTR_CAST(INT16_PTR_TYPE);
|
||||||
else
|
data_type = INT16_TYPE;
|
||||||
|
}
|
||||||
|
else {
|
||||||
BUILD_PTR_CAST(INT8_PTR_TYPE);
|
BUILD_PTR_CAST(INT8_PTR_TYPE);
|
||||||
|
data_type = INT8_TYPE;
|
||||||
|
}
|
||||||
|
|
||||||
#if WASM_ENABLE_SHARED_MEMORY != 0
|
#if WASM_ENABLE_SHARED_MEMORY != 0
|
||||||
if (atomic) {
|
if (atomic) {
|
||||||
BUILD_ATOMIC_LOAD(align);
|
BUILD_ATOMIC_LOAD(align, data_type);
|
||||||
BUILD_ZERO_EXT(I32_TYPE);
|
BUILD_ZERO_EXT(I32_TYPE);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
BUILD_LOAD();
|
BUILD_LOAD(data_type);
|
||||||
if (sign)
|
if (sign)
|
||||||
BUILD_SIGN_EXT(I32_TYPE);
|
BUILD_SIGN_EXT(I32_TYPE);
|
||||||
else
|
else
|
||||||
|
@ -410,6 +421,7 @@ aot_compile_op_i32_load(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx,
|
||||||
}
|
}
|
||||||
|
|
||||||
PUSH_I32(value);
|
PUSH_I32(value);
|
||||||
|
(void)data_type;
|
||||||
return true;
|
return true;
|
||||||
fail:
|
fail:
|
||||||
return false;
|
return false;
|
||||||
|
@ -421,6 +433,7 @@ aot_compile_op_i64_load(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx,
|
||||||
bool atomic)
|
bool atomic)
|
||||||
{
|
{
|
||||||
LLVMValueRef maddr, value = NULL;
|
LLVMValueRef maddr, value = NULL;
|
||||||
|
LLVMTypeRef data_type;
|
||||||
|
|
||||||
if (!(maddr = aot_check_memory_overflow(comp_ctx, func_ctx, offset, bytes)))
|
if (!(maddr = aot_check_memory_overflow(comp_ctx, func_ctx, offset, bytes)))
|
||||||
return false;
|
return false;
|
||||||
|
@ -430,29 +443,36 @@ aot_compile_op_i64_load(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx,
|
||||||
BUILD_PTR_CAST(INT64_PTR_TYPE);
|
BUILD_PTR_CAST(INT64_PTR_TYPE);
|
||||||
#if WASM_ENABLE_SHARED_MEMORY != 0
|
#if WASM_ENABLE_SHARED_MEMORY != 0
|
||||||
if (atomic)
|
if (atomic)
|
||||||
BUILD_ATOMIC_LOAD(align);
|
BUILD_ATOMIC_LOAD(align, I64_TYPE);
|
||||||
else
|
else
|
||||||
#endif
|
#endif
|
||||||
BUILD_LOAD();
|
BUILD_LOAD(I64_TYPE);
|
||||||
break;
|
break;
|
||||||
case 4:
|
case 4:
|
||||||
case 2:
|
case 2:
|
||||||
case 1:
|
case 1:
|
||||||
if (bytes == 4)
|
if (bytes == 4) {
|
||||||
BUILD_PTR_CAST(INT32_PTR_TYPE);
|
BUILD_PTR_CAST(INT32_PTR_TYPE);
|
||||||
else if (bytes == 2)
|
data_type = I32_TYPE;
|
||||||
|
}
|
||||||
|
else if (bytes == 2) {
|
||||||
BUILD_PTR_CAST(INT16_PTR_TYPE);
|
BUILD_PTR_CAST(INT16_PTR_TYPE);
|
||||||
else
|
data_type = INT16_TYPE;
|
||||||
|
}
|
||||||
|
else {
|
||||||
BUILD_PTR_CAST(INT8_PTR_TYPE);
|
BUILD_PTR_CAST(INT8_PTR_TYPE);
|
||||||
|
data_type = INT8_TYPE;
|
||||||
|
}
|
||||||
|
|
||||||
#if WASM_ENABLE_SHARED_MEMORY != 0
|
#if WASM_ENABLE_SHARED_MEMORY != 0
|
||||||
if (atomic) {
|
if (atomic) {
|
||||||
BUILD_ATOMIC_LOAD(align);
|
BUILD_ATOMIC_LOAD(align, data_type);
|
||||||
BUILD_ZERO_EXT(I64_TYPE);
|
BUILD_ZERO_EXT(I64_TYPE);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
BUILD_LOAD();
|
BUILD_LOAD(data_type);
|
||||||
if (sign)
|
if (sign)
|
||||||
BUILD_SIGN_EXT(I64_TYPE);
|
BUILD_SIGN_EXT(I64_TYPE);
|
||||||
else
|
else
|
||||||
|
@ -465,6 +485,7 @@ aot_compile_op_i64_load(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx,
|
||||||
}
|
}
|
||||||
|
|
||||||
PUSH_I64(value);
|
PUSH_I64(value);
|
||||||
|
(void)data_type;
|
||||||
return true;
|
return true;
|
||||||
fail:
|
fail:
|
||||||
return false;
|
return false;
|
||||||
|
@ -480,7 +501,7 @@ aot_compile_op_f32_load(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx,
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
BUILD_PTR_CAST(F32_PTR_TYPE);
|
BUILD_PTR_CAST(F32_PTR_TYPE);
|
||||||
BUILD_LOAD();
|
BUILD_LOAD(F32_TYPE);
|
||||||
PUSH_F32(value);
|
PUSH_F32(value);
|
||||||
return true;
|
return true;
|
||||||
fail:
|
fail:
|
||||||
|
@ -497,7 +518,7 @@ aot_compile_op_f64_load(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx,
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
BUILD_PTR_CAST(F64_PTR_TYPE);
|
BUILD_PTR_CAST(F64_PTR_TYPE);
|
||||||
BUILD_LOAD();
|
BUILD_LOAD(F64_TYPE);
|
||||||
PUSH_F64(value);
|
PUSH_F64(value);
|
||||||
return true;
|
return true;
|
||||||
fail:
|
fail:
|
||||||
|
@ -631,8 +652,8 @@ get_memory_curr_page_count(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx)
|
||||||
mem_size = func_ctx->mem_info[0].mem_cur_page_count_addr;
|
mem_size = func_ctx->mem_info[0].mem_cur_page_count_addr;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if (!(mem_size = LLVMBuildLoad(
|
if (!(mem_size = LLVMBuildLoad2(
|
||||||
comp_ctx->builder,
|
comp_ctx->builder, I32_TYPE,
|
||||||
func_ctx->mem_info[0].mem_cur_page_count_addr, "mem_size"))) {
|
func_ctx->mem_info[0].mem_cur_page_count_addr, "mem_size"))) {
|
||||||
aot_set_last_error("llvm build load failed.");
|
aot_set_last_error("llvm build load failed.");
|
||||||
goto fail;
|
goto fail;
|
||||||
|
@ -720,8 +741,8 @@ aot_compile_op_memory_grow(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx)
|
||||||
/* Call function aot_enlarge_memory() */
|
/* Call function aot_enlarge_memory() */
|
||||||
param_values[0] = func_ctx->aot_inst;
|
param_values[0] = func_ctx->aot_inst;
|
||||||
param_values[1] = delta;
|
param_values[1] = delta;
|
||||||
if (!(ret_value = LLVMBuildCall(comp_ctx->builder, func, param_values, 2,
|
if (!(ret_value = LLVMBuildCall2(comp_ctx->builder, func_type, func,
|
||||||
"call"))) {
|
param_values, 2, "call"))) {
|
||||||
aot_set_last_error("llvm build call failed.");
|
aot_set_last_error("llvm build call failed.");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -765,9 +786,9 @@ check_bulk_memory_overflow(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx,
|
||||||
mem_base_addr = func_ctx->mem_info[0].mem_base_addr;
|
mem_base_addr = func_ctx->mem_info[0].mem_base_addr;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if (!(mem_base_addr = LLVMBuildLoad(comp_ctx->builder,
|
if (!(mem_base_addr = LLVMBuildLoad2(
|
||||||
func_ctx->mem_info[0].mem_base_addr,
|
comp_ctx->builder, OPQ_PTR_TYPE,
|
||||||
"mem_base"))) {
|
func_ctx->mem_info[0].mem_base_addr, "mem_base"))) {
|
||||||
aot_set_last_error("llvm build load failed.");
|
aot_set_last_error("llvm build load failed.");
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
@ -793,8 +814,9 @@ check_bulk_memory_overflow(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx,
|
||||||
if (mem_data_size > 0 && mem_offset + mem_len <= mem_data_size) {
|
if (mem_data_size > 0 && mem_offset + mem_len <= mem_data_size) {
|
||||||
/* inside memory space */
|
/* inside memory space */
|
||||||
/* maddr = mem_base_addr + moffset */
|
/* maddr = mem_base_addr + moffset */
|
||||||
if (!(maddr = LLVMBuildInBoundsGEP(comp_ctx->builder, mem_base_addr,
|
if (!(maddr = LLVMBuildInBoundsGEP2(comp_ctx->builder, INT8_TYPE,
|
||||||
&offset, 1, "maddr"))) {
|
mem_base_addr, &offset, 1,
|
||||||
|
"maddr"))) {
|
||||||
aot_set_last_error("llvm build add failed.");
|
aot_set_last_error("llvm build add failed.");
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
@ -806,9 +828,9 @@ check_bulk_memory_overflow(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx,
|
||||||
mem_size = func_ctx->mem_info[0].mem_data_size_addr;
|
mem_size = func_ctx->mem_info[0].mem_data_size_addr;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if (!(mem_size = LLVMBuildLoad(comp_ctx->builder,
|
if (!(mem_size = LLVMBuildLoad2(
|
||||||
func_ctx->mem_info[0].mem_data_size_addr,
|
comp_ctx->builder, I32_TYPE,
|
||||||
"mem_size"))) {
|
func_ctx->mem_info[0].mem_data_size_addr, "mem_size"))) {
|
||||||
aot_set_last_error("llvm build load failed.");
|
aot_set_last_error("llvm build load failed.");
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
@ -832,8 +854,8 @@ check_bulk_memory_overflow(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx,
|
||||||
}
|
}
|
||||||
|
|
||||||
/* maddr = mem_base_addr + offset */
|
/* maddr = mem_base_addr + offset */
|
||||||
if (!(maddr = LLVMBuildInBoundsGEP(comp_ctx->builder, mem_base_addr,
|
if (!(maddr = LLVMBuildInBoundsGEP2(comp_ctx->builder, INT8_TYPE,
|
||||||
&offset, 1, "maddr"))) {
|
mem_base_addr, &offset, 1, "maddr"))) {
|
||||||
aot_set_last_error("llvm build add failed.");
|
aot_set_last_error("llvm build add failed.");
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
@ -873,8 +895,8 @@ aot_compile_op_memory_init(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx,
|
||||||
param_values[2] = offset;
|
param_values[2] = offset;
|
||||||
param_values[3] = len;
|
param_values[3] = len;
|
||||||
param_values[4] = dst;
|
param_values[4] = dst;
|
||||||
if (!(ret_value = LLVMBuildCall(comp_ctx->builder, func, param_values, 5,
|
if (!(ret_value = LLVMBuildCall2(comp_ctx->builder, func_type, func,
|
||||||
"call"))) {
|
param_values, 5, "call"))) {
|
||||||
aot_set_last_error("llvm build call failed.");
|
aot_set_last_error("llvm build call failed.");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -926,8 +948,8 @@ aot_compile_op_data_drop(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx,
|
||||||
/* Call function aot_data_drop() */
|
/* Call function aot_data_drop() */
|
||||||
param_values[0] = func_ctx->aot_inst;
|
param_values[0] = func_ctx->aot_inst;
|
||||||
param_values[1] = seg;
|
param_values[1] = seg;
|
||||||
if (!(ret_value = LLVMBuildCall(comp_ctx->builder, func, param_values, 2,
|
if (!(ret_value = LLVMBuildCall2(comp_ctx->builder, func_type, func,
|
||||||
"call"))) {
|
param_values, 2, "call"))) {
|
||||||
aot_set_last_error("llvm build call failed.");
|
aot_set_last_error("llvm build call failed.");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -1001,8 +1023,8 @@ aot_compile_op_memory_copy(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx)
|
||||||
params[0] = dst_addr;
|
params[0] = dst_addr;
|
||||||
params[1] = src_addr;
|
params[1] = src_addr;
|
||||||
params[2] = len;
|
params[2] = len;
|
||||||
if (!(res = LLVMBuildCall(comp_ctx->builder, func, params, 3,
|
if (!(res = LLVMBuildCall2(comp_ctx->builder, func_type, func, params,
|
||||||
"call_memmove"))) {
|
3, "call_memmove"))) {
|
||||||
aot_set_last_error("llvm build memmove failed.");
|
aot_set_last_error("llvm build memmove failed.");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -1079,8 +1101,8 @@ aot_compile_op_memory_fill(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx)
|
||||||
params[0] = dst_addr;
|
params[0] = dst_addr;
|
||||||
params[1] = val;
|
params[1] = val;
|
||||||
params[2] = len;
|
params[2] = len;
|
||||||
if (!(res = LLVMBuildCall(comp_ctx->builder, func, params, 3,
|
if (!(res = LLVMBuildCall2(comp_ctx->builder, func_type, func, params, 3,
|
||||||
"call_memset"))) {
|
"call_memset"))) {
|
||||||
aot_set_last_error("llvm build memset failed.");
|
aot_set_last_error("llvm build memset failed.");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -1297,8 +1319,8 @@ aot_compile_op_atomic_wait(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx,
|
||||||
param_values[2] = expect;
|
param_values[2] = expect;
|
||||||
param_values[3] = timeout;
|
param_values[3] = timeout;
|
||||||
param_values[4] = is_wait64;
|
param_values[4] = is_wait64;
|
||||||
if (!(ret_value = LLVMBuildCall(comp_ctx->builder, func, param_values, 5,
|
if (!(ret_value = LLVMBuildCall2(comp_ctx->builder, func_type, func,
|
||||||
"call"))) {
|
param_values, 5, "call"))) {
|
||||||
aot_set_last_error("llvm build call failed.");
|
aot_set_last_error("llvm build call failed.");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -1360,8 +1382,8 @@ aot_compiler_op_atomic_notify(AOTCompContext *comp_ctx,
|
||||||
param_values[0] = func_ctx->aot_inst;
|
param_values[0] = func_ctx->aot_inst;
|
||||||
param_values[1] = maddr;
|
param_values[1] = maddr;
|
||||||
param_values[2] = count;
|
param_values[2] = count;
|
||||||
if (!(ret_value = LLVMBuildCall(comp_ctx->builder, func, param_values, 3,
|
if (!(ret_value = LLVMBuildCall2(comp_ctx->builder, func_type, func,
|
||||||
"call"))) {
|
param_values, 3, "call"))) {
|
||||||
aot_set_last_error("llvm build call failed.");
|
aot_set_last_error("llvm build call failed.");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
|
@ -58,9 +58,10 @@ aot_compile_get_tbl_inst(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx,
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(tbl_inst = LLVMBuildGEP(comp_ctx->builder, func_ctx->aot_inst,
|
if (!(tbl_inst = LLVMBuildInBoundsGEP2(comp_ctx->builder, INT8_TYPE,
|
||||||
&offset, 1, "tbl_inst"))) {
|
func_ctx->aot_inst, &offset, 1,
|
||||||
HANDLE_FAILURE("LLVMBuildGEP");
|
"tbl_inst"))) {
|
||||||
|
HANDLE_FAILURE("LLVMBuildInBoundsGEP");
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -90,8 +91,8 @@ aot_compile_op_elem_drop(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx,
|
||||||
}
|
}
|
||||||
|
|
||||||
/* "" means return void */
|
/* "" means return void */
|
||||||
if (!(ret_value =
|
if (!(ret_value = LLVMBuildCall2(comp_ctx->builder, func_type, func,
|
||||||
LLVMBuildCall(comp_ctx->builder, func, param_values, 2, ""))) {
|
param_values, 2, ""))) {
|
||||||
HANDLE_FAILURE("LLVMBuildCall");
|
HANDLE_FAILURE("LLVMBuildCall");
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
@ -115,9 +116,10 @@ aot_check_table_access(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx,
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(tbl_sz = LLVMBuildGEP(comp_ctx->builder, func_ctx->aot_inst, &offset,
|
if (!(tbl_sz = LLVMBuildInBoundsGEP2(comp_ctx->builder, INT8_TYPE,
|
||||||
1, "cur_size_i8p"))) {
|
func_ctx->aot_inst, &offset, 1,
|
||||||
HANDLE_FAILURE("LLVMBuildGEP");
|
"cur_size_i8p"))) {
|
||||||
|
HANDLE_FAILURE("LLVMBuildInBoundsGEP");
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -127,7 +129,8 @@ aot_check_table_access(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx,
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(tbl_sz = LLVMBuildLoad(comp_ctx->builder, tbl_sz, "cur_size"))) {
|
if (!(tbl_sz = LLVMBuildLoad2(comp_ctx->builder, I32_TYPE, tbl_sz,
|
||||||
|
"cur_size"))) {
|
||||||
HANDLE_FAILURE("LLVMBuildLoad");
|
HANDLE_FAILURE("LLVMBuildLoad");
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
@ -178,8 +181,9 @@ aot_compile_op_table_get(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx,
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(table_elem = LLVMBuildGEP(comp_ctx->builder, func_ctx->aot_inst,
|
if (!(table_elem = LLVMBuildInBoundsGEP2(comp_ctx->builder, INT8_TYPE,
|
||||||
&offset, 1, "table_elem_i8p"))) {
|
func_ctx->aot_inst, &offset, 1,
|
||||||
|
"table_elem_i8p"))) {
|
||||||
aot_set_last_error("llvm build add failed.");
|
aot_set_last_error("llvm build add failed.");
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
@ -191,14 +195,15 @@ aot_compile_op_table_get(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx,
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Load function index */
|
/* Load function index */
|
||||||
if (!(table_elem = LLVMBuildGEP(comp_ctx->builder, table_elem, &elem_idx, 1,
|
if (!(table_elem =
|
||||||
"table_elem"))) {
|
LLVMBuildInBoundsGEP2(comp_ctx->builder, I32_TYPE, table_elem,
|
||||||
|
&elem_idx, 1, "table_elem"))) {
|
||||||
HANDLE_FAILURE("LLVMBuildNUWAdd");
|
HANDLE_FAILURE("LLVMBuildNUWAdd");
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(func_idx =
|
if (!(func_idx = LLVMBuildLoad2(comp_ctx->builder, I32_TYPE, table_elem,
|
||||||
LLVMBuildLoad(comp_ctx->builder, table_elem, "func_idx"))) {
|
"func_idx"))) {
|
||||||
HANDLE_FAILURE("LLVMBuildLoad");
|
HANDLE_FAILURE("LLVMBuildLoad");
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
@ -230,9 +235,10 @@ aot_compile_op_table_set(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx,
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(table_elem = LLVMBuildGEP(comp_ctx->builder, func_ctx->aot_inst,
|
if (!(table_elem = LLVMBuildInBoundsGEP2(comp_ctx->builder, INT8_TYPE,
|
||||||
&offset, 1, "table_elem_i8p"))) {
|
func_ctx->aot_inst, &offset, 1,
|
||||||
HANDLE_FAILURE("LLVMBuildGEP");
|
"table_elem_i8p"))) {
|
||||||
|
HANDLE_FAILURE("LLVMBuildInBoundsGEP");
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -243,9 +249,10 @@ aot_compile_op_table_set(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx,
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Load function index */
|
/* Load function index */
|
||||||
if (!(table_elem = LLVMBuildGEP(comp_ctx->builder, table_elem, &elem_idx, 1,
|
if (!(table_elem =
|
||||||
"table_elem"))) {
|
LLVMBuildInBoundsGEP2(comp_ctx->builder, I32_TYPE, table_elem,
|
||||||
HANDLE_FAILURE("LLVMBuildGEP");
|
&elem_idx, 1, "table_elem"))) {
|
||||||
|
HANDLE_FAILURE("LLVMBuildInBoundsGEP");
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -297,7 +304,8 @@ aot_compile_op_table_init(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx,
|
||||||
POP_I32(param_values[5]);
|
POP_I32(param_values[5]);
|
||||||
|
|
||||||
/* "" means return void */
|
/* "" means return void */
|
||||||
if (!(LLVMBuildCall(comp_ctx->builder, func, param_values, 6, ""))) {
|
if (!(LLVMBuildCall2(comp_ctx->builder, func_type, func, param_values, 6,
|
||||||
|
""))) {
|
||||||
HANDLE_FAILURE("LLVMBuildCall");
|
HANDLE_FAILURE("LLVMBuildCall");
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
@ -344,7 +352,8 @@ aot_compile_op_table_copy(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx,
|
||||||
POP_I32(param_values[5]);
|
POP_I32(param_values[5]);
|
||||||
|
|
||||||
/* "" means return void */
|
/* "" means return void */
|
||||||
if (!(LLVMBuildCall(comp_ctx->builder, func, param_values, 6, ""))) {
|
if (!(LLVMBuildCall2(comp_ctx->builder, func_type, func, param_values, 6,
|
||||||
|
""))) {
|
||||||
HANDLE_FAILURE("LLVMBuildCall");
|
HANDLE_FAILURE("LLVMBuildCall");
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
@ -366,9 +375,10 @@ aot_compile_op_table_size(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx,
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(tbl_sz = LLVMBuildGEP(comp_ctx->builder, func_ctx->aot_inst, &offset,
|
if (!(tbl_sz = LLVMBuildInBoundsGEP2(comp_ctx->builder, INT8_TYPE,
|
||||||
1, "tbl_sz_ptr_i8"))) {
|
func_ctx->aot_inst, &offset, 1,
|
||||||
HANDLE_FAILURE("LLVMBuildGEP");
|
"tbl_sz_ptr_i8"))) {
|
||||||
|
HANDLE_FAILURE("LLVMBuildInBoundsGEP");
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -378,7 +388,8 @@ aot_compile_op_table_size(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx,
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(tbl_sz = LLVMBuildLoad(comp_ctx->builder, tbl_sz, "tbl_sz"))) {
|
if (!(tbl_sz =
|
||||||
|
LLVMBuildLoad2(comp_ctx->builder, I32_TYPE, tbl_sz, "tbl_sz"))) {
|
||||||
HANDLE_FAILURE("LLVMBuildLoad");
|
HANDLE_FAILURE("LLVMBuildLoad");
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
@ -417,8 +428,8 @@ aot_compile_op_table_grow(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx,
|
||||||
/* v */
|
/* v */
|
||||||
POP_I32(param_values[3]);
|
POP_I32(param_values[3]);
|
||||||
|
|
||||||
if (!(ret = LLVMBuildCall(comp_ctx->builder, func, param_values, 4,
|
if (!(ret = LLVMBuildCall2(comp_ctx->builder, func_type, func, param_values,
|
||||||
"table_grow"))) {
|
4, "table_grow"))) {
|
||||||
HANDLE_FAILURE("LLVMBuildCall");
|
HANDLE_FAILURE("LLVMBuildCall");
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
@ -461,7 +472,8 @@ aot_compile_op_table_fill(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx,
|
||||||
POP_I32(param_values[4]);
|
POP_I32(param_values[4]);
|
||||||
|
|
||||||
/* "" means return void */
|
/* "" means return void */
|
||||||
if (!(LLVMBuildCall(comp_ctx->builder, func, param_values, 5, ""))) {
|
if (!(LLVMBuildCall2(comp_ctx->builder, func_type, func, param_values, 5,
|
||||||
|
""))) {
|
||||||
HANDLE_FAILURE("LLVMBuildCall");
|
HANDLE_FAILURE("LLVMBuildCall");
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
@ -471,4 +483,4 @@ fail:
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* WASM_ENABLE_REF_TYPES != 0 */
|
#endif /* WASM_ENABLE_REF_TYPES != 0 */
|
||||||
|
|
|
@ -33,17 +33,20 @@ aot_compile_op_get_local(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx,
|
||||||
char name[32];
|
char name[32];
|
||||||
LLVMValueRef value;
|
LLVMValueRef value;
|
||||||
AOTValue *aot_value_top;
|
AOTValue *aot_value_top;
|
||||||
|
uint8 local_type;
|
||||||
|
|
||||||
CHECK_LOCAL(local_idx);
|
CHECK_LOCAL(local_idx);
|
||||||
|
|
||||||
|
local_type = get_local_type(func_ctx, local_idx);
|
||||||
|
|
||||||
snprintf(name, sizeof(name), "%s%d%s", "local", local_idx, "#");
|
snprintf(name, sizeof(name), "%s%d%s", "local", local_idx, "#");
|
||||||
if (!(value = LLVMBuildLoad(comp_ctx->builder, func_ctx->locals[local_idx],
|
if (!(value = LLVMBuildLoad2(comp_ctx->builder, TO_LLVM_TYPE(local_type),
|
||||||
name))) {
|
func_ctx->locals[local_idx], name))) {
|
||||||
aot_set_last_error("llvm build load fail");
|
aot_set_last_error("llvm build load fail");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
PUSH(value, get_local_type(func_ctx, local_idx));
|
PUSH(value, local_type);
|
||||||
|
|
||||||
aot_value_top =
|
aot_value_top =
|
||||||
func_ctx->block_stack.block_list_end->value_stack.value_list_end;
|
func_ctx->block_stack.block_list_end->value_stack.value_list_end;
|
||||||
|
@ -134,9 +137,9 @@ compile_global(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx,
|
||||||
}
|
}
|
||||||
|
|
||||||
offset = I32_CONST(global_offset);
|
offset = I32_CONST(global_offset);
|
||||||
if (!(global_ptr =
|
if (!(global_ptr = LLVMBuildInBoundsGEP2(comp_ctx->builder, INT8_TYPE,
|
||||||
LLVMBuildInBoundsGEP(comp_ctx->builder, func_ctx->aot_inst,
|
func_ctx->aot_inst, &offset, 1,
|
||||||
&offset, 1, "global_ptr_tmp"))) {
|
"global_ptr_tmp"))) {
|
||||||
aot_set_last_error("llvm build in bounds gep failed.");
|
aot_set_last_error("llvm build in bounds gep failed.");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -172,7 +175,8 @@ compile_global(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx,
|
||||||
|
|
||||||
if (!is_set) {
|
if (!is_set) {
|
||||||
if (!(global =
|
if (!(global =
|
||||||
LLVMBuildLoad(comp_ctx->builder, global_ptr, "global"))) {
|
LLVMBuildLoad2(comp_ctx->builder, TO_LLVM_TYPE(global_type),
|
||||||
|
global_ptr, "global"))) {
|
||||||
aot_set_last_error("llvm build load failed.");
|
aot_set_last_error("llvm build load failed.");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
|
@ -232,9 +232,9 @@ create_memory_info(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx,
|
||||||
}
|
}
|
||||||
|
|
||||||
/* aot_inst->memories */
|
/* aot_inst->memories */
|
||||||
if (!(shared_mem_addr =
|
if (!(shared_mem_addr = LLVMBuildInBoundsGEP2(
|
||||||
LLVMBuildInBoundsGEP(comp_ctx->builder, func_ctx->aot_inst,
|
comp_ctx->builder, INT8_TYPE, func_ctx->aot_inst, &offset, 1,
|
||||||
&offset, 1, "shared_mem_addr_offset"))) {
|
"shared_mem_addr_offset"))) {
|
||||||
aot_set_last_error("llvm build in bounds gep failed");
|
aot_set_last_error("llvm build in bounds gep failed");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -245,8 +245,9 @@ create_memory_info(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx,
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
/* aot_inst->memories[0] */
|
/* aot_inst->memories[0] */
|
||||||
if (!(shared_mem_addr = LLVMBuildLoad(
|
if (!(shared_mem_addr =
|
||||||
comp_ctx->builder, shared_mem_addr, "shared_mem_addr"))) {
|
LLVMBuildLoad2(comp_ctx->builder, OPQ_PTR_TYPE,
|
||||||
|
shared_mem_addr, "shared_mem_addr"))) {
|
||||||
aot_set_last_error("llvm build load failed");
|
aot_set_last_error("llvm build load failed");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -256,29 +257,34 @@ create_memory_info(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx,
|
||||||
aot_set_last_error("llvm build bit cast failed");
|
aot_set_last_error("llvm build bit cast failed");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (!(shared_mem_addr = LLVMBuildLoad(
|
if (!(shared_mem_addr =
|
||||||
comp_ctx->builder, shared_mem_addr, "shared_mem_addr"))) {
|
LLVMBuildLoad2(comp_ctx->builder, OPQ_PTR_TYPE,
|
||||||
|
shared_mem_addr, "shared_mem_addr"))) {
|
||||||
aot_set_last_error("llvm build load failed");
|
aot_set_last_error("llvm build load failed");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
/* memories[0]->memory_data */
|
||||||
offset = I32_CONST(offsetof(AOTMemoryInstance, memory_data.ptr));
|
offset = I32_CONST(offsetof(AOTMemoryInstance, memory_data.ptr));
|
||||||
if (!(func_ctx->mem_info[0].mem_base_addr =
|
if (!(func_ctx->mem_info[0].mem_base_addr = LLVMBuildInBoundsGEP2(
|
||||||
LLVMBuildInBoundsGEP(comp_ctx->builder, shared_mem_addr,
|
comp_ctx->builder, INT8_TYPE, shared_mem_addr, &offset, 1,
|
||||||
&offset, 1, "mem_base_addr_offset"))) {
|
"mem_base_addr_offset"))) {
|
||||||
aot_set_last_error("llvm build in bounds gep failed");
|
aot_set_last_error("llvm build in bounds gep failed");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
/* memories[0]->cur_page_count */
|
||||||
offset = I32_CONST(offsetof(AOTMemoryInstance, cur_page_count));
|
offset = I32_CONST(offsetof(AOTMemoryInstance, cur_page_count));
|
||||||
if (!(func_ctx->mem_info[0].mem_cur_page_count_addr =
|
if (!(func_ctx->mem_info[0].mem_cur_page_count_addr =
|
||||||
LLVMBuildInBoundsGEP(comp_ctx->builder, shared_mem_addr,
|
LLVMBuildInBoundsGEP2(comp_ctx->builder, INT8_TYPE,
|
||||||
&offset, 1, "mem_cur_page_offset"))) {
|
shared_mem_addr, &offset, 1,
|
||||||
|
"mem_cur_page_offset"))) {
|
||||||
aot_set_last_error("llvm build in bounds gep failed");
|
aot_set_last_error("llvm build in bounds gep failed");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
/* memories[0]->memory_data_size */
|
||||||
offset = I32_CONST(offsetof(AOTMemoryInstance, memory_data_size));
|
offset = I32_CONST(offsetof(AOTMemoryInstance, memory_data_size));
|
||||||
if (!(func_ctx->mem_info[0].mem_data_size_addr =
|
if (!(func_ctx->mem_info[0].mem_data_size_addr = LLVMBuildInBoundsGEP2(
|
||||||
LLVMBuildInBoundsGEP(comp_ctx->builder, shared_mem_addr,
|
comp_ctx->builder, INT8_TYPE, shared_mem_addr, &offset, 1,
|
||||||
&offset, 1, "mem_data_size_offset"))) {
|
"mem_data_size_offset"))) {
|
||||||
aot_set_last_error("llvm build in bounds gep failed");
|
aot_set_last_error("llvm build in bounds gep failed");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -288,25 +294,26 @@ create_memory_info(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx,
|
||||||
{
|
{
|
||||||
offset = I32_CONST(offsetof(AOTModuleInstance, global_table_data)
|
offset = I32_CONST(offsetof(AOTModuleInstance, global_table_data)
|
||||||
+ offsetof(AOTMemoryInstance, memory_data.ptr));
|
+ offsetof(AOTMemoryInstance, memory_data.ptr));
|
||||||
if (!(func_ctx->mem_info[0].mem_base_addr =
|
if (!(func_ctx->mem_info[0].mem_base_addr = LLVMBuildInBoundsGEP2(
|
||||||
LLVMBuildInBoundsGEP(comp_ctx->builder, func_ctx->aot_inst,
|
comp_ctx->builder, INT8_TYPE, func_ctx->aot_inst, &offset, 1,
|
||||||
&offset, 1, "mem_base_addr_offset"))) {
|
"mem_base_addr_offset"))) {
|
||||||
aot_set_last_error("llvm build in bounds gep failed");
|
aot_set_last_error("llvm build in bounds gep failed");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
offset = I32_CONST(offsetof(AOTModuleInstance, global_table_data)
|
offset = I32_CONST(offsetof(AOTModuleInstance, global_table_data)
|
||||||
+ offsetof(AOTMemoryInstance, cur_page_count));
|
+ offsetof(AOTMemoryInstance, cur_page_count));
|
||||||
if (!(func_ctx->mem_info[0].mem_cur_page_count_addr =
|
if (!(func_ctx->mem_info[0].mem_cur_page_count_addr =
|
||||||
LLVMBuildInBoundsGEP(comp_ctx->builder, func_ctx->aot_inst,
|
LLVMBuildInBoundsGEP2(comp_ctx->builder, INT8_TYPE,
|
||||||
&offset, 1, "mem_cur_page_offset"))) {
|
func_ctx->aot_inst, &offset, 1,
|
||||||
|
"mem_cur_page_offset"))) {
|
||||||
aot_set_last_error("llvm build in bounds gep failed");
|
aot_set_last_error("llvm build in bounds gep failed");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
offset = I32_CONST(offsetof(AOTModuleInstance, global_table_data)
|
offset = I32_CONST(offsetof(AOTModuleInstance, global_table_data)
|
||||||
+ offsetof(AOTMemoryInstance, memory_data_size));
|
+ offsetof(AOTMemoryInstance, memory_data_size));
|
||||||
if (!(func_ctx->mem_info[0].mem_data_size_addr =
|
if (!(func_ctx->mem_info[0].mem_data_size_addr = LLVMBuildInBoundsGEP2(
|
||||||
LLVMBuildInBoundsGEP(comp_ctx->builder, func_ctx->aot_inst,
|
comp_ctx->builder, INT8_TYPE, func_ctx->aot_inst, &offset, 1,
|
||||||
&offset, 1, "mem_data_size_offset"))) {
|
"mem_data_size_offset"))) {
|
||||||
aot_set_last_error("llvm build in bounds gep failed");
|
aot_set_last_error("llvm build in bounds gep failed");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -333,22 +340,22 @@ create_memory_info(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx,
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (mem_space_unchanged) {
|
if (mem_space_unchanged) {
|
||||||
if (!(func_ctx->mem_info[0].mem_base_addr = LLVMBuildLoad(
|
if (!(func_ctx->mem_info[0].mem_base_addr = LLVMBuildLoad2(
|
||||||
comp_ctx->builder, func_ctx->mem_info[0].mem_base_addr,
|
comp_ctx->builder, OPQ_PTR_TYPE,
|
||||||
"mem_base_addr"))) {
|
func_ctx->mem_info[0].mem_base_addr, "mem_base_addr"))) {
|
||||||
aot_set_last_error("llvm build load failed");
|
aot_set_last_error("llvm build load failed");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (!(func_ctx->mem_info[0].mem_cur_page_count_addr =
|
if (!(func_ctx->mem_info[0].mem_cur_page_count_addr =
|
||||||
LLVMBuildLoad(comp_ctx->builder,
|
LLVMBuildLoad2(comp_ctx->builder, I32_TYPE,
|
||||||
func_ctx->mem_info[0].mem_cur_page_count_addr,
|
func_ctx->mem_info[0].mem_cur_page_count_addr,
|
||||||
"mem_cur_page_count"))) {
|
"mem_cur_page_count"))) {
|
||||||
aot_set_last_error("llvm build load failed");
|
aot_set_last_error("llvm build load failed");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (!(func_ctx->mem_info[0].mem_data_size_addr = LLVMBuildLoad(
|
if (!(func_ctx->mem_info[0].mem_data_size_addr = LLVMBuildLoad2(
|
||||||
comp_ctx->builder, func_ctx->mem_info[0].mem_data_size_addr,
|
comp_ctx->builder, I32_TYPE,
|
||||||
"mem_data_size"))) {
|
func_ctx->mem_info[0].mem_data_size_addr, "mem_data_size"))) {
|
||||||
aot_set_last_error("llvm build load failed");
|
aot_set_last_error("llvm build load failed");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -357,9 +364,9 @@ create_memory_info(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx,
|
||||||
else if (is_shared_memory) {
|
else if (is_shared_memory) {
|
||||||
/* The base address for shared memory will never changed,
|
/* The base address for shared memory will never changed,
|
||||||
we can load the value here */
|
we can load the value here */
|
||||||
if (!(func_ctx->mem_info[0].mem_base_addr = LLVMBuildLoad(
|
if (!(func_ctx->mem_info[0].mem_base_addr = LLVMBuildLoad2(
|
||||||
comp_ctx->builder, func_ctx->mem_info[0].mem_base_addr,
|
comp_ctx->builder, OPQ_PTR_TYPE,
|
||||||
"mem_base_addr"))) {
|
func_ctx->mem_info[0].mem_base_addr, "mem_base_addr"))) {
|
||||||
aot_set_last_error("llvm build load failed");
|
aot_set_last_error("llvm build load failed");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -374,8 +381,8 @@ create_memory_info(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx,
|
||||||
offset = I32_CONST(offsetof(AOTMemoryInstance, mem_bound_check_1byte)
|
offset = I32_CONST(offsetof(AOTMemoryInstance, mem_bound_check_1byte)
|
||||||
- offsetof(AOTMemoryInstance, memory_data.ptr));
|
- offsetof(AOTMemoryInstance, memory_data.ptr));
|
||||||
if (!(func_ctx->mem_info[0].mem_bound_check_1byte =
|
if (!(func_ctx->mem_info[0].mem_bound_check_1byte =
|
||||||
LLVMBuildInBoundsGEP(comp_ctx->builder, mem_info_base, &offset, 1,
|
LLVMBuildInBoundsGEP2(comp_ctx->builder, INT8_TYPE, mem_info_base,
|
||||||
"bound_check_1byte_offset"))) {
|
&offset, 1, "bound_check_1byte_offset"))) {
|
||||||
aot_set_last_error("llvm build in bounds gep failed");
|
aot_set_last_error("llvm build in bounds gep failed");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -386,10 +393,12 @@ create_memory_info(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx,
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (mem_space_unchanged) {
|
if (mem_space_unchanged) {
|
||||||
if (!(func_ctx->mem_info[0].mem_bound_check_1byte =
|
if (!(func_ctx->mem_info[0].mem_bound_check_1byte = LLVMBuildLoad2(
|
||||||
LLVMBuildLoad(comp_ctx->builder,
|
comp_ctx->builder,
|
||||||
func_ctx->mem_info[0].mem_bound_check_1byte,
|
(comp_ctx->pointer_size == sizeof(uint64)) ? I64_TYPE
|
||||||
"bound_check_1byte"))) {
|
: I32_TYPE,
|
||||||
|
func_ctx->mem_info[0].mem_bound_check_1byte,
|
||||||
|
"bound_check_1byte"))) {
|
||||||
aot_set_last_error("llvm build load failed");
|
aot_set_last_error("llvm build load failed");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -398,8 +407,8 @@ create_memory_info(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx,
|
||||||
offset = I32_CONST(offsetof(AOTMemoryInstance, mem_bound_check_2bytes)
|
offset = I32_CONST(offsetof(AOTMemoryInstance, mem_bound_check_2bytes)
|
||||||
- offsetof(AOTMemoryInstance, memory_data.ptr));
|
- offsetof(AOTMemoryInstance, memory_data.ptr));
|
||||||
if (!(func_ctx->mem_info[0].mem_bound_check_2bytes =
|
if (!(func_ctx->mem_info[0].mem_bound_check_2bytes =
|
||||||
LLVMBuildInBoundsGEP(comp_ctx->builder, mem_info_base, &offset, 1,
|
LLVMBuildInBoundsGEP2(comp_ctx->builder, INT8_TYPE, mem_info_base,
|
||||||
"bound_check_2bytes_offset"))) {
|
&offset, 1, "bound_check_2bytes_offset"))) {
|
||||||
aot_set_last_error("llvm build in bounds gep failed");
|
aot_set_last_error("llvm build in bounds gep failed");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -410,10 +419,12 @@ create_memory_info(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx,
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (mem_space_unchanged) {
|
if (mem_space_unchanged) {
|
||||||
if (!(func_ctx->mem_info[0].mem_bound_check_2bytes =
|
if (!(func_ctx->mem_info[0].mem_bound_check_2bytes = LLVMBuildLoad2(
|
||||||
LLVMBuildLoad(comp_ctx->builder,
|
comp_ctx->builder,
|
||||||
func_ctx->mem_info[0].mem_bound_check_2bytes,
|
(comp_ctx->pointer_size == sizeof(uint64)) ? I64_TYPE
|
||||||
"bound_check_2bytes"))) {
|
: I32_TYPE,
|
||||||
|
func_ctx->mem_info[0].mem_bound_check_2bytes,
|
||||||
|
"bound_check_2bytes"))) {
|
||||||
aot_set_last_error("llvm build load failed");
|
aot_set_last_error("llvm build load failed");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -422,8 +433,8 @@ create_memory_info(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx,
|
||||||
offset = I32_CONST(offsetof(AOTMemoryInstance, mem_bound_check_4bytes)
|
offset = I32_CONST(offsetof(AOTMemoryInstance, mem_bound_check_4bytes)
|
||||||
- offsetof(AOTMemoryInstance, memory_data.ptr));
|
- offsetof(AOTMemoryInstance, memory_data.ptr));
|
||||||
if (!(func_ctx->mem_info[0].mem_bound_check_4bytes =
|
if (!(func_ctx->mem_info[0].mem_bound_check_4bytes =
|
||||||
LLVMBuildInBoundsGEP(comp_ctx->builder, mem_info_base, &offset, 1,
|
LLVMBuildInBoundsGEP2(comp_ctx->builder, INT8_TYPE, mem_info_base,
|
||||||
"bound_check_4bytes_offset"))) {
|
&offset, 1, "bound_check_4bytes_offset"))) {
|
||||||
aot_set_last_error("llvm build in bounds gep failed");
|
aot_set_last_error("llvm build in bounds gep failed");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -434,10 +445,12 @@ create_memory_info(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx,
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (mem_space_unchanged) {
|
if (mem_space_unchanged) {
|
||||||
if (!(func_ctx->mem_info[0].mem_bound_check_4bytes =
|
if (!(func_ctx->mem_info[0].mem_bound_check_4bytes = LLVMBuildLoad2(
|
||||||
LLVMBuildLoad(comp_ctx->builder,
|
comp_ctx->builder,
|
||||||
func_ctx->mem_info[0].mem_bound_check_4bytes,
|
(comp_ctx->pointer_size == sizeof(uint64)) ? I64_TYPE
|
||||||
"bound_check_4bytes"))) {
|
: I32_TYPE,
|
||||||
|
func_ctx->mem_info[0].mem_bound_check_4bytes,
|
||||||
|
"bound_check_4bytes"))) {
|
||||||
aot_set_last_error("llvm build load failed");
|
aot_set_last_error("llvm build load failed");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -446,8 +459,8 @@ create_memory_info(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx,
|
||||||
offset = I32_CONST(offsetof(AOTMemoryInstance, mem_bound_check_8bytes)
|
offset = I32_CONST(offsetof(AOTMemoryInstance, mem_bound_check_8bytes)
|
||||||
- offsetof(AOTMemoryInstance, memory_data.ptr));
|
- offsetof(AOTMemoryInstance, memory_data.ptr));
|
||||||
if (!(func_ctx->mem_info[0].mem_bound_check_8bytes =
|
if (!(func_ctx->mem_info[0].mem_bound_check_8bytes =
|
||||||
LLVMBuildInBoundsGEP(comp_ctx->builder, mem_info_base, &offset, 1,
|
LLVMBuildInBoundsGEP2(comp_ctx->builder, INT8_TYPE, mem_info_base,
|
||||||
"bound_check_8bytes_offset"))) {
|
&offset, 1, "bound_check_8bytes_offset"))) {
|
||||||
aot_set_last_error("llvm build in bounds gep failed");
|
aot_set_last_error("llvm build in bounds gep failed");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -458,10 +471,12 @@ create_memory_info(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx,
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (mem_space_unchanged) {
|
if (mem_space_unchanged) {
|
||||||
if (!(func_ctx->mem_info[0].mem_bound_check_8bytes =
|
if (!(func_ctx->mem_info[0].mem_bound_check_8bytes = LLVMBuildLoad2(
|
||||||
LLVMBuildLoad(comp_ctx->builder,
|
comp_ctx->builder,
|
||||||
func_ctx->mem_info[0].mem_bound_check_8bytes,
|
(comp_ctx->pointer_size == sizeof(uint64)) ? I64_TYPE
|
||||||
"bound_check_8bytes"))) {
|
: I32_TYPE,
|
||||||
|
func_ctx->mem_info[0].mem_bound_check_8bytes,
|
||||||
|
"bound_check_8bytes"))) {
|
||||||
aot_set_last_error("llvm build load failed");
|
aot_set_last_error("llvm build load failed");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -469,9 +484,9 @@ create_memory_info(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx,
|
||||||
|
|
||||||
offset = I32_CONST(offsetof(AOTMemoryInstance, mem_bound_check_16bytes)
|
offset = I32_CONST(offsetof(AOTMemoryInstance, mem_bound_check_16bytes)
|
||||||
- offsetof(AOTMemoryInstance, memory_data.ptr));
|
- offsetof(AOTMemoryInstance, memory_data.ptr));
|
||||||
if (!(func_ctx->mem_info[0].mem_bound_check_16bytes =
|
if (!(func_ctx->mem_info[0].mem_bound_check_16bytes = LLVMBuildInBoundsGEP2(
|
||||||
LLVMBuildInBoundsGEP(comp_ctx->builder, mem_info_base, &offset, 1,
|
comp_ctx->builder, INT8_TYPE, mem_info_base, &offset, 1,
|
||||||
"bound_check_16bytes_offset"))) {
|
"bound_check_16bytes_offset"))) {
|
||||||
aot_set_last_error("llvm build in bounds gep failed");
|
aot_set_last_error("llvm build in bounds gep failed");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -482,10 +497,12 @@ create_memory_info(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx,
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (mem_space_unchanged) {
|
if (mem_space_unchanged) {
|
||||||
if (!(func_ctx->mem_info[0].mem_bound_check_16bytes =
|
if (!(func_ctx->mem_info[0].mem_bound_check_16bytes = LLVMBuildLoad2(
|
||||||
LLVMBuildLoad(comp_ctx->builder,
|
comp_ctx->builder,
|
||||||
func_ctx->mem_info[0].mem_bound_check_16bytes,
|
(comp_ctx->pointer_size == sizeof(uint64)) ? I64_TYPE
|
||||||
"bound_check_16bytes"))) {
|
: I32_TYPE,
|
||||||
|
func_ctx->mem_info[0].mem_bound_check_16bytes,
|
||||||
|
"bound_check_16bytes"))) {
|
||||||
aot_set_last_error("llvm build load failed");
|
aot_set_last_error("llvm build load failed");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -500,8 +517,9 @@ create_cur_exception(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx)
|
||||||
LLVMValueRef offset;
|
LLVMValueRef offset;
|
||||||
|
|
||||||
offset = I32_CONST(offsetof(AOTModuleInstance, cur_exception));
|
offset = I32_CONST(offsetof(AOTModuleInstance, cur_exception));
|
||||||
func_ctx->cur_exception = LLVMBuildInBoundsGEP(
|
func_ctx->cur_exception =
|
||||||
comp_ctx->builder, func_ctx->aot_inst, &offset, 1, "cur_exception");
|
LLVMBuildInBoundsGEP2(comp_ctx->builder, INT8_TYPE, func_ctx->aot_inst,
|
||||||
|
&offset, 1, "cur_exception");
|
||||||
if (!func_ctx->cur_exception) {
|
if (!func_ctx->cur_exception) {
|
||||||
aot_set_last_error("llvm build in bounds gep failed.");
|
aot_set_last_error("llvm build in bounds gep failed.");
|
||||||
return false;
|
return false;
|
||||||
|
@ -517,8 +535,8 @@ create_func_type_indexes(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx)
|
||||||
|
|
||||||
offset = I32_CONST(offsetof(AOTModuleInstance, func_type_indexes.ptr));
|
offset = I32_CONST(offsetof(AOTModuleInstance, func_type_indexes.ptr));
|
||||||
func_type_indexes_ptr =
|
func_type_indexes_ptr =
|
||||||
LLVMBuildInBoundsGEP(comp_ctx->builder, func_ctx->aot_inst, &offset, 1,
|
LLVMBuildInBoundsGEP2(comp_ctx->builder, INT8_TYPE, func_ctx->aot_inst,
|
||||||
"func_type_indexes_ptr");
|
&offset, 1, "func_type_indexes_ptr");
|
||||||
if (!func_type_indexes_ptr) {
|
if (!func_type_indexes_ptr) {
|
||||||
aot_set_last_error("llvm build add failed.");
|
aot_set_last_error("llvm build add failed.");
|
||||||
return false;
|
return false;
|
||||||
|
@ -537,8 +555,9 @@ create_func_type_indexes(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
func_ctx->func_type_indexes = LLVMBuildLoad(
|
func_ctx->func_type_indexes =
|
||||||
comp_ctx->builder, func_ctx->func_type_indexes, "func_type_indexes");
|
LLVMBuildLoad2(comp_ctx->builder, INT32_PTR_TYPE,
|
||||||
|
func_ctx->func_type_indexes, "func_type_indexes");
|
||||||
if (!func_ctx->func_type_indexes) {
|
if (!func_ctx->func_type_indexes) {
|
||||||
aot_set_last_error("llvm build load failed.");
|
aot_set_last_error("llvm build load failed.");
|
||||||
return false;
|
return false;
|
||||||
|
@ -552,8 +571,9 @@ create_func_ptrs(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx)
|
||||||
LLVMValueRef offset;
|
LLVMValueRef offset;
|
||||||
|
|
||||||
offset = I32_CONST(offsetof(AOTModuleInstance, func_ptrs));
|
offset = I32_CONST(offsetof(AOTModuleInstance, func_ptrs));
|
||||||
func_ctx->func_ptrs = LLVMBuildInBoundsGEP(
|
func_ctx->func_ptrs =
|
||||||
comp_ctx->builder, func_ctx->aot_inst, &offset, 1, "func_ptrs_offset");
|
LLVMBuildInBoundsGEP2(comp_ctx->builder, INT8_TYPE, func_ctx->aot_inst,
|
||||||
|
&offset, 1, "func_ptrs_offset");
|
||||||
if (!func_ctx->func_ptrs) {
|
if (!func_ctx->func_ptrs) {
|
||||||
aot_set_last_error("llvm build in bounds gep failed.");
|
aot_set_last_error("llvm build in bounds gep failed.");
|
||||||
return false;
|
return false;
|
||||||
|
@ -566,8 +586,8 @@ create_func_ptrs(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
func_ctx->func_ptrs =
|
func_ctx->func_ptrs = LLVMBuildLoad2(comp_ctx->builder, OPQ_PTR_TYPE,
|
||||||
LLVMBuildLoad(comp_ctx->builder, func_ctx->func_ptrs, "func_ptrs_ptr");
|
func_ctx->func_ptrs, "func_ptrs_ptr");
|
||||||
if (!func_ctx->func_ptrs) {
|
if (!func_ctx->func_ptrs) {
|
||||||
aot_set_last_error("llvm build load failed.");
|
aot_set_last_error("llvm build load failed.");
|
||||||
return false;
|
return false;
|
||||||
|
@ -648,24 +668,24 @@ aot_create_func_context(AOTCompData *comp_data, AOTCompContext *comp_ctx,
|
||||||
|
|
||||||
/* Get aot inst address, the layout of exec_env is:
|
/* Get aot inst address, the layout of exec_env is:
|
||||||
exec_env->next, exec_env->prev, exec_env->module_inst, and argv_buf */
|
exec_env->next, exec_env->prev, exec_env->module_inst, and argv_buf */
|
||||||
if (!(aot_inst_addr =
|
if (!(aot_inst_addr = LLVMBuildInBoundsGEP2(
|
||||||
LLVMBuildInBoundsGEP(comp_ctx->builder, func_ctx->exec_env,
|
comp_ctx->builder, OPQ_PTR_TYPE, func_ctx->exec_env,
|
||||||
&aot_inst_offset, 1, "aot_inst_addr"))) {
|
&aot_inst_offset, 1, "aot_inst_addr"))) {
|
||||||
aot_set_last_error("llvm build in bounds gep failed");
|
aot_set_last_error("llvm build in bounds gep failed");
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Load aot inst */
|
/* Load aot inst */
|
||||||
if (!(func_ctx->aot_inst =
|
if (!(func_ctx->aot_inst = LLVMBuildLoad2(comp_ctx->builder, OPQ_PTR_TYPE,
|
||||||
LLVMBuildLoad(comp_ctx->builder, aot_inst_addr, "aot_inst"))) {
|
aot_inst_addr, "aot_inst"))) {
|
||||||
aot_set_last_error("llvm build load failed");
|
aot_set_last_error("llvm build load failed");
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Get argv buffer address */
|
/* Get argv buffer address */
|
||||||
if (!(argv_buf_addr =
|
if (!(argv_buf_addr = LLVMBuildInBoundsGEP2(
|
||||||
LLVMBuildInBoundsGEP(comp_ctx->builder, func_ctx->exec_env,
|
comp_ctx->builder, OPQ_PTR_TYPE, func_ctx->exec_env,
|
||||||
&argv_buf_offset, 1, "argv_buf_addr"))) {
|
&argv_buf_offset, 1, "argv_buf_addr"))) {
|
||||||
aot_set_last_error("llvm build in bounds gep failed");
|
aot_set_last_error("llvm build in bounds gep failed");
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
@ -682,30 +702,31 @@ aot_create_func_context(AOTCompData *comp_data, AOTCompContext *comp_ctx,
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(func_ctx->argv_buf =
|
if (!(func_ctx->argv_buf = LLVMBuildLoad2(comp_ctx->builder, INT32_PTR_TYPE,
|
||||||
LLVMBuildLoad(comp_ctx->builder, argv_buf_addr, "argv_buf"))) {
|
argv_buf_addr, "argv_buf"))) {
|
||||||
aot_set_last_error("llvm build load failed");
|
aot_set_last_error("llvm build load failed");
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Get native stack boundary address */
|
/* Get native stack boundary address */
|
||||||
if (!(stack_bound_addr = LLVMBuildInBoundsGEP(
|
if (!(stack_bound_addr = LLVMBuildInBoundsGEP2(
|
||||||
comp_ctx->builder, func_ctx->exec_env, &stack_bound_offset, 1,
|
comp_ctx->builder, OPQ_PTR_TYPE, func_ctx->exec_env,
|
||||||
"stack_bound_addr"))) {
|
&stack_bound_offset, 1, "stack_bound_addr"))) {
|
||||||
aot_set_last_error("llvm build in bounds gep failed");
|
aot_set_last_error("llvm build in bounds gep failed");
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(func_ctx->native_stack_bound = LLVMBuildLoad(
|
if (!(func_ctx->native_stack_bound =
|
||||||
comp_ctx->builder, stack_bound_addr, "native_stack_bound"))) {
|
LLVMBuildLoad2(comp_ctx->builder, OPQ_PTR_TYPE, stack_bound_addr,
|
||||||
|
"native_stack_bound"))) {
|
||||||
aot_set_last_error("llvm build load failed");
|
aot_set_last_error("llvm build load failed");
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Get aux stack boundary address */
|
/* Get aux stack boundary address */
|
||||||
if (!(aux_stack_bound_addr = LLVMBuildInBoundsGEP(
|
if (!(aux_stack_bound_addr = LLVMBuildInBoundsGEP2(
|
||||||
comp_ctx->builder, func_ctx->exec_env, &aux_stack_bound_offset, 1,
|
comp_ctx->builder, OPQ_PTR_TYPE, func_ctx->exec_env,
|
||||||
"aux_stack_bound_addr"))) {
|
&aux_stack_bound_offset, 1, "aux_stack_bound_addr"))) {
|
||||||
aot_set_last_error("llvm build in bounds gep failed");
|
aot_set_last_error("llvm build in bounds gep failed");
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
@ -717,16 +738,17 @@ aot_create_func_context(AOTCompData *comp_data, AOTCompContext *comp_ctx,
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(func_ctx->aux_stack_bound = LLVMBuildLoad(
|
if (!(func_ctx->aux_stack_bound =
|
||||||
comp_ctx->builder, aux_stack_bound_addr, "aux_stack_bound"))) {
|
LLVMBuildLoad2(comp_ctx->builder, I32_TYPE, aux_stack_bound_addr,
|
||||||
|
"aux_stack_bound"))) {
|
||||||
aot_set_last_error("llvm build load failed");
|
aot_set_last_error("llvm build load failed");
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Get aux stack bottom address */
|
/* Get aux stack bottom address */
|
||||||
if (!(aux_stack_bottom_addr = LLVMBuildInBoundsGEP(
|
if (!(aux_stack_bottom_addr = LLVMBuildInBoundsGEP2(
|
||||||
comp_ctx->builder, func_ctx->exec_env, &aux_stack_bottom_offset,
|
comp_ctx->builder, OPQ_PTR_TYPE, func_ctx->exec_env,
|
||||||
1, "aux_stack_bottom_addr"))) {
|
&aux_stack_bottom_offset, 1, "aux_stack_bottom_addr"))) {
|
||||||
aot_set_last_error("llvm build in bounds gep failed");
|
aot_set_last_error("llvm build in bounds gep failed");
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
@ -737,21 +759,23 @@ aot_create_func_context(AOTCompData *comp_data, AOTCompContext *comp_ctx,
|
||||||
aot_set_last_error("llvm build bit cast failed");
|
aot_set_last_error("llvm build bit cast failed");
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
if (!(func_ctx->aux_stack_bottom = LLVMBuildLoad(
|
if (!(func_ctx->aux_stack_bottom =
|
||||||
comp_ctx->builder, aux_stack_bottom_addr, "aux_stack_bottom"))) {
|
LLVMBuildLoad2(comp_ctx->builder, I32_TYPE, aux_stack_bottom_addr,
|
||||||
|
"aux_stack_bottom"))) {
|
||||||
aot_set_last_error("llvm build load failed");
|
aot_set_last_error("llvm build load failed");
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(native_symbol_addr = LLVMBuildInBoundsGEP(
|
if (!(native_symbol_addr = LLVMBuildInBoundsGEP2(
|
||||||
comp_ctx->builder, func_ctx->exec_env, &native_symbol_offset, 1,
|
comp_ctx->builder, OPQ_PTR_TYPE, func_ctx->exec_env,
|
||||||
"native_symbol_addr"))) {
|
&native_symbol_offset, 1, "native_symbol_addr"))) {
|
||||||
aot_set_last_error("llvm build in bounds gep failed");
|
aot_set_last_error("llvm build in bounds gep failed");
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(func_ctx->native_symbol = LLVMBuildLoad(
|
if (!(func_ctx->native_symbol =
|
||||||
comp_ctx->builder, native_symbol_addr, "native_symbol_tmp"))) {
|
LLVMBuildLoad2(comp_ctx->builder, OPQ_PTR_TYPE,
|
||||||
|
native_symbol_addr, "native_symbol_tmp"))) {
|
||||||
aot_set_last_error("llvm build bit cast failed");
|
aot_set_last_error("llvm build bit cast failed");
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
@ -2581,9 +2605,14 @@ __call_llvm_intrinsic(const AOTCompContext *comp_ctx,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if LLVM_VERSION_MAJOR >= 14
|
||||||
|
func_type =
|
||||||
|
LLVMFunctionType(ret_type, param_types, (uint32)param_count, false);
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Call the LLVM intrinsic function */
|
/* Call the LLVM intrinsic function */
|
||||||
if (!(ret = LLVMBuildCall(comp_ctx->builder, func, param_values,
|
if (!(ret = LLVMBuildCall2(comp_ctx->builder, func_type, func, param_values,
|
||||||
(uint32)param_count, "call"))) {
|
(uint32)param_count, "call"))) {
|
||||||
aot_set_last_error("llvm build intrinsic call failed.");
|
aot_set_last_error("llvm build intrinsic call failed.");
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
@ -2666,13 +2695,15 @@ aot_get_func_from_table(const AOTCompContext *comp_ctx, LLVMValueRef base,
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(func_addr = LLVMBuildInBoundsGEP(comp_ctx->builder, base, &func_addr,
|
if (!(func_addr =
|
||||||
1, "func_addr"))) {
|
LLVMBuildInBoundsGEP2(comp_ctx->builder, OPQ_PTR_TYPE, base,
|
||||||
|
&func_addr, 1, "func_addr"))) {
|
||||||
aot_set_last_error("get function addr by index failed.");
|
aot_set_last_error("get function addr by index failed.");
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
func = LLVMBuildLoad(comp_ctx->builder, func_addr, "func_tmp");
|
func =
|
||||||
|
LLVMBuildLoad2(comp_ctx->builder, OPQ_PTR_TYPE, func_addr, "func_tmp");
|
||||||
|
|
||||||
if (func == NULL) {
|
if (func == NULL) {
|
||||||
aot_set_last_error("get function pointer failed.");
|
aot_set_last_error("get function pointer failed.");
|
||||||
|
@ -2695,7 +2726,7 @@ aot_load_const_from_table(AOTCompContext *comp_ctx, LLVMValueRef base,
|
||||||
const WASMValue *value, uint8 value_type)
|
const WASMValue *value, uint8 value_type)
|
||||||
{
|
{
|
||||||
LLVMValueRef const_index, const_addr, const_value;
|
LLVMValueRef const_index, const_addr, const_value;
|
||||||
LLVMTypeRef const_ptr_type;
|
LLVMTypeRef const_ptr_type, const_type;
|
||||||
char buf[128] = { 0 };
|
char buf[128] = { 0 };
|
||||||
int32 index;
|
int32 index;
|
||||||
|
|
||||||
|
@ -2704,11 +2735,13 @@ aot_load_const_from_table(AOTCompContext *comp_ctx, LLVMValueRef base,
|
||||||
/* Store the raw int bits of f32 const as a hex string */
|
/* Store the raw int bits of f32 const as a hex string */
|
||||||
snprintf(buf, sizeof(buf), "f32#%08" PRIX32, value->i32);
|
snprintf(buf, sizeof(buf), "f32#%08" PRIX32, value->i32);
|
||||||
const_ptr_type = F32_PTR_TYPE;
|
const_ptr_type = F32_PTR_TYPE;
|
||||||
|
const_type = F32_TYPE;
|
||||||
break;
|
break;
|
||||||
case VALUE_TYPE_F64:
|
case VALUE_TYPE_F64:
|
||||||
/* Store the raw int bits of f64 const as a hex string */
|
/* Store the raw int bits of f64 const as a hex string */
|
||||||
snprintf(buf, sizeof(buf), "f64#%016" PRIX64, value->i64);
|
snprintf(buf, sizeof(buf), "f64#%016" PRIX64, value->i64);
|
||||||
const_ptr_type = F64_PTR_TYPE;
|
const_ptr_type = F64_PTR_TYPE;
|
||||||
|
const_type = F64_TYPE;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
bh_assert(0);
|
bh_assert(0);
|
||||||
|
@ -2727,8 +2760,9 @@ aot_load_const_from_table(AOTCompContext *comp_ctx, LLVMValueRef base,
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(const_addr = LLVMBuildInBoundsGEP(
|
if (!(const_addr =
|
||||||
comp_ctx->builder, base, &const_index, 1, "const_addr_tmp"))) {
|
LLVMBuildInBoundsGEP2(comp_ctx->builder, OPQ_PTR_TYPE, base,
|
||||||
|
&const_index, 1, "const_addr_tmp"))) {
|
||||||
aot_set_last_error("get const addr by index failed.");
|
aot_set_last_error("get const addr by index failed.");
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
@ -2739,11 +2773,12 @@ aot_load_const_from_table(AOTCompContext *comp_ctx, LLVMValueRef base,
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(const_value =
|
if (!(const_value = LLVMBuildLoad2(comp_ctx->builder, const_type,
|
||||||
LLVMBuildLoad(comp_ctx->builder, const_addr, "const_value"))) {
|
const_addr, "const_value"))) {
|
||||||
aot_set_last_error("load const failed.");
|
aot_set_last_error("load const failed.");
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
(void)const_type;
|
||||||
return const_value;
|
return const_value;
|
||||||
}
|
}
|
||||||
|
|
|
@ -38,6 +38,20 @@
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if LLVM_VERSION_MAJOR < 14
|
||||||
|
#define LLVMBuildLoad2(builder, type, value, name) \
|
||||||
|
LLVMBuildLoad(builder, value, name)
|
||||||
|
|
||||||
|
#define LLVMBuildCall2(builder, type, func, args, num_args, name) \
|
||||||
|
LLVMBuildCall(builder, func, args, num_args, name)
|
||||||
|
|
||||||
|
#define LLVMBuildInBoundsGEP2(builder, type, ptr, indices, num_indices, name) \
|
||||||
|
LLVMBuildInBoundsGEP(builder, ptr, indices, num_indices, name)
|
||||||
|
#else
|
||||||
|
/* Opaque pointer type */
|
||||||
|
#define OPQ_PTR_TYPE INT8_PTR_TYPE
|
||||||
|
#endif
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Value in the WASM operation stack, each stack element
|
* Value in the WASM operation stack, each stack element
|
||||||
* is an LLVM value
|
* is an LLVM value
|
||||||
|
|
|
@ -492,7 +492,11 @@ aot_apply_llvm_new_pass_manager(AOTCompContext *comp_ctx)
|
||||||
|
|
||||||
if (!disable_llvm_lto) {
|
if (!disable_llvm_lto) {
|
||||||
/* Apply LTO for AOT mode */
|
/* Apply LTO for AOT mode */
|
||||||
|
#if LLVM_VERSION_MAJOR < 14
|
||||||
MPM.addPass(PB.buildLTODefaultPipeline(OL, NULL));
|
MPM.addPass(PB.buildLTODefaultPipeline(OL, NULL));
|
||||||
|
#else
|
||||||
|
MPM.addPass(PB.buildLTOPreLinkDefaultPipeline(OL));
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
MPM.addPass(PB.buildPerModuleDefaultPipeline(OL));
|
MPM.addPass(PB.buildPerModuleDefaultPipeline(OL));
|
||||||
|
|
|
@ -13,7 +13,8 @@
|
||||||
/* data_length in bytes */
|
/* data_length in bytes */
|
||||||
static LLVMValueRef
|
static LLVMValueRef
|
||||||
simd_load(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx, uint32 align,
|
simd_load(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx, uint32 align,
|
||||||
uint32 offset, uint32 data_length, LLVMTypeRef ptr_type)
|
uint32 offset, uint32 data_length, LLVMTypeRef ptr_type,
|
||||||
|
LLVMTypeRef data_type)
|
||||||
{
|
{
|
||||||
LLVMValueRef maddr, data;
|
LLVMValueRef maddr, data;
|
||||||
|
|
||||||
|
@ -29,7 +30,7 @@ simd_load(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx, uint32 align,
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(data = LLVMBuildLoad(comp_ctx->builder, maddr, "data"))) {
|
if (!(data = LLVMBuildLoad2(comp_ctx->builder, data_type, maddr, "data"))) {
|
||||||
HANDLE_FAILURE("LLVMBuildLoad");
|
HANDLE_FAILURE("LLVMBuildLoad");
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
@ -46,7 +47,7 @@ aot_compile_simd_v128_load(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx,
|
||||||
LLVMValueRef result;
|
LLVMValueRef result;
|
||||||
|
|
||||||
if (!(result = simd_load(comp_ctx, func_ctx, align, offset, 16,
|
if (!(result = simd_load(comp_ctx, func_ctx, align, offset, 16,
|
||||||
V128_PTR_TYPE))) {
|
V128_PTR_TYPE, V128_TYPE))) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -73,7 +74,7 @@ aot_compile_simd_load_extend(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx,
|
||||||
LLVMVectorType(INT16_TYPE, 4), LLVMVectorType(INT16_TYPE, 4),
|
LLVMVectorType(INT16_TYPE, 4), LLVMVectorType(INT16_TYPE, 4),
|
||||||
LLVMVectorType(I32_TYPE, 2), LLVMVectorType(I32_TYPE, 2),
|
LLVMVectorType(I32_TYPE, 2), LLVMVectorType(I32_TYPE, 2),
|
||||||
};
|
};
|
||||||
LLVMTypeRef sub_vector_type;
|
LLVMTypeRef sub_vector_type, sub_vector_ptr_type;
|
||||||
|
|
||||||
bh_assert(opcode_index < 6);
|
bh_assert(opcode_index < 6);
|
||||||
|
|
||||||
|
@ -81,13 +82,13 @@ aot_compile_simd_load_extend(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx,
|
||||||
|
|
||||||
/* to vector ptr type */
|
/* to vector ptr type */
|
||||||
if (!sub_vector_type
|
if (!sub_vector_type
|
||||||
|| !(sub_vector_type = LLVMPointerType(sub_vector_type, 0))) {
|
|| !(sub_vector_ptr_type = LLVMPointerType(sub_vector_type, 0))) {
|
||||||
HANDLE_FAILURE("LLVMPointerType");
|
HANDLE_FAILURE("LLVMPointerType");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(sub_vector = simd_load(comp_ctx, func_ctx, align, offset, 8,
|
if (!(sub_vector = simd_load(comp_ctx, func_ctx, align, offset, 8,
|
||||||
sub_vector_type))) {
|
sub_vector_ptr_type, sub_vector_type))) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -117,6 +118,8 @@ aot_compile_simd_load_splat(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx,
|
||||||
LLVMValueRef element, result;
|
LLVMValueRef element, result;
|
||||||
LLVMTypeRef element_ptr_types[] = { INT8_PTR_TYPE, INT16_PTR_TYPE,
|
LLVMTypeRef element_ptr_types[] = { INT8_PTR_TYPE, INT16_PTR_TYPE,
|
||||||
INT32_PTR_TYPE, INT64_PTR_TYPE };
|
INT32_PTR_TYPE, INT64_PTR_TYPE };
|
||||||
|
LLVMTypeRef element_data_types[] = { INT8_TYPE, INT16_TYPE, I32_TYPE,
|
||||||
|
I64_TYPE };
|
||||||
uint32 data_lengths[] = { 1, 2, 4, 8 };
|
uint32 data_lengths[] = { 1, 2, 4, 8 };
|
||||||
LLVMValueRef undefs[] = {
|
LLVMValueRef undefs[] = {
|
||||||
LLVM_CONST(i8x16_undef),
|
LLVM_CONST(i8x16_undef),
|
||||||
|
@ -135,7 +138,8 @@ aot_compile_simd_load_splat(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx,
|
||||||
|
|
||||||
if (!(element = simd_load(comp_ctx, func_ctx, align, offset,
|
if (!(element = simd_load(comp_ctx, func_ctx, align, offset,
|
||||||
data_lengths[opcode_index],
|
data_lengths[opcode_index],
|
||||||
element_ptr_types[opcode_index]))) {
|
element_ptr_types[opcode_index],
|
||||||
|
element_data_types[opcode_index]))) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -166,6 +170,8 @@ aot_compile_simd_load_lane(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx,
|
||||||
uint32 data_lengths[] = { 1, 2, 4, 8 };
|
uint32 data_lengths[] = { 1, 2, 4, 8 };
|
||||||
LLVMTypeRef element_ptr_types[] = { INT8_PTR_TYPE, INT16_PTR_TYPE,
|
LLVMTypeRef element_ptr_types[] = { INT8_PTR_TYPE, INT16_PTR_TYPE,
|
||||||
INT32_PTR_TYPE, INT64_PTR_TYPE };
|
INT32_PTR_TYPE, INT64_PTR_TYPE };
|
||||||
|
LLVMTypeRef element_data_types[] = { INT8_TYPE, INT16_TYPE, I32_TYPE,
|
||||||
|
I64_TYPE };
|
||||||
LLVMTypeRef vector_types[] = { V128_i8x16_TYPE, V128_i16x8_TYPE,
|
LLVMTypeRef vector_types[] = { V128_i8x16_TYPE, V128_i16x8_TYPE,
|
||||||
V128_i32x4_TYPE, V128_i64x2_TYPE };
|
V128_i32x4_TYPE, V128_i64x2_TYPE };
|
||||||
LLVMValueRef lane = simd_lane_id_to_llvm_value(comp_ctx, lane_id);
|
LLVMValueRef lane = simd_lane_id_to_llvm_value(comp_ctx, lane_id);
|
||||||
|
@ -179,7 +185,8 @@ aot_compile_simd_load_lane(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx,
|
||||||
|
|
||||||
if (!(element = simd_load(comp_ctx, func_ctx, align, offset,
|
if (!(element = simd_load(comp_ctx, func_ctx, align, offset,
|
||||||
data_lengths[opcode_index],
|
data_lengths[opcode_index],
|
||||||
element_ptr_types[opcode_index]))) {
|
element_ptr_types[opcode_index],
|
||||||
|
element_data_types[opcode_index]))) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -200,6 +207,7 @@ aot_compile_simd_load_zero(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx,
|
||||||
uint32 opcode_index = opcode - SIMD_v128_load32_zero;
|
uint32 opcode_index = opcode - SIMD_v128_load32_zero;
|
||||||
uint32 data_lengths[] = { 4, 8 };
|
uint32 data_lengths[] = { 4, 8 };
|
||||||
LLVMTypeRef element_ptr_types[] = { INT32_PTR_TYPE, INT64_PTR_TYPE };
|
LLVMTypeRef element_ptr_types[] = { INT32_PTR_TYPE, INT64_PTR_TYPE };
|
||||||
|
LLVMTypeRef element_data_types[] = { I32_TYPE, I64_TYPE };
|
||||||
LLVMValueRef zero[] = {
|
LLVMValueRef zero[] = {
|
||||||
LLVM_CONST(i32x4_vec_zero),
|
LLVM_CONST(i32x4_vec_zero),
|
||||||
LLVM_CONST(i64x2_vec_zero),
|
LLVM_CONST(i64x2_vec_zero),
|
||||||
|
@ -219,7 +227,8 @@ aot_compile_simd_load_zero(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx,
|
||||||
|
|
||||||
if (!(element = simd_load(comp_ctx, func_ctx, align, offset,
|
if (!(element = simd_load(comp_ctx, func_ctx, align, offset,
|
||||||
data_lengths[opcode_index],
|
data_lengths[opcode_index],
|
||||||
element_ptr_types[opcode_index]))) {
|
element_ptr_types[opcode_index],
|
||||||
|
element_data_types[opcode_index]))) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -919,6 +919,7 @@ wasm_runtime_get_function_attachment(wasm_exec_env_t exec_env);
|
||||||
*/
|
*/
|
||||||
WASM_RUNTIME_API_EXTERN void
|
WASM_RUNTIME_API_EXTERN void
|
||||||
wasm_runtime_set_user_data(wasm_exec_env_t exec_env, void *user_data);
|
wasm_runtime_set_user_data(wasm_exec_env_t exec_env, void *user_data);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the user data within execution environment.
|
* Get the user data within execution environment.
|
||||||
*
|
*
|
||||||
|
@ -963,7 +964,7 @@ WASM_RUNTIME_API_EXTERN void
|
||||||
wasm_runtime_set_max_thread_num(uint32_t num);
|
wasm_runtime_set_max_thread_num(uint32_t num);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* spawn a new exec_env, the spawned exec_env
|
* Spawn a new exec_env, the spawned exec_env
|
||||||
* can be used in other threads
|
* can be used in other threads
|
||||||
*
|
*
|
||||||
* @param num the original exec_env
|
* @param num the original exec_env
|
||||||
|
@ -982,7 +983,7 @@ WASM_RUNTIME_API_EXTERN void
|
||||||
wasm_runtime_destroy_spawned_exec_env(wasm_exec_env_t exec_env);
|
wasm_runtime_destroy_spawned_exec_env(wasm_exec_env_t exec_env);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* spawn a thread from the given exec_env
|
* Spawn a thread from the given exec_env
|
||||||
*
|
*
|
||||||
* @param exec_env the original exec_env
|
* @param exec_env the original exec_env
|
||||||
* @param tid thread id to be returned to the caller
|
* @param tid thread id to be returned to the caller
|
||||||
|
@ -996,7 +997,7 @@ wasm_runtime_spawn_thread(wasm_exec_env_t exec_env, wasm_thread_t *tid,
|
||||||
wasm_thread_callback_t callback, void *arg);
|
wasm_thread_callback_t callback, void *arg);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* waits a spawned thread to terminate
|
* Waits a spawned thread to terminate
|
||||||
*
|
*
|
||||||
* @param tid thread id
|
* @param tid thread id
|
||||||
* @param retval if not NULL, output the return value of the thread
|
* @param retval if not NULL, output the return value of the thread
|
||||||
|
@ -1046,13 +1047,41 @@ WASM_RUNTIME_API_EXTERN bool
|
||||||
wasm_externref_retain(uint32_t externref_idx);
|
wasm_externref_retain(uint32_t externref_idx);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* dump the call stack
|
* Dump the call stack to stdout
|
||||||
*
|
*
|
||||||
* @param exec_env the execution environment
|
* @param exec_env the execution environment
|
||||||
*/
|
*/
|
||||||
WASM_RUNTIME_API_EXTERN void
|
WASM_RUNTIME_API_EXTERN void
|
||||||
wasm_runtime_dump_call_stack(wasm_exec_env_t exec_env);
|
wasm_runtime_dump_call_stack(wasm_exec_env_t exec_env);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the size required to store the call stack contents, including
|
||||||
|
* the space for terminating null byte ('\0')
|
||||||
|
*
|
||||||
|
* @param exec_env the execution environment
|
||||||
|
*
|
||||||
|
* @return size required to store the contents, 0 means error
|
||||||
|
*/
|
||||||
|
WASM_RUNTIME_API_EXTERN uint32_t
|
||||||
|
wasm_runtime_get_call_stack_buf_size(wasm_exec_env_t exec_env);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Dump the call stack to buffer.
|
||||||
|
*
|
||||||
|
* @note this function is not thread-safe, please only use this API
|
||||||
|
* when the exec_env is not executing
|
||||||
|
*
|
||||||
|
* @param exec_env the execution environment
|
||||||
|
* @param buf buffer to store the dumped content
|
||||||
|
* @param len length of the buffer
|
||||||
|
*
|
||||||
|
* @return bytes dumped to the buffer, including the terminating null
|
||||||
|
* byte ('\0'), 0 means error and data in buf may be invalid
|
||||||
|
*/
|
||||||
|
WASM_RUNTIME_API_EXTERN uint32_t
|
||||||
|
wasm_runtime_dump_call_stack_to_buf(wasm_exec_env_t exec_env, char *buf,
|
||||||
|
uint32_t len);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get a custom section by name
|
* Get a custom section by name
|
||||||
*
|
*
|
||||||
|
|
|
@ -3862,7 +3862,9 @@ wasm_interp_call_wasm(WASMModuleInstance *module_inst, WASMExecEnv *exec_env,
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
#if WASM_ENABLE_DUMP_CALL_STACK != 0
|
#if WASM_ENABLE_DUMP_CALL_STACK != 0
|
||||||
wasm_interp_dump_call_stack(exec_env);
|
if (wasm_interp_create_call_stack(exec_env)) {
|
||||||
|
wasm_interp_dump_call_stack(exec_env, true, NULL, 0);
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
LOG_DEBUG("meet an exception %s", wasm_get_exception(module_inst));
|
LOG_DEBUG("meet an exception %s", wasm_get_exception(module_inst));
|
||||||
}
|
}
|
||||||
|
|
|
@ -3847,7 +3847,9 @@ wasm_interp_call_wasm(WASMModuleInstance *module_inst, WASMExecEnv *exec_env,
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
#if WASM_ENABLE_DUMP_CALL_STACK != 0
|
#if WASM_ENABLE_DUMP_CALL_STACK != 0
|
||||||
wasm_interp_dump_call_stack(exec_env);
|
if (wasm_interp_create_call_stack(exec_env)) {
|
||||||
|
wasm_interp_dump_call_stack(exec_env, true, NULL, 0);
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -2175,6 +2175,15 @@ load_export_section(const uint8 *buf, const uint8 *buf_end, WASMModule *module,
|
||||||
|
|
||||||
export = module->exports;
|
export = module->exports;
|
||||||
for (i = 0; i < export_count; i++, export ++) {
|
for (i = 0; i < export_count; i++, export ++) {
|
||||||
|
#if WASM_ENABLE_THREAD_MGR == 0
|
||||||
|
if (p == p_end) {
|
||||||
|
/* export section with inconsistent count:
|
||||||
|
n export declared, but less than n given */
|
||||||
|
set_error_buf(error_buf, error_buf_size,
|
||||||
|
"length out of bounds");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
read_leb_uint32(p, p_end, str_len);
|
read_leb_uint32(p, p_end, str_len);
|
||||||
CHECK_BUF(p, p_end, str_len);
|
CHECK_BUF(p, p_end, str_len);
|
||||||
|
|
||||||
|
@ -9370,8 +9379,15 @@ re_scan:
|
||||||
}
|
}
|
||||||
|
|
||||||
if (loader_ctx->csp_num > 0) {
|
if (loader_ctx->csp_num > 0) {
|
||||||
set_error_buf(error_buf, error_buf_size,
|
if (cur_func_idx < module->function_count - 1)
|
||||||
"function body must end with END opcode");
|
/* Function with missing end marker (between two functions) */
|
||||||
|
set_error_buf(error_buf, error_buf_size, "END opcode expected");
|
||||||
|
else
|
||||||
|
/* Function with missing end marker
|
||||||
|
(at EOF or end of code sections) */
|
||||||
|
set_error_buf(error_buf, error_buf_size,
|
||||||
|
"unexpected end of section or function, "
|
||||||
|
"or section size mismatch");
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1509,8 +1509,8 @@ wasm_instantiate(WASMModule *module, bool is_sub_inst, uint32 stack_size,
|
||||||
if (stack_size == 0)
|
if (stack_size == 0)
|
||||||
stack_size = DEFAULT_WASM_STACK_SIZE;
|
stack_size = DEFAULT_WASM_STACK_SIZE;
|
||||||
#if WASM_ENABLE_SPEC_TEST != 0
|
#if WASM_ENABLE_SPEC_TEST != 0
|
||||||
if (stack_size < 64 * 1024)
|
if (stack_size < 128 * 1024)
|
||||||
stack_size = 64 * 1024;
|
stack_size = 128 * 1024;
|
||||||
#endif
|
#endif
|
||||||
module_inst->default_wasm_stack_size = stack_size;
|
module_inst->default_wasm_stack_size = stack_size;
|
||||||
|
|
||||||
|
@ -2551,8 +2551,8 @@ wasm_get_module_inst_mem_consumption(const WASMModuleInstance *module_inst,
|
||||||
|| (WASM_ENABLE_MEMORY_TRACING != 0) */
|
|| (WASM_ENABLE_MEMORY_TRACING != 0) */
|
||||||
|
|
||||||
#if WASM_ENABLE_DUMP_CALL_STACK != 0
|
#if WASM_ENABLE_DUMP_CALL_STACK != 0
|
||||||
void
|
bool
|
||||||
wasm_interp_dump_call_stack(struct WASMExecEnv *exec_env)
|
wasm_interp_create_call_stack(struct WASMExecEnv *exec_env)
|
||||||
{
|
{
|
||||||
WASMModuleInstance *module_inst =
|
WASMModuleInstance *module_inst =
|
||||||
(WASMModuleInstance *)wasm_exec_env_get_module_inst(exec_env);
|
(WASMModuleInstance *)wasm_exec_env_get_module_inst(exec_env);
|
||||||
|
@ -2573,12 +2573,12 @@ wasm_interp_dump_call_stack(struct WASMExecEnv *exec_env)
|
||||||
if (!bh_vector_destroy(module_inst->frames)
|
if (!bh_vector_destroy(module_inst->frames)
|
||||||
|| !bh_vector_init(module_inst->frames, n, sizeof(WASMCApiFrame),
|
|| !bh_vector_init(module_inst->frames, n, sizeof(WASMCApiFrame),
|
||||||
false)) {
|
false)) {
|
||||||
return;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
cur_frame = first_frame;
|
cur_frame = first_frame;
|
||||||
n = 0;
|
n = 0;
|
||||||
os_printf("\n");
|
|
||||||
while (cur_frame) {
|
while (cur_frame) {
|
||||||
WASMCApiFrame frame = { 0 };
|
WASMCApiFrame frame = { 0 };
|
||||||
WASMFunctionInstance *func_inst = cur_frame->function;
|
WASMFunctionInstance *func_inst = cur_frame->function;
|
||||||
|
@ -2626,20 +2626,86 @@ wasm_interp_dump_call_stack(struct WASMExecEnv *exec_env)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* function name not exported, print number instead */
|
frame.func_name_wp = func_name;
|
||||||
if (func_name == NULL) {
|
|
||||||
os_printf("#%02d $f%d \n", n, func_inst - module_inst->functions);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
os_printf("#%02d %s \n", n, func_name);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* keep print */
|
if (!bh_vector_append(module_inst->frames, &frame)) {
|
||||||
bh_vector_append(module_inst->frames, &frame);
|
bh_vector_destroy(module_inst->frames);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
cur_frame = cur_frame->prev_frame;
|
cur_frame = cur_frame->prev_frame;
|
||||||
n++;
|
n++;
|
||||||
}
|
}
|
||||||
os_printf("\n");
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
#define PRINT_OR_DUMP() \
|
||||||
|
do { \
|
||||||
|
total_len += \
|
||||||
|
wasm_runtime_dump_line_buf_impl(line_buf, print, &buf, &len); \
|
||||||
|
if ((!print) && buf && (len == 0)) { \
|
||||||
|
return total_len; \
|
||||||
|
} \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
uint32
|
||||||
|
wasm_interp_dump_call_stack(struct WASMExecEnv *exec_env, bool print, char *buf,
|
||||||
|
uint32 len)
|
||||||
|
{
|
||||||
|
WASMModuleInstance *module_inst =
|
||||||
|
(WASMModuleInstance *)wasm_exec_env_get_module_inst(exec_env);
|
||||||
|
uint32 n = 0, total_len = 0, total_frames;
|
||||||
|
/* reserve 256 bytes for line buffer, any line longer than 256 bytes
|
||||||
|
* will be truncated */
|
||||||
|
char line_buf[256];
|
||||||
|
|
||||||
|
if (!module_inst->frames) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
total_frames = bh_vector_size(module_inst->frames);
|
||||||
|
if (total_frames == 0) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
snprintf(line_buf, sizeof(line_buf), "\n");
|
||||||
|
PRINT_OR_DUMP();
|
||||||
|
|
||||||
|
while (n < total_frames) {
|
||||||
|
WASMCApiFrame frame = { 0 };
|
||||||
|
uint32 line_length, i;
|
||||||
|
|
||||||
|
if (!bh_vector_get(module_inst->frames, n, &frame)) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* function name not exported, print number instead */
|
||||||
|
if (frame.func_name_wp == NULL) {
|
||||||
|
line_length = snprintf(line_buf, sizeof(line_buf), "#%02d $f%d\n",
|
||||||
|
n, frame.func_index);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
line_length = snprintf(line_buf, sizeof(line_buf), "#%02d %s\n", n,
|
||||||
|
frame.func_name_wp);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (line_length >= sizeof(line_buf)) {
|
||||||
|
uint32 line_buffer_len = sizeof(line_buf);
|
||||||
|
/* If line too long, ensure the last character is '\n' */
|
||||||
|
for (i = line_buffer_len - 5; i < line_buffer_len - 2; i++) {
|
||||||
|
line_buf[i] = '.';
|
||||||
|
}
|
||||||
|
line_buf[line_buffer_len - 2] = '\n';
|
||||||
|
}
|
||||||
|
|
||||||
|
PRINT_OR_DUMP();
|
||||||
|
|
||||||
|
n++;
|
||||||
|
}
|
||||||
|
snprintf(line_buf, sizeof(line_buf), "\n");
|
||||||
|
PRINT_OR_DUMP();
|
||||||
|
|
||||||
|
return total_len + 1;
|
||||||
}
|
}
|
||||||
#endif /* end of WASM_ENABLE_DUMP_CALL_STACK */
|
#endif /* end of WASM_ENABLE_DUMP_CALL_STACK */
|
||||||
|
|
|
@ -454,8 +454,25 @@ wasm_get_table_inst(const WASMModuleInstance *module_inst, const uint32 tbl_idx)
|
||||||
}
|
}
|
||||||
|
|
||||||
#if WASM_ENABLE_DUMP_CALL_STACK != 0
|
#if WASM_ENABLE_DUMP_CALL_STACK != 0
|
||||||
void
|
bool
|
||||||
wasm_interp_dump_call_stack(struct WASMExecEnv *exec_env);
|
wasm_interp_create_call_stack(struct WASMExecEnv *exec_env);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Dump wasm call stack or get the size
|
||||||
|
*
|
||||||
|
* @param exec_env the execution environment
|
||||||
|
* @param print whether to print to stdout or not
|
||||||
|
* @param buf buffer to store the dumped content
|
||||||
|
* @param len length of the buffer
|
||||||
|
*
|
||||||
|
* @return when print is true, return the bytes printed out to stdout; when
|
||||||
|
* print is false and buf is NULL, return the size required to store the
|
||||||
|
* callstack content; when print is false and buf is not NULL, return the size
|
||||||
|
* dumped to the buffer, 0 means error and data in buf may be invalid
|
||||||
|
*/
|
||||||
|
uint32
|
||||||
|
wasm_interp_dump_call_stack(struct WASMExecEnv *exec_env, bool print, char *buf,
|
||||||
|
uint32 len);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
const uint8 *
|
const uint8 *
|
||||||
|
|
|
@ -51,11 +51,17 @@
|
||||||
#define CONFIG_HAS_FDATASYNC 0
|
#define CONFIG_HAS_FDATASYNC 0
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* For NuttX, CONFIG_HAS_ISATTY is provided by its platform header.
|
||||||
|
* (platform_internal.h)
|
||||||
|
*/
|
||||||
|
#ifndef __NuttX__
|
||||||
#ifndef __CloudABI__
|
#ifndef __CloudABI__
|
||||||
#define CONFIG_HAS_ISATTY 1
|
#define CONFIG_HAS_ISATTY 1
|
||||||
#else
|
#else
|
||||||
#define CONFIG_HAS_ISATTY 0
|
#define CONFIG_HAS_ISATTY 0
|
||||||
#endif
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifndef __APPLE__
|
#ifndef __APPLE__
|
||||||
#define CONFIG_HAS_POSIX_FALLOCATE 1
|
#define CONFIG_HAS_POSIX_FALLOCATE 1
|
||||||
|
|
|
@ -35,9 +35,11 @@ if (NOT DEFINED WAMR_BUILD_TARGET)
|
||||||
if (CMAKE_SIZEOF_VOID_P EQUAL 8)
|
if (CMAKE_SIZEOF_VOID_P EQUAL 8)
|
||||||
# Build as X86_64 by default in 64-bit platform
|
# Build as X86_64 by default in 64-bit platform
|
||||||
set (WAMR_BUILD_TARGET "X86_64")
|
set (WAMR_BUILD_TARGET "X86_64")
|
||||||
else ()
|
elseif (CMAKE_SIZEOF_VOID_P EQUAL 4)
|
||||||
# Build as X86_32 by default in 32-bit platform
|
# Build as X86_32 by default in 32-bit platform
|
||||||
set (WAMR_BUILD_TARGET "X86_32")
|
set (WAMR_BUILD_TARGET "X86_32")
|
||||||
|
else ()
|
||||||
|
message(SEND_ERROR "Unsupported build target platform!")
|
||||||
endif ()
|
endif ()
|
||||||
endif ()
|
endif ()
|
||||||
|
|
||||||
|
|
|
@ -22,9 +22,11 @@ if (NOT DEFINED WAMR_BUILD_TARGET)
|
||||||
elseif (CMAKE_SIZEOF_VOID_P EQUAL 8)
|
elseif (CMAKE_SIZEOF_VOID_P EQUAL 8)
|
||||||
# Build as X86_64 by default in 64-bit platform
|
# Build as X86_64 by default in 64-bit platform
|
||||||
set (WAMR_BUILD_TARGET "X86_64")
|
set (WAMR_BUILD_TARGET "X86_64")
|
||||||
else ()
|
elseif (CMAKE_SIZEOF_VOID_P EQUAL 4)
|
||||||
# Build as X86_32 by default in 32-bit platform
|
# Build as X86_32 by default in 32-bit platform
|
||||||
set (WAMR_BUILD_TARGET "X86_32")
|
set (WAMR_BUILD_TARGET "X86_32")
|
||||||
|
else ()
|
||||||
|
message(SEND_ERROR "Unsupported build target platform!")
|
||||||
endif ()
|
endif ()
|
||||||
endif ()
|
endif ()
|
||||||
|
|
||||||
|
|
|
@ -16,9 +16,11 @@ if (NOT DEFINED WAMR_BUILD_TARGET)
|
||||||
if (CMAKE_SIZEOF_VOID_P EQUAL 8)
|
if (CMAKE_SIZEOF_VOID_P EQUAL 8)
|
||||||
# Build as X86_64 by default in 64-bit platform
|
# Build as X86_64 by default in 64-bit platform
|
||||||
set (WAMR_BUILD_TARGET "X86_64")
|
set (WAMR_BUILD_TARGET "X86_64")
|
||||||
else ()
|
elseif (CMAKE_SIZEOF_VOID_P EQUAL 4)
|
||||||
# Build as X86_32 by default in 32-bit platform
|
# Build as X86_32 by default in 32-bit platform
|
||||||
set (WAMR_BUILD_TARGET "X86_32")
|
set (WAMR_BUILD_TARGET "X86_32")
|
||||||
|
else ()
|
||||||
|
message(SEND_ERROR "Unsupported build target platform!")
|
||||||
endif ()
|
endif ()
|
||||||
endif ()
|
endif ()
|
||||||
|
|
||||||
|
|
|
@ -16,9 +16,11 @@ if (NOT DEFINED WAMR_BUILD_TARGET)
|
||||||
if (CMAKE_SIZEOF_VOID_P EQUAL 8)
|
if (CMAKE_SIZEOF_VOID_P EQUAL 8)
|
||||||
# Build as X86_64 by default in 64-bit platform
|
# Build as X86_64 by default in 64-bit platform
|
||||||
set (WAMR_BUILD_TARGET "X86_64")
|
set (WAMR_BUILD_TARGET "X86_64")
|
||||||
else ()
|
elseif (CMAKE_SIZEOF_VOID_P EQUAL 4)
|
||||||
# Build as X86_32 by default in 32-bit platform
|
# Build as X86_32 by default in 32-bit platform
|
||||||
set (WAMR_BUILD_TARGET "X86_32")
|
set (WAMR_BUILD_TARGET "X86_32")
|
||||||
|
else ()
|
||||||
|
message(SEND_ERROR "Unsupported build target platform!")
|
||||||
endif ()
|
endif ()
|
||||||
endif ()
|
endif ()
|
||||||
|
|
||||||
|
|
|
@ -25,9 +25,11 @@ if (NOT DEFINED WAMR_BUILD_TARGET)
|
||||||
elseif (CMAKE_SIZEOF_VOID_P EQUAL 8)
|
elseif (CMAKE_SIZEOF_VOID_P EQUAL 8)
|
||||||
# Build as X86_64 by default in 64-bit platform
|
# Build as X86_64 by default in 64-bit platform
|
||||||
set (WAMR_BUILD_TARGET "X86_64")
|
set (WAMR_BUILD_TARGET "X86_64")
|
||||||
else ()
|
elseif (CMAKE_SIZEOF_VOID_P EQUAL 4)
|
||||||
# Build as X86_32 by default in 32-bit platform
|
# Build as X86_32 by default in 32-bit platform
|
||||||
set (WAMR_BUILD_TARGET "X86_32")
|
set (WAMR_BUILD_TARGET "X86_32")
|
||||||
|
else ()
|
||||||
|
message(SEND_ERROR "Unsupported build target platform!")
|
||||||
endif ()
|
endif ()
|
||||||
endif ()
|
endif ()
|
||||||
|
|
||||||
|
|
|
@ -24,9 +24,11 @@ if (NOT DEFINED WAMR_BUILD_TARGET)
|
||||||
if (CMAKE_SIZEOF_VOID_P EQUAL 8)
|
if (CMAKE_SIZEOF_VOID_P EQUAL 8)
|
||||||
# Build as X86_64 by default in 64-bit platform
|
# Build as X86_64 by default in 64-bit platform
|
||||||
set (WAMR_BUILD_TARGET "X86_64")
|
set (WAMR_BUILD_TARGET "X86_64")
|
||||||
else ()
|
elseif (CMAKE_SIZEOF_VOID_P EQUAL 4)
|
||||||
# Build as X86_32 by default in 32-bit platform
|
# Build as X86_32 by default in 32-bit platform
|
||||||
set (WAMR_BUILD_TARGET "X86_32")
|
set (WAMR_BUILD_TARGET "X86_32")
|
||||||
|
else ()
|
||||||
|
message(SEND_ERROR "Unsupported build target platform!")
|
||||||
endif ()
|
endif ()
|
||||||
endif ()
|
endif ()
|
||||||
|
|
||||||
|
|
|
@ -23,9 +23,11 @@ if (NOT DEFINED WAMR_BUILD_TARGET)
|
||||||
if (CMAKE_SIZEOF_VOID_P EQUAL 8)
|
if (CMAKE_SIZEOF_VOID_P EQUAL 8)
|
||||||
# Build as X86_64 by default in 64-bit platform
|
# Build as X86_64 by default in 64-bit platform
|
||||||
set (WAMR_BUILD_TARGET "X86_64")
|
set (WAMR_BUILD_TARGET "X86_64")
|
||||||
else ()
|
elseif (CMAKE_SIZEOF_VOID_P EQUAL 4)
|
||||||
# Build as X86_32 by default in 32-bit platform
|
# Build as X86_32 by default in 32-bit platform
|
||||||
set (WAMR_BUILD_TARGET "X86_32")
|
set (WAMR_BUILD_TARGET "X86_32")
|
||||||
|
else ()
|
||||||
|
message(FATAL_ERROR "Unsupported build target platform!")
|
||||||
endif ()
|
endif ()
|
||||||
endif ()
|
endif ()
|
||||||
|
|
||||||
|
|
|
@ -33,9 +33,11 @@ if (NOT DEFINED WAMR_BUILD_TARGET)
|
||||||
elseif (CMAKE_SIZEOF_VOID_P EQUAL 8)
|
elseif (CMAKE_SIZEOF_VOID_P EQUAL 8)
|
||||||
# Build as X86_64 by default in 64-bit platform
|
# Build as X86_64 by default in 64-bit platform
|
||||||
set (WAMR_BUILD_TARGET "X86_64")
|
set (WAMR_BUILD_TARGET "X86_64")
|
||||||
else ()
|
elseif (CMAKE_SIZEOF_VOID_P EQUAL 4)
|
||||||
# Build as X86_32 by default in 32-bit platform
|
# Build as X86_32 by default in 32-bit platform
|
||||||
set (WAMR_BUILD_TARGET "X86_32")
|
set (WAMR_BUILD_TARGET "X86_32")
|
||||||
|
else ()
|
||||||
|
message(SEND_ERROR "Unsupported build target platform!")
|
||||||
endif ()
|
endif ()
|
||||||
endif ()
|
endif ()
|
||||||
|
|
||||||
|
|
|
@ -27,9 +27,11 @@ if (NOT DEFINED WAMR_BUILD_TARGET)
|
||||||
elseif (CMAKE_SIZEOF_VOID_P EQUAL 8)
|
elseif (CMAKE_SIZEOF_VOID_P EQUAL 8)
|
||||||
# Build as X86_64 by default in 64-bit platform
|
# Build as X86_64 by default in 64-bit platform
|
||||||
set (WAMR_BUILD_TARGET "X86_64")
|
set (WAMR_BUILD_TARGET "X86_64")
|
||||||
else ()
|
elseif (CMAKE_SIZEOF_VOID_P EQUAL 4)
|
||||||
# Build as X86_32 by default in 32-bit platform
|
# Build as X86_32 by default in 32-bit platform
|
||||||
set (WAMR_BUILD_TARGET "X86_32")
|
set (WAMR_BUILD_TARGET "X86_32")
|
||||||
|
else ()
|
||||||
|
message(SEND_ERROR "Unsupported build target platform!")
|
||||||
endif ()
|
endif ()
|
||||||
endif ()
|
endif ()
|
||||||
|
|
||||||
|
|
|
@ -27,9 +27,11 @@ if (NOT DEFINED WAMR_BUILD_TARGET)
|
||||||
elseif (CMAKE_SIZEOF_VOID_P EQUAL 8)
|
elseif (CMAKE_SIZEOF_VOID_P EQUAL 8)
|
||||||
# Build as X86_64 by default in 64-bit platform
|
# Build as X86_64 by default in 64-bit platform
|
||||||
set (WAMR_BUILD_TARGET "X86_64")
|
set (WAMR_BUILD_TARGET "X86_64")
|
||||||
else ()
|
elseif (CMAKE_SIZEOF_VOID_P EQUAL 4)
|
||||||
# Build as X86_32 by default in 32-bit platform
|
# Build as X86_32 by default in 32-bit platform
|
||||||
set (WAMR_BUILD_TARGET "X86_32")
|
set (WAMR_BUILD_TARGET "X86_32")
|
||||||
|
else ()
|
||||||
|
message(SEND_ERROR "Unsupported build target platform!")
|
||||||
endif ()
|
endif ()
|
||||||
endif ()
|
endif ()
|
||||||
|
|
||||||
|
|
|
@ -27,9 +27,11 @@ if (NOT DEFINED WAMR_BUILD_TARGET)
|
||||||
elseif (CMAKE_SIZEOF_VOID_P EQUAL 8)
|
elseif (CMAKE_SIZEOF_VOID_P EQUAL 8)
|
||||||
# Build as X86_64 by default in 64-bit platform
|
# Build as X86_64 by default in 64-bit platform
|
||||||
set (WAMR_BUILD_TARGET "X86_64")
|
set (WAMR_BUILD_TARGET "X86_64")
|
||||||
else ()
|
elseif (CMAKE_SIZEOF_VOID_P EQUAL 4)
|
||||||
# Build as X86_32 by default in 32-bit platform
|
# Build as X86_32 by default in 32-bit platform
|
||||||
set (WAMR_BUILD_TARGET "X86_32")
|
set (WAMR_BUILD_TARGET "X86_32")
|
||||||
|
else ()
|
||||||
|
message(SEND_ERROR "Unsupported build target platform!")
|
||||||
endif ()
|
endif ()
|
||||||
endif ()
|
endif ()
|
||||||
|
|
||||||
|
|
|
@ -33,9 +33,11 @@ if (NOT DEFINED WAMR_BUILD_TARGET)
|
||||||
elseif (CMAKE_SIZEOF_VOID_P EQUAL 8)
|
elseif (CMAKE_SIZEOF_VOID_P EQUAL 8)
|
||||||
# Build as X86_64 by default in 64-bit platform
|
# Build as X86_64 by default in 64-bit platform
|
||||||
set (WAMR_BUILD_TARGET "X86_64")
|
set (WAMR_BUILD_TARGET "X86_64")
|
||||||
else ()
|
elseif (CMAKE_SIZEOF_VOID_P EQUAL 4)
|
||||||
# Build as X86_32 by default in 32-bit platform
|
# Build as X86_32 by default in 32-bit platform
|
||||||
set (WAMR_BUILD_TARGET "X86_32")
|
set (WAMR_BUILD_TARGET "X86_32")
|
||||||
|
else ()
|
||||||
|
message(SEND_ERROR "Unsupported build target platform!")
|
||||||
endif ()
|
endif ()
|
||||||
endif ()
|
endif ()
|
||||||
|
|
||||||
|
|
|
@ -125,9 +125,11 @@ if (NOT DEFINED WAMR_BUILD_TARGET)
|
||||||
elseif (CMAKE_SIZEOF_VOID_P EQUAL 8)
|
elseif (CMAKE_SIZEOF_VOID_P EQUAL 8)
|
||||||
# Build as X86_64 by default in 64-bit platform
|
# Build as X86_64 by default in 64-bit platform
|
||||||
set (WAMR_BUILD_TARGET "X86_64")
|
set (WAMR_BUILD_TARGET "X86_64")
|
||||||
else ()
|
elseif (CMAKE_SIZEOF_VOID_P EQUAL 4)
|
||||||
# Build as X86_32 by default in 32-bit platform
|
# Build as X86_32 by default in 32-bit platform
|
||||||
set (WAMR_BUILD_TARGET "X86_32")
|
set (WAMR_BUILD_TARGET "X86_32")
|
||||||
|
else ()
|
||||||
|
message(SEND_ERROR "Unsupported build target platform!")
|
||||||
endif ()
|
endif ()
|
||||||
endif ()
|
endif ()
|
||||||
|
|
||||||
|
|
|
@ -27,9 +27,11 @@ if (NOT DEFINED WAMR_BUILD_TARGET)
|
||||||
elseif (CMAKE_SIZEOF_VOID_P EQUAL 8)
|
elseif (CMAKE_SIZEOF_VOID_P EQUAL 8)
|
||||||
# Build as X86_64 by default in 64-bit platform
|
# Build as X86_64 by default in 64-bit platform
|
||||||
set (WAMR_BUILD_TARGET "X86_64")
|
set (WAMR_BUILD_TARGET "X86_64")
|
||||||
else ()
|
elseif (CMAKE_SIZEOF_VOID_P EQUAL 4)
|
||||||
# Build as X86_32 by default in 32-bit platform
|
# Build as X86_32 by default in 32-bit platform
|
||||||
set (WAMR_BUILD_TARGET "X86_32")
|
set (WAMR_BUILD_TARGET "X86_32")
|
||||||
|
else ()
|
||||||
|
message(SEND_ERROR "Unsupported build target platform!")
|
||||||
endif ()
|
endif ()
|
||||||
endif ()
|
endif ()
|
||||||
|
|
||||||
|
|
|
@ -39,9 +39,11 @@ if (NOT DEFINED WAMR_BUILD_TARGET)
|
||||||
elseif (CMAKE_SIZEOF_VOID_P EQUAL 8)
|
elseif (CMAKE_SIZEOF_VOID_P EQUAL 8)
|
||||||
# Build as X86_64 by default in 64-bit platform
|
# Build as X86_64 by default in 64-bit platform
|
||||||
set (WAMR_BUILD_TARGET "X86_64")
|
set (WAMR_BUILD_TARGET "X86_64")
|
||||||
else ()
|
elseif (CMAKE_SIZEOF_VOID_P EQUAL 4)
|
||||||
# Build as X86_32 by default in 32-bit platform
|
# Build as X86_32 by default in 32-bit platform
|
||||||
set (WAMR_BUILD_TARGET "X86_32")
|
set (WAMR_BUILD_TARGET "X86_32")
|
||||||
|
else ()
|
||||||
|
message(SEND_ERROR "Unsupported build target platform!")
|
||||||
endif ()
|
endif ()
|
||||||
endif ()
|
endif ()
|
||||||
|
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
diff --git a/test/core/binary.wast b/test/core/binary.wast
|
diff --git a/test/core/binary.wast b/test/core/binary.wast
|
||||||
index c6f9755..a479212 100644
|
index 891aad3..07356a3 100644
|
||||||
--- a/test/core/binary.wast
|
--- a/test/core/binary.wast
|
||||||
+++ b/test/core/binary.wast
|
+++ b/test/core/binary.wast
|
||||||
@@ -161,7 +161,7 @@
|
@@ -206,7 +206,7 @@
|
||||||
)
|
)
|
||||||
|
|
||||||
;; Type section with signed LEB128 encoded type
|
;; Type section with signed LEB128 encoded type
|
||||||
|
@ -11,7 +11,7 @@ index c6f9755..a479212 100644
|
||||||
(module binary
|
(module binary
|
||||||
"\00asm" "\01\00\00\00"
|
"\00asm" "\01\00\00\00"
|
||||||
"\01" ;; Type section id
|
"\01" ;; Type section id
|
||||||
@@ -171,7 +171,7 @@
|
@@ -216,7 +216,7 @@
|
||||||
"\00\00"
|
"\00\00"
|
||||||
)
|
)
|
||||||
"integer representation too long"
|
"integer representation too long"
|
||||||
|
@ -20,7 +20,7 @@ index c6f9755..a479212 100644
|
||||||
|
|
||||||
;; Unsigned LEB128 must not be overlong
|
;; Unsigned LEB128 must not be overlong
|
||||||
(assert_malformed
|
(assert_malformed
|
||||||
@@ -1582,7 +1582,7 @@
|
@@ -1683,7 +1683,7 @@
|
||||||
)
|
)
|
||||||
|
|
||||||
;; 2 elem segment declared, 1 given
|
;; 2 elem segment declared, 1 given
|
||||||
|
@ -29,7 +29,7 @@ index c6f9755..a479212 100644
|
||||||
(module binary
|
(module binary
|
||||||
"\00asm" "\01\00\00\00"
|
"\00asm" "\01\00\00\00"
|
||||||
"\01\04\01" ;; type section
|
"\01\04\01" ;; type section
|
||||||
@@ -1595,7 +1595,7 @@
|
@@ -1696,7 +1696,7 @@
|
||||||
;; "\00\41\00\0b\01\00" ;; elem 1 (missed)
|
;; "\00\41\00\0b\01\00" ;; elem 1 (missed)
|
||||||
)
|
)
|
||||||
"unexpected end"
|
"unexpected end"
|
||||||
|
@ -38,6 +38,24 @@ index c6f9755..a479212 100644
|
||||||
|
|
||||||
;; 2 elem segment declared, 1.5 given
|
;; 2 elem segment declared, 1.5 given
|
||||||
(assert_malformed
|
(assert_malformed
|
||||||
|
@@ -1813,7 +1813,7 @@
|
||||||
|
)
|
||||||
|
|
||||||
|
;; 1 br_table target declared, 2 given
|
||||||
|
-(assert_malformed
|
||||||
|
+(;assert_malformed
|
||||||
|
(module binary
|
||||||
|
"\00asm" "\01\00\00\00"
|
||||||
|
"\01\04\01" ;; type section
|
||||||
|
@@ -1832,7 +1832,7 @@
|
||||||
|
"\0b\0b\0b" ;; end
|
||||||
|
)
|
||||||
|
"unexpected end"
|
||||||
|
-)
|
||||||
|
+;)
|
||||||
|
|
||||||
|
;; Start section
|
||||||
|
(module binary
|
||||||
diff --git a/test/core/data.wast b/test/core/data.wast
|
diff --git a/test/core/data.wast b/test/core/data.wast
|
||||||
index 4f339be..0b5b3e6 100644
|
index 4f339be..0b5b3e6 100644
|
||||||
--- a/test/core/data.wast
|
--- a/test/core/data.wast
|
||||||
|
@ -93,26 +111,10 @@ index 4f339be..0b5b3e6 100644
|
||||||
|
|
||||||
;; Invalid offsets
|
;; Invalid offsets
|
||||||
diff --git a/test/core/elem.wast b/test/core/elem.wast
|
diff --git a/test/core/elem.wast b/test/core/elem.wast
|
||||||
index 575ecef..204b748 100644
|
index 575ecef..6eecab9 100644
|
||||||
--- a/test/core/elem.wast
|
--- a/test/core/elem.wast
|
||||||
+++ b/test/core/elem.wast
|
+++ b/test/core/elem.wast
|
||||||
@@ -467,6 +467,7 @@
|
@@ -571,9 +571,11 @@
|
||||||
"type mismatch"
|
|
||||||
)
|
|
||||||
|
|
||||||
+(; not supported by wat2wasm
|
|
||||||
(assert_invalid
|
|
||||||
(module
|
|
||||||
(table 1 funcref)
|
|
||||||
@@ -507,6 +508,7 @@
|
|
||||||
)
|
|
||||||
"constant expression required"
|
|
||||||
)
|
|
||||||
+;)
|
|
||||||
|
|
||||||
;; Two elements target the same slot
|
|
||||||
|
|
||||||
@@ -571,9 +573,11 @@
|
|
||||||
(func $const-i32-d (type $out-i32) (i32.const 68))
|
(func $const-i32-d (type $out-i32) (i32.const 68))
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -124,7 +126,7 @@ index 575ecef..204b748 100644
|
||||||
|
|
||||||
(module $module3
|
(module $module3
|
||||||
(type $out-i32 (func (result i32)))
|
(type $out-i32 (func (result i32)))
|
||||||
@@ -584,6 +588,8 @@
|
@@ -584,6 +586,8 @@
|
||||||
(func $const-i32-f (type $out-i32) (i32.const 70))
|
(func $const-i32-f (type $out-i32) (i32.const 70))
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -785,7 +787,7 @@ index 0b2d26f..bdab6a0 100644
|
||||||
(table $t1 30 30 funcref)
|
(table $t1 30 30 funcref)
|
||||||
(elem (table $t1) (i32.const 2) func 3 1 4 1)
|
(elem (table $t1) (i32.const 2) func 3 1 4 1)
|
||||||
diff --git a/test/core/unreached-valid.wast b/test/core/unreached-valid.wast
|
diff --git a/test/core/unreached-valid.wast b/test/core/unreached-valid.wast
|
||||||
index 0025217..07d2788 100644
|
index b7ebabf..4f2abfb 100644
|
||||||
--- a/test/core/unreached-valid.wast
|
--- a/test/core/unreached-valid.wast
|
||||||
+++ b/test/core/unreached-valid.wast
|
+++ b/test/core/unreached-valid.wast
|
||||||
@@ -46,6 +46,7 @@
|
@@ -46,6 +46,7 @@
|
||||||
|
@ -796,9 +798,8 @@ index 0025217..07d2788 100644
|
||||||
(module
|
(module
|
||||||
(func (export "meet-bottom")
|
(func (export "meet-bottom")
|
||||||
(block (result f64)
|
(block (result f64)
|
||||||
@@ -59,4 +60,5 @@
|
@@ -61,3 +62,4 @@
|
||||||
(drop)
|
|
||||||
)
|
|
||||||
)
|
)
|
||||||
+;)
|
|
||||||
|
|
||||||
|
(assert_trap (invoke "meet-bottom") "unreachable")
|
||||||
|
+;)
|
||||||
|
|
|
@ -275,12 +275,12 @@ function spec_test()
|
||||||
|
|
||||||
# update basic test cases
|
# update basic test cases
|
||||||
echo "update spec test cases"
|
echo "update spec test cases"
|
||||||
git fetch origin master
|
git fetch origin main
|
||||||
# restore from XX_ignore_cases.patch
|
# restore from XX_ignore_cases.patch
|
||||||
# resotre branch
|
# resotre branch
|
||||||
git checkout -B master
|
git checkout -B main
|
||||||
# [spec] Fix instruction table (#1402) Thu Dec 2 17:21:54 2021 +0100
|
# [spec] Update note on module initialization trapping (#1493)
|
||||||
git reset --hard 2460ad02b51fb5ed5824f44de287a8638b19a5f8
|
git reset --hard 044d0d2e77bdcbe891f7e0b9dd2ac01d56435f0b
|
||||||
git apply ../../spec-test-script/ignore_cases.patch
|
git apply ../../spec-test-script/ignore_cases.patch
|
||||||
if [[ ${ENABLE_SIMD} == 1 ]]; then
|
if [[ ${ENABLE_SIMD} == 1 ]]; then
|
||||||
git apply ../../spec-test-script/simd_ignore_cases.patch
|
git apply ../../spec-test-script/simd_ignore_cases.patch
|
||||||
|
@ -295,8 +295,8 @@ function spec_test()
|
||||||
|
|
||||||
# fetch spec for threads proposal
|
# fetch spec for threads proposal
|
||||||
git fetch threads
|
git fetch threads
|
||||||
# [interpreter] Threading (#179) Fri Aug 6 18:02:59 2021 +0200
|
# Fix error in Web embedding desc for atomic.notify (#185)
|
||||||
git reset --hard 0d115b494d640eb0c1c352941fd14ca0bad926d3
|
git reset --hard 85b562cd6805947876ec5e8b975ab0127c55a0a2
|
||||||
git checkout threads/main
|
git checkout threads/main
|
||||||
|
|
||||||
git apply ../../spec-test-script/thread_proposal_ignore_cases.patch
|
git apply ../../spec-test-script/thread_proposal_ignore_cases.patch
|
||||||
|
@ -321,16 +321,16 @@ function spec_test()
|
||||||
exit 1
|
exit 1
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
if [ ! -f /tmp/wabt-1.0.24-${WABT_PLATFORM}.tar.gz ]; then
|
if [ ! -f /tmp/wabt-1.0.29-${WABT_PLATFORM}.tar.gz ]; then
|
||||||
wget \
|
wget \
|
||||||
https://github.com/WebAssembly/wabt/releases/download/1.0.24/wabt-1.0.24-${WABT_PLATFORM}.tar.gz \
|
https://github.com/WebAssembly/wabt/releases/download/1.0.29/wabt-1.0.29-${WABT_PLATFORM}.tar.gz \
|
||||||
-P /tmp
|
-P /tmp
|
||||||
fi
|
fi
|
||||||
|
|
||||||
cd /tmp \
|
cd /tmp \
|
||||||
&& tar zxf wabt-1.0.24-${WABT_PLATFORM}.tar.gz \
|
&& tar zxf wabt-1.0.29-${WABT_PLATFORM}.tar.gz \
|
||||||
&& mkdir -p ${WORK_DIR}/wabt/out/gcc/Release/ \
|
&& mkdir -p ${WORK_DIR}/wabt/out/gcc/Release/ \
|
||||||
&& install wabt-1.0.24/bin/wa* ${WORK_DIR}/wabt/out/gcc/Release/ \
|
&& install wabt-1.0.29/bin/wa* ${WORK_DIR}/wabt/out/gcc/Release/ \
|
||||||
&& cd -
|
&& cd -
|
||||||
fi
|
fi
|
||||||
else
|
else
|
||||||
|
|
Loading…
Reference in New Issue
Block a user