Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
53 commits
Select commit Hold shift + click to select a range
b389628
Merge pull request #82 from bytecodealliance/master
wenyongh Mar 16, 2020
62a1992
Merge pull request #83 from bytecodealliance/master
wenyongh Mar 16, 2020
00c5daf
Merge pull request #84 from bytecodealliance/master
wenyongh Mar 17, 2020
7a46018
Merge pull request #85 from bytecodealliance/master
wenyongh Mar 18, 2020
6ed452c
Sync with internal feature
wenyongh Mar 18, 2020
632d63a
Merge pull request #86 from bytecodealliance/master
wenyongh Mar 20, 2020
ee37497
Merge pull request #87 from bytecodealliance/master
wenyongh Mar 23, 2020
44d041d
Merge pull request #88 from bytecodealliance/master
wenyongh Mar 24, 2020
b382a7f
Enable aarch64 support, add component test framework and test suite, …
wenyongh Mar 24, 2020
0a6cef7
Merge pull request #89 from bytecodealliance/master
wenyongh Mar 24, 2020
6df54ce
Merge pull request #90 from bytecodealliance/master
wenyongh Mar 27, 2020
5009206
Merge pull request #91 from bytecodealliance/master
wenyongh Mar 30, 2020
0ab53e6
Implement register/call native API with raw arguments
wenyongh Apr 1, 2020
f890529
Merge pull request #92 from bytecodealliance/master
wenyongh Apr 1, 2020
9d5bfda
Merge pull request #93 from bytecodealliance/master
wenyongh Apr 1, 2020
3b36fb8
Merge pull request #94 from bytecodealliance/master
wenyongh Apr 2, 2020
908c5f7
Merge pull request #95 from bytecodealliance/master
wenyongh Apr 9, 2020
5336e35
Merge pull request #96 from bytecodealliance/master
wenyongh Apr 12, 2020
21275d3
Merge pull request #97 from bytecodealliance/master
wenyongh Apr 13, 2020
4c56eb9
Make heap and linear memory contiguous to refine compilation time and…
wenyongh Apr 13, 2020
f984e20
Modify aot version
wenyongh Apr 13, 2020
5076b77
Merge pull request #98 from bytecodealliance/master
wenyongh Apr 13, 2020
1cf823d
Merge pull request #99 from bytecodealliance/master
wenyongh Apr 22, 2020
33a9f85
Refine aot memory boundary check, add more llvm passes
wenyongh Apr 22, 2020
be5d033
Merge pull request #100 from bytecodealliance/master
wenyongh Apr 22, 2020
aa69a45
Merge pull request #101 from bytecodealliance/master
wenyongh Apr 25, 2020
59f4d15
Sync with internal/feature
wenyongh Apr 30, 2020
af0e324
Merge pull request #102 from bytecodealliance/master
wenyongh Apr 30, 2020
4fa4bad
Sync with internal feature
wenyongh May 8, 2020
9ea9457
Merge pull request #103 from bytecodealliance/master
wenyongh May 8, 2020
54863ed
Fix issues of condition settings of app boundary check
wenyongh May 8, 2020
03ec08f
Merge pull request #104 from bytecodealliance/master
wenyongh May 8, 2020
87151ea
Replace llvm void ptr type with int8 ptr type to avoid assert failed
wenyongh May 8, 2020
ff5e90b
Merge pull request #105 from bytecodealliance/master
wenyongh May 8, 2020
23af40d
Merge pull request #106 from bytecodealliance/master
wenyongh May 15, 2020
f544940
Update API comments, refine footprint of wasm loader
wenyongh May 15, 2020
5568b52
Merge pull request #107 from bytecodealliance/master
wenyongh May 15, 2020
475669d
Merge pull request #108 from bytecodealliance/master
wenyongh May 28, 2020
0cc8c99
Merge pull request #109 from bytecodealliance/master
wenyongh Jun 1, 2020
75533fa
Sync with internal feature
wenyongh Jun 2, 2020
916a86f
update gitignore and clang-format
wenyongh Jun 2, 2020
55eee4c
Merge pull request #110 from bytecodealliance/master
wenyongh Jun 2, 2020
26515b0
Merge pull request #111 from bytecodealliance/master
wenyongh Jun 8, 2020
3c8251f
Sync with internal feature
wenyongh Jun 8, 2020
3de35d5
Merge pull request #112 from bytecodealliance/master
wenyongh Jun 8, 2020
71096fd
Sync with internal feature
wenyongh Jun 11, 2020
f5909d5
Merge pull request #113 from bytecodealliance/master
wenyongh Jun 11, 2020
4c4f8da
Merge pull request #114 from bytecodealliance/master
wenyongh Jun 12, 2020
c5d6754
Merge pull request #115 from bytecodealliance/master
wenyongh Jun 15, 2020
d371e9c
Merge pull request #116 from bytecodealliance/main
wenyongh Jun 27, 2020
c062708
Sync with internal/feature
wenyongh Jun 28, 2020
21d8754
Merge pull request #117 from bytecodealliance/main
wenyongh Jun 28, 2020
16df501
Refine opcode get/set_global for interpreter
wenyongh Jun 29, 2020
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
128 changes: 67 additions & 61 deletions core/iwasm/interpreter/wasm_interp_classic.c
Original file line number Diff line number Diff line change
Expand Up @@ -974,15 +974,14 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module,
uint8 *global_data = module->global_data;
uint32 linear_mem_size = memory ? num_bytes_per_page * memory->cur_page_count : 0;
WASMTableInstance *table = module->default_table;
WASMGlobalInstance *globals = module->globals;
WASMGlobalInstance *globals = module->globals, *global;
uint8 opcode_IMPDEP = WASM_OP_IMPDEP;
WASMInterpFrame *frame = NULL;
/* Points to this special opcode so as to jump to the call_method_from_entry. */
register uint8 *frame_ip = &opcode_IMPDEP; /* cache of frame->ip */
register uint32 *frame_lp = NULL; /* cache of frame->lp */
register uint32 *frame_sp = NULL; /* cache of frame->sp */
WASMBranchBlock *frame_csp = NULL;
WASMGlobalInstance *global;
BlockAddr *cache_items;
uint8 *frame_ip_end = frame_ip + 1;
uint8 opcode, block_ret_type;
Expand All @@ -995,13 +994,6 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module,
uint32 local_idx, local_offset, global_idx;
uint8 local_type, *global_addr;
uint32 cache_index;
int32 aux_stack_top_global_idx = -1;

/* If the aux stack information is resolved,
we will check the aux stack boundary */
if (module->module->llvm_aux_stack_size) {
aux_stack_top_global_idx = module->module->llvm_aux_stack_global_index;
}

#if WASM_ENABLE_LABELS_AS_VALUES != 0
#define HANDLE_OPCODE(op) &&HANDLE_##op
Expand Down Expand Up @@ -1383,70 +1375,87 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module,
HANDLE_OP (WASM_OP_GET_GLOBAL):
{
read_leb_uint32(frame_ip, frame_ip_end, global_idx);

bh_assert(global_idx < module->global_count);
global = globals + global_idx;
global_addr =
#if WASM_ENABLE_MULTI_MODULE != 0
global->import_global_inst
? global->import_module_inst->global_data
+ global->import_global_inst->data_offset
:
#if WASM_ENABLE_MULTI_MODULE == 0
global_addr = global_data + global->data_offset;
#else
global_addr = global->import_global_inst
? global->import_module_inst->global_data
+ global->import_global_inst->data_offset
: global_data + global->data_offset;
#endif
global_data + global->data_offset;

switch (global->type) {
case VALUE_TYPE_I32:
case VALUE_TYPE_F32:
PUSH_I32(*(uint32*)global_addr);
break;
case VALUE_TYPE_I64:
case VALUE_TYPE_F64:
PUSH_I64(GET_I64_FROM_ADDR((uint32*)global_addr));
break;
default:
wasm_set_exception(module, "invalid global type");
goto got_exception;
}
PUSH_I32(*(uint32*)global_addr);
HANDLE_OP_END ();
}

HANDLE_OP (WASM_OP_GET_GLOBAL_64):
{
read_leb_uint32(frame_ip, frame_ip_end, global_idx);
bh_assert(global_idx < module->global_count);
global = globals + global_idx;
#if WASM_ENABLE_MULTI_MODULE == 0
global_addr = global_data + global->data_offset;
#else
global_addr = global->import_global_inst
? global->import_module_inst->global_data
+ global->import_global_inst->data_offset
: global_data + global->data_offset;
#endif
PUSH_I64(GET_I64_FROM_ADDR((uint32*)global_addr));
HANDLE_OP_END ();
}

HANDLE_OP (WASM_OP_SET_GLOBAL):
{
read_leb_uint32(frame_ip, frame_ip_end, global_idx);

bh_assert(global_idx < module->global_count);
global = globals + global_idx;
global_addr =
#if WASM_ENABLE_MULTI_MODULE != 0
global->import_global_inst
? global->import_module_inst->global_data
+ global->import_global_inst->data_offset
:
#if WASM_ENABLE_MULTI_MODULE == 0
global_addr = global_data + global->data_offset;
#else
global_addr = global->import_global_inst
? global->import_module_inst->global_data
+ global->import_global_inst->data_offset
: global_data + global->data_offset;
#endif
global_data + global->data_offset;
*(int32*)global_addr = POP_I32();
HANDLE_OP_END ();
}

switch (global->type) {
case VALUE_TYPE_I32:
/* Check aux stack boundary */
if ((global_idx == (uint32)aux_stack_top_global_idx)
&& (*(uint32*)(frame_sp - 1) < exec_env->aux_stack_boundary))
goto out_of_bounds;
*(int32*)global_addr = POP_I32();
break;
case VALUE_TYPE_F32:
*(int32*)global_addr = POP_I32();
break;
case VALUE_TYPE_I64:
case VALUE_TYPE_F64:
PUT_I64_TO_ADDR((uint32*)global_addr, POP_I64());
break;
default:
wasm_set_exception(module, "invalid global type");
goto got_exception;
}
HANDLE_OP (WASM_OP_SET_GLOBAL_AUX_STACK):
{
read_leb_uint32(frame_ip, frame_ip_end, global_idx);
bh_assert(global_idx < module->global_count);
global = globals + global_idx;
#if WASM_ENABLE_MULTI_MODULE == 0
global_addr = global_data + global->data_offset;
#else
global_addr = global->import_global_inst
? global->import_module_inst->global_data
+ global->import_global_inst->data_offset
: global_data + global->data_offset;
#endif
if (*(uint32*)(frame_sp - 1) < exec_env->aux_stack_boundary)
goto out_of_bounds;
*(int32*)global_addr = POP_I32();
HANDLE_OP_END ();
}

HANDLE_OP (WASM_OP_SET_GLOBAL_64):
{
read_leb_uint32(frame_ip, frame_ip_end, global_idx);
bh_assert(global_idx < module->global_count);
global = globals + global_idx;
#if WASM_ENABLE_MULTI_MODULE == 0
global_addr = global_data + global->data_offset;
#else
global_addr = global->import_global_inst
? global->import_module_inst->global_data
+ global->import_global_inst->data_offset
: global_data + global->data_offset;
#endif
PUT_I64_TO_ADDR((uint32*)global_addr, POP_I64());
HANDLE_OP_END ();
}

Expand Down Expand Up @@ -2691,9 +2700,6 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module,
HANDLE_OP (WASM_OP_UNUSED_0x1d):
HANDLE_OP (WASM_OP_UNUSED_0x1e):
HANDLE_OP (WASM_OP_UNUSED_0x1f):
HANDLE_OP (WASM_OP_UNUSED_0x25):
HANDLE_OP (WASM_OP_UNUSED_0x26):
HANDLE_OP (WASM_OP_UNUSED_0x27):
/* Used by fast interpreter */
HANDLE_OP (EXT_OP_SET_LOCAL_FAST_I64):
HANDLE_OP (EXT_OP_TEE_LOCAL_FAST_I64):
Expand Down
131 changes: 70 additions & 61 deletions core/iwasm/interpreter/wasm_interp_fast.c
Original file line number Diff line number Diff line change
Expand Up @@ -968,7 +968,7 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module,
uint8 *global_data = module->global_data;
uint32 linear_mem_size = memory ? num_bytes_per_page * memory->cur_page_count : 0;
WASMTableInstance *table = module->default_table;
WASMGlobalInstance *globals = module->globals;
WASMGlobalInstance *globals = module->globals, *global;
uint8 opcode_IMPDEP = WASM_OP_IMPDEP;
WASMInterpFrame *frame = NULL;
/* Points to this special opcode so as to jump to the call_method_from_entry. */
Expand All @@ -977,7 +977,6 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module,
#if WASM_ENABLE_ABS_LABEL_ADDR == 0
register uint8 *label_base = &&HANDLE_WASM_OP_UNREACHABLE; /* cache of label base addr */
#endif
WASMGlobalInstance *global;
uint8 *frame_ip_end;
uint32 cond, count, fidx, tidx, frame_size = 0;
uint64 all_cell_num = 0;
Expand All @@ -986,7 +985,6 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module,
uint8 *maddr = NULL;
uint32 local_idx, local_offset, global_idx;
uint8 opcode, local_type, *global_addr;
int32 aux_stack_top_global_idx = -1;

#if WASM_ENABLE_LABELS_AS_VALUES != 0
#define HANDLE_OPCODE(op) &&HANDLE_##op
Expand All @@ -1000,12 +998,6 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module,
#endif
#endif

/* If the aux stack information is resolved,
we will check the aux stack boundary */
if (module->module->llvm_aux_stack_size) {
aux_stack_top_global_idx = module->module->llvm_aux_stack_global_index;
}

#if WASM_ENABLE_LABELS_AS_VALUES == 0
while (frame_ip < frame_ip_end) {
opcode = *frame_ip++;
Expand Down Expand Up @@ -1225,72 +1217,92 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module,
HANDLE_OP (WASM_OP_GET_GLOBAL):
{
global_idx = read_uint32(frame_ip);
bh_assert(global_idx < module->global_count);
global = globals + global_idx;
#if WASM_ENABLE_MULTI_MODULE == 0
global_addr = global_data + global->data_offset;
#else
global_addr = global->import_global_inst
? global->import_module_inst->global_data
+ global->import_global_inst->data_offset
: global_data + global->data_offset;
#endif
addr_ret = GET_OFFSET();
frame_lp[addr_ret] = *(uint32*)global_addr;
HANDLE_OP_END ();
}

HANDLE_OP (WASM_OP_GET_GLOBAL_64):
{
global_idx = read_uint32(frame_ip);
bh_assert(global_idx < module->global_count);
global = globals + global_idx;
global_addr =
#if WASM_ENABLE_MULTI_MODULE != 0
global->import_global_inst
? global->import_module_inst->global_data
+ global->import_global_inst->data_offset
:
#if WASM_ENABLE_MULTI_MODULE == 0
global_addr = global_data + global->data_offset;
#else
global_addr = global->import_global_inst
? global->import_module_inst->global_data
+ global->import_global_inst->data_offset
: global_data + global->data_offset;
#endif
global_data + global->data_offset;

switch (global->type) {
case VALUE_TYPE_I32:
case VALUE_TYPE_F32:
frame_lp[addr_ret] = *(uint32*)global_addr;
break;
case VALUE_TYPE_I64:
case VALUE_TYPE_F64:
*(uint64 *)(frame_lp + addr_ret) = GET_I64_FROM_ADDR((uint32*)global_addr);
break;
default:
wasm_set_exception(module, "invalid global type");
goto got_exception;
}

addr_ret = GET_OFFSET();
*(uint64 *)(frame_lp + addr_ret) = GET_I64_FROM_ADDR((uint32*)global_addr);
HANDLE_OP_END ();
}

HANDLE_OP (WASM_OP_SET_GLOBAL):
{
global_idx = read_uint32(frame_ip);
bh_assert(global_idx < module->global_count);
global = globals + global_idx;
#if WASM_ENABLE_MULTI_MODULE == 0
global_addr = global_data + global->data_offset;
#else
global_addr = global->import_global_inst
? global->import_module_inst->global_data
+ global->import_global_inst->data_offset
: global_data + global->data_offset;
#endif
addr1 = GET_OFFSET();
*(int32*)global_addr = frame_lp[addr1];
HANDLE_OP_END ();
}

HANDLE_OP (WASM_OP_SET_GLOBAL_AUX_STACK):
{
global_idx = read_uint32(frame_ip);
bh_assert(global_idx < module->global_count);
global = globals + global_idx;
global_addr =
#if WASM_ENABLE_MULTI_MODULE != 0
global->import_global_inst
? global->import_module_inst->global_data
+ global->import_global_inst->data_offset
:
#if WASM_ENABLE_MULTI_MODULE == 0
global_addr = global_data + global->data_offset;
#else
global_addr = global->import_global_inst
? global->import_module_inst->global_data
+ global->import_global_inst->data_offset
: global_data + global->data_offset;
#endif
global_data + global->data_offset;

switch (global->type) {
case VALUE_TYPE_I32:
/* Check aux stack boundary */
if ((global_idx == (uint32)aux_stack_top_global_idx)
&& (frame_lp[addr1] < exec_env->aux_stack_boundary))
goto out_of_bounds;
*(int32*)global_addr = frame_lp[addr1];
break;
case VALUE_TYPE_F32:
*(int32*)global_addr = frame_lp[addr1];
break;
case VALUE_TYPE_I64:
case VALUE_TYPE_F64:
PUT_I64_TO_ADDR((uint32*)global_addr, *(int64 *)(frame_lp + addr1));
break;
default:
wasm_set_exception(module, "invalid global type");
goto got_exception;
}
addr1 = GET_OFFSET();
if (frame_lp[addr1] < exec_env->aux_stack_boundary)
goto out_of_bounds;
*(int32*)global_addr = frame_lp[addr1];
HANDLE_OP_END ();
}

HANDLE_OP (WASM_OP_SET_GLOBAL_64):
{
global_idx = read_uint32(frame_ip);
bh_assert(global_idx < module->global_count);
global = globals + global_idx;
#if WASM_ENABLE_MULTI_MODULE == 0
global_addr = global_data + global->data_offset;
#else
global_addr = global->import_global_inst
? global->import_module_inst->global_data
+ global->import_global_inst->data_offset
: global_data + global->data_offset;
#endif
addr1 = GET_OFFSET();
PUT_I64_TO_ADDR((uint32*)global_addr, *(int64 *)(frame_lp + addr1));
HANDLE_OP_END ();
}

Expand Down Expand Up @@ -2538,9 +2550,6 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module,
HANDLE_OP (WASM_OP_UNUSED_0x1d):
HANDLE_OP (WASM_OP_UNUSED_0x1e):
HANDLE_OP (WASM_OP_UNUSED_0x1f):
HANDLE_OP (WASM_OP_UNUSED_0x25):
HANDLE_OP (WASM_OP_UNUSED_0x26):
HANDLE_OP (WASM_OP_UNUSED_0x27):
/* optimized op code */
HANDLE_OP (WASM_OP_F32_STORE):
HANDLE_OP (WASM_OP_F64_STORE):
Expand Down
Loading