re-org bh_definition.c && introduce wamr fast interpreter (#189)
Co-authored-by: Xu Jun
This commit is contained in:
@ -1,12 +1,72 @@
|
||||
|
||||
Build WAMR core (iwasm)
|
||||
=========================
|
||||
Please follow the instructions below to build the WAMR VM core on different platforms.
|
||||
It is recommended to use the [WAMR SDK](../wamr-sdk) tools to build a project that embedes the WAMR. This document introduces how to build the WAMR minimal product which is vmcore only (no app-framework and app-mgr) for multiple platforms.
|
||||
|
||||
|
||||
|
||||
## iwasm VM core CMake building configurations
|
||||
|
||||
By including the cmake scripts under folder [build-scripts](../build-scripts), it is easy to build minimal product with CMake. WAMR provides a number of features which can be easily configured through cmake variables:
|
||||
|
||||
``` Bash
|
||||
cmake -DWAMR_BUILD_INTERP=1/0 to enable or disable WASM intepreter
|
||||
cmake -DWAMR_BUILD_FAST_INTERP=1/0 to build fast (default) or classic WASM intepreter.
|
||||
cmake -DWAMR_BUILD_AOT=1/0 to enable or disable WASM AOT
|
||||
cmake -DWAMR_BUILD_JIT=1/0 to enable or disable WASM JIT. (Disabled by default)
|
||||
cmake -DWAMR_BUILD_LIBC_BUILTIN=1/0 enable or disable Libc builtin API's. (Enabled by default)
|
||||
cmake -DWAMR_BUILD_LIBC_WASI=1/0 enable or disable Libc WASI API's
|
||||
cmake -DWAMR_BUILD_TARGET=<arch> to set the building target, including:
|
||||
X86_64, X86_32, ARM, THUMB, XTENSA and MIPS
|
||||
For ARM and THUMB, the format is <arch>[<sub-arch>][_VFP] where <sub-arch> is the ARM sub-architecture and the "_VFP" suffix means VFP coprocessor registers s0-s15 (d0-d7) are used for passing arguments or returning results in standard procedure-call. Both <sub-arch> and [_VFP] are optional. e.g. ARMV7, ARMV7_VFP, THUMBV7, THUMBV7_VFP and so on.
|
||||
```
|
||||
|
||||
For example, if we want to enable classic interpreter, we can:
|
||||
|
||||
``` Bash
|
||||
cmake .. -DWAMR_BUILD_FAST_INTERP=0
|
||||
```
|
||||
|
||||
**Note** the fast interpreter will run ~2X faster than classic interpreter, but it consumes about 2X memory to hold the WASM bytecode code.
|
||||
|
||||
If we want to disable interpreter, enable AOT and WASI, we can:
|
||||
|
||||
``` Bash
|
||||
cmake .. -DWAMR_BUILD_INTERP=0 -DWAMR_BUILD_AOT=1 -DWAMR_BUILD_LIBC_WASI=0
|
||||
```
|
||||
|
||||
Or if we want to enable inerpreter, disable AOT and WASI, and build as X86_32, we can:
|
||||
|
||||
``` Bash
|
||||
cmake .. -DWAMR_BUILD_INTERP=1 -DWAMR_BUILD_AOT=0 -DWAMR_BUILD_LIBC_WASI=0 -DWAMR_BUILD_TARGET=X86_32
|
||||
```
|
||||
|
||||
By default in Linux, the interpreter, AOT and WASI are enabled, and JIT is disabled. And the build target is
|
||||
set to X86_64 or X86_32 depending on the platform's bitwidth.
|
||||
|
||||
To enable WASM JIT, firstly we should build LLVM:
|
||||
|
||||
``` Bash
|
||||
cd product-mini/platforms/linux/
|
||||
./build_llvm.sh (The llvm source code is cloned under <wamr_root_dir>/core/deps/llvm and auto built)
|
||||
```
|
||||
|
||||
Then pass option -DWAMR_BUILD_JIT=1 to cmake to enable WASM JIT:
|
||||
|
||||
``` Bash
|
||||
mkdir build
|
||||
cd build
|
||||
cmake .. -DWAMR_BUILD_JIT=1
|
||||
make
|
||||
```
|
||||
|
||||
|
||||
|
||||
Linux
|
||||
-------------------------
|
||||
First of all please install the dependent packages.
|
||||
Run command below in Ubuntu-18.04:
|
||||
|
||||
``` Bash
|
||||
sudo apt install build-essential cmake g++-multilib libgcc-8-dev lib32gcc-8-dev
|
||||
```
|
||||
@ -29,46 +89,13 @@ make
|
||||
```
|
||||
The binary file iwasm will be generated under build folder.
|
||||
|
||||
Note:
|
||||
WAMR provides some features which can be easily configured by passing options to cmake:
|
||||
``` Bash
|
||||
cmake -DWAMR_BUILD_INTERP=1/0 to enable or disable WASM intepreter
|
||||
cmake -DWAMR_BUILD_AOT=1/0 to enable or disable WASM AOT
|
||||
cmake -DWAMR_BUILD_JIT=1/0 to enable or disable WASM JIT
|
||||
cmake -DWAMR_BUILD_LIBC_BUILTIN=1/0 enable or disable Libc builtin API's
|
||||
cmake -DWAMR_BUILD_LIBC_WASI=1/0 enable or disable Libc WASI API's
|
||||
cmake -DWAMR_BUILD_TARGET=<arch> to set the building target, including:
|
||||
X86_64, X86_32, ARM, THUMB, XTENSA and MIPS
|
||||
For ARM and THUMB, the format is <arch>[<sub-arch>][_VFP] where <sub-arch> is the ARM sub-architecture and the "_VFP" suffix means VFP coprocessor registers s0-s15 (d0-d7) are used for passing arguments or returning results in standard procedure-call. Both <sub-arch> and [_VFP] are optional. e.g. ARMV7, ARMV7_VFP, THUMBV7, THUMBV7_VFP and so on.
|
||||
```
|
||||
|
||||
For example, if we want to disable interpreter, enable AOT and WASI, we can:
|
||||
``` Bash
|
||||
cmake .. -DWAMR_BUILD_INTERP=0 -DWAMR_BUILD_AOT=1 -DWAMR_BUILD_LIBC_WASI=0
|
||||
```
|
||||
Or if we want to enable inerpreter, disable AOT and WASI, and build as X86_32, we can:
|
||||
``` Bash
|
||||
cmake .. -DWAMR_BUILD_INTERP=1 -DWAMR_BUILD_AOT=0 -DWAMR_BUILD_LIBC_WASI=0 -DWAMR_BUILD_TARGET=X86_32
|
||||
```
|
||||
|
||||
By default in Linux, the interpreter, AOT and WASI are enabled, and JIT is disabled. And the build target is
|
||||
set to X86_64 or X86_32 depending on the platform's bitwidth.
|
||||
|
||||
To enable WASM JIT, firstly we should build LLVM:
|
||||
``` Bash
|
||||
cd product-mini/platforms/linux/
|
||||
./build_llvm.sh (The llvm source code is cloned under <wamr_root_dir>/core/deps/llvm and auto built)
|
||||
```
|
||||
Then pass option -DWAMR_BUILD_JIT=1 to cmake to enable WASM JIT:
|
||||
``` Bash
|
||||
mkdir build
|
||||
cd build
|
||||
cmake .. -DWAMR_BUILD_JIT=1
|
||||
make
|
||||
```
|
||||
|
||||
Linux SGX (Intel Software Guard Extention)
|
||||
-------------------------
|
||||
|
||||
First of all please install the [Intel SGX SDK](https://software.intel.com/en-us/sgx/sdk).
|
||||
|
||||
After installing dependencies, build the source code:
|
||||
@ -122,11 +149,11 @@ VxWorks 7 SR0620 release is validated.
|
||||
|
||||
First you need to build a VSB. Make sure *UTILS_UNIX* layer is added in the VSB.
|
||||
After the VSB is built, export the VxWorks toolchain path by:
|
||||
```
|
||||
```bash
|
||||
export <vsb_dir_path>/host/vx-compiler/bin:$PATH
|
||||
```
|
||||
Now switch to iwasm source tree to build the source code:
|
||||
```
|
||||
```bash
|
||||
cd product-mini/platforms/vxworks/
|
||||
mkdir build
|
||||
cd build
|
||||
|
||||
@ -20,20 +20,20 @@ Embedding WAMR guideline
|
||||
|
||||
// all the WAMR heap and WASM applications are limited in this buffer
|
||||
bh_memory_init_with_pool(global_heap_buf, sizeof(global_heap_buf));
|
||||
|
||||
|
||||
wasm_runtime_init();
|
||||
|
||||
// read WASM file into a memory buffer
|
||||
buffer = read_wasm_binary_to_buffer(…, &size);
|
||||
|
||||
|
||||
// parse the WASM file from buffer and create a WASM module
|
||||
module = wasm_runtime_load(buffer, size, error_buf, sizeof(error_buf));
|
||||
|
||||
// create an instance of the WASM module (WASM linear memory is ready)
|
||||
module_inst = wasm_runtime_instantiate(module,
|
||||
stack_size,
|
||||
module_inst = wasm_runtime_instantiate(module,
|
||||
stack_size,
|
||||
heap_size,
|
||||
error_buf,
|
||||
error_buf,
|
||||
sizeof(error_buf));
|
||||
```
|
||||
|
||||
@ -59,7 +59,6 @@ After a module is instantiated, the runtime native can lookup WASM functions by
|
||||
|
||||
// call the WASM function
|
||||
if (wasm_runtime_call_wasm(exec_env, func, 1, argv) ) {
|
||||
|
||||
/* the return value is stored in argv[0] */
|
||||
printf("fib function return: %d\n", argv[0]);
|
||||
}
|
||||
@ -79,25 +78,24 @@ The parameters are transferred in an array of 32 bits elements. For parameters t
|
||||
double arg3 = 1.0;
|
||||
int 64 arg4 = 100;
|
||||
double ret;
|
||||
|
||||
|
||||
argv[0] = arg1;
|
||||
argv[1] = arg2;
|
||||
|
||||
// use memory copy for 8 bytes parameters rather than
|
||||
// *(double*)(&argv[2]) = arg3 here because some archs
|
||||
|
||||
// use memory copy for 8 bytes parameters rather than
|
||||
// *(double*)(&argv[2]) = arg3 here because some archs
|
||||
// like ARM, MIPS requires address is 8 aligned.
|
||||
// Or use the aligned malloc or compiler align attribute
|
||||
// to ensure the array address is 8 bytes aligned
|
||||
memcpy(&argv[2], &arg3, sizeof(arg3));
|
||||
memcpy(&argv[4], &arg4, sizeof(arg4));
|
||||
|
||||
//
|
||||
//
|
||||
// attention: the arg number is 6 here since both
|
||||
// arg3 and arg4 each takes 2 elements
|
||||
//
|
||||
wasm_runtime_call_wasm(exec_env, func, 6, argv);
|
||||
|
||||
// if the return value is type of 8 bytes, it takes
|
||||
|
||||
// if the return value is type of 8 bytes, it takes
|
||||
// the first two array elements
|
||||
memcpy(&ret, &argv[0], sizeof(ret));
|
||||
|
||||
@ -109,7 +107,7 @@ The parameters are transferred in an array of 32 bits elements. For parameters t
|
||||
|
||||
|
||||
|
||||
If we need to transfer a buffer to WASM function, we can pass the buffer address through a parameter. **Attention**: The sandbox will forbid the WASM code to access outside memory, we must **allocate the buffer from WASM instance's own memory space and pass the buffer address in instance's space (not the runtime native address)**.
|
||||
If we need to transfer a buffer to WASM function, we can pass the buffer address through a parameter. **Attention**: The sandbox will forbid the WASM code to access outside memory, we must **allocate the buffer from WASM instance's own memory space and pass the buffer address in instance's space (not the runtime native address)**.
|
||||
|
||||
|
||||
|
||||
@ -124,10 +122,10 @@ There are two runtime APIs available for this purpose.
|
||||
* size: the buffer size to allocate
|
||||
*/
|
||||
int32_t
|
||||
wasm_runtime_module_malloc(wasm_module_inst_t module_inst,
|
||||
wasm_runtime_module_malloc(wasm_module_inst_t module_inst,
|
||||
uint32_t size,
|
||||
void **p_native_addr);
|
||||
|
||||
void **p_native_addr);
|
||||
|
||||
/*
|
||||
* description: malloc a buffer from instance's private memory space,
|
||||
* and copy the data from another native buffer to it.
|
||||
@ -137,8 +135,8 @@ wasm_runtime_module_malloc(wasm_module_inst_t module_inst,
|
||||
*/
|
||||
int32
|
||||
wasm_runtime_module_dup_data(WASMModuleInstanceCommon *module_inst,
|
||||
const char *src,
|
||||
uint32 size);
|
||||
const char *src,
|
||||
uint32 size);
|
||||
```
|
||||
|
||||
|
||||
@ -154,7 +152,7 @@ if(buffer_for_wasm != 0)
|
||||
{
|
||||
unit32 argv[2];
|
||||
strncpy(buffer, "hello", 100); // use native address for accessing in runtime
|
||||
argv[0] = buffer_for_wasm; // pass the buffer address for WASM space.
|
||||
argv[0] = buffer_for_wasm; // pass the buffer address for WASM space.
|
||||
argv[1] = 100; // the size of buffer
|
||||
wasm_runtime_call_wasm(exec_env, func, 2, argv);
|
||||
}
|
||||
|
||||
@ -20,8 +20,6 @@ Create folders:
|
||||
Implement folder core/shared/platform/super-os. Normally in this folder you should implement the following files:
|
||||
- bh_platform.h and bh_platform.c: define the platform related macros, data types and APIs.
|
||||
- bh_assert.c: implement function bh_assert_internal() and bh_debug_internal().
|
||||
- bh_definition.c: implement function b_memcpy_s, b_strcat_s and b_strcpy_s. And implement fopen_s
|
||||
if we need to read wasm file from file system.
|
||||
- bh_platform_log.c: implement function bh_log_emit, bh_fprintf and bh_fflush.
|
||||
- bh_time.c: implement several time related functions.
|
||||
- bh_thread.c: implement thread, mutex, condition related functions.
|
||||
|
||||
Reference in New Issue
Block a user