mirror of
https://github.com/bytecodealliance/wasm-micro-runtime.git
synced 2025-02-08 16:05:07 +00:00
![wenyongh](/assets/img/avatar_default.png)
* Implement memory profiler, optimize memory usage, modify code indent * Implement memory.grow and limit heap space base offset to 1G; modify iwasm build type to Release and 64 bit by default * Add a new extension library: connection * Fix bug of reading magic number and version in big endian platform * Re-org platform APIs: move most platform APIs from iwasm to shared-lib * Enhance wasm loader to fix some security issues * Fix issue about illegal load of EXC_RETURN into PC on stm32 board * Updates that let a restricted version of the interpreter run in SGX * Enable native/app address validation and conversion for wasm app * Remove wasm_application_exectue_* APIs from wasm_export.h which makes confused * Refine binary size and fix several minor issues Optimize interpreter LOAD/STORE opcodes to decrease the binary size Fix issues when using iwasm library: _bh_log undefined, bh_memory.h not found Remove unused _stdin/_stdout/_stderr global variables resolve in libc wrapper Add macros of global heap size, stack size, heap size for Zephyr main.c Clear compile warning of wasm_application.c * Add more strict security checks for libc wrapper API's * Use one libc wrapper copy for sgx and other platforms; remove bh_printf macro for other platform header files * Enhance security of libc strcpy/sprintf wrapper function * Fix issue of call native for x86_64/arm/mips, add module inst parameter for native wrapper functions * Remove get_module_inst() and fix issue of call native * Refine wgl lib: remove module_inst parameter from widget functions; move function index check to runtime instantiate * Refine interpreter call native process, refine memory boudary check * Fix issues of invokeNative function of arm/mips/general version * Add a switch to build simple sample without gui support * Add BUILD_TARGET setting in makefile to replace cpu compiler flags in source code * Re-org shared lib header files, remove unused info; fix compile issues of vxworks * Add build target general * Remove unused files * Update license header * test push * Restore file * Sync up with internal/feature * Sync up with internal/feature * Rename build_wamr_app to build_wasm_app * Fix small issues of README * Enhance malformed wasm file checking Fix issue of print hex int and implement utf8 string check Fix wasi file read/write right issue Fix minor issue of build wasm app doc * Sync up with internal/feature * Sync up with internal/feature: fix interpreter arm issue, fix read leb issue * Sync up with internal/feature * Fix bug of config.h and rename wasi config.h to ssp_config.h * Sync up with internal/feature * Import wamr aot * update document * update document * Update document, disable WASI in 32bit * update document * remove files * update document * Update document * update document * update document * update samples * Sync up with internal repo
194 lines
5.5 KiB
C
194 lines
5.5 KiB
C
/*
|
|
* Copyright (C) 2019 Intel Corporation. All rights reserved.
|
|
* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
*/
|
|
|
|
#include "aot_emit_variable.h"
|
|
#include "../aot/aot_runtime.h"
|
|
|
|
#define CHECK_LOCAL(idx) do { \
|
|
if (idx >= func_ctx->aot_func->func_type->param_count \
|
|
+ func_ctx->aot_func->local_count) { \
|
|
aot_set_last_error("local index out of range"); \
|
|
return false; \
|
|
} \
|
|
} while (0)
|
|
|
|
static uint8
|
|
get_local_type(AOTFuncContext *func_ctx, uint32 local_idx)
|
|
{
|
|
AOTFunc *aot_func = func_ctx->aot_func;
|
|
uint32 param_count = aot_func->func_type->param_count;
|
|
return local_idx < param_count
|
|
? aot_func->func_type->types[local_idx]
|
|
: aot_func->local_types[local_idx - param_count];
|
|
}
|
|
|
|
bool
|
|
aot_compile_op_get_local(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx,
|
|
uint32 local_idx)
|
|
{
|
|
char name[32];
|
|
LLVMValueRef value;
|
|
|
|
CHECK_LOCAL(local_idx);
|
|
|
|
snprintf(name, sizeof(name), "%s%d%s", "local", local_idx, "#");
|
|
if (!(value = LLVMBuildLoad(comp_ctx->builder,
|
|
func_ctx->locals[local_idx],
|
|
name))) {
|
|
aot_set_last_error("llvm build load fail");
|
|
return false;
|
|
}
|
|
|
|
PUSH(value, get_local_type(func_ctx, local_idx));
|
|
return true;
|
|
|
|
fail:
|
|
return false;
|
|
}
|
|
|
|
bool
|
|
aot_compile_op_set_local(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx,
|
|
uint32 local_idx)
|
|
{
|
|
LLVMValueRef value;
|
|
|
|
CHECK_LOCAL(local_idx);
|
|
|
|
POP(value, get_local_type(func_ctx, local_idx));
|
|
|
|
if (!LLVMBuildStore(comp_ctx->builder,
|
|
value,
|
|
func_ctx->locals[local_idx])) {
|
|
aot_set_last_error("llvm build store fail");
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
|
|
fail:
|
|
return false;
|
|
}
|
|
|
|
bool
|
|
aot_compile_op_tee_local(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx,
|
|
uint32 local_idx)
|
|
{
|
|
LLVMValueRef value;
|
|
uint8 type;
|
|
|
|
CHECK_LOCAL(local_idx);
|
|
|
|
type = get_local_type(func_ctx, local_idx);
|
|
|
|
POP(value, type);
|
|
|
|
if (!LLVMBuildStore(comp_ctx->builder,
|
|
value,
|
|
func_ctx->locals[local_idx])) {
|
|
aot_set_last_error("llvm build store fail");
|
|
return false;
|
|
}
|
|
|
|
PUSH(value, type);
|
|
return true;
|
|
|
|
fail:
|
|
return false;
|
|
}
|
|
|
|
static bool
|
|
compile_global(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx,
|
|
uint32 global_idx, bool is_set)
|
|
{
|
|
AOTCompData *comp_data = comp_ctx->comp_data;
|
|
uint32 import_global_count = comp_data->import_global_count;
|
|
uint32 global_base_offset = offsetof(AOTModuleInstance,
|
|
global_table_heap_data.bytes);
|
|
uint32 global_offset;
|
|
uint8 global_type;
|
|
LLVMValueRef offset, global_ptr, global;
|
|
LLVMTypeRef ptr_type = NULL;
|
|
|
|
bh_assert(global_idx < import_global_count + comp_data->global_count);
|
|
|
|
if (global_idx < import_global_count) {
|
|
global_offset = global_base_offset
|
|
+ comp_data->import_globals[global_idx].data_offset;
|
|
global_type = comp_data->import_globals[global_idx].type;
|
|
}
|
|
else {
|
|
global_offset = global_base_offset
|
|
+ comp_data->globals[global_idx - import_global_count].data_offset;
|
|
global_type =
|
|
comp_data->globals[global_idx - import_global_count].type;
|
|
}
|
|
|
|
offset = I32_CONST(global_offset);
|
|
if (!(global_ptr = LLVMBuildInBoundsGEP(comp_ctx->builder, func_ctx->aot_inst,
|
|
&offset, 1, "global_ptr_tmp"))) {
|
|
aot_set_last_error("llvm build in bounds gep failed.");
|
|
return false;
|
|
}
|
|
|
|
switch (global_type) {
|
|
case VALUE_TYPE_I32:
|
|
ptr_type = comp_ctx->basic_types.int32_ptr_type;
|
|
break;
|
|
case VALUE_TYPE_I64:
|
|
ptr_type = comp_ctx->basic_types.int64_ptr_type;
|
|
break;
|
|
case VALUE_TYPE_F32:
|
|
ptr_type = comp_ctx->basic_types.float32_ptr_type;
|
|
break;
|
|
case VALUE_TYPE_F64:
|
|
ptr_type = comp_ctx->basic_types.float64_ptr_type;
|
|
break;
|
|
default:
|
|
bh_assert(0);
|
|
break;
|
|
}
|
|
|
|
if (!(global_ptr = LLVMBuildBitCast(comp_ctx->builder, global_ptr,
|
|
ptr_type, "global_ptr"))) {
|
|
aot_set_last_error("llvm build bit cast failed.");
|
|
return false;
|
|
}
|
|
|
|
if (!is_set) {
|
|
if (!(global = LLVMBuildLoad(comp_ctx->builder,
|
|
global_ptr, "global"))) {
|
|
aot_set_last_error("llvm build load failed.");
|
|
return false;
|
|
}
|
|
PUSH(global, global_type);
|
|
}
|
|
else {
|
|
POP(global, global_type);
|
|
if (!LLVMBuildStore(comp_ctx->builder, global, global_ptr)) {
|
|
aot_set_last_error("llvm build store failed.");
|
|
return false;
|
|
}
|
|
}
|
|
|
|
return true;
|
|
fail:
|
|
return false;
|
|
}
|
|
|
|
bool
|
|
aot_compile_op_get_global(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx,
|
|
uint32 global_idx)
|
|
{
|
|
return compile_global(comp_ctx, func_ctx, global_idx, false);
|
|
}
|
|
|
|
bool
|
|
aot_compile_op_set_global(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx,
|
|
uint32 global_idx)
|
|
{
|
|
return compile_global(comp_ctx, func_ctx, global_idx, true);
|
|
}
|
|
|