diff --git a/.github/workflows/compilation_on_nuttx.yml b/.github/workflows/compilation_on_nuttx.yml
new file mode 100644
index 00000000..02392a90
--- /dev/null
+++ b/.github/workflows/compilation_on_nuttx.yml
@@ -0,0 +1,113 @@
+# Copyright (C) 2019 Intel Corporation. All rights reserved.
+# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+
+name: compilation on nuttx
+
+on:
+ # will be triggered on PR events
+ pull_request:
+ paths-ignore:
+ - "assembly-script/**"
+ - "ci/**"
+ - "doc/**"
+ - "test-tools/**"
+ # will be triggered on push events
+ push:
+ paths-ignore:
+ - "assembly-script/**"
+ - "ci/**"
+ - "doc/**"
+ - "test-tools/**"
+ # allow to be triggered manually
+ workflow_dispatch:
+
+# Cancel any in-flight jobs for the same PR/branch so there's only one active
+# at a time
+concurrency:
+ group: ${{ github.workflow }}-${{ github.ref }}
+ cancel-in-progress: true
+
+jobs:
+ # Cancel any in-flight jobs for the same PR/branch so there's only one active
+ # at a time
+ cancel_previous:
+ runs-on: ubuntu-22.04
+ steps:
+ - name: Cancel Workflow Action
+ uses: styfle/cancel-workflow-action@0.9.1
+ with:
+ access_token: ${{ github.token }}
+
+ build_iwasm_on_nuttx:
+ runs-on: ubuntu-22.04
+ strategy:
+ matrix:
+ nuttx_board_config : [
+ # x64
+ "boards/sim/sim/sim/configs/nsh",
+ # cortex-m0
+ "boards/arm/rp2040/raspberrypi-pico/configs/nsh",
+ # cortex-m4
+ "boards/arm/stm32/stm32f4discovery/configs/nsh",
+ # cortex-m7
+ "boards/arm/stm32h7/nucleo-h743zi/configs/nsh",
+ # cortex-a9
+ "boards/arm/imx6/sabre-6quad/configs/nsh",
+ # riscv32imac
+ "boards/risc-v/qemu-rv/rv-virt/configs/nsh",
+ # riscv64imac
+ "boards/risc-v/qemu-rv/rv-virt/configs/nsh64",
+ # riscv64gc
+ "boards/risc-v/k210/maix-bit/configs/nsh",
+ ]
+ wamr_config_option: [
+ "CONFIG_INTERPRETERS_WAMR=y\\nCONFIG_INTERPRETERS_WAMR_AOT=y\\nCONFIG_INTERPRETERS_WAMR_FAST=y\\nCONFIG_INTERPRETERS_WAMR_LIBC_BUILTIN=y\\n",
+ "CONFIG_INTERPRETERS_WAMR=y\\nCONFIG_INTERPRETERS_WAMR_AOT=y\\nCONFIG_INTERPRETERS_WAMR_FAST=y\\n",
+ "CONFIG_INTERPRETERS_WAMR=y\\nCONFIG_INTERPRETERS_WAMR_AOT=y\\nCONFIG_INTERPRETERS_WAMR_CLASSIC=y\\n",
+ "CONFIG_INTERPRETERS_WAMR=y\\nCONFIG_INTERPRETERS_WAMR_AOT=y\\nCONFIG_INTERPRETERS_WAMR_LIBC_BUILTIN=y\\n",
+ "CONFIG_INTERPRETERS_WAMR=y\\nCONFIG_INTERPRETERS_WAMR_AOT=y\\n",
+ "CONFIG_INTERPRETERS_WAMR=y\\nCONFIG_INTERPRETERS_WAMR_FAST=y\\n",
+ "CONFIG_INTERPRETERS_WAMR=y\\nCONFIG_INTERPRETERS_WAMR_CLASSIC=y\\n",
+ ]
+
+ steps:
+ - name: Install Utilities
+ run: sudo apt install -y kconfig-frontends-nox genromfs
+
+ - name: Install ARM Compilers
+ if: ${{ contains(matrix.nuttx_board_config, 'arm') }}
+ run: sudo apt install -y gcc-arm-none-eabi
+
+ - name: Install RISC-V Compilers
+ if: ${{ contains(matrix.nuttx_board_config, 'risc-v') }}
+ run: sudo apt install -y gcc-riscv64-unknown-elf
+
+ - name: Checkout NuttX
+ uses: actions/checkout@v3
+ with:
+ repository: apache/incubator-nuttx
+ path: nuttx
+
+ - name: Checkout NuttX Apps
+ uses: actions/checkout@v3
+ with:
+ repository: apache/incubator-nuttx-apps
+ path: apps
+
+ - name: Checkout WAMR
+ uses: actions/checkout@v3
+ with:
+ repository: ${{ github.repository }}
+ path: apps/interpreters/wamr/wamr
+
+ - name: Enable WAMR for NuttX
+ run: |
+ find nuttx/boards -name defconfig | xargs sed -i '$a\CONFIG_EOL_IS_CR=y\n${{ matrix.wamr_config_option }}'
+ find nuttx/boards/sim -name defconfig | xargs sed -i '$a\CONFIG_LIBM=y\n'
+ find nuttx/boards/risc-v -name defconfig | xargs sed -i '$a\CONFIG_LIBM=y\n'
+
+ - name: Build
+ run: |
+ cd nuttx
+ tools/configure.sh ${{ matrix.nuttx_board_config }}
+ make -j$(nproc)
diff --git a/README.md b/README.md
index b8bb0897..7f419ec3 100644
--- a/README.md
+++ b/README.md
@@ -45,6 +45,7 @@ iwasm VM core
- [WAMR-IDE (Experimental)](./test-tools/wamr-ide) to develop WebAssembly applications with build, run and debug support, ref to [document](./test-tools/wamr-ide)
- [XIP (Execution In Place) support](./doc/xip.md), ref to [document](./doc/xip.md)
- [Berkeley/Posix Socket support](./doc/socket_api.md), ref to [document](./doc/socket_api.md) and [sample](./samples/socket-api)
+- Language bindings: [Go](./language-bindings/go/README.md), [Python](./language-bindings/python/README.md)
### WASM post-MVP features
- [wasm-c-api](https://github.com/WebAssembly/wasm-c-api), ref to [document](doc/wasm_c_api.md) and [sample](samples/wasm-c-api)
@@ -158,6 +159,7 @@ The WAMR [samples](./samples) integrate the iwasm VM core, application manager a
- **[wasm-c-api](./samples/wasm-c-api/README.md)**: Demonstrating how to run some samples from [wasm-c-api proposal](https://github.com/WebAssembly/wasm-c-api) and showing the supported API's.
- **[socket-api](./samples/socket-api/README.md)**: Demonstrating how to run wasm tcp server and tcp client applications, and how they communicate with each other.
- **[workload](./samples/workload/README.md)**: Demonstrating how to build and run some complex workloads, e.g. tensorflow-lite, XNNPACK, wasm-av1, meshoptimizer and bwa.
+- **[sgx-ra](./samples/sgx-ra/README.md)**: Demonstrating how to execute Remote Attestation on SGX with [librats](https://github.com/inclavare-containers/librats), which enables mutual attestation with other runtimes or other entities that support librats to ensure that each is running within the TEE.
Project Technical Steering Committee
diff --git a/build-scripts/config_common.cmake b/build-scripts/config_common.cmake
index 84b7e2bf..8d99b93a 100644
--- a/build-scripts/config_common.cmake
+++ b/build-scripts/config_common.cmake
@@ -215,6 +215,9 @@ endif ()
if (WAMR_BUILD_LIBC_EMCC EQUAL 1)
message (" Libc emcc enabled")
endif ()
+if (WAMR_BUILD_LIB_RATS EQUAL 1)
+ message (" Lib rats enabled")
+endif()
if (WAMR_BUILD_MINI_LOADER EQUAL 1)
add_definitions (-DWASM_ENABLE_MINI_LOADER=1)
message (" WASM mini loader enabled")
diff --git a/build-scripts/runtime_lib.cmake b/build-scripts/runtime_lib.cmake
index 75fb6913..967aa344 100644
--- a/build-scripts/runtime_lib.cmake
+++ b/build-scripts/runtime_lib.cmake
@@ -118,6 +118,10 @@ if (WAMR_BUILD_LIBC_EMCC EQUAL 1)
include (${IWASM_DIR}/libraries/libc-emcc/libc_emcc.cmake)
endif ()
+if (WAMR_BUILD_LIB_RATS EQUAL 1)
+ include (${IWASM_DIR}/libraries/lib-rats/lib_rats.cmake)
+endif ()
+
####################### Common sources #######################
if (NOT MSVC)
set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=gnu99 -ffunction-sections -fdata-sections \
@@ -159,6 +163,7 @@ set (source_all
${LIB_PTHREAD_SOURCE}
${THREAD_MGR_SOURCE}
${LIBC_EMCC_SOURCE}
+ ${LIB_RATS_SOURCE}
${DEBUG_ENGINE_SOURCE}
)
diff --git a/core/config.h b/core/config.h
index 6b4392b7..728bdc7e 100644
--- a/core/config.h
+++ b/core/config.h
@@ -135,6 +135,10 @@
#define WASM_ENABLE_LIBC_EMCC 0
#endif
+#ifndef WASM_ENABLE_LIB_RATS
+#define WASM_ENABLE_LIB_RATS 0
+#endif
+
#ifndef WASM_ENABLE_LIB_PTHREAD
#define WASM_ENABLE_LIB_PTHREAD 0
#endif
@@ -272,6 +276,30 @@
#define BH_ENABLE_GC_VERIFY 0
#endif
+/* Enable global heap pool if heap verification is enabled */
+#if BH_ENABLE_GC_VERIFY != 0
+#define WASM_ENABLE_GLOBAL_HEAP_POOL 1
+#endif
+
+/* Global heap pool */
+#ifndef WASM_ENABLE_GLOBAL_HEAP_POOL
+#define WASM_ENABLE_GLOBAL_HEAP_POOL 0
+#endif
+
+#ifndef WASM_ENABLE_SPEC_TEST
+#define WASM_ENABLE_SPEC_TEST 0
+#endif
+
+/* Global heap pool size in bytes */
+#ifndef WASM_GLOBAL_HEAP_SIZE
+#if WASM_ENABLE_SPEC_TEST != 0
+/* Spec test requires more heap pool size */
+#define WASM_GLOBAL_HEAP_SIZE (300 * 1024 * 1024)
+#else
+#define WASM_GLOBAL_HEAP_SIZE (10 * 1024 * 1024)
+#endif
+#endif
+
/* Max app number of all modules */
#define MAX_APP_INSTALLATIONS 3
@@ -363,10 +391,6 @@
#endif
#define BLOCK_ADDR_CONFLICT_SIZE 2
-#ifndef WASM_ENABLE_SPEC_TEST
-#define WASM_ENABLE_SPEC_TEST 0
-#endif
-
/* Default max thread num per cluster. Can be overwrite by
wasm_runtime_set_max_thread_num */
#define CLUSTER_MAX_THREAD_NUM 4
diff --git a/core/iwasm/aot/aot_runtime.c b/core/iwasm/aot/aot_runtime.c
index 84fc09bd..f36051a9 100644
--- a/core/iwasm/aot/aot_runtime.c
+++ b/core/iwasm/aot/aot_runtime.c
@@ -412,18 +412,27 @@ memory_instantiate(AOTModuleInstance *module_inst, AOTModule *module,
if (init_page_count == max_page_count && init_page_count == 1) {
/* If only one page and at most one page, we just append
the app heap to the end of linear memory, enlarge the
- num_bytes_per_page, and don't change the page count*/
+ num_bytes_per_page, and don't change the page count */
heap_offset = num_bytes_per_page;
num_bytes_per_page += heap_size;
if (num_bytes_per_page < heap_size) {
set_error_buf(error_buf, error_buf_size,
- "memory size must be at most 65536 pages (4GiB)");
+ "failed to insert app heap into linear memory, "
+ "try using `--heap_size=0` option");
return NULL;
}
}
else if (heap_size > 0) {
- if (module->aux_heap_base_global_index != (uint32)-1
- && module->aux_heap_base < num_bytes_per_page * init_page_count) {
+ if (init_page_count == max_page_count && init_page_count == 0) {
+ /* If the memory data size is always 0, we resize it to
+ one page for app heap */
+ num_bytes_per_page = heap_size;
+ heap_offset = 0;
+ inc_page_count = 1;
+ }
+ else if (module->aux_heap_base_global_index != (uint32)-1
+ && module->aux_heap_base
+ < num_bytes_per_page * init_page_count) {
/* Insert app heap before __heap_base */
aux_heap_base = module->aux_heap_base;
bytes_of_last_page = aux_heap_base % num_bytes_per_page;
@@ -464,13 +473,18 @@ memory_instantiate(AOTModuleInstance *module_inst, AOTModule *module,
}
init_page_count += inc_page_count;
max_page_count += inc_page_count;
- if (init_page_count > 65536) {
+ if (init_page_count > DEFAULT_MAX_PAGES) {
set_error_buf(error_buf, error_buf_size,
- "memory size must be at most 65536 pages (4GiB)");
+ "failed to insert app heap into linear memory, "
+ "try using `--heap_size=0` option");
return NULL;
}
- if (max_page_count > 65536)
- max_page_count = 65536;
+ else if (init_page_count == DEFAULT_MAX_PAGES) {
+ num_bytes_per_page = UINT32_MAX;
+ init_page_count = max_page_count = 1;
+ }
+ if (max_page_count > DEFAULT_MAX_PAGES)
+ max_page_count = DEFAULT_MAX_PAGES;
}
LOG_VERBOSE("Memory instantiate:");
@@ -487,6 +501,7 @@ memory_instantiate(AOTModuleInstance *module_inst, AOTModule *module,
total_size = (uint64)num_bytes_per_page * max_page_count;
}
#endif
+ bh_assert(total_size <= UINT32_MAX);
#ifndef OS_ENABLE_HW_BOUND_CHECK
/* Allocate memory */
@@ -502,9 +517,8 @@ memory_instantiate(AOTModuleInstance *module_inst, AOTModule *module,
* both i and memarg.offset are u32 in range 0 to 4G
* so the range of ea is 0 to 8G
*/
- if (total_size >= UINT32_MAX
- || !(p = mapped_mem =
- os_mmap(NULL, map_size, MMAP_PROT_NONE, MMAP_MAP_NONE))) {
+ if (!(p = mapped_mem =
+ os_mmap(NULL, map_size, MMAP_PROT_NONE, MMAP_MAP_NONE))) {
set_error_buf(error_buf, error_buf_size, "mmap memory failed");
return NULL;
}
@@ -529,15 +543,18 @@ memory_instantiate(AOTModuleInstance *module_inst, AOTModule *module,
* again here */
#endif /* end of OS_ENABLE_HW_BOUND_CHECK */
+ if (total_size > UINT32_MAX)
+ total_size = UINT32_MAX;
+
memory_inst->module_type = Wasm_Module_AoT;
memory_inst->num_bytes_per_page = num_bytes_per_page;
memory_inst->cur_page_count = init_page_count;
memory_inst->max_page_count = max_page_count;
+ memory_inst->memory_data_size = (uint32)total_size;
/* Init memory info */
memory_inst->memory_data.ptr = p;
memory_inst->memory_data_end.ptr = p + (uint32)total_size;
- memory_inst->memory_data_size = (uint32)total_size;
/* Initialize heap info */
memory_inst->heap_data.ptr = p + heap_offset;
@@ -561,21 +578,19 @@ memory_instantiate(AOTModuleInstance *module_inst, AOTModule *module,
}
if (total_size > 0) {
- if (sizeof(uintptr_t) == sizeof(uint64)) {
- memory_inst->mem_bound_check_1byte.u64 = total_size - 1;
- memory_inst->mem_bound_check_2bytes.u64 = total_size - 2;
- memory_inst->mem_bound_check_4bytes.u64 = total_size - 4;
- memory_inst->mem_bound_check_8bytes.u64 = total_size - 8;
- memory_inst->mem_bound_check_16bytes.u64 = total_size - 16;
- }
- else {
- memory_inst->mem_bound_check_1byte.u32[0] = (uint32)total_size - 1;
- memory_inst->mem_bound_check_2bytes.u32[0] = (uint32)total_size - 2;
- memory_inst->mem_bound_check_4bytes.u32[0] = (uint32)total_size - 4;
- memory_inst->mem_bound_check_8bytes.u32[0] = (uint32)total_size - 8;
- memory_inst->mem_bound_check_16bytes.u32[0] =
- (uint32)total_size - 16;
- }
+#if UINTPTR_MAX == UINT64_MAX
+ memory_inst->mem_bound_check_1byte.u64 = total_size - 1;
+ memory_inst->mem_bound_check_2bytes.u64 = total_size - 2;
+ memory_inst->mem_bound_check_4bytes.u64 = total_size - 4;
+ memory_inst->mem_bound_check_8bytes.u64 = total_size - 8;
+ memory_inst->mem_bound_check_16bytes.u64 = total_size - 16;
+#else
+ memory_inst->mem_bound_check_1byte.u32[0] = (uint32)total_size - 1;
+ memory_inst->mem_bound_check_2bytes.u32[0] = (uint32)total_size - 2;
+ memory_inst->mem_bound_check_4bytes.u32[0] = (uint32)total_size - 4;
+ memory_inst->mem_bound_check_8bytes.u32[0] = (uint32)total_size - 8;
+ memory_inst->mem_bound_check_16bytes.u32[0] = (uint32)total_size - 16;
+#endif
}
#if WASM_ENABLE_SHARED_MEMORY != 0
@@ -1470,7 +1485,8 @@ aot_call_function(WASMExecEnv *exec_env, AOTFunctionInstance *function,
#if (WASM_ENABLE_DUMP_CALL_STACK != 0) || (WASM_ENABLE_PERF_PROFILING != 0)
if (!aot_alloc_frame(exec_env, function->func_index)) {
- wasm_runtime_free(argv1);
+ if (argv1 != argv1_buf)
+ wasm_runtime_free(argv1);
return false;
}
#endif
@@ -1479,9 +1495,6 @@ aot_call_function(WASMExecEnv *exec_env, AOTFunctionInstance *function,
func_type, NULL, NULL, argv1, argc, argv);
if (!ret || aot_get_exception(module_inst)) {
- if (argv1 != argv1_buf)
- wasm_runtime_free(argv1);
-
if (clear_wasi_proc_exit_exception(module_inst))
ret = true;
else
@@ -1499,8 +1512,11 @@ aot_call_function(WASMExecEnv *exec_env, AOTFunctionInstance *function,
#if (WASM_ENABLE_DUMP_CALL_STACK != 0) || (WASM_ENABLE_PERF_PROFILING != 0)
aot_free_frame(exec_env);
#endif
- if (!ret)
+ if (!ret) {
+ if (argv1 != argv1_buf)
+ wasm_runtime_free(argv1);
return ret;
+ }
/* Get extra result values */
switch (func_type->types[func_type->param_count]) {
@@ -1529,9 +1545,9 @@ aot_call_function(WASMExecEnv *exec_env, AOTFunctionInstance *function,
argv1 + argc + sizeof(void *) / sizeof(uint32) * ext_ret_count;
bh_memcpy_s(argv_ret, sizeof(uint32) * cell_num, ext_rets,
sizeof(uint32) * cell_num);
+
if (argv1 != argv1_buf)
wasm_runtime_free(argv1);
-
return true;
}
else {
@@ -2034,26 +2050,29 @@ aot_get_native_addr_range(AOTModuleInstance *module_inst, uint8 *native_ptr,
bool
aot_enlarge_memory(AOTModuleInstance *module_inst, uint32 inc_page_count)
{
- AOTMemoryInstance *memory_inst = aot_get_default_memory(module_inst);
- uint32 num_bytes_per_page, cur_page_count, max_page_count;
- uint32 total_page_count, total_size_old, heap_size;
- uint64 total_size;
- uint8 *memory_data_old, *heap_data_old, *memory_data, *heap_data;
+ AOTMemoryInstance *memory = aot_get_default_memory(module_inst);
+ uint8 *memory_data_old, *memory_data_new, *heap_data_old;
+ uint32 num_bytes_per_page, heap_size, total_size_old;
+ uint32 cur_page_count, max_page_count, total_page_count;
+ uint64 total_size_new;
bool ret = true;
- if (!memory_inst)
+ if (!memory)
return false;
- num_bytes_per_page = memory_inst->num_bytes_per_page;
- cur_page_count = memory_inst->cur_page_count;
- max_page_count = memory_inst->max_page_count;
- total_page_count = cur_page_count + inc_page_count;
- total_size_old = memory_inst->memory_data_size;
- total_size = (uint64)num_bytes_per_page * total_page_count;
- heap_size = (uint32)((uint8 *)memory_inst->heap_data_end.ptr
- - (uint8 *)memory_inst->heap_data.ptr);
- memory_data_old = (uint8 *)memory_inst->memory_data.ptr;
- heap_data_old = (uint8 *)memory_inst->heap_data.ptr;
+ heap_data_old = (uint8 *)memory->heap_data.ptr;
+ heap_size = (uint32)((uint8 *)memory->heap_data_end.ptr
+ - (uint8 *)memory->heap_data.ptr);
+
+ memory_data_old = (uint8 *)memory->memory_data.ptr;
+ total_size_old =
+ (uint32)((uint8 *)memory->memory_data_end.ptr - memory_data_old);
+
+ num_bytes_per_page = memory->num_bytes_per_page;
+ cur_page_count = memory->cur_page_count;
+ max_page_count = memory->max_page_count;
+ total_page_count = inc_page_count + cur_page_count;
+ total_size_new = num_bytes_per_page * (uint64)total_page_count;
if (inc_page_count <= 0)
/* No need to enlarge memory */
@@ -2064,94 +2083,103 @@ aot_enlarge_memory(AOTModuleInstance *module_inst, uint32 inc_page_count)
return false;
}
- if (total_size >= UINT32_MAX) {
- return false;
+ bh_assert(total_size_new <= 4 * (uint64)BH_GB);
+ if (total_size_new > UINT32_MAX) {
+ /* Resize to 1 page with size 4G-1 */
+ num_bytes_per_page = UINT32_MAX;
+ total_page_count = max_page_count = 1;
+ total_size_new = UINT32_MAX;
}
#if WASM_ENABLE_SHARED_MEMORY != 0
- if (memory_inst->is_shared) {
- /* For shared memory, we have reserved the maximum spaces during
- instantiate, only change the cur_page_count here */
- memory_inst->cur_page_count = total_page_count;
+ if (memory->is_shared) {
+ memory->num_bytes_per_page = UINT32_MAX;
+ memory->cur_page_count = total_page_count;
+ memory->max_page_count = max_page_count;
+ memory->memory_data_size = (uint32)total_size_new;
return true;
}
#endif
if (heap_size > 0) {
- if (mem_allocator_is_heap_corrupted(memory_inst->heap_handle.ptr)) {
+ if (mem_allocator_is_heap_corrupted(memory->heap_handle.ptr)) {
wasm_runtime_show_app_heap_corrupted_prompt();
return false;
}
}
- if (!(memory_data =
- wasm_runtime_realloc(memory_data_old, (uint32)total_size))) {
- if (!(memory_data = wasm_runtime_malloc((uint32)total_size))) {
+ if (!(memory_data_new =
+ wasm_runtime_realloc(memory_data_old, (uint32)total_size_new))) {
+ if (!(memory_data_new = wasm_runtime_malloc((uint32)total_size_new))) {
return false;
}
if (memory_data_old) {
- bh_memcpy_s(memory_data, (uint32)total_size, memory_data_old,
- total_size_old);
+ bh_memcpy_s(memory_data_new, (uint32)total_size_new,
+ memory_data_old, total_size_old);
wasm_runtime_free(memory_data_old);
}
}
- memset(memory_data + total_size_old, 0,
- (uint32)total_size - total_size_old);
-
- memory_inst->cur_page_count = total_page_count;
- memory_inst->memory_data_size = (uint32)total_size;
- memory_inst->memory_data.ptr = memory_data;
- memory_inst->memory_data_end.ptr = memory_data + total_size;
+ memset(memory_data_new + total_size_old, 0,
+ (uint32)total_size_new - total_size_old);
if (heap_size > 0) {
- if (mem_allocator_migrate(memory_inst->heap_handle.ptr,
+ if (mem_allocator_migrate(memory->heap_handle.ptr,
(char *)heap_data_old
- + (memory_data - memory_data_old),
- heap_size)) {
+ + (memory_data_new - memory_data_old),
+ heap_size)
+ != 0) {
/* Don't return here as memory->memory_data is obsolete and
must be updated to be correctly used later. */
ret = false;
}
}
- heap_data = memory_data + (heap_data_old - memory_data_old);
- memory_inst->heap_data.ptr = heap_data;
- memory_inst->heap_data_end.ptr = heap_data + heap_size;
+ memory->heap_data.ptr = memory_data_new + (heap_data_old - memory_data_old);
+ memory->heap_data_end.ptr = (uint8 *)memory->heap_data.ptr + heap_size;
+
+ memory->num_bytes_per_page = num_bytes_per_page;
+ memory->cur_page_count = total_page_count;
+ memory->max_page_count = max_page_count;
+
+ memory->memory_data.ptr = memory_data_new;
+ memory->memory_data_end.ptr = memory_data_new + (uint32)total_size_new;
+ memory->memory_data_size = (uint32)total_size_new;
+
+#if UINTPTR_MAX == UINT64_MAX
+ memory->mem_bound_check_1byte.u64 = total_size_new - 1;
+ memory->mem_bound_check_2bytes.u64 = total_size_new - 2;
+ memory->mem_bound_check_4bytes.u64 = total_size_new - 4;
+ memory->mem_bound_check_8bytes.u64 = total_size_new - 8;
+ memory->mem_bound_check_16bytes.u64 = total_size_new - 16;
+#else
+ memory->mem_bound_check_1byte.u32[0] = (uint32)total_size_new - 1;
+ memory->mem_bound_check_2bytes.u32[0] = (uint32)total_size_new - 2;
+ memory->mem_bound_check_4bytes.u32[0] = (uint32)total_size_new - 4;
+ memory->mem_bound_check_8bytes.u32[0] = (uint32)total_size_new - 8;
+ memory->mem_bound_check_16bytes.u32[0] = (uint32)total_size_new - 16;
+#endif
- if (sizeof(uintptr_t) == sizeof(uint64)) {
- memory_inst->mem_bound_check_1byte.u64 = total_size - 1;
- memory_inst->mem_bound_check_2bytes.u64 = total_size - 2;
- memory_inst->mem_bound_check_4bytes.u64 = total_size - 4;
- memory_inst->mem_bound_check_8bytes.u64 = total_size - 8;
- memory_inst->mem_bound_check_16bytes.u64 = total_size - 16;
- }
- else {
- memory_inst->mem_bound_check_1byte.u32[0] = (uint32)total_size - 1;
- memory_inst->mem_bound_check_2bytes.u32[0] = (uint32)total_size - 2;
- memory_inst->mem_bound_check_4bytes.u32[0] = (uint32)total_size - 4;
- memory_inst->mem_bound_check_8bytes.u32[0] = (uint32)total_size - 8;
- memory_inst->mem_bound_check_16bytes.u32[0] = (uint32)total_size - 16;
- }
return ret;
}
#else /* else of OS_ENABLE_HW_BOUND_CHECK */
bool
aot_enlarge_memory(AOTModuleInstance *module_inst, uint32 inc_page_count)
{
- AOTMemoryInstance *memory_inst = aot_get_default_memory(module_inst);
- uint32 num_bytes_per_page, cur_page_count, max_page_count;
- uint32 total_page_count;
- uint64 total_size;
+ AOTMemoryInstance *memory = aot_get_default_memory(module_inst);
+ uint32 num_bytes_per_page, total_size_old;
+ uint32 cur_page_count, max_page_count, total_page_count;
+ uint64 total_size_new;
- if (!memory_inst)
+ if (!memory)
return false;
- num_bytes_per_page = memory_inst->num_bytes_per_page;
- cur_page_count = memory_inst->cur_page_count;
- max_page_count = memory_inst->max_page_count;
- total_page_count = cur_page_count + inc_page_count;
- total_size = (uint64)num_bytes_per_page * total_page_count;
+ num_bytes_per_page = memory->num_bytes_per_page;
+ cur_page_count = memory->cur_page_count;
+ max_page_count = memory->max_page_count;
+ total_size_old = num_bytes_per_page * cur_page_count;
+ total_page_count = inc_page_count + cur_page_count;
+ total_size_new = num_bytes_per_page * (uint64)total_page_count;
if (inc_page_count <= 0)
/* No need to enlarge memory */
@@ -2162,21 +2190,29 @@ aot_enlarge_memory(AOTModuleInstance *module_inst, uint32 inc_page_count)
return false;
}
+ bh_assert(total_size_new <= 4 * (uint64)BH_GB);
+ if (total_size_new > UINT32_MAX) {
+ /* Resize to 1 page with size 4G-1 */
+ num_bytes_per_page = UINT32_MAX;
+ total_page_count = max_page_count = 1;
+ total_size_new = UINT32_MAX;
+ }
+
#ifdef BH_PLATFORM_WINDOWS
- if (!os_mem_commit(memory_inst->memory_data_end.ptr,
- num_bytes_per_page * inc_page_count,
+ if (!os_mem_commit(memory->memory_data_end.ptr,
+ (uint32)total_size_new - total_size_old,
MMAP_PROT_READ | MMAP_PROT_WRITE)) {
return false;
}
#endif
- if (os_mprotect(memory_inst->memory_data_end.ptr,
- num_bytes_per_page * inc_page_count,
+ if (os_mprotect(memory->memory_data_end.ptr,
+ (uint32)total_size_new - total_size_old,
MMAP_PROT_READ | MMAP_PROT_WRITE)
!= 0) {
#ifdef BH_PLATFORM_WINDOWS
- os_mem_decommit(memory_inst->memory_data_end.ptr,
- num_bytes_per_page * inc_page_count);
+ os_mem_decommit(memory->memory_data_end.ptr,
+ (uint32)total_size_new - total_size_old);
#endif
return false;
}
@@ -2184,25 +2220,19 @@ aot_enlarge_memory(AOTModuleInstance *module_inst, uint32 inc_page_count)
/* The increased pages are filled with zero by the OS when os_mmap,
no need to memset it again here */
- memory_inst->cur_page_count = total_page_count;
- memory_inst->memory_data_size = (uint32)total_size;
- memory_inst->memory_data_end.ptr =
- (uint8 *)memory_inst->memory_data.ptr + (uint32)total_size;
+ memory->num_bytes_per_page = num_bytes_per_page;
+ memory->cur_page_count = total_page_count;
+ memory->max_page_count = max_page_count;
+ memory->memory_data_size = (uint32)total_size_new;
+ memory->memory_data_end.ptr =
+ (uint8 *)memory->memory_data.ptr + (uint32)total_size_new;
+
+ memory->mem_bound_check_1byte.u64 = total_size_new - 1;
+ memory->mem_bound_check_2bytes.u64 = total_size_new - 2;
+ memory->mem_bound_check_4bytes.u64 = total_size_new - 4;
+ memory->mem_bound_check_8bytes.u64 = total_size_new - 8;
+ memory->mem_bound_check_16bytes.u64 = total_size_new - 16;
- if (sizeof(uintptr_t) == sizeof(uint64)) {
- memory_inst->mem_bound_check_1byte.u64 = total_size - 1;
- memory_inst->mem_bound_check_2bytes.u64 = total_size - 2;
- memory_inst->mem_bound_check_4bytes.u64 = total_size - 4;
- memory_inst->mem_bound_check_8bytes.u64 = total_size - 8;
- memory_inst->mem_bound_check_16bytes.u64 = total_size - 16;
- }
- else {
- memory_inst->mem_bound_check_1byte.u32[0] = (uint32)total_size - 1;
- memory_inst->mem_bound_check_2bytes.u32[0] = (uint32)total_size - 2;
- memory_inst->mem_bound_check_4bytes.u32[0] = (uint32)total_size - 4;
- memory_inst->mem_bound_check_8bytes.u32[0] = (uint32)total_size - 8;
- memory_inst->mem_bound_check_16bytes.u32[0] = (uint32)total_size - 16;
- }
return true;
}
#endif /* end of OS_ENABLE_HW_BOUND_CHECK */
diff --git a/core/iwasm/aot/arch/aot_reloc_arc.c b/core/iwasm/aot/arch/aot_reloc_arc.c
index 031d4b99..33296299 100644
--- a/core/iwasm/aot/arch/aot_reloc_arc.c
+++ b/core/iwasm/aot/arch/aot_reloc_arc.c
@@ -53,6 +53,17 @@ void __subsf3();
void __truncdfsf2();
void __floatunsisf();
void __fixunsdfsi();
+void __floatdisf();
+void __floatdidf();
+void __fixdfdi();
+void __ltsf2();
+void __gesf2();
+void __eqdf2();
+void __nedf2();
+void __ltsf2();
+void __nesf2();
+void __unordsf2();
+void __fixunssfsi();
#else
void __ac_push_13_to_13();
void __ac_push_13_to_14();
@@ -162,6 +173,17 @@ static SymbolMap target_sym_map[] = {
REG_SYM(__truncdfsf2),
REG_SYM(__floatunsisf),
REG_SYM(__fixunsdfsi),
+ REG_SYM(__floatdisf),
+ REG_SYM(__floatdidf),
+ REG_SYM(__fixdfdi),
+ REG_SYM(__ltsf2),
+ REG_SYM(__gesf2),
+ REG_SYM(__eqdf2),
+ REG_SYM(__nedf2),
+ REG_SYM(__ltsf2),
+ REG_SYM(__nesf2),
+ REG_SYM(__unordsf2),
+ REG_SYM(__fixunssfsi),
#else
REG_SYM(__ac_push_13_to_13),
REG_SYM(__ac_push_13_to_14),
diff --git a/core/iwasm/aot/arch/aot_reloc_thumb.c b/core/iwasm/aot/arch/aot_reloc_thumb.c
index bfcf4233..627f334b 100644
--- a/core/iwasm/aot/arch/aot_reloc_thumb.c
+++ b/core/iwasm/aot/arch/aot_reloc_thumb.c
@@ -97,8 +97,24 @@ static SymbolMap target_sym_map[] = {
/* clang-format off */
REG_COMMON_SYMBOLS
/* compiler-rt symbols that come from compiler(e.g. gcc) */
+#if __ARM_ARCH != 6
REG_SYM(__adddf3),
REG_SYM(__addsf3),
+ REG_SYM(__divdf3),
+ REG_SYM(__extendsfdf2),
+ REG_SYM(__fixdfsi),
+ REG_SYM(__floatsidf),
+ REG_SYM(__floatsisf),
+ REG_SYM(__floatunsidf),
+ REG_SYM(__floatunsisf),
+ REG_SYM(__muldf3),
+ REG_SYM(__mulsf3),
+ REG_SYM(__subdf3),
+ REG_SYM(__subsf3),
+ REG_SYM(__truncdfsf2),
+ REG_SYM(__unorddf2),
+ REG_SYM(__unordsf2),
+#endif
/* clang-format on */
REG_SYM(__aeabi_d2iz),
REG_SYM(__aeabi_d2lz),
@@ -133,26 +149,19 @@ static SymbolMap target_sym_map[] = {
REG_SYM(__aeabi_uldivmod),
REG_SYM(__ashldi3),
REG_SYM(__clzsi2),
- REG_SYM(__divdf3),
REG_SYM(__divdi3),
REG_SYM(__divsi3),
REG_SYM(__eqdf2),
REG_SYM(__eqsf2),
- REG_SYM(__extendsfdf2),
REG_SYM(__fixdfdi),
- REG_SYM(__fixdfsi),
REG_SYM(__fixsfdi),
REG_SYM(__fixunsdfdi),
REG_SYM(__fixunsdfsi),
REG_SYM(__fixunssfdi),
REG_SYM(__floatdidf),
REG_SYM(__floatdisf),
- REG_SYM(__floatsidf),
- REG_SYM(__floatsisf),
REG_SYM(__floatundidf),
REG_SYM(__floatundisf),
- REG_SYM(__floatunsidf),
- REG_SYM(__floatunsisf),
REG_SYM(__gedf2),
REG_SYM(__gesf2),
REG_SYM(__gtdf2),
@@ -164,21 +173,14 @@ static SymbolMap target_sym_map[] = {
REG_SYM(__ltsf2),
REG_SYM(__moddi3),
REG_SYM(__modsi3),
- REG_SYM(__muldf3),
REG_SYM(__muldi3),
- REG_SYM(__mulsf3),
REG_SYM(__nedf2),
REG_SYM(__nesf2),
- REG_SYM(__subdf3),
- REG_SYM(__subsf3),
- REG_SYM(__truncdfsf2),
REG_SYM(__udivdi3),
REG_SYM(__udivmoddi4),
REG_SYM(__udivsi3),
REG_SYM(__umoddi3),
REG_SYM(__umodsi3),
- REG_SYM(__unorddf2),
- REG_SYM(__unordsf2),
};
static void
@@ -375,7 +377,7 @@ apply_relocation(AOTModule *module, uint8 *target_section_addr,
if (error_buf != NULL)
snprintf(error_buf, error_buf_size,
"Load relocation section failed: "
- "invalid relocation type %d.",
+ "invalid relocation type %" PRId32 ".",
reloc_type);
return false;
}
diff --git a/core/iwasm/common/wasm_application.c b/core/iwasm/common/wasm_application.c
index a4fe5acc..8a19de8e 100644
--- a/core/iwasm/common/wasm_application.c
+++ b/core/iwasm/common/wasm_application.c
@@ -107,9 +107,6 @@ execute_main(WASMModuleInstanceCommon *module_inst, int32 argc, char *argv[])
the actual main function. Directly calling main function
may cause exception thrown. */
if ((func = wasm_runtime_lookup_wasi_start_function(module_inst))) {
-#if WASM_ENABLE_DEBUG_INTERP != 0
- wasm_runtime_start_debug_instance(exec_env);
-#endif
return wasm_runtime_call_wasm(exec_env, func, 0, NULL);
}
#endif /* end of WASM_ENABLE_LIBC_WASI */
@@ -191,10 +188,6 @@ execute_main(WASMModuleInstanceCommon *module_inst, int32 argc, char *argv[])
(uint32)wasm_runtime_addr_native_to_app(module_inst, argv_offsets);
}
-#if WASM_ENABLE_DEBUG_INTERP != 0
- wasm_runtime_start_debug_instance(exec_env);
-#endif
-
ret = wasm_runtime_call_wasm(exec_env, func, argc1, argv1);
if (ret && func_type->result_count > 0 && argc > 0 && argv)
/* copy the return value */
@@ -240,113 +233,10 @@ wasm_application_execute_main(WASMModuleInstanceCommon *module_inst, int32 argc,
return (ret && !wasm_runtime_get_exception(module_inst)) ? true : false;
}
-#if WASM_ENABLE_MULTI_MODULE != 0
-static WASMModuleInstance *
-get_sub_module_inst(const WASMModuleInstance *parent_module_inst,
- const char *sub_module_name)
-{
- WASMSubModInstNode *node =
- bh_list_first_elem(parent_module_inst->sub_module_inst_list);
-
- while (node && strcmp(node->module_name, sub_module_name)) {
- node = bh_list_elem_next(node);
- }
- return node ? node->module_inst : NULL;
-}
-
-static bool
-parse_function_name(char *orig_function_name, char **p_module_name,
- char **p_function_name)
-{
- if (orig_function_name[0] != '$') {
- *p_module_name = NULL;
- *p_function_name = orig_function_name;
- return true;
- }
-
- /**
- * $module_name$function_name\0
- * ===>
- * module_name\0function_name\0
- * ===>
- * module_name
- * function_name
- */
- char *p1 = orig_function_name;
- char *p2 = strchr(p1 + 1, '$');
- if (!p2) {
- LOG_DEBUG("can not parse the incoming function name");
- return false;
- }
-
- *p_module_name = p1 + 1;
- *p2 = '\0';
- *p_function_name = p2 + 1;
- return strlen(*p_module_name) && strlen(*p_function_name);
-}
-#endif
-
/**
* Implementation of wasm_application_execute_func()
*/
-static bool
-resolve_function(WASMModuleInstanceCommon *module_inst, const char *name,
- WASMFunctionInstanceCommon **out_func,
- WASMModuleInstanceCommon **out_module_inst)
-{
- WASMFunctionInstanceCommon *target_func = NULL;
- WASMModuleInstanceCommon *target_inst = NULL;
-
-#if WASM_ENABLE_MULTI_MODULE != 0
- char *function_name = NULL;
- char *orig_name = NULL;
- char *sub_module_name = NULL;
- uint32 length = (uint32)(strlen(name) + 1);
-
- orig_name = runtime_malloc(sizeof(char) * length, NULL, NULL, 0);
- if (!orig_name) {
- goto LEAVE;
- }
-
- strncpy(orig_name, name, length);
-
- if (!parse_function_name(orig_name, &sub_module_name, &function_name)) {
- goto LEAVE;
- }
-
- LOG_DEBUG("%s -> %s and %s", name, sub_module_name, function_name);
-
- if (sub_module_name) {
- target_inst = (WASMModuleInstanceCommon *)get_sub_module_inst(
- (WASMModuleInstance *)module_inst, sub_module_name);
- if (!target_inst) {
- LOG_DEBUG("can not find a sub module named %s", sub_module_name);
- goto LEAVE;
- }
- }
- else {
- target_inst = module_inst;
- }
-#else
- const char *function_name = name;
- target_inst = module_inst;
-#endif
-
- target_func =
- wasm_runtime_lookup_function(target_inst, function_name, NULL);
-
-#if WASM_ENABLE_MULTI_MODULE != 0
-LEAVE:
- if (orig_name)
- wasm_runtime_free(orig_name);
-#endif
-
- *out_func = target_func;
- *out_module_inst = target_inst;
- return target_func;
-}
-
union ieee754_float {
float f;
@@ -393,7 +283,6 @@ execute_func(WASMModuleInstanceCommon *module_inst, const char *name,
int32 argc, char *argv[])
{
WASMFunctionInstanceCommon *target_func;
- WASMModuleInstanceCommon *target_inst;
WASMType *type = NULL;
WASMExecEnv *exec_env = NULL;
uint32 argc1, *argv1 = NULL, cell_num = 0, j, k = 0;
@@ -408,13 +297,14 @@ execute_func(WASMModuleInstanceCommon *module_inst, const char *name,
bh_assert(argc >= 0);
LOG_DEBUG("call a function \"%s\" with %d arguments", name, argc);
- if (!resolve_function(module_inst, name, &target_func, &target_inst)) {
+ if (!(target_func =
+ wasm_runtime_lookup_function(module_inst, name, NULL))) {
snprintf(buf, sizeof(buf), "lookup function %s failed", name);
wasm_runtime_set_exception(module_inst, buf);
goto fail;
}
- module_type = target_inst->module_type;
+ module_type = module_inst->module_type;
type = wasm_runtime_get_function_type(target_func, module_type);
if (!type) {
@@ -446,7 +336,7 @@ execute_func(WASMModuleInstanceCommon *module_inst, const char *name,
#endif
total_size = sizeof(uint32) * (uint64)(cell_num > 2 ? cell_num : 2);
- if ((!(argv1 = runtime_malloc((uint32)total_size, target_inst, NULL, 0)))) {
+ if ((!(argv1 = runtime_malloc((uint32)total_size, module_inst, NULL, 0)))) {
goto fail;
}
@@ -618,10 +508,6 @@ execute_func(WASMModuleInstanceCommon *module_inst, const char *name,
goto fail;
}
-#if WASM_ENABLE_DEBUG_INTERP != 0
- wasm_runtime_start_debug_instance(exec_env);
-#endif
-
if (!wasm_runtime_call_wasm(exec_env, target_func, argc1, argv1)) {
goto fail;
}
diff --git a/core/iwasm/common/wasm_memory.c b/core/iwasm/common/wasm_memory.c
index 4f58bbc3..49a9b086 100644
--- a/core/iwasm/common/wasm_memory.c
+++ b/core/iwasm/common/wasm_memory.c
@@ -75,8 +75,17 @@ wasm_runtime_memory_init(mem_alloc_type_t mem_alloc_type,
void
wasm_runtime_memory_destroy()
{
- if (memory_mode == MEMORY_MODE_POOL)
- mem_allocator_destroy(pool_allocator);
+ if (memory_mode == MEMORY_MODE_POOL) {
+#if BH_ENABLE_GC_VERIFY == 0
+ (void)mem_allocator_destroy(pool_allocator);
+#else
+ int ret = mem_allocator_destroy(pool_allocator);
+ if (ret != 0) {
+ /* Memory leak detected */
+ exit(-1);
+ }
+#endif
+ }
memory_mode = MEMORY_MODE_UNKNOWN;
}
@@ -167,3 +176,12 @@ wasm_runtime_free(void *ptr)
{
wasm_runtime_free_internal(ptr);
}
+
+bool
+wasm_runtime_get_mem_alloc_info(mem_alloc_info_t *mem_alloc_info)
+{
+ if (memory_mode == MEMORY_MODE_POOL) {
+ return mem_allocator_get_alloc_info(pool_allocator, mem_alloc_info);
+ }
+ return false;
+}
diff --git a/core/iwasm/common/wasm_native.c b/core/iwasm/common/wasm_native.c
index bbef1def..c44d2831 100644
--- a/core/iwasm/common/wasm_native.c
+++ b/core/iwasm/common/wasm_native.c
@@ -53,6 +53,9 @@ get_lib_pthread_export_apis(NativeSymbol **p_lib_pthread_apis);
uint32
get_libc_emcc_export_apis(NativeSymbol **p_libc_emcc_apis);
+uint32
+get_lib_rats_export_apis(NativeSymbol **p_lib_rats_apis);
+
static bool
compare_type_with_signautre(uint8 type, const char signature)
{
@@ -359,24 +362,24 @@ wasm_native_init()
#if WASM_ENABLE_LIBC_BUILTIN != 0
n_native_symbols = get_libc_builtin_export_apis(&native_symbols);
if (!wasm_native_register_natives("env", native_symbols, n_native_symbols))
- return false;
+ goto fail;
#endif /* WASM_ENABLE_LIBC_BUILTIN */
#if WASM_ENABLE_SPEC_TEST
n_native_symbols = get_spectest_export_apis(&native_symbols);
if (!wasm_native_register_natives("spectest", native_symbols,
n_native_symbols))
- return false;
+ goto fail;
#endif /* WASM_ENABLE_SPEC_TEST */
#if WASM_ENABLE_LIBC_WASI != 0
n_native_symbols = get_libc_wasi_export_apis(&native_symbols);
if (!wasm_native_register_natives("wasi_unstable", native_symbols,
n_native_symbols))
- return false;
+ goto fail;
if (!wasm_native_register_natives("wasi_snapshot_preview1", native_symbols,
n_native_symbols))
- return false;
+ goto fail;
#endif
#if WASM_ENABLE_BASE_LIB != 0
@@ -384,7 +387,7 @@ wasm_native_init()
if (n_native_symbols > 0
&& !wasm_native_register_natives("env", native_symbols,
n_native_symbols))
- return false;
+ goto fail;
#endif
#if WASM_ENABLE_APP_FRAMEWORK != 0
@@ -392,18 +395,18 @@ wasm_native_init()
if (n_native_symbols > 0
&& !wasm_native_register_natives("env", native_symbols,
n_native_symbols))
- return false;
+ goto fail;
#endif
#if WASM_ENABLE_LIB_PTHREAD != 0
if (!lib_pthread_init())
- return false;
+ goto fail;
n_native_symbols = get_lib_pthread_export_apis(&native_symbols);
if (n_native_symbols > 0
&& !wasm_native_register_natives("env", native_symbols,
n_native_symbols))
- return false;
+ goto fail;
#endif
#if WASM_ENABLE_LIBC_EMCC != 0
@@ -411,10 +414,21 @@ wasm_native_init()
if (n_native_symbols > 0
&& !wasm_native_register_natives("env", native_symbols,
n_native_symbols))
- return false;
+ goto fail;
#endif /* WASM_ENABLE_LIBC_EMCC */
+#if WASM_ENABLE_LIB_RATS != 0
+ n_native_symbols = get_lib_rats_export_apis(&native_symbols);
+ if (n_native_symbols > 0
+ && !wasm_native_register_natives("env", native_symbols,
+ n_native_symbols))
+ goto fail;
+#endif /* WASM_ENABLE_LIB_RATS */
+
return true;
+fail:
+ wasm_native_destroy();
+ return false;
}
void
diff --git a/core/iwasm/common/wasm_runtime_common.c b/core/iwasm/common/wasm_runtime_common.c
index dbb9816b..c1528c58 100644
--- a/core/iwasm/common/wasm_runtime_common.c
+++ b/core/iwasm/common/wasm_runtime_common.c
@@ -341,10 +341,6 @@ wasm_runtime_init()
void
wasm_runtime_destroy()
{
-#if WASM_ENABLE_FAST_JIT != 0
- jit_compiler_destroy();
-#endif
-
#if WASM_ENABLE_REF_TYPES != 0
wasm_externref_map_destroy();
#endif
@@ -368,6 +364,14 @@ wasm_runtime_destroy()
os_mutex_destroy(®istered_module_list_lock);
#endif
+#if WASM_ENABLE_FAST_JIT != 0
+ /* Destroy Fast-JIT compiler after destroying the modules
+ * loaded by multi-module feature, since the Fast JIT's
+ * code cache allocator may be used by these modules.
+ */
+ jit_compiler_destroy();
+#endif
+
#if WASM_ENABLE_SHARED_MEMORY
wasm_shared_memory_destroy();
#endif
@@ -404,7 +408,6 @@ wasm_runtime_full_init(RuntimeInitArgs *init_args)
#if WASM_ENABLE_DEBUG_INTERP != 0
if (strlen(init_args->ip_addr))
if (!wasm_debug_engine_init(init_args->ip_addr,
- init_args->platform_port,
init_args->instance_port)) {
wasm_runtime_destroy();
return false;
@@ -504,7 +507,7 @@ wasm_runtime_is_xip_file(const uint8 *buf, uint32 size)
#if (WASM_ENABLE_THREAD_MGR != 0) && (WASM_ENABLE_DEBUG_INTERP != 0)
uint32
-wasm_runtime_start_debug_instance(WASMExecEnv *exec_env)
+wasm_runtime_start_debug_instance_with_port(WASMExecEnv *exec_env, int32_t port)
{
WASMModuleInstanceCommon *module_inst =
wasm_runtime_get_module_inst(exec_env);
@@ -522,12 +525,18 @@ wasm_runtime_start_debug_instance(WASMExecEnv *exec_env)
return cluster->debug_inst->control_thread->port;
}
- if (wasm_debug_instance_create(cluster)) {
+ if (wasm_debug_instance_create(cluster, port)) {
return cluster->debug_inst->control_thread->port;
}
return 0;
}
+
+uint32
+wasm_runtime_start_debug_instance(WASMExecEnv *exec_env)
+{
+ return wasm_runtime_start_debug_instance_with_port(exec_env, -1);
+}
#endif
#if WASM_ENABLE_MULTI_MODULE != 0
diff --git a/core/iwasm/common/wasm_runtime_common.h b/core/iwasm/common/wasm_runtime_common.h
index 15bcb24b..6f715274 100644
--- a/core/iwasm/common/wasm_runtime_common.h
+++ b/core/iwasm/common/wasm_runtime_common.h
@@ -565,6 +565,11 @@ wasm_runtime_call_wasm_v(WASMExecEnv *exec_env,
uint32 num_args, ...);
#if WASM_ENABLE_DEBUG_INTERP != 0
+/* See wasm_export.h for description */
+WASM_RUNTIME_API_EXTERN uint32
+wasm_runtime_start_debug_instance_with_port(WASMExecEnv *exec_env,
+ int32_t port);
+
/* See wasm_export.h for description */
WASM_RUNTIME_API_EXTERN uint32
wasm_runtime_start_debug_instance(WASMExecEnv *exec_env);
diff --git a/core/iwasm/compilation/simd/simd_conversions.c b/core/iwasm/compilation/simd/simd_conversions.c
index 554b088d..e9d30bfc 100644
--- a/core/iwasm/compilation/simd/simd_conversions.c
+++ b/core/iwasm/compilation/simd/simd_conversions.c
@@ -135,9 +135,9 @@ simd_integer_narrow_common(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx,
LLVM_CONST(i32_fourteen), LLVM_CONST(i32_fifteen),
};
- if (!(trunc_type[0] == LLVMVectorType(INT8_TYPE, 8))
- || !(trunc_type[1] == LLVMVectorType(INT16_TYPE, 4))
- || !(trunc_type[2] == LLVMVectorType(I32_TYPE, 2))) {
+ if (!(trunc_type[0] = LLVMVectorType(INT8_TYPE, 8))
+ || !(trunc_type[1] = LLVMVectorType(INT16_TYPE, 4))
+ || !(trunc_type[2] = LLVMVectorType(I32_TYPE, 2))) {
HANDLE_FAILURE("LLVMVectorType");
return false;
}
diff --git a/core/iwasm/fast-jit/fe/jit_emit_control.c b/core/iwasm/fast-jit/fe/jit_emit_control.c
index e9200e78..eafce674 100644
--- a/core/iwasm/fast-jit/fe/jit_emit_control.c
+++ b/core/iwasm/fast-jit/fe/jit_emit_control.c
@@ -807,7 +807,11 @@ jit_compile_op_block(JitCompContext *cc, uint8 **p_frame_ip,
return true;
fail:
- jit_block_destroy(block);
+ /* Only destroy the block if it hasn't been pushed into
+ the block stack, or if will be destroyed again when
+ destroying the block stack */
+ if (jit_block_stack_top(&cc->block_stack) != block)
+ jit_block_destroy(block);
return false;
}
diff --git a/core/iwasm/fast-jit/fe/jit_emit_numberic.c b/core/iwasm/fast-jit/fe/jit_emit_numberic.c
index a382facf..3b2f21af 100644
--- a/core/iwasm/fast-jit/fe/jit_emit_numberic.c
+++ b/core/iwasm/fast-jit/fe/jit_emit_numberic.c
@@ -539,8 +539,13 @@ compile_int_div_no_check(JitCompContext *cc, IntArithmetic arith_op,
insn = GEN_INSN(DIV_U, rax_hreg, rax_hreg, right);
}
- jit_lock_reg_in_insn(cc, insn, eax_hreg);
- jit_lock_reg_in_insn(cc, insn, edx_hreg);
+ if (!insn) {
+ goto fail;
+ }
+ if (!jit_lock_reg_in_insn(cc, insn, eax_hreg)
+ || !jit_lock_reg_in_insn(cc, insn, edx_hreg)) {
+ goto fail;
+ }
if (is_i32) {
res = jit_cc_new_reg_I32(cc);
@@ -551,9 +556,12 @@ compile_int_div_no_check(JitCompContext *cc, IntArithmetic arith_op,
insn1 = jit_insn_new_MOV(res, rax_hreg);
}
- if (insn && insn1) {
- jit_insn_insert_after(insn, insn1);
+ if (!insn1) {
+ jit_set_last_error(cc, "generate insn failed");
+ goto fail;
}
+
+ jit_insn_insert_after(insn, insn1);
break;
}
case INT_REM_S:
@@ -576,8 +584,13 @@ compile_int_div_no_check(JitCompContext *cc, IntArithmetic arith_op,
insn = GEN_INSN(REM_U, rdx_hreg, rax_hreg, right);
}
- jit_lock_reg_in_insn(cc, insn, eax_hreg);
- jit_lock_reg_in_insn(cc, insn, edx_hreg);
+ if (!insn) {
+ goto fail;
+ }
+ if (!jit_lock_reg_in_insn(cc, insn, eax_hreg)
+ || !jit_lock_reg_in_insn(cc, insn, edx_hreg)) {
+ goto fail;
+ }
if (is_i32) {
res = jit_cc_new_reg_I32(cc);
@@ -588,9 +601,12 @@ compile_int_div_no_check(JitCompContext *cc, IntArithmetic arith_op,
insn1 = jit_insn_new_MOV(res, rdx_hreg);
}
- if (insn && insn1) {
- jit_insn_insert_after(insn, insn1);
+ if (!insn1) {
+ jit_set_last_error(cc, "generate insn failed");
+ goto fail;
}
+
+ jit_insn_insert_after(insn, insn1);
break;
}
#else
@@ -1133,13 +1149,20 @@ compile_int_shl(JitCompContext *cc, JitReg left, JitReg right, bool is_i32)
#if defined(BUILD_TARGET_X86_64) || defined(BUILD_TARGET_AMD_64)
GEN_INSN(MOV, is_i32 ? ecx_hreg : rcx_hreg, right);
insn = GEN_INSN(SHL, res, left, is_i32 ? ecx_hreg : rcx_hreg);
- jit_lock_reg_in_insn(cc, insn, ecx_hreg);
+ if (jit_get_last_error(cc) || !jit_lock_reg_in_insn(cc, insn, ecx_hreg)) {
+ goto fail;
+ }
#else
GEN_INSN(SHL, res, left, right);
+ if (jit_get_last_error(cc)) {
+ goto fail;
+ }
#endif
shortcut:
return res;
+fail:
+ return (JitReg)0;
}
static JitReg
@@ -1164,13 +1187,20 @@ compile_int_shrs(JitCompContext *cc, JitReg left, JitReg right, bool is_i32)
#if defined(BUILD_TARGET_X86_64) || defined(BUILD_TARGET_AMD_64)
GEN_INSN(MOV, is_i32 ? ecx_hreg : rcx_hreg, right);
insn = GEN_INSN(SHRS, res, left, is_i32 ? ecx_hreg : rcx_hreg);
- jit_lock_reg_in_insn(cc, insn, ecx_hreg);
+ if (jit_get_last_error(cc) || !jit_lock_reg_in_insn(cc, insn, ecx_hreg)) {
+ goto fail;
+ }
#else
GEN_INSN(SHRS, res, left, right);
+ if (jit_get_last_error(cc)) {
+ goto fail;
+ }
#endif
shortcut:
return res;
+fail:
+ return (JitReg)0;
}
static JitReg
@@ -1195,13 +1225,20 @@ compile_int_shru(JitCompContext *cc, JitReg left, JitReg right, bool is_i32)
#if defined(BUILD_TARGET_X86_64) || defined(BUILD_TARGET_AMD_64)
GEN_INSN(MOV, is_i32 ? ecx_hreg : rcx_hreg, right);
insn = GEN_INSN(SHRU, res, left, is_i32 ? ecx_hreg : rcx_hreg);
- jit_lock_reg_in_insn(cc, insn, ecx_hreg);
+ if (jit_get_last_error(cc) || !jit_lock_reg_in_insn(cc, insn, ecx_hreg)) {
+ goto fail;
+ }
#else
GEN_INSN(SHRU, res, left, right);
+ if (jit_get_last_error(cc)) {
+ goto fail;
+ }
#endif
shortcut:
return res;
+fail:
+ return (JitReg)0;
}
DEF_UNI_INT_CONST_OPS(rotl)
@@ -1257,13 +1294,20 @@ compile_int_rotl(JitCompContext *cc, JitReg left, JitReg right, bool is_i32)
#if defined(BUILD_TARGET_X86_64) || defined(BUILD_TARGET_AMD_64)
GEN_INSN(MOV, is_i32 ? ecx_hreg : rcx_hreg, right);
insn = GEN_INSN(ROTL, res, left, is_i32 ? ecx_hreg : rcx_hreg);
- jit_lock_reg_in_insn(cc, insn, ecx_hreg);
+ if (jit_get_last_error(cc) || !jit_lock_reg_in_insn(cc, insn, ecx_hreg)) {
+ goto fail;
+ }
#else
GEN_INSN(ROTL, res, left, right);
+ if (jit_get_last_error(cc)) {
+ goto fail;
+ }
#endif
shortcut:
return res;
+fail:
+ return (JitReg)0;
}
DEF_UNI_INT_CONST_OPS(rotr)
@@ -1319,13 +1363,20 @@ compile_int_rotr(JitCompContext *cc, JitReg left, JitReg right, bool is_i32)
#if defined(BUILD_TARGET_X86_64) || defined(BUILD_TARGET_AMD_64)
GEN_INSN(MOV, is_i32 ? ecx_hreg : rcx_hreg, right);
insn = GEN_INSN(ROTR, res, left, is_i32 ? ecx_hreg : rcx_hreg);
- jit_lock_reg_in_insn(cc, insn, ecx_hreg);
+ if (jit_get_last_error(cc) || !jit_lock_reg_in_insn(cc, insn, ecx_hreg)) {
+ goto fail;
+ }
#else
GEN_INSN(ROTR, res, left, right);
+ if (jit_get_last_error(cc)) {
+ goto fail;
+ }
#endif
shortcut:
return res;
+fail:
+ return (JitReg)0;
}
static bool
diff --git a/core/iwasm/fast-jit/jit_compiler.c b/core/iwasm/fast-jit/jit_compiler.c
index 6282e304..c10a4099 100644
--- a/core/iwasm/fast-jit/jit_compiler.c
+++ b/core/iwasm/fast-jit/jit_compiler.c
@@ -64,7 +64,7 @@ apply_compiler_passes(JitCompContext *cc)
cc->cur_pass_no = p - jit_globals.passes;
bh_assert(*p < COMPILER_PASS_NUM);
- if (!compiler_passes[*p].run(cc)) {
+ if (!compiler_passes[*p].run(cc) || jit_get_last_error(cc)) {
LOG_VERBOSE("JIT: compilation failed at pass[%td] = %s\n",
p - jit_globals.passes, compiler_passes[*p].name);
return false;
diff --git a/core/iwasm/fast-jit/jit_frontend.c b/core/iwasm/fast-jit/jit_frontend.c
index 117df938..44c06a7d 100644
--- a/core/iwasm/fast-jit/jit_frontend.c
+++ b/core/iwasm/fast-jit/jit_frontend.c
@@ -70,6 +70,21 @@ get_module_reg(JitFrame *frame)
return frame->module_reg;
}
+JitReg
+get_import_func_ptrs_reg(JitFrame *frame)
+{
+ JitCompContext *cc = frame->cc;
+ JitReg module_inst_reg = get_module_inst_reg(frame);
+
+ if (!frame->import_func_ptrs_reg) {
+ frame->import_func_ptrs_reg = cc->import_func_ptrs_reg;
+ GEN_INSN(
+ LDPTR, frame->import_func_ptrs_reg, module_inst_reg,
+ NEW_CONST(I32, offsetof(WASMModuleInstance, import_func_ptrs)));
+ }
+ return frame->import_func_ptrs_reg;
+}
+
JitReg
get_fast_jit_func_ptrs_reg(JitFrame *frame)
{
@@ -85,6 +100,21 @@ get_fast_jit_func_ptrs_reg(JitFrame *frame)
return frame->fast_jit_func_ptrs_reg;
}
+JitReg
+get_func_type_indexes_reg(JitFrame *frame)
+{
+ JitCompContext *cc = frame->cc;
+ JitReg module_inst_reg = get_module_inst_reg(frame);
+
+ if (!frame->func_type_indexes_reg) {
+ frame->func_type_indexes_reg = cc->func_type_indexes_reg;
+ GEN_INSN(
+ LDPTR, frame->func_type_indexes_reg, module_inst_reg,
+ NEW_CONST(I32, offsetof(WASMModuleInstance, func_type_indexes)));
+ }
+ return frame->func_type_indexes_reg;
+}
+
JitReg
get_global_data_reg(JitFrame *frame)
{
@@ -376,7 +406,9 @@ clear_fixed_virtual_regs(JitFrame *frame)
frame->module_inst_reg = 0;
frame->module_reg = 0;
+ frame->import_func_ptrs_reg = 0;
frame->fast_jit_func_ptrs_reg = 0;
+ frame->func_type_indexes_reg = 0;
frame->global_data_reg = 0;
frame->aux_stack_bound_reg = 0;
frame->aux_stack_bottom_reg = 0;
@@ -572,7 +604,9 @@ create_fixed_virtual_regs(JitCompContext *cc)
cc->module_inst_reg = jit_cc_new_reg_ptr(cc);
cc->module_reg = jit_cc_new_reg_ptr(cc);
+ cc->import_func_ptrs_reg = jit_cc_new_reg_ptr(cc);
cc->fast_jit_func_ptrs_reg = jit_cc_new_reg_ptr(cc);
+ cc->func_type_indexes_reg = jit_cc_new_reg_ptr(cc);
cc->global_data_reg = jit_cc_new_reg_ptr(cc);
cc->aux_stack_bound_reg = jit_cc_new_reg_I32(cc);
cc->aux_stack_bottom_reg = jit_cc_new_reg_I32(cc);
@@ -697,6 +731,9 @@ form_and_translate_func(JitCompContext *cc)
*(jit_annl_end_bcip(cc, cc->exit_label)) =
cc->cur_wasm_module->load_addr;
+ if (jit_get_last_error(cc)) {
+ return false;
+ }
return true;
}
diff --git a/core/iwasm/fast-jit/jit_frontend.h b/core/iwasm/fast-jit/jit_frontend.h
index adb7ef4e..eeecf48f 100644
--- a/core/iwasm/fast-jit/jit_frontend.h
+++ b/core/iwasm/fast-jit/jit_frontend.h
@@ -187,9 +187,15 @@ get_module_inst_reg(JitFrame *frame);
JitReg
get_module_reg(JitFrame *frame);
+JitReg
+get_import_func_ptrs_reg(JitFrame *frame);
+
JitReg
get_fast_jit_func_ptrs_reg(JitFrame *frame);
+JitReg
+get_func_type_indexes_reg(JitFrame *frame);
+
JitReg
get_global_data_reg(JitFrame *frame);
@@ -507,6 +513,8 @@ set_local_f64(JitFrame *frame, int n, JitReg val)
#define PUSH(jit_value, value_type) \
do { \
+ if (!jit_value) \
+ goto fail; \
if (!jit_cc_push_value(cc, value_type, jit_value)) \
goto fail; \
} while (0)
diff --git a/core/iwasm/fast-jit/jit_ir.c b/core/iwasm/fast-jit/jit_ir.c
index 2f78bb16..31315273 100644
--- a/core/iwasm/fast-jit/jit_ir.c
+++ b/core/iwasm/fast-jit/jit_ir.c
@@ -474,8 +474,10 @@ jit_cc_destroy(JitCompContext *cc)
}
/* Release entry and exit blocks. */
- jit_basic_block_delete(jit_cc_entry_basic_block(cc));
- jit_basic_block_delete(jit_cc_exit_basic_block(cc));
+ if (0 != cc->entry_label)
+ jit_basic_block_delete(jit_cc_entry_basic_block(cc));
+ if (0 != cc->exit_label)
+ jit_basic_block_delete(jit_cc_exit_basic_block(cc));
/* clang-format off */
/* Release blocks and instructions. */
diff --git a/core/iwasm/fast-jit/jit_ir.h b/core/iwasm/fast-jit/jit_ir.h
index 7dc453fe..b00694fc 100644
--- a/core/iwasm/fast-jit/jit_ir.h
+++ b/core/iwasm/fast-jit/jit_ir.h
@@ -909,8 +909,12 @@ typedef struct JitFrame {
JitReg module_inst_reg;
/* WASM module */
JitReg module_reg;
+ /* module_inst->import_func_ptrs */
+ JitReg import_func_ptrs_reg;
/* module_inst->fast_jit_func_ptrs */
JitReg fast_jit_func_ptrs_reg;
+ /* module_inst->func_type_indexes */
+ JitReg func_type_indexes_reg;
/* Base address of global data */
JitReg global_data_reg;
/* Boundary of auxiliary stack */
@@ -1027,8 +1031,12 @@ typedef struct JitCompContext {
JitReg module_inst_reg;
/* WASM module */
JitReg module_reg;
+ /* module_inst->import_func_ptrs */
+ JitReg import_func_ptrs_reg;
/* module_inst->fast_jit_func_ptrs */
JitReg fast_jit_func_ptrs_reg;
+ /* module_inst->func_type_indexes */
+ JitReg func_type_indexes_reg;
/* Base address of global data */
JitReg global_data_reg;
/* Boundary of auxiliary stack */
diff --git a/core/iwasm/include/wasm_export.h b/core/iwasm/include/wasm_export.h
index a32dcc1c..bd10a253 100644
--- a/core/iwasm/include/wasm_export.h
+++ b/core/iwasm/include/wasm_export.h
@@ -121,6 +121,13 @@ typedef union MemAllocOption {
} MemAllocOption;
#endif
+/* Memory pool info */
+typedef struct mem_alloc_info_t {
+ uint32_t total_size;
+ uint32_t total_free_size;
+ uint32_t highmark_size;
+} mem_alloc_info_t;
+
/* WASM runtime initialize arguments */
typedef struct RuntimeInitArgs {
mem_alloc_type_t mem_alloc_type;
@@ -137,7 +144,7 @@ typedef struct RuntimeInitArgs {
/* Debug settings, only used when
WASM_ENABLE_DEBUG_INTERP != 0 */
char ip_addr[128];
- int platform_port;
+ int unused; /* was platform_port */
int instance_port;
/* Fast JIT code cache size */
@@ -229,6 +236,12 @@ wasm_runtime_realloc(void *ptr, unsigned int size);
WASM_RUNTIME_API_EXTERN void
wasm_runtime_free(void *ptr);
+/*
+ * Get memory info, only pool mode is supported now.
+ */
+WASM_RUNTIME_API_EXTERN bool
+wasm_runtime_get_mem_alloc_info(mem_alloc_info_t *mem_alloc_info);
+
/**
* Get the package type of a buffer.
*
@@ -252,20 +265,18 @@ WASM_RUNTIME_API_EXTERN bool
wasm_runtime_is_xip_file(const uint8_t *buf, uint32_t size);
/**
- * It is a callback for WAMR providing by embedding to load a module file
- * into a buffer
+ * Callback to load a module file into a buffer in multi-module feature
*/
typedef bool (*module_reader)(const char *module_name,
uint8_t **p_buffer, uint32_t *p_size);
/**
- * It is a callback for WAMR providing by embedding to release the buffer which
- * is used by loading a module file
+ * Callback to release the buffer loaded by module_reader callback
*/
typedef void (*module_destroyer)(uint8_t *buffer, uint32_t size);
/**
- * To setup callbacks for reading and releasing a buffer about a module file
+ * Setup callbacks for reading and releasing a buffer about a module file
*
* @param reader a callback to read a module file into a buffer
* @param destroyer a callback to release above buffer
@@ -275,7 +286,7 @@ wasm_runtime_set_module_reader(const module_reader reader,
const module_destroyer destroyer);
/**
* Give the "module" a name "module_name".
- * can not assign a new name to a module if it already has a name
+ * Can not assign a new name to a module if it already has a name
*
* @param module_name indicate a name
* @param module the target module
@@ -289,8 +300,8 @@ wasm_runtime_register_module(const char *module_name, wasm_module_t module,
char *error_buf, uint32_t error_buf_size);
/**
- * To check if there is already a loaded module named module_name in the
- * runtime. you will not want to load repeately
+ * Check if there is already a loaded module named module_name in the
+ * runtime. Repeately loading a module with the same name is not allowed.
*
* @param module_name indicate a name
*
@@ -520,10 +531,19 @@ wasm_runtime_get_exec_env_singleton(wasm_module_inst_t module_inst);
* they are sharing the same cluster with the main exec_env.
*
* @param exec_env the execution environment to start debug instance
+ * @param port the port for the debug server to listen on.
+ * 0 means automatic assignment.
+ * -1 means to use the global setting in RuntimeInitArgs.
*
* @return debug port if success, 0 otherwise.
*/
WASM_RUNTIME_API_EXTERN uint32_t
+wasm_runtime_start_debug_instance_with_port(wasm_exec_env_t exec_env, int32_t port);
+
+/**
+ * Same as wasm_runtime_start_debug_instance_with_port(env, -1).
+ */
+WASM_RUNTIME_API_EXTERN uint32_t
wasm_runtime_start_debug_instance(wasm_exec_env_t exec_env);
/**
@@ -1042,7 +1062,7 @@ wasm_runtime_spawn_thread(wasm_exec_env_t exec_env, wasm_thread_t *tid,
wasm_thread_callback_t callback, void *arg);
/**
- * Waits a spawned thread to terminate
+ * Wait a spawned thread to terminate
*
* @param tid thread id
* @param retval if not NULL, output the return value of the thread
diff --git a/core/iwasm/interpreter/wasm.h b/core/iwasm/interpreter/wasm.h
index fcb57a8a..44b3973d 100644
--- a/core/iwasm/interpreter/wasm.h
+++ b/core/iwasm/interpreter/wasm.h
@@ -29,6 +29,7 @@ extern "C" {
#define VALUE_TYPE_ANY 0x42
#define DEFAULT_NUM_BYTES_PER_PAGE 65536
+#define DEFAULT_MAX_PAGES 65536
#define NULL_REF (0xFFFFFFFF)
diff --git a/core/iwasm/interpreter/wasm_loader.c b/core/iwasm/interpreter/wasm_loader.c
index cf106c8a..0aeda3ec 100644
--- a/core/iwasm/interpreter/wasm_loader.c
+++ b/core/iwasm/interpreter/wasm_loader.c
@@ -1266,7 +1266,7 @@ fail:
static bool
check_memory_init_size(uint32 init_size, char *error_buf, uint32 error_buf_size)
{
- if (init_size > 65536) {
+ if (init_size > DEFAULT_MAX_PAGES) {
set_error_buf(error_buf, error_buf_size,
"memory size must be at most 65536 pages (4GiB)");
return false;
@@ -1284,7 +1284,7 @@ check_memory_max_size(uint32 init_size, uint32 max_size, char *error_buf,
return false;
}
- if (max_size > 65536) {
+ if (max_size > DEFAULT_MAX_PAGES) {
set_error_buf(error_buf, error_buf_size,
"memory size must be at most 65536 pages (4GiB)");
return false;
@@ -1299,12 +1299,12 @@ load_memory_import(const uint8 **p_buf, const uint8 *buf_end,
char *error_buf, uint32 error_buf_size)
{
const uint8 *p = *p_buf, *p_end = buf_end;
- uint32 pool_size = wasm_runtime_memory_pool_size();
#if WASM_ENABLE_APP_FRAMEWORK != 0
+ uint32 pool_size = wasm_runtime_memory_pool_size();
uint32 max_page_count = pool_size * APP_MEMORY_MAX_GLOBAL_HEAP_PERCENT
/ DEFAULT_NUM_BYTES_PER_PAGE;
#else
- uint32 max_page_count = pool_size / DEFAULT_NUM_BYTES_PER_PAGE;
+ uint32 max_page_count = DEFAULT_MAX_PAGES;
#endif /* WASM_ENABLE_APP_FRAMEWORK */
uint32 declare_max_page_count_flag = 0;
uint32 declare_init_page_count = 0;
@@ -1529,12 +1529,12 @@ load_memory(const uint8 **p_buf, const uint8 *buf_end, WASMMemory *memory,
char *error_buf, uint32 error_buf_size)
{
const uint8 *p = *p_buf, *p_end = buf_end, *p_org;
- uint32 pool_size = wasm_runtime_memory_pool_size();
#if WASM_ENABLE_APP_FRAMEWORK != 0
+ uint32 pool_size = wasm_runtime_memory_pool_size();
uint32 max_page_count = pool_size * APP_MEMORY_MAX_GLOBAL_HEAP_PERCENT
/ DEFAULT_NUM_BYTES_PER_PAGE;
#else
- uint32 max_page_count = pool_size / DEFAULT_NUM_BYTES_PER_PAGE;
+ uint32 max_page_count = DEFAULT_MAX_PAGES;
#endif
p_org = p;
@@ -3317,17 +3317,30 @@ load_from_sections(WASMModule *module, WASMSection *sections,
#if WASM_ENABLE_MULTI_MODULE == 0
if (module->import_memory_count) {
memory_import = &module->import_memories[0].u.memory;
- /* Memory init page count cannot be larger than 65536, we don't
- check integer overflow again. */
- memory_import->num_bytes_per_page *= memory_import->init_page_count;
- memory_import->init_page_count = memory_import->max_page_count = 1;
+ if (memory_import->init_page_count < DEFAULT_MAX_PAGES)
+ memory_import->num_bytes_per_page *=
+ memory_import->init_page_count;
+ else
+ memory_import->num_bytes_per_page = UINT32_MAX;
+
+ if (memory_import->init_page_count > 0)
+ memory_import->init_page_count = memory_import->max_page_count =
+ 1;
+ else
+ memory_import->init_page_count = memory_import->max_page_count =
+ 0;
}
if (module->memory_count) {
- /* Memory init page count cannot be larger than 65536, we don't
- check integer overflow again. */
memory = &module->memories[0];
- memory->num_bytes_per_page *= memory->init_page_count;
- memory->init_page_count = memory->max_page_count = 1;
+ if (memory->init_page_count < DEFAULT_MAX_PAGES)
+ memory->num_bytes_per_page *= memory->init_page_count;
+ else
+ memory->num_bytes_per_page = UINT32_MAX;
+
+ if (memory->init_page_count > 0)
+ memory->init_page_count = memory->max_page_count = 1;
+ else
+ memory->init_page_count = memory->max_page_count = 0;
}
#endif
}
@@ -7300,7 +7313,6 @@ re_scan:
}
case WASM_OP_DROP:
- case WASM_OP_DROP_64:
{
BranchBlock *cur_block = loader_ctx->frame_csp - 1;
int32 available_stack_cell =
@@ -7368,7 +7380,6 @@ re_scan:
}
case WASM_OP_SELECT:
- case WASM_OP_SELECT_64:
{
uint8 ref_type;
BranchBlock *cur_block = loader_ctx->frame_csp - 1;
diff --git a/core/iwasm/interpreter/wasm_mini_loader.c b/core/iwasm/interpreter/wasm_mini_loader.c
index 3ac80b7b..ac240689 100644
--- a/core/iwasm/interpreter/wasm_mini_loader.c
+++ b/core/iwasm/interpreter/wasm_mini_loader.c
@@ -534,12 +534,12 @@ load_memory_import(const uint8 **p_buf, const uint8 *buf_end,
char *error_buf, uint32 error_buf_size)
{
const uint8 *p = *p_buf, *p_end = buf_end;
- uint32 pool_size = wasm_runtime_memory_pool_size();
#if WASM_ENABLE_APP_FRAMEWORK != 0
+ uint32 pool_size = wasm_runtime_memory_pool_size();
uint32 max_page_count = pool_size * APP_MEMORY_MAX_GLOBAL_HEAP_PERCENT
/ DEFAULT_NUM_BYTES_PER_PAGE;
#else
- uint32 max_page_count = pool_size / DEFAULT_NUM_BYTES_PER_PAGE;
+ uint32 max_page_count = DEFAULT_MAX_PAGES;
#endif /* WASM_ENABLE_APP_FRAMEWORK */
uint32 declare_max_page_count_flag = 0;
uint32 declare_init_page_count = 0;
@@ -650,12 +650,12 @@ load_memory(const uint8 **p_buf, const uint8 *buf_end, WASMMemory *memory,
char *error_buf, uint32 error_buf_size)
{
const uint8 *p = *p_buf, *p_end = buf_end, *p_org;
- uint32 pool_size = wasm_runtime_memory_pool_size();
#if WASM_ENABLE_APP_FRAMEWORK != 0
+ uint32 pool_size = wasm_runtime_memory_pool_size();
uint32 max_page_count = pool_size * APP_MEMORY_MAX_GLOBAL_HEAP_PERCENT
/ DEFAULT_NUM_BYTES_PER_PAGE;
#else
- uint32 max_page_count = pool_size / DEFAULT_NUM_BYTES_PER_PAGE;
+ uint32 max_page_count = DEFAULT_MAX_PAGES;
#endif
p_org = p;
@@ -2153,18 +2153,31 @@ load_from_sections(WASMModule *module, WASMSection *sections,
if (module->import_memory_count) {
memory_import = &module->import_memories[0].u.memory;
- /* Memory init page count cannot be larger than 65536, we don't
- check integer overflow again. */
- memory_import->num_bytes_per_page *= memory_import->init_page_count;
- memory_import->init_page_count = memory_import->max_page_count = 1;
+ if (memory_import->init_page_count < DEFAULT_MAX_PAGES)
+ memory_import->num_bytes_per_page *=
+ memory_import->init_page_count;
+ else
+ memory_import->num_bytes_per_page = UINT32_MAX;
+
+ if (memory_import->init_page_count > 0)
+ memory_import->init_page_count = memory_import->max_page_count =
+ 1;
+ else
+ memory_import->init_page_count = memory_import->max_page_count =
+ 0;
}
if (module->memory_count) {
- /* Memory init page count cannot be larger than 65536, we don't
- check integer overflow again. */
memory = &module->memories[0];
- memory->num_bytes_per_page *= memory->init_page_count;
- memory->init_page_count = memory->max_page_count = 1;
+ if (memory->init_page_count < DEFAULT_MAX_PAGES)
+ memory->num_bytes_per_page *= memory->init_page_count;
+ else
+ memory->num_bytes_per_page = UINT32_MAX;
+
+ if (memory->init_page_count > 0)
+ memory->init_page_count = memory->max_page_count = 1;
+ else
+ memory->init_page_count = memory->max_page_count = 0;
}
}
@@ -5506,7 +5519,6 @@ re_scan:
}
case WASM_OP_DROP:
- case WASM_OP_DROP_64:
{
BranchBlock *cur_block = loader_ctx->frame_csp - 1;
int32 available_stack_cell =
@@ -5559,7 +5571,6 @@ re_scan:
}
case WASM_OP_SELECT:
- case WASM_OP_SELECT_64:
{
uint8 ref_type;
BranchBlock *cur_block = loader_ctx->frame_csp - 1;
diff --git a/core/iwasm/interpreter/wasm_runtime.c b/core/iwasm/interpreter/wasm_runtime.c
index 5b406ce9..e3ab2de2 100644
--- a/core/iwasm/interpreter/wasm_runtime.c
+++ b/core/iwasm/interpreter/wasm_runtime.c
@@ -109,8 +109,11 @@ memories_deinstantiate(WASMModuleInstance *module_inst,
for (i = 0; i < count; i++) {
if (memories[i]) {
#if WASM_ENABLE_MULTI_MODULE != 0
- if (i < module_inst->module->import_memory_count)
+ WASMModule *module = module_inst->module;
+ if (i < module->import_memory_count
+ && module->import_memories[i].u.memory.import_module) {
continue;
+ }
#endif
#if WASM_ENABLE_SHARED_MEMORY != 0
if (memories[i]->is_shared) {
@@ -203,18 +206,27 @@ memory_instantiate(WASMModuleInstance *module_inst, uint32 num_bytes_per_page,
if (init_page_count == max_page_count && init_page_count == 1) {
/* If only one page and at most one page, we just append
the app heap to the end of linear memory, enlarge the
- num_bytes_per_page, and don't change the page count*/
+ num_bytes_per_page, and don't change the page count */
heap_offset = num_bytes_per_page;
num_bytes_per_page += heap_size;
if (num_bytes_per_page < heap_size) {
set_error_buf(error_buf, error_buf_size,
- "memory size must be at most 65536 pages (4GiB)");
+ "failed to insert app heap into linear memory, "
+ "try using `--heap_size=0` option");
return NULL;
}
}
else if (heap_size > 0) {
- if (module->aux_heap_base_global_index != (uint32)-1
- && module->aux_heap_base < num_bytes_per_page * init_page_count) {
+ if (init_page_count == max_page_count && init_page_count == 0) {
+ /* If the memory data size is always 0, we resize it to
+ one page for app heap */
+ num_bytes_per_page = heap_size;
+ heap_offset = 0;
+ inc_page_count = 1;
+ }
+ else if (module->aux_heap_base_global_index != (uint32)-1
+ && module->aux_heap_base
+ < num_bytes_per_page * init_page_count) {
/* Insert app heap before __heap_base */
aux_heap_base = module->aux_heap_base;
bytes_of_last_page = aux_heap_base % num_bytes_per_page;
@@ -256,13 +268,18 @@ memory_instantiate(WASMModuleInstance *module_inst, uint32 num_bytes_per_page,
}
init_page_count += inc_page_count;
max_page_count += inc_page_count;
- if (init_page_count > 65536) {
+ if (init_page_count > DEFAULT_MAX_PAGES) {
set_error_buf(error_buf, error_buf_size,
- "memory size must be at most 65536 pages (4GiB)");
+ "failed to insert app heap into linear memory, "
+ "try using `--heap_size=0` option");
return NULL;
}
- if (max_page_count > 65536)
- max_page_count = 65536;
+ else if (init_page_count == DEFAULT_MAX_PAGES) {
+ num_bytes_per_page = UINT32_MAX;
+ init_page_count = max_page_count = 1;
+ }
+ if (max_page_count > DEFAULT_MAX_PAGES)
+ max_page_count = DEFAULT_MAX_PAGES;
}
LOG_VERBOSE("Memory instantiate:");
@@ -277,6 +294,7 @@ memory_instantiate(WASMModuleInstance *module_inst, uint32 num_bytes_per_page,
memory_data_size = (uint64)num_bytes_per_page * max_page_count;
}
#endif
+ bh_assert(memory_data_size <= 4 * (uint64)BH_GB);
/* Allocate memory space, addr data and global data */
if (!(memory = runtime_malloc((uint64)sizeof(WASMMemoryInstance), error_buf,
@@ -298,9 +316,8 @@ memory_instantiate(WASMModuleInstance *module_inst, uint32 num_bytes_per_page,
* both i and memarg.offset are u32 in range 0 to 4G
* so the range of ea is 0 to 8G
*/
- if (memory_data_size >= UINT32_MAX
- || !(memory->memory_data = mapped_mem =
- os_mmap(NULL, map_size, MMAP_PROT_NONE, MMAP_MAP_NONE))) {
+ if (!(memory->memory_data = mapped_mem =
+ os_mmap(NULL, map_size, MMAP_PROT_NONE, MMAP_MAP_NONE))) {
set_error_buf(error_buf, error_buf_size, "mmap memory failed");
goto fail1;
}
@@ -324,10 +341,14 @@ memory_instantiate(WASMModuleInstance *module_inst, uint32 num_bytes_per_page,
* again here */
#endif /* end of OS_ENABLE_HW_BOUND_CHECK */
+ if (memory_data_size > UINT32_MAX)
+ memory_data_size = (uint32)memory_data_size;
+
memory->module_type = Wasm_Module_Bytecode;
memory->num_bytes_per_page = num_bytes_per_page;
memory->cur_page_count = init_page_count;
memory->max_page_count = max_page_count;
+ memory->memory_data_size = (uint32)memory_data_size;
memory->heap_data = memory->memory_data + heap_offset;
memory->heap_data_end = memory->heap_data + heap_size;
@@ -1241,6 +1262,47 @@ check_linked_symbol(WASMModuleInstance *module_inst, char *error_buf,
return true;
}
+#if WASM_ENABLE_FAST_JIT != 0
+static uint32
+get_smallest_type_idx(WASMModule *module, WASMType *func_type)
+{
+ uint32 i;
+
+ for (i = 0; i < module->type_count; i++) {
+ if (func_type == module->types[i])
+ return i;
+ }
+
+ bh_assert(0);
+ return -1;
+}
+
+static bool
+init_func_type_indexes(WASMModuleInstance *module_inst, char *error_buf,
+ uint32 error_buf_size)
+{
+ uint32 i;
+ uint64 total_size = (uint64)sizeof(uint32) * module_inst->function_count;
+
+ /* Allocate memory */
+ if (!(module_inst->func_type_indexes =
+ runtime_malloc(total_size, error_buf, error_buf_size))) {
+ return false;
+ }
+
+ for (i = 0; i < module_inst->function_count; i++) {
+ WASMFunctionInstance *func_inst = module_inst->functions + i;
+ WASMType *func_type = func_inst->is_import_func
+ ? func_inst->u.func_import->func_type
+ : func_inst->u.func->func_type;
+ module_inst->func_type_indexes[i] =
+ get_smallest_type_idx(module_inst->module, func_type);
+ }
+
+ return true;
+}
+#endif
+
/**
* Instantiate module
*/
@@ -1363,6 +1425,10 @@ wasm_instantiate(WASMModule *module, bool is_sub_inst, uint32 stack_size,
&& !(module_inst->export_globals = export_globals_instantiate(
module, module_inst, module_inst->export_glob_count,
error_buf, error_buf_size)))
+#endif
+#if WASM_ENABLE_FAST_JIT != 0
+ || (module_inst->function_count > 0
+ && !init_func_type_indexes(module_inst, error_buf, error_buf_size))
#endif
) {
goto fail;
@@ -1693,6 +1759,11 @@ wasm_deinstantiate(WASMModuleInstance *module_inst, bool is_sub_inst)
if (!module_inst)
return;
+#if WASM_ENABLE_FAST_JIT != 0
+ if (module_inst->func_type_indexes)
+ wasm_runtime_free(module_inst->func_type_indexes);
+#endif
+
#if WASM_ENABLE_MULTI_MODULE != 0
sub_module_deinstantiate(module_inst);
#endif
@@ -2162,27 +2233,11 @@ wasm_module_malloc(WASMModuleInstance *module_inst, uint32 size,
addr = mem_allocator_malloc(memory->heap_handle, size);
}
else if (module_inst->malloc_function && module_inst->free_function) {
-#if WASM_ENABLE_DEBUG_INTERP != 0
- /* TODO: obviously, we can not create debug instance for
- * module malloc here, so, just disable the engine here,
- * it is strange, but we now are lack of ways to indicate
- * which calls should not be debugged. And we have other
- * execute_xxx_function may need to be taken care of
- */
- bool active = wasm_debug_get_engine_active();
- wasm_debug_set_engine_active(false);
-#endif
if (!execute_malloc_function(module_inst, module_inst->malloc_function,
module_inst->retain_function, size,
&offset)) {
-#if WASM_ENABLE_DEBUG_INTERP != 0
- wasm_debug_set_engine_active(active);
-#endif
return 0;
}
-#if WASM_ENABLE_DEBUG_INTERP != 0
- wasm_debug_set_engine_active(active);
-#endif
/* If we use app's malloc function,
the default memory may be changed while memory growing */
memory = module_inst->default_memory;
@@ -2261,17 +2316,7 @@ wasm_module_free(WASMModuleInstance *module_inst, uint32 ptr)
else if (module_inst->malloc_function && module_inst->free_function
&& memory->memory_data <= addr
&& addr < memory->memory_data_end) {
-#if WASM_ENABLE_DEBUG_INTERP != 0
- /*TODO: obviously, we can not create debug instance for module
- malloc here, so, just disable the engine here, it is strange. the
- wasm's call should be marshed to its own thread */
- bool active = wasm_debug_get_engine_active();
- wasm_debug_set_engine_active(false);
-#endif
execute_free_function(module_inst, module_inst->free_function, ptr);
-#if WASM_ENABLE_DEBUG_INTERP != 0
- wasm_debug_set_engine_active(active);
-#endif
}
}
}
@@ -2418,39 +2463,49 @@ bool
wasm_enlarge_memory(WASMModuleInstance *module, uint32 inc_page_count)
{
WASMMemoryInstance *memory = module->default_memory;
- uint8 *new_memory_data, *memory_data, *heap_data_old;
- uint32 heap_size, total_size_old, total_page_count;
- uint64 total_size;
+ uint8 *memory_data_old, *memory_data_new, *heap_data_old;
+ uint32 num_bytes_per_page, heap_size, total_size_old;
+ uint32 cur_page_count, max_page_count, total_page_count;
+ uint64 total_size_new;
bool ret = true;
if (!memory)
return false;
- memory_data = memory->memory_data;
- heap_size = (uint32)(memory->heap_data_end - memory->heap_data);
- total_size_old = (uint32)(memory->memory_data_end - memory_data);
- total_page_count = inc_page_count + memory->cur_page_count;
- total_size = memory->num_bytes_per_page * (uint64)total_page_count;
heap_data_old = memory->heap_data;
+ heap_size = (uint32)(memory->heap_data_end - memory->heap_data);
+
+ memory_data_old = memory->memory_data;
+ total_size_old = memory->memory_data_size;
+
+ num_bytes_per_page = memory->num_bytes_per_page;
+ cur_page_count = memory->cur_page_count;
+ max_page_count = memory->max_page_count;
+ total_page_count = inc_page_count + cur_page_count;
+ total_size_new = num_bytes_per_page * (uint64)total_page_count;
if (inc_page_count <= 0)
/* No need to enlarge memory */
return true;
- if (total_page_count < memory->cur_page_count /* integer overflow */
- || total_page_count > memory->max_page_count) {
+ if (total_page_count < cur_page_count /* integer overflow */
+ || total_page_count > max_page_count) {
return false;
}
- if (total_size >= UINT32_MAX) {
- return false;
+ bh_assert(total_size_new <= 4 * (uint64)BH_GB);
+ if (total_size_new > UINT32_MAX) {
+ /* Resize to 1 page with size 4G-1 */
+ num_bytes_per_page = UINT32_MAX;
+ total_page_count = max_page_count = 1;
+ total_size_new = UINT32_MAX;
}
#if WASM_ENABLE_SHARED_MEMORY != 0
if (memory->is_shared) {
- /* For shared memory, we have reserved the maximum spaces during
- instantiate, only change the cur_page_count here */
+ memory->num_bytes_per_page = UINT32_MAX;
memory->cur_page_count = total_page_count;
+ memory->max_page_count = max_page_count;
return true;
}
#endif
@@ -2462,25 +2517,25 @@ wasm_enlarge_memory(WASMModuleInstance *module, uint32 inc_page_count)
}
}
- if (!(new_memory_data =
- wasm_runtime_realloc(memory_data, (uint32)total_size))) {
- if (!(new_memory_data = wasm_runtime_malloc((uint32)total_size))) {
+ if (!(memory_data_new =
+ wasm_runtime_realloc(memory_data_old, (uint32)total_size_new))) {
+ if (!(memory_data_new = wasm_runtime_malloc((uint32)total_size_new))) {
return false;
}
- if (memory_data) {
- bh_memcpy_s(new_memory_data, (uint32)total_size, memory_data,
- total_size_old);
- wasm_runtime_free(memory_data);
+ if (memory_data_old) {
+ bh_memcpy_s(memory_data_new, (uint32)total_size_new,
+ memory_data_old, total_size_old);
+ wasm_runtime_free(memory_data_old);
}
}
- memset(new_memory_data + total_size_old, 0,
- (uint32)total_size - total_size_old);
+ memset(memory_data_new + total_size_old, 0,
+ (uint32)total_size_new - total_size_old);
if (heap_size > 0) {
if (mem_allocator_migrate(memory->heap_handle,
(char *)heap_data_old
- + (new_memory_data - memory_data),
+ + (memory_data_new - memory_data_old),
heap_size)
!= 0) {
/* Don't return here as memory->memory_data is obsolete and
@@ -2489,26 +2544,30 @@ wasm_enlarge_memory(WASMModuleInstance *module, uint32 inc_page_count)
}
}
- memory->memory_data = new_memory_data;
- memory->cur_page_count = total_page_count;
- memory->heap_data = new_memory_data + (heap_data_old - memory_data);
+ memory->heap_data = memory_data_new + (heap_data_old - memory_data_old);
memory->heap_data_end = memory->heap_data + heap_size;
- memory->memory_data_end =
- memory->memory_data + memory->num_bytes_per_page * total_page_count;
+
+ memory->num_bytes_per_page = num_bytes_per_page;
+ memory->cur_page_count = total_page_count;
+ memory->max_page_count = max_page_count;
+ memory->memory_data_size = (uint32)total_size_new;
+
+ memory->memory_data = memory_data_new;
+ memory->memory_data_end = memory_data_new + (uint32)total_size_new;
#if WASM_ENABLE_FAST_JIT != 0
#if UINTPTR_MAX == UINT64_MAX
- memory->mem_bound_check_1byte = total_size - 1;
- memory->mem_bound_check_2bytes = total_size - 2;
- memory->mem_bound_check_4bytes = total_size - 4;
- memory->mem_bound_check_8bytes = total_size - 8;
- memory->mem_bound_check_16bytes = total_size - 16;
+ memory->mem_bound_check_1byte = total_size_new - 1;
+ memory->mem_bound_check_2bytes = total_size_new - 2;
+ memory->mem_bound_check_4bytes = total_size_new - 4;
+ memory->mem_bound_check_8bytes = total_size_new - 8;
+ memory->mem_bound_check_16bytes = total_size_new - 16;
#else
- memory->mem_bound_check_1byte = (uint32)total_size - 1;
- memory->mem_bound_check_2bytes = (uint32)total_size - 2;
- memory->mem_bound_check_4bytes = (uint32)total_size - 4;
- memory->mem_bound_check_8bytes = (uint32)total_size - 8;
- memory->mem_bound_check_16bytes = (uint32)total_size - 16;
+ memory->mem_bound_check_1byte = (uint32)total_size_new - 1;
+ memory->mem_bound_check_2bytes = (uint32)total_size_new - 2;
+ memory->mem_bound_check_4bytes = (uint32)total_size_new - 4;
+ memory->mem_bound_check_8bytes = (uint32)total_size_new - 8;
+ memory->mem_bound_check_16bytes = (uint32)total_size_new - 16;
#endif
#endif
@@ -2519,39 +2578,52 @@ bool
wasm_enlarge_memory(WASMModuleInstance *module, uint32 inc_page_count)
{
WASMMemoryInstance *memory = module->default_memory;
- uint32 num_bytes_per_page, total_page_count;
+ uint32 num_bytes_per_page, total_size_old;
+ uint32 cur_page_count, max_page_count, total_page_count;
+ uint64 total_size_new;
if (!memory)
return false;
- total_page_count = inc_page_count + memory->cur_page_count;
+ num_bytes_per_page = memory->num_bytes_per_page;
+ cur_page_count = memory->cur_page_count;
+ max_page_count = memory->max_page_count;
+ total_size_old = num_bytes_per_page * cur_page_count;
+ total_page_count = inc_page_count + cur_page_count;
+ total_size_new = num_bytes_per_page * (uint64)total_page_count;
if (inc_page_count <= 0)
/* No need to enlarge memory */
return true;
- if (total_page_count < memory->cur_page_count /* integer overflow */
- || total_page_count > memory->max_page_count) {
+ if (total_page_count < cur_page_count /* integer overflow */
+ || total_page_count > max_page_count) {
return false;
}
- num_bytes_per_page = memory->num_bytes_per_page;
+ bh_assert(total_size_new <= 4 * (uint64)BH_GB);
+ if (total_size_new > UINT32_MAX) {
+ /* Resize to 1 page with size 4G-1 */
+ num_bytes_per_page = UINT32_MAX;
+ total_page_count = max_page_count = 1;
+ total_size_new = UINT32_MAX;
+ }
#ifdef BH_PLATFORM_WINDOWS
if (!os_mem_commit(memory->memory_data_end,
- num_bytes_per_page * inc_page_count,
+ (uint32)total_size_new - total_size_old,
MMAP_PROT_READ | MMAP_PROT_WRITE)) {
return false;
}
#endif
if (os_mprotect(memory->memory_data_end,
- num_bytes_per_page * inc_page_count,
+ (uint32)total_size_new - total_size_old,
MMAP_PROT_READ | MMAP_PROT_WRITE)
!= 0) {
#ifdef BH_PLATFORM_WINDOWS
os_mem_decommit(memory->memory_data_end,
- num_bytes_per_page * inc_page_count);
+ (uint32)total_size_new - total_size_old);
#endif
return false;
}
@@ -2559,9 +2631,20 @@ wasm_enlarge_memory(WASMModuleInstance *module, uint32 inc_page_count)
/* The increased pages are filled with zero by the OS when os_mmap,
no need to memset it again here */
+ memory->num_bytes_per_page = num_bytes_per_page;
memory->cur_page_count = total_page_count;
- memory->memory_data_end =
- memory->memory_data + num_bytes_per_page * total_page_count;
+ memory->max_page_count = max_page_count;
+ memory->memory_data_size = (uint32)total_size_new;
+ memory->memory_data_end = memory->memory_data + (uint32)total_size_new;
+
+#if WASM_ENABLE_FAST_JIT != 0
+ memory->mem_bound_check_1byte = total_size_new - 1;
+ memory->mem_bound_check_2bytes = total_size_new - 2;
+ memory->mem_bound_check_4bytes = total_size_new - 4;
+ memory->mem_bound_check_8bytes = total_size_new - 8;
+ memory->mem_bound_check_16bytes = total_size_new - 16;
+#endif
+
return true;
}
#endif /* end of OS_ENABLE_HW_BOUND_CHECK */
diff --git a/core/iwasm/interpreter/wasm_runtime.h b/core/iwasm/interpreter/wasm_runtime.h
index bbdf9e86..4cdbf5ba 100644
--- a/core/iwasm/interpreter/wasm_runtime.h
+++ b/core/iwasm/interpreter/wasm_runtime.h
@@ -26,12 +26,25 @@ struct WASMMemoryInstance {
uint32 module_type;
/* Shared memory flag */
bool is_shared;
+
/* Number bytes per page */
uint32 num_bytes_per_page;
/* Current page count */
uint32 cur_page_count;
/* Maximum page count */
uint32 max_page_count;
+ /* Memory data size */
+ uint32 memory_data_size;
+
+ /**
+ * Memory data begin address, Note:
+ * the app-heap might be inserted in to the linear memory,
+ * when memory is re-allocated, the heap data and memory data
+ * must be copied to new memory also
+ */
+ uint8 *memory_data;
+ /* Memory data end address */
+ uint8 *memory_data_end;
/* Heap data base address */
uint8 *heap_data;
@@ -45,14 +58,6 @@ struct WASMMemoryInstance {
korp_mutex mem_lock;
#endif
- /* Memory data end address */
- uint8 *memory_data_end;
-
- /* Memory data begin address, the layout is: memory data + heap data
- Note: when memory is re-allocated, the heap data and memory data
- must be copied to new memory also. */
- uint8 *memory_data;
-
#if WASM_ENABLE_FAST_JIT != 0
#if UINTPTR_MAX == UINT64_MAX
uint64 mem_bound_check_1byte;
@@ -186,6 +191,7 @@ struct WASMModuleInstance {
#if WASM_ENABLE_FAST_JIT != 0
/* point to JITed functions */
void **fast_jit_func_ptrs;
+ uint32 *func_type_indexes;
#endif
WASMMemoryInstance **memories;
diff --git a/core/iwasm/libraries/debug-engine/debug_engine.c b/core/iwasm/libraries/debug-engine/debug_engine.c
index 1852d05d..e62ba5a2 100644
--- a/core/iwasm/libraries/debug-engine/debug_engine.c
+++ b/core/iwasm/libraries/debug-engine/debug_engine.c
@@ -11,17 +11,15 @@
#include "wasm_opcode.h"
#include "wasm_runtime.h"
-static uint8 break_instr[] = { DEBUG_OP_BREAK };
+static const uint8 break_instr[] = { DEBUG_OP_BREAK };
typedef struct WASMDebugEngine {
struct WASMDebugEngine *next;
WASMDebugControlThread *control_thread;
char ip_addr[128];
- int32 platform_port;
int32 process_base_port;
bh_list debug_instance_list;
korp_mutex instance_list_lock;
- bool active;
} WASMDebugEngine;
void
@@ -81,10 +79,12 @@ control_thread_routine(void *arg)
control_thread->debug_instance = debug_inst;
bh_strcpy_s(control_thread->ip_addr, sizeof(control_thread->ip_addr),
g_debug_engine->ip_addr);
- control_thread->port =
- (g_debug_engine->process_base_port == 0)
- ? 0
- : g_debug_engine->process_base_port + debug_inst->id;
+ if (control_thread->port == -1) {
+ control_thread->port =
+ (g_debug_engine->process_base_port == 0)
+ ? 0
+ : g_debug_engine->process_base_port + debug_inst->id - 1;
+ }
LOG_WARNING("control thread of debug object %p start\n", debug_inst);
@@ -93,6 +93,7 @@ control_thread_routine(void *arg)
if (!control_thread->server) {
LOG_ERROR("Failed to create debug server\n");
+ control_thread->port = 0;
os_cond_signal(&debug_inst->wait_cond);
os_mutex_unlock(&debug_inst->wait_lock);
return NULL;
@@ -178,7 +179,7 @@ control_thread_routine(void *arg)
}
static WASMDebugControlThread *
-wasm_debug_control_thread_create(WASMDebugInstance *debug_instance)
+wasm_debug_control_thread_create(WASMDebugInstance *debug_instance, int32 port)
{
WASMDebugControlThread *control_thread;
@@ -188,6 +189,7 @@ wasm_debug_control_thread_create(WASMDebugInstance *debug_instance)
return NULL;
}
memset(control_thread, 0, sizeof(WASMDebugControlThread));
+ control_thread->port = port;
if (os_mutex_init(&control_thread->wait_lock) != 0)
goto fail;
@@ -198,7 +200,7 @@ wasm_debug_control_thread_create(WASMDebugInstance *debug_instance)
if (0
!= os_thread_create(&control_thread->tid, control_thread_routine,
- debug_instance, APP_THREAD_STACK_SIZE_MAX)) {
+ debug_instance, APP_THREAD_STACK_SIZE_DEFAULT)) {
os_mutex_unlock(&debug_instance->wait_lock);
goto fail1;
}
@@ -265,16 +267,6 @@ wasm_debug_engine_create()
/* reset current instance id */
current_instance_id = 1;
- /* TODO: support Wasm platform in LLDB */
- /*
- engine->control_thread =
- wasm_debug_control_thread_create((WASMDebugObject *)engine);
- engine->control_thread->debug_engine = (WASMDebugObject *)engine;
- engine->control_thread->debug_instance = NULL;
- sprintf(engine->control_thread->ip_addr, "127.0.0.1");
- engine->control_thread->port = 1234;
- */
-
bh_list_init(&engine->debug_instance_list);
return engine;
}
@@ -291,7 +283,7 @@ wasm_debug_engine_destroy()
}
bool
-wasm_debug_engine_init(char *ip_addr, int32 platform_port, int32 process_port)
+wasm_debug_engine_init(char *ip_addr, int32 process_port)
{
if (wasm_debug_handler_init() != 0) {
return false;
@@ -302,9 +294,6 @@ wasm_debug_engine_init(char *ip_addr, int32 platform_port, int32 process_port)
}
if (g_debug_engine) {
- process_port -= 1;
- g_debug_engine->platform_port =
- platform_port > 0 ? platform_port : 1234;
g_debug_engine->process_base_port =
(process_port > 0) ? process_port : 0;
if (ip_addr)
@@ -313,7 +302,6 @@ wasm_debug_engine_init(char *ip_addr, int32 platform_port, int32 process_port)
else
snprintf(g_debug_engine->ip_addr, sizeof(g_debug_engine->ip_addr),
"%s", "127.0.0.1");
- g_debug_engine->active = true;
}
else {
wasm_debug_handler_deinit();
@@ -322,33 +310,16 @@ wasm_debug_engine_init(char *ip_addr, int32 platform_port, int32 process_port)
return g_debug_engine != NULL ? true : false;
}
-void
-wasm_debug_set_engine_active(bool active)
-{
- if (g_debug_engine) {
- g_debug_engine->active = active;
- }
-}
-
-bool
-wasm_debug_get_engine_active(void)
-{
- if (g_debug_engine) {
- return g_debug_engine->active;
- }
- return false;
-}
-
/* A debug Instance is a debug "process" in gdb remote protocol
and bound to a runtime cluster */
WASMDebugInstance *
-wasm_debug_instance_create(WASMCluster *cluster)
+wasm_debug_instance_create(WASMCluster *cluster, int32 port)
{
WASMDebugInstance *instance;
WASMExecEnv *exec_env = NULL;
wasm_module_inst_t module_inst = NULL;
- if (!g_debug_engine || !g_debug_engine->active) {
+ if (!g_debug_engine) {
return NULL;
}
@@ -392,7 +363,7 @@ wasm_debug_instance_create(WASMCluster *cluster)
}
instance->exec_mem_info.current_pos = instance->exec_mem_info.start_offset;
- if (!wasm_debug_control_thread_create(instance)) {
+ if (!wasm_debug_control_thread_create(instance, port)) {
LOG_ERROR("WASM Debug Engine error: failed to create control thread");
goto fail3;
}
diff --git a/core/iwasm/libraries/debug-engine/debug_engine.h b/core/iwasm/libraries/debug-engine/debug_engine.h
index 361f02e4..70901551 100644
--- a/core/iwasm/libraries/debug-engine/debug_engine.h
+++ b/core/iwasm/libraries/debug-engine/debug_engine.h
@@ -108,7 +108,7 @@ void
on_thread_stop_event(WASMDebugInstance *debug_inst, WASMExecEnv *exec_env);
WASMDebugInstance *
-wasm_debug_instance_create(WASMCluster *cluster);
+wasm_debug_instance_create(WASMCluster *cluster, int32 port);
void
wasm_debug_instance_destroy(WASMCluster *cluster);
@@ -117,17 +117,11 @@ WASMDebugInstance *
wasm_exec_env_get_instance(WASMExecEnv *exec_env);
bool
-wasm_debug_engine_init(char *ip_addr, int32 platform_port, int32 process_port);
+wasm_debug_engine_init(char *ip_addr, int32 process_port);
void
wasm_debug_engine_destroy();
-void
-wasm_debug_set_engine_active(bool active);
-
-bool
-wasm_debug_get_engine_active(void);
-
WASMExecEnv *
wasm_debug_instance_get_current_env(WASMDebugInstance *instance);
diff --git a/core/iwasm/libraries/debug-engine/gdbserver.c b/core/iwasm/libraries/debug-engine/gdbserver.c
index 2cb6a14f..e347cc34 100644
--- a/core/iwasm/libraries/debug-engine/gdbserver.c
+++ b/core/iwasm/libraries/debug-engine/gdbserver.c
@@ -18,7 +18,7 @@ struct packet_handler_elem {
#define DEL_HANDLER(r, h) [r] = { .request = r, .handler = h }
-static struct packet_handler_elem packet_handler_table[255] = {
+static const struct packet_handler_elem packet_handler_table[255] = {
DEL_HANDLER('Q', handle_general_set),
DEL_HANDLER('q', handle_general_query),
DEL_HANDLER('v', handle_v_packet),
diff --git a/core/iwasm/libraries/debug-engine/handler.c b/core/iwasm/libraries/debug-engine/handler.c
index 4623f21d..da07f80d 100644
--- a/core/iwasm/libraries/debug-engine/handler.c
+++ b/core/iwasm/libraries/debug-engine/handler.c
@@ -10,19 +10,51 @@
#include "utils.h"
#include "wasm_runtime.h"
-#define MAX_PACKET_SIZE (0x20000)
-static char tmpbuf[MAX_PACKET_SIZE];
+/*
+ * Note: A moderate MAX_PACKET_SIZE is ok because
+ * LLDB queries our buffer size (via qSupported PacketSize)
+ * and limits packet sizes accordingly.
+ */
+
+#if defined(DEBUG_MAX_PACKET_SIZE)
+#define MAX_PACKET_SIZE DEBUG_MAX_PACKET_SIZE
+#else
+#define MAX_PACKET_SIZE (4096)
+#endif
+
+/*
+ * Note: It's assumed that MAX_PACKET_SIZE is reasonably large.
+ * See GetWorkingDir, WasmCallStack, etc.
+ */
+#if MAX_PACKET_SIZE < PATH_MAX || MAX_PACKET_SIZE < (2048 + 1)
+#error MAX_PACKET_SIZE is too small
+#endif
+
+static char *tmpbuf;
static korp_mutex tmpbuf_lock;
int
wasm_debug_handler_init()
{
- return os_mutex_init(&tmpbuf_lock);
+ int ret;
+ tmpbuf = wasm_runtime_malloc(MAX_PACKET_SIZE);
+ if (tmpbuf == NULL) {
+ LOG_ERROR("debug-engine: Packet buffer allocation failure");
+ return BHT_ERROR;
+ }
+ ret = os_mutex_init(&tmpbuf_lock);
+ if (ret != BHT_OK) {
+ wasm_runtime_free(tmpbuf);
+ tmpbuf = NULL;
+ }
+ return ret;
}
void
wasm_debug_handler_deinit()
{
+ wasm_runtime_free(tmpbuf);
+ tmpbuf = NULL;
os_mutex_destroy(&tmpbuf_lock);
}
@@ -76,14 +108,17 @@ process_xfer(WASMGDBServer *server, const char *name, char *args)
os_mutex_lock(&tmpbuf_lock);
#if WASM_ENABLE_LIBC_WASI != 0
char objname[128];
- wasm_debug_instance_get_current_object_name(
- (WASMDebugInstance *)server->thread->debug_instance, objname, 128);
- snprintf(tmpbuf, sizeof(tmpbuf),
+ if (!wasm_debug_instance_get_current_object_name(
+ (WASMDebugInstance *)server->thread->debug_instance, objname,
+ 128)) {
+ objname[0] = 0; /* use an empty string */
+ }
+ snprintf(tmpbuf, MAX_PACKET_SIZE,
"l",
objname, addr);
#else
- snprintf(tmpbuf, sizeof(tmpbuf),
+ snprintf(tmpbuf, MAX_PACKET_SIZE,
"l",
"nobody.wasm", addr);
@@ -103,7 +138,7 @@ process_wasm_local(WASMGDBServer *server, char *args)
bool ret;
os_mutex_lock(&tmpbuf_lock);
- snprintf(tmpbuf, sizeof(tmpbuf), "E01");
+ snprintf(tmpbuf, MAX_PACKET_SIZE, "E01");
if (sscanf(args, "%" PRId32 ";%" PRId32, &frame_index, &local_index) == 2) {
ret = wasm_debug_instance_get_local(
(WASMDebugInstance *)server->thread->debug_instance, frame_index,
@@ -126,7 +161,7 @@ process_wasm_global(WASMGDBServer *server, char *args)
bool ret;
os_mutex_lock(&tmpbuf_lock);
- snprintf(tmpbuf, sizeof(tmpbuf), "E01");
+ snprintf(tmpbuf, MAX_PACKET_SIZE, "E01");
if (sscanf(args, "%" PRId32 ";%" PRId32, &frame_index, &global_index)
== 2) {
ret = wasm_debug_instance_get_global(
@@ -161,14 +196,14 @@ handle_general_query(WASMGDBServer *server, char *payload)
(WASMDebugInstance *)server->thread->debug_instance);
os_mutex_lock(&tmpbuf_lock);
- snprintf(tmpbuf, sizeof(tmpbuf), "QCp%" PRIx64 ".%" PRIx64 "", pid,
+ snprintf(tmpbuf, MAX_PACKET_SIZE, "QCp%" PRIx64 ".%" PRIx64 "", pid,
tid);
write_packet(server, tmpbuf);
os_mutex_unlock(&tmpbuf_lock);
}
if (!strcmp(name, "Supported")) {
os_mutex_lock(&tmpbuf_lock);
- snprintf(tmpbuf, sizeof(tmpbuf),
+ snprintf(tmpbuf, MAX_PACKET_SIZE,
"qXfer:libraries:read+;PacketSize=%" PRIx32 ";",
MAX_PACKET_SIZE);
write_packet(server, tmpbuf);
@@ -196,7 +231,7 @@ handle_general_query(WASMGDBServer *server, char *payload)
strlen("wasm32-wamr-wasi-wasm"));
os_mutex_lock(&tmpbuf_lock);
- snprintf(tmpbuf, sizeof(tmpbuf),
+ snprintf(tmpbuf, MAX_PACKET_SIZE,
"vendor:wamr;ostype:wasi;arch:wasm32;"
"triple:%s;endian:little;ptrsize:4;",
triple);
@@ -227,7 +262,7 @@ handle_general_query(WASMGDBServer *server, char *payload)
strlen("wasm32-wamr-wasi-wasm"));
os_mutex_lock(&tmpbuf_lock);
- snprintf(tmpbuf, sizeof(tmpbuf),
+ snprintf(tmpbuf, MAX_PACKET_SIZE,
"pid:%" PRIx64 ";parent-pid:%" PRIx64
";vendor:wamr;ostype:wasi;arch:wasm32;"
"triple:%s;endian:little;ptrsize:4;",
@@ -238,7 +273,7 @@ handle_general_query(WASMGDBServer *server, char *payload)
if (!strcmp(name, "RegisterInfo0")) {
os_mutex_lock(&tmpbuf_lock);
snprintf(
- tmpbuf, sizeof(tmpbuf),
+ tmpbuf, MAX_PACKET_SIZE,
"name:pc;alt-name:pc;bitsize:64;offset:0;encoding:uint;format:hex;"
"set:General Purpose Registers;gcc:16;dwarf:16;generic:pc;");
write_packet(server, tmpbuf);
@@ -260,7 +295,7 @@ handle_general_query(WASMGDBServer *server, char *payload)
mem2hex(mem_info->name, name_buf, strlen(mem_info->name));
os_mutex_lock(&tmpbuf_lock);
- snprintf(tmpbuf, sizeof(tmpbuf),
+ snprintf(tmpbuf, MAX_PACKET_SIZE,
"start:%" PRIx64 ";size:%" PRIx64
";permissions:%s;name:%s;",
(uint64)mem_info->start, mem_info->size,
@@ -339,7 +374,7 @@ send_thread_stop_status(WASMGDBServer *server, uint32 status, korp_tid tid)
if (status == 0) {
os_mutex_lock(&tmpbuf_lock);
- snprintf(tmpbuf, sizeof(tmpbuf), "W%02x", status);
+ snprintf(tmpbuf, MAX_PACKET_SIZE, "W%02x", status);
write_packet(server, tmpbuf);
os_mutex_unlock(&tmpbuf_lock);
return;
@@ -355,16 +390,16 @@ send_thread_stop_status(WASMGDBServer *server, uint32 status, korp_tid tid)
os_mutex_lock(&tmpbuf_lock);
// TODO: how name a wasm thread?
- len += snprintf(tmpbuf, sizeof(tmpbuf), "T%02xthread:%" PRIx64 ";name:%s;",
+ len += snprintf(tmpbuf, MAX_PACKET_SIZE, "T%02xthread:%" PRIx64 ";name:%s;",
gdb_status, (uint64)(uintptr_t)tid, "nobody");
if (tids_count > 0) {
- len += snprintf(tmpbuf + len, sizeof(tmpbuf) - len, "threads:");
+ len += snprintf(tmpbuf + len, MAX_PACKET_SIZE - len, "threads:");
while (i < tids_count) {
if (i == tids_count - 1)
- len += snprintf(tmpbuf + len, sizeof(tmpbuf) - len,
+ len += snprintf(tmpbuf + len, MAX_PACKET_SIZE - len,
"%" PRIx64 ";", (uint64)(uintptr_t)tids[i]);
else
- len += snprintf(tmpbuf + len, sizeof(tmpbuf) - len,
+ len += snprintf(tmpbuf + len, MAX_PACKET_SIZE - len,
"%" PRIx64 ",", (uint64)(uintptr_t)tids[i]);
i++;
}
@@ -383,29 +418,29 @@ send_thread_stop_status(WASMGDBServer *server, uint32 status, korp_tid tid)
* correctly processed by LLDB */
uint32 exception_len = strlen(exception);
len +=
- snprintf(tmpbuf + len, sizeof(tmpbuf) - len,
+ snprintf(tmpbuf + len, MAX_PACKET_SIZE - len,
"thread-pcs:%" PRIx64 ";00:%s;reason:%s;description:", pc,
pc_string, "exception");
/* The description should be encoded as HEX */
for (i = 0; i < exception_len; i++) {
- len += snprintf(tmpbuf + len, sizeof(tmpbuf) - len, "%02x",
+ len += snprintf(tmpbuf + len, MAX_PACKET_SIZE - len, "%02x",
exception[i]);
}
- len += snprintf(tmpbuf + len, sizeof(tmpbuf) - len, ";");
+ len += snprintf(tmpbuf + len, MAX_PACKET_SIZE - len, ";");
}
else {
if (status == WAMR_SIG_TRAP) {
- len += snprintf(tmpbuf + len, sizeof(tmpbuf) - len,
+ len += snprintf(tmpbuf + len, MAX_PACKET_SIZE - len,
"thread-pcs:%" PRIx64 ";00:%s;reason:%s;", pc,
pc_string, "breakpoint");
}
else if (status == WAMR_SIG_SINGSTEP) {
- len += snprintf(tmpbuf + len, sizeof(tmpbuf) - len,
+ len += snprintf(tmpbuf + len, MAX_PACKET_SIZE - len,
"thread-pcs:%" PRIx64 ";00:%s;reason:%s;", pc,
pc_string, "trace");
}
else if (status > 0) {
- len += snprintf(tmpbuf + len, sizeof(tmpbuf) - len,
+ len += snprintf(tmpbuf + len, MAX_PACKET_SIZE - len,
"thread-pcs:%" PRIx64 ";00:%s;reason:%s;", pc,
pc_string, "signal");
}
@@ -551,7 +586,7 @@ handle_get_read_memory(WASMGDBServer *server, char *payload)
bool ret;
os_mutex_lock(&tmpbuf_lock);
- snprintf(tmpbuf, sizeof(tmpbuf), "%s", "");
+ snprintf(tmpbuf, MAX_PACKET_SIZE, "%s", "");
if (sscanf(payload, "%" SCNx64 ",%" SCNx64, &maddr, &mlen) == 2) {
char *buff;
@@ -585,7 +620,7 @@ handle_get_write_memory(WASMGDBServer *server, char *payload)
bool ret;
os_mutex_lock(&tmpbuf_lock);
- snprintf(tmpbuf, sizeof(tmpbuf), "%s", "");
+ snprintf(tmpbuf, MAX_PACKET_SIZE, "%s", "");
if (sscanf(payload, "%" SCNx64 ",%" SCNx64 ":%n", &maddr, &mlen, &offset)
== 2) {
payload += offset;
@@ -599,7 +634,7 @@ handle_get_write_memory(WASMGDBServer *server, char *payload)
(WASMDebugInstance *)server->thread->debug_instance, maddr,
buff, &mlen);
if (ret) {
- snprintf(tmpbuf, sizeof(tmpbuf), "%s", "OK");
+ snprintf(tmpbuf, MAX_PACKET_SIZE, "%s", "OK");
}
wasm_runtime_free(buff);
}
@@ -681,7 +716,7 @@ handle_malloc(WASMGDBServer *server, char *payload)
}
os_mutex_lock(&tmpbuf_lock);
- snprintf(tmpbuf, sizeof(tmpbuf), "%s", "E03");
+ snprintf(tmpbuf, MAX_PACKET_SIZE, "%s", "E03");
size = strtoll(payload, NULL, 16);
if (size > 0) {
@@ -701,7 +736,7 @@ handle_malloc(WASMGDBServer *server, char *payload)
(WASMDebugInstance *)server->thread->debug_instance, size,
map_prot);
if (addr) {
- snprintf(tmpbuf, sizeof(tmpbuf), "%" PRIx64, addr);
+ snprintf(tmpbuf, MAX_PACKET_SIZE, "%" PRIx64, addr);
}
}
write_packet(server, tmpbuf);
@@ -715,13 +750,13 @@ handle_free(WASMGDBServer *server, char *payload)
bool ret;
os_mutex_lock(&tmpbuf_lock);
- snprintf(tmpbuf, sizeof(tmpbuf), "%s", "E03");
+ snprintf(tmpbuf, MAX_PACKET_SIZE, "%s", "E03");
addr = strtoll(payload, NULL, 16);
ret = wasm_debug_instance_ummap(
(WASMDebugInstance *)server->thread->debug_instance, addr);
if (ret) {
- snprintf(tmpbuf, sizeof(tmpbuf), "%s", "OK");
+ snprintf(tmpbuf, MAX_PACKET_SIZE, "%s", "OK");
}
write_packet(server, tmpbuf);
diff --git a/core/iwasm/libraries/lib-rats/lib_rats.cmake b/core/iwasm/libraries/lib-rats/lib_rats.cmake
new file mode 100644
index 00000000..482fd956
--- /dev/null
+++ b/core/iwasm/libraries/lib-rats/lib_rats.cmake
@@ -0,0 +1,33 @@
+# Copyright (c) 2022 Intel Corporation
+# Copyright (c) 2020-2021 Alibaba Cloud
+# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+
+set (LIB_RATS_DIR ${CMAKE_CURRENT_LIST_DIR})
+
+add_definitions (-DWASM_ENABLE_LIB_RATS=1)
+
+include_directories(${LIB_RATS_DIR})
+
+include(FetchContent)
+
+set(RATS_BUILD_MODE "sgx"
+ CACHE INTERNAL "Select build mode for librats(host|occlum|sgx|wasm)")
+set(RATS_INSTALL_PATH "${CMAKE_BINARY_DIR}/librats" CACHE INTERNAL "")
+
+FetchContent_Declare(
+ librats
+ GIT_REPOSITORY https://github.com/inclavare-containers/librats
+ GIT_TAG master
+)
+FetchContent_GetProperties(librats)
+if (NOT librats_POPULATED)
+ message("-- Fetching librats ..")
+ FetchContent_Populate(librats)
+ include_directories("${librats_SOURCE_DIR}/include")
+ add_subdirectory(${librats_SOURCE_DIR} ${librats_BINARY_DIR} EXCLUDE_FROM_ALL)
+
+endif()
+
+file (GLOB source_all ${LIB_RATS_DIR}/*.c)
+
+set (LIB_RATS_SOURCE ${source_all})
\ No newline at end of file
diff --git a/core/iwasm/libraries/lib-rats/lib_rats_wrapper.c b/core/iwasm/libraries/lib-rats/lib_rats_wrapper.c
new file mode 100644
index 00000000..e89337fd
--- /dev/null
+++ b/core/iwasm/libraries/lib-rats/lib_rats_wrapper.c
@@ -0,0 +1,60 @@
+/*
+ * Copyright (c) 2022 Intel Corporation
+ * Copyright (c) 2020-2021 Alibaba Cloud
+ *
+ * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+ */
+
+#include
+#include
+#include
+
+#include "wasm_export.h"
+#include "bh_common.h"
+
+static uint32
+librats_collect_wrapper(wasm_exec_env_t exec_env, const uint8_t *hash)
+{
+ char *json = NULL;
+ char *str_ret;
+ uint32 len;
+ uint32 str_ret_offset = 0;
+ wasm_module_inst_t module_inst = get_module_inst(exec_env);
+ int code = librats_collect_evidence_to_json(hash, &json);
+ if (code != 0) {
+ return str_ret_offset;
+ }
+ if (json) {
+ len = (uint32)strlen(json) + 1;
+
+ str_ret_offset = module_malloc(len, (void **)&str_ret);
+ if (str_ret_offset) {
+ bh_memcpy_s(str_ret, len, json, len);
+ }
+ }
+ return str_ret_offset;
+}
+
+static int
+librats_verify_wrapper(wasm_exec_env_t exec_env, const char *evidence_json,
+ const uint8_t *hash)
+{
+ return librats_verify_evidence_from_json(evidence_json, hash);
+}
+
+/* clang-format off */
+#define REG_NATIVE_FUNC(func_name, signature) \
+ { #func_name, func_name##_wrapper, signature, NULL }
+/* clang-format on */
+
+static NativeSymbol native_symbols_lib_rats[] = {
+ REG_NATIVE_FUNC(librats_collect, "($)i"),
+ REG_NATIVE_FUNC(librats_verify, "($$)i")
+};
+
+uint32_t
+get_lib_rats_export_apis(NativeSymbol **p_lib_rats_apis)
+{
+ *p_lib_rats_apis = native_symbols_lib_rats;
+ return sizeof(native_symbols_lib_rats) / sizeof(NativeSymbol);
+}
\ No newline at end of file
diff --git a/core/iwasm/libraries/lib-rats/lib_rats_wrapper.h b/core/iwasm/libraries/lib-rats/lib_rats_wrapper.h
new file mode 100644
index 00000000..348b3b00
--- /dev/null
+++ b/core/iwasm/libraries/lib-rats/lib_rats_wrapper.h
@@ -0,0 +1,18 @@
+/*
+ * Copyright (c) 2022 Intel Corporation
+ * Copyright (c) 2020-2021 Alibaba Cloud
+ *
+ * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+ */
+
+#ifndef _RATS_WAMR_API_H
+#define _RATS_WAMR_API_H
+
+#include
+
+char *
+librats_collect(const uint8_t *hash);
+int
+librats_verify(const char *json_string, const uint8_t *hash);
+
+#endif
\ No newline at end of file
diff --git a/core/shared/mem-alloc/ems/ems_kfc.c b/core/shared/mem-alloc/ems/ems_kfc.c
index d2a1eb70..cb405fd1 100644
--- a/core/shared/mem-alloc/ems/ems_kfc.c
+++ b/core/shared/mem-alloc/ems/ems_kfc.c
@@ -125,23 +125,24 @@ int
gc_destroy_with_pool(gc_handle_t handle)
{
gc_heap_t *heap = (gc_heap_t *)handle;
+ int ret = GC_SUCCESS;
+
#if BH_ENABLE_GC_VERIFY != 0
hmu_t *cur = (hmu_t *)heap->base_addr;
hmu_t *end = (hmu_t *)((char *)heap->base_addr + heap->current_size);
+
if (!heap->is_heap_corrupted
&& (hmu_t *)((char *)cur + hmu_get_size(cur)) != end) {
os_printf("Memory leak detected:\n");
gci_dump(heap);
-#if WASM_ENABLE_SPEC_TEST != 0
- while (1) {
- }
-#endif
+ ret = GC_ERROR;
}
#endif
+
os_mutex_destroy(&heap->lock);
memset(heap->base_addr, 0, heap->current_size);
memset(heap, 0, sizeof(gc_heap_t));
- return GC_SUCCESS;
+ return ret;
}
uint32
diff --git a/core/shared/mem-alloc/mem_alloc.c b/core/shared/mem-alloc/mem_alloc.c
index 16652965..f952c185 100644
--- a/core/shared/mem-alloc/mem_alloc.c
+++ b/core/shared/mem-alloc/mem_alloc.c
@@ -25,10 +25,10 @@ mem_allocator_create_with_struct_and_pool(void *struct_buf,
pool_buf, pool_buf_size);
}
-void
+int
mem_allocator_destroy(mem_allocator_t allocator)
{
- gc_destroy_with_pool((gc_handle_t)allocator);
+ return gc_destroy_with_pool((gc_handle_t)allocator);
}
uint32
@@ -69,6 +69,13 @@ mem_allocator_is_heap_corrupted(mem_allocator_t allocator)
return gc_is_heap_corrupted((gc_handle_t)allocator);
}
+bool
+mem_allocator_get_alloc_info(mem_allocator_t allocator, void *mem_alloc_info)
+{
+ gc_heap_stats((gc_handle_t)allocator, mem_alloc_info, 3);
+ return true;
+}
+
#else /* else of DEFAULT_MEM_ALLOCATOR */
#include "tlsf/tlsf.h"
diff --git a/core/shared/mem-alloc/mem_alloc.cmake b/core/shared/mem-alloc/mem_alloc.cmake
index be57f379..c0b4157f 100644
--- a/core/shared/mem-alloc/mem_alloc.cmake
+++ b/core/shared/mem-alloc/mem_alloc.cmake
@@ -6,6 +6,10 @@ set (MEM_ALLOC_DIR ${CMAKE_CURRENT_LIST_DIR})
include_directories(${MEM_ALLOC_DIR})
+if (WAMR_BUILD_GC_VERIFY EQUAL 1)
+ add_definitions (-DBH_ENABLE_GC_VERIFY=1)
+endif ()
+
file (GLOB_RECURSE source_all
${MEM_ALLOC_DIR}/ems/*.c
${MEM_ALLOC_DIR}/tlsf/*.c
diff --git a/core/shared/mem-alloc/mem_alloc.h b/core/shared/mem-alloc/mem_alloc.h
index d5dc66f1..1f35b279 100644
--- a/core/shared/mem-alloc/mem_alloc.h
+++ b/core/shared/mem-alloc/mem_alloc.h
@@ -23,7 +23,7 @@ mem_allocator_create_with_struct_and_pool(void *struct_buf,
void *pool_buf,
uint32_t pool_buf_size);
-void
+int
mem_allocator_destroy(mem_allocator_t allocator);
uint32
@@ -45,6 +45,9 @@ mem_allocator_migrate(mem_allocator_t allocator, char *pool_buf_new,
bool
mem_allocator_is_heap_corrupted(mem_allocator_t allocator);
+bool
+mem_allocator_get_alloc_info(mem_allocator_t allocator, void *mem_alloc_info);
+
#ifdef __cplusplus
}
#endif
diff --git a/core/shared/platform/alios/platform_internal.h b/core/shared/platform/alios/platform_internal.h
index 07b8f75e..ac9fb5ca 100644
--- a/core/shared/platform/alios/platform_internal.h
+++ b/core/shared/platform/alios/platform_internal.h
@@ -30,6 +30,7 @@ typedef aos_task_t korp_thread;
typedef korp_thread *korp_tid;
typedef aos_task_t *aos_tid_t;
typedef aos_mutex_t korp_mutex;
+typedef aos_sem_t korp_sem;
struct os_thread_wait_node;
typedef struct os_thread_wait_node *os_thread_wait_list;
diff --git a/core/shared/utils/bh_list.h b/core/shared/utils/bh_list.h
index eaf15f2f..f1021532 100644
--- a/core/shared/utils/bh_list.h
+++ b/core/shared/utils/bh_list.h
@@ -59,7 +59,7 @@ bh_list_init(bh_list *list);
* BH_LIST_ERROR if input is invalid or no memory
* available.
*/
-extern bh_list_status
+bh_list_status
bh_list_insert(bh_list *list, void *elem);
/**
diff --git a/doc/build_wamr.md b/doc/build_wamr.md
index 555ca2ac..29866405 100644
--- a/doc/build_wamr.md
+++ b/doc/build_wamr.md
@@ -77,6 +77,10 @@ cmake -DWAMR_BUILD_PLATFORM=linux -DWAMR_BUILD_TARGET=ARM
- **WAMR_BUILD_LIB_PTHREAD**=1/0, default to disable if not set
> Note: The dependent feature of lib pthread such as the `shared memory` and `thread manager` will be enabled automatically.
+#### **Enable lib-pthread-semaphore**
+- **WAMR_BUILD_LIB_PTHREAD_SEMAPHORE**=1/0, default to disable if not set
+> Note: This feature depends on `lib-pthread`, it will be enabled automatically if this feature is enabled.
+
#### **Disable boundary check with hardware trap in AOT or JIT mode**
- **WAMR_DISABLE_HW_BOUND_CHECK**=1/0, default to enable if not set and supported by platform
> Note: by default only platform linux/darwin/android/vxworks 64-bit will enable boundary check with hardware trap in AOT or JIT mode, and the wamrc tool will generate AOT code without boundary check instructions in all 64-bit targets except SGX to improve performance.
diff --git a/doc/build_wasm_app.md b/doc/build_wasm_app.md
index 29cc9110..5039e4ba 100644
--- a/doc/build_wasm_app.md
+++ b/doc/build_wasm_app.md
@@ -160,10 +160,9 @@ Firstly if libc-builtin (-nostdlib) mode meets the requirements, e.g. there are
Most of the above methods are also available for libc-wasi mode, besides them, we can export malloc and free functions with `-Wl,--export=malloc -Wl,--export=free` option, so WAMR runtime will disable its app heap and call the malloc/free function exported to allocate/free the memory from/to the heap space managed by libc.
-Note: wasm-ld from LLVM 13 and later automatically inserts dtor calls
-for exported funtions. It breaks the malloc/free export mentioned above.
-A workaround: Add `-Wl,--export=__wasm_call_ctors`, which happens to
-prevent the automatic insertions for the current implementation.
+Note: wasm-ld from LLVM 13 and later automatically inserts ctor/dtor calls
+for all exported functions for a command. (vs reactor)
+It breaks the malloc/free exports mentioned above.
## 3. Build wasm app with pthread support
diff --git a/product-mini/platforms/android/CMakeLists.txt b/product-mini/platforms/android/CMakeLists.txt
index 22db06b0..a65b1808 100644
--- a/product-mini/platforms/android/CMakeLists.txt
+++ b/product-mini/platforms/android/CMakeLists.txt
@@ -104,7 +104,7 @@ else()
target_link_libraries (iwasm ${LLVM_AVAILABLE_LIBS} ${UV_A_LIBS} -lm -ldl -landroid -llog)
endif()
-set (distribution_DIR ${CMAKE_CURRENT_SOURCE_DIR}/build/distribution)
+set (distribution_DIR ${CMAKE_BINARY_DIR}/distribution)
set_target_properties (iwasm PROPERTIES LIBRARY_OUTPUT_DIRECTORY "${distribution_DIR}/wasm/lib")
add_custom_command (TARGET iwasm POST_BUILD
diff --git a/product-mini/platforms/linux-sgx/CMakeLists.txt b/product-mini/platforms/linux-sgx/CMakeLists.txt
index 43f5bb9d..dfc98975 100644
--- a/product-mini/platforms/linux-sgx/CMakeLists.txt
+++ b/product-mini/platforms/linux-sgx/CMakeLists.txt
@@ -59,6 +59,11 @@ if (NOT DEFINED WAMR_BUILD_LIBC_WASI)
set (WAMR_BUILD_LIBC_WASI 1)
endif ()
+if (NOT DEFINED WAMR_BUILD_LIB_RATS)
+ # Disable lib rats support by default
+ set (WAMR_BUILD_LIB_RATS 0)
+endif()
+
if (NOT DEFINED WAMR_BUILD_FAST_INTERP)
# Enable fast interpreter
set (WAMR_BUILD_FAST_INTERP 1)
@@ -84,7 +89,7 @@ if (COLLECT_CODE_COVERAGE EQUAL 1)
endif ()
set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--gc-sections")
-set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=gnu99 -ffunction-sections -fdata-sections \
+set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=gnu11 -ffunction-sections -fdata-sections \
-Wall -Wno-unused-parameter -Wno-pedantic \
-nostdinc -fvisibility=hidden -fpie" )
@@ -100,3 +105,15 @@ add_custom_command (
COMMAND ${CMAKE_AR} rc libvmlib_untrusted.a untrusted/*.o)
add_custom_target (vmlib_untrusted ALL DEPENDS libvmlib_untrusted.a)
+
+if (WAMR_BUILD_LIB_RATS EQUAL 1)
+ execute_process(
+ COMMAND bash -c "sed -i -E 's/^#define LIB_RATS 0 /#define LIB_RATS 1/g' ${CMAKE_CURRENT_SOURCE_DIR}/enclave-sample/Enclave/Enclave.edl"
+ OUTPUT_VARIABLE cmdOutput
+ )
+else()
+ execute_process(
+ COMMAND bash -c "sed -i -E 's/^#define LIB_RATS 1/#define LIB_RATS 0/g' ${CMAKE_CURRENT_SOURCE_DIR}/enclave-sample/Enclave/Enclave.edl"
+ OUTPUT_VARIABLE cmdOutput
+ )
+endif()
diff --git a/product-mini/platforms/linux-sgx/enclave-sample/Enclave/Enclave.edl b/product-mini/platforms/linux-sgx/enclave-sample/Enclave/Enclave.edl
index 3978465e..d3281f84 100644
--- a/product-mini/platforms/linux-sgx/enclave-sample/Enclave/Enclave.edl
+++ b/product-mini/platforms/linux-sgx/enclave-sample/Enclave/Enclave.edl
@@ -3,10 +3,15 @@
* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
*/
+#define LIB_RATS 0
+
enclave {
from "sgx_tstdc.edl" import *;
from "sgx_pthread.edl" import *;
from "sgx_wamr.edl" import *;
+#if LIB_RATS != 0
+ from "rats.edl" import *;
+#endif
trusted {
/* define ECALLs here. */
diff --git a/product-mini/platforms/linux-sgx/enclave-sample/Makefile b/product-mini/platforms/linux-sgx/enclave-sample/Makefile
index 45389628..e1fea1e3 100644
--- a/product-mini/platforms/linux-sgx/enclave-sample/Makefile
+++ b/product-mini/platforms/linux-sgx/enclave-sample/Makefile
@@ -9,6 +9,13 @@ SGX_ARCH ?= x64
SGX_DEBUG ?= 0
SPEC_TEST ?= 0
+VMLIB_BUILD_DIR ?= $(CURDIR)/../build
+LIB_RATS_SRC ?= $(VMLIB_BUILD_DIR)/_deps/librats-build
+LIB_RATS := $(shell if [ -d $(LIB_RATS_SRC) ]; then echo 1; else echo 0; fi)
+
+LIB_RATS_INSTALL_DIR := $(VMLIB_BUILD_DIR)/librats/lib/librats
+LIB_RATS_INCLUDE_DIR := $(VMLIB_BUILD_DIR)/librats/include
+
ifeq ($(shell getconf LONG_BIT), 32)
SGX_ARCH := x86
else ifeq ($(findstring -m32, $(CXXFLAGS)), -m32)
@@ -49,6 +56,9 @@ endif
App_Cpp_Files := App/App.cpp
App_Include_Paths := -IApp -I$(SGX_SDK)/include
+ifeq ($(LIB_RATS), 1)
+ App_Include_Paths += -I$(LIB_RATS_INCLUDE_DIR)
+endif
App_C_Flags := $(SGX_COMMON_CFLAGS) -fPIC -Wno-attributes $(App_Include_Paths)
@@ -79,6 +89,10 @@ else
App_Link_Flags += -lsgx_uae_service
endif
+ifeq ($(LIB_RATS), 1)
+ App_Link_Flags += -L$(LIB_RATS_INSTALL_DIR) -lrats_u -lsgx_dcap_ql -lsgx_dcap_quoteverify -lsgx_ukey_exchange
+endif
+
App_Cpp_Objects := $(App_Cpp_Files:.cpp=.o)
App_Name := iwasm
@@ -105,21 +119,40 @@ Enclave_Include_Paths := -IEnclave -I$(WAMR_ROOT)/core/iwasm/include \
-I$(SGX_SDK)/include/tlibc \
-I$(SGX_SDK)/include/stlport
+ifeq ($(LIB_RATS), 1)
+ Enclave_Include_Paths += -I$(LIB_RATS_INCLUDE_DIR)
+endif
+
Enclave_C_Flags := $(SGX_COMMON_CFLAGS) -nostdinc -fvisibility=hidden -fpie -fstack-protector $(Enclave_Include_Paths)
ifeq ($(SPEC_TEST), 1)
Enclave_C_Flags += -DWASM_ENABLE_SPEC_TEST=1
else
Enclave_C_Flags += -DWASM_ENABLE_SPEC_TEST=0
endif
-Enclave_Cpp_Flags := $(Enclave_C_Flags) -std=c++03 -nostdinc++
-Enclave_Link_Flags := $(SGX_COMMON_CFLAGS) -Wl,--no-undefined -nostdlib -nodefaultlibs -nostartfiles -L$(SGX_LIBRARY_PATH) \
- -Wl,--whole-archive -l$(Trts_Library_Name) -Wl,--no-whole-archive \
- libvmlib.a \
- -Wl,--start-group -lsgx_tstdc -lsgx_tcxx -lsgx_pthread -l$(Crypto_Library_Name) -l$(Service_Library_Name) -Wl,--end-group \
+
+ifeq ($(LIB_RATS), 1)
+ Rats_Lib_Link_Dirs := -L$(LIB_RATS_INSTALL_DIR) -L$(LIB_RATS_INSTALL_DIR)/attesters -L$(LIB_RATS_INSTALL_DIR)/verifiers
+ Rats_Lib_Link_libs := -lattester_nullattester -lattester_sgx_ecdsa -lattester_sgx_la \
+ -lverifier_nullverifier -lverifier_sgx_ecdsa -lverifier_sgx_la -lverifier_sgx_ecdsa_qve \
+ -lrats_lib
+endif
+
+Enclave_Cpp_Flags := $(Enclave_C_Flags) -std=c++11 -nostdinc++
+Enclave_Link_Flags := $(SGX_COMMON_CFLAGS) -Wl,--no-undefined -nostdlib -nodefaultlibs -nostartfiles -L$(SGX_LIBRARY_PATH) ${Rats_Lib_Link_Dirs} \
+ -Wl,--whole-archive -l$(Trts_Library_Name) ${Rats_Lib_Link_libs} -Wl,--no-whole-archive \
+ -Wl,--start-group -lsgx_tstdc -lsgx_tcxx -lsgx_pthread -lsgx_tkey_exchange -l$(Crypto_Library_Name) -l$(Service_Library_Name) -lsgx_dcap_tvl -Wl,--end-group \
-Wl,-Bstatic -Wl,-Bsymbolic -Wl,--no-undefined \
-Wl,-pie,-eenclave_entry -Wl,--export-dynamic \
-Wl,--defsym,__ImageBase=0
+Enclave_Edl_Search_Path = --search-path ../Enclave \
+ --search-path $(SGX_SDK)/include \
+ --search-path $(WAMR_ROOT)/core/shared/platform/linux-sgx
+ifeq ($(LIB_RATS), 1)
+ Enclave_Edl_Search_Path += --search-path $(LIB_RATS_INCLUDE_DIR)/librats/edl
+endif
+
+
Enclave_Cpp_Objects := $(Enclave_Cpp_Files:.cpp=.o)
Enclave_Name := enclave.so
@@ -156,12 +189,14 @@ ifneq ($(Build_Mode), HW_RELEASE)
endif
######## App Objects ########
+librats:
+ifeq ($(LIB_RATS), 1)
+ @cd $(LIB_RATS_SRC) && make install
+ @echo "librats build success"
+endif
-App/Enclave_u.c: $(SGX_EDGER8R) Enclave/Enclave.edl
- @cd App && $(SGX_EDGER8R) --untrusted ../Enclave/Enclave.edl \
- --search-path ../Enclave \
- --search-path $(SGX_SDK)/include \
- --search-path $(WAMR_ROOT)/core/shared/platform/linux-sgx
+App/Enclave_u.c: $(SGX_EDGER8R) Enclave/Enclave.edl librats
+ @cd App && $(SGX_EDGER8R) --untrusted ../Enclave/Enclave.edl $(Enclave_Edl_Search_Path)
@echo "GEN => $@"
App/Enclave_u.o: App/Enclave_u.c
@@ -172,7 +207,7 @@ App/%.o: App/%.cpp
@$(CXX) $(App_Cpp_Flags) -c $< -o $@
@echo "CXX <= $<"
-libvmlib_untrusted.a: ../build/libvmlib_untrusted.a
+libvmlib_untrusted.a: $(VMLIB_BUILD_DIR)/libvmlib_untrusted.a
@cp $< $@
@echo "CP $@ <= $<"
@@ -183,11 +218,8 @@ $(App_Name): App/Enclave_u.o $(App_Cpp_Objects) libvmlib_untrusted.a
######## Enclave Objects ########
-Enclave/Enclave_t.c: $(SGX_EDGER8R) Enclave/Enclave.edl
- @cd Enclave && $(SGX_EDGER8R) --trusted ../Enclave/Enclave.edl \
- --search-path ../Enclave \
- --search-path $(SGX_SDK)/include \
- --search-path $(WAMR_ROOT)/core/shared/platform/linux-sgx
+Enclave/Enclave_t.c: $(SGX_EDGER8R) Enclave/Enclave.edl librats
+ @cd Enclave && $(SGX_EDGER8R) --trusted ../Enclave/Enclave.edl $(Enclave_Edl_Search_Path)
@echo "GEN => $@"
Enclave/Enclave_t.o: Enclave/Enclave_t.c
@@ -198,7 +230,7 @@ Enclave/%.o: Enclave/%.cpp
@$(CXX) $(Enclave_Cpp_Flags) -c $< -o $@
@echo "CXX <= $<"
-libvmlib.a: ../build/libvmlib.a
+libvmlib.a: $(VMLIB_BUILD_DIR)/libvmlib.a
@cp $< $@
@echo "CP $@ <= $<"
diff --git a/product-mini/platforms/nuttx/wamr.mk b/product-mini/platforms/nuttx/wamr.mk
index 28ca1f60..bebd5f2a 100644
--- a/product-mini/platforms/nuttx/wamr.mk
+++ b/product-mini/platforms/nuttx/wamr.mk
@@ -5,7 +5,9 @@ CORE_ROOT := wamr/core
IWASM_ROOT := wamr/core/iwasm
SHARED_ROOT := wamr/core/shared
-ifeq ($(CONFIG_ARCH_ARMV7A),y)
+ifeq ($(CONFIG_ARCH_ARMV6M),y)
+WAMR_BUILD_TARGET := THUMBV6M
+else ifeq ($(CONFIG_ARCH_ARMV7A),y)
WAMR_BUILD_TARGET := THUMBV7A
else ifeq ($(CONFIG_ARCH_ARMV7M),y)
WAMR_BUILD_TARGET := THUMBV7EM
@@ -147,6 +149,19 @@ CSRCS += wasm_loader.c
endif
endif
+ifeq ($(CONFIG_INTERPRETERS_WAMR_DEBUG_INTERP),y)
+# Note: INTERPRETERS_WAMR_CLASSIC/INTERPRETERS_WAMR_THREAD_MGR
+# dependencies are already handled in NuttX apps Kconfig
+CFLAGS += -DWASM_ENABLE_DEBUG_INTERP=1
+CFLAGS += -I$(IWASM_ROOT)/libraries/debug-engine
+CSRCS += debug_engine.c
+CSRCS += gdbserver.c
+CSRCS += handler.c
+CSRCS += packets.c
+CSRCS += utils.c
+VPATH += $(IWASM_ROOT)/libraries/debug-engine
+endif
+
ifeq ($(CONFIG_INTERPRETERS_WAMR_STACK_GUARD_SIZE),)
CFLAGS += -DWASM_STACK_GUARD_SIZE=0
else
@@ -248,7 +263,7 @@ endif
ifeq ($(CONFIG_INTERPRETERS_WAMR_GLOBAL_HEAP_POOL),y)
CFLAGS += -DWASM_ENABLE_GLOBAL_HEAP_POOL=1
-CFLAGS += -DWASM_GLOBAL_HEAP_SIZE=$(CONFIG_INTERPRETERS_WAMR_GLOBAL_HEAP_POOL_SIZE)
+CFLAGS += -DWASM_GLOBAL_HEAP_SIZE="$(CONFIG_INTERPRETERS_WAMR_GLOBAL_HEAP_POOL_SIZE) * 1024"
else
CFLAGS += -DWASM_ENABLE_GLOBAL_HEAP_POOL=0
endif
diff --git a/product-mini/platforms/posix/main.c b/product-mini/platforms/posix/main.c
index 2ba2e02f..4834fd50 100644
--- a/product-mini/platforms/posix/main.c
+++ b/product-mini/platforms/posix/main.c
@@ -290,11 +290,7 @@ moudle_destroyer(uint8 *buffer, uint32 size)
#endif /* WASM_ENABLE_MULTI_MODULE */
#if WASM_ENABLE_GLOBAL_HEAP_POOL != 0
-#ifdef __NuttX__
-static char global_heap_buf[WASM_GLOBAL_HEAP_SIZE * BH_KB] = { 0 };
-#else
-static char global_heap_buf[10 * 1024 * 1024] = { 0 };
-#endif
+static char global_heap_buf[WASM_GLOBAL_HEAP_SIZE] = { 0 };
#endif
int
@@ -336,7 +332,6 @@ main(int argc, char *argv[])
#endif
#if WASM_ENABLE_DEBUG_INTERP != 0
char *ip_addr = NULL;
- /* int platform_port = 0; */
int instance_port = 0;
#endif
@@ -484,7 +479,8 @@ main(int argc, char *argv[])
else if (!strncmp(argv[0], "--version", 9)) {
uint32 major, minor, patch;
wasm_runtime_get_version(&major, &minor, &patch);
- printf("iwasm %u.%u.%u\n", major, minor, patch);
+ printf("iwasm %" PRIu32 ".%" PRIu32 ".%" PRIu32 "\n", major, minor,
+ patch);
return 0;
}
else
@@ -516,7 +512,6 @@ main(int argc, char *argv[])
#endif
#if WASM_ENABLE_DEBUG_INTERP != 0
- init_args.platform_port = 0;
init_args.instance_port = instance_port;
if (ip_addr)
strcpy(init_args.ip_addr, ip_addr);
@@ -591,6 +586,23 @@ main(int argc, char *argv[])
goto fail3;
}
+#if WASM_ENABLE_DEBUG_INTERP != 0
+ if (ip_addr != NULL) {
+ wasm_exec_env_t exec_env =
+ wasm_runtime_get_exec_env_singleton(wasm_module_inst);
+ uint32_t debug_port;
+ if (exec_env == NULL) {
+ printf("%s\n", wasm_runtime_get_exception(wasm_module_inst));
+ goto fail4;
+ }
+ debug_port = wasm_runtime_start_debug_instance(exec_env);
+ if (debug_port == 0) {
+ printf("Failed to start debug instance\n");
+ goto fail4;
+ }
+ }
+#endif
+
if (is_repl_mode)
app_instance_repl(wasm_module_inst);
else if (func_name)
@@ -600,6 +612,9 @@ main(int argc, char *argv[])
ret = 0;
+#if WASM_ENABLE_DEBUG_INTERP != 0
+fail4:
+#endif
/* destroy the module instance */
wasm_runtime_deinstantiate(wasm_module_inst);
diff --git a/product-mini/platforms/windows/main.c b/product-mini/platforms/windows/main.c
index 6d053c7a..73319083 100644
--- a/product-mini/platforms/windows/main.c
+++ b/product-mini/platforms/windows/main.c
@@ -247,7 +247,6 @@ main(int argc, char *argv[])
#endif
#if WASM_ENABLE_DEBUG_INTERP != 0
char *ip_addr = NULL;
- /* int platform_port = 0; */
int instance_port = 0;
#endif
@@ -343,7 +342,8 @@ main(int argc, char *argv[])
else if (!strncmp(argv[0], "--version", 9)) {
uint32 major, minor, patch;
wasm_runtime_get_version(&major, &minor, &patch);
- printf("iwasm %u.%u.%u\n", major, minor, patch);
+ printf("iwasm %" PRIu32 ".%" PRIu32 ".%" PRIu32 "\n", major, minor,
+ patch);
return 0;
}
else
@@ -371,7 +371,6 @@ main(int argc, char *argv[])
#endif
#if WASM_ENABLE_DEBUG_INTERP != 0
- init_args.platform_port = 0;
init_args.instance_port = instance_port;
if (ip_addr)
strcpy(init_args.ip_addr, ip_addr);
@@ -437,6 +436,23 @@ main(int argc, char *argv[])
goto fail3;
}
+#if WASM_ENABLE_DEBUG_INTERP != 0
+ if (ip_addr != NULL) {
+ wasm_exec_env_t exec_env =
+ wasm_runtime_get_exec_env_singleton(wasm_module_inst);
+ uint32_t debug_port;
+ if (exec_env == NULL) {
+ printf("%s\n", wasm_runtime_get_exception(wasm_module_inst));
+ goto fail4;
+ }
+ debug_port = wasm_runtime_start_debug_instance(exec_env);
+ if (debug_port == 0) {
+ printf("Failed to start debug instance\n");
+ goto fail4;
+ }
+ }
+#endif
+
if (is_repl_mode)
app_instance_repl(wasm_module_inst);
else if (func_name)
@@ -446,6 +462,9 @@ main(int argc, char *argv[])
ret = 0;
+#if WASM_ENABLE_DEBUG_INTERP != 0
+fail4:
+#endif
/* destroy the module instance */
wasm_runtime_deinstantiate(wasm_module_inst);
diff --git a/samples/multi-module/CMakeLists.txt b/samples/multi-module/CMakeLists.txt
index 26c99d82..b57df2cb 100644
--- a/samples/multi-module/CMakeLists.txt
+++ b/samples/multi-module/CMakeLists.txt
@@ -135,11 +135,11 @@ ExternalProject_Add(WASM_MODULE
-S ${CMAKE_CURRENT_SOURCE_DIR}/wasm-apps
BUILD_COMMAND ${CMAKE_COMMAND} --build .
INSTALL_COMMAND ${CMAKE_COMMAND} -E copy
- ./mA.wasm ${CMAKE_CURRENT_SOURCE_DIR}/build/
- ./mB.wasm ${CMAKE_CURRENT_SOURCE_DIR}/build/
- ./mC.wasm ${CMAKE_CURRENT_SOURCE_DIR}/build/
- ./mD.wasm ${CMAKE_CURRENT_SOURCE_DIR}/build/
- ./mE.wasm ${CMAKE_CURRENT_SOURCE_DIR}/build/
+ ./mA.wasm ${CMAKE_BINARY_DIR}
+ ./mB.wasm ${CMAKE_BINARY_DIR}
+ ./mC.wasm ${CMAKE_BINARY_DIR}
+ ./mD.wasm ${CMAKE_BINARY_DIR}
+ ./mE.wasm ${CMAKE_BINARY_DIR}
)
################ NATIVE
diff --git a/samples/multi-module/src/main.c b/samples/multi-module/src/main.c
index 557ffec3..06b8fc71 100644
--- a/samples/multi-module/src/main.c
+++ b/samples/multi-module/src/main.c
@@ -122,22 +122,6 @@ main()
"call \"C5\", it will be failed since it is a export function, ===> ");
wasm_application_execute_func(module_inst, "C5", 0, args);
- /* call functions of mB */
- printf("call \"mB.B1\", it will return 0x15:i32, ===> ");
- wasm_application_execute_func(module_inst, "$mB$B1", 0, args);
- printf("call \"mB.B2\", it will call A1() of mA and return 0xb:i32, ===> ");
- wasm_application_execute_func(module_inst, "$mB$B2", 0, args);
- printf("call \"mB.B3\", it will be failed since it is a export function, "
- "===> ");
- wasm_application_execute_func(module_inst, "$mB$B3", 0, args);
-
- /* call functions of mA */
- printf("call \"mA.A1\", it will return 0xb:i32, ===>");
- wasm_application_execute_func(module_inst, "$mA$A1", 0, args);
- printf("call \"mA.A2\", it will be failed since it is a export function, "
- "===> ");
- wasm_application_execute_func(module_inst, "$mA$A2", 0, args);
- printf("----------------------------------------\n\n");
ret = true;
printf("- wasm_runtime_deinstantiate\n");
diff --git a/samples/multi-thread/CMakeLists.txt b/samples/multi-thread/CMakeLists.txt
index 63c14eeb..39485e1c 100644
--- a/samples/multi-thread/CMakeLists.txt
+++ b/samples/multi-thread/CMakeLists.txt
@@ -45,6 +45,7 @@ set(WAMR_BUILD_JIT 0)
set(WAMR_BUILD_LIBC_BUILTIN 1)
set(WAMR_BUILD_FAST_INTERP 1)
set(WAMR_BUILD_LIB_PTHREAD 1)
+set(WAMR_BUILD_LIB_PTHREAD_SEMAPHORE 1)
# compiling and linking flags
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -pie -fPIE")
diff --git a/samples/sgx-ra/CMakeLists.txt b/samples/sgx-ra/CMakeLists.txt
new file mode 100644
index 00000000..331e540c
--- /dev/null
+++ b/samples/sgx-ra/CMakeLists.txt
@@ -0,0 +1,81 @@
+# Copyright (c) 2022 Intel Corporation
+# Copyright (c) 2020-2021 Alibaba Cloud
+# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+
+cmake_minimum_required(VERSION 3.1.4)
+project(sgx-ra)
+
+################ runtime settings ##############
+set (WAMR_BUILD_PLATFORM "linux-sgx")
+
+# Reset default linker flags
+set (CMAKE_SHARED_LIBRARY_LINK_C_FLAGS "")
+set (CMAKE_SHARED_LIBRARY_LINK_CXX_FLAGS "")
+
+# Set WAMR_BUILD_TARGET
+if (NOT DEFINED WAMR_BUILD_TARGET)
+ if (CMAKE_SIZEOF_VOID_P EQUAL 8)
+ # Build as X86_64 by default in 64-bit platform
+ set (WAMR_BUILD_TARGET "X86_64")
+ elseif (CMAKE_SIZEOF_VOID_P EQUAL 4)
+ # Build as X86_32 by default in 32-bit platform
+ set (WAMR_BUILD_TARGET "X86_32")
+ else ()
+ message(SEND_ERROR "Unsupported build target platform!")
+ endif ()
+endif ()
+
+if (NOT CMAKE_BUILD_TYPE)
+ set (CMAKE_BUILD_TYPE Release)
+endif ()
+
+set (WAMR_BUILD_INTERP 1)
+set (WAMR_BUILD_AOT 1)
+set (WAMR_BUILD_JIT 0)
+set (WAMR_BUILD_LIBC_BUILTIN 1)
+set (WAMR_BUILD_LIBC_WASI 1)
+set (WAMR_BUILD_LIB_PTHREAD 1)
+set (WAMR_BUILD_FAST_INTERP 1)
+set (WAMR_BUILD_LIB_RATS 1)
+
+# compiling and linking flags
+if (COLLECT_CODE_COVERAGE EQUAL 1)
+ set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fprofile-arcs -ftest-coverage")
+endif ()
+
+set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--gc-sections")
+set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=gnu11 -ffunction-sections -fdata-sections \
+ -Wall -Wno-unused-parameter -Wno-pedantic \
+ -nostdinc -fvisibility=hidden -fpie" )
+
+# build out vmlib
+set (WAMR_ROOT_DIR ${CMAKE_CURRENT_LIST_DIR}/../..)
+set (SGX_PLATFORM_DIR ${WAMR_ROOT_DIR}/product-mini/platforms/linux-sgx)
+include (${WAMR_ROOT_DIR}/build-scripts/runtime_lib.cmake)
+
+add_library(vmlib ${WAMR_RUNTIME_LIB_SOURCE})
+
+add_custom_command (
+ OUTPUT libvmlib_untrusted.a
+ COMMAND mkdir -p untrusted && cd untrusted &&
+ ${CMAKE_C_COMPILER} -c ${PLATFORM_SHARED_SOURCE_UNTRUSTED}
+ COMMAND ${CMAKE_AR} rc libvmlib_untrusted.a untrusted/*.o)
+
+add_custom_target (vmlib_untrusted ALL DEPENDS libvmlib_untrusted.a)
+
+execute_process (
+ COMMAND bash -c "sed -i -E 's/^#define LIB_RATS 0/#define LIB_RATS 1/g' ${SGX_PLATFORM_DIR}/enclave-sample/Enclave/Enclave.edl"
+ OUTPUT_VARIABLE cmdOutput
+)
+
+################ wamr runtime ###################
+add_custom_target (
+ iwasm ALL
+ DEPENDS vmlib_untrusted vmlib_untrusted
+ COMMAND make -C ${SGX_PLATFORM_DIR}/enclave-sample SGX_MODE=HW SGX_DEBUG=1 VMLIB_BUILD_DIR=${CMAKE_BINARY_DIR}
+ COMMAND ${CMAKE_COMMAND} -E copy ${SGX_PLATFORM_DIR}/enclave-sample/enclave.signed.so ${CMAKE_BINARY_DIR}
+ COMMAND ${CMAKE_COMMAND} -E copy ${SGX_PLATFORM_DIR}/enclave-sample/iwasm ${CMAKE_BINARY_DIR}
+ COMMAND make -C ${SGX_PLATFORM_DIR}/enclave-sample clean)
+
+################ wasm application ###############
+add_subdirectory(wasm-app)
diff --git a/samples/sgx-ra/README.md b/samples/sgx-ra/README.md
new file mode 100644
index 00000000..92b5138e
--- /dev/null
+++ b/samples/sgx-ra/README.md
@@ -0,0 +1,42 @@
+"sgx-ra" sample introduction
+==============
+
+This sample demonstrates how to execute Remote Attestation on SGX with [librats](https://github.com/inclavare-containers/librats) and run it with iwasm. It can only build on [SGX supported processors](https://www.intel.com/content/www/us/en/support/articles/000028173/processors.html), please check it.
+
+## Preparation
+
+Before staring, we need to download and intall [SGX SDK](https://download.01.org/intel-sgx/latest/linux-latest/distro) and [SGX DCAP Library](https://download.01.org/intel-sgx/latest/dcap-latest) referring to this [guide](https://download.01.org/intel-sgx/sgx-dcap/1.8/linux/docs/Intel_SGX_DCAP_Linux_SW_Installation_Guide.pdf).
+
+The following command is the example of the SGX environment installation on ubuntu18.04.
+``` shell
+$ cd $HOME
+$ # Set your platform, you can get the platforms list on
+$ # https://download.01.org/intel-sgx/latest/linux-latest/distro
+$ SGX_PALTFORM=ubuntu18.04-server
+$ SGX_SDK_VERSION=2.17.100.3
+$ SGX_DRIVER_VERSION=1.41
+$ # install SGX Driver
+$ wget https://download.01.org/intel-sgx/latest/linux-latest/distro/$SGX_PALTFORM/sgx_linux_x64_driver_$SGX_DRIVER_VERSION.bin
+$ chmod +x sgx_linux_x64_driver_$SGX_DRIVER_VERSION.bin
+$ sudo ./sgx_linux_x64_driver_$SGX_DRIVER_VERSION.bin
+$ # install SGX SDK
+$ wget https://download.01.org/intel-sgx/latest/linux-latest/distro/$SGX_PALTFORM/sgx_linux_x64_sdk_$SGX_SDK_VERSION.bin
+$ chmod +x sgx_linux_x64_sdk_$SGX_SDK_VERSION.bin
+$ sudo ./sgx_linux_x64_sdk_$SGX_SDK_VERSION.bin
+$ # install SGX DCAP Library
+$ echo 'deb [arch=amd64] https://download.01.org/intel-sgx/sgx_repo/ubuntu bionic main' | sudo tee /etc/apt/sources.list.d/intel-sgx.list > /dev/null
+$ wget -O - https://download.01.org/intel-sgx/sgx_repo/ubuntu/intel-sgx-deb.key | sudo apt-key add -
+$ sudo apt update
+$ sudo apt install libsgx-uae-service libsgx-dcap-default-qpl-dev libsgx-dcap-ql-dev libsgx-dcap-quote-verify-dev
+```
+
+## Build
+``` shell
+$ mkdir build && cd build
+$ cmake ..
+$ make
+$ # run the sample
+$ ./iwasm wasm-app/test.wasm
+```
+
+The sample will print the evidence in json and "Evidence is trusted." by default.
\ No newline at end of file
diff --git a/samples/sgx-ra/wasm-app/CMakeLists.txt b/samples/sgx-ra/wasm-app/CMakeLists.txt
new file mode 100644
index 00000000..afba7dfb
--- /dev/null
+++ b/samples/sgx-ra/wasm-app/CMakeLists.txt
@@ -0,0 +1,38 @@
+# Copyright (c) 2022 Intel Corporation
+# Copyright (c) 2020-2021 Alibaba Cloud
+# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+
+cmake_minimum_required(VERSION 3.0)
+project(wasm-app)
+
+set (WAMR_ROOT_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../../..)
+set (LIB_RATS_DIR ${WAMR_ROOT_DIR}/core/iwasm/libraries/lib-rats)
+
+set (CMAKE_C_LINK_FLAGS "")
+set (CMAKE_CXX_LINK_FLAGS "")
+if (APPLE)
+ set (HAVE_FLAG_SEARCH_PATHS_FIRST 0)
+endif ()
+
+set (CMAKE_SYSTEM_PROCESSOR wasm32)
+set (CMAKE_SYSROOT ${WAMR_ROOT_DIR}/wamr-sdk/app/libc-builtin-sysroot)
+
+if (NOT DEFINED WASI_SDK_DIR)
+ set (WASI_SDK_DIR "/opt/wasi-sdk")
+endif ()
+
+set (CMAKE_C_FLAGS "-nostdlib")
+set (CMAKE_C_COMPILER_TARGET "wasm32")
+set (CMAKE_C_COMPILER "${WASI_SDK_DIR}/bin/clang")
+
+set (CMAKE_EXE_LINKER_FLAGS
+ "-Wl,--max-memory=131072 -z stack-size=8192 \
+ -Wl,--no-entry,--strip-all \
+ -Wl,--export=__main_argc_argv \
+ -Wl,--export=__heap_base,--export=__data_end \
+ -Wl,--allow-undefined"
+)
+
+add_executable(test.wasm main.c)
+set_target_properties(test.wasm PROPERTIES INCLUDE_DIRECTORIES ${LIB_RATS_DIR})
+target_link_libraries(test.wasm)
diff --git a/samples/sgx-ra/wasm-app/main.c b/samples/sgx-ra/wasm-app/main.c
new file mode 100644
index 00000000..d6b079c4
--- /dev/null
+++ b/samples/sgx-ra/wasm-app/main.c
@@ -0,0 +1,36 @@
+/*
+ * Copyright (c) 2022 Intel Corporation
+ * Copyright (c) 2020-2021 Alibaba Cloud
+ *
+ * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+ */
+
+#include
+#include
+#include "lib_rats_wrapper.h"
+
+int
+main(int argc, char **argv)
+{
+ char *evidence_json = NULL;
+ const char *hash = "12345678123456781234567812345678";
+ evidence_json = librats_collect((const uint8_t *)hash);
+ if (evidence_json == NULL) {
+ printf("Librats collect evidence failed.\n");
+ return -1;
+ }
+ printf("evidence json:\n%s\n", evidence_json);
+
+ if (librats_verify(evidence_json, (const uint8_t *)hash) != 0) {
+ printf("Evidence is not trusted.\n");
+ }
+ else {
+ printf("Evidence is trusted.\n");
+ }
+
+ if (evidence_json) {
+ free(evidence_json);
+ }
+
+ return 0;
+}
diff --git a/samples/socket-api/CMakeLists.txt b/samples/socket-api/CMakeLists.txt
index 7793497b..c8bd74a0 100644
--- a/samples/socket-api/CMakeLists.txt
+++ b/samples/socket-api/CMakeLists.txt
@@ -87,10 +87,10 @@ ExternalProject_Add(wasm-app
${CMAKE_CURRENT_SOURCE_DIR}/wasm-src
BUILD_COMMAND ${CMAKE_COMMAND} --build .
INSTALL_COMMAND ${CMAKE_COMMAND} -E copy
- tcp_client.wasm ${CMAKE_CURRENT_SOURCE_DIR}/build
- tcp_server.wasm ${CMAKE_CURRENT_SOURCE_DIR}/build
- send_recv.wasm ${CMAKE_CURRENT_SOURCE_DIR}/build
- socket_opts.wasm ${CMAKE_CURRENT_SOURCE_DIR}/build
+ tcp_client.wasm ${CMAKE_BINARY_DIR}
+ tcp_server.wasm ${CMAKE_BINARY_DIR}
+ send_recv.wasm ${CMAKE_BINARY_DIR}
+ socket_opts.wasm ${CMAKE_BINARY_DIR}
)
add_executable(tcp_server ${CMAKE_CURRENT_SOURCE_DIR}/wasm-src/tcp_server.c)
diff --git a/samples/workload/XNNPACK/CMakeLists.txt b/samples/workload/XNNPACK/CMakeLists.txt
index 1be03326..3f67367a 100644
--- a/samples/workload/XNNPACK/CMakeLists.txt
+++ b/samples/workload/XNNPACK/CMakeLists.txt
@@ -90,5 +90,5 @@ ExternalProject_Add(xnnpack
//:f32_sqrt_ulp_eval.wasm
INSTALL_COMMAND ${CMAKE_COMMAND} -E copy_directory
${CMAKE_CURRENT_SOURCE_DIR}/xnnpack/bazel-out/wasm-opt/bin/
- ${CMAKE_CURRENT_SOURCE_DIR}/build/wasm-opt
+ ${CMAKE_BINARY_DIR}/wasm-opt
)
diff --git a/samples/workload/bwa/CMakeLists.txt b/samples/workload/bwa/CMakeLists.txt
index 9ea6704b..7f7e3182 100644
--- a/samples/workload/bwa/CMakeLists.txt
+++ b/samples/workload/bwa/CMakeLists.txt
@@ -42,5 +42,5 @@ ExternalProject_Add(bwa
-DCMAKE_SYSROOT=${WASI_SDK_HOME}/share/wasi-sysroot
${CMAKE_CURRENT_SOURCE_DIR}/bwa
BUILD_COMMAND make bwa_wasm_opt
- INSTALL_COMMAND ${CMAKE_COMMAND} -E copy ./bwa.opt.wasm ${CMAKE_CURRENT_SOURCE_DIR}/build/bwa.wasm
+ INSTALL_COMMAND ${CMAKE_COMMAND} -E copy ./bwa.opt.wasm ${CMAKE_BINARY_DIR}/bwa.wasm
)
diff --git a/samples/workload/meshoptimizer/CMakeLists.txt b/samples/workload/meshoptimizer/CMakeLists.txt
index 97f98fa3..172de8d6 100644
--- a/samples/workload/meshoptimizer/CMakeLists.txt
+++ b/samples/workload/meshoptimizer/CMakeLists.txt
@@ -26,5 +26,5 @@ ExternalProject_Add(codecbench
-DCMAKE_SYSROOT=${WASI_SDK_HOME}/share/wasi-sysroot
${CMAKE_CURRENT_SOURCE_DIR}/meshoptimizer
BUILD_COMMAND make codecbench
- INSTALL_COMMAND ${CMAKE_COMMAND} -E copy ./codecbench.wasm ${CMAKE_CURRENT_SOURCE_DIR}/build/codecbench.wasm
+ INSTALL_COMMAND ${CMAKE_COMMAND} -E copy ./codecbench.wasm ${CMAKE_BINARY_DIR}/codecbench.wasm
)
diff --git a/samples/workload/meshoptimizer/codecbench.patch b/samples/workload/meshoptimizer/codecbench.patch
index 4c9063aa..667b8ab2 100644
--- a/samples/workload/meshoptimizer/codecbench.patch
+++ b/samples/workload/meshoptimizer/codecbench.patch
@@ -1,10 +1,10 @@
diff --git a/CMakeLists.txt b/CMakeLists.txt
-index f4378ce..9bc104b 100644
+index b13d946..4254003 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
-@@ -129,3 +129,43 @@ install(FILES
- ${CMAKE_CURRENT_BINARY_DIR}/meshoptimizerConfig.cmake
+@@ -149,3 +149,43 @@ install(FILES
${CMAKE_CURRENT_BINARY_DIR}/meshoptimizerConfigVersion.cmake
+ COMPONENT meshoptimizer
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/meshoptimizer)
+
+##################################################
@@ -47,10 +47,10 @@ index f4378ce..9bc104b 100644
+
+add_dependencies(codecbench.opt codecbench)
diff --git a/src/vertexcodec.cpp b/src/vertexcodec.cpp
-index 5f3ec20..b79bfad 100644
+index 821c467..b7d30b1 100644
--- a/src/vertexcodec.cpp
+++ b/src/vertexcodec.cpp
-@@ -81,13 +81,13 @@
+@@ -83,13 +83,13 @@
#endif
#ifdef SIMD_WASM
@@ -71,7 +71,7 @@ index 5f3ec20..b79bfad 100644
#endif
namespace meshopt
-@@ -700,7 +700,7 @@ static v128_t decodeShuffleMask(unsigned char mask0, unsigned char mask1)
+@@ -691,7 +691,7 @@ static v128_t decodeShuffleMask(unsigned char mask0, unsigned char mask1)
v128_t sm1 = wasm_v128_load(&kDecodeBytesGroupShuffle[mask1]);
v128_t sm1off = wasm_v128_load(&kDecodeBytesGroupCount[mask0]);
@@ -80,7 +80,7 @@ index 5f3ec20..b79bfad 100644
v128_t sm1r = wasm_i8x16_add(sm1, sm1off);
-@@ -751,7 +751,7 @@ static const unsigned char* decodeBytesGroupSimd(const unsigned char* data, unsi
+@@ -741,7 +741,7 @@ static const unsigned char* decodeBytesGroupSimd(const unsigned char* data, unsi
v128_t shuf = decodeShuffleMask(mask0, mask1);
@@ -89,7 +89,7 @@ index 5f3ec20..b79bfad 100644
wasm_v128_store(buffer, result);
-@@ -773,7 +773,7 @@ static const unsigned char* decodeBytesGroupSimd(const unsigned char* data, unsi
+@@ -763,7 +763,7 @@ static const unsigned char* decodeBytesGroupSimd(const unsigned char* data, unsi
v128_t shuf = decodeShuffleMask(mask0, mask1);
@@ -99,10 +99,10 @@ index 5f3ec20..b79bfad 100644
wasm_v128_store(buffer, result);
diff --git a/src/vertexfilter.cpp b/src/vertexfilter.cpp
-index 023452c..2374cf7 100644
+index 14a73b1..8f4b3c1 100644
--- a/src/vertexfilter.cpp
+++ b/src/vertexfilter.cpp
-@@ -56,10 +56,10 @@
+@@ -57,10 +57,10 @@
#endif
#ifdef SIMD_WASM
diff --git a/test-tools/wamr-ide/VSCode-Extension/package.json b/test-tools/wamr-ide/VSCode-Extension/package.json
index 98aee2a9..45504523 100644
--- a/test-tools/wamr-ide/VSCode-Extension/package.json
+++ b/test-tools/wamr-ide/VSCode-Extension/package.json
@@ -125,9 +125,14 @@
"swift"
]
},
- "program": "./resource/debug/bin/lldb-vscode",
"windows": {
- "program": "./resource/debug/bin/lldb-vscode.exe"
+ "program": "./resource/debug/windows/bin/lldb-vscode.exe"
+ },
+ "osx": {
+ "program": "./resource/debug/osx/bin/lldb-vscode"
+ },
+ "linux": {
+ "program": "./resource/debug/linux/bin/lldb-vscode"
},
"configurationAttributes": {
"attach": {
diff --git a/test-tools/wamr-ide/VSCode-Extension/resource/debug/README.md b/test-tools/wamr-ide/VSCode-Extension/resource/debug/README.md
index 27efb169..36fbc5d6 100644
--- a/test-tools/wamr-ide/VSCode-Extension/resource/debug/README.md
+++ b/test-tools/wamr-ide/VSCode-Extension/resource/debug/README.md
@@ -1,11 +1,11 @@
### If you want to enable `source debugging` for this extension, please build `lldb` firstly following this [instruction](../../../../../doc/source_debugging.md#debugging-with-interpreter).
-### After building(`linux` for example), create `bin` folder and `lib` folder respectively in current directory, add following necessary target files into the folders.
+### After building(`linux` for example), create `bin` folder and `lib` folder respectively in `linux` directory, add following necessary target files into the folders.
```shell
- /llvm/build-lldb/bin/lldb # move this file to resource/debug/bin/
- /llvm/build-lldb/bin/lldb-vscode # move this file to resource/debug/bin/
- /llvm/build-lldb/lib/liblldb.so.13 # move this file to resource/debug/lib/
+ /llvm/build-lldb/bin/lldb # move this file to resource/debug/linux/bin/
+ /llvm/build-lldb/bin/lldb-vscode # move this file to resource/debug/linux/bin/
+ /llvm/build-lldb/lib/liblldb.so.13 # move this file to resource/debug/linux/lib/
```
Note: For macOS, the library is named like `liblldb.13.0.1.dylib`.
diff --git a/test-tools/wamr-ide/VSCode-Extension/resource/debug/linux/.placeholder b/test-tools/wamr-ide/VSCode-Extension/resource/debug/linux/.placeholder
new file mode 100644
index 00000000..e69de29b
diff --git a/test-tools/wamr-ide/VSCode-Extension/resource/debug/osx/.placeholder b/test-tools/wamr-ide/VSCode-Extension/resource/debug/osx/.placeholder
new file mode 100644
index 00000000..e69de29b
diff --git a/test-tools/wamr-ide/VSCode-Extension/resource/debug/windows/.placeholder b/test-tools/wamr-ide/VSCode-Extension/resource/debug/windows/.placeholder
new file mode 100644
index 00000000..e69de29b
diff --git a/test-tools/wamr-ide/VSCode-Extension/resource/scripts/boot_debugger_server.sh b/test-tools/wamr-ide/VSCode-Extension/resource/scripts/boot_debugger_server.sh
index 9bd24548..97e290fc 100755
--- a/test-tools/wamr-ide/VSCode-Extension/resource/scripts/boot_debugger_server.sh
+++ b/test-tools/wamr-ide/VSCode-Extension/resource/scripts/boot_debugger_server.sh
@@ -3,6 +3,8 @@
# Copyright (C) 2019 Intel Corporation. All rights reserved.
# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+set -e
+
docker run --rm -it --name=wasm-debug-server-ctr \
-v "$(pwd)":/mnt \
-p 1234:1234 \
diff --git a/test-tools/wamr-ide/VSCode-Extension/resource/scripts/build.sh b/test-tools/wamr-ide/VSCode-Extension/resource/scripts/build.sh
index 193d53b6..04892b4e 100755
--- a/test-tools/wamr-ide/VSCode-Extension/resource/scripts/build.sh
+++ b/test-tools/wamr-ide/VSCode-Extension/resource/scripts/build.sh
@@ -3,6 +3,8 @@
# Copyright (C) 2019 Intel Corporation. All rights reserved.
# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+set -e
+
docker run --rm --name=wasm-toolchain-ctr \
-it -v "$(pwd)":/mnt \
--env=PROJ_PATH="$(pwd)" \
diff --git a/test-tools/wamr-ide/VSCode-Extension/resource/scripts/destroy.sh b/test-tools/wamr-ide/VSCode-Extension/resource/scripts/destroy.sh
index aa90a86d..41faf3ea 100755
--- a/test-tools/wamr-ide/VSCode-Extension/resource/scripts/destroy.sh
+++ b/test-tools/wamr-ide/VSCode-Extension/resource/scripts/destroy.sh
@@ -3,6 +3,8 @@
# Copyright (C) 2019 Intel Corporation. All rights reserved.
# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+set -e
+
docker -v>/dev/null
if [ $? -ne 0 ]; then
echo "\nDocker is not installed, please install docker firstly.\n"
diff --git a/test-tools/wamr-ide/VSCode-Extension/resource/scripts/run.sh b/test-tools/wamr-ide/VSCode-Extension/resource/scripts/run.sh
index e9aacbc4..31961847 100755
--- a/test-tools/wamr-ide/VSCode-Extension/resource/scripts/run.sh
+++ b/test-tools/wamr-ide/VSCode-Extension/resource/scripts/run.sh
@@ -3,6 +3,8 @@
# Copyright (C) 2019 Intel Corporation. All rights reserved.
# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+set -e
+
docker run --rm -it --name=wasm-debug-server-ctr \
-v "$(pwd)":/mnt \
wasm-debug-server:1.0 \
diff --git a/test-tools/wamr-ide/VSCode-Extension/resource/webview/css/style.css b/test-tools/wamr-ide/VSCode-Extension/resource/webview/css/style.css
index 8975ecf7..bff10e5b 100644
--- a/test-tools/wamr-ide/VSCode-Extension/resource/webview/css/style.css
+++ b/test-tools/wamr-ide/VSCode-Extension/resource/webview/css/style.css
@@ -59,7 +59,7 @@
}
#ipt_projName,
-#tselect_dropdown,
+#select_dropdown,
.config_form_body vscode-text-field,
.config_form_body vscode-text-area {
width: 100%;
diff --git a/test-tools/wamr-ide/VSCode-Extension/src/utilities/directoryUtilities.ts b/test-tools/wamr-ide/VSCode-Extension/src/utilities/directoryUtilities.ts
index 35b8a4cf..cff54c7f 100644
--- a/test-tools/wamr-ide/VSCode-Extension/src/utilities/directoryUtilities.ts
+++ b/test-tools/wamr-ide/VSCode-Extension/src/utilities/directoryUtilities.ts
@@ -6,6 +6,7 @@
import fileSystem = require('fs');
import vscode = require('vscode');
import path = require('path');
+import os = require('os');
/**
*
@@ -94,3 +95,26 @@ export function CheckIfDirectoryExist(path: string): boolean {
return false;
}
}
+
+export function checkFolderName(folderName: string) {
+ let invalidCharacterArr: string[] = [];
+ var valid = true;
+
+ if (folderName.length > 255) {
+ valid = false;
+ }
+
+ if (os.platform() === 'win32') {
+ invalidCharacterArr = ['\\', '/', ':', '?', '*', '"', '|', '<', '>'];
+ } else if (os.platform() === 'linux' || os.platform() === 'darwin') {
+ invalidCharacterArr = ['/'];
+ }
+
+ invalidCharacterArr.forEach(function (c) {
+ if (folderName.indexOf(c) !== -1) {
+ valid = false;
+ }
+ });
+
+ return valid;
+}
diff --git a/test-tools/wamr-ide/VSCode-Extension/src/view/NewProjectPanel.ts b/test-tools/wamr-ide/VSCode-Extension/src/view/NewProjectPanel.ts
index 17732ec0..a7536564 100644
--- a/test-tools/wamr-ide/VSCode-Extension/src/view/NewProjectPanel.ts
+++ b/test-tools/wamr-ide/VSCode-Extension/src/view/NewProjectPanel.ts
@@ -6,7 +6,12 @@
import * as vscode from 'vscode';
import * as path from 'path';
import * as fs from 'fs';
-import { CreateDirectory, CopyFiles } from '../utilities/directoryUtilities';
+import * as os from 'os';
+import {
+ CreateDirectory,
+ CopyFiles,
+ checkFolderName,
+} from '../utilities/directoryUtilities';
import { getUri } from '../utilities/getUri';
export class NewProjectPanel {
@@ -15,13 +20,11 @@ export class NewProjectPanel {
private readonly _panel: vscode.WebviewPanel;
private _disposables: vscode.Disposable[] = [];
- static readonly USER_INTPUT_ERR: number = -2;
- static readonly DIR_EXSITED_ERR: number = -1;
static readonly EXCUTION_SUCCESS: number = 0;
+ static readonly DIR_EXSITED_ERR: number = -1;
+ static readonly USER_INTPUT_ERR: number = -2;
+ static readonly DIR_PATH_INVALID_ERR: number = -3;
- /**
- * @param context extension context from extension.ts active func
- */
constructor(extensionUri: vscode.Uri, panel: vscode.WebviewPanel) {
this._panel = panel;
this._panel.webview.html = this._getHtmlForWebview(
@@ -33,9 +36,6 @@ export class NewProjectPanel {
this._panel.onDidDispose(this.dispose, null, this._disposables);
}
- /**
- * @param context
- */
public static render(context: vscode.ExtensionContext) {
NewProjectPanel.USER_SET_WORKSPACE = vscode.workspace
.getConfiguration()
@@ -55,7 +55,6 @@ export class NewProjectPanel {
}
);
- /* create new project panel obj */
NewProjectPanel.currentPanel = new NewProjectPanel(
context.extensionUri,
panel
@@ -63,10 +62,6 @@ export class NewProjectPanel {
}
}
- /**
- * @param projName project name input by user
- * @param template
- */
private _creatNewProject(
projName: string,
template: string,
@@ -76,22 +71,23 @@ export class NewProjectPanel {
return NewProjectPanel.USER_INTPUT_ERR;
}
+ if (!checkFolderName(projName)) {
+ return NewProjectPanel.DIR_PATH_INVALID_ERR;
+ }
+
let ROOT_PATH = path.join(NewProjectPanel.USER_SET_WORKSPACE, projName);
let EXT_PATH = extensionUri.fsPath;
- /* if the direcotry has exsited, then ignore the creation and return */
if (fs.existsSync(ROOT_PATH)) {
if (fs.lstatSync(ROOT_PATH).isDirectory()) {
return NewProjectPanel.DIR_EXSITED_ERR;
}
}
- /* create necessary floders under the project directory */
CreateDirectory(path.join(ROOT_PATH, '.wamr'));
CreateDirectory(path.join(ROOT_PATH, 'include'));
CreateDirectory(path.join(ROOT_PATH, 'src'));
- /* copy scripts files to project_root_path/.wamr */
CopyFiles(
path.join(EXT_PATH, 'resource/scripts/CMakeLists.txt'),
path.join(ROOT_PATH, '.wamr/CMakeLists.txt')
@@ -110,7 +106,6 @@ export class NewProjectPanel {
extensionUri: vscode.Uri,
templatePath: string
) {
- /* get toolkit uri */
const toolkitUri = getUri(webview, extensionUri, [
'node_modules',
'@vscode',
@@ -147,29 +142,26 @@ export class NewProjectPanel {
webview: vscode.Webview,
extensionUri: vscode.Uri
) {
- // Handle messages from the webview
webview.onDidReceiveMessage(
message => {
switch (message.command) {
case 'create_new_project':
+ let createNewProjectStatus = this._creatNewProject(
+ message.projectName,
+ message.template,
+ extensionUri
+ );
if (
- this._creatNewProject(
- message.projectName,
- message.template,
- extensionUri
- ) === NewProjectPanel.EXCUTION_SUCCESS
+ createNewProjectStatus ===
+ NewProjectPanel.EXCUTION_SUCCESS
) {
- /* post message to page to inform the project creation has finished */
webview.postMessage({
command: 'proj_creation_finish',
prjName: message.projectName,
});
} else if (
- this._creatNewProject(
- message.projectName,
- message.template,
- extensionUri
- ) === NewProjectPanel.DIR_EXSITED_ERR
+ createNewProjectStatus ===
+ NewProjectPanel.DIR_EXSITED_ERR
) {
vscode.window.showErrorMessage(
'Project : ' +
@@ -178,16 +170,30 @@ export class NewProjectPanel {
);
return;
} else if (
- this._creatNewProject(
- message.projectName,
- message.template,
- extensionUri
- ) === NewProjectPanel.USER_INTPUT_ERR
+ createNewProjectStatus ===
+ NewProjectPanel.USER_INTPUT_ERR
) {
vscode.window.showErrorMessage(
'Please fill chart before your submit!'
);
return;
+ } else if (
+ createNewProjectStatus ===
+ NewProjectPanel.DIR_PATH_INVALID_ERR
+ ) {
+ if (os.platform() === 'win32') {
+ vscode.window.showErrorMessage(
+ "A file name can't contain any of the following characters: ' / \\ : * ? < > | ' and the length should be less than 255"
+ );
+ } else if (
+ os.platform() === 'linux' ||
+ os.platform() === 'darwin'
+ ) {
+ vscode.window.showErrorMessage(
+ "A file name can't contain following characters: '/' and the length should be less than 255"
+ );
+ }
+ return;
}
return;
diff --git a/wamr-compiler/main.c b/wamr-compiler/main.c
index 820420eb..b77533ed 100644
--- a/wamr-compiler/main.c
+++ b/wamr-compiler/main.c
@@ -48,9 +48,8 @@ print_help()
printf(" thread-mgr will be enabled automatically\n");
printf(" --enable-tail-call Enable the post-MVP tail call feature\n");
printf(" --disable-simd Disable the post-MVP 128-bit SIMD feature:\n");
- printf(" currently 128-bit SIMD is only supported for x86-64 target,\n");
- printf(" and by default it is enabled in x86-64 target and disabled\n");
- printf(" in other targets\n");
+ printf(" currently 128-bit SIMD is supported for x86-64 and aarch64 targets,\n");
+ printf(" and by default it is enabled in them and disabled in other targets\n");
printf(" --disable-ref-types Disable the MVP reference types feature\n");
printf(" --disable-aux-stack-check Disable auxiliary stack overflow/underflow check\n");
printf(" --enable-dump-call-stack Enable stack trace feature\n");