mirror of
https://github.com/bytecodealliance/wasm-micro-runtime.git
synced 2025-02-11 17:35:13 +00:00
Merge branch main into dev/wasi-libc-windows
This commit is contained in:
commit
e222955f31
2
.github/workflows/coding_guidelines.yml
vendored
2
.github/workflows/coding_guidelines.yml
vendored
|
@ -16,7 +16,7 @@ concurrency:
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
compliance_job:
|
compliance_job:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-20.04
|
||||||
steps:
|
steps:
|
||||||
- name: checkout
|
- name: checkout
|
||||||
uses: actions/checkout@v3
|
uses: actions/checkout@v3
|
||||||
|
|
|
@ -65,6 +65,7 @@ env:
|
||||||
THREADS_TEST_OPTIONS: "-s spec -b -p -P"
|
THREADS_TEST_OPTIONS: "-s spec -b -p -P"
|
||||||
X86_32_TARGET_TEST_OPTIONS: "-m x86_32 -P"
|
X86_32_TARGET_TEST_OPTIONS: "-m x86_32 -P"
|
||||||
WASI_TEST_OPTIONS: "-s wasi_certification -w"
|
WASI_TEST_OPTIONS: "-s wasi_certification -w"
|
||||||
|
WAMR_COMPILER_TEST_OPTIONS: "-s wamr_compiler -b -P"
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build_llvm_libraries_on_ubuntu_2204:
|
build_llvm_libraries_on_ubuntu_2204:
|
||||||
|
@ -150,9 +151,7 @@ jobs:
|
||||||
exclude:
|
exclude:
|
||||||
# uncompatiable feature and platform
|
# uncompatiable feature and platform
|
||||||
# uncompatiable mode and feature
|
# uncompatiable mode and feature
|
||||||
# MULTI_MODULE only on INTERP mode
|
# MULTI_MODULE only on INTERP mode and AOT mode
|
||||||
- make_options_run_mode: $AOT_BUILD_OPTIONS
|
|
||||||
make_options_feature: "-DWAMR_BUILD_MULTI_MODULE=1"
|
|
||||||
- make_options_run_mode: $FAST_JIT_BUILD_OPTIONS
|
- make_options_run_mode: $FAST_JIT_BUILD_OPTIONS
|
||||||
make_options_feature: "-DWAMR_BUILD_MULTI_MODULE=1"
|
make_options_feature: "-DWAMR_BUILD_MULTI_MODULE=1"
|
||||||
- make_options_run_mode: $LLVM_LAZY_JIT_BUILD_OPTIONS
|
- make_options_run_mode: $LLVM_LAZY_JIT_BUILD_OPTIONS
|
||||||
|
@ -241,6 +240,14 @@ jobs:
|
||||||
cmake --build . --config Release --parallel 4
|
cmake --build . --config Release --parallel 4
|
||||||
working-directory: product-mini/platforms/${{ matrix.platform }}
|
working-directory: product-mini/platforms/${{ matrix.platform }}
|
||||||
|
|
||||||
|
- name: Build and run unit tests
|
||||||
|
run: |
|
||||||
|
mkdir build-unittests && cd build-unittests
|
||||||
|
cmake .. ${{ matrix.make_options_run_mode }} ${{ matrix.make_options_feature }}
|
||||||
|
cmake --build . --config Release --parallel 4
|
||||||
|
ctest
|
||||||
|
working-directory: tests/unit
|
||||||
|
|
||||||
build_samples_wasm_c_api:
|
build_samples_wasm_c_api:
|
||||||
needs:
|
needs:
|
||||||
[
|
[
|
||||||
|
@ -320,7 +327,12 @@ jobs:
|
||||||
working-directory: samples/wasm-c-api
|
working-directory: samples/wasm-c-api
|
||||||
|
|
||||||
build_samples_others:
|
build_samples_others:
|
||||||
needs: [build_iwasm]
|
needs:
|
||||||
|
[
|
||||||
|
build_iwasm,
|
||||||
|
build_llvm_libraries_on_ubuntu_2204,
|
||||||
|
build_wamrc,
|
||||||
|
]
|
||||||
runs-on: ${{ matrix.os }}
|
runs-on: ${{ matrix.os }}
|
||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
|
@ -333,6 +345,9 @@ jobs:
|
||||||
[
|
[
|
||||||
"https://github.com/WebAssembly/wabt/releases/download/1.0.31/wabt-1.0.31-ubuntu.tar.gz",
|
"https://github.com/WebAssembly/wabt/releases/download/1.0.31/wabt-1.0.31-ubuntu.tar.gz",
|
||||||
]
|
]
|
||||||
|
include:
|
||||||
|
- os: ubuntu-22.04
|
||||||
|
llvm_cache_key: ${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}
|
||||||
steps:
|
steps:
|
||||||
- name: checkout
|
- name: checkout
|
||||||
uses: actions/checkout@v3
|
uses: actions/checkout@v3
|
||||||
|
@ -350,7 +365,23 @@ jobs:
|
||||||
sudo wget ${{ matrix.wabt_release }}
|
sudo wget ${{ matrix.wabt_release }}
|
||||||
sudo tar -xzf wabt-1.0.31-*.tar.gz
|
sudo tar -xzf wabt-1.0.31-*.tar.gz
|
||||||
sudo mv wabt-1.0.31 wabt
|
sudo mv wabt-1.0.31 wabt
|
||||||
|
- name: Get LLVM libraries
|
||||||
|
id: retrieve_llvm_libs
|
||||||
|
uses: actions/cache@v3
|
||||||
|
with:
|
||||||
|
path: |
|
||||||
|
./core/deps/llvm/build/bin
|
||||||
|
./core/deps/llvm/build/include
|
||||||
|
./core/deps/llvm/build/lib
|
||||||
|
./core/deps/llvm/build/libexec
|
||||||
|
./core/deps/llvm/build/share
|
||||||
|
key: ${{ matrix.llvm_cache_key }}
|
||||||
|
- name: Build wamrc
|
||||||
|
run: |
|
||||||
|
mkdir build && cd build
|
||||||
|
cmake ..
|
||||||
|
cmake --build . --config Release --parallel 4
|
||||||
|
working-directory: wamr-compiler
|
||||||
- name: Build Sample [basic]
|
- name: Build Sample [basic]
|
||||||
run: |
|
run: |
|
||||||
cd samples/basic
|
cd samples/basic
|
||||||
|
@ -377,9 +408,10 @@ jobs:
|
||||||
run: |
|
run: |
|
||||||
cd samples/multi-module
|
cd samples/multi-module
|
||||||
mkdir build && cd build
|
mkdir build && cd build
|
||||||
cmake ..
|
cmake .. -DWAMR_BUILD_AOT=1
|
||||||
cmake --build . --config Release --parallel 4
|
cmake --build . --config Release --parallel 4
|
||||||
./multi_module
|
./multi_module mC.wasm
|
||||||
|
./multi_module mC.aot
|
||||||
|
|
||||||
- name: Build Sample [spawn-thread]
|
- name: Build Sample [spawn-thread]
|
||||||
run: |
|
run: |
|
||||||
|
@ -449,6 +481,10 @@ jobs:
|
||||||
- os: ubuntu-22.04
|
- os: ubuntu-22.04
|
||||||
llvm_cache_key: ${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}
|
llvm_cache_key: ${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}
|
||||||
ubuntu_version: "22.04"
|
ubuntu_version: "22.04"
|
||||||
|
- os: ubuntu-22.04
|
||||||
|
llvm_cache_key: ${{ needs.build_llvm_libraries_on_ubuntu_2204.outputs.cache_key }}
|
||||||
|
running_mode: aot
|
||||||
|
test_option: $WAMR_COMPILER_TEST_OPTIONS
|
||||||
exclude:
|
exclude:
|
||||||
# uncompatiable modes and features
|
# uncompatiable modes and features
|
||||||
# classic-interp and fast-interp don't support simd
|
# classic-interp and fast-interp don't support simd
|
||||||
|
@ -456,9 +492,7 @@ jobs:
|
||||||
test_option: $SIMD_TEST_OPTIONS
|
test_option: $SIMD_TEST_OPTIONS
|
||||||
- running_mode: "fast-interp"
|
- running_mode: "fast-interp"
|
||||||
test_option: $SIMD_TEST_OPTIONS
|
test_option: $SIMD_TEST_OPTIONS
|
||||||
# aot and jit don't support multi module
|
# llvm jit doesn't support multi module
|
||||||
- running_mode: "aot"
|
|
||||||
test_option: $MULTI_MODULES_TEST_OPTIONS
|
|
||||||
- running_mode: "jit"
|
- running_mode: "jit"
|
||||||
test_option: $MULTI_MODULES_TEST_OPTIONS
|
test_option: $MULTI_MODULES_TEST_OPTIONS
|
||||||
# fast-jit doesn't support multi module, simd
|
# fast-jit doesn't support multi module, simd
|
||||||
|
|
8
.github/workflows/compilation_on_macos.yml
vendored
8
.github/workflows/compilation_on_macos.yml
vendored
|
@ -133,13 +133,11 @@ jobs:
|
||||||
exclude:
|
exclude:
|
||||||
# uncompatiable feature and platform
|
# uncompatiable feature and platform
|
||||||
# uncompatiable mode and feature
|
# uncompatiable mode and feature
|
||||||
# MULTI_MODULE only on INTERP mode
|
# MULTI_MODULE only on INTERP mode and AOT mode
|
||||||
- make_options_run_mode: $LLVM_LAZY_JIT_BUILD_OPTIONS
|
- make_options_run_mode: $LLVM_LAZY_JIT_BUILD_OPTIONS
|
||||||
make_options_feature: "-DWAMR_BUILD_MULTI_MODULE=1"
|
make_options_feature: "-DWAMR_BUILD_MULTI_MODULE=1"
|
||||||
- make_options_run_mode: $LLVM_EAGER_JIT_BUILD_OPTIONS
|
- make_options_run_mode: $LLVM_EAGER_JIT_BUILD_OPTIONS
|
||||||
make_options_feature: "-DWAMR_BUILD_MULTI_MODULE=1"
|
make_options_feature: "-DWAMR_BUILD_MULTI_MODULE=1"
|
||||||
- make_options_run_mode: $AOT_BUILD_OPTIONS
|
|
||||||
make_options_feature: "-DWAMR_BUILD_MULTI_MODULE=1"
|
|
||||||
# SIMD only on JIT/AOT mode
|
# SIMD only on JIT/AOT mode
|
||||||
- make_options_run_mode: $CLASSIC_INTERP_BUILD_OPTIONS
|
- make_options_run_mode: $CLASSIC_INTERP_BUILD_OPTIONS
|
||||||
make_options_feature: "-DWAMR_BUILD_SIMD=1"
|
make_options_feature: "-DWAMR_BUILD_SIMD=1"
|
||||||
|
@ -245,7 +243,7 @@ jobs:
|
||||||
working-directory: samples/wasm-c-api
|
working-directory: samples/wasm-c-api
|
||||||
|
|
||||||
build_samples_others:
|
build_samples_others:
|
||||||
needs: [build_iwasm]
|
needs: [build_iwasm, build_wamrc]
|
||||||
runs-on: ${{ matrix.os }}
|
runs-on: ${{ matrix.os }}
|
||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
|
@ -304,7 +302,7 @@ jobs:
|
||||||
mkdir build && cd build
|
mkdir build && cd build
|
||||||
cmake ..
|
cmake ..
|
||||||
cmake --build . --config Release --parallel 4
|
cmake --build . --config Release --parallel 4
|
||||||
./multi_module
|
./multi_module mC.wasm
|
||||||
|
|
||||||
- name: Build Sample [spawn-thread]
|
- name: Build Sample [spawn-thread]
|
||||||
run: |
|
run: |
|
||||||
|
|
3
.github/workflows/compilation_on_sgx.yml
vendored
3
.github/workflows/compilation_on_sgx.yml
vendored
|
@ -101,9 +101,6 @@ jobs:
|
||||||
platform: [linux-sgx]
|
platform: [linux-sgx]
|
||||||
exclude:
|
exclude:
|
||||||
# uncompatiable mode and feature
|
# uncompatiable mode and feature
|
||||||
# MULTI_MODULE only on INTERP mode
|
|
||||||
- make_options_run_mode: $AOT_BUILD_OPTIONS
|
|
||||||
make_options_feature: "-DWAMR_BUILD_MULTI_MODULE=1"
|
|
||||||
# MINI_LOADER only on INTERP mode
|
# MINI_LOADER only on INTERP mode
|
||||||
- make_options_run_mode: $AOT_BUILD_OPTIONS
|
- make_options_run_mode: $AOT_BUILD_OPTIONS
|
||||||
make_options_feature: "-DWAMR_BUILD_MINI_LOADER=1"
|
make_options_feature: "-DWAMR_BUILD_MINI_LOADER=1"
|
||||||
|
|
54
.github/workflows/nightly_run.yml
vendored
54
.github/workflows/nightly_run.yml
vendored
|
@ -8,9 +8,11 @@ on:
|
||||||
types:
|
types:
|
||||||
- opened
|
- opened
|
||||||
- synchronize
|
- synchronize
|
||||||
#running nightly pipeline if you're changing it
|
# running nightly pipeline if you're changing it
|
||||||
|
# stress tests are run only in nightly at the moment, so running them in they are changed
|
||||||
paths:
|
paths:
|
||||||
- ".github/workflows/nightly_run.yml"
|
- ".github/workflows/nightly_run.yml"
|
||||||
|
- "core/iwasm/libraries/lib-wasi-threads/stress-test/**"
|
||||||
|
|
||||||
# midnight UTC
|
# midnight UTC
|
||||||
schedule:
|
schedule:
|
||||||
|
@ -125,9 +127,7 @@ jobs:
|
||||||
exclude:
|
exclude:
|
||||||
# uncompatiable feature and platform
|
# uncompatiable feature and platform
|
||||||
# uncompatiable mode and feature
|
# uncompatiable mode and feature
|
||||||
# MULTI_MODULE only on INTERP mode
|
# MULTI_MODULE only on INTERP mode and AOT mode
|
||||||
- make_options_run_mode: $AOT_BUILD_OPTIONS
|
|
||||||
make_options_feature: "-DWAMR_BUILD_MULTI_MODULE=1"
|
|
||||||
- make_options_run_mode: $FAST_JIT_BUILD_OPTIONS
|
- make_options_run_mode: $FAST_JIT_BUILD_OPTIONS
|
||||||
make_options_feature: "-DWAMR_BUILD_MULTI_MODULE=1"
|
make_options_feature: "-DWAMR_BUILD_MULTI_MODULE=1"
|
||||||
- make_options_run_mode: $LLVM_LAZY_JIT_BUILD_OPTIONS
|
- make_options_run_mode: $LLVM_LAZY_JIT_BUILD_OPTIONS
|
||||||
|
@ -250,7 +250,7 @@ jobs:
|
||||||
exclude:
|
exclude:
|
||||||
# uncompatiable feature and platform
|
# uncompatiable feature and platform
|
||||||
# uncompatiable mode and feature
|
# uncompatiable mode and feature
|
||||||
# MULTI_MODULE only on INTERP mode
|
# MULTI_MODULE only on INTERP mode and AOT mode
|
||||||
- make_options_run_mode: $FAST_JIT_BUILD_OPTIONS
|
- make_options_run_mode: $FAST_JIT_BUILD_OPTIONS
|
||||||
make_options_feature: "-DWAMR_BUILD_MULTI_MODULE=1"
|
make_options_feature: "-DWAMR_BUILD_MULTI_MODULE=1"
|
||||||
# SIMD only on JIT/AOT mode
|
# SIMD only on JIT/AOT mode
|
||||||
|
@ -380,7 +380,12 @@ jobs:
|
||||||
working-directory: samples/wasm-c-api
|
working-directory: samples/wasm-c-api
|
||||||
|
|
||||||
build_samples_others:
|
build_samples_others:
|
||||||
needs: [build_iwasm]
|
needs:
|
||||||
|
[
|
||||||
|
build_iwasm,
|
||||||
|
build_llvm_libraries_on_ubuntu_2004,
|
||||||
|
build_wamrc,
|
||||||
|
]
|
||||||
runs-on: ${{ matrix.os }}
|
runs-on: ${{ matrix.os }}
|
||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
|
@ -393,6 +398,9 @@ jobs:
|
||||||
[
|
[
|
||||||
"https://github.com/WebAssembly/wabt/releases/download/1.0.31/wabt-1.0.31-ubuntu.tar.gz",
|
"https://github.com/WebAssembly/wabt/releases/download/1.0.31/wabt-1.0.31-ubuntu.tar.gz",
|
||||||
]
|
]
|
||||||
|
include:
|
||||||
|
- os: ubuntu-20.04
|
||||||
|
llvm_cache_key: ${{ needs.build_llvm_libraries_on_ubuntu_2004.outputs.cache_key }}
|
||||||
steps:
|
steps:
|
||||||
- name: checkout
|
- name: checkout
|
||||||
uses: actions/checkout@v3
|
uses: actions/checkout@v3
|
||||||
|
@ -409,6 +417,26 @@ jobs:
|
||||||
sudo wget ${{ matrix.wabt_release }}
|
sudo wget ${{ matrix.wabt_release }}
|
||||||
sudo tar -xzf wabt-1.0.31-*.tar.gz
|
sudo tar -xzf wabt-1.0.31-*.tar.gz
|
||||||
sudo mv wabt-1.0.31 wabt
|
sudo mv wabt-1.0.31 wabt
|
||||||
|
|
||||||
|
- name: Get LLVM libraries
|
||||||
|
id: retrieve_llvm_libs
|
||||||
|
uses: actions/cache@v3
|
||||||
|
with:
|
||||||
|
path: |
|
||||||
|
./core/deps/llvm/build/bin
|
||||||
|
./core/deps/llvm/build/include
|
||||||
|
./core/deps/llvm/build/lib
|
||||||
|
./core/deps/llvm/build/libexec
|
||||||
|
./core/deps/llvm/build/share
|
||||||
|
key: ${{ matrix.llvm_cache_key }}
|
||||||
|
|
||||||
|
- name: Build wamrc
|
||||||
|
run: |
|
||||||
|
mkdir build && cd build
|
||||||
|
cmake -D WAMR_BUILD_SANITIZER="${{matrix.sanitizer}}" ..
|
||||||
|
cmake --build . --config Release --parallel 4
|
||||||
|
working-directory: wamr-compiler
|
||||||
|
|
||||||
- name: Build Sample [basic]
|
- name: Build Sample [basic]
|
||||||
run: |
|
run: |
|
||||||
cd samples/basic
|
cd samples/basic
|
||||||
|
@ -432,9 +460,10 @@ jobs:
|
||||||
run: |
|
run: |
|
||||||
cd samples/multi-module
|
cd samples/multi-module
|
||||||
mkdir build && cd build
|
mkdir build && cd build
|
||||||
cmake ..
|
cmake .. -DWAMR_BUILD_AOT=1
|
||||||
cmake --build . --config Release --parallel 4
|
cmake --build . --config Release --parallel 4
|
||||||
./multi_module
|
./multi_module mC.wasm
|
||||||
|
./multi_module mC.aot
|
||||||
- name: Build Sample [spawn-thread]
|
- name: Build Sample [spawn-thread]
|
||||||
run: |
|
run: |
|
||||||
cd samples/spawn-thread
|
cd samples/spawn-thread
|
||||||
|
@ -522,9 +551,7 @@ jobs:
|
||||||
test_option: $SIMD_TEST_OPTIONS
|
test_option: $SIMD_TEST_OPTIONS
|
||||||
- running_mode: "fast-interp"
|
- running_mode: "fast-interp"
|
||||||
test_option: $SIMD_TEST_OPTIONS
|
test_option: $SIMD_TEST_OPTIONS
|
||||||
# aot and jit don't support multi module
|
# llvm jit doesn't support multi module
|
||||||
- running_mode: "aot"
|
|
||||||
test_option: $MULTI_MODULES_TEST_OPTIONS
|
|
||||||
- running_mode: "jit"
|
- running_mode: "jit"
|
||||||
test_option: $MULTI_MODULES_TEST_OPTIONS
|
test_option: $MULTI_MODULES_TEST_OPTIONS
|
||||||
# fast-jit doesn't support multi module, simd
|
# fast-jit doesn't support multi module, simd
|
||||||
|
@ -599,6 +626,11 @@ jobs:
|
||||||
run: bash build.sh --sysroot "$SYSROOT_PATH"
|
run: bash build.sh --sysroot "$SYSROOT_PATH"
|
||||||
working-directory: ./core/iwasm/libraries/lib-wasi-threads/test/
|
working-directory: ./core/iwasm/libraries/lib-wasi-threads/test/
|
||||||
|
|
||||||
|
- name: Build WASI thread stress tests
|
||||||
|
if: matrix.test_option == '$WASI_TEST_OPTIONS'
|
||||||
|
run: bash build.sh --sysroot "$SYSROOT_PATH"
|
||||||
|
working-directory: ./core/iwasm/libraries/lib-wasi-threads/stress-test/
|
||||||
|
|
||||||
- name: build socket api tests
|
- name: build socket api tests
|
||||||
if: matrix.test_option == '$WASI_TEST_OPTIONS'
|
if: matrix.test_option == '$WASI_TEST_OPTIONS'
|
||||||
run: bash build.sh
|
run: bash build.sh
|
||||||
|
|
|
@ -273,6 +273,13 @@ else ()
|
||||||
add_definitions (-DWASM_DISABLE_STACK_HW_BOUND_CHECK=0)
|
add_definitions (-DWASM_DISABLE_STACK_HW_BOUND_CHECK=0)
|
||||||
endif ()
|
endif ()
|
||||||
endif ()
|
endif ()
|
||||||
|
if (WAMR_DISABLE_WAKEUP_BLOCKING_OP EQUAL 1)
|
||||||
|
add_definitions (-DWASM_DISABLE_WAKEUP_BLOCKING_OP=1)
|
||||||
|
message (" Wakeup of blocking operations disabled")
|
||||||
|
else ()
|
||||||
|
add_definitions (-DWASM_DISABLE_WAKEUP_BLOCKING_OP=0)
|
||||||
|
message (" Wakeup of blocking operations enabled")
|
||||||
|
endif ()
|
||||||
if (WAMR_BUILD_SIMD EQUAL 1)
|
if (WAMR_BUILD_SIMD EQUAL 1)
|
||||||
if (NOT WAMR_BUILD_TARGET MATCHES "RISCV64.*")
|
if (NOT WAMR_BUILD_TARGET MATCHES "RISCV64.*")
|
||||||
add_definitions (-DWASM_ENABLE_SIMD=1)
|
add_definitions (-DWASM_ENABLE_SIMD=1)
|
||||||
|
@ -378,6 +385,10 @@ if (WAMR_BUILD_WASM_CACHE EQUAL 1)
|
||||||
add_definitions (-DWASM_ENABLE_WASM_CACHE=1)
|
add_definitions (-DWASM_ENABLE_WASM_CACHE=1)
|
||||||
message (" Wasm files cache enabled")
|
message (" Wasm files cache enabled")
|
||||||
endif ()
|
endif ()
|
||||||
|
if (WAMR_BUILD_MODULE_INST_CONTEXT EQUAL 1)
|
||||||
|
add_definitions (-DWASM_ENABLE_MODULE_INST_CONTEXT=1)
|
||||||
|
message (" Module instance context enabled")
|
||||||
|
endif ()
|
||||||
if (WAMR_BUILD_GC_HEAP_VERIFY EQUAL 1)
|
if (WAMR_BUILD_GC_HEAP_VERIFY EQUAL 1)
|
||||||
add_definitions (-DWASM_ENABLE_GC_VERIFY=1)
|
add_definitions (-DWASM_ENABLE_GC_VERIFY=1)
|
||||||
message (" GC heap verification enabled")
|
message (" GC heap verification enabled")
|
||||||
|
|
|
@ -91,8 +91,10 @@ endif ()
|
||||||
|
|
||||||
if (WAMR_BUILD_LIBC_UVWASI EQUAL 1)
|
if (WAMR_BUILD_LIBC_UVWASI EQUAL 1)
|
||||||
include (${IWASM_DIR}/libraries/libc-uvwasi/libc_uvwasi.cmake)
|
include (${IWASM_DIR}/libraries/libc-uvwasi/libc_uvwasi.cmake)
|
||||||
|
set (WAMR_BUILD_MODULE_INST_CONTEXT 1)
|
||||||
elseif (WAMR_BUILD_LIBC_WASI EQUAL 1)
|
elseif (WAMR_BUILD_LIBC_WASI EQUAL 1)
|
||||||
include (${IWASM_DIR}/libraries/libc-wasi/libc_wasi.cmake)
|
include (${IWASM_DIR}/libraries/libc-wasi/libc_wasi.cmake)
|
||||||
|
set (WAMR_BUILD_MODULE_INST_CONTEXT 1)
|
||||||
endif ()
|
endif ()
|
||||||
|
|
||||||
if (WAMR_BUILD_LIB_PTHREAD_SEMAPHORE EQUAL 1)
|
if (WAMR_BUILD_LIB_PTHREAD_SEMAPHORE EQUAL 1)
|
||||||
|
|
|
@ -480,4 +480,9 @@
|
||||||
#define WASM_MEM_DUAL_BUS_MIRROR 0
|
#define WASM_MEM_DUAL_BUS_MIRROR 0
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* The max number of module instance contexts. */
|
||||||
|
#ifndef WASM_MAX_INSTANCE_CONTEXTS
|
||||||
|
#define WASM_MAX_INSTANCE_CONTEXTS 8
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif /* end of _CONFIG_H_ */
|
#endif /* end of _CONFIG_H_ */
|
||||||
|
|
|
@ -558,6 +558,56 @@ str2uint32(const char *buf, uint32 *p_res);
|
||||||
static bool
|
static bool
|
||||||
str2uint64(const char *buf, uint64 *p_res);
|
str2uint64(const char *buf, uint64 *p_res);
|
||||||
|
|
||||||
|
#if WASM_ENABLE_MULTI_MODULE != 0
|
||||||
|
static void *
|
||||||
|
aot_loader_resolve_function(const char *module_name, const char *function_name,
|
||||||
|
const AOTFuncType *expected_function_type,
|
||||||
|
char *error_buf, uint32 error_buf_size)
|
||||||
|
{
|
||||||
|
WASMModuleCommon *module_reg;
|
||||||
|
void *function = NULL;
|
||||||
|
AOTExport *export = NULL;
|
||||||
|
AOTModule *module = NULL;
|
||||||
|
AOTFuncType *target_function_type = NULL;
|
||||||
|
|
||||||
|
module_reg = wasm_runtime_find_module_registered(module_name);
|
||||||
|
if (!module_reg || module_reg->module_type != Wasm_Module_AoT) {
|
||||||
|
LOG_DEBUG("can not find a module named %s for function %s", module_name,
|
||||||
|
function_name);
|
||||||
|
set_error_buf(error_buf, error_buf_size, "unknown import");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
module = (AOTModule *)module_reg;
|
||||||
|
export = loader_find_export(module_reg, module_name, function_name,
|
||||||
|
EXPORT_KIND_FUNC, error_buf, error_buf_size);
|
||||||
|
if (!export) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* resolve function type and function */
|
||||||
|
if (export->index < module->import_func_count) {
|
||||||
|
target_function_type = module->import_funcs[export->index].func_type;
|
||||||
|
function = module->import_funcs[export->index].func_ptr_linked;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
target_function_type =
|
||||||
|
module->func_types[module->func_type_indexes
|
||||||
|
[export->index - module->import_func_count]];
|
||||||
|
function =
|
||||||
|
(module->func_ptrs[export->index - module->import_func_count]);
|
||||||
|
}
|
||||||
|
/* check function type */
|
||||||
|
if (!wasm_type_equal(expected_function_type, target_function_type)) {
|
||||||
|
LOG_DEBUG("%s.%s failed the type check", module_name, function_name);
|
||||||
|
set_error_buf(error_buf, error_buf_size, "incompatible import type");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
return function;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* end of WASM_ENABLE_MULTI_MODULE */
|
||||||
|
|
||||||
static bool
|
static bool
|
||||||
load_native_symbol_section(const uint8 *buf, const uint8 *buf_end,
|
load_native_symbol_section(const uint8 *buf, const uint8 *buf_end,
|
||||||
AOTModule *module, bool is_load_from_file_buf,
|
AOTModule *module, bool is_load_from_file_buf,
|
||||||
|
@ -1357,11 +1407,16 @@ load_import_funcs(const uint8 **p_buf, const uint8 *buf_end, AOTModule *module,
|
||||||
bool is_load_from_file_buf, char *error_buf,
|
bool is_load_from_file_buf, char *error_buf,
|
||||||
uint32 error_buf_size)
|
uint32 error_buf_size)
|
||||||
{
|
{
|
||||||
const char *module_name, *field_name;
|
char *module_name, *field_name;
|
||||||
const uint8 *buf = *p_buf;
|
const uint8 *buf = *p_buf;
|
||||||
AOTImportFunc *import_funcs;
|
AOTImportFunc *import_funcs;
|
||||||
uint64 size;
|
uint64 size;
|
||||||
uint32 i;
|
uint32 i;
|
||||||
|
#if WASM_ENABLE_MULTI_MODULE != 0
|
||||||
|
AOTModule *sub_module = NULL;
|
||||||
|
AOTFunc *linked_func = NULL;
|
||||||
|
WASMType *declare_func_type = NULL;
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Allocate memory */
|
/* Allocate memory */
|
||||||
size = sizeof(AOTImportFunc) * (uint64)module->import_func_count;
|
size = sizeof(AOTImportFunc) * (uint64)module->import_func_count;
|
||||||
|
@ -1377,17 +1432,46 @@ load_import_funcs(const uint8 **p_buf, const uint8 *buf_end, AOTModule *module,
|
||||||
set_error_buf(error_buf, error_buf_size, "unknown type");
|
set_error_buf(error_buf, error_buf_size, "unknown type");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if WASM_ENABLE_MULTI_MODULE != 0
|
||||||
|
declare_func_type = module->func_types[import_funcs[i].func_type_index];
|
||||||
|
read_string(buf, buf_end, module_name);
|
||||||
|
read_string(buf, buf_end, field_name);
|
||||||
|
|
||||||
|
import_funcs[i].module_name = module_name;
|
||||||
|
import_funcs[i].func_name = field_name;
|
||||||
|
linked_func = wasm_native_resolve_symbol(
|
||||||
|
module_name, field_name, declare_func_type,
|
||||||
|
&import_funcs[i].signature, &import_funcs[i].attachment,
|
||||||
|
&import_funcs[i].call_conv_raw);
|
||||||
|
if (!linked_func) {
|
||||||
|
if (!wasm_runtime_is_built_in_module(module_name)) {
|
||||||
|
sub_module = (AOTModule *)wasm_runtime_load_depended_module(
|
||||||
|
(WASMModuleCommon *)module, module_name, error_buf,
|
||||||
|
error_buf_size);
|
||||||
|
if (!sub_module) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
linked_func = aot_loader_resolve_function(
|
||||||
|
module_name, field_name, declare_func_type, error_buf,
|
||||||
|
error_buf_size);
|
||||||
|
}
|
||||||
|
import_funcs[i].func_ptr_linked = linked_func;
|
||||||
|
import_funcs[i].func_type = declare_func_type;
|
||||||
|
|
||||||
|
#else
|
||||||
import_funcs[i].func_type =
|
import_funcs[i].func_type =
|
||||||
module->func_types[import_funcs[i].func_type_index];
|
module->func_types[import_funcs[i].func_type_index];
|
||||||
read_string(buf, buf_end, import_funcs[i].module_name);
|
read_string(buf, buf_end, import_funcs[i].module_name);
|
||||||
read_string(buf, buf_end, import_funcs[i].func_name);
|
read_string(buf, buf_end, import_funcs[i].func_name);
|
||||||
|
|
||||||
module_name = import_funcs[i].module_name;
|
module_name = import_funcs[i].module_name;
|
||||||
field_name = import_funcs[i].func_name;
|
field_name = import_funcs[i].func_name;
|
||||||
import_funcs[i].func_ptr_linked = wasm_native_resolve_symbol(
|
import_funcs[i].func_ptr_linked = wasm_native_resolve_symbol(
|
||||||
module_name, field_name, import_funcs[i].func_type,
|
module_name, field_name, import_funcs[i].func_type,
|
||||||
&import_funcs[i].signature, &import_funcs[i].attachment,
|
&import_funcs[i].signature, &import_funcs[i].attachment,
|
||||||
&import_funcs[i].call_conv_raw);
|
&import_funcs[i].call_conv_raw);
|
||||||
|
#endif
|
||||||
|
|
||||||
#if WASM_ENABLE_LIBC_WASI != 0
|
#if WASM_ENABLE_LIBC_WASI != 0
|
||||||
if (!strcmp(import_funcs[i].module_name, "wasi_unstable")
|
if (!strcmp(import_funcs[i].module_name, "wasi_unstable")
|
||||||
|
@ -2871,6 +2955,7 @@ create_module(char *error_buf, uint32 error_buf_size)
|
||||||
{
|
{
|
||||||
AOTModule *module =
|
AOTModule *module =
|
||||||
loader_malloc(sizeof(AOTModule), error_buf, error_buf_size);
|
loader_malloc(sizeof(AOTModule), error_buf, error_buf_size);
|
||||||
|
bh_list_status ret;
|
||||||
|
|
||||||
if (!module) {
|
if (!module) {
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -2878,6 +2963,13 @@ create_module(char *error_buf, uint32 error_buf_size)
|
||||||
|
|
||||||
module->module_type = Wasm_Module_AoT;
|
module->module_type = Wasm_Module_AoT;
|
||||||
|
|
||||||
|
#if WASM_ENABLE_MULTI_MODULE != 0
|
||||||
|
module->import_module_list = &module->import_module_list_head;
|
||||||
|
ret = bh_list_init(module->import_module_list);
|
||||||
|
bh_assert(ret == BH_LIST_SUCCESS);
|
||||||
|
#endif
|
||||||
|
(void)ret;
|
||||||
|
|
||||||
return module;
|
return module;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3143,10 +3235,13 @@ aot_load_from_aot_file(const uint8 *buf, uint32 size, char *error_buf,
|
||||||
if (!module)
|
if (!module)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
|
os_thread_jit_write_protect_np(false); /* Make memory writable */
|
||||||
if (!load(buf, size, module, error_buf, error_buf_size)) {
|
if (!load(buf, size, module, error_buf, error_buf_size)) {
|
||||||
aot_unload(module);
|
aot_unload(module);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
os_thread_jit_write_protect_np(true); /* Make memory executable */
|
||||||
|
os_icache_flush(module->code, module->code_size);
|
||||||
|
|
||||||
LOG_VERBOSE("Load module success.\n");
|
LOG_VERBOSE("Load module success.\n");
|
||||||
return module;
|
return module;
|
||||||
|
@ -3201,6 +3296,19 @@ aot_unload(AOTModule *module)
|
||||||
|
|
||||||
if (module->const_str_set)
|
if (module->const_str_set)
|
||||||
bh_hash_map_destroy(module->const_str_set);
|
bh_hash_map_destroy(module->const_str_set);
|
||||||
|
#if WASM_ENABLE_MULTI_MODULE != 0
|
||||||
|
/* just release the sub module list */
|
||||||
|
if (module->import_module_list) {
|
||||||
|
WASMRegisteredModule *node =
|
||||||
|
bh_list_first_elem(module->import_module_list);
|
||||||
|
while (node) {
|
||||||
|
WASMRegisteredModule *next = bh_list_elem_next(node);
|
||||||
|
bh_list_remove(module->import_module_list, node);
|
||||||
|
wasm_runtime_free(node);
|
||||||
|
node = next;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
if (module->code && !module->is_indirect_mode) {
|
if (module->code && !module->is_indirect_mode) {
|
||||||
/* The layout is: literal size + literal + code (with plt table) */
|
/* The layout is: literal size + literal + code (with plt table) */
|
||||||
|
|
|
@ -1091,6 +1091,9 @@ aot_instantiate(AOTModule *module, AOTModuleInstance *parent,
|
||||||
uint8 *p;
|
uint8 *p;
|
||||||
uint32 i, extra_info_offset;
|
uint32 i, extra_info_offset;
|
||||||
const bool is_sub_inst = parent != NULL;
|
const bool is_sub_inst = parent != NULL;
|
||||||
|
#if WASM_ENABLE_MULTI_MODULE != 0
|
||||||
|
bool ret = false;
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Check heap size */
|
/* Check heap size */
|
||||||
heap_size = align_uint(heap_size, 8);
|
heap_size = align_uint(heap_size, 8);
|
||||||
|
@ -1134,6 +1137,18 @@ aot_instantiate(AOTModule *module, AOTModuleInstance *parent,
|
||||||
module_inst->e =
|
module_inst->e =
|
||||||
(WASMModuleInstanceExtra *)((uint8 *)module_inst + extra_info_offset);
|
(WASMModuleInstanceExtra *)((uint8 *)module_inst + extra_info_offset);
|
||||||
|
|
||||||
|
#if WASM_ENABLE_MULTI_MODULE != 0
|
||||||
|
((AOTModuleInstanceExtra *)module_inst->e)->sub_module_inst_list =
|
||||||
|
&((AOTModuleInstanceExtra *)module_inst->e)->sub_module_inst_list_head;
|
||||||
|
ret = wasm_runtime_sub_module_instantiate(
|
||||||
|
(WASMModuleCommon *)module, (WASMModuleInstanceCommon *)module_inst,
|
||||||
|
stack_size, heap_size, error_buf, error_buf_size);
|
||||||
|
if (!ret) {
|
||||||
|
LOG_DEBUG("build a sub module list failed");
|
||||||
|
goto fail;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Initialize global info */
|
/* Initialize global info */
|
||||||
p = (uint8 *)module_inst + module_inst_struct_size
|
p = (uint8 *)module_inst + module_inst_struct_size
|
||||||
+ module_inst_mem_inst_size;
|
+ module_inst_mem_inst_size;
|
||||||
|
@ -1256,6 +1271,11 @@ aot_deinstantiate(AOTModuleInstance *module_inst, bool is_sub_inst)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if WASM_ENABLE_MULTI_MODULE != 0
|
||||||
|
wasm_runtime_sub_module_deinstantiate(
|
||||||
|
(WASMModuleInstanceCommon *)module_inst);
|
||||||
|
#endif
|
||||||
|
|
||||||
if (module_inst->tables)
|
if (module_inst->tables)
|
||||||
wasm_runtime_free(module_inst->tables);
|
wasm_runtime_free(module_inst->tables);
|
||||||
|
|
||||||
|
@ -1276,12 +1296,10 @@ aot_deinstantiate(AOTModuleInstance *module_inst, bool is_sub_inst)
|
||||||
->common.c_api_func_imports);
|
->common.c_api_func_imports);
|
||||||
|
|
||||||
if (!is_sub_inst) {
|
if (!is_sub_inst) {
|
||||||
#if WASM_ENABLE_LIBC_WASI != 0
|
|
||||||
wasm_runtime_destroy_wasi((WASMModuleInstanceCommon *)module_inst);
|
|
||||||
#endif
|
|
||||||
#if WASM_ENABLE_WASI_NN != 0
|
#if WASM_ENABLE_WASI_NN != 0
|
||||||
wasi_nn_destroy(module_inst);
|
wasi_nn_destroy(module_inst);
|
||||||
#endif
|
#endif
|
||||||
|
wasm_native_call_context_dtors((WASMModuleInstanceCommon *)module_inst);
|
||||||
}
|
}
|
||||||
|
|
||||||
wasm_runtime_free(module_inst);
|
wasm_runtime_free(module_inst);
|
||||||
|
@ -1413,10 +1431,43 @@ aot_call_function(WASMExecEnv *exec_env, AOTFunctionInstance *function,
|
||||||
unsigned argc, uint32 argv[])
|
unsigned argc, uint32 argv[])
|
||||||
{
|
{
|
||||||
AOTModuleInstance *module_inst = (AOTModuleInstance *)exec_env->module_inst;
|
AOTModuleInstance *module_inst = (AOTModuleInstance *)exec_env->module_inst;
|
||||||
AOTFuncType *func_type = function->u.func.func_type;
|
AOTFuncType *func_type = function->is_import_func
|
||||||
|
? function->u.func_import->func_type
|
||||||
|
: function->u.func.func_type;
|
||||||
uint32 result_count = func_type->result_count;
|
uint32 result_count = func_type->result_count;
|
||||||
uint32 ext_ret_count = result_count > 1 ? result_count - 1 : 0;
|
uint32 ext_ret_count = result_count > 1 ? result_count - 1 : 0;
|
||||||
bool ret;
|
bool ret;
|
||||||
|
void *func_ptr = function->is_import_func
|
||||||
|
? function->u.func_import->func_ptr_linked
|
||||||
|
: function->u.func.func_ptr;
|
||||||
|
#if WASM_ENABLE_MULTI_MODULE != 0
|
||||||
|
bh_list *sub_module_list_node = NULL;
|
||||||
|
const char *sub_inst_name = NULL;
|
||||||
|
const char *func_name = function->u.func_import->module_name;
|
||||||
|
if (function->is_import_func) {
|
||||||
|
sub_module_list_node =
|
||||||
|
((AOTModuleInstanceExtra *)module_inst->e)->sub_module_inst_list;
|
||||||
|
sub_module_list_node = bh_list_first_elem(sub_module_list_node);
|
||||||
|
while (sub_module_list_node) {
|
||||||
|
sub_inst_name =
|
||||||
|
((AOTSubModInstNode *)sub_module_list_node)->module_name;
|
||||||
|
if (strcmp(sub_inst_name, func_name) == 0) {
|
||||||
|
exec_env = wasm_runtime_get_exec_env_singleton(
|
||||||
|
(WASMModuleInstanceCommon *)((AOTSubModInstNode *)
|
||||||
|
sub_module_list_node)
|
||||||
|
->module_inst);
|
||||||
|
module_inst = (AOTModuleInstance *)exec_env->module_inst;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
sub_module_list_node = bh_list_elem_next(sub_module_list_node);
|
||||||
|
}
|
||||||
|
if (exec_env == NULL) {
|
||||||
|
wasm_runtime_set_exception((WASMModuleInstanceCommon *)module_inst,
|
||||||
|
"create singleton exec_env failed");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
if (argc < func_type->param_cell_num) {
|
if (argc < func_type->param_cell_num) {
|
||||||
char buf[108];
|
char buf[108];
|
||||||
|
@ -1438,11 +1489,13 @@ aot_call_function(WASMExecEnv *exec_env, AOTFunctionInstance *function,
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* func pointer was looked up previously */
|
/* func pointer was looked up previously */
|
||||||
bh_assert(function->u.func.func_ptr != NULL);
|
bh_assert(func_ptr != NULL);
|
||||||
|
|
||||||
/* set thread handle and stack boundary */
|
/* set thread handle and stack boundary */
|
||||||
wasm_exec_env_set_thread_info(exec_env);
|
wasm_exec_env_set_thread_info(exec_env);
|
||||||
|
|
||||||
|
/* set exec env so it can be later retrieved from instance */
|
||||||
|
((AOTModuleInstanceExtra *)module_inst->e)->common.cur_exec_env = exec_env;
|
||||||
|
|
||||||
if (ext_ret_count > 0) {
|
if (ext_ret_count > 0) {
|
||||||
uint32 cell_num = 0, i;
|
uint32 cell_num = 0, i;
|
||||||
uint8 *ext_ret_types = func_type->types + func_type->param_count + 1;
|
uint8 *ext_ret_types = func_type->types + func_type->param_count + 1;
|
||||||
|
@ -1545,8 +1598,8 @@ aot_call_function(WASMExecEnv *exec_env, AOTFunctionInstance *function,
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
ret = invoke_native_internal(exec_env, function->u.func.func_ptr,
|
ret = invoke_native_internal(exec_env, func_ptr, func_type, NULL, NULL,
|
||||||
func_type, NULL, NULL, argv, argc, argv);
|
argv, argc, argv);
|
||||||
|
|
||||||
#if WASM_ENABLE_DUMP_CALL_STACK != 0
|
#if WASM_ENABLE_DUMP_CALL_STACK != 0
|
||||||
if (aot_copy_exception(module_inst, NULL)) {
|
if (aot_copy_exception(module_inst, NULL)) {
|
||||||
|
@ -1938,7 +1991,10 @@ aot_invoke_native(WASMExecEnv *exec_env, uint32 func_idx, uint32 argc,
|
||||||
void *attachment;
|
void *attachment;
|
||||||
char buf[96];
|
char buf[96];
|
||||||
bool ret = false;
|
bool ret = false;
|
||||||
|
#if WASM_ENABLE_MULTI_MODULE != 0
|
||||||
|
bh_list *sub_module_list_node = NULL;
|
||||||
|
const char *sub_inst_name = NULL;
|
||||||
|
#endif
|
||||||
bh_assert(func_idx < aot_module->import_func_count);
|
bh_assert(func_idx < aot_module->import_func_count);
|
||||||
|
|
||||||
import_func = aot_module->import_funcs + func_idx;
|
import_func = aot_module->import_funcs + func_idx;
|
||||||
|
@ -1962,6 +2018,28 @@ aot_invoke_native(WASMExecEnv *exec_env, uint32 func_idx, uint32 argc,
|
||||||
}
|
}
|
||||||
else if (!import_func->call_conv_raw) {
|
else if (!import_func->call_conv_raw) {
|
||||||
signature = import_func->signature;
|
signature = import_func->signature;
|
||||||
|
#if WASM_ENABLE_MULTI_MODULE != 0
|
||||||
|
sub_module_list_node =
|
||||||
|
((AOTModuleInstanceExtra *)module_inst->e)->sub_module_inst_list;
|
||||||
|
sub_module_list_node = bh_list_first_elem(sub_module_list_node);
|
||||||
|
while (sub_module_list_node) {
|
||||||
|
sub_inst_name =
|
||||||
|
((AOTSubModInstNode *)sub_module_list_node)->module_name;
|
||||||
|
if (strcmp(sub_inst_name, import_func->module_name) == 0) {
|
||||||
|
exec_env = wasm_runtime_get_exec_env_singleton(
|
||||||
|
(WASMModuleInstanceCommon *)((AOTSubModInstNode *)
|
||||||
|
sub_module_list_node)
|
||||||
|
->module_inst);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
sub_module_list_node = bh_list_elem_next(sub_module_list_node);
|
||||||
|
}
|
||||||
|
if (exec_env == NULL) {
|
||||||
|
wasm_runtime_set_exception((WASMModuleInstanceCommon *)module_inst,
|
||||||
|
"create singleton exec_env failed");
|
||||||
|
goto fail;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
ret =
|
ret =
|
||||||
wasm_runtime_invoke_native(exec_env, func_ptr, func_type, signature,
|
wasm_runtime_invoke_native(exec_env, func_ptr, func_type, signature,
|
||||||
attachment, argv, argc, argv);
|
attachment, argv, argc, argv);
|
||||||
|
@ -2729,6 +2807,7 @@ aot_create_call_stack(struct WASMExecEnv *exec_env)
|
||||||
total_len += \
|
total_len += \
|
||||||
wasm_runtime_dump_line_buf_impl(line_buf, print, &buf, &len); \
|
wasm_runtime_dump_line_buf_impl(line_buf, print, &buf, &len); \
|
||||||
if ((!print) && buf && (len == 0)) { \
|
if ((!print) && buf && (len == 0)) { \
|
||||||
|
exception_unlock(module_inst); \
|
||||||
return total_len; \
|
return total_len; \
|
||||||
} \
|
} \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
@ -2751,6 +2830,7 @@ aot_dump_call_stack(WASMExecEnv *exec_env, bool print, char *buf, uint32 len)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
exception_lock(module_inst);
|
||||||
snprintf(line_buf, sizeof(line_buf), "\n");
|
snprintf(line_buf, sizeof(line_buf), "\n");
|
||||||
PRINT_OR_DUMP();
|
PRINT_OR_DUMP();
|
||||||
|
|
||||||
|
@ -2759,6 +2839,7 @@ aot_dump_call_stack(WASMExecEnv *exec_env, bool print, char *buf, uint32 len)
|
||||||
uint32 line_length, i;
|
uint32 line_length, i;
|
||||||
|
|
||||||
if (!bh_vector_get(module_inst->frames, n, &frame)) {
|
if (!bh_vector_get(module_inst->frames, n, &frame)) {
|
||||||
|
exception_unlock(module_inst);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2789,6 +2870,7 @@ aot_dump_call_stack(WASMExecEnv *exec_env, bool print, char *buf, uint32 len)
|
||||||
}
|
}
|
||||||
snprintf(line_buf, sizeof(line_buf), "\n");
|
snprintf(line_buf, sizeof(line_buf), "\n");
|
||||||
PRINT_OR_DUMP();
|
PRINT_OR_DUMP();
|
||||||
|
exception_unlock(module_inst);
|
||||||
|
|
||||||
return total_len + 1;
|
return total_len + 1;
|
||||||
}
|
}
|
||||||
|
|
|
@ -90,6 +90,10 @@ typedef struct AOTFunctionInstance {
|
||||||
typedef struct AOTModuleInstanceExtra {
|
typedef struct AOTModuleInstanceExtra {
|
||||||
DefPointer(const uint32 *, stack_sizes);
|
DefPointer(const uint32 *, stack_sizes);
|
||||||
WASMModuleInstanceExtraCommon common;
|
WASMModuleInstanceExtraCommon common;
|
||||||
|
#if WASM_ENABLE_MULTI_MODULE != 0
|
||||||
|
bh_list sub_module_inst_list_head;
|
||||||
|
bh_list *sub_module_inst_list;
|
||||||
|
#endif
|
||||||
} AOTModuleInstanceExtra;
|
} AOTModuleInstanceExtra;
|
||||||
|
|
||||||
#if defined(BUILD_TARGET_X86_64) || defined(BUILD_TARGET_AMD_64)
|
#if defined(BUILD_TARGET_X86_64) || defined(BUILD_TARGET_AMD_64)
|
||||||
|
@ -229,6 +233,12 @@ typedef struct AOTModule {
|
||||||
WASIArguments wasi_args;
|
WASIArguments wasi_args;
|
||||||
bool import_wasi_api;
|
bool import_wasi_api;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if WASM_ENABLE_MULTI_MODULE != 0
|
||||||
|
/* TODO: add mutex for mutli-thread? */
|
||||||
|
bh_list import_module_list_head;
|
||||||
|
bh_list *import_module_list;
|
||||||
|
#endif
|
||||||
#if WASM_ENABLE_DEBUG_AOT != 0
|
#if WASM_ENABLE_DEBUG_AOT != 0
|
||||||
void *elf_hdr;
|
void *elf_hdr;
|
||||||
uint32 elf_size;
|
uint32 elf_size;
|
||||||
|
@ -247,6 +257,10 @@ typedef struct AOTModule {
|
||||||
#define AOTTableInstance WASMTableInstance
|
#define AOTTableInstance WASMTableInstance
|
||||||
#define AOTModuleInstance WASMModuleInstance
|
#define AOTModuleInstance WASMModuleInstance
|
||||||
|
|
||||||
|
#if WASM_ENABLE_MULTI_MODULE != 0
|
||||||
|
#define AOTSubModInstNode WASMSubModInstNode
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Target info, read from ELF header of object file */
|
/* Target info, read from ELF header of object file */
|
||||||
typedef struct AOTTargetInfo {
|
typedef struct AOTTargetInfo {
|
||||||
/* Binary type, elf32l/elf32b/elf64l/elf64b */
|
/* Binary type, elf32l/elf32b/elf64l/elf64b */
|
||||||
|
|
|
@ -53,7 +53,12 @@ get_target_symbol_map(uint32 *sym_num)
|
||||||
return target_sym_map;
|
return target_sym_map;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if (defined(__APPLE__) || defined(__MACH__)) && defined(__arm64__)
|
||||||
|
#define BUILD_TARGET_AARCH64_DEFAULT "arm64"
|
||||||
|
#else
|
||||||
#define BUILD_TARGET_AARCH64_DEFAULT "aarch64v8"
|
#define BUILD_TARGET_AARCH64_DEFAULT "aarch64v8"
|
||||||
|
#endif
|
||||||
|
|
||||||
void
|
void
|
||||||
get_current_target(char *target_buf, uint32 target_buf_size)
|
get_current_target(char *target_buf, uint32 target_buf_size)
|
||||||
{
|
{
|
||||||
|
|
|
@ -40,6 +40,7 @@ void __aeabi_ldivmod();
|
||||||
void __aeabi_memcpy();
|
void __aeabi_memcpy();
|
||||||
void __aeabi_memmove();
|
void __aeabi_memmove();
|
||||||
void __aeabi_memset();
|
void __aeabi_memset();
|
||||||
|
void __aeabi_memclr();
|
||||||
void __aeabi_uidiv();
|
void __aeabi_uidiv();
|
||||||
void __aeabi_uidivmod();
|
void __aeabi_uidivmod();
|
||||||
void __aeabi_ul2d();
|
void __aeabi_ul2d();
|
||||||
|
@ -126,6 +127,7 @@ static SymbolMap target_sym_map[] = {
|
||||||
REG_SYM(__aeabi_memcpy),
|
REG_SYM(__aeabi_memcpy),
|
||||||
REG_SYM(__aeabi_memmove),
|
REG_SYM(__aeabi_memmove),
|
||||||
REG_SYM(__aeabi_memset),
|
REG_SYM(__aeabi_memset),
|
||||||
|
REG_SYM(__aeabi_memclr),
|
||||||
REG_SYM(__aeabi_uidiv),
|
REG_SYM(__aeabi_uidiv),
|
||||||
REG_SYM(__aeabi_uidivmod),
|
REG_SYM(__aeabi_uidivmod),
|
||||||
REG_SYM(__aeabi_ul2d),
|
REG_SYM(__aeabi_ul2d),
|
||||||
|
|
|
@ -107,7 +107,34 @@ execute_main(WASMModuleInstanceCommon *module_inst, int32 argc, char *argv[])
|
||||||
the actual main function. Directly calling main function
|
the actual main function. Directly calling main function
|
||||||
may cause exception thrown. */
|
may cause exception thrown. */
|
||||||
if ((func = wasm_runtime_lookup_wasi_start_function(module_inst))) {
|
if ((func = wasm_runtime_lookup_wasi_start_function(module_inst))) {
|
||||||
return wasm_runtime_call_wasm(exec_env, func, 0, NULL);
|
const char *wasi_proc_exit_exception = "wasi proc exit";
|
||||||
|
|
||||||
|
ret = wasm_runtime_call_wasm(exec_env, func, 0, NULL);
|
||||||
|
#if WASM_ENABLE_THREAD_MGR != 0
|
||||||
|
if (ret) {
|
||||||
|
/* On a successful return from the `_start` function,
|
||||||
|
we terminate other threads by mimicing wasi:proc_exit(0).
|
||||||
|
|
||||||
|
Note:
|
||||||
|
- A return from the `main` function is an equivalent of
|
||||||
|
exit(). (C standard)
|
||||||
|
- When exit code is 0, wasi-libc's `_start` function just
|
||||||
|
returns w/o calling `proc_exit`.
|
||||||
|
- A process termination should terminate threads in
|
||||||
|
the process. */
|
||||||
|
|
||||||
|
wasm_runtime_set_exception(module_inst, wasi_proc_exit_exception);
|
||||||
|
/* exit_code is zero-initialized */
|
||||||
|
ret = false;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
/* report wasm proc exit as a success */
|
||||||
|
WASMModuleInstance *inst = (WASMModuleInstance *)module_inst;
|
||||||
|
if (!ret && strstr(inst->cur_exception, wasi_proc_exit_exception)) {
|
||||||
|
inst->cur_exception[0] = 0;
|
||||||
|
ret = true;
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
#endif /* end of WASM_ENABLE_LIBC_WASI */
|
#endif /* end of WASM_ENABLE_LIBC_WASI */
|
||||||
|
|
||||||
|
@ -204,7 +231,7 @@ wasm_application_execute_main(WASMModuleInstanceCommon *module_inst, int32 argc,
|
||||||
char *argv[])
|
char *argv[])
|
||||||
{
|
{
|
||||||
bool ret;
|
bool ret;
|
||||||
#if (WASM_ENABLE_MEMORY_PROFILING != 0) || (WASM_ENABLE_DUMP_CALL_STACK != 0)
|
#if (WASM_ENABLE_MEMORY_PROFILING != 0)
|
||||||
WASMExecEnv *exec_env;
|
WASMExecEnv *exec_env;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -224,14 +251,6 @@ wasm_application_execute_main(WASMModuleInstanceCommon *module_inst, int32 argc,
|
||||||
if (ret)
|
if (ret)
|
||||||
ret = wasm_runtime_get_exception(module_inst) == NULL;
|
ret = wasm_runtime_get_exception(module_inst) == NULL;
|
||||||
|
|
||||||
#if WASM_ENABLE_DUMP_CALL_STACK != 0
|
|
||||||
if (!ret) {
|
|
||||||
exec_env = wasm_runtime_get_exec_env_singleton(module_inst);
|
|
||||||
if (exec_env)
|
|
||||||
wasm_runtime_dump_call_stack(exec_env);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
92
core/iwasm/common/wasm_blocking_op.c
Normal file
92
core/iwasm/common/wasm_blocking_op.c
Normal file
|
@ -0,0 +1,92 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2023 Midokura Japan KK. All rights reserved.
|
||||||
|
* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "wasm_runtime_common.h"
|
||||||
|
|
||||||
|
#include "bh_platform.h"
|
||||||
|
#include "bh_common.h"
|
||||||
|
#include "bh_assert.h"
|
||||||
|
|
||||||
|
#if WASM_ENABLE_THREAD_MGR != 0 && defined(OS_ENABLE_WAKEUP_BLOCKING_OP)
|
||||||
|
|
||||||
|
#define LOCK(env) WASM_SUSPEND_FLAGS_LOCK((env)->wait_lock)
|
||||||
|
#define UNLOCK(env) WASM_SUSPEND_FLAGS_UNLOCK((env)->wait_lock)
|
||||||
|
|
||||||
|
#define ISSET(env, bit) \
|
||||||
|
((WASM_SUSPEND_FLAGS_GET((env)->suspend_flags) & WASM_SUSPEND_FLAG_##bit) \
|
||||||
|
!= 0)
|
||||||
|
#define SET(env, bit) \
|
||||||
|
WASM_SUSPEND_FLAGS_FETCH_OR((env)->suspend_flags, WASM_SUSPEND_FLAG_##bit)
|
||||||
|
#define CLR(env, bit) \
|
||||||
|
WASM_SUSPEND_FLAGS_FETCH_AND((env)->suspend_flags, ~WASM_SUSPEND_FLAG_##bit)
|
||||||
|
|
||||||
|
bool
|
||||||
|
wasm_runtime_begin_blocking_op(wasm_exec_env_t env)
|
||||||
|
{
|
||||||
|
LOCK(env);
|
||||||
|
bh_assert(!ISSET(env, BLOCKING));
|
||||||
|
SET(env, BLOCKING);
|
||||||
|
if (ISSET(env, TERMINATE)) {
|
||||||
|
CLR(env, BLOCKING);
|
||||||
|
UNLOCK(env);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
UNLOCK(env);
|
||||||
|
os_begin_blocking_op();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
wasm_runtime_end_blocking_op(wasm_exec_env_t env)
|
||||||
|
{
|
||||||
|
int saved_errno = errno;
|
||||||
|
LOCK(env);
|
||||||
|
bh_assert(ISSET(env, BLOCKING));
|
||||||
|
CLR(env, BLOCKING);
|
||||||
|
UNLOCK(env);
|
||||||
|
os_end_blocking_op();
|
||||||
|
errno = saved_errno;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
wasm_runtime_interrupt_blocking_op(wasm_exec_env_t env)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* ISSET(BLOCKING) here means that the target thread
|
||||||
|
* is in somewhere between wasm_begin_blocking_op and
|
||||||
|
* wasm_end_blocking_op.
|
||||||
|
* keep waking it up until it reaches wasm_end_blocking_op,
|
||||||
|
* which clears the BLOCKING bit.
|
||||||
|
*
|
||||||
|
* this dumb loop is necessary because posix doesn't provide
|
||||||
|
* a way to unmask signal and block atomically.
|
||||||
|
*/
|
||||||
|
|
||||||
|
LOCK(env);
|
||||||
|
SET(env, TERMINATE);
|
||||||
|
while (ISSET(env, BLOCKING)) {
|
||||||
|
UNLOCK(env);
|
||||||
|
os_wakeup_blocking_op(env->handle);
|
||||||
|
|
||||||
|
/* relax a bit */
|
||||||
|
os_usleep(50 * 1000);
|
||||||
|
LOCK(env);
|
||||||
|
}
|
||||||
|
UNLOCK(env);
|
||||||
|
}
|
||||||
|
|
||||||
|
#else /* WASM_ENABLE_THREAD_MGR && OS_ENABLE_WAKEUP_BLOCKING_OP */
|
||||||
|
|
||||||
|
bool
|
||||||
|
wasm_runtime_begin_blocking_op(wasm_exec_env_t env)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
wasm_runtime_end_blocking_op(wasm_exec_env_t env)
|
||||||
|
{}
|
||||||
|
|
||||||
|
#endif /* WASM_ENABLE_THREAD_MGR && OS_ENABLE_WAKEUP_BLOCKING_OP */
|
|
@ -8,6 +8,7 @@
|
||||||
#include "../aot/aot_runtime.h"
|
#include "../aot/aot_runtime.h"
|
||||||
#include "bh_platform.h"
|
#include "bh_platform.h"
|
||||||
#include "mem_alloc.h"
|
#include "mem_alloc.h"
|
||||||
|
#include "wasm_memory.h"
|
||||||
|
|
||||||
#if WASM_ENABLE_SHARED_MEMORY != 0
|
#if WASM_ENABLE_SHARED_MEMORY != 0
|
||||||
#include "../common/wasm_shared_memory.h"
|
#include "../common/wasm_shared_memory.h"
|
||||||
|
@ -24,6 +25,9 @@ static Memory_Mode memory_mode = MEMORY_MODE_UNKNOWN;
|
||||||
|
|
||||||
static mem_allocator_t pool_allocator = NULL;
|
static mem_allocator_t pool_allocator = NULL;
|
||||||
|
|
||||||
|
static enlarge_memory_error_callback_t enlarge_memory_error_cb;
|
||||||
|
static void *enlarge_memory_error_user_data;
|
||||||
|
|
||||||
#if WASM_MEM_ALLOC_WITH_USER_DATA != 0
|
#if WASM_MEM_ALLOC_WITH_USER_DATA != 0
|
||||||
static void *allocator_user_data = NULL;
|
static void *allocator_user_data = NULL;
|
||||||
static void *(*malloc_func)(void *user_data, unsigned int size) = NULL;
|
static void *(*malloc_func)(void *user_data, unsigned int size) = NULL;
|
||||||
|
@ -570,13 +574,16 @@ wasm_enlarge_memory_internal(WASMModuleInstance *module, uint32 inc_page_count)
|
||||||
{
|
{
|
||||||
WASMMemoryInstance *memory = wasm_get_default_memory(module);
|
WASMMemoryInstance *memory = wasm_get_default_memory(module);
|
||||||
uint8 *memory_data_old, *memory_data_new, *heap_data_old;
|
uint8 *memory_data_old, *memory_data_new, *heap_data_old;
|
||||||
uint32 num_bytes_per_page, heap_size, total_size_old;
|
uint32 num_bytes_per_page, heap_size, total_size_old = 0;
|
||||||
uint32 cur_page_count, max_page_count, total_page_count;
|
uint32 cur_page_count, max_page_count, total_page_count;
|
||||||
uint64 total_size_new;
|
uint64 total_size_new;
|
||||||
bool ret = true;
|
bool ret = true;
|
||||||
|
enlarge_memory_error_reason_t failure_reason = INTERNAL_ERROR;
|
||||||
|
|
||||||
if (!memory)
|
if (!memory) {
|
||||||
return false;
|
ret = false;
|
||||||
|
goto return_func;
|
||||||
|
}
|
||||||
|
|
||||||
heap_data_old = memory->heap_data;
|
heap_data_old = memory->heap_data;
|
||||||
heap_size = (uint32)(memory->heap_data_end - memory->heap_data);
|
heap_size = (uint32)(memory->heap_data_end - memory->heap_data);
|
||||||
|
@ -594,9 +601,15 @@ wasm_enlarge_memory_internal(WASMModuleInstance *module, uint32 inc_page_count)
|
||||||
/* No need to enlarge memory */
|
/* No need to enlarge memory */
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
if (total_page_count < cur_page_count /* integer overflow */
|
if (total_page_count < cur_page_count) { /* integer overflow */
|
||||||
|| total_page_count > max_page_count) {
|
ret = false;
|
||||||
return false;
|
goto return_func;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (total_page_count > max_page_count) {
|
||||||
|
failure_reason = MAX_SIZE_REACHED;
|
||||||
|
ret = false;
|
||||||
|
goto return_func;
|
||||||
}
|
}
|
||||||
|
|
||||||
bh_assert(total_size_new <= 4 * (uint64)BH_GB);
|
bh_assert(total_size_new <= 4 * (uint64)BH_GB);
|
||||||
|
@ -622,14 +635,16 @@ wasm_enlarge_memory_internal(WASMModuleInstance *module, uint32 inc_page_count)
|
||||||
if (heap_size > 0) {
|
if (heap_size > 0) {
|
||||||
if (mem_allocator_is_heap_corrupted(memory->heap_handle)) {
|
if (mem_allocator_is_heap_corrupted(memory->heap_handle)) {
|
||||||
wasm_runtime_show_app_heap_corrupted_prompt();
|
wasm_runtime_show_app_heap_corrupted_prompt();
|
||||||
return false;
|
ret = false;
|
||||||
|
goto return_func;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(memory_data_new =
|
if (!(memory_data_new =
|
||||||
wasm_runtime_realloc(memory_data_old, (uint32)total_size_new))) {
|
wasm_runtime_realloc(memory_data_old, (uint32)total_size_new))) {
|
||||||
if (!(memory_data_new = wasm_runtime_malloc((uint32)total_size_new))) {
|
if (!(memory_data_new = wasm_runtime_malloc((uint32)total_size_new))) {
|
||||||
return false;
|
ret = false;
|
||||||
|
goto return_func;
|
||||||
}
|
}
|
||||||
if (memory_data_old) {
|
if (memory_data_old) {
|
||||||
bh_memcpy_s(memory_data_new, (uint32)total_size_new,
|
bh_memcpy_s(memory_data_new, (uint32)total_size_new,
|
||||||
|
@ -685,6 +700,27 @@ wasm_enlarge_memory_internal(WASMModuleInstance *module, uint32 inc_page_count)
|
||||||
os_writegsbase(memory_data_new);
|
os_writegsbase(memory_data_new);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
return_func:
|
||||||
|
if (!ret && enlarge_memory_error_cb) {
|
||||||
|
WASMExecEnv *exec_env = NULL;
|
||||||
|
|
||||||
|
#if WASM_ENABLE_INTERP != 0
|
||||||
|
if (module->module_type == Wasm_Module_Bytecode)
|
||||||
|
exec_env =
|
||||||
|
((WASMModuleInstanceExtra *)module->e)->common.cur_exec_env;
|
||||||
|
#endif
|
||||||
|
#if WASM_ENABLE_AOT != 0
|
||||||
|
if (module->module_type == Wasm_Module_AoT)
|
||||||
|
exec_env =
|
||||||
|
((AOTModuleInstanceExtra *)module->e)->common.cur_exec_env;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
enlarge_memory_error_cb(inc_page_count, total_size_old, 0,
|
||||||
|
failure_reason,
|
||||||
|
(WASMModuleInstanceCommon *)module, exec_env,
|
||||||
|
enlarge_memory_error_user_data);
|
||||||
|
}
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
|
@ -692,12 +728,16 @@ bool
|
||||||
wasm_enlarge_memory_internal(WASMModuleInstance *module, uint32 inc_page_count)
|
wasm_enlarge_memory_internal(WASMModuleInstance *module, uint32 inc_page_count)
|
||||||
{
|
{
|
||||||
WASMMemoryInstance *memory = wasm_get_default_memory(module);
|
WASMMemoryInstance *memory = wasm_get_default_memory(module);
|
||||||
uint32 num_bytes_per_page, total_size_old;
|
uint32 num_bytes_per_page, total_size_old = 0;
|
||||||
uint32 cur_page_count, max_page_count, total_page_count;
|
uint32 cur_page_count, max_page_count, total_page_count;
|
||||||
uint64 total_size_new;
|
uint64 total_size_new;
|
||||||
|
bool ret = true;
|
||||||
|
enlarge_memory_error_reason_t failure_reason = INTERNAL_ERROR;
|
||||||
|
|
||||||
if (!memory)
|
if (!memory) {
|
||||||
return false;
|
ret = false;
|
||||||
|
goto return_func;
|
||||||
|
}
|
||||||
|
|
||||||
num_bytes_per_page = memory->num_bytes_per_page;
|
num_bytes_per_page = memory->num_bytes_per_page;
|
||||||
cur_page_count = memory->cur_page_count;
|
cur_page_count = memory->cur_page_count;
|
||||||
|
@ -710,9 +750,15 @@ wasm_enlarge_memory_internal(WASMModuleInstance *module, uint32 inc_page_count)
|
||||||
/* No need to enlarge memory */
|
/* No need to enlarge memory */
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
if (total_page_count < cur_page_count /* integer overflow */
|
if (total_page_count < cur_page_count) { /* integer overflow */
|
||||||
|| total_page_count > max_page_count) {
|
ret = false;
|
||||||
return false;
|
goto return_func;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (total_page_count > max_page_count) {
|
||||||
|
failure_reason = MAX_SIZE_REACHED;
|
||||||
|
ret = false;
|
||||||
|
goto return_func;
|
||||||
}
|
}
|
||||||
|
|
||||||
bh_assert(total_size_new <= 4 * (uint64)BH_GB);
|
bh_assert(total_size_new <= 4 * (uint64)BH_GB);
|
||||||
|
@ -727,7 +773,8 @@ wasm_enlarge_memory_internal(WASMModuleInstance *module, uint32 inc_page_count)
|
||||||
if (!os_mem_commit(memory->memory_data_end,
|
if (!os_mem_commit(memory->memory_data_end,
|
||||||
(uint32)total_size_new - total_size_old,
|
(uint32)total_size_new - total_size_old,
|
||||||
MMAP_PROT_READ | MMAP_PROT_WRITE)) {
|
MMAP_PROT_READ | MMAP_PROT_WRITE)) {
|
||||||
return false;
|
ret = false;
|
||||||
|
goto return_func;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -739,7 +786,8 @@ wasm_enlarge_memory_internal(WASMModuleInstance *module, uint32 inc_page_count)
|
||||||
os_mem_decommit(memory->memory_data_end,
|
os_mem_decommit(memory->memory_data_end,
|
||||||
(uint32)total_size_new - total_size_old);
|
(uint32)total_size_new - total_size_old);
|
||||||
#endif
|
#endif
|
||||||
return false;
|
ret = false;
|
||||||
|
goto return_func;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* The increased pages are filled with zero by the OS when os_mmap,
|
/* The increased pages are filled with zero by the OS when os_mmap,
|
||||||
|
@ -759,10 +807,39 @@ wasm_enlarge_memory_internal(WASMModuleInstance *module, uint32 inc_page_count)
|
||||||
memory->mem_bound_check_16bytes.u64 = total_size_new - 16;
|
memory->mem_bound_check_16bytes.u64 = total_size_new - 16;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
return true;
|
return_func:
|
||||||
|
if (!ret && enlarge_memory_error_cb) {
|
||||||
|
WASMExecEnv *exec_env = NULL;
|
||||||
|
|
||||||
|
#if WASM_ENABLE_INTERP != 0
|
||||||
|
if (module->module_type == Wasm_Module_Bytecode)
|
||||||
|
exec_env =
|
||||||
|
((WASMModuleInstanceExtra *)module->e)->common.cur_exec_env;
|
||||||
|
#endif
|
||||||
|
#if WASM_ENABLE_AOT != 0
|
||||||
|
if (module->module_type == Wasm_Module_AoT)
|
||||||
|
exec_env =
|
||||||
|
((AOTModuleInstanceExtra *)module->e)->common.cur_exec_env;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
enlarge_memory_error_cb(inc_page_count, total_size_old, 0,
|
||||||
|
failure_reason,
|
||||||
|
(WASMModuleInstanceCommon *)module, exec_env,
|
||||||
|
enlarge_memory_error_user_data);
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
#endif /* end of OS_ENABLE_HW_BOUND_CHECK */
|
#endif /* end of OS_ENABLE_HW_BOUND_CHECK */
|
||||||
|
|
||||||
|
void
|
||||||
|
wasm_runtime_set_enlarge_mem_error_callback(
|
||||||
|
const enlarge_memory_error_callback_t callback, void *user_data)
|
||||||
|
{
|
||||||
|
enlarge_memory_error_cb = callback;
|
||||||
|
enlarge_memory_error_user_data = user_data;
|
||||||
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
wasm_enlarge_memory(WASMModuleInstance *module, uint32 inc_page_count)
|
wasm_enlarge_memory(WASMModuleInstance *module, uint32 inc_page_count)
|
||||||
{
|
{
|
||||||
|
|
|
@ -24,6 +24,10 @@ wasm_runtime_memory_destroy();
|
||||||
unsigned
|
unsigned
|
||||||
wasm_runtime_memory_pool_size();
|
wasm_runtime_memory_pool_size();
|
||||||
|
|
||||||
|
void
|
||||||
|
wasm_runtime_set_enlarge_mem_error_callback(
|
||||||
|
const enlarge_memory_error_callback_t callback, void *user_data);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -6,6 +6,15 @@
|
||||||
#include "wasm_native.h"
|
#include "wasm_native.h"
|
||||||
#include "wasm_runtime_common.h"
|
#include "wasm_runtime_common.h"
|
||||||
#include "bh_log.h"
|
#include "bh_log.h"
|
||||||
|
#if WASM_ENABLE_INTERP != 0
|
||||||
|
#include "../interpreter/wasm_runtime.h"
|
||||||
|
#endif
|
||||||
|
#if WASM_ENABLE_AOT != 0
|
||||||
|
#include "../aot/aot_runtime.h"
|
||||||
|
#endif
|
||||||
|
#if WASM_ENABLE_THREAD_MGR != 0
|
||||||
|
#include "../libraries/thread-mgr/thread_manager.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
#if !defined(BH_PLATFORM_ZEPHYR) && !defined(BH_PLATFORM_ALIOS_THINGS) \
|
#if !defined(BH_PLATFORM_ZEPHYR) && !defined(BH_PLATFORM_ALIOS_THINGS) \
|
||||||
&& !defined(BH_PLATFORM_OPENRTOS) && !defined(BH_PLATFORM_ESP_IDF)
|
&& !defined(BH_PLATFORM_OPENRTOS) && !defined(BH_PLATFORM_ESP_IDF)
|
||||||
|
@ -22,6 +31,10 @@
|
||||||
|
|
||||||
static NativeSymbolsList g_native_symbols_list = NULL;
|
static NativeSymbolsList g_native_symbols_list = NULL;
|
||||||
|
|
||||||
|
#if WASM_ENABLE_LIBC_WASI != 0
|
||||||
|
static void *g_wasi_context_key;
|
||||||
|
#endif /* WASM_ENABLE_LIBC_WASI */
|
||||||
|
|
||||||
uint32
|
uint32
|
||||||
get_libc_builtin_export_apis(NativeSymbol **p_libc_builtin_apis);
|
get_libc_builtin_export_apis(NativeSymbol **p_libc_builtin_apis);
|
||||||
|
|
||||||
|
@ -394,6 +407,155 @@ wasm_native_unregister_natives(const char *module_name,
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if WASM_ENABLE_MODULE_INST_CONTEXT != 0
|
||||||
|
static uint32
|
||||||
|
context_key_to_idx(void *key)
|
||||||
|
{
|
||||||
|
bh_assert(key != NULL);
|
||||||
|
uint32 idx = (uint32)(uintptr_t)key;
|
||||||
|
bh_assert(idx > 0);
|
||||||
|
bh_assert(idx <= WASM_MAX_INSTANCE_CONTEXTS);
|
||||||
|
return idx - 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void *
|
||||||
|
context_idx_to_key(uint32 idx)
|
||||||
|
{
|
||||||
|
bh_assert(idx < WASM_MAX_INSTANCE_CONTEXTS);
|
||||||
|
return (void *)(uintptr_t)(idx + 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
typedef void (*dtor_t)(WASMModuleInstanceCommon *, void *);
|
||||||
|
static dtor_t g_context_dtors[WASM_MAX_INSTANCE_CONTEXTS];
|
||||||
|
|
||||||
|
static void
|
||||||
|
dtor_noop(WASMModuleInstanceCommon *inst, void *ctx)
|
||||||
|
{}
|
||||||
|
|
||||||
|
void *
|
||||||
|
wasm_native_create_context_key(void (*dtor)(WASMModuleInstanceCommon *inst,
|
||||||
|
void *ctx))
|
||||||
|
{
|
||||||
|
uint32 i;
|
||||||
|
for (i = 0; i < WASM_MAX_INSTANCE_CONTEXTS; i++) {
|
||||||
|
if (g_context_dtors[i] == NULL) {
|
||||||
|
if (dtor == NULL) {
|
||||||
|
dtor = dtor_noop;
|
||||||
|
}
|
||||||
|
g_context_dtors[i] = dtor;
|
||||||
|
return context_idx_to_key(i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
LOG_ERROR("failed to allocate instance context key");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
wasm_native_destroy_context_key(void *key)
|
||||||
|
{
|
||||||
|
uint32 idx = context_key_to_idx(key);
|
||||||
|
bh_assert(g_context_dtors[idx] != NULL);
|
||||||
|
g_context_dtors[idx] = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static WASMModuleInstanceExtraCommon *
|
||||||
|
wasm_module_inst_extra_common(WASMModuleInstanceCommon *inst)
|
||||||
|
{
|
||||||
|
#if WASM_ENABLE_INTERP != 0
|
||||||
|
if (inst->module_type == Wasm_Module_Bytecode) {
|
||||||
|
return &((WASMModuleInstance *)inst)->e->common;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#if WASM_ENABLE_AOT != 0
|
||||||
|
if (inst->module_type == Wasm_Module_AoT) {
|
||||||
|
return &((AOTModuleInstanceExtra *)((AOTModuleInstance *)inst)->e)
|
||||||
|
->common;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
bh_assert(false);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
wasm_native_set_context(WASMModuleInstanceCommon *inst, void *key, void *ctx)
|
||||||
|
{
|
||||||
|
uint32 idx = context_key_to_idx(key);
|
||||||
|
WASMModuleInstanceExtraCommon *common = wasm_module_inst_extra_common(inst);
|
||||||
|
common->contexts[idx] = ctx;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
wasm_native_set_context_spread(WASMModuleInstanceCommon *inst, void *key,
|
||||||
|
void *ctx)
|
||||||
|
{
|
||||||
|
#if WASM_ENABLE_THREAD_MGR != 0
|
||||||
|
wasm_cluster_set_context(inst, key, ctx);
|
||||||
|
#else
|
||||||
|
wasm_native_set_context(inst, key, ctx);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
void *
|
||||||
|
wasm_native_get_context(WASMModuleInstanceCommon *inst, void *key)
|
||||||
|
{
|
||||||
|
uint32 idx = context_key_to_idx(key);
|
||||||
|
WASMModuleInstanceExtraCommon *common = wasm_module_inst_extra_common(inst);
|
||||||
|
return common->contexts[idx];
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
wasm_native_call_context_dtors(WASMModuleInstanceCommon *inst)
|
||||||
|
{
|
||||||
|
WASMModuleInstanceExtraCommon *common = wasm_module_inst_extra_common(inst);
|
||||||
|
uint32 i;
|
||||||
|
for (i = 0; i < WASM_MAX_INSTANCE_CONTEXTS; i++) {
|
||||||
|
dtor_t dtor = g_context_dtors[i];
|
||||||
|
if (dtor != NULL) {
|
||||||
|
dtor(inst, common->contexts[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
wasm_native_inherit_contexts(WASMModuleInstanceCommon *child,
|
||||||
|
WASMModuleInstanceCommon *parent)
|
||||||
|
{
|
||||||
|
WASMModuleInstanceExtraCommon *parent_common =
|
||||||
|
wasm_module_inst_extra_common(parent);
|
||||||
|
WASMModuleInstanceExtraCommon *child_common =
|
||||||
|
wasm_module_inst_extra_common(child);
|
||||||
|
bh_memcpy_s(child_common->contexts,
|
||||||
|
sizeof(*child_common->contexts) * WASM_MAX_INSTANCE_CONTEXTS,
|
||||||
|
parent_common->contexts,
|
||||||
|
sizeof(*parent_common->contexts) * WASM_MAX_INSTANCE_CONTEXTS);
|
||||||
|
}
|
||||||
|
#endif /* WASM_ENABLE_MODULE_INST_CONTEXT != 0 */
|
||||||
|
|
||||||
|
#if WASM_ENABLE_LIBC_WASI != 0
|
||||||
|
WASIContext *
|
||||||
|
wasm_runtime_get_wasi_ctx(WASMModuleInstanceCommon *module_inst_comm)
|
||||||
|
{
|
||||||
|
return wasm_native_get_context(module_inst_comm, g_wasi_context_key);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
wasm_runtime_set_wasi_ctx(WASMModuleInstanceCommon *module_inst_comm,
|
||||||
|
WASIContext *wasi_ctx)
|
||||||
|
{
|
||||||
|
return wasm_native_set_context(module_inst_comm, g_wasi_context_key,
|
||||||
|
wasi_ctx);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
wasi_context_dtor(WASMModuleInstanceCommon *inst, void *ctx)
|
||||||
|
{
|
||||||
|
if (ctx == NULL) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
wasm_runtime_destroy_wasi(inst);
|
||||||
|
}
|
||||||
|
#endif /* end of WASM_ENABLE_LIBC_WASI */
|
||||||
|
|
||||||
bool
|
bool
|
||||||
wasm_native_init()
|
wasm_native_init()
|
||||||
{
|
{
|
||||||
|
@ -420,6 +582,10 @@ wasm_native_init()
|
||||||
#endif /* WASM_ENABLE_SPEC_TEST */
|
#endif /* WASM_ENABLE_SPEC_TEST */
|
||||||
|
|
||||||
#if WASM_ENABLE_LIBC_WASI != 0
|
#if WASM_ENABLE_LIBC_WASI != 0
|
||||||
|
g_wasi_context_key = wasm_native_create_context_key(wasi_context_dtor);
|
||||||
|
if (g_wasi_context_key == NULL) {
|
||||||
|
goto fail;
|
||||||
|
}
|
||||||
n_native_symbols = get_libc_wasi_export_apis(&native_symbols);
|
n_native_symbols = get_libc_wasi_export_apis(&native_symbols);
|
||||||
if (!wasm_native_register_natives("wasi_unstable", native_symbols,
|
if (!wasm_native_register_natives("wasi_unstable", native_symbols,
|
||||||
n_native_symbols))
|
n_native_symbols))
|
||||||
|
@ -507,6 +673,12 @@ wasm_native_destroy()
|
||||||
{
|
{
|
||||||
NativeSymbolsNode *node, *node_next;
|
NativeSymbolsNode *node, *node_next;
|
||||||
|
|
||||||
|
#if WASM_ENABLE_LIBC_WASI != 0
|
||||||
|
if (g_wasi_context_key != NULL) {
|
||||||
|
wasm_native_destroy_context_key(g_wasi_context_key);
|
||||||
|
g_wasi_context_key = NULL;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
#if WASM_ENABLE_LIB_PTHREAD != 0
|
#if WASM_ENABLE_LIB_PTHREAD != 0
|
||||||
lib_pthread_destroy();
|
lib_pthread_destroy();
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -68,6 +68,36 @@ bool
|
||||||
wasm_native_unregister_natives(const char *module_name,
|
wasm_native_unregister_natives(const char *module_name,
|
||||||
NativeSymbol *native_symbols);
|
NativeSymbol *native_symbols);
|
||||||
|
|
||||||
|
#if WASM_ENABLE_MODULE_INST_CONTEXT != 0
|
||||||
|
struct WASMModuleInstanceCommon;
|
||||||
|
|
||||||
|
void *
|
||||||
|
wasm_native_create_context_key(
|
||||||
|
void (*dtor)(struct WASMModuleInstanceCommon *inst, void *ctx));
|
||||||
|
|
||||||
|
void
|
||||||
|
wasm_native_destroy_context_key(void *key);
|
||||||
|
|
||||||
|
void
|
||||||
|
wasm_native_set_context(struct WASMModuleInstanceCommon *inst, void *key,
|
||||||
|
void *ctx);
|
||||||
|
void
|
||||||
|
wasm_native_set_context_spread(struct WASMModuleInstanceCommon *inst, void *key,
|
||||||
|
void *ctx);
|
||||||
|
void *
|
||||||
|
wasm_native_get_context(struct WASMModuleInstanceCommon *inst, void *key);
|
||||||
|
|
||||||
|
void
|
||||||
|
wasm_native_call_context_dtors(struct WASMModuleInstanceCommon *inst);
|
||||||
|
|
||||||
|
void
|
||||||
|
wasm_native_inherit_contexts(struct WASMModuleInstanceCommon *child,
|
||||||
|
struct WASMModuleInstanceCommon *parent);
|
||||||
|
#else /* WASM_ENABLE_MODULE_INST_CONTEXT */
|
||||||
|
#define wasm_native_call_context_dtors(inst) (void)(inst)
|
||||||
|
#define wasm_native_inherit_contexts(child, parent) (void)(parent)
|
||||||
|
#endif /* WASM_ENABLE_MODULE_INST_CONTEXT */
|
||||||
|
|
||||||
bool
|
bool
|
||||||
wasm_native_init();
|
wasm_native_init();
|
||||||
|
|
||||||
|
|
|
@ -125,6 +125,34 @@ runtime_malloc(uint64 size, WASMModuleInstanceCommon *module_inst,
|
||||||
return mem;
|
return mem;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if WASM_ENABLE_MULTI_MODULE != 0
|
||||||
|
/* TODO: Let loader_malloc be a general API both for AOT and WASM. */
|
||||||
|
|
||||||
|
#define loader_malloc(size, error_buf, error_buf_size) \
|
||||||
|
runtime_malloc(size, NULL, error_buf, error_buf_size)
|
||||||
|
|
||||||
|
static void
|
||||||
|
set_error_buf_v(const WASMModuleCommon *module, char *error_buf,
|
||||||
|
uint32 error_buf_size, const char *format, ...)
|
||||||
|
{
|
||||||
|
va_list args;
|
||||||
|
char buf[128];
|
||||||
|
if (error_buf != NULL) {
|
||||||
|
va_start(args, format);
|
||||||
|
vsnprintf(buf, sizeof(buf), format, args);
|
||||||
|
va_end(args);
|
||||||
|
if (module->module_type == Wasm_Module_AoT) {
|
||||||
|
snprintf(error_buf, error_buf_size, "AOT module load failed: %s",
|
||||||
|
buf);
|
||||||
|
}
|
||||||
|
else if (module->module_type == Wasm_Module_Bytecode) {
|
||||||
|
snprintf(error_buf, error_buf_size, "WASM module load failed: %s",
|
||||||
|
buf);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#if WASM_ENABLE_FAST_JIT != 0
|
#if WASM_ENABLE_FAST_JIT != 0
|
||||||
static JitCompOptions jit_options = { 0 };
|
static JitCompOptions jit_options = { 0 };
|
||||||
#endif
|
#endif
|
||||||
|
@ -457,8 +485,21 @@ wasm_runtime_env_init()
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if WASM_ENABLE_THREAD_MGR != 0 && defined(OS_ENABLE_WAKEUP_BLOCKING_OP)
|
||||||
|
if (os_blocking_op_init() != BHT_OK) {
|
||||||
|
goto fail11;
|
||||||
|
}
|
||||||
|
os_end_blocking_op();
|
||||||
|
#endif
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
|
#if WASM_ENABLE_THREAD_MGR != 0 && defined(OS_ENABLE_WAKEUP_BLOCKING_OP)
|
||||||
|
fail11:
|
||||||
|
#if WASM_ENABLE_JIT != 0 || WASM_ENABLE_WAMR_COMPILER != 0
|
||||||
|
aot_compiler_destroy();
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
#if WASM_ENABLE_JIT != 0 || WASM_ENABLE_WAMR_COMPILER != 0
|
#if WASM_ENABLE_JIT != 0 || WASM_ENABLE_WAMR_COMPILER != 0
|
||||||
fail10:
|
fail10:
|
||||||
#if WASM_ENABLE_FAST_JIT != 0
|
#if WASM_ENABLE_FAST_JIT != 0
|
||||||
|
@ -1185,20 +1226,20 @@ wasm_runtime_load(uint8 *buf, uint32 size, char *error_buf,
|
||||||
if (get_package_type(buf, size) == Wasm_Module_Bytecode) {
|
if (get_package_type(buf, size) == Wasm_Module_Bytecode) {
|
||||||
#if WASM_ENABLE_INTERP != 0
|
#if WASM_ENABLE_INTERP != 0
|
||||||
module_common =
|
module_common =
|
||||||
(WASMModuleCommon *)wasm_load(buf, size, error_buf, error_buf_size);
|
(WASMModuleCommon *)wasm_load(buf, size,
|
||||||
return register_module_with_null_name(module_common, error_buf,
|
#if WASM_ENABLE_MULTI_MODULE != 0
|
||||||
error_buf_size);
|
true,
|
||||||
|
#endif
|
||||||
|
error_buf, error_buf_size);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
else if (get_package_type(buf, size) == Wasm_Module_AoT) {
|
else if (get_package_type(buf, size) == Wasm_Module_AoT) {
|
||||||
#if WASM_ENABLE_AOT != 0
|
#if WASM_ENABLE_AOT != 0
|
||||||
module_common = (WASMModuleCommon *)aot_load_from_aot_file(
|
module_common = (WASMModuleCommon *)aot_load_from_aot_file(
|
||||||
buf, size, error_buf, error_buf_size);
|
buf, size, error_buf, error_buf_size);
|
||||||
return register_module_with_null_name(module_common, error_buf,
|
|
||||||
error_buf_size);
|
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
if (size < 4)
|
if (size < 4)
|
||||||
set_error_buf(error_buf, error_buf_size,
|
set_error_buf(error_buf, error_buf_size,
|
||||||
"WASM module load failed: unexpected end");
|
"WASM module load failed: unexpected end");
|
||||||
|
@ -1206,6 +1247,13 @@ wasm_runtime_load(uint8 *buf, uint32 size, char *error_buf,
|
||||||
set_error_buf(error_buf, error_buf_size,
|
set_error_buf(error_buf, error_buf_size,
|
||||||
"WASM module load failed: magic header not detected");
|
"WASM module load failed: magic header not detected");
|
||||||
return NULL;
|
return NULL;
|
||||||
|
}
|
||||||
|
if (!module_common) {
|
||||||
|
LOG_DEBUG("WASM module load failed");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
return register_module_with_null_name(module_common, error_buf,
|
||||||
|
error_buf_size);
|
||||||
}
|
}
|
||||||
|
|
||||||
WASMModuleCommon *
|
WASMModuleCommon *
|
||||||
|
@ -1218,6 +1266,10 @@ wasm_runtime_load_from_sections(WASMSection *section_list, bool is_aot,
|
||||||
#if WASM_ENABLE_INTERP != 0
|
#if WASM_ENABLE_INTERP != 0
|
||||||
module_common = (WASMModuleCommon *)wasm_load_from_sections(
|
module_common = (WASMModuleCommon *)wasm_load_from_sections(
|
||||||
section_list, error_buf, error_buf_size);
|
section_list, error_buf, error_buf_size);
|
||||||
|
if (!module_common) {
|
||||||
|
LOG_DEBUG("WASM module load failed from sections");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
return register_module_with_null_name(module_common, error_buf,
|
return register_module_with_null_name(module_common, error_buf,
|
||||||
error_buf_size);
|
error_buf_size);
|
||||||
#endif
|
#endif
|
||||||
|
@ -1226,6 +1278,10 @@ wasm_runtime_load_from_sections(WASMSection *section_list, bool is_aot,
|
||||||
#if WASM_ENABLE_AOT != 0
|
#if WASM_ENABLE_AOT != 0
|
||||||
module_common = (WASMModuleCommon *)aot_load_from_sections(
|
module_common = (WASMModuleCommon *)aot_load_from_sections(
|
||||||
section_list, error_buf, error_buf_size);
|
section_list, error_buf, error_buf_size);
|
||||||
|
if (!module_common) {
|
||||||
|
LOG_DEBUG("WASM module load failed from sections");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
return register_module_with_null_name(module_common, error_buf,
|
return register_module_with_null_name(module_common, error_buf,
|
||||||
error_buf_size);
|
error_buf_size);
|
||||||
#endif
|
#endif
|
||||||
|
@ -1392,6 +1448,10 @@ wasm_runtime_init_thread_env(void)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if WASM_ENABLE_THREAD_MGR != 0 && defined(OS_ENABLE_WAKEUP_BLOCKING_OP)
|
||||||
|
os_end_blocking_op();
|
||||||
|
#endif
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1938,33 +1998,6 @@ wasm_runtime_finalize_call_function(WASMExecEnv *exec_env,
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static bool
|
|
||||||
clear_wasi_proc_exit_exception(WASMModuleInstanceCommon *module_inst_comm)
|
|
||||||
{
|
|
||||||
#if WASM_ENABLE_LIBC_WASI != 0
|
|
||||||
bool has_exception;
|
|
||||||
char exception[EXCEPTION_BUF_LEN];
|
|
||||||
WASMModuleInstance *module_inst = (WASMModuleInstance *)module_inst_comm;
|
|
||||||
|
|
||||||
bh_assert(module_inst_comm->module_type == Wasm_Module_Bytecode
|
|
||||||
|| module_inst_comm->module_type == Wasm_Module_AoT);
|
|
||||||
|
|
||||||
has_exception = wasm_copy_exception(module_inst, exception);
|
|
||||||
if (has_exception && !strcmp(exception, "Exception: wasi proc exit")) {
|
|
||||||
/* The "wasi proc exit" exception is thrown by native lib to
|
|
||||||
let wasm app exit, which is a normal behavior, we clear
|
|
||||||
the exception here. And just clear the exception of current
|
|
||||||
thread, don't call `wasm_set_exception(module_inst, NULL)`
|
|
||||||
which will clear the exception of all threads. */
|
|
||||||
module_inst->cur_exception[0] = '\0';
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
#else
|
|
||||||
return false;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
bool
|
bool
|
||||||
wasm_runtime_call_wasm(WASMExecEnv *exec_env,
|
wasm_runtime_call_wasm(WASMExecEnv *exec_env,
|
||||||
WASMFunctionInstanceCommon *function, uint32 argc,
|
WASMFunctionInstanceCommon *function, uint32 argc,
|
||||||
|
@ -2005,16 +2038,11 @@ wasm_runtime_call_wasm(WASMExecEnv *exec_env,
|
||||||
param_argc, new_argv);
|
param_argc, new_argv);
|
||||||
#endif
|
#endif
|
||||||
if (!ret) {
|
if (!ret) {
|
||||||
if (clear_wasi_proc_exit_exception(exec_env->module_inst)) {
|
|
||||||
ret = true;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
if (new_argv != argv) {
|
if (new_argv != argv) {
|
||||||
wasm_runtime_free(new_argv);
|
wasm_runtime_free(new_argv);
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
#if WASM_ENABLE_REF_TYPES != 0
|
#if WASM_ENABLE_REF_TYPES != 0
|
||||||
if (!wasm_runtime_finalize_call_function(exec_env, function, new_argv,
|
if (!wasm_runtime_finalize_call_function(exec_env, function, new_argv,
|
||||||
|
@ -2374,15 +2402,10 @@ wasm_runtime_get_exec_env_singleton(WASMModuleInstanceCommon *module_inst_comm)
|
||||||
return module_inst->exec_env_singleton;
|
return module_inst->exec_env_singleton;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
static void
|
||||||
wasm_set_exception(WASMModuleInstance *module_inst, const char *exception)
|
wasm_set_exception_local(WASMModuleInstance *module_inst, const char *exception)
|
||||||
{
|
{
|
||||||
WASMExecEnv *exec_env = NULL;
|
exception_lock(module_inst);
|
||||||
|
|
||||||
#if WASM_ENABLE_SHARED_MEMORY != 0
|
|
||||||
if (module_inst->memory_count > 0)
|
|
||||||
shared_memory_lock(module_inst->memories[0]);
|
|
||||||
#endif
|
|
||||||
if (exception) {
|
if (exception) {
|
||||||
snprintf(module_inst->cur_exception, sizeof(module_inst->cur_exception),
|
snprintf(module_inst->cur_exception, sizeof(module_inst->cur_exception),
|
||||||
"Exception: %s", exception);
|
"Exception: %s", exception);
|
||||||
|
@ -2390,19 +2413,23 @@ wasm_set_exception(WASMModuleInstance *module_inst, const char *exception)
|
||||||
else {
|
else {
|
||||||
module_inst->cur_exception[0] = '\0';
|
module_inst->cur_exception[0] = '\0';
|
||||||
}
|
}
|
||||||
#if WASM_ENABLE_SHARED_MEMORY != 0
|
exception_unlock(module_inst);
|
||||||
if (module_inst->memory_count > 0)
|
}
|
||||||
shared_memory_unlock(module_inst->memories[0]);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
void
|
||||||
|
wasm_set_exception(WASMModuleInstance *module_inst, const char *exception)
|
||||||
|
{
|
||||||
#if WASM_ENABLE_THREAD_MGR != 0
|
#if WASM_ENABLE_THREAD_MGR != 0
|
||||||
exec_env =
|
WASMExecEnv *exec_env =
|
||||||
wasm_clusters_search_exec_env((WASMModuleInstanceCommon *)module_inst);
|
wasm_clusters_search_exec_env((WASMModuleInstanceCommon *)module_inst);
|
||||||
if (exec_env) {
|
if (exec_env) {
|
||||||
wasm_cluster_spread_exception(exec_env, exception ? false : true);
|
wasm_cluster_set_exception(exec_env, exception);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
wasm_set_exception_local(module_inst, exception);
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
(void)exec_env;
|
wasm_set_exception_local(module_inst, exception);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2453,10 +2480,7 @@ wasm_copy_exception(WASMModuleInstance *module_inst, char *exception_buf)
|
||||||
{
|
{
|
||||||
bool has_exception = false;
|
bool has_exception = false;
|
||||||
|
|
||||||
#if WASM_ENABLE_SHARED_MEMORY != 0
|
exception_lock(module_inst);
|
||||||
if (module_inst->memory_count > 0)
|
|
||||||
shared_memory_lock(module_inst->memories[0]);
|
|
||||||
#endif
|
|
||||||
if (module_inst->cur_exception[0] != '\0') {
|
if (module_inst->cur_exception[0] != '\0') {
|
||||||
/* NULL is passed if the caller is not interested in getting the
|
/* NULL is passed if the caller is not interested in getting the
|
||||||
* exception content, but only in knowing if an exception has been
|
* exception content, but only in knowing if an exception has been
|
||||||
|
@ -2468,10 +2492,7 @@ wasm_copy_exception(WASMModuleInstance *module_inst, char *exception_buf)
|
||||||
sizeof(module_inst->cur_exception));
|
sizeof(module_inst->cur_exception));
|
||||||
has_exception = true;
|
has_exception = true;
|
||||||
}
|
}
|
||||||
#if WASM_ENABLE_SHARED_MEMORY != 0
|
exception_unlock(module_inst);
|
||||||
if (module_inst->memory_count > 0)
|
|
||||||
shared_memory_unlock(module_inst->memories[0]);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
return has_exception;
|
return has_exception;
|
||||||
}
|
}
|
||||||
|
@ -2516,6 +2537,18 @@ wasm_runtime_clear_exception(WASMModuleInstanceCommon *module_inst_comm)
|
||||||
wasm_runtime_set_exception(module_inst_comm, NULL);
|
wasm_runtime_set_exception(module_inst_comm, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if WASM_ENABLE_THREAD_MGR != 0
|
||||||
|
void
|
||||||
|
wasm_runtime_terminate(WASMModuleInstanceCommon *module_inst_comm)
|
||||||
|
{
|
||||||
|
WASMModuleInstance *module_inst = (WASMModuleInstance *)module_inst_comm;
|
||||||
|
|
||||||
|
bh_assert(module_inst_comm->module_type == Wasm_Module_Bytecode
|
||||||
|
|| module_inst_comm->module_type == Wasm_Module_AoT);
|
||||||
|
wasm_set_exception(module_inst, "terminated by user");
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
void
|
void
|
||||||
wasm_runtime_set_custom_data_internal(
|
wasm_runtime_set_custom_data_internal(
|
||||||
WASMModuleInstanceCommon *module_inst_comm, void *custom_data)
|
WASMModuleInstanceCommon *module_inst_comm, void *custom_data)
|
||||||
|
@ -3338,27 +3371,6 @@ wasm_runtime_get_wasi_exit_code(WASMModuleInstanceCommon *module_inst)
|
||||||
#endif
|
#endif
|
||||||
return wasi_ctx->exit_code;
|
return wasi_ctx->exit_code;
|
||||||
}
|
}
|
||||||
|
|
||||||
WASIContext *
|
|
||||||
wasm_runtime_get_wasi_ctx(WASMModuleInstanceCommon *module_inst_comm)
|
|
||||||
{
|
|
||||||
WASMModuleInstance *module_inst = (WASMModuleInstance *)module_inst_comm;
|
|
||||||
|
|
||||||
bh_assert(module_inst_comm->module_type == Wasm_Module_Bytecode
|
|
||||||
|| module_inst_comm->module_type == Wasm_Module_AoT);
|
|
||||||
return module_inst->wasi_ctx;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
wasm_runtime_set_wasi_ctx(WASMModuleInstanceCommon *module_inst_comm,
|
|
||||||
WASIContext *wasi_ctx)
|
|
||||||
{
|
|
||||||
WASMModuleInstance *module_inst = (WASMModuleInstance *)module_inst_comm;
|
|
||||||
|
|
||||||
bh_assert(module_inst_comm->module_type == Wasm_Module_Bytecode
|
|
||||||
|| module_inst_comm->module_type == Wasm_Module_AoT);
|
|
||||||
module_inst->wasi_ctx = wasi_ctx;
|
|
||||||
}
|
|
||||||
#endif /* end of WASM_ENABLE_LIBC_WASI */
|
#endif /* end of WASM_ENABLE_LIBC_WASI */
|
||||||
|
|
||||||
WASMModuleCommon *
|
WASMModuleCommon *
|
||||||
|
@ -4621,10 +4633,6 @@ wasm_runtime_call_indirect(WASMExecEnv *exec_env, uint32 element_index,
|
||||||
ret = aot_call_indirect(exec_env, 0, element_index, argc, argv);
|
ret = aot_call_indirect(exec_env, 0, element_index, argc, argv);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (!ret && clear_wasi_proc_exit_exception(exec_env->module_inst)) {
|
|
||||||
ret = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -5708,3 +5716,345 @@ wasm_runtime_is_import_global_linked(const char *module_name,
|
||||||
return false;
|
return false;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if WASM_ENABLE_LIBC_WASI != 0 || WASM_ENABLE_MULTI_MODULE != 0
|
||||||
|
WASMExport *
|
||||||
|
loader_find_export(const WASMModuleCommon *module, const char *module_name,
|
||||||
|
const char *field_name, uint8 export_kind, char *error_buf,
|
||||||
|
uint32 error_buf_size)
|
||||||
|
{
|
||||||
|
WASMExport *exports = NULL, *result = NULL, *export;
|
||||||
|
uint32 export_count = 0, i;
|
||||||
|
#if WASM_ENABLE_AOT != 0
|
||||||
|
if (module->module_type == Wasm_Module_AoT) {
|
||||||
|
AOTModule *aot_module = (AOTModule *)module;
|
||||||
|
exports = (WASMExport *)aot_module->exports;
|
||||||
|
export_count = aot_module->export_count;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#if WASM_ENABLE_INTERP != 0
|
||||||
|
if (module->module_type == Wasm_Module_Bytecode) {
|
||||||
|
WASMModule *wasm_module = (WASMModule *)module;
|
||||||
|
exports = wasm_module->exports;
|
||||||
|
export_count = wasm_module->export_count;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
for (i = 0, export = exports; i < export_count; ++i, ++export) {
|
||||||
|
if (export->kind == export_kind && !strcmp(field_name, export->name)) {
|
||||||
|
result = export;
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (i == export_count) {
|
||||||
|
LOG_DEBUG("can not find an export %d named %s in the module %s",
|
||||||
|
export_kind, field_name, module_name);
|
||||||
|
set_error_buf(error_buf, error_buf_size,
|
||||||
|
"unknown import or incompatible import type");
|
||||||
|
}
|
||||||
|
exit:
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if WASM_ENABLE_MULTI_MODULE != 0
|
||||||
|
WASMModuleCommon *
|
||||||
|
wasm_runtime_search_sub_module(const WASMModuleCommon *parent_module,
|
||||||
|
const char *sub_module_name)
|
||||||
|
{
|
||||||
|
WASMRegisteredModule *node = NULL;
|
||||||
|
#if WASM_ENABLE_AOT != 0
|
||||||
|
if (parent_module->module_type == Wasm_Module_AoT) {
|
||||||
|
node = bh_list_first_elem(
|
||||||
|
((AOTModule *)parent_module)->import_module_list);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#if WASM_ENABLE_INTERP != 0
|
||||||
|
if (parent_module->module_type == Wasm_Module_Bytecode) {
|
||||||
|
node = bh_list_first_elem(
|
||||||
|
((WASMModule *)parent_module)->import_module_list);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
while (node && strcmp(sub_module_name, node->module_name)) {
|
||||||
|
node = bh_list_elem_next(node);
|
||||||
|
}
|
||||||
|
return node ? node->module : NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
wasm_runtime_register_sub_module(const WASMModuleCommon *parent_module,
|
||||||
|
const char *sub_module_name,
|
||||||
|
WASMModuleCommon *sub_module)
|
||||||
|
{
|
||||||
|
/* register sub_module into its parent sub module list */
|
||||||
|
WASMRegisteredModule *node = NULL;
|
||||||
|
bh_list_status ret;
|
||||||
|
|
||||||
|
if (wasm_runtime_search_sub_module(parent_module, sub_module_name)) {
|
||||||
|
LOG_DEBUG("%s has been registered in its parent", sub_module_name);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
node = loader_malloc(sizeof(WASMRegisteredModule), NULL, 0);
|
||||||
|
if (!node) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
node->module_name = sub_module_name;
|
||||||
|
node->module = sub_module;
|
||||||
|
#if WASM_ENABLE_AOT != 0
|
||||||
|
if (parent_module->module_type == Wasm_Module_AoT) {
|
||||||
|
ret = bh_list_insert(((AOTModule *)parent_module)->import_module_list,
|
||||||
|
node);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#if WASM_ENABLE_INTERP != 0
|
||||||
|
if (parent_module->module_type == Wasm_Module_Bytecode) {
|
||||||
|
ret = bh_list_insert(((WASMModule *)parent_module)->import_module_list,
|
||||||
|
node);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
bh_assert(BH_LIST_SUCCESS == ret);
|
||||||
|
(void)ret;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
WASMModuleCommon *
|
||||||
|
wasm_runtime_load_depended_module(const WASMModuleCommon *parent_module,
|
||||||
|
const char *sub_module_name, char *error_buf,
|
||||||
|
uint32 error_buf_size)
|
||||||
|
{
|
||||||
|
WASMModuleCommon *sub_module = NULL;
|
||||||
|
bool ret = false;
|
||||||
|
uint8 *buffer = NULL;
|
||||||
|
uint32 buffer_size = 0;
|
||||||
|
|
||||||
|
/* check the registered module list of the parent */
|
||||||
|
sub_module = wasm_runtime_search_sub_module(parent_module, sub_module_name);
|
||||||
|
if (sub_module) {
|
||||||
|
LOG_DEBUG("%s has been loaded before", sub_module_name);
|
||||||
|
return sub_module;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* check the global registered module list */
|
||||||
|
sub_module = wasm_runtime_find_module_registered(sub_module_name);
|
||||||
|
if (sub_module) {
|
||||||
|
LOG_DEBUG("%s has been loaded", sub_module_name);
|
||||||
|
goto wasm_runtime_register_sub_module;
|
||||||
|
}
|
||||||
|
LOG_VERBOSE("loading %s", sub_module_name);
|
||||||
|
if (!reader) {
|
||||||
|
set_error_buf_v(parent_module, error_buf, error_buf_size,
|
||||||
|
"no sub module reader to load %s", sub_module_name);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
/* start to maintain a loading module list */
|
||||||
|
ret = wasm_runtime_is_loading_module(sub_module_name);
|
||||||
|
if (ret) {
|
||||||
|
set_error_buf_v(parent_module, error_buf, error_buf_size,
|
||||||
|
"found circular dependency on %s", sub_module_name);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
ret = wasm_runtime_add_loading_module(sub_module_name, error_buf,
|
||||||
|
error_buf_size);
|
||||||
|
if (!ret) {
|
||||||
|
LOG_DEBUG("can not add %s into loading module list\n", sub_module_name);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = reader(parent_module->module_type, sub_module_name, &buffer,
|
||||||
|
&buffer_size);
|
||||||
|
if (!ret) {
|
||||||
|
LOG_DEBUG("read the file of %s failed", sub_module_name);
|
||||||
|
set_error_buf_v(parent_module, error_buf, error_buf_size,
|
||||||
|
"unknown import", sub_module_name);
|
||||||
|
goto delete_loading_module;
|
||||||
|
}
|
||||||
|
if (get_package_type(buffer, buffer_size) != parent_module->module_type) {
|
||||||
|
LOG_DEBUG("moudle %s type error", sub_module_name);
|
||||||
|
goto delete_loading_module;
|
||||||
|
}
|
||||||
|
if (get_package_type(buffer, buffer_size) == Wasm_Module_Bytecode) {
|
||||||
|
#if WASM_ENABLE_INTERP != 0
|
||||||
|
sub_module = (WASMModuleCommon *)wasm_load(buffer, buffer_size, false,
|
||||||
|
error_buf, error_buf_size);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
else if (get_package_type(buffer, buffer_size) == Wasm_Module_AoT) {
|
||||||
|
#if WASM_ENABLE_AOT != 0
|
||||||
|
sub_module = (WASMModuleCommon *)aot_load_from_aot_file(
|
||||||
|
buffer, buffer_size, error_buf, error_buf_size);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
if (!sub_module) {
|
||||||
|
LOG_DEBUG("error: can not load the sub_module %s", sub_module_name);
|
||||||
|
/* others will be destroyed in runtime_destroy() */
|
||||||
|
goto destroy_file_buffer;
|
||||||
|
}
|
||||||
|
wasm_runtime_delete_loading_module(sub_module_name);
|
||||||
|
/* register on a global list */
|
||||||
|
ret = wasm_runtime_register_module_internal(
|
||||||
|
sub_module_name, (WASMModuleCommon *)sub_module, buffer, buffer_size,
|
||||||
|
error_buf, error_buf_size);
|
||||||
|
if (!ret) {
|
||||||
|
LOG_DEBUG("error: can not register module %s globally\n",
|
||||||
|
sub_module_name);
|
||||||
|
/* others will be unloaded in runtime_destroy() */
|
||||||
|
goto unload_module;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* register into its parent list */
|
||||||
|
wasm_runtime_register_sub_module:
|
||||||
|
ret = wasm_runtime_register_sub_module(parent_module, sub_module_name,
|
||||||
|
sub_module);
|
||||||
|
if (!ret) {
|
||||||
|
set_error_buf_v(parent_module, error_buf, error_buf_size,
|
||||||
|
"failed to register sub module %s", sub_module_name);
|
||||||
|
/* since it is in the global module list, no need to
|
||||||
|
* unload the module. the runtime_destroy() will do it
|
||||||
|
*/
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return sub_module;
|
||||||
|
|
||||||
|
unload_module:
|
||||||
|
wasm_runtime_unload(sub_module);
|
||||||
|
|
||||||
|
destroy_file_buffer:
|
||||||
|
if (destroyer) {
|
||||||
|
destroyer(buffer, buffer_size);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
LOG_WARNING("need to release the reading buffer of %s manually",
|
||||||
|
sub_module_name);
|
||||||
|
}
|
||||||
|
|
||||||
|
delete_loading_module:
|
||||||
|
wasm_runtime_delete_loading_module(sub_module_name);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
wasm_runtime_sub_module_instantiate(WASMModuleCommon *module,
|
||||||
|
WASMModuleInstanceCommon *module_inst,
|
||||||
|
uint32 stack_size, uint32 heap_size,
|
||||||
|
char *error_buf, uint32 error_buf_size)
|
||||||
|
{
|
||||||
|
bh_list *sub_module_inst_list = NULL;
|
||||||
|
WASMRegisteredModule *sub_module_list_node = NULL;
|
||||||
|
|
||||||
|
#if WASM_ENABLE_AOT != 0
|
||||||
|
if (module->module_type == Wasm_Module_AoT) {
|
||||||
|
sub_module_inst_list =
|
||||||
|
((AOTModuleInstanceExtra *)((AOTModuleInstance *)module_inst)->e)
|
||||||
|
->sub_module_inst_list;
|
||||||
|
sub_module_list_node =
|
||||||
|
bh_list_first_elem(((AOTModule *)module)->import_module_list);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#if WASM_ENABLE_INTERP != 0
|
||||||
|
if (module->module_type == Wasm_Module_Bytecode) {
|
||||||
|
sub_module_inst_list =
|
||||||
|
((WASMModuleInstanceExtra *)((WASMModuleInstance *)module_inst)->e)
|
||||||
|
->sub_module_inst_list;
|
||||||
|
sub_module_list_node =
|
||||||
|
bh_list_first_elem(((WASMModule *)module)->import_module_list);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
while (sub_module_list_node) {
|
||||||
|
WASMSubModInstNode *sub_module_inst_list_node = NULL;
|
||||||
|
WASMModuleCommon *sub_module = sub_module_list_node->module;
|
||||||
|
WASMModuleInstanceCommon *sub_module_inst = NULL;
|
||||||
|
sub_module_inst = wasm_runtime_instantiate_internal(
|
||||||
|
sub_module, NULL, NULL, stack_size, heap_size, error_buf,
|
||||||
|
error_buf_size);
|
||||||
|
if (!sub_module_inst) {
|
||||||
|
LOG_DEBUG("instantiate %s failed",
|
||||||
|
sub_module_list_node->module_name);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
sub_module_inst_list_node = loader_malloc(sizeof(WASMSubModInstNode),
|
||||||
|
error_buf, error_buf_size);
|
||||||
|
if (!sub_module_inst_list_node) {
|
||||||
|
LOG_DEBUG("Malloc WASMSubModInstNode failed, SZ:%d",
|
||||||
|
sizeof(WASMSubModInstNode));
|
||||||
|
if (sub_module_inst)
|
||||||
|
wasm_runtime_deinstantiate_internal(sub_module_inst, false);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
sub_module_inst_list_node->module_inst =
|
||||||
|
(WASMModuleInstance *)sub_module_inst;
|
||||||
|
sub_module_inst_list_node->module_name =
|
||||||
|
sub_module_list_node->module_name;
|
||||||
|
bh_list_status ret =
|
||||||
|
bh_list_insert(sub_module_inst_list, sub_module_inst_list_node);
|
||||||
|
bh_assert(BH_LIST_SUCCESS == ret);
|
||||||
|
(void)ret;
|
||||||
|
sub_module_list_node = bh_list_elem_next(sub_module_list_node);
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
wasm_runtime_sub_module_deinstantiate(WASMModuleInstanceCommon *module_inst)
|
||||||
|
{
|
||||||
|
bh_list *list = NULL;
|
||||||
|
#if WASM_ENABLE_AOT != 0
|
||||||
|
if (module_inst->module_type == Wasm_Module_AoT) {
|
||||||
|
list = ((AOTModuleInstanceExtra *)((AOTModuleInstance *)module_inst)->e)
|
||||||
|
->sub_module_inst_list;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#if WASM_ENABLE_INTERP != 0
|
||||||
|
if (module_inst->module_type == Wasm_Module_Bytecode) {
|
||||||
|
list =
|
||||||
|
((WASMModuleInstanceExtra *)((WASMModuleInstance *)module_inst)->e)
|
||||||
|
->sub_module_inst_list;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
WASMSubModInstNode *node = bh_list_first_elem(list);
|
||||||
|
while (node) {
|
||||||
|
WASMSubModInstNode *next_node = bh_list_elem_next(node);
|
||||||
|
bh_list_remove(list, node);
|
||||||
|
wasm_runtime_deinstantiate_internal(
|
||||||
|
(WASMModuleInstanceCommon *)node->module_inst, false);
|
||||||
|
wasm_runtime_free(node);
|
||||||
|
node = next_node;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif /* end of WASM_ENABLE_MULTI_MODULE */
|
||||||
|
#if WASM_ENABLE_MODULE_INST_CONTEXT != 0
|
||||||
|
void *
|
||||||
|
wasm_runtime_create_context_key(void (*dtor)(WASMModuleInstanceCommon *inst,
|
||||||
|
void *ctx))
|
||||||
|
{
|
||||||
|
return wasm_native_create_context_key(dtor);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
wasm_runtime_destroy_context_key(void *key)
|
||||||
|
{
|
||||||
|
wasm_native_destroy_context_key(key);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
wasm_runtime_set_context(WASMModuleInstanceCommon *inst, void *key, void *ctx)
|
||||||
|
{
|
||||||
|
wasm_native_set_context(inst, key, ctx);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
wasm_runtime_set_context_spread(WASMModuleInstanceCommon *inst, void *key,
|
||||||
|
void *ctx)
|
||||||
|
{
|
||||||
|
wasm_native_set_context_spread(inst, key, ctx);
|
||||||
|
}
|
||||||
|
|
||||||
|
void *
|
||||||
|
wasm_runtime_get_context(WASMModuleInstanceCommon *inst, void *key)
|
||||||
|
{
|
||||||
|
return wasm_native_get_context(inst, key);
|
||||||
|
}
|
||||||
|
#endif /* WASM_ENABLE_MODULE_INST_CONTEXT != 0 */
|
||||||
|
|
|
@ -675,6 +675,10 @@ wasm_runtime_get_exception(WASMModuleInstanceCommon *module);
|
||||||
WASM_RUNTIME_API_EXTERN void
|
WASM_RUNTIME_API_EXTERN void
|
||||||
wasm_runtime_clear_exception(WASMModuleInstanceCommon *module_inst);
|
wasm_runtime_clear_exception(WASMModuleInstanceCommon *module_inst);
|
||||||
|
|
||||||
|
/* See wasm_export.h for description */
|
||||||
|
WASM_RUNTIME_API_EXTERN void
|
||||||
|
wasm_runtime_terminate(WASMModuleInstanceCommon *module);
|
||||||
|
|
||||||
/* Internal API */
|
/* Internal API */
|
||||||
void
|
void
|
||||||
wasm_runtime_set_custom_data_internal(WASMModuleInstanceCommon *module_inst,
|
wasm_runtime_set_custom_data_internal(WASMModuleInstanceCommon *module_inst,
|
||||||
|
@ -784,6 +788,9 @@ wasm_runtime_register_module_internal(const char *module_name,
|
||||||
void
|
void
|
||||||
wasm_runtime_unregister_module(const WASMModuleCommon *module);
|
wasm_runtime_unregister_module(const WASMModuleCommon *module);
|
||||||
|
|
||||||
|
WASMModuleCommon *
|
||||||
|
wasm_runtime_find_module_registered(const char *module_name);
|
||||||
|
|
||||||
bool
|
bool
|
||||||
wasm_runtime_add_loading_module(const char *module_name, char *error_buf,
|
wasm_runtime_add_loading_module(const char *module_name, char *error_buf,
|
||||||
uint32 error_buf_size);
|
uint32 error_buf_size);
|
||||||
|
@ -796,6 +803,35 @@ wasm_runtime_is_loading_module(const char *module_name);
|
||||||
|
|
||||||
void
|
void
|
||||||
wasm_runtime_destroy_loading_module_list();
|
wasm_runtime_destroy_loading_module_list();
|
||||||
|
|
||||||
|
WASMModuleCommon *
|
||||||
|
wasm_runtime_search_sub_module(const WASMModuleCommon *parent_module,
|
||||||
|
const char *sub_module_name);
|
||||||
|
|
||||||
|
bool
|
||||||
|
wasm_runtime_register_sub_module(const WASMModuleCommon *parent_module,
|
||||||
|
const char *sub_module_name,
|
||||||
|
WASMModuleCommon *sub_module);
|
||||||
|
|
||||||
|
WASMModuleCommon *
|
||||||
|
wasm_runtime_load_depended_module(const WASMModuleCommon *parent_module,
|
||||||
|
const char *sub_module_name, char *error_buf,
|
||||||
|
uint32 error_buf_size);
|
||||||
|
|
||||||
|
bool
|
||||||
|
wasm_runtime_sub_module_instantiate(WASMModuleCommon *module,
|
||||||
|
WASMModuleInstanceCommon *module_inst,
|
||||||
|
uint32 stack_size, uint32 heap_size,
|
||||||
|
char *error_buf, uint32 error_buf_size);
|
||||||
|
void
|
||||||
|
wasm_runtime_sub_module_deinstantiate(WASMModuleInstanceCommon *module_inst);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if WASM_ENABLE_LIBC_WASI != 0 || WASM_ENABLE_MULTI_MODULE != 0
|
||||||
|
WASMExport *
|
||||||
|
loader_find_export(const WASMModuleCommon *module, const char *module_name,
|
||||||
|
const char *field_name, uint8 export_kind, char *error_buf,
|
||||||
|
uint32 error_buf_size);
|
||||||
#endif /* WASM_ENALBE_MULTI_MODULE */
|
#endif /* WASM_ENALBE_MULTI_MODULE */
|
||||||
|
|
||||||
bool
|
bool
|
||||||
|
@ -939,6 +975,26 @@ WASM_RUNTIME_API_EXTERN bool
|
||||||
wasm_runtime_unregister_natives(const char *module_name,
|
wasm_runtime_unregister_natives(const char *module_name,
|
||||||
NativeSymbol *native_symbols);
|
NativeSymbol *native_symbols);
|
||||||
|
|
||||||
|
/* See wasm_export.h for description */
|
||||||
|
WASM_RUNTIME_API_EXTERN void *
|
||||||
|
wasm_runtime_create_context_key(void (*dtor)(WASMModuleInstanceCommon *inst,
|
||||||
|
void *ctx));
|
||||||
|
|
||||||
|
/* See wasm_export.h for description */
|
||||||
|
WASM_RUNTIME_API_EXTERN void
|
||||||
|
wasm_runtime_destroy_context_key(void *key);
|
||||||
|
|
||||||
|
/* See wasm_export.h for description */
|
||||||
|
WASM_RUNTIME_API_EXTERN void
|
||||||
|
wasm_runtime_set_context(WASMModuleInstanceCommon *inst, void *key, void *ctx);
|
||||||
|
/* See wasm_export.h for description */
|
||||||
|
WASM_RUNTIME_API_EXTERN void
|
||||||
|
wasm_runtime_set_context_spread(WASMModuleInstanceCommon *inst, void *key,
|
||||||
|
void *ctx);
|
||||||
|
/* See wasm_export.h for description */
|
||||||
|
WASM_RUNTIME_API_EXTERN void *
|
||||||
|
wasm_runtime_get_context(WASMModuleInstanceCommon *inst, void *key);
|
||||||
|
|
||||||
bool
|
bool
|
||||||
wasm_runtime_invoke_native(WASMExecEnv *exec_env, void *func_ptr,
|
wasm_runtime_invoke_native(WASMExecEnv *exec_env, void *func_ptr,
|
||||||
const WASMType *func_type, const char *signature,
|
const WASMType *func_type, const char *signature,
|
||||||
|
@ -1016,6 +1072,15 @@ WASM_RUNTIME_API_EXTERN bool
|
||||||
wasm_runtime_is_import_global_linked(const char *module_name,
|
wasm_runtime_is_import_global_linked(const char *module_name,
|
||||||
const char *global_name);
|
const char *global_name);
|
||||||
|
|
||||||
|
WASM_RUNTIME_API_EXTERN bool
|
||||||
|
wasm_runtime_begin_blocking_op(WASMExecEnv *exec_env);
|
||||||
|
|
||||||
|
WASM_RUNTIME_API_EXTERN void
|
||||||
|
wasm_runtime_end_blocking_op(WASMExecEnv *exec_env);
|
||||||
|
|
||||||
|
void
|
||||||
|
wasm_runtime_interrupt_blocking_op(WASMExecEnv *exec_env);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -20,6 +20,8 @@ extern "C" {
|
||||||
#define WASM_SUSPEND_FLAG_BREAKPOINT 0x4
|
#define WASM_SUSPEND_FLAG_BREAKPOINT 0x4
|
||||||
/* Return from pthread_exit */
|
/* Return from pthread_exit */
|
||||||
#define WASM_SUSPEND_FLAG_EXIT 0x8
|
#define WASM_SUSPEND_FLAG_EXIT 0x8
|
||||||
|
/* The thread might be blocking */
|
||||||
|
#define WASM_SUSPEND_FLAG_BLOCKING 0x10
|
||||||
|
|
||||||
typedef union WASMSuspendFlags {
|
typedef union WASMSuspendFlags {
|
||||||
bh_atomic_32_t flags;
|
bh_atomic_32_t flags;
|
||||||
|
|
|
@ -363,6 +363,19 @@ check_type_compatible(uint8 src_type, uint8 dst_type)
|
||||||
} \
|
} \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
|
/* if val is a constant integer and its value is not undef or poison */
|
||||||
|
static inline bool
|
||||||
|
LLVMIsEfficientConstInt(LLVMValueRef val)
|
||||||
|
{
|
||||||
|
return LLVMIsConstant(val)
|
||||||
|
&& LLVMGetValueKind(val) == LLVMConstantIntValueKind
|
||||||
|
&& !LLVMIsUndef(val)
|
||||||
|
#if LLVM_VERSION_NUMBER >= 12
|
||||||
|
&& !LLVMIsPoison(addr)
|
||||||
|
#endif
|
||||||
|
;
|
||||||
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
aot_compile_wasm(AOTCompContext *comp_ctx);
|
aot_compile_wasm(AOTCompContext *comp_ctx);
|
||||||
|
|
||||||
|
|
|
@ -2703,6 +2703,7 @@ aot_resolve_stack_sizes(AOTCompContext *comp_ctx, AOTObjectData *obj_data)
|
||||||
|| (obj_data->target_info.bin_type == AOT_COFF32_BIN_TYPE
|
|| (obj_data->target_info.bin_type == AOT_COFF32_BIN_TYPE
|
||||||
&& !strncmp(name, "_", 1)
|
&& !strncmp(name, "_", 1)
|
||||||
&& !strcmp(name + 1, aot_stack_sizes_alias_name)))) {
|
&& !strcmp(name + 1, aot_stack_sizes_alias_name)))) {
|
||||||
|
#if 0 /* cf. https://github.com/llvm/llvm-project/issues/67765 */
|
||||||
uint64 sz = LLVMGetSymbolSize(sym_itr);
|
uint64 sz = LLVMGetSymbolSize(sym_itr);
|
||||||
if (sz != sizeof(uint32) * obj_data->func_count
|
if (sz != sizeof(uint32) * obj_data->func_count
|
||||||
/* sz of COFF64/COFF32 is 0, ignore the check */
|
/* sz of COFF64/COFF32 is 0, ignore the check */
|
||||||
|
@ -2711,6 +2712,7 @@ aot_resolve_stack_sizes(AOTCompContext *comp_ctx, AOTObjectData *obj_data)
|
||||||
aot_set_last_error("stack_sizes had unexpected size.");
|
aot_set_last_error("stack_sizes had unexpected size.");
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
uint64 addr = LLVMGetSymbolAddress(sym_itr);
|
uint64 addr = LLVMGetSymbolAddress(sym_itr);
|
||||||
if (!(sec_itr =
|
if (!(sec_itr =
|
||||||
LLVMObjectFileCopySectionIterator(obj_data->binary))) {
|
LLVMObjectFileCopySectionIterator(obj_data->binary))) {
|
||||||
|
|
|
@ -4,6 +4,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "aot_emit_control.h"
|
#include "aot_emit_control.h"
|
||||||
|
#include "aot_compiler.h"
|
||||||
#include "aot_emit_exception.h"
|
#include "aot_emit_exception.h"
|
||||||
#include "../aot/aot_runtime.h"
|
#include "../aot/aot_runtime.h"
|
||||||
#include "../interpreter/wasm_loader.h"
|
#include "../interpreter/wasm_loader.h"
|
||||||
|
@ -234,13 +235,15 @@ handle_next_reachable_block(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx,
|
||||||
else {
|
else {
|
||||||
/* Store extra return values to function parameters */
|
/* Store extra return values to function parameters */
|
||||||
if (i != 0) {
|
if (i != 0) {
|
||||||
|
LLVMValueRef res;
|
||||||
uint32 param_index = func_type->param_count + i;
|
uint32 param_index = func_type->param_count + i;
|
||||||
if (!LLVMBuildStore(
|
if (!(res = LLVMBuildStore(
|
||||||
comp_ctx->builder, block->result_phis[i],
|
comp_ctx->builder, block->result_phis[i],
|
||||||
LLVMGetParam(func_ctx->func, param_index))) {
|
LLVMGetParam(func_ctx->func, param_index)))) {
|
||||||
aot_set_last_error("llvm build store failed.");
|
aot_set_last_error("llvm build store failed.");
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
LLVMSetAlignment(res, 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -278,7 +281,7 @@ push_aot_block_to_stack_and_pass_params(AOTCompContext *comp_ctx,
|
||||||
AOTBlock *block)
|
AOTBlock *block)
|
||||||
{
|
{
|
||||||
uint32 i, param_index;
|
uint32 i, param_index;
|
||||||
LLVMValueRef value;
|
LLVMValueRef value, br_inst;
|
||||||
uint64 size;
|
uint64 size;
|
||||||
char name[32];
|
char name[32];
|
||||||
LLVMBasicBlockRef block_curr = CURR_BLOCK();
|
LLVMBasicBlockRef block_curr = CURR_BLOCK();
|
||||||
|
@ -326,7 +329,14 @@ push_aot_block_to_stack_and_pass_params(AOTCompContext *comp_ctx,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
SET_BUILDER_POS(block_curr);
|
|
||||||
|
/* At this point, the branch instruction was already built to jump to
|
||||||
|
* the new BB, to avoid generating zext instruction from the popped
|
||||||
|
* operand that would come after branch instruction, we should position
|
||||||
|
* the builder before the last branch instruction */
|
||||||
|
br_inst = LLVMGetLastInstruction(block_curr);
|
||||||
|
bh_assert(LLVMGetInstructionOpcode(br_inst) == LLVMBr);
|
||||||
|
LLVMPositionBuilderBefore(comp_ctx->builder, br_inst);
|
||||||
|
|
||||||
/* Pop param values from current block's
|
/* Pop param values from current block's
|
||||||
* value stack and add to param phis.
|
* value stack and add to param phis.
|
||||||
|
@ -467,7 +477,7 @@ aot_compile_op_block(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx,
|
||||||
p_frame_ip);
|
p_frame_ip);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!LLVMIsConstant(value)) {
|
if (!LLVMIsEfficientConstInt(value)) {
|
||||||
/* Compare value is not constant, create condition br IR */
|
/* Compare value is not constant, create condition br IR */
|
||||||
/* Create entry block */
|
/* Create entry block */
|
||||||
format_block_name(name, sizeof(name), block->block_index,
|
format_block_name(name, sizeof(name), block->block_index,
|
||||||
|
@ -833,7 +843,7 @@ aot_compile_op_br_if(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx,
|
||||||
return aot_handle_next_reachable_block(comp_ctx, func_ctx, p_frame_ip);
|
return aot_handle_next_reachable_block(comp_ctx, func_ctx, p_frame_ip);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!LLVMIsConstant(value_cmp)) {
|
if (!LLVMIsEfficientConstInt(value_cmp)) {
|
||||||
/* Compare value is not constant, create condition br IR */
|
/* Compare value is not constant, create condition br IR */
|
||||||
if (!(block_dst = get_target_block(func_ctx, br_depth))) {
|
if (!(block_dst = get_target_block(func_ctx, br_depth))) {
|
||||||
return false;
|
return false;
|
||||||
|
@ -970,7 +980,7 @@ aot_compile_op_br_table(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx,
|
||||||
return aot_handle_next_reachable_block(comp_ctx, func_ctx, p_frame_ip);
|
return aot_handle_next_reachable_block(comp_ctx, func_ctx, p_frame_ip);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!LLVMIsConstant(value_cmp)) {
|
if (!LLVMIsEfficientConstInt(value_cmp)) {
|
||||||
/* Compare value is not constant, create switch IR */
|
/* Compare value is not constant, create switch IR */
|
||||||
for (i = 0; i <= br_count; i++) {
|
for (i = 0; i <= br_count; i++) {
|
||||||
target_block = get_target_block(func_ctx, br_depths[i]);
|
target_block = get_target_block(func_ctx, br_depths[i]);
|
||||||
|
@ -1102,14 +1112,17 @@ aot_compile_op_return(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx,
|
||||||
if (block_func->result_count) {
|
if (block_func->result_count) {
|
||||||
/* Store extra result values to function parameters */
|
/* Store extra result values to function parameters */
|
||||||
for (i = 0; i < block_func->result_count - 1; i++) {
|
for (i = 0; i < block_func->result_count - 1; i++) {
|
||||||
|
LLVMValueRef res;
|
||||||
result_index = block_func->result_count - 1 - i;
|
result_index = block_func->result_count - 1 - i;
|
||||||
POP(value, block_func->result_types[result_index]);
|
POP(value, block_func->result_types[result_index]);
|
||||||
param_index = func_type->param_count + result_index;
|
param_index = func_type->param_count + result_index;
|
||||||
if (!LLVMBuildStore(comp_ctx->builder, value,
|
if (!(res = LLVMBuildStore(
|
||||||
LLVMGetParam(func_ctx->func, param_index))) {
|
comp_ctx->builder, value,
|
||||||
|
LLVMGetParam(func_ctx->func, param_index)))) {
|
||||||
aot_set_last_error("llvm build store failed.");
|
aot_set_last_error("llvm build store failed.");
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
LLVMSetAlignment(res, 1);
|
||||||
}
|
}
|
||||||
/* Return the first result value */
|
/* Return the first result value */
|
||||||
POP(value, block_func->result_types[0]);
|
POP(value, block_func->result_types[0]);
|
||||||
|
|
|
@ -4,6 +4,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "aot_emit_memory.h"
|
#include "aot_emit_memory.h"
|
||||||
|
#include "aot_compiler.h"
|
||||||
#include "aot_emit_exception.h"
|
#include "aot_emit_exception.h"
|
||||||
#include "../aot/aot_runtime.h"
|
#include "../aot/aot_runtime.h"
|
||||||
#include "aot_intrinsic.h"
|
#include "aot_intrinsic.h"
|
||||||
|
@ -145,11 +146,7 @@ aot_check_memory_overflow(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx,
|
||||||
* have been thrown when converting float to integer before
|
* have been thrown when converting float to integer before
|
||||||
*/
|
*/
|
||||||
/* return addres directly if constant offset and inside memory space */
|
/* return addres directly if constant offset and inside memory space */
|
||||||
if (LLVMIsConstant(addr) && !LLVMIsUndef(addr)
|
if (LLVMIsEfficientConstInt(addr)) {
|
||||||
#if LLVM_VERSION_NUMBER >= 12
|
|
||||||
&& !LLVMIsPoison(addr)
|
|
||||||
#endif
|
|
||||||
) {
|
|
||||||
uint64 mem_offset =
|
uint64 mem_offset =
|
||||||
(uint64)LLVMConstIntGetZExtValue(addr) + (uint64)offset;
|
(uint64)LLVMConstIntGetZExtValue(addr) + (uint64)offset;
|
||||||
uint32 num_bytes_per_page =
|
uint32 num_bytes_per_page =
|
||||||
|
@ -911,11 +908,7 @@ check_bulk_memory_overflow(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx,
|
||||||
* have been thrown when converting float to integer before
|
* have been thrown when converting float to integer before
|
||||||
*/
|
*/
|
||||||
/* return addres directly if constant offset and inside memory space */
|
/* return addres directly if constant offset and inside memory space */
|
||||||
if (!LLVMIsUndef(offset) && !LLVMIsUndef(bytes)
|
if (LLVMIsEfficientConstInt(offset) && LLVMIsEfficientConstInt(bytes)) {
|
||||||
#if LLVM_VERSION_NUMBER >= 12
|
|
||||||
&& !LLVMIsPoison(offset) && !LLVMIsPoison(bytes)
|
|
||||||
#endif
|
|
||||||
&& LLVMIsConstant(offset) && LLVMIsConstant(bytes)) {
|
|
||||||
uint64 mem_offset = (uint64)LLVMConstIntGetZExtValue(offset);
|
uint64 mem_offset = (uint64)LLVMConstIntGetZExtValue(offset);
|
||||||
uint64 mem_len = (uint64)LLVMConstIntGetZExtValue(bytes);
|
uint64 mem_len = (uint64)LLVMConstIntGetZExtValue(bytes);
|
||||||
uint32 num_bytes_per_page =
|
uint32 num_bytes_per_page =
|
||||||
|
|
|
@ -55,12 +55,12 @@
|
||||||
|
|
||||||
#if LLVM_VERSION_NUMBER >= 12
|
#if LLVM_VERSION_NUMBER >= 12
|
||||||
#define IS_CONST_ZERO(val) \
|
#define IS_CONST_ZERO(val) \
|
||||||
(!LLVMIsUndef(val) && !LLVMIsPoison(val) && LLVMIsConstant(val) \
|
(LLVMIsEfficientConstInt(val) \
|
||||||
&& ((is_i32 && (int32)LLVMConstIntGetZExtValue(val) == 0) \
|
&& ((is_i32 && (int32)LLVMConstIntGetZExtValue(val) == 0) \
|
||||||
|| (!is_i32 && (int64)LLVMConstIntGetSExtValue(val) == 0)))
|
|| (!is_i32 && (int64)LLVMConstIntGetSExtValue(val) == 0)))
|
||||||
#else
|
#else
|
||||||
#define IS_CONST_ZERO(val) \
|
#define IS_CONST_ZERO(val) \
|
||||||
(!LLVMIsUndef(val) && LLVMIsConstant(val) \
|
(LLVMIsEfficientConstInt(val) \
|
||||||
&& ((is_i32 && (int32)LLVMConstIntGetZExtValue(val) == 0) \
|
&& ((is_i32 && (int32)LLVMConstIntGetZExtValue(val) == 0) \
|
||||||
|| (!is_i32 && (int64)LLVMConstIntGetSExtValue(val) == 0)))
|
|| (!is_i32 && (int64)LLVMConstIntGetSExtValue(val) == 0)))
|
||||||
#endif
|
#endif
|
||||||
|
@ -171,6 +171,15 @@
|
||||||
right = shift_count_mask; \
|
right = shift_count_mask; \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
|
static bool
|
||||||
|
is_shift_count_mask_needed(AOTCompContext *comp_ctx, LLVMValueRef left,
|
||||||
|
LLVMValueRef right)
|
||||||
|
{
|
||||||
|
return (strcmp(comp_ctx->target_arch, "x86_64") != 0
|
||||||
|
&& strcmp(comp_ctx->target_arch, "i386") != 0)
|
||||||
|
|| (LLVMIsEfficientConstInt(left) && LLVMIsEfficientConstInt(right));
|
||||||
|
}
|
||||||
|
|
||||||
/* Call llvm constrained floating-point intrinsic */
|
/* Call llvm constrained floating-point intrinsic */
|
||||||
static LLVMValueRef
|
static LLVMValueRef
|
||||||
call_llvm_float_experimental_constrained_intrinsic(AOTCompContext *comp_ctx,
|
call_llvm_float_experimental_constrained_intrinsic(AOTCompContext *comp_ctx,
|
||||||
|
@ -473,7 +482,7 @@ compile_int_div(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx,
|
||||||
return aot_handle_next_reachable_block(comp_ctx, func_ctx, p_frame_ip);
|
return aot_handle_next_reachable_block(comp_ctx, func_ctx, p_frame_ip);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (LLVMIsConstant(right)) {
|
if (LLVMIsEfficientConstInt(right)) {
|
||||||
int64 right_val = (int64)LLVMConstIntGetSExtValue(right);
|
int64 right_val = (int64)LLVMConstIntGetSExtValue(right);
|
||||||
switch (right_val) {
|
switch (right_val) {
|
||||||
case 0:
|
case 0:
|
||||||
|
@ -728,8 +737,7 @@ compile_int_shl(AOTCompContext *comp_ctx, LLVMValueRef left, LLVMValueRef right,
|
||||||
{
|
{
|
||||||
LLVMValueRef res;
|
LLVMValueRef res;
|
||||||
|
|
||||||
if (strcmp(comp_ctx->target_arch, "x86_64") != 0
|
if (is_shift_count_mask_needed(comp_ctx, left, right))
|
||||||
&& strcmp(comp_ctx->target_arch, "i386") != 0)
|
|
||||||
SHIFT_COUNT_MASK;
|
SHIFT_COUNT_MASK;
|
||||||
|
|
||||||
/* Build shl */
|
/* Build shl */
|
||||||
|
@ -744,8 +752,7 @@ compile_int_shr_s(AOTCompContext *comp_ctx, LLVMValueRef left,
|
||||||
{
|
{
|
||||||
LLVMValueRef res;
|
LLVMValueRef res;
|
||||||
|
|
||||||
if (strcmp(comp_ctx->target_arch, "x86_64") != 0
|
if (is_shift_count_mask_needed(comp_ctx, left, right))
|
||||||
&& strcmp(comp_ctx->target_arch, "i386") != 0)
|
|
||||||
SHIFT_COUNT_MASK;
|
SHIFT_COUNT_MASK;
|
||||||
|
|
||||||
/* Build shl */
|
/* Build shl */
|
||||||
|
@ -760,8 +767,7 @@ compile_int_shr_u(AOTCompContext *comp_ctx, LLVMValueRef left,
|
||||||
{
|
{
|
||||||
LLVMValueRef res;
|
LLVMValueRef res;
|
||||||
|
|
||||||
if (strcmp(comp_ctx->target_arch, "x86_64") != 0
|
if (is_shift_count_mask_needed(comp_ctx, left, right))
|
||||||
&& strcmp(comp_ctx->target_arch, "i386") != 0)
|
|
||||||
SHIFT_COUNT_MASK;
|
SHIFT_COUNT_MASK;
|
||||||
|
|
||||||
/* Build shl */
|
/* Build shl */
|
||||||
|
|
|
@ -526,12 +526,18 @@ aot_add_precheck_function(AOTCompContext *comp_ctx, LLVMModuleRef module,
|
||||||
}
|
}
|
||||||
wasm_runtime_free(params);
|
wasm_runtime_free(params);
|
||||||
params = NULL;
|
params = NULL;
|
||||||
|
|
||||||
|
#if LLVM_VERSION_MAJOR < 17
|
||||||
if (aot_target_precheck_can_use_musttail(comp_ctx)) {
|
if (aot_target_precheck_can_use_musttail(comp_ctx)) {
|
||||||
LLVMSetTailCallKind(retval, LLVMTailCallKindMustTail);
|
LLVMSetTailCallKind(retval, LLVMTailCallKindMustTail);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
LLVMSetTailCallKind(retval, LLVMTailCallKindTail);
|
LLVMSetTailCallKind(retval, LLVMTailCallKindTail);
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
|
LLVMSetTailCall(retval, true);
|
||||||
|
#endif
|
||||||
|
|
||||||
if (ret_type == VOID_TYPE) {
|
if (ret_type == VOID_TYPE) {
|
||||||
if (!LLVMBuildRetVoid(b)) {
|
if (!LLVMBuildRetVoid(b)) {
|
||||||
goto fail;
|
goto fail;
|
||||||
|
@ -2172,8 +2178,10 @@ bool
|
||||||
aot_compiler_init(void)
|
aot_compiler_init(void)
|
||||||
{
|
{
|
||||||
/* Initialize LLVM environment */
|
/* Initialize LLVM environment */
|
||||||
|
#if LLVM_VERSION_MAJOR < 17
|
||||||
LLVMInitializeCore(LLVMGetGlobalPassRegistry());
|
LLVMInitializeCore(LLVMGetGlobalPassRegistry());
|
||||||
|
#endif
|
||||||
|
|
||||||
#if WASM_ENABLE_WAMR_COMPILER != 0
|
#if WASM_ENABLE_WAMR_COMPILER != 0
|
||||||
/* Init environment of all targets for AOT compiler */
|
/* Init environment of all targets for AOT compiler */
|
||||||
LLVMInitializeAllTargetInfos();
|
LLVMInitializeAllTargetInfos();
|
||||||
|
|
|
@ -15,15 +15,18 @@
|
||||||
#include "llvm-c/ExecutionEngine.h"
|
#include "llvm-c/ExecutionEngine.h"
|
||||||
#include "llvm-c/Analysis.h"
|
#include "llvm-c/Analysis.h"
|
||||||
#include "llvm-c/BitWriter.h"
|
#include "llvm-c/BitWriter.h"
|
||||||
|
#if LLVM_VERSION_MAJOR < 17
|
||||||
#include "llvm-c/Transforms/Utils.h"
|
#include "llvm-c/Transforms/Utils.h"
|
||||||
#include "llvm-c/Transforms/Scalar.h"
|
#include "llvm-c/Transforms/Scalar.h"
|
||||||
#include "llvm-c/Transforms/Vectorize.h"
|
#include "llvm-c/Transforms/Vectorize.h"
|
||||||
#include "llvm-c/Transforms/PassManagerBuilder.h"
|
#include "llvm-c/Transforms/PassManagerBuilder.h"
|
||||||
|
#include "llvm-c/Initialization.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
#include "llvm-c/Orc.h"
|
#include "llvm-c/Orc.h"
|
||||||
#include "llvm-c/Error.h"
|
#include "llvm-c/Error.h"
|
||||||
#include "llvm-c/Support.h"
|
#include "llvm-c/Support.h"
|
||||||
#include "llvm-c/Initialization.h"
|
|
||||||
#include "llvm-c/TargetMachine.h"
|
#include "llvm-c/TargetMachine.h"
|
||||||
#include "llvm-c/LLJIT.h"
|
#include "llvm-c/LLJIT.h"
|
||||||
#if WASM_ENABLE_DEBUG_AOT != 0
|
#if WASM_ENABLE_DEBUG_AOT != 0
|
||||||
|
|
|
@ -5,11 +5,13 @@
|
||||||
|
|
||||||
#include <llvm/Passes/StandardInstrumentations.h>
|
#include <llvm/Passes/StandardInstrumentations.h>
|
||||||
#include <llvm/Support/Error.h>
|
#include <llvm/Support/Error.h>
|
||||||
|
#if LLVM_VERSION_MAJOR < 17
|
||||||
#include <llvm/ADT/None.h>
|
#include <llvm/ADT/None.h>
|
||||||
#include <llvm/ADT/Optional.h>
|
#include <llvm/ADT/Optional.h>
|
||||||
|
#include <llvm/ADT/Triple.h>
|
||||||
|
#endif
|
||||||
#include <llvm/ADT/SmallVector.h>
|
#include <llvm/ADT/SmallVector.h>
|
||||||
#include <llvm/ADT/Twine.h>
|
#include <llvm/ADT/Twine.h>
|
||||||
#include <llvm/ADT/Triple.h>
|
|
||||||
#include <llvm/Analysis/TargetTransformInfo.h>
|
#include <llvm/Analysis/TargetTransformInfo.h>
|
||||||
#include <llvm/CodeGen/TargetPassConfig.h>
|
#include <llvm/CodeGen/TargetPassConfig.h>
|
||||||
#include <llvm/ExecutionEngine/ExecutionEngine.h>
|
#include <llvm/ExecutionEngine/ExecutionEngine.h>
|
||||||
|
@ -18,7 +20,9 @@
|
||||||
#include <llvm/Target/TargetMachine.h>
|
#include <llvm/Target/TargetMachine.h>
|
||||||
#include <llvm-c/Core.h>
|
#include <llvm-c/Core.h>
|
||||||
#include <llvm-c/ExecutionEngine.h>
|
#include <llvm-c/ExecutionEngine.h>
|
||||||
|
#if LLVM_VERSION_MAJOR < 17
|
||||||
#include <llvm-c/Initialization.h>
|
#include <llvm-c/Initialization.h>
|
||||||
|
#endif
|
||||||
#include <llvm/ExecutionEngine/GenericValue.h>
|
#include <llvm/ExecutionEngine/GenericValue.h>
|
||||||
#include <llvm/ExecutionEngine/JITEventListener.h>
|
#include <llvm/ExecutionEngine/JITEventListener.h>
|
||||||
#include <llvm/ExecutionEngine/RTDyldMemoryManager.h>
|
#include <llvm/ExecutionEngine/RTDyldMemoryManager.h>
|
||||||
|
@ -30,6 +34,9 @@
|
||||||
#include <llvm/IR/PassManager.h>
|
#include <llvm/IR/PassManager.h>
|
||||||
#include <llvm/Support/CommandLine.h>
|
#include <llvm/Support/CommandLine.h>
|
||||||
#include <llvm/Support/ErrorHandling.h>
|
#include <llvm/Support/ErrorHandling.h>
|
||||||
|
#if LLVM_VERSION_MAJOR >= 17
|
||||||
|
#include <llvm/Support/PGOOptions.h>
|
||||||
|
#endif
|
||||||
#include <llvm/Target/CodeGenCWrappers.h>
|
#include <llvm/Target/CodeGenCWrappers.h>
|
||||||
#include <llvm/Target/TargetMachine.h>
|
#include <llvm/Target/TargetMachine.h>
|
||||||
#include <llvm/Target/TargetOptions.h>
|
#include <llvm/Target/TargetOptions.h>
|
||||||
|
@ -55,6 +62,13 @@
|
||||||
using namespace llvm;
|
using namespace llvm;
|
||||||
using namespace llvm::orc;
|
using namespace llvm::orc;
|
||||||
|
|
||||||
|
#if LLVM_VERSION_MAJOR >= 17
|
||||||
|
namespace llvm {
|
||||||
|
template<typename T>
|
||||||
|
using Optional = std::optional<T>;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
LLVM_C_EXTERN_C_BEGIN
|
LLVM_C_EXTERN_C_BEGIN
|
||||||
|
|
||||||
bool
|
bool
|
||||||
|
@ -110,7 +124,14 @@ ExpandMemoryOpPass::run(Function &F, FunctionAnalysisManager &AM)
|
||||||
Memcpy->eraseFromParent();
|
Memcpy->eraseFromParent();
|
||||||
}
|
}
|
||||||
else if (MemMoveInst *Memmove = dyn_cast<MemMoveInst>(MemCall)) {
|
else if (MemMoveInst *Memmove = dyn_cast<MemMoveInst>(MemCall)) {
|
||||||
|
#if LLVM_VERSION_MAJOR >= 17
|
||||||
|
Function *ParentFunc = Memmove->getParent()->getParent();
|
||||||
|
const TargetTransformInfo &TTI =
|
||||||
|
AM.getResult<TargetIRAnalysis>(*ParentFunc);
|
||||||
|
expandMemMoveAsLoop(Memmove, TTI);
|
||||||
|
#else
|
||||||
expandMemMoveAsLoop(Memmove);
|
expandMemMoveAsLoop(Memmove);
|
||||||
|
#endif
|
||||||
Memmove->eraseFromParent();
|
Memmove->eraseFromParent();
|
||||||
}
|
}
|
||||||
else if (MemSetInst *Memset = dyn_cast<MemSetInst>(MemCall)) {
|
else if (MemSetInst *Memset = dyn_cast<MemSetInst>(MemCall)) {
|
||||||
|
@ -181,6 +202,9 @@ aot_apply_llvm_new_pass_manager(AOTCompContext *comp_ctx, LLVMModuleRef module)
|
||||||
#else
|
#else
|
||||||
Optional<PGOOptions> PGO = llvm::None;
|
Optional<PGOOptions> PGO = llvm::None;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// TODO
|
||||||
|
#if LLVM_VERSION_MAJOR < 17
|
||||||
if (comp_ctx->enable_llvm_pgo) {
|
if (comp_ctx->enable_llvm_pgo) {
|
||||||
/* Disable static counter allocation for value profiler,
|
/* Disable static counter allocation for value profiler,
|
||||||
it will be allocated by runtime */
|
it will be allocated by runtime */
|
||||||
|
@ -191,6 +215,7 @@ aot_apply_llvm_new_pass_manager(AOTCompContext *comp_ctx, LLVMModuleRef module)
|
||||||
else if (comp_ctx->use_prof_file) {
|
else if (comp_ctx->use_prof_file) {
|
||||||
PGO = PGOOptions(comp_ctx->use_prof_file, "", "", PGOOptions::IRUse);
|
PGO = PGOOptions(comp_ctx->use_prof_file, "", "", PGOOptions::IRUse);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef DEBUG_PASS
|
#ifdef DEBUG_PASS
|
||||||
PassInstrumentationCallbacks PIC;
|
PassInstrumentationCallbacks PIC;
|
||||||
|
|
|
@ -4,8 +4,10 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <llvm-c/TargetMachine.h>
|
#include <llvm-c/TargetMachine.h>
|
||||||
|
#if LLVM_VERSION_MAJOR < 17
|
||||||
#include <llvm/ADT/None.h>
|
#include <llvm/ADT/None.h>
|
||||||
#include <llvm/ADT/Optional.h>
|
#include <llvm/ADT/Optional.h>
|
||||||
|
#endif
|
||||||
#include <llvm/IR/Instructions.h>
|
#include <llvm/IR/Instructions.h>
|
||||||
#if LLVM_VERSION_MAJOR >= 14
|
#if LLVM_VERSION_MAJOR >= 14
|
||||||
#include <llvm/MC/TargetRegistry.h>
|
#include <llvm/MC/TargetRegistry.h>
|
||||||
|
@ -18,6 +20,13 @@
|
||||||
|
|
||||||
#include "aot_llvm_extra2.h"
|
#include "aot_llvm_extra2.h"
|
||||||
|
|
||||||
|
#if LLVM_VERSION_MAJOR >= 17
|
||||||
|
namespace llvm {
|
||||||
|
template<typename T>
|
||||||
|
using Optional = std::optional<T>;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
static llvm::Optional<llvm::Reloc::Model>
|
static llvm::Optional<llvm::Reloc::Model>
|
||||||
convert(LLVMRelocMode reloc_mode)
|
convert(LLVMRelocMode reloc_mode)
|
||||||
{
|
{
|
||||||
|
|
|
@ -8,8 +8,10 @@
|
||||||
#include "llvm-c/OrcEE.h"
|
#include "llvm-c/OrcEE.h"
|
||||||
#include "llvm-c/TargetMachine.h"
|
#include "llvm-c/TargetMachine.h"
|
||||||
|
|
||||||
|
#if LLVM_VERSION_MAJOR < 17
|
||||||
#include "llvm/ADT/None.h"
|
#include "llvm/ADT/None.h"
|
||||||
#include "llvm/ADT/Optional.h"
|
#include "llvm/ADT/Optional.h"
|
||||||
|
#endif
|
||||||
#include "llvm/ExecutionEngine/Orc/JITTargetMachineBuilder.h"
|
#include "llvm/ExecutionEngine/Orc/JITTargetMachineBuilder.h"
|
||||||
#include "llvm/ExecutionEngine/Orc/LLJIT.h"
|
#include "llvm/ExecutionEngine/Orc/LLJIT.h"
|
||||||
#include "llvm/ExecutionEngine/Orc/ObjectTransformLayer.h"
|
#include "llvm/ExecutionEngine/Orc/ObjectTransformLayer.h"
|
||||||
|
@ -21,6 +23,13 @@
|
||||||
#include "aot_orc_extra.h"
|
#include "aot_orc_extra.h"
|
||||||
#include "aot.h"
|
#include "aot.h"
|
||||||
|
|
||||||
|
#if LLVM_VERSION_MAJOR >= 17
|
||||||
|
namespace llvm {
|
||||||
|
template<typename T>
|
||||||
|
using Optional = std::optional<T>;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
using namespace llvm;
|
using namespace llvm;
|
||||||
using namespace llvm::orc;
|
using namespace llvm::orc;
|
||||||
using GlobalValueSet = std::set<const GlobalValue *>;
|
using GlobalValueSet = std::set<const GlobalValue *>;
|
||||||
|
|
|
@ -217,10 +217,9 @@ aot_compile_simd_f64x2_nearest(AOTCompContext *comp_ctx,
|
||||||
|
|
||||||
static bool
|
static bool
|
||||||
simd_float_cmp(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx,
|
simd_float_cmp(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx,
|
||||||
FloatArithmetic arith_op, LLVMTypeRef vector_type)
|
FloatArithmetic op, LLVMTypeRef vector_type)
|
||||||
{
|
{
|
||||||
LLVMValueRef lhs, rhs, result;
|
LLVMValueRef lhs, rhs, cmp, selected;
|
||||||
LLVMRealPredicate op = FLOAT_MIN == arith_op ? LLVMRealULT : LLVMRealUGT;
|
|
||||||
|
|
||||||
if (!(rhs =
|
if (!(rhs =
|
||||||
simd_pop_v128_and_bitcast(comp_ctx, func_ctx, vector_type, "rhs"))
|
simd_pop_v128_and_bitcast(comp_ctx, func_ctx, vector_type, "rhs"))
|
||||||
|
@ -229,82 +228,242 @@ simd_float_cmp(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx,
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(result = LLVMBuildFCmp(comp_ctx->builder, op, lhs, rhs, "cmp"))) {
|
if (!(cmp = LLVMBuildFCmp(comp_ctx->builder,
|
||||||
|
op == FLOAT_MIN ? LLVMRealOLT : LLVMRealOGT, rhs,
|
||||||
|
lhs, "cmp"))) {
|
||||||
HANDLE_FAILURE("LLVMBuildFCmp");
|
HANDLE_FAILURE("LLVMBuildFCmp");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(result =
|
if (!(selected =
|
||||||
LLVMBuildSelect(comp_ctx->builder, result, lhs, rhs, "select"))) {
|
LLVMBuildSelect(comp_ctx->builder, cmp, rhs, lhs, "selected"))) {
|
||||||
HANDLE_FAILURE("LLVMBuildSelect");
|
HANDLE_FAILURE("LLVMBuildSelect");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
return simd_bitcast_and_push_v128(comp_ctx, func_ctx, result, "result");
|
return simd_bitcast_and_push_v128(comp_ctx, func_ctx, selected, "result");
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool
|
||||||
|
simd_float_min(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx,
|
||||||
|
LLVMTypeRef vector_type)
|
||||||
|
{
|
||||||
|
LLVMValueRef lhs, rhs, lhs_nan, rhs_nan, olt_ret, ogt_ret, or_ret, ret1,
|
||||||
|
ret2, ret3, ret4;
|
||||||
|
|
||||||
|
if (!(rhs =
|
||||||
|
simd_pop_v128_and_bitcast(comp_ctx, func_ctx, vector_type, "rhs"))
|
||||||
|
|| !(lhs = simd_pop_v128_and_bitcast(comp_ctx, func_ctx, vector_type,
|
||||||
|
"lhs"))) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!(lhs_nan = LLVMBuildFCmp(comp_ctx->builder, LLVMRealUNO, lhs, lhs,
|
||||||
|
"lhs_nan"))) {
|
||||||
|
HANDLE_FAILURE("LLVMBuildFCmp + LLVMRealUNO");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!(rhs_nan = LLVMBuildFCmp(comp_ctx->builder, LLVMRealUNO, rhs, rhs,
|
||||||
|
"rhs_nan"))) {
|
||||||
|
HANDLE_FAILURE("LLVMBuildFCmp + LLVMRealUNO");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!(olt_ret = LLVMBuildFCmp(comp_ctx->builder, LLVMRealOLT, lhs, rhs,
|
||||||
|
"olt_ret"))) {
|
||||||
|
HANDLE_FAILURE("LLVMBuildFCmp + LLVMRealOLT");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!(ogt_ret = LLVMBuildFCmp(comp_ctx->builder, LLVMRealOGT, lhs, rhs,
|
||||||
|
"ogt_ret"))) {
|
||||||
|
HANDLE_FAILURE("LLVMBuildFCmp + LLVMRealOGT");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* lhs or rhs */
|
||||||
|
{
|
||||||
|
LLVMValueRef integer_l, integer_r, integer_or;
|
||||||
|
|
||||||
|
if (!(integer_l = LLVMBuildBitCast(comp_ctx->builder, lhs,
|
||||||
|
V128_i64x2_TYPE, "lhs_to_int"))) {
|
||||||
|
HANDLE_FAILURE("LLVMBuildBitCas");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!(integer_r = LLVMBuildBitCast(comp_ctx->builder, rhs,
|
||||||
|
V128_i64x2_TYPE, "rhs_to_int"))) {
|
||||||
|
HANDLE_FAILURE("LLVMBuildBitCas");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!(integer_or =
|
||||||
|
LLVMBuildOr(comp_ctx->builder, integer_l, integer_r, "or"))) {
|
||||||
|
HANDLE_FAILURE("LLVMBuildOr");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!(or_ret = LLVMBuildBitCast(comp_ctx->builder, integer_or,
|
||||||
|
vector_type, "holder"))) {
|
||||||
|
HANDLE_FAILURE("LLVMBuildBitCast");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!(ret1 = LLVMBuildSelect(comp_ctx->builder, olt_ret, lhs, or_ret,
|
||||||
|
"sel_olt"))) {
|
||||||
|
HANDLE_FAILURE("LLVMBuildSelect");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!(ret2 = LLVMBuildSelect(comp_ctx->builder, ogt_ret, rhs, ret1,
|
||||||
|
"sel_ogt"))) {
|
||||||
|
HANDLE_FAILURE("LLVMBuildSelect");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!(ret3 = LLVMBuildSelect(comp_ctx->builder, lhs_nan, lhs, ret2,
|
||||||
|
"sel_lhs_nan"))) {
|
||||||
|
HANDLE_FAILURE("LLVMBuildSelect");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!(ret4 = LLVMBuildSelect(comp_ctx->builder, rhs_nan, rhs, ret3,
|
||||||
|
"sel_rhs_nan"))) {
|
||||||
|
HANDLE_FAILURE("LLVMBuildSelect");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return simd_bitcast_and_push_v128(comp_ctx, func_ctx, ret4, "result");
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool
|
||||||
|
simd_float_max(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx,
|
||||||
|
LLVMTypeRef vector_type)
|
||||||
|
{
|
||||||
|
LLVMValueRef lhs, rhs, lhs_nan, rhs_nan, olt_ret, ogt_ret, and_ret, ret1,
|
||||||
|
ret2, ret3, ret4;
|
||||||
|
|
||||||
|
if (!(rhs =
|
||||||
|
simd_pop_v128_and_bitcast(comp_ctx, func_ctx, vector_type, "rhs"))
|
||||||
|
|| !(lhs = simd_pop_v128_and_bitcast(comp_ctx, func_ctx, vector_type,
|
||||||
|
"lhs"))) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!(lhs_nan = LLVMBuildFCmp(comp_ctx->builder, LLVMRealUNO, lhs, lhs,
|
||||||
|
"lhs_nan"))) {
|
||||||
|
HANDLE_FAILURE("LLVMBuildFCmp + LLVMRealUNO");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!(rhs_nan = LLVMBuildFCmp(comp_ctx->builder, LLVMRealUNO, rhs, rhs,
|
||||||
|
"rhs_nan"))) {
|
||||||
|
HANDLE_FAILURE("LLVMBuildFCmp + LLVMRealUNO");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!(olt_ret = LLVMBuildFCmp(comp_ctx->builder, LLVMRealOLT, lhs, rhs,
|
||||||
|
"olt_ret"))) {
|
||||||
|
HANDLE_FAILURE("LLVMBuildFCmp + LLVMRealOLT");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!(ogt_ret = LLVMBuildFCmp(comp_ctx->builder, LLVMRealOGT, lhs, rhs,
|
||||||
|
"ogt_ret"))) {
|
||||||
|
HANDLE_FAILURE("LLVMBuildFCmp + LLVMRealOGT");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* lhs and rhs */
|
||||||
|
{
|
||||||
|
LLVMValueRef integer_l, integer_r, integer_and;
|
||||||
|
|
||||||
|
if (!(integer_l = LLVMBuildBitCast(comp_ctx->builder, lhs,
|
||||||
|
V128_i64x2_TYPE, "lhs_to_int"))) {
|
||||||
|
HANDLE_FAILURE("LLVMBuildBitCas");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!(integer_r = LLVMBuildBitCast(comp_ctx->builder, rhs,
|
||||||
|
V128_i64x2_TYPE, "rhs_to_int"))) {
|
||||||
|
HANDLE_FAILURE("LLVMBuildBitCas");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!(integer_and = LLVMBuildAnd(comp_ctx->builder, integer_l,
|
||||||
|
integer_r, "and"))) {
|
||||||
|
HANDLE_FAILURE("LLVMBuildOr");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!(and_ret = LLVMBuildBitCast(comp_ctx->builder, integer_and,
|
||||||
|
vector_type, "holder"))) {
|
||||||
|
HANDLE_FAILURE("LLVMBuildBitCast");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!(ret1 = LLVMBuildSelect(comp_ctx->builder, ogt_ret, lhs, and_ret,
|
||||||
|
"sel_ogt"))) {
|
||||||
|
HANDLE_FAILURE("LLVMBuildSelect");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!(ret2 = LLVMBuildSelect(comp_ctx->builder, olt_ret, rhs, ret1,
|
||||||
|
"sel_olt"))) {
|
||||||
|
HANDLE_FAILURE("LLVMBuildSelect");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!(ret3 = LLVMBuildSelect(comp_ctx->builder, lhs_nan, lhs, ret2,
|
||||||
|
"sel_lhs_nan"))) {
|
||||||
|
HANDLE_FAILURE("LLVMBuildSelect");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!(ret4 = LLVMBuildSelect(comp_ctx->builder, rhs_nan, rhs, ret3,
|
||||||
|
"sel_rhs_nan"))) {
|
||||||
|
HANDLE_FAILURE("LLVMBuildSelect");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return simd_bitcast_and_push_v128(comp_ctx, func_ctx, ret4, "result");
|
||||||
}
|
}
|
||||||
|
|
||||||
/*TODO: sugggest non-IA platforms check with "llvm.minimum.*" and
|
|
||||||
* "llvm.maximum.*" firstly */
|
|
||||||
bool
|
bool
|
||||||
aot_compile_simd_f32x4_min_max(AOTCompContext *comp_ctx,
|
aot_compile_simd_f32x4_min_max(AOTCompContext *comp_ctx,
|
||||||
AOTFuncContext *func_ctx, bool run_min)
|
AOTFuncContext *func_ctx, bool run_min)
|
||||||
|
{
|
||||||
|
return run_min ? simd_float_min(comp_ctx, func_ctx, V128_f32x4_TYPE)
|
||||||
|
: simd_float_max(comp_ctx, func_ctx, V128_f32x4_TYPE);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
aot_compile_simd_f64x2_min_max(AOTCompContext *comp_ctx,
|
||||||
|
AOTFuncContext *func_ctx, bool run_min)
|
||||||
|
{
|
||||||
|
return run_min ? simd_float_min(comp_ctx, func_ctx, V128_f64x2_TYPE)
|
||||||
|
: simd_float_max(comp_ctx, func_ctx, V128_f64x2_TYPE);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
aot_compile_simd_f32x4_pmin_pmax(AOTCompContext *comp_ctx,
|
||||||
|
AOTFuncContext *func_ctx, bool run_min)
|
||||||
{
|
{
|
||||||
return simd_float_cmp(comp_ctx, func_ctx, run_min ? FLOAT_MIN : FLOAT_MAX,
|
return simd_float_cmp(comp_ctx, func_ctx, run_min ? FLOAT_MIN : FLOAT_MAX,
|
||||||
V128_f32x4_TYPE);
|
V128_f32x4_TYPE);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
aot_compile_simd_f64x2_min_max(AOTCompContext *comp_ctx,
|
aot_compile_simd_f64x2_pmin_pmax(AOTCompContext *comp_ctx,
|
||||||
AOTFuncContext *func_ctx, bool run_min)
|
AOTFuncContext *func_ctx, bool run_min)
|
||||||
{
|
{
|
||||||
return simd_float_cmp(comp_ctx, func_ctx, run_min ? FLOAT_MIN : FLOAT_MAX,
|
return simd_float_cmp(comp_ctx, func_ctx, run_min ? FLOAT_MIN : FLOAT_MAX,
|
||||||
V128_f64x2_TYPE);
|
V128_f64x2_TYPE);
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool
|
|
||||||
simd_float_pmin_max(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx,
|
|
||||||
LLVMTypeRef vector_type, const char *intrinsic)
|
|
||||||
{
|
|
||||||
LLVMValueRef lhs, rhs, result;
|
|
||||||
LLVMTypeRef param_types[2];
|
|
||||||
|
|
||||||
param_types[0] = vector_type;
|
|
||||||
param_types[1] = vector_type;
|
|
||||||
|
|
||||||
if (!(rhs =
|
|
||||||
simd_pop_v128_and_bitcast(comp_ctx, func_ctx, vector_type, "rhs"))
|
|
||||||
|| !(lhs = simd_pop_v128_and_bitcast(comp_ctx, func_ctx, vector_type,
|
|
||||||
"lhs"))) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!(result =
|
|
||||||
aot_call_llvm_intrinsic(comp_ctx, func_ctx, intrinsic,
|
|
||||||
vector_type, param_types, 2, lhs, rhs))) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return simd_bitcast_and_push_v128(comp_ctx, func_ctx, result, "result");
|
|
||||||
}
|
|
||||||
|
|
||||||
bool
|
|
||||||
aot_compile_simd_f32x4_pmin_pmax(AOTCompContext *comp_ctx,
|
|
||||||
AOTFuncContext *func_ctx, bool run_min)
|
|
||||||
{
|
|
||||||
return simd_float_pmin_max(comp_ctx, func_ctx, V128_f32x4_TYPE,
|
|
||||||
run_min ? "llvm.minnum.v4f32"
|
|
||||||
: "llvm.maxnum.v4f32");
|
|
||||||
}
|
|
||||||
|
|
||||||
bool
|
|
||||||
aot_compile_simd_f64x2_pmin_pmax(AOTCompContext *comp_ctx,
|
|
||||||
AOTFuncContext *func_ctx, bool run_min)
|
|
||||||
{
|
|
||||||
return simd_float_pmin_max(comp_ctx, func_ctx, V128_f64x2_TYPE,
|
|
||||||
run_min ? "llvm.minnum.v2f64"
|
|
||||||
: "llvm.maxnum.v2f64");
|
|
||||||
}
|
|
||||||
|
|
||||||
bool
|
bool
|
||||||
aot_compile_simd_f64x2_demote(AOTCompContext *comp_ctx,
|
aot_compile_simd_f64x2_demote(AOTCompContext *comp_ctx,
|
||||||
AOTFuncContext *func_ctx)
|
AOTFuncContext *func_ctx)
|
||||||
|
|
|
@ -298,7 +298,15 @@ fail:
|
||||||
|
|
||||||
/* macros for integer binary operations (ibinop) */
|
/* macros for integer binary operations (ibinop) */
|
||||||
|
|
||||||
|
#if defined(__GNUC__)
|
||||||
|
#define NO_SANITIZER_INTEGER \
|
||||||
|
__attribute__((no_sanitize("signed-integer-overflow")))
|
||||||
|
#else
|
||||||
|
#define NO_SANITIZER_INTEGER
|
||||||
|
#endif
|
||||||
|
|
||||||
#define __DEF_BI_INT_CONST_OPS(bits, opname, op) \
|
#define __DEF_BI_INT_CONST_OPS(bits, opname, op) \
|
||||||
|
NO_SANITIZER_INTEGER \
|
||||||
static int##bits do_i##bits##_const_##opname(int##bits lhs, int##bits rhs) \
|
static int##bits do_i##bits##_const_##opname(int##bits lhs, int##bits rhs) \
|
||||||
{ \
|
{ \
|
||||||
return lhs op rhs; \
|
return lhs op rhs; \
|
||||||
|
|
|
@ -311,7 +311,7 @@ wasm_runtime_is_xip_file(const uint8_t *buf, uint32_t size);
|
||||||
/**
|
/**
|
||||||
* Callback to load a module file into a buffer in multi-module feature
|
* Callback to load a module file into a buffer in multi-module feature
|
||||||
*/
|
*/
|
||||||
typedef bool (*module_reader)(const char *module_name,
|
typedef bool (*module_reader)(package_type_t module_type,const char *module_name,
|
||||||
uint8_t **p_buffer, uint32_t *p_size);
|
uint8_t **p_buffer, uint32_t *p_size);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -894,6 +894,27 @@ wasm_runtime_set_exception(wasm_module_inst_t module_inst,
|
||||||
WASM_RUNTIME_API_EXTERN void
|
WASM_RUNTIME_API_EXTERN void
|
||||||
wasm_runtime_clear_exception(wasm_module_inst_t module_inst);
|
wasm_runtime_clear_exception(wasm_module_inst_t module_inst);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Terminate the WASM module instance.
|
||||||
|
*
|
||||||
|
* This function causes the module instance fail as if it raised a trap.
|
||||||
|
*
|
||||||
|
* This is intended to be used in situations like:
|
||||||
|
*
|
||||||
|
* - A thread is executing the WASM module instance
|
||||||
|
* (eg. it's in the middle of `wasm_application_execute_main`)
|
||||||
|
*
|
||||||
|
* - Another thread has a copy of `wasm_module_inst_t` of
|
||||||
|
* the module instance and wants to terminate it asynchronously.
|
||||||
|
*
|
||||||
|
* This function is provided only when WAMR is built with threading enabled.
|
||||||
|
* (`WASM_ENABLE_THREAD_MGR=1`)
|
||||||
|
*
|
||||||
|
* @param module_inst the WASM module instance
|
||||||
|
*/
|
||||||
|
WASM_RUNTIME_API_EXTERN void
|
||||||
|
wasm_runtime_terminate(wasm_module_inst_t module_inst);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set custom data to WASM module instance.
|
* Set custom data to WASM module instance.
|
||||||
* Note:
|
* Note:
|
||||||
|
@ -1439,6 +1460,136 @@ WASM_RUNTIME_API_EXTERN bool
|
||||||
wasm_runtime_is_import_global_linked(const char *module_name,
|
wasm_runtime_is_import_global_linked(const char *module_name,
|
||||||
const char *global_name);
|
const char *global_name);
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
INTERNAL_ERROR,
|
||||||
|
MAX_SIZE_REACHED,
|
||||||
|
} enlarge_memory_error_reason_t;
|
||||||
|
|
||||||
|
typedef void (*enlarge_memory_error_callback_t)(
|
||||||
|
uint32_t inc_page_count, uint64_t current_memory_size,
|
||||||
|
uint32_t memory_index, enlarge_memory_error_reason_t failure_reason,
|
||||||
|
wasm_module_inst_t instance, wasm_exec_env_t exec_env,
|
||||||
|
void* user_data);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Setup callback invoked when memory.grow fails
|
||||||
|
*/
|
||||||
|
WASM_RUNTIME_API_EXTERN void
|
||||||
|
wasm_runtime_set_enlarge_mem_error_callback(
|
||||||
|
const enlarge_memory_error_callback_t callback, void *user_data);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* module instance context APIs
|
||||||
|
* wasm_runtime_create_context_key
|
||||||
|
* wasm_runtime_destroy_context_key
|
||||||
|
* wasm_runtime_set_context
|
||||||
|
* wasm_runtime_set_context_spread
|
||||||
|
* wasm_runtime_get_context
|
||||||
|
*
|
||||||
|
* This set of APIs is intended to be used by an embedder which provides
|
||||||
|
* extra sets of native functions, which need per module instance state
|
||||||
|
* and are maintained outside of the WAMR tree.
|
||||||
|
*
|
||||||
|
* It's modelled after the pthread specific API.
|
||||||
|
*
|
||||||
|
* wasm_runtime_set_context_spread is similar to
|
||||||
|
* wasm_runtime_set_context, except that
|
||||||
|
* wasm_runtime_set_context_spread applies the change
|
||||||
|
* to all threads in the cluster.
|
||||||
|
* It's an undefined behavior if multiple threads in a cluster call
|
||||||
|
* wasm_runtime_set_context_spread on the same key
|
||||||
|
* simultaneously. It's a caller's resposibility to perform necessary
|
||||||
|
* serialization if necessary. For example:
|
||||||
|
*
|
||||||
|
* if (wasm_runtime_get_context(inst, key) == NULL) {
|
||||||
|
* newctx = alloc_and_init(...);
|
||||||
|
* lock(some_lock);
|
||||||
|
* if (wasm_runtime_get_context(inst, key) == NULL) {
|
||||||
|
* // this thread won the race
|
||||||
|
* wasm_runtime_set_context_spread(inst, key, newctx);
|
||||||
|
* newctx = NULL;
|
||||||
|
* }
|
||||||
|
* unlock(some_lock);
|
||||||
|
* if (newctx != NULL) {
|
||||||
|
* // this thread lost the race, free it
|
||||||
|
* cleanup_and_free(newctx);
|
||||||
|
* }
|
||||||
|
* }
|
||||||
|
*
|
||||||
|
* Note: dynamic key create/destroy while instances are live is not
|
||||||
|
* implemented as of writing this.
|
||||||
|
* it's caller's resposibility to ensure destorying all module instances
|
||||||
|
* before calling wasm_runtime_create_context_key or
|
||||||
|
* wasm_runtime_destroy_context_key.
|
||||||
|
* otherwise, it's an undefined behavior.
|
||||||
|
*
|
||||||
|
* Note about threads:
|
||||||
|
* - When spawning a thread, the contexts (the pointers given to
|
||||||
|
* wasm_runtime_set_context) are copied from the parent
|
||||||
|
* instance.
|
||||||
|
* - The destructor is called only on the main instance.
|
||||||
|
*/
|
||||||
|
|
||||||
|
WASM_RUNTIME_API_EXTERN void *
|
||||||
|
wasm_runtime_create_context_key(
|
||||||
|
void (*dtor)(wasm_module_inst_t inst, void *ctx));
|
||||||
|
|
||||||
|
WASM_RUNTIME_API_EXTERN void
|
||||||
|
wasm_runtime_destroy_context_key(void *key);
|
||||||
|
|
||||||
|
WASM_RUNTIME_API_EXTERN void
|
||||||
|
wasm_runtime_set_context(wasm_module_inst_t inst, void *key,
|
||||||
|
void *ctx);
|
||||||
|
WASM_RUNTIME_API_EXTERN void
|
||||||
|
wasm_runtime_set_context_spread(wasm_module_inst_t inst, void *key,
|
||||||
|
void *ctx);
|
||||||
|
WASM_RUNTIME_API_EXTERN void *
|
||||||
|
wasm_runtime_get_context(wasm_module_inst_t inst, void *key);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* wasm_runtime_begin_blocking_op/wasm_runtime_end_blocking_op
|
||||||
|
*
|
||||||
|
* These APIs are intended to be used by the implementations of
|
||||||
|
* host functions. It wraps an operation which possibly blocks for long
|
||||||
|
* to prepare for async termination.
|
||||||
|
*
|
||||||
|
* eg.
|
||||||
|
*
|
||||||
|
* if (!wasm_runtime_begin_blocking_op(exec_env)) {
|
||||||
|
* return EINTR;
|
||||||
|
* }
|
||||||
|
* ret = possibly_blocking_op();
|
||||||
|
* wasm_runtime_end_blocking_op(exec_env);
|
||||||
|
* return ret;
|
||||||
|
*
|
||||||
|
* If threading support (WASM_ENABLE_THREAD_MGR) is not enabled,
|
||||||
|
* these functions are no-op.
|
||||||
|
*
|
||||||
|
* If the underlying platform support (OS_ENABLE_WAKEUP_BLOCKING_OP) is
|
||||||
|
* not available, these functions are no-op. In that case, the runtime
|
||||||
|
* might not terminate a blocking thread in a timely manner.
|
||||||
|
*
|
||||||
|
* If the underlying platform support is available, it's used to wake up
|
||||||
|
* the thread for async termination. The expectation here is that a
|
||||||
|
* `os_wakeup_blocking_op` call makes the blocking operation
|
||||||
|
* (`possibly_blocking_op` in the above example) return in a timely manner.
|
||||||
|
*
|
||||||
|
* The actual wake up mechanism used by `os_wakeup_blocking_op` is
|
||||||
|
* platform-dependent. It might impose some platform-dependent restrictions
|
||||||
|
* on the implementation of the blocking opearation.
|
||||||
|
*
|
||||||
|
* For example, on POSIX-like platforms, a signal (by default SIGUSR1) is
|
||||||
|
* used. The signal delivery configurations (eg. signal handler, signal mask,
|
||||||
|
* etc) for the signal are set up by the runtime. You can change the signal
|
||||||
|
* to use for this purpose by calling os_set_signal_number_for_blocking_op
|
||||||
|
* before the runtime initialization.
|
||||||
|
*/
|
||||||
|
WASM_RUNTIME_API_EXTERN bool
|
||||||
|
wasm_runtime_begin_blocking_op(wasm_exec_env_t exec_env);
|
||||||
|
|
||||||
|
WASM_RUNTIME_API_EXTERN void
|
||||||
|
wasm_runtime_end_blocking_op(wasm_exec_env_t exec_env);
|
||||||
|
|
||||||
/* clang-format on */
|
/* clang-format on */
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
|
|
@ -1418,6 +1418,8 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module,
|
||||||
while (node_cache) {
|
while (node_cache) {
|
||||||
node_next = bh_list_elem_next(node_cache);
|
node_next = bh_list_elem_next(node_cache);
|
||||||
if (node_cache->br_table_op_addr == frame_ip - 1) {
|
if (node_cache->br_table_op_addr == frame_ip - 1) {
|
||||||
|
if (lidx > node_cache->br_count)
|
||||||
|
lidx = node_cache->br_count;
|
||||||
depth = node_cache->br_depths[lidx];
|
depth = node_cache->br_depths[lidx];
|
||||||
goto label_pop_csp_n;
|
goto label_pop_csp_n;
|
||||||
}
|
}
|
||||||
|
@ -4209,7 +4211,6 @@ wasm_interp_call_wasm(WASMModuleInstance *module_inst, WASMExecEnv *exec_env,
|
||||||
unsigned frame_size = wasm_interp_interp_frame_size(all_cell_num);
|
unsigned frame_size = wasm_interp_interp_frame_size(all_cell_num);
|
||||||
unsigned i;
|
unsigned i;
|
||||||
bool copy_argv_from_frame = true;
|
bool copy_argv_from_frame = true;
|
||||||
char exception[EXCEPTION_BUF_LEN];
|
|
||||||
|
|
||||||
if (argc < function->param_cell_num) {
|
if (argc < function->param_cell_num) {
|
||||||
char buf[128];
|
char buf[128];
|
||||||
|
@ -4342,8 +4343,6 @@ wasm_interp_call_wasm(WASMModuleInstance *module_inst, WASMExecEnv *exec_env,
|
||||||
wasm_interp_dump_call_stack(exec_env, true, NULL, 0);
|
wasm_interp_dump_call_stack(exec_env, true, NULL, 0);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
wasm_copy_exception(module_inst, exception);
|
|
||||||
LOG_DEBUG("meet an exception %s", exception);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
wasm_exec_env_set_cur_frame(exec_env, prev_frame);
|
wasm_exec_env_set_cur_frame(exec_env, prev_frame);
|
||||||
|
|
|
@ -3945,7 +3945,6 @@ wasm_interp_call_wasm(WASMModuleInstance *module_inst, WASMExecEnv *exec_env,
|
||||||
/* This frame won't be used by JITed code, so only allocate interp
|
/* This frame won't be used by JITed code, so only allocate interp
|
||||||
frame here. */
|
frame here. */
|
||||||
unsigned frame_size = wasm_interp_interp_frame_size(all_cell_num);
|
unsigned frame_size = wasm_interp_interp_frame_size(all_cell_num);
|
||||||
char exception[EXCEPTION_BUF_LEN];
|
|
||||||
|
|
||||||
if (argc < function->param_cell_num) {
|
if (argc < function->param_cell_num) {
|
||||||
char buf[128];
|
char buf[128];
|
||||||
|
@ -4030,8 +4029,6 @@ wasm_interp_call_wasm(WASMModuleInstance *module_inst, WASMExecEnv *exec_env,
|
||||||
wasm_interp_dump_call_stack(exec_env, true, NULL, 0);
|
wasm_interp_dump_call_stack(exec_env, true, NULL, 0);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
wasm_copy_exception(module_inst, exception);
|
|
||||||
LOG_DEBUG("meet an exception %s", exception);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
wasm_exec_env_set_cur_frame(exec_env, prev_frame);
|
wasm_exec_env_set_cur_frame(exec_env, prev_frame);
|
||||||
|
|
|
@ -694,34 +694,10 @@ wasm_loader_find_export(const WASMModule *module, const char *module_name,
|
||||||
const char *field_name, uint8 export_kind,
|
const char *field_name, uint8 export_kind,
|
||||||
char *error_buf, uint32 error_buf_size)
|
char *error_buf, uint32 error_buf_size)
|
||||||
{
|
{
|
||||||
WASMExport *export;
|
WASMExport *export =
|
||||||
uint32 i;
|
loader_find_export((WASMModuleCommon *)module, module_name, field_name,
|
||||||
|
export_kind, error_buf, error_buf_size);
|
||||||
for (i = 0, export = module->exports; i < module->export_count;
|
;
|
||||||
++i, ++export) {
|
|
||||||
/**
|
|
||||||
* need to consider a scenario that different kinds of exports
|
|
||||||
* may have the same name, like
|
|
||||||
* (table (export "m1" "exported") 10 funcref)
|
|
||||||
* (memory (export "m1" "exported") 10)
|
|
||||||
**/
|
|
||||||
if (export->kind == export_kind && !strcmp(field_name, export->name)) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (i == module->export_count) {
|
|
||||||
LOG_DEBUG("can not find an export %d named %s in the module %s",
|
|
||||||
export_kind, field_name, module_name);
|
|
||||||
set_error_buf(error_buf, error_buf_size,
|
|
||||||
"unknown import or incompatible import type");
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
(void)module_name;
|
|
||||||
|
|
||||||
/* since there is a validation in load_export_section(), it is for sure
|
|
||||||
* export->index is valid*/
|
|
||||||
return export;
|
return export;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -912,152 +888,6 @@ wasm_loader_resolve_global(const char *module_name, const char *global_name,
|
||||||
return global;
|
return global;
|
||||||
}
|
}
|
||||||
|
|
||||||
static WASMModule *
|
|
||||||
search_sub_module(const WASMModule *parent_module, const char *sub_module_name)
|
|
||||||
{
|
|
||||||
WASMRegisteredModule *node =
|
|
||||||
bh_list_first_elem(parent_module->import_module_list);
|
|
||||||
while (node && strcmp(sub_module_name, node->module_name)) {
|
|
||||||
node = bh_list_elem_next(node);
|
|
||||||
}
|
|
||||||
return node ? (WASMModule *)node->module : NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool
|
|
||||||
register_sub_module(const WASMModule *parent_module,
|
|
||||||
const char *sub_module_name, WASMModule *sub_module)
|
|
||||||
{
|
|
||||||
/* register sub_module into its parent sub module list */
|
|
||||||
WASMRegisteredModule *node = NULL;
|
|
||||||
bh_list_status ret;
|
|
||||||
|
|
||||||
if (search_sub_module(parent_module, sub_module_name)) {
|
|
||||||
LOG_DEBUG("%s has been registered in its parent", sub_module_name);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
node = loader_malloc(sizeof(WASMRegisteredModule), NULL, 0);
|
|
||||||
if (!node) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
node->module_name = sub_module_name;
|
|
||||||
node->module = (WASMModuleCommon *)sub_module;
|
|
||||||
ret = bh_list_insert(parent_module->import_module_list, node);
|
|
||||||
bh_assert(BH_LIST_SUCCESS == ret);
|
|
||||||
(void)ret;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
static WASMModule *
|
|
||||||
load_depended_module(const WASMModule *parent_module,
|
|
||||||
const char *sub_module_name, char *error_buf,
|
|
||||||
uint32 error_buf_size)
|
|
||||||
{
|
|
||||||
WASMModule *sub_module = NULL;
|
|
||||||
bool ret = false;
|
|
||||||
uint8 *buffer = NULL;
|
|
||||||
uint32 buffer_size = 0;
|
|
||||||
const module_reader reader = wasm_runtime_get_module_reader();
|
|
||||||
const module_destroyer destroyer = wasm_runtime_get_module_destroyer();
|
|
||||||
|
|
||||||
/* check the registered module list of the parent */
|
|
||||||
sub_module = search_sub_module(parent_module, sub_module_name);
|
|
||||||
if (sub_module) {
|
|
||||||
LOG_DEBUG("%s has been loaded before", sub_module_name);
|
|
||||||
return sub_module;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* check the global registered module list */
|
|
||||||
sub_module =
|
|
||||||
(WASMModule *)wasm_runtime_find_module_registered(sub_module_name);
|
|
||||||
if (sub_module) {
|
|
||||||
LOG_DEBUG("%s has been loaded", sub_module_name);
|
|
||||||
goto register_sub_module;
|
|
||||||
}
|
|
||||||
|
|
||||||
LOG_VERBOSE("loading %s", sub_module_name);
|
|
||||||
|
|
||||||
if (!reader) {
|
|
||||||
set_error_buf_v(error_buf, error_buf_size,
|
|
||||||
"no sub module reader to load %s", sub_module_name);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* start to maintain a loading module list */
|
|
||||||
ret = wasm_runtime_is_loading_module(sub_module_name);
|
|
||||||
if (ret) {
|
|
||||||
set_error_buf_v(error_buf, error_buf_size,
|
|
||||||
"found circular dependency on %s", sub_module_name);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = wasm_runtime_add_loading_module(sub_module_name, error_buf,
|
|
||||||
error_buf_size);
|
|
||||||
if (!ret) {
|
|
||||||
LOG_DEBUG("can not add %s into loading module list\n", sub_module_name);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = reader(sub_module_name, &buffer, &buffer_size);
|
|
||||||
if (!ret) {
|
|
||||||
LOG_DEBUG("read the file of %s failed", sub_module_name);
|
|
||||||
set_error_buf_v(error_buf, error_buf_size, "unknown import",
|
|
||||||
sub_module_name);
|
|
||||||
goto delete_loading_module;
|
|
||||||
}
|
|
||||||
|
|
||||||
sub_module =
|
|
||||||
wasm_loader_load(buffer, buffer_size, false, error_buf, error_buf_size);
|
|
||||||
if (!sub_module) {
|
|
||||||
LOG_DEBUG("error: can not load the sub_module %s", sub_module_name);
|
|
||||||
/* others will be destroyed in runtime_destroy() */
|
|
||||||
goto destroy_file_buffer;
|
|
||||||
}
|
|
||||||
|
|
||||||
wasm_runtime_delete_loading_module(sub_module_name);
|
|
||||||
|
|
||||||
/* register on a global list */
|
|
||||||
ret = wasm_runtime_register_module_internal(
|
|
||||||
sub_module_name, (WASMModuleCommon *)sub_module, buffer, buffer_size,
|
|
||||||
error_buf, error_buf_size);
|
|
||||||
if (!ret) {
|
|
||||||
LOG_DEBUG("error: can not register module %s globally\n",
|
|
||||||
sub_module_name);
|
|
||||||
/* others will be unloaded in runtime_destroy() */
|
|
||||||
goto unload_module;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* register into its parent list */
|
|
||||||
register_sub_module:
|
|
||||||
ret = register_sub_module(parent_module, sub_module_name, sub_module);
|
|
||||||
if (!ret) {
|
|
||||||
set_error_buf_v(error_buf, error_buf_size,
|
|
||||||
"failed to register sub module %s", sub_module_name);
|
|
||||||
/* since it is in the global module list, no need to
|
|
||||||
* unload the module. the runtime_destroy() will do it
|
|
||||||
*/
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
return sub_module;
|
|
||||||
|
|
||||||
unload_module:
|
|
||||||
wasm_loader_unload(sub_module);
|
|
||||||
|
|
||||||
destroy_file_buffer:
|
|
||||||
if (destroyer) {
|
|
||||||
destroyer(buffer, buffer_size);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
LOG_WARNING("need to release the reading buffer of %s manually",
|
|
||||||
sub_module_name);
|
|
||||||
}
|
|
||||||
|
|
||||||
delete_loading_module:
|
|
||||||
wasm_runtime_delete_loading_module(sub_module_name);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
#endif /* end of WASM_ENABLE_MULTI_MODULE */
|
#endif /* end of WASM_ENABLE_MULTI_MODULE */
|
||||||
|
|
||||||
static bool
|
static bool
|
||||||
|
@ -1104,8 +934,9 @@ load_function_import(const uint8 **p_buf, const uint8 *buf_end,
|
||||||
#if WASM_ENABLE_MULTI_MODULE != 0
|
#if WASM_ENABLE_MULTI_MODULE != 0
|
||||||
else {
|
else {
|
||||||
if (!wasm_runtime_is_built_in_module(sub_module_name)) {
|
if (!wasm_runtime_is_built_in_module(sub_module_name)) {
|
||||||
sub_module = load_depended_module(parent_module, sub_module_name,
|
sub_module = (WASMModule *)wasm_runtime_load_depended_module(
|
||||||
error_buf, error_buf_size);
|
(WASMModuleCommon *)parent_module, sub_module_name, error_buf,
|
||||||
|
error_buf_size);
|
||||||
if (!sub_module) {
|
if (!sub_module) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -1193,8 +1024,9 @@ load_table_import(const uint8 **p_buf, const uint8 *buf_end,
|
||||||
|
|
||||||
#if WASM_ENABLE_MULTI_MODULE != 0
|
#if WASM_ENABLE_MULTI_MODULE != 0
|
||||||
if (!wasm_runtime_is_built_in_module(sub_module_name)) {
|
if (!wasm_runtime_is_built_in_module(sub_module_name)) {
|
||||||
sub_module = load_depended_module(parent_module, sub_module_name,
|
sub_module = (WASMModule *)wasm_runtime_load_depended_module(
|
||||||
error_buf, error_buf_size);
|
(WASMModuleCommon *)parent_module, sub_module_name, error_buf,
|
||||||
|
error_buf_size);
|
||||||
if (!sub_module) {
|
if (!sub_module) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -1327,8 +1159,9 @@ load_memory_import(const uint8 **p_buf, const uint8 *buf_end,
|
||||||
|
|
||||||
#if WASM_ENABLE_MULTI_MODULE != 0
|
#if WASM_ENABLE_MULTI_MODULE != 0
|
||||||
if (!wasm_runtime_is_built_in_module(sub_module_name)) {
|
if (!wasm_runtime_is_built_in_module(sub_module_name)) {
|
||||||
sub_module = load_depended_module(parent_module, sub_module_name,
|
sub_module = (WASMModule *)wasm_runtime_load_depended_module(
|
||||||
error_buf, error_buf_size);
|
(WASMModuleCommon *)parent_module, sub_module_name, error_buf,
|
||||||
|
error_buf_size);
|
||||||
if (!sub_module) {
|
if (!sub_module) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -1427,8 +1260,9 @@ load_global_import(const uint8 **p_buf, const uint8 *buf_end,
|
||||||
#if WASM_ENABLE_MULTI_MODULE != 0
|
#if WASM_ENABLE_MULTI_MODULE != 0
|
||||||
if (!global->is_linked
|
if (!global->is_linked
|
||||||
&& !wasm_runtime_is_built_in_module(sub_module_name)) {
|
&& !wasm_runtime_is_built_in_module(sub_module_name)) {
|
||||||
sub_module = load_depended_module(parent_module, sub_module_name,
|
sub_module = (WASMModule *)wasm_runtime_load_depended_module(
|
||||||
error_buf, error_buf_size);
|
(WASMModuleCommon *)parent_module, sub_module_name, error_buf,
|
||||||
|
error_buf_size);
|
||||||
if (!sub_module) {
|
if (!sub_module) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -5476,6 +5310,7 @@ wasm_loader_pop_frame_ref(WASMLoaderContext *ctx, uint8 type, char *error_buf,
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if WASM_ENABLE_FAST_INTERP == 0
|
||||||
static bool
|
static bool
|
||||||
wasm_loader_push_pop_frame_ref(WASMLoaderContext *ctx, uint8 pop_cnt,
|
wasm_loader_push_pop_frame_ref(WASMLoaderContext *ctx, uint8 pop_cnt,
|
||||||
uint8 type_push, uint8 type_pop, char *error_buf,
|
uint8 type_push, uint8 type_pop, char *error_buf,
|
||||||
|
@ -5490,6 +5325,7 @@ wasm_loader_push_pop_frame_ref(WASMLoaderContext *ctx, uint8 pop_cnt,
|
||||||
return false;
|
return false;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
static bool
|
static bool
|
||||||
wasm_loader_push_frame_csp(WASMLoaderContext *ctx, uint8 label_type,
|
wasm_loader_push_frame_csp(WASMLoaderContext *ctx, uint8 label_type,
|
||||||
|
@ -6166,27 +6002,6 @@ wasm_loader_pop_frame_offset(WASMLoaderContext *ctx, uint8 type,
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool
|
|
||||||
wasm_loader_push_pop_frame_offset(WASMLoaderContext *ctx, uint8 pop_cnt,
|
|
||||||
uint8 type_push, uint8 type_pop,
|
|
||||||
bool disable_emit, int16 operand_offset,
|
|
||||||
char *error_buf, uint32 error_buf_size)
|
|
||||||
{
|
|
||||||
uint8 i;
|
|
||||||
|
|
||||||
for (i = 0; i < pop_cnt; i++) {
|
|
||||||
if (!wasm_loader_pop_frame_offset(ctx, type_pop, error_buf,
|
|
||||||
error_buf_size))
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (!wasm_loader_push_frame_offset(ctx, type_push, disable_emit,
|
|
||||||
operand_offset, error_buf,
|
|
||||||
error_buf_size))
|
|
||||||
return false;
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool
|
static bool
|
||||||
wasm_loader_push_frame_ref_offset(WASMLoaderContext *ctx, uint8 type,
|
wasm_loader_push_frame_ref_offset(WASMLoaderContext *ctx, uint8 type,
|
||||||
bool disable_emit, int16 operand_offset,
|
bool disable_emit, int16 operand_offset,
|
||||||
|
@ -6220,12 +6035,24 @@ wasm_loader_push_pop_frame_ref_offset(WASMLoaderContext *ctx, uint8 pop_cnt,
|
||||||
bool disable_emit, int16 operand_offset,
|
bool disable_emit, int16 operand_offset,
|
||||||
char *error_buf, uint32 error_buf_size)
|
char *error_buf, uint32 error_buf_size)
|
||||||
{
|
{
|
||||||
if (!wasm_loader_push_pop_frame_offset(ctx, pop_cnt, type_push, type_pop,
|
uint8 i;
|
||||||
disable_emit, operand_offset,
|
|
||||||
error_buf, error_buf_size))
|
for (i = 0; i < pop_cnt; i++) {
|
||||||
|
if (!wasm_loader_pop_frame_offset(ctx, type_pop, error_buf,
|
||||||
|
error_buf_size))
|
||||||
return false;
|
return false;
|
||||||
if (!wasm_loader_push_pop_frame_ref(ctx, pop_cnt, type_push, type_pop,
|
|
||||||
error_buf, error_buf_size))
|
if (!wasm_loader_pop_frame_ref(ctx, type_pop, error_buf,
|
||||||
|
error_buf_size))
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!wasm_loader_push_frame_offset(ctx, type_push, disable_emit,
|
||||||
|
operand_offset, error_buf,
|
||||||
|
error_buf_size))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (!wasm_loader_push_frame_ref(ctx, type_push, error_buf, error_buf_size))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
|
|
@ -3937,6 +3937,7 @@ wasm_loader_pop_frame_ref(WASMLoaderContext *ctx, uint8 type, char *error_buf,
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if WASM_ENABLE_FAST_INTERP == 0
|
||||||
static bool
|
static bool
|
||||||
wasm_loader_push_pop_frame_ref(WASMLoaderContext *ctx, uint8 pop_cnt,
|
wasm_loader_push_pop_frame_ref(WASMLoaderContext *ctx, uint8 pop_cnt,
|
||||||
uint8 type_push, uint8 type_pop, char *error_buf,
|
uint8 type_push, uint8 type_pop, char *error_buf,
|
||||||
|
@ -3951,6 +3952,7 @@ wasm_loader_push_pop_frame_ref(WASMLoaderContext *ctx, uint8 pop_cnt,
|
||||||
return false;
|
return false;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
static bool
|
static bool
|
||||||
wasm_loader_push_frame_csp(WASMLoaderContext *ctx, uint8 label_type,
|
wasm_loader_push_frame_csp(WASMLoaderContext *ctx, uint8 label_type,
|
||||||
|
@ -4608,25 +4610,6 @@ wasm_loader_pop_frame_offset(WASMLoaderContext *ctx, uint8 type,
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool
|
|
||||||
wasm_loader_push_pop_frame_offset(WASMLoaderContext *ctx, uint8 pop_cnt,
|
|
||||||
uint8 type_push, uint8 type_pop,
|
|
||||||
bool disable_emit, int16 operand_offset,
|
|
||||||
char *error_buf, uint32 error_buf_size)
|
|
||||||
{
|
|
||||||
for (int i = 0; i < pop_cnt; i++) {
|
|
||||||
if (!wasm_loader_pop_frame_offset(ctx, type_pop, error_buf,
|
|
||||||
error_buf_size))
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (!wasm_loader_push_frame_offset(ctx, type_push, disable_emit,
|
|
||||||
operand_offset, error_buf,
|
|
||||||
error_buf_size))
|
|
||||||
return false;
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool
|
static bool
|
||||||
wasm_loader_push_frame_ref_offset(WASMLoaderContext *ctx, uint8 type,
|
wasm_loader_push_frame_ref_offset(WASMLoaderContext *ctx, uint8 type,
|
||||||
bool disable_emit, int16 operand_offset,
|
bool disable_emit, int16 operand_offset,
|
||||||
|
@ -4660,12 +4643,24 @@ wasm_loader_push_pop_frame_ref_offset(WASMLoaderContext *ctx, uint8 pop_cnt,
|
||||||
bool disable_emit, int16 operand_offset,
|
bool disable_emit, int16 operand_offset,
|
||||||
char *error_buf, uint32 error_buf_size)
|
char *error_buf, uint32 error_buf_size)
|
||||||
{
|
{
|
||||||
if (!wasm_loader_push_pop_frame_offset(ctx, pop_cnt, type_push, type_pop,
|
uint8 i;
|
||||||
disable_emit, operand_offset,
|
|
||||||
error_buf, error_buf_size))
|
for (i = 0; i < pop_cnt; i++) {
|
||||||
|
if (!wasm_loader_pop_frame_offset(ctx, type_pop, error_buf,
|
||||||
|
error_buf_size))
|
||||||
return false;
|
return false;
|
||||||
if (!wasm_loader_push_pop_frame_ref(ctx, pop_cnt, type_push, type_pop,
|
|
||||||
error_buf, error_buf_size))
|
if (!wasm_loader_pop_frame_ref(ctx, type_pop, error_buf,
|
||||||
|
error_buf_size))
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!wasm_loader_push_frame_offset(ctx, type_push, disable_emit,
|
||||||
|
operand_offset, error_buf,
|
||||||
|
error_buf_size))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (!wasm_loader_push_frame_ref(ctx, type_push, error_buf, error_buf_size))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
|
|
@ -51,11 +51,15 @@ set_error_buf_v(char *error_buf, uint32 error_buf_size, const char *format, ...)
|
||||||
}
|
}
|
||||||
|
|
||||||
WASMModule *
|
WASMModule *
|
||||||
wasm_load(uint8 *buf, uint32 size, char *error_buf, uint32 error_buf_size)
|
wasm_load(uint8 *buf, uint32 size,
|
||||||
|
#if WASM_ENABLE_MULTI_MODULE != 0
|
||||||
|
bool main_module,
|
||||||
|
#endif
|
||||||
|
char *error_buf, uint32 error_buf_size)
|
||||||
{
|
{
|
||||||
return wasm_loader_load(buf, size,
|
return wasm_loader_load(buf, size,
|
||||||
#if WASM_ENABLE_MULTI_MODULE != 0
|
#if WASM_ENABLE_MULTI_MODULE != 0
|
||||||
true,
|
main_module,
|
||||||
#endif
|
#endif
|
||||||
error_buf, error_buf_size);
|
error_buf, error_buf_size);
|
||||||
}
|
}
|
||||||
|
@ -1266,78 +1270,6 @@ execute_free_function(WASMModuleInstance *module_inst, WASMExecEnv *exec_env,
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if WASM_ENABLE_MULTI_MODULE != 0
|
|
||||||
static bool
|
|
||||||
sub_module_instantiate(WASMModule *module, WASMModuleInstance *module_inst,
|
|
||||||
uint32 stack_size, uint32 heap_size, char *error_buf,
|
|
||||||
uint32 error_buf_size)
|
|
||||||
{
|
|
||||||
bh_list *sub_module_inst_list = module_inst->e->sub_module_inst_list;
|
|
||||||
WASMRegisteredModule *sub_module_list_node =
|
|
||||||
bh_list_first_elem(module->import_module_list);
|
|
||||||
|
|
||||||
while (sub_module_list_node) {
|
|
||||||
WASMSubModInstNode *sub_module_inst_list_node = NULL;
|
|
||||||
WASMModule *sub_module = (WASMModule *)sub_module_list_node->module;
|
|
||||||
WASMModuleInstance *sub_module_inst = NULL;
|
|
||||||
|
|
||||||
sub_module_inst =
|
|
||||||
wasm_instantiate(sub_module, NULL, NULL, stack_size, heap_size,
|
|
||||||
error_buf, error_buf_size);
|
|
||||||
if (!sub_module_inst) {
|
|
||||||
LOG_DEBUG("instantiate %s failed",
|
|
||||||
sub_module_list_node->module_name);
|
|
||||||
goto failed;
|
|
||||||
}
|
|
||||||
|
|
||||||
sub_module_inst_list_node = runtime_malloc(sizeof(WASMSubModInstNode),
|
|
||||||
error_buf, error_buf_size);
|
|
||||||
if (!sub_module_inst_list_node) {
|
|
||||||
LOG_DEBUG("Malloc WASMSubModInstNode failed, SZ:%d",
|
|
||||||
sizeof(WASMSubModInstNode));
|
|
||||||
goto failed;
|
|
||||||
}
|
|
||||||
|
|
||||||
sub_module_inst_list_node->module_inst = sub_module_inst;
|
|
||||||
sub_module_inst_list_node->module_name =
|
|
||||||
sub_module_list_node->module_name;
|
|
||||||
bh_list_status ret =
|
|
||||||
bh_list_insert(sub_module_inst_list, sub_module_inst_list_node);
|
|
||||||
bh_assert(BH_LIST_SUCCESS == ret);
|
|
||||||
(void)ret;
|
|
||||||
|
|
||||||
sub_module_list_node = bh_list_elem_next(sub_module_list_node);
|
|
||||||
|
|
||||||
continue;
|
|
||||||
failed:
|
|
||||||
if (sub_module_inst_list_node) {
|
|
||||||
bh_list_remove(sub_module_inst_list, sub_module_inst_list_node);
|
|
||||||
wasm_runtime_free(sub_module_inst_list_node);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (sub_module_inst)
|
|
||||||
wasm_deinstantiate(sub_module_inst, false);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
sub_module_deinstantiate(WASMModuleInstance *module_inst)
|
|
||||||
{
|
|
||||||
bh_list *list = module_inst->e->sub_module_inst_list;
|
|
||||||
WASMSubModInstNode *node = bh_list_first_elem(list);
|
|
||||||
while (node) {
|
|
||||||
WASMSubModInstNode *next_node = bh_list_elem_next(node);
|
|
||||||
bh_list_remove(list, node);
|
|
||||||
wasm_deinstantiate(node->module_inst, false);
|
|
||||||
wasm_runtime_free(node);
|
|
||||||
node = next_node;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static bool
|
static bool
|
||||||
check_linked_symbol(WASMModuleInstance *module_inst, char *error_buf,
|
check_linked_symbol(WASMModuleInstance *module_inst, char *error_buf,
|
||||||
uint32 error_buf_size)
|
uint32 error_buf_size)
|
||||||
|
@ -1714,8 +1646,9 @@ wasm_instantiate(WASMModule *module, WASMModuleInstance *parent,
|
||||||
#if WASM_ENABLE_MULTI_MODULE != 0
|
#if WASM_ENABLE_MULTI_MODULE != 0
|
||||||
module_inst->e->sub_module_inst_list =
|
module_inst->e->sub_module_inst_list =
|
||||||
&module_inst->e->sub_module_inst_list_head;
|
&module_inst->e->sub_module_inst_list_head;
|
||||||
ret = sub_module_instantiate(module, module_inst, stack_size, heap_size,
|
ret = wasm_runtime_sub_module_instantiate(
|
||||||
error_buf, error_buf_size);
|
(WASMModuleCommon *)module, (WASMModuleInstanceCommon *)module_inst,
|
||||||
|
stack_size, heap_size, error_buf, error_buf_size);
|
||||||
if (!ret) {
|
if (!ret) {
|
||||||
LOG_DEBUG("build a sub module list failed");
|
LOG_DEBUG("build a sub module list failed");
|
||||||
goto fail;
|
goto fail;
|
||||||
|
@ -2198,7 +2131,8 @@ wasm_deinstantiate(WASMModuleInstance *module_inst, bool is_sub_inst)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if WASM_ENABLE_MULTI_MODULE != 0
|
#if WASM_ENABLE_MULTI_MODULE != 0
|
||||||
sub_module_deinstantiate(module_inst);
|
wasm_runtime_sub_module_deinstantiate(
|
||||||
|
(WASMModuleInstanceCommon *)module_inst);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (module_inst->memory_count > 0)
|
if (module_inst->memory_count > 0)
|
||||||
|
@ -2234,12 +2168,10 @@ wasm_deinstantiate(WASMModuleInstance *module_inst, bool is_sub_inst)
|
||||||
wasm_runtime_free(module_inst->e->common.c_api_func_imports);
|
wasm_runtime_free(module_inst->e->common.c_api_func_imports);
|
||||||
|
|
||||||
if (!is_sub_inst) {
|
if (!is_sub_inst) {
|
||||||
#if WASM_ENABLE_LIBC_WASI != 0
|
|
||||||
wasm_runtime_destroy_wasi((WASMModuleInstanceCommon *)module_inst);
|
|
||||||
#endif
|
|
||||||
#if WASM_ENABLE_WASI_NN != 0
|
#if WASM_ENABLE_WASI_NN != 0
|
||||||
wasi_nn_destroy(module_inst);
|
wasi_nn_destroy(module_inst);
|
||||||
#endif
|
#endif
|
||||||
|
wasm_native_call_context_dtors((WASMModuleInstanceCommon *)module_inst);
|
||||||
}
|
}
|
||||||
|
|
||||||
wasm_runtime_free(module_inst);
|
wasm_runtime_free(module_inst);
|
||||||
|
@ -2401,6 +2333,9 @@ wasm_call_function(WASMExecEnv *exec_env, WASMFunctionInstance *function,
|
||||||
/* set thread handle and stack boundary */
|
/* set thread handle and stack boundary */
|
||||||
wasm_exec_env_set_thread_info(exec_env);
|
wasm_exec_env_set_thread_info(exec_env);
|
||||||
|
|
||||||
|
/* set exec env so it can be later retrieved from instance */
|
||||||
|
module_inst->e->common.cur_exec_env = exec_env;
|
||||||
|
|
||||||
interp_call_wasm(module_inst, exec_env, function, argc, argv);
|
interp_call_wasm(module_inst, exec_env, function, argc, argv);
|
||||||
return !wasm_copy_exception(module_inst, NULL);
|
return !wasm_copy_exception(module_inst, NULL);
|
||||||
}
|
}
|
||||||
|
@ -2981,6 +2916,7 @@ wasm_interp_create_call_stack(struct WASMExecEnv *exec_env)
|
||||||
total_len += \
|
total_len += \
|
||||||
wasm_runtime_dump_line_buf_impl(line_buf, print, &buf, &len); \
|
wasm_runtime_dump_line_buf_impl(line_buf, print, &buf, &len); \
|
||||||
if ((!print) && buf && (len == 0)) { \
|
if ((!print) && buf && (len == 0)) { \
|
||||||
|
exception_unlock(module_inst); \
|
||||||
return total_len; \
|
return total_len; \
|
||||||
} \
|
} \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
@ -3005,6 +2941,7 @@ wasm_interp_dump_call_stack(struct WASMExecEnv *exec_env, bool print, char *buf,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
exception_lock(module_inst);
|
||||||
snprintf(line_buf, sizeof(line_buf), "\n");
|
snprintf(line_buf, sizeof(line_buf), "\n");
|
||||||
PRINT_OR_DUMP();
|
PRINT_OR_DUMP();
|
||||||
|
|
||||||
|
@ -3013,6 +2950,7 @@ wasm_interp_dump_call_stack(struct WASMExecEnv *exec_env, bool print, char *buf,
|
||||||
uint32 line_length, i;
|
uint32 line_length, i;
|
||||||
|
|
||||||
if (!bh_vector_get(module_inst->frames, n, &frame)) {
|
if (!bh_vector_get(module_inst->frames, n, &frame)) {
|
||||||
|
exception_unlock(module_inst);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3043,6 +2981,7 @@ wasm_interp_dump_call_stack(struct WASMExecEnv *exec_env, bool print, char *buf,
|
||||||
}
|
}
|
||||||
snprintf(line_buf, sizeof(line_buf), "\n");
|
snprintf(line_buf, sizeof(line_buf), "\n");
|
||||||
PRINT_OR_DUMP();
|
PRINT_OR_DUMP();
|
||||||
|
exception_unlock(module_inst);
|
||||||
|
|
||||||
return total_len + 1;
|
return total_len + 1;
|
||||||
}
|
}
|
||||||
|
|
|
@ -212,7 +212,10 @@ typedef struct CApiFuncImport {
|
||||||
|
|
||||||
/* The common part of WASMModuleInstanceExtra and AOTModuleInstanceExtra */
|
/* The common part of WASMModuleInstanceExtra and AOTModuleInstanceExtra */
|
||||||
typedef struct WASMModuleInstanceExtraCommon {
|
typedef struct WASMModuleInstanceExtraCommon {
|
||||||
|
void *contexts[WASM_MAX_INSTANCE_CONTEXTS];
|
||||||
CApiFuncImport *c_api_func_imports;
|
CApiFuncImport *c_api_func_imports;
|
||||||
|
/* pointer to the exec env currently used */
|
||||||
|
WASMExecEnv *cur_exec_env;
|
||||||
#if WASM_CONFIGUABLE_BOUNDS_CHECKS != 0
|
#if WASM_CONFIGUABLE_BOUNDS_CHECKS != 0
|
||||||
/* Disable bounds checks or not */
|
/* Disable bounds checks or not */
|
||||||
bool disable_bounds_checks;
|
bool disable_bounds_checks;
|
||||||
|
@ -297,12 +300,8 @@ struct WASMModuleInstance {
|
||||||
it denotes `AOTModule *` */
|
it denotes `AOTModule *` */
|
||||||
DefPointer(WASMModule *, module);
|
DefPointer(WASMModule *, module);
|
||||||
|
|
||||||
#if WASM_ENABLE_LIBC_WASI
|
DefPointer(void *, used_to_be_wasi_ctx); /* unused */
|
||||||
/* WASI context */
|
|
||||||
DefPointer(WASIContext *, wasi_ctx);
|
|
||||||
#else
|
|
||||||
DefPointer(void *, wasi_ctx);
|
|
||||||
#endif
|
|
||||||
DefPointer(WASMExecEnv *, exec_env_singleton);
|
DefPointer(WASMExecEnv *, exec_env_singleton);
|
||||||
/* Array of function pointers to import functions,
|
/* Array of function pointers to import functions,
|
||||||
not available in AOTModuleInstance */
|
not available in AOTModuleInstance */
|
||||||
|
@ -397,7 +396,11 @@ wasm_get_func_code_end(WASMFunctionInstance *func)
|
||||||
}
|
}
|
||||||
|
|
||||||
WASMModule *
|
WASMModule *
|
||||||
wasm_load(uint8 *buf, uint32 size, char *error_buf, uint32 error_buf_size);
|
wasm_load(uint8 *buf, uint32 size,
|
||||||
|
#if WASM_ENABLE_MULTI_MODULE != 0
|
||||||
|
bool main_module,
|
||||||
|
#endif
|
||||||
|
char *error_buf, uint32 error_buf_size);
|
||||||
|
|
||||||
WASMModule *
|
WASMModule *
|
||||||
wasm_load_from_sections(WASMSection *section_list, char *error_buf,
|
wasm_load_from_sections(WASMSection *section_list, char *error_buf,
|
||||||
|
@ -668,6 +671,16 @@ void
|
||||||
wasm_propagate_wasi_args(WASMModule *module);
|
wasm_propagate_wasi_args(WASMModule *module);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if WASM_ENABLE_THREAD_MGR != 0
|
||||||
|
void
|
||||||
|
exception_lock(WASMModuleInstance *module_inst);
|
||||||
|
void
|
||||||
|
exception_unlock(WASMModuleInstance *module_inst);
|
||||||
|
#else
|
||||||
|
#define exception_lock(module_inst) (void)(module_inst)
|
||||||
|
#define exception_unlock(module_inst) (void)(module_inst)
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -559,9 +559,6 @@ pthread_create_wrapper(wasm_exec_env_t exec_env,
|
||||||
uint32 thread_handle;
|
uint32 thread_handle;
|
||||||
uint32 stack_size = 8192;
|
uint32 stack_size = 8192;
|
||||||
int32 ret = -1;
|
int32 ret = -1;
|
||||||
#if WASM_ENABLE_LIBC_WASI != 0
|
|
||||||
WASIContext *wasi_ctx;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
bh_assert(module);
|
bh_assert(module);
|
||||||
bh_assert(module_inst);
|
bh_assert(module_inst);
|
||||||
|
@ -588,11 +585,7 @@ pthread_create_wrapper(wasm_exec_env_t exec_env,
|
||||||
wasm_runtime_set_custom_data_internal(
|
wasm_runtime_set_custom_data_internal(
|
||||||
new_module_inst, wasm_runtime_get_custom_data(module_inst));
|
new_module_inst, wasm_runtime_get_custom_data(module_inst));
|
||||||
|
|
||||||
#if WASM_ENABLE_LIBC_WASI != 0
|
wasm_native_inherit_contexts(new_module_inst, module_inst);
|
||||||
wasi_ctx = get_wasi_ctx(module_inst);
|
|
||||||
if (wasi_ctx)
|
|
||||||
wasm_runtime_set_wasi_ctx(new_module_inst, wasi_ctx);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (!(wasm_cluster_dup_c_api_imports(new_module_inst, module_inst)))
|
if (!(wasm_cluster_dup_c_api_imports(new_module_inst, module_inst)))
|
||||||
goto fail;
|
goto fail;
|
||||||
|
|
|
@ -23,7 +23,7 @@ include(FetchContent)
|
||||||
set(RATS_BUILD_MODE "sgx"
|
set(RATS_BUILD_MODE "sgx"
|
||||||
CACHE INTERNAL "Select build mode for librats(host|occlum|sgx|wasm)")
|
CACHE INTERNAL "Select build mode for librats(host|occlum|sgx|wasm)")
|
||||||
set(RATS_INSTALL_PATH "${CMAKE_BINARY_DIR}/librats" CACHE INTERNAL "")
|
set(RATS_INSTALL_PATH "${CMAKE_BINARY_DIR}/librats" CACHE INTERNAL "")
|
||||||
set(BUILD_SAMPLES OFF)
|
set(BUILD_SAMPLES OFF CACHE BOOL "Disable de compilation of the librats samples" FORCE)
|
||||||
|
|
||||||
FetchContent_Declare(
|
FetchContent_Declare(
|
||||||
librats
|
librats
|
||||||
|
|
|
@ -80,9 +80,6 @@ thread_spawn_wrapper(wasm_exec_env_t exec_env, uint32 start_arg)
|
||||||
int32 thread_id;
|
int32 thread_id;
|
||||||
uint32 stack_size = 8192;
|
uint32 stack_size = 8192;
|
||||||
int32 ret = -1;
|
int32 ret = -1;
|
||||||
#if WASM_ENABLE_LIBC_WASI != 0
|
|
||||||
WASIContext *wasi_ctx;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
bh_assert(module);
|
bh_assert(module);
|
||||||
bh_assert(module_inst);
|
bh_assert(module_inst);
|
||||||
|
@ -99,11 +96,7 @@ thread_spawn_wrapper(wasm_exec_env_t exec_env, uint32 start_arg)
|
||||||
if (!(wasm_cluster_dup_c_api_imports(new_module_inst, module_inst)))
|
if (!(wasm_cluster_dup_c_api_imports(new_module_inst, module_inst)))
|
||||||
goto thread_preparation_fail;
|
goto thread_preparation_fail;
|
||||||
|
|
||||||
#if WASM_ENABLE_LIBC_WASI != 0
|
wasm_native_inherit_contexts(new_module_inst, module_inst);
|
||||||
wasi_ctx = wasm_runtime_get_wasi_ctx(module_inst);
|
|
||||||
if (wasi_ctx)
|
|
||||||
wasm_runtime_set_wasi_ctx(new_module_inst, wasi_ctx);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
start_func = wasm_runtime_lookup_function(new_module_inst,
|
start_func = wasm_runtime_lookup_function(new_module_inst,
|
||||||
THREAD_START_FUNCTION, NULL);
|
THREAD_START_FUNCTION, NULL);
|
||||||
|
|
66
core/iwasm/libraries/lib-wasi-threads/stress-test/build.sh
Executable file
66
core/iwasm/libraries/lib-wasi-threads/stress-test/build.sh
Executable file
|
@ -0,0 +1,66 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
#
|
||||||
|
# Copyright (C) 2023 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
||||||
|
# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
||||||
|
#
|
||||||
|
|
||||||
|
set -eo pipefail
|
||||||
|
CC=${CC:=/opt/wasi-sdk/bin/clang}
|
||||||
|
WAMR_DIR=../../../../..
|
||||||
|
|
||||||
|
show_usage() {
|
||||||
|
echo "Usage: $0 [--sysroot PATH_TO_SYSROOT]"
|
||||||
|
echo "--sysroot PATH_TO_SYSROOT specify to build with custom sysroot for wasi-libc"
|
||||||
|
}
|
||||||
|
|
||||||
|
while [[ $# -gt 0 ]]; do
|
||||||
|
key="$1"
|
||||||
|
case $key in
|
||||||
|
--sysroot)
|
||||||
|
sysroot_path="$2"
|
||||||
|
shift
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
--help)
|
||||||
|
show_usage
|
||||||
|
exit
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "Unknown option: $1"
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
rm -rf *.wasm
|
||||||
|
rm -rf *.aot
|
||||||
|
|
||||||
|
for test_c in *.c; do
|
||||||
|
test_wasm="$(basename $test_c .c).wasm"
|
||||||
|
|
||||||
|
if [[ -n "$sysroot_path" ]]; then
|
||||||
|
if [ ! -d "$sysroot_path" ]; then
|
||||||
|
echo "Directory $sysroot_path doesn't exist. Aborting"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
sysroot_command="--sysroot $sysroot_path"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "Compiling $test_c to $test_wasm"
|
||||||
|
$CC \
|
||||||
|
-target wasm32-wasi-threads \
|
||||||
|
-O2 \
|
||||||
|
-Wall \
|
||||||
|
-pthread \
|
||||||
|
-z stack-size=32768 \
|
||||||
|
-Wl,--export=__heap_base \
|
||||||
|
-Wl,--export=__data_end \
|
||||||
|
-Wl,--shared-memory,--max-memory=1966080 \
|
||||||
|
-Wl,--export=wasi_thread_start \
|
||||||
|
-Wl,--export=malloc \
|
||||||
|
-Wl,--export=free \
|
||||||
|
-Wl,--export=test \
|
||||||
|
$sysroot_command \
|
||||||
|
$test_c -o $test_wasm
|
||||||
|
done
|
|
@ -0,0 +1,34 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2023 Amazon.com Inc. or its affiliates. All rights reserved.
|
||||||
|
* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <pthread.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include "mutex_common.h"
|
||||||
|
|
||||||
|
void
|
||||||
|
test()
|
||||||
|
{
|
||||||
|
pthread_mutex_t mutex;
|
||||||
|
|
||||||
|
// Set mutex type to errorcheck. This type provides some additional checks
|
||||||
|
// (for example returns EDEADLK instead of deadlocking in some cases)
|
||||||
|
pthread_mutexattr_t mutex_attr;
|
||||||
|
pthread_mutexattr_init(&mutex_attr);
|
||||||
|
pthread_mutexattr_settype(&mutex_attr, PTHREAD_MUTEX_ERRORCHECK);
|
||||||
|
|
||||||
|
pthread_mutex_init(&mutex, &mutex_attr);
|
||||||
|
pthread_mutexattr_destroy(&mutex_attr);
|
||||||
|
|
||||||
|
run_common_tests(&mutex);
|
||||||
|
fprintf(stderr, "Errorcheck mutex test is completed\n");
|
||||||
|
pthread_mutex_destroy(&mutex);
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
main()
|
||||||
|
{
|
||||||
|
test();
|
||||||
|
return 0;
|
||||||
|
}
|
|
@ -0,0 +1,3 @@
|
||||||
|
{
|
||||||
|
"name": "lib-wasi-threads stress tests"
|
||||||
|
}
|
229
core/iwasm/libraries/lib-wasi-threads/stress-test/mutex_common.h
Normal file
229
core/iwasm/libraries/lib-wasi-threads/stress-test/mutex_common.h
Normal file
|
@ -0,0 +1,229 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2023 Amazon.com Inc. or its affiliates. All rights reserved.
|
||||||
|
* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef MUTEX_COMMON_H
|
||||||
|
#define MUTEX_COMMON_H
|
||||||
|
|
||||||
|
#include <pthread.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <assert.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include <time.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
enum Constants {
|
||||||
|
NUM_ITER = 250000,
|
||||||
|
NUM_THREADS = 12,
|
||||||
|
NUM_RETRY = 8,
|
||||||
|
RETRY_SLEEP_TIME_US = 1000,
|
||||||
|
};
|
||||||
|
|
||||||
|
// We're counting how many times each thread was called using this array
|
||||||
|
// Main thread is also counted here so we need to make arrays bigger
|
||||||
|
typedef struct {
|
||||||
|
int tids[NUM_THREADS + 1];
|
||||||
|
int calls[NUM_THREADS + 1];
|
||||||
|
} StatCollector;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
pthread_mutex_t *mutex;
|
||||||
|
StatCollector stat;
|
||||||
|
int counter;
|
||||||
|
bool is_sleeping;
|
||||||
|
} MutexCounter;
|
||||||
|
|
||||||
|
// This enum defines whether thread should sleep to increase contention
|
||||||
|
enum SleepState {
|
||||||
|
NON_SLEEP = 0,
|
||||||
|
SLEEP = 1,
|
||||||
|
};
|
||||||
|
|
||||||
|
void
|
||||||
|
mutex_counter_init(MutexCounter *mutex_counter, pthread_mutex_t *mutex,
|
||||||
|
enum SleepState is_sleeping)
|
||||||
|
{
|
||||||
|
memset(mutex_counter, 0, sizeof(*mutex_counter));
|
||||||
|
mutex_counter->mutex = mutex;
|
||||||
|
mutex_counter->is_sleeping = is_sleeping;
|
||||||
|
}
|
||||||
|
|
||||||
|
// This function spawns the thread using exponential retries if it receives
|
||||||
|
// EAGAIN
|
||||||
|
static inline void
|
||||||
|
spawn_thread(pthread_t *tid, void *func, void *arg)
|
||||||
|
{
|
||||||
|
int status_code = -1;
|
||||||
|
int timeout_us = RETRY_SLEEP_TIME_US;
|
||||||
|
for (int tries = 0; status_code != 0 && tries < NUM_RETRY; ++tries) {
|
||||||
|
status_code = pthread_create(tid, NULL, (void *(*)(void *))func, arg);
|
||||||
|
assert(status_code == 0 || status_code == EAGAIN);
|
||||||
|
if (status_code == EAGAIN) {
|
||||||
|
usleep(timeout_us);
|
||||||
|
timeout_us *= 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
assert(status_code == 0 && "Thread creation should succeed");
|
||||||
|
}
|
||||||
|
|
||||||
|
// This function adds tid to our stat
|
||||||
|
static inline void
|
||||||
|
add_to_stat(StatCollector *stat, int tid)
|
||||||
|
{
|
||||||
|
int tid_num = 0;
|
||||||
|
for (; tid_num < NUM_THREADS + 1 && stat->tids[tid_num] != 0; ++tid_num) {
|
||||||
|
if (stat->tids[tid_num] == tid) {
|
||||||
|
stat->calls[tid_num]++;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
assert(tid_num < NUM_THREADS + 1);
|
||||||
|
stat->tids[tid_num] = tid;
|
||||||
|
stat->calls[tid_num] = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// This function prints number of calls by TID
|
||||||
|
static inline void
|
||||||
|
print_stat(StatCollector *stat)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "Thread calls count by TID\n");
|
||||||
|
for (int i = 0; i < NUM_THREADS + 1; ++i) {
|
||||||
|
if (stat->tids[i] != 0) {
|
||||||
|
fprintf(stderr, "TID: %d; Calls: %d\n", stat->tids[i],
|
||||||
|
stat->calls[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// This function is run by the threads, it increases counter in a loop and then
|
||||||
|
// sleeps after unlocking the mutex to provide better contention
|
||||||
|
static inline void *
|
||||||
|
inc_shared_variable(void *arg)
|
||||||
|
{
|
||||||
|
MutexCounter *mutex_counter = (MutexCounter *)(arg);
|
||||||
|
int sleep_us = 0;
|
||||||
|
while (!pthread_mutex_lock(mutex_counter->mutex)
|
||||||
|
&& mutex_counter->counter < NUM_ITER) {
|
||||||
|
mutex_counter->counter++;
|
||||||
|
add_to_stat(&mutex_counter->stat, (int)(pthread_self()));
|
||||||
|
if (mutex_counter->is_sleeping) {
|
||||||
|
sleep_us = rand() % 1000;
|
||||||
|
}
|
||||||
|
|
||||||
|
assert(pthread_mutex_unlock(mutex_counter->mutex) == 0
|
||||||
|
&& "Should be able to unlock a mutex");
|
||||||
|
if (mutex_counter->is_sleeping) {
|
||||||
|
usleep(sleep_us);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
assert(mutex_counter->counter == NUM_ITER);
|
||||||
|
assert(pthread_mutex_unlock(mutex_counter->mutex) == 0
|
||||||
|
&& "Should be able to unlock the mutex after test execution");
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Locking and unlocking a mutex in a single thread.
|
||||||
|
static inline void *
|
||||||
|
same_thread_lock_unlock_test(void *mutex)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < NUM_ITER; ++i) {
|
||||||
|
assert(pthread_mutex_lock(mutex) == 0
|
||||||
|
&& "Main thread should be able to lock a mutex");
|
||||||
|
assert(pthread_mutex_unlock(mutex) == 0
|
||||||
|
&& "Main thread should be able to unlock a mutex");
|
||||||
|
}
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
// This function spawns a thread that locks and unlocks a mutex `NUM_ITER` times
|
||||||
|
// in a row
|
||||||
|
static inline void
|
||||||
|
same_non_main_thread_lock_unlock_test(pthread_mutex_t *mutex)
|
||||||
|
{
|
||||||
|
pthread_t tid = 0;
|
||||||
|
spawn_thread(&tid, same_thread_lock_unlock_test, mutex);
|
||||||
|
|
||||||
|
assert(tid != 0 && "TID can't be 0 after successful thread creation");
|
||||||
|
assert(pthread_join(tid, NULL) == 0
|
||||||
|
&& "Thread should be joined successfully");
|
||||||
|
}
|
||||||
|
|
||||||
|
// This function checks basic contention between main and non-main thread
|
||||||
|
// increasing the shared variable
|
||||||
|
static inline void
|
||||||
|
two_threads_inc_test(pthread_mutex_t *mutex)
|
||||||
|
{
|
||||||
|
MutexCounter mutex_counter;
|
||||||
|
mutex_counter_init(&mutex_counter, mutex, false);
|
||||||
|
|
||||||
|
pthread_t tid = 0;
|
||||||
|
spawn_thread(&tid, inc_shared_variable, &mutex_counter);
|
||||||
|
|
||||||
|
assert(tid != 0 && "TID can't be 0 after successful thread creation");
|
||||||
|
inc_shared_variable(&mutex_counter);
|
||||||
|
assert(pthread_join(tid, NULL) == 0
|
||||||
|
&& "Thread should be joined without errors");
|
||||||
|
assert(mutex_counter.counter == NUM_ITER);
|
||||||
|
}
|
||||||
|
|
||||||
|
// This function creates number of threads specified by NUM_THREADS and run
|
||||||
|
// concurrent increasing of shared variable
|
||||||
|
static inline void
|
||||||
|
max_threads_inc_test(pthread_mutex_t *mutex, int threads_num,
|
||||||
|
enum SleepState is_sleeping)
|
||||||
|
{
|
||||||
|
MutexCounter mutex_counter;
|
||||||
|
mutex_counter_init(&mutex_counter, mutex, is_sleeping);
|
||||||
|
|
||||||
|
pthread_t tids[threads_num];
|
||||||
|
for (int i = 0; i < threads_num; ++i) {
|
||||||
|
spawn_thread(&tids[i], inc_shared_variable, &mutex_counter);
|
||||||
|
}
|
||||||
|
|
||||||
|
inc_shared_variable(&mutex_counter);
|
||||||
|
|
||||||
|
for (int i = 0; i < threads_num; ++i) {
|
||||||
|
assert(pthread_join(tids[i], NULL) == 0
|
||||||
|
&& "Thread should be joined without errors");
|
||||||
|
}
|
||||||
|
|
||||||
|
print_stat(&mutex_counter.stat);
|
||||||
|
}
|
||||||
|
|
||||||
|
// This function just runs all the tests described above
|
||||||
|
static inline void
|
||||||
|
run_common_tests(pthread_mutex_t *mutex)
|
||||||
|
{
|
||||||
|
srand(time(NULL));
|
||||||
|
|
||||||
|
fprintf(stderr, "Starting same_thread_lock_unlock_test test\n");
|
||||||
|
same_thread_lock_unlock_test(mutex);
|
||||||
|
fprintf(stderr, "Finished same_thread_lock_unlock_test test\n");
|
||||||
|
|
||||||
|
fprintf(stderr, "Starting same_non_main_thread_lock_unlock_test test\n");
|
||||||
|
same_non_main_thread_lock_unlock_test(mutex);
|
||||||
|
fprintf(stderr, "Finished same_non_main_thread_lock_unlock_test test\n");
|
||||||
|
|
||||||
|
fprintf(stderr, "Starting two_threads_inc_test test\n");
|
||||||
|
two_threads_inc_test(mutex);
|
||||||
|
fprintf(stderr, "Finished two_threads_inc_test test\n");
|
||||||
|
|
||||||
|
fprintf(stderr, "Starting max_threads_inc_test_sleep test\n");
|
||||||
|
max_threads_inc_test(mutex, NUM_THREADS, SLEEP);
|
||||||
|
fprintf(stderr, "Finished concurrent_inc sleep test\n");
|
||||||
|
|
||||||
|
fprintf(stderr, "Starting max_threads_inc_test_non_sleep test\n");
|
||||||
|
max_threads_inc_test(mutex, NUM_THREADS, NON_SLEEP);
|
||||||
|
fprintf(stderr, "Finished max_threads_inc_test test\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // MUTEX_COMMON_H
|
|
@ -0,0 +1,27 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2023 Amazon.com Inc. or its affiliates. All rights reserved.
|
||||||
|
* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <pthread.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include "mutex_common.h"
|
||||||
|
|
||||||
|
void
|
||||||
|
test()
|
||||||
|
{
|
||||||
|
pthread_mutex_t mutex;
|
||||||
|
pthread_mutex_init(&mutex, NULL);
|
||||||
|
|
||||||
|
run_common_tests(&mutex);
|
||||||
|
|
||||||
|
fprintf(stderr, "Normal mutex test is completed\n");
|
||||||
|
pthread_mutex_destroy(&mutex);
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
main()
|
||||||
|
{
|
||||||
|
test();
|
||||||
|
return 0;
|
||||||
|
}
|
|
@ -0,0 +1,72 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2023 Amazon.com Inc. or its affiliates. All rights reserved.
|
||||||
|
* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <pthread.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include "mutex_common.h"
|
||||||
|
|
||||||
|
void
|
||||||
|
multiple_same_thread_lock(void *mutex)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < 100; ++i) {
|
||||||
|
assert(pthread_mutex_lock(mutex) == 0
|
||||||
|
&& "Recursive mutex should allow multiple locking");
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = 0; i < 100; ++i) {
|
||||||
|
assert(pthread_mutex_unlock(mutex) == 0
|
||||||
|
&& "Recursive mutex should allow multiple unlocking");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void *
|
||||||
|
same_thread_multiple_rec_mutex_lock(void *mutex)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < NUM_ITER; ++i) {
|
||||||
|
multiple_same_thread_lock(mutex);
|
||||||
|
}
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
test()
|
||||||
|
{
|
||||||
|
pthread_mutex_t mutex;
|
||||||
|
|
||||||
|
// Set mutex type to recursive. This type allows multiple locking and
|
||||||
|
// unlocking within the same thread
|
||||||
|
pthread_mutexattr_t mutex_attr;
|
||||||
|
pthread_mutexattr_init(&mutex_attr);
|
||||||
|
pthread_mutexattr_settype(&mutex_attr, PTHREAD_MUTEX_RECURSIVE);
|
||||||
|
|
||||||
|
pthread_mutex_init(&mutex, &mutex_attr);
|
||||||
|
pthread_mutexattr_destroy(&mutex_attr);
|
||||||
|
|
||||||
|
run_common_tests(&mutex);
|
||||||
|
|
||||||
|
fprintf(stderr, "Starting same_thread_multiple_rec_mutex_lock test\n");
|
||||||
|
same_thread_multiple_rec_mutex_lock(&mutex);
|
||||||
|
fprintf(stderr, "Finished same_thread_multiple_rec_mutex_lock test\n");
|
||||||
|
|
||||||
|
fprintf(stderr, "Starting same_thread_multiple_rec_mutex_lock test in "
|
||||||
|
"non-main thread\n");
|
||||||
|
pthread_t tid;
|
||||||
|
spawn_thread(&tid, same_thread_multiple_rec_mutex_lock, &mutex);
|
||||||
|
assert(pthread_join(tid, NULL) == 0
|
||||||
|
&& "Non-main thread should be joined successfully");
|
||||||
|
fprintf(stderr, "Finished same_thread_multiple_rec_mutex_lock test in "
|
||||||
|
"non-main thread\n");
|
||||||
|
|
||||||
|
fprintf(stderr, "Recursive mutex test is completed\n");
|
||||||
|
pthread_mutex_destroy(&mutex);
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
main()
|
||||||
|
{
|
||||||
|
test();
|
||||||
|
return 0;
|
||||||
|
}
|
|
@ -16,13 +16,6 @@
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
|
||||||
enum CONSTANTS {
|
|
||||||
NUM_ITER = 100000,
|
|
||||||
NUM_RETRY = 8,
|
|
||||||
MAX_NUM_THREADS = 8,
|
|
||||||
RETRY_SLEEP_TIME_US = 2000,
|
|
||||||
};
|
|
||||||
|
|
||||||
unsigned prime_numbers_count = 0;
|
unsigned prime_numbers_count = 0;
|
||||||
|
|
||||||
bool
|
bool
|
||||||
|
@ -49,10 +42,10 @@ check_if_prime(void *value)
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned int
|
unsigned int
|
||||||
validate()
|
validate(int iter_num)
|
||||||
{
|
{
|
||||||
unsigned int counter = 0;
|
unsigned int counter = 0;
|
||||||
for (unsigned int i = 2; i <= NUM_ITER; ++i) {
|
for (unsigned int i = 2; i <= iter_num; ++i) {
|
||||||
counter += is_prime(i);
|
counter += is_prime(i);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -60,11 +53,12 @@ validate()
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
spawn_thread(pthread_t *thread, unsigned int *arg)
|
spawn_thread(pthread_t *thread, int retry_time_us, int retry_num,
|
||||||
|
unsigned int *arg)
|
||||||
{
|
{
|
||||||
int status_code = -1;
|
int status_code = -1;
|
||||||
int timeout_us = RETRY_SLEEP_TIME_US;
|
int timeout_us = retry_time_us;
|
||||||
for (int tries = 0; status_code != 0 && tries < NUM_RETRY; ++tries) {
|
for (int tries = 0; status_code != 0 && tries < retry_num; ++tries) {
|
||||||
status_code = pthread_create(thread, NULL, &check_if_prime, arg);
|
status_code = pthread_create(thread, NULL, &check_if_prime, arg);
|
||||||
assert(status_code == 0 || status_code == EAGAIN);
|
assert(status_code == 0 || status_code == EAGAIN);
|
||||||
if (status_code == EAGAIN) {
|
if (status_code == EAGAIN) {
|
||||||
|
@ -76,42 +70,56 @@ spawn_thread(pthread_t *thread, unsigned int *arg)
|
||||||
assert(status_code == 0 && "Thread creation should succeed");
|
assert(status_code == 0 && "Thread creation should succeed");
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
void
|
||||||
main(int argc, char **argv)
|
test(int iter_num, int retry_num, int max_threads_num, int retry_time_us)
|
||||||
{
|
{
|
||||||
pthread_t threads[MAX_NUM_THREADS];
|
pthread_t threads[max_threads_num];
|
||||||
unsigned int args[MAX_NUM_THREADS];
|
unsigned int args[max_threads_num];
|
||||||
double percentage = 0.1;
|
double percentage = 0.1;
|
||||||
|
|
||||||
for (unsigned int factorised_number = 2; factorised_number < NUM_ITER;
|
for (unsigned int factorised_number = 2; factorised_number < iter_num;
|
||||||
++factorised_number) {
|
++factorised_number) {
|
||||||
if (factorised_number > NUM_ITER * percentage) {
|
if (factorised_number > iter_num * percentage) {
|
||||||
fprintf(stderr, "Stress test is %d%% finished\n",
|
fprintf(stderr, "Stress test is %d%% finished\n",
|
||||||
(unsigned int)(percentage * 100));
|
(unsigned int)(percentage * 100));
|
||||||
percentage += 0.1;
|
percentage += 0.1;
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned int thread_num = factorised_number % MAX_NUM_THREADS;
|
unsigned int thread_num = factorised_number % max_threads_num;
|
||||||
if (threads[thread_num] != 0) {
|
if (threads[thread_num] != 0) {
|
||||||
assert(pthread_join(threads[thread_num], NULL) == 0);
|
assert(pthread_join(threads[thread_num], NULL) == 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
args[thread_num] = factorised_number;
|
args[thread_num] = factorised_number;
|
||||||
|
|
||||||
usleep(RETRY_SLEEP_TIME_US);
|
usleep(retry_time_us);
|
||||||
spawn_thread(&threads[thread_num], &args[thread_num]);
|
spawn_thread(&threads[thread_num], retry_time_us, retry_num,
|
||||||
|
&args[thread_num]);
|
||||||
assert(threads[thread_num] != 0);
|
assert(threads[thread_num] != 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int i = 0; i < MAX_NUM_THREADS; ++i) {
|
for (int i = 0; i < max_threads_num; ++i) {
|
||||||
assert(threads[i] == 0 || pthread_join(threads[i], NULL) == 0);
|
assert(threads[i] == 0 || pthread_join(threads[i], NULL) == 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check the test results
|
// Check the test results
|
||||||
assert(
|
assert(
|
||||||
prime_numbers_count == validate()
|
prime_numbers_count == validate(iter_num)
|
||||||
&& "Answer mismatch between tested code and reference implementation");
|
&& "Answer mismatch between tested code and reference implementation");
|
||||||
|
|
||||||
fprintf(stderr, "Stress test finished successfully\n");
|
fprintf(stderr, "Stress test finished successfully\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
enum DEFAULT_PARAMETERS {
|
||||||
|
ITER_NUM = 20000,
|
||||||
|
RETRY_NUM = 8,
|
||||||
|
MAX_THREADS_NUM = 12,
|
||||||
|
RETRY_SLEEP_TIME_US = 2000,
|
||||||
|
};
|
||||||
|
|
||||||
|
int
|
||||||
|
main(int argc, char **argv)
|
||||||
|
{
|
||||||
|
test(ITER_NUM, RETRY_NUM, MAX_THREADS_NUM, RETRY_SLEEP_TIME_US);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
|
@ -9,14 +9,6 @@
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
|
||||||
enum CONSTANTS {
|
|
||||||
NUM_ITER = 200000,
|
|
||||||
NUM_RETRY = 8,
|
|
||||||
MAX_NUM_THREADS = 8,
|
|
||||||
RETRY_SLEEP_TIME_US = 4000,
|
|
||||||
SECOND = 1000 * 1000 * 1000
|
|
||||||
};
|
|
||||||
|
|
||||||
int threads_executed = 0;
|
int threads_executed = 0;
|
||||||
unsigned int threads_creation_tried = 0;
|
unsigned int threads_creation_tried = 0;
|
||||||
unsigned int threads_in_use = 0;
|
unsigned int threads_in_use = 0;
|
||||||
|
@ -31,11 +23,11 @@ thread_func(void *arg)
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
spawn_thread(pthread_t *thread)
|
spawn_thread(pthread_t *thread, int retry_time, int iter_num)
|
||||||
{
|
{
|
||||||
int status_code = -1;
|
int status_code = -1;
|
||||||
int timeout_us = RETRY_SLEEP_TIME_US;
|
int timeout_us = retry_time;
|
||||||
for (int tries = 0; status_code != 0 && tries < NUM_RETRY; ++tries) {
|
for (int tries = 0; status_code != 0 && tries < iter_num; ++tries) {
|
||||||
status_code = pthread_create(thread, NULL, &thread_func, NULL);
|
status_code = pthread_create(thread, NULL, &thread_func, NULL);
|
||||||
__atomic_fetch_add(&threads_creation_tried, 1, __ATOMIC_RELAXED);
|
__atomic_fetch_add(&threads_creation_tried, 1, __ATOMIC_RELAXED);
|
||||||
|
|
||||||
|
@ -49,30 +41,33 @@ spawn_thread(pthread_t *thread)
|
||||||
assert(status_code == 0 && "Thread creation should succeed");
|
assert(status_code == 0 && "Thread creation should succeed");
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
void
|
||||||
main(int argc, char **argv)
|
test(int iter_num, int max_threads_num, int retry_num, int retry_time_us)
|
||||||
{
|
{
|
||||||
double percentage = 0.1;
|
double percentage = 0.1;
|
||||||
|
int second_us = 1000 * 1000 * 1000; // 1 second in us
|
||||||
|
|
||||||
for (int iter = 0; iter < NUM_ITER; ++iter) {
|
for (int iter = 0; iter < iter_num; ++iter) {
|
||||||
if (iter > NUM_ITER * percentage) {
|
if (iter > iter_num * percentage) {
|
||||||
fprintf(stderr, "Spawning stress test is %d%% finished\n",
|
fprintf(stderr, "Spawning stress test is %d%% finished\n",
|
||||||
(unsigned int)(percentage * 100));
|
(unsigned int)(percentage * 100));
|
||||||
percentage += 0.1;
|
percentage += 0.1;
|
||||||
}
|
}
|
||||||
while (__atomic_load_n(&threads_in_use, __ATOMIC_SEQ_CST)
|
while (__atomic_load_n(&threads_in_use, __ATOMIC_SEQ_CST)
|
||||||
== MAX_NUM_THREADS) {
|
== max_threads_num) {
|
||||||
usleep(100);
|
usleep(100);
|
||||||
}
|
}
|
||||||
|
|
||||||
__atomic_fetch_add(&threads_in_use, 1, __ATOMIC_SEQ_CST);
|
__atomic_fetch_add(&threads_in_use, 1, __ATOMIC_SEQ_CST);
|
||||||
pthread_t tmp;
|
pthread_t tmp;
|
||||||
spawn_thread(&tmp);
|
spawn_thread(&tmp, retry_time_us, iter_num);
|
||||||
pthread_detach(tmp);
|
pthread_detach(tmp);
|
||||||
}
|
}
|
||||||
|
|
||||||
while ((__atomic_load_n(&threads_in_use, __ATOMIC_SEQ_CST) != 0)) {
|
while ((__atomic_load_n(&threads_in_use, __ATOMIC_SEQ_CST) != 0)) {
|
||||||
__builtin_wasm_memory_atomic_wait32(&threads_in_use, 0, SECOND);
|
// Casting to int* to supress compiler warning
|
||||||
|
__builtin_wasm_memory_atomic_wait32((int *)(&threads_in_use), 0,
|
||||||
|
second_us);
|
||||||
}
|
}
|
||||||
|
|
||||||
assert(__atomic_load_n(&threads_in_use, __ATOMIC_SEQ_CST) == 0);
|
assert(__atomic_load_n(&threads_in_use, __ATOMIC_SEQ_CST) == 0);
|
||||||
|
@ -89,5 +84,18 @@ main(int argc, char **argv)
|
||||||
"with retry ratio %f\n",
|
"with retry ratio %f\n",
|
||||||
threads_creation_tried,
|
threads_creation_tried,
|
||||||
(1. * threads_creation_tried) / threads_executed);
|
(1. * threads_creation_tried) / threads_executed);
|
||||||
|
}
|
||||||
|
|
||||||
|
enum DEFAULT_PARAMETERS {
|
||||||
|
ITER_NUM = 50000,
|
||||||
|
RETRY_NUM = 8,
|
||||||
|
MAX_NUM_THREADS = 12,
|
||||||
|
RETRY_SLEEP_TIME_US = 4000,
|
||||||
|
};
|
||||||
|
|
||||||
|
int
|
||||||
|
main(int argc, char **argv)
|
||||||
|
{
|
||||||
|
test(ITER_NUM, MAX_NUM_THREADS, RETRY_NUM, RETRY_SLEEP_TIME_US);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
|
@ -34,7 +34,10 @@ while [[ $# -gt 0 ]]; do
|
||||||
done
|
done
|
||||||
|
|
||||||
# Stress tests names
|
# Stress tests names
|
||||||
thread_start_file_exclusions=("spawn_stress_test.wasm" "linear_memory_size_update.wasm" "stress_test_threads_creation.wasm")
|
thread_start_file_exclusions=("linear_memory_size_update.wasm")
|
||||||
|
|
||||||
|
rm -rf *.wasm
|
||||||
|
rm -rf *.aot
|
||||||
|
|
||||||
for test_c in *.c; do
|
for test_c in *.c; do
|
||||||
test_wasm="$(basename $test_c .c).wasm"
|
test_wasm="$(basename $test_c .c).wasm"
|
||||||
|
|
|
@ -65,7 +65,7 @@ main(int argc, char **argv)
|
||||||
assert(start_args_init(&data[i].base));
|
assert(start_args_init(&data[i].base));
|
||||||
thread_ids[i] = __wasi_thread_spawn(&data[i]);
|
thread_ids[i] = __wasi_thread_spawn(&data[i]);
|
||||||
printf("Thread created with id=%d\n", thread_ids[i]);
|
printf("Thread created with id=%d\n", thread_ids[i]);
|
||||||
assert(thread_ids[i] > 0 && "Thread creation failed");
|
ASSERT_VALID_TID(thread_ids[i]);
|
||||||
|
|
||||||
for (int j = 0; j < i; j++) {
|
for (int j = 0; j < i; j++) {
|
||||||
assert(thread_ids[i] != thread_ids[j] && "Duplicated TIDs");
|
assert(thread_ids[i] != thread_ids[j] && "Duplicated TIDs");
|
||||||
|
|
|
@ -49,7 +49,7 @@ main(int argc, char **argv)
|
||||||
for (int i = 0; i < NUM_THREADS; i++) {
|
for (int i = 0; i < NUM_THREADS; i++) {
|
||||||
assert(start_args_init(&data[i].base));
|
assert(start_args_init(&data[i].base));
|
||||||
thread_ids[i] = __wasi_thread_spawn(&data[i]);
|
thread_ids[i] = __wasi_thread_spawn(&data[i]);
|
||||||
assert(thread_ids[i] > 0 && "Thread creation failed");
|
ASSERT_VALID_TID(thread_ids[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
printf("Wait for threads to finish\n");
|
printf("Wait for threads to finish\n");
|
||||||
|
|
|
@ -61,7 +61,7 @@ main(int argc, char **argv)
|
||||||
for (int i = 0; i < NUM_THREADS; i++) {
|
for (int i = 0; i < NUM_THREADS; i++) {
|
||||||
assert(start_args_init(&data[i].base));
|
assert(start_args_init(&data[i].base));
|
||||||
thread_ids[i] = __wasi_thread_spawn(&data[i]);
|
thread_ids[i] = __wasi_thread_spawn(&data[i]);
|
||||||
assert(thread_ids[i] > 0 && "Thread creation failed");
|
ASSERT_VALID_TID(thread_ids[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
printf("Wait for threads to finish\n");
|
printf("Wait for threads to finish\n");
|
||||||
|
|
|
@ -1,6 +0,0 @@
|
||||||
{
|
|
||||||
"lib-wasi-threads tests": {
|
|
||||||
"spawn_stress_test": "Stress tests are incompatible with the other part and executed differently",
|
|
||||||
"stress_test_threads_creation": "Stress tests are incompatible with the other part and executed differently"
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -38,7 +38,7 @@ main(int argc, char **argv)
|
||||||
|
|
||||||
assert(start_args_init(&data.base));
|
assert(start_args_init(&data.base));
|
||||||
int thread_id = __wasi_thread_spawn(&data);
|
int thread_id = __wasi_thread_spawn(&data);
|
||||||
assert(thread_id > 0 && "Thread creation failed");
|
ASSERT_VALID_TID(thread_id);
|
||||||
|
|
||||||
return EXIT_SUCCESS;
|
return EXIT_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,3 +0,0 @@
|
||||||
{
|
|
||||||
"exit_code": 1
|
|
||||||
}
|
|
|
@ -69,7 +69,7 @@ main(int argc, char **argv)
|
||||||
data[i].iteration = i;
|
data[i].iteration = i;
|
||||||
|
|
||||||
thread_ids[i] = __wasi_thread_spawn(&data[i]);
|
thread_ids[i] = __wasi_thread_spawn(&data[i]);
|
||||||
assert(thread_ids[i] > 0 && "Thread creation failed");
|
ASSERT_VALID_TID(thread_ids[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
printf("Wait for threads to finish\n");
|
printf("Wait for threads to finish\n");
|
||||||
|
|
|
@ -8,8 +8,14 @@
|
||||||
|
|
||||||
#include "platform_common.h"
|
#include "platform_common.h"
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
#define TID_ALLOCATOR_INIT_SIZE CLUSTER_MAX_THREAD_NUM
|
#define TID_ALLOCATOR_INIT_SIZE CLUSTER_MAX_THREAD_NUM
|
||||||
enum {
|
enum {
|
||||||
|
/* Keep it in sync with
|
||||||
|
https://github.com/WebAssembly/wasi-threads#design-choice-thread-ids */
|
||||||
TID_MIN = 1,
|
TID_MIN = 1,
|
||||||
TID_MAX = 0x1FFFFFFF
|
TID_MAX = 0x1FFFFFFF
|
||||||
}; // Reserved TIDs (WASI specification)
|
}; // Reserved TIDs (WASI specification)
|
||||||
|
@ -33,4 +39,8 @@ tid_allocator_get_tid(TidAllocator *tid_allocator);
|
||||||
void
|
void
|
||||||
tid_allocator_release_tid(TidAllocator *tid_allocator, int32 thread_id);
|
tid_allocator_release_tid(TidAllocator *tid_allocator, int32 thread_id);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif /* _TID_ALLOCATOR_H */
|
#endif /* _TID_ALLOCATOR_H */
|
|
@ -0,0 +1,6 @@
|
||||||
|
# Copyright (C) 2023 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
||||||
|
# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
||||||
|
|
||||||
|
create_wamr_unit_test(wasi_threads
|
||||||
|
${CMAKE_CURRENT_LIST_DIR}/test_tid_allocator.cpp
|
||||||
|
)
|
|
@ -0,0 +1,62 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2023 Amazon.com Inc. or its affiliates. All rights reserved.
|
||||||
|
* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <gtest/gtest.h>
|
||||||
|
|
||||||
|
#include "tid_allocator.h"
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
class TidAllocatorTest : public ::testing::Test
|
||||||
|
{
|
||||||
|
protected:
|
||||||
|
void SetUp() override { ASSERT_TRUE(tid_allocator_init(&_allocator)); }
|
||||||
|
|
||||||
|
void TearDown() override { tid_allocator_deinit(&_allocator); }
|
||||||
|
|
||||||
|
TidAllocator _allocator;
|
||||||
|
};
|
||||||
|
|
||||||
|
static bool
|
||||||
|
is_tid_valid(int32 tid)
|
||||||
|
{
|
||||||
|
/* See: https://github.com/WebAssembly/wasi-threads#design-choice-thread-ids
|
||||||
|
*/
|
||||||
|
return tid >= TID_MIN && tid <= TID_MAX;
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(TidAllocatorTest, BasicTest)
|
||||||
|
{
|
||||||
|
int32 tid = tid_allocator_get_tid(&_allocator);
|
||||||
|
|
||||||
|
ASSERT_TRUE(is_tid_valid(tid));
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(TidAllocatorTest, ShouldFailOnAllocatingMoreThanAllowedThreadIDs)
|
||||||
|
{
|
||||||
|
int32 last_tid = 0;
|
||||||
|
for (int32 i = 0; i < TID_MAX + 1; i++) {
|
||||||
|
last_tid = tid_allocator_get_tid(&_allocator);
|
||||||
|
if (last_tid < 0) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
ASSERT_TRUE(is_tid_valid(last_tid));
|
||||||
|
}
|
||||||
|
|
||||||
|
ASSERT_LT(last_tid, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(TidAllocatorTest, ShouldAllocateMoreThanAllowedTIDsIfOldTIDsAreReleased)
|
||||||
|
{
|
||||||
|
int32 last_tid = 0;
|
||||||
|
for (int32 i = 0; i < TID_MAX + 1; i++) {
|
||||||
|
if (last_tid != 0) {
|
||||||
|
tid_allocator_release_tid(&_allocator, last_tid);
|
||||||
|
}
|
||||||
|
|
||||||
|
last_tid = tid_allocator_get_tid(&_allocator);
|
||||||
|
ASSERT_TRUE(is_tid_valid(last_tid));
|
||||||
|
}
|
||||||
|
}
|
|
@ -335,7 +335,7 @@ wasi_fd_close(wasm_exec_env_t exec_env, wasi_fd_t fd)
|
||||||
if (!wasi_ctx)
|
if (!wasi_ctx)
|
||||||
return (wasi_errno_t)-1;
|
return (wasi_errno_t)-1;
|
||||||
|
|
||||||
return wasmtime_ssp_fd_close(curfds, prestats, fd);
|
return wasmtime_ssp_fd_close(exec_env, curfds, prestats, fd);
|
||||||
}
|
}
|
||||||
|
|
||||||
static wasi_errno_t
|
static wasi_errno_t
|
||||||
|
@ -348,7 +348,7 @@ wasi_fd_datasync(wasm_exec_env_t exec_env, wasi_fd_t fd)
|
||||||
if (!wasi_ctx)
|
if (!wasi_ctx)
|
||||||
return (wasi_errno_t)-1;
|
return (wasi_errno_t)-1;
|
||||||
|
|
||||||
return wasmtime_ssp_fd_datasync(curfds, fd);
|
return wasmtime_ssp_fd_datasync(exec_env, curfds, fd);
|
||||||
}
|
}
|
||||||
|
|
||||||
static wasi_errno_t
|
static wasi_errno_t
|
||||||
|
@ -389,8 +389,8 @@ wasi_fd_pread(wasm_exec_env_t exec_env, wasi_fd_t fd, iovec_app_t *iovec_app,
|
||||||
iovec->buf_len = iovec_app->buf_len;
|
iovec->buf_len = iovec_app->buf_len;
|
||||||
}
|
}
|
||||||
|
|
||||||
err = wasmtime_ssp_fd_pread(curfds, fd, iovec_begin, iovs_len, offset,
|
err = wasmtime_ssp_fd_pread(exec_env, curfds, fd, iovec_begin, iovs_len,
|
||||||
&nread);
|
offset, &nread);
|
||||||
if (err)
|
if (err)
|
||||||
goto fail;
|
goto fail;
|
||||||
|
|
||||||
|
@ -443,8 +443,8 @@ wasi_fd_pwrite(wasm_exec_env_t exec_env, wasi_fd_t fd,
|
||||||
ciovec->buf_len = iovec_app->buf_len;
|
ciovec->buf_len = iovec_app->buf_len;
|
||||||
}
|
}
|
||||||
|
|
||||||
err = wasmtime_ssp_fd_pwrite(curfds, fd, ciovec_begin, iovs_len, offset,
|
err = wasmtime_ssp_fd_pwrite(exec_env, curfds, fd, ciovec_begin, iovs_len,
|
||||||
&nwritten);
|
offset, &nwritten);
|
||||||
if (err)
|
if (err)
|
||||||
goto fail;
|
goto fail;
|
||||||
|
|
||||||
|
@ -496,7 +496,8 @@ wasi_fd_read(wasm_exec_env_t exec_env, wasi_fd_t fd,
|
||||||
iovec->buf_len = iovec_app->buf_len;
|
iovec->buf_len = iovec_app->buf_len;
|
||||||
}
|
}
|
||||||
|
|
||||||
err = wasmtime_ssp_fd_read(curfds, fd, iovec_begin, iovs_len, &nread);
|
err = wasmtime_ssp_fd_read(exec_env, curfds, fd, iovec_begin, iovs_len,
|
||||||
|
&nread);
|
||||||
if (err)
|
if (err)
|
||||||
goto fail;
|
goto fail;
|
||||||
|
|
||||||
|
@ -521,7 +522,7 @@ wasi_fd_renumber(wasm_exec_env_t exec_env, wasi_fd_t from, wasi_fd_t to)
|
||||||
if (!wasi_ctx)
|
if (!wasi_ctx)
|
||||||
return (wasi_errno_t)-1;
|
return (wasi_errno_t)-1;
|
||||||
|
|
||||||
return wasmtime_ssp_fd_renumber(curfds, prestats, from, to);
|
return wasmtime_ssp_fd_renumber(exec_env, curfds, prestats, from, to);
|
||||||
}
|
}
|
||||||
|
|
||||||
static wasi_errno_t
|
static wasi_errno_t
|
||||||
|
@ -538,7 +539,8 @@ wasi_fd_seek(wasm_exec_env_t exec_env, wasi_fd_t fd, wasi_filedelta_t offset,
|
||||||
if (!validate_native_addr(newoffset, sizeof(wasi_filesize_t)))
|
if (!validate_native_addr(newoffset, sizeof(wasi_filesize_t)))
|
||||||
return (wasi_errno_t)-1;
|
return (wasi_errno_t)-1;
|
||||||
|
|
||||||
return wasmtime_ssp_fd_seek(curfds, fd, offset, whence, newoffset);
|
return wasmtime_ssp_fd_seek(exec_env, curfds, fd, offset, whence,
|
||||||
|
newoffset);
|
||||||
}
|
}
|
||||||
|
|
||||||
static wasi_errno_t
|
static wasi_errno_t
|
||||||
|
@ -554,7 +556,7 @@ wasi_fd_tell(wasm_exec_env_t exec_env, wasi_fd_t fd, wasi_filesize_t *newoffset)
|
||||||
if (!validate_native_addr(newoffset, sizeof(wasi_filesize_t)))
|
if (!validate_native_addr(newoffset, sizeof(wasi_filesize_t)))
|
||||||
return (wasi_errno_t)-1;
|
return (wasi_errno_t)-1;
|
||||||
|
|
||||||
return wasmtime_ssp_fd_tell(curfds, fd, newoffset);
|
return wasmtime_ssp_fd_tell(exec_env, curfds, fd, newoffset);
|
||||||
}
|
}
|
||||||
|
|
||||||
static wasi_errno_t
|
static wasi_errno_t
|
||||||
|
@ -573,7 +575,7 @@ wasi_fd_fdstat_get(wasm_exec_env_t exec_env, wasi_fd_t fd,
|
||||||
if (!validate_native_addr(fdstat_app, sizeof(wasi_fdstat_t)))
|
if (!validate_native_addr(fdstat_app, sizeof(wasi_fdstat_t)))
|
||||||
return (wasi_errno_t)-1;
|
return (wasi_errno_t)-1;
|
||||||
|
|
||||||
err = wasmtime_ssp_fd_fdstat_get(curfds, fd, &fdstat);
|
err = wasmtime_ssp_fd_fdstat_get(exec_env, curfds, fd, &fdstat);
|
||||||
if (err)
|
if (err)
|
||||||
return err;
|
return err;
|
||||||
|
|
||||||
|
@ -592,7 +594,7 @@ wasi_fd_fdstat_set_flags(wasm_exec_env_t exec_env, wasi_fd_t fd,
|
||||||
if (!wasi_ctx)
|
if (!wasi_ctx)
|
||||||
return (wasi_errno_t)-1;
|
return (wasi_errno_t)-1;
|
||||||
|
|
||||||
return wasmtime_ssp_fd_fdstat_set_flags(curfds, fd, flags);
|
return wasmtime_ssp_fd_fdstat_set_flags(exec_env, curfds, fd, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
static wasi_errno_t
|
static wasi_errno_t
|
||||||
|
@ -607,8 +609,8 @@ wasi_fd_fdstat_set_rights(wasm_exec_env_t exec_env, wasi_fd_t fd,
|
||||||
if (!wasi_ctx)
|
if (!wasi_ctx)
|
||||||
return (wasi_errno_t)-1;
|
return (wasi_errno_t)-1;
|
||||||
|
|
||||||
return wasmtime_ssp_fd_fdstat_set_rights(curfds, fd, fs_rights_base,
|
return wasmtime_ssp_fd_fdstat_set_rights(
|
||||||
fs_rights_inheriting);
|
exec_env, curfds, fd, fs_rights_base, fs_rights_inheriting);
|
||||||
}
|
}
|
||||||
|
|
||||||
static wasi_errno_t
|
static wasi_errno_t
|
||||||
|
@ -621,7 +623,7 @@ wasi_fd_sync(wasm_exec_env_t exec_env, wasi_fd_t fd)
|
||||||
if (!wasi_ctx)
|
if (!wasi_ctx)
|
||||||
return (wasi_errno_t)-1;
|
return (wasi_errno_t)-1;
|
||||||
|
|
||||||
return wasmtime_ssp_fd_sync(curfds, fd);
|
return wasmtime_ssp_fd_sync(exec_env, curfds, fd);
|
||||||
}
|
}
|
||||||
|
|
||||||
static wasi_errno_t
|
static wasi_errno_t
|
||||||
|
@ -663,7 +665,8 @@ wasi_fd_write(wasm_exec_env_t exec_env, wasi_fd_t fd,
|
||||||
ciovec->buf_len = iovec_app->buf_len;
|
ciovec->buf_len = iovec_app->buf_len;
|
||||||
}
|
}
|
||||||
|
|
||||||
err = wasmtime_ssp_fd_write(curfds, fd, ciovec_begin, iovs_len, &nwritten);
|
err = wasmtime_ssp_fd_write(exec_env, curfds, fd, ciovec_begin, iovs_len,
|
||||||
|
&nwritten);
|
||||||
if (err)
|
if (err)
|
||||||
goto fail;
|
goto fail;
|
||||||
|
|
||||||
|
@ -688,7 +691,7 @@ wasi_fd_advise(wasm_exec_env_t exec_env, wasi_fd_t fd, wasi_filesize_t offset,
|
||||||
if (!wasi_ctx)
|
if (!wasi_ctx)
|
||||||
return (wasi_errno_t)-1;
|
return (wasi_errno_t)-1;
|
||||||
|
|
||||||
return wasmtime_ssp_fd_advise(curfds, fd, offset, len, advice);
|
return wasmtime_ssp_fd_advise(exec_env, curfds, fd, offset, len, advice);
|
||||||
}
|
}
|
||||||
|
|
||||||
static wasi_errno_t
|
static wasi_errno_t
|
||||||
|
@ -702,7 +705,7 @@ wasi_fd_allocate(wasm_exec_env_t exec_env, wasi_fd_t fd, wasi_filesize_t offset,
|
||||||
if (!wasi_ctx)
|
if (!wasi_ctx)
|
||||||
return (wasi_errno_t)-1;
|
return (wasi_errno_t)-1;
|
||||||
|
|
||||||
return wasmtime_ssp_fd_allocate(curfds, fd, offset, len);
|
return wasmtime_ssp_fd_allocate(exec_env, curfds, fd, offset, len);
|
||||||
}
|
}
|
||||||
|
|
||||||
static wasi_errno_t
|
static wasi_errno_t
|
||||||
|
@ -716,7 +719,8 @@ wasi_path_create_directory(wasm_exec_env_t exec_env, wasi_fd_t fd,
|
||||||
if (!wasi_ctx)
|
if (!wasi_ctx)
|
||||||
return (wasi_errno_t)-1;
|
return (wasi_errno_t)-1;
|
||||||
|
|
||||||
return wasmtime_ssp_path_create_directory(curfds, fd, path, path_len);
|
return wasmtime_ssp_path_create_directory(exec_env, curfds, fd, path,
|
||||||
|
path_len);
|
||||||
}
|
}
|
||||||
|
|
||||||
static wasi_errno_t
|
static wasi_errno_t
|
||||||
|
@ -733,8 +737,9 @@ wasi_path_link(wasm_exec_env_t exec_env, wasi_fd_t old_fd,
|
||||||
if (!wasi_ctx)
|
if (!wasi_ctx)
|
||||||
return (wasi_errno_t)-1;
|
return (wasi_errno_t)-1;
|
||||||
|
|
||||||
return wasmtime_ssp_path_link(curfds, prestats, old_fd, old_flags, old_path,
|
return wasmtime_ssp_path_link(exec_env, curfds, prestats, old_fd, old_flags,
|
||||||
old_path_len, new_fd, new_path, new_path_len);
|
old_path, old_path_len, new_fd, new_path,
|
||||||
|
new_path_len);
|
||||||
}
|
}
|
||||||
|
|
||||||
static wasi_errno_t
|
static wasi_errno_t
|
||||||
|
@ -756,9 +761,9 @@ wasi_path_open(wasm_exec_env_t exec_env, wasi_fd_t dirfd,
|
||||||
if (!validate_native_addr(fd_app, sizeof(wasi_fd_t)))
|
if (!validate_native_addr(fd_app, sizeof(wasi_fd_t)))
|
||||||
return (wasi_errno_t)-1;
|
return (wasi_errno_t)-1;
|
||||||
|
|
||||||
err = wasmtime_ssp_path_open(curfds, dirfd, dirflags, path, path_len,
|
err = wasmtime_ssp_path_open(exec_env, curfds, dirfd, dirflags, path,
|
||||||
oflags, fs_rights_base, fs_rights_inheriting,
|
path_len, oflags, fs_rights_base,
|
||||||
fs_flags, &fd);
|
fs_rights_inheriting, fs_flags, &fd);
|
||||||
|
|
||||||
*fd_app = fd;
|
*fd_app = fd;
|
||||||
return err;
|
return err;
|
||||||
|
@ -780,7 +785,8 @@ wasi_fd_readdir(wasm_exec_env_t exec_env, wasi_fd_t fd, void *buf,
|
||||||
if (!validate_native_addr(bufused_app, sizeof(uint32)))
|
if (!validate_native_addr(bufused_app, sizeof(uint32)))
|
||||||
return (wasi_errno_t)-1;
|
return (wasi_errno_t)-1;
|
||||||
|
|
||||||
err = wasmtime_ssp_fd_readdir(curfds, fd, buf, buf_len, cookie, &bufused);
|
err = wasmtime_ssp_fd_readdir(exec_env, curfds, fd, buf, buf_len, cookie,
|
||||||
|
&bufused);
|
||||||
if (err)
|
if (err)
|
||||||
return err;
|
return err;
|
||||||
|
|
||||||
|
@ -805,8 +811,8 @@ wasi_path_readlink(wasm_exec_env_t exec_env, wasi_fd_t fd, const char *path,
|
||||||
if (!validate_native_addr(bufused_app, sizeof(uint32)))
|
if (!validate_native_addr(bufused_app, sizeof(uint32)))
|
||||||
return (wasi_errno_t)-1;
|
return (wasi_errno_t)-1;
|
||||||
|
|
||||||
err = wasmtime_ssp_path_readlink(curfds, fd, path, path_len, buf, buf_len,
|
err = wasmtime_ssp_path_readlink(exec_env, curfds, fd, path, path_len, buf,
|
||||||
&bufused);
|
buf_len, &bufused);
|
||||||
if (err)
|
if (err)
|
||||||
return err;
|
return err;
|
||||||
|
|
||||||
|
@ -826,8 +832,9 @@ wasi_path_rename(wasm_exec_env_t exec_env, wasi_fd_t old_fd,
|
||||||
if (!wasi_ctx)
|
if (!wasi_ctx)
|
||||||
return (wasi_errno_t)-1;
|
return (wasi_errno_t)-1;
|
||||||
|
|
||||||
return wasmtime_ssp_path_rename(curfds, old_fd, old_path, old_path_len,
|
return wasmtime_ssp_path_rename(exec_env, curfds, old_fd, old_path,
|
||||||
new_fd, new_path, new_path_len);
|
old_path_len, new_fd, new_path,
|
||||||
|
new_path_len);
|
||||||
}
|
}
|
||||||
|
|
||||||
static wasi_errno_t
|
static wasi_errno_t
|
||||||
|
@ -844,7 +851,7 @@ wasi_fd_filestat_get(wasm_exec_env_t exec_env, wasi_fd_t fd,
|
||||||
if (!validate_native_addr(filestat, sizeof(wasi_filestat_t)))
|
if (!validate_native_addr(filestat, sizeof(wasi_filestat_t)))
|
||||||
return (wasi_errno_t)-1;
|
return (wasi_errno_t)-1;
|
||||||
|
|
||||||
return wasmtime_ssp_fd_filestat_get(curfds, fd, filestat);
|
return wasmtime_ssp_fd_filestat_get(exec_env, curfds, fd, filestat);
|
||||||
}
|
}
|
||||||
|
|
||||||
static wasi_errno_t
|
static wasi_errno_t
|
||||||
|
@ -859,8 +866,8 @@ wasi_fd_filestat_set_times(wasm_exec_env_t exec_env, wasi_fd_t fd,
|
||||||
if (!wasi_ctx)
|
if (!wasi_ctx)
|
||||||
return (wasi_errno_t)-1;
|
return (wasi_errno_t)-1;
|
||||||
|
|
||||||
return wasmtime_ssp_fd_filestat_set_times(curfds, fd, st_atim, st_mtim,
|
return wasmtime_ssp_fd_filestat_set_times(exec_env, curfds, fd, st_atim,
|
||||||
fstflags);
|
st_mtim, fstflags);
|
||||||
}
|
}
|
||||||
|
|
||||||
static wasi_errno_t
|
static wasi_errno_t
|
||||||
|
@ -874,7 +881,7 @@ wasi_fd_filestat_set_size(wasm_exec_env_t exec_env, wasi_fd_t fd,
|
||||||
if (!wasi_ctx)
|
if (!wasi_ctx)
|
||||||
return (wasi_errno_t)-1;
|
return (wasi_errno_t)-1;
|
||||||
|
|
||||||
return wasmtime_ssp_fd_filestat_set_size(curfds, fd, st_size);
|
return wasmtime_ssp_fd_filestat_set_size(exec_env, curfds, fd, st_size);
|
||||||
}
|
}
|
||||||
|
|
||||||
static wasi_errno_t
|
static wasi_errno_t
|
||||||
|
@ -892,8 +899,8 @@ wasi_path_filestat_get(wasm_exec_env_t exec_env, wasi_fd_t fd,
|
||||||
if (!validate_native_addr(filestat, sizeof(wasi_filestat_t)))
|
if (!validate_native_addr(filestat, sizeof(wasi_filestat_t)))
|
||||||
return (wasi_errno_t)-1;
|
return (wasi_errno_t)-1;
|
||||||
|
|
||||||
return wasmtime_ssp_path_filestat_get(curfds, fd, flags, path, path_len,
|
return wasmtime_ssp_path_filestat_get(exec_env, curfds, fd, flags, path,
|
||||||
filestat);
|
path_len, filestat);
|
||||||
}
|
}
|
||||||
|
|
||||||
static wasi_errno_t
|
static wasi_errno_t
|
||||||
|
@ -909,8 +916,9 @@ wasi_path_filestat_set_times(wasm_exec_env_t exec_env, wasi_fd_t fd,
|
||||||
if (!wasi_ctx)
|
if (!wasi_ctx)
|
||||||
return (wasi_errno_t)-1;
|
return (wasi_errno_t)-1;
|
||||||
|
|
||||||
return wasmtime_ssp_path_filestat_set_times(
|
return wasmtime_ssp_path_filestat_set_times(exec_env, curfds, fd, flags,
|
||||||
curfds, fd, flags, path, path_len, st_atim, st_mtim, fstflags);
|
path, path_len, st_atim,
|
||||||
|
st_mtim, fstflags);
|
||||||
}
|
}
|
||||||
|
|
||||||
static wasi_errno_t
|
static wasi_errno_t
|
||||||
|
@ -926,8 +934,8 @@ wasi_path_symlink(wasm_exec_env_t exec_env, const char *old_path,
|
||||||
if (!wasi_ctx)
|
if (!wasi_ctx)
|
||||||
return (wasi_errno_t)-1;
|
return (wasi_errno_t)-1;
|
||||||
|
|
||||||
return wasmtime_ssp_path_symlink(curfds, prestats, old_path, old_path_len,
|
return wasmtime_ssp_path_symlink(exec_env, curfds, prestats, old_path,
|
||||||
fd, new_path, new_path_len);
|
old_path_len, fd, new_path, new_path_len);
|
||||||
}
|
}
|
||||||
|
|
||||||
static wasi_errno_t
|
static wasi_errno_t
|
||||||
|
@ -941,7 +949,7 @@ wasi_path_unlink_file(wasm_exec_env_t exec_env, wasi_fd_t fd, const char *path,
|
||||||
if (!wasi_ctx)
|
if (!wasi_ctx)
|
||||||
return (wasi_errno_t)-1;
|
return (wasi_errno_t)-1;
|
||||||
|
|
||||||
return wasmtime_ssp_path_unlink_file(curfds, fd, path, path_len);
|
return wasmtime_ssp_path_unlink_file(exec_env, curfds, fd, path, path_len);
|
||||||
}
|
}
|
||||||
|
|
||||||
static wasi_errno_t
|
static wasi_errno_t
|
||||||
|
@ -955,7 +963,8 @@ wasi_path_remove_directory(wasm_exec_env_t exec_env, wasi_fd_t fd,
|
||||||
if (!wasi_ctx)
|
if (!wasi_ctx)
|
||||||
return (wasi_errno_t)-1;
|
return (wasi_errno_t)-1;
|
||||||
|
|
||||||
return wasmtime_ssp_path_remove_directory(curfds, fd, path, path_len);
|
return wasmtime_ssp_path_remove_directory(exec_env, curfds, fd, path,
|
||||||
|
path_len);
|
||||||
}
|
}
|
||||||
|
|
||||||
#if WASM_ENABLE_THREAD_MGR != 0
|
#if WASM_ENABLE_THREAD_MGR != 0
|
||||||
|
@ -1026,8 +1035,8 @@ execute_interruptible_poll_oneoff(
|
||||||
/* update timeout for clock subscription events */
|
/* update timeout for clock subscription events */
|
||||||
update_clock_subscription_data(
|
update_clock_subscription_data(
|
||||||
in_copy, nsubscriptions, min_uint64(time_quant, timeout - elapsed));
|
in_copy, nsubscriptions, min_uint64(time_quant, timeout - elapsed));
|
||||||
err = wasmtime_ssp_poll_oneoff(curfds, in_copy, out, nsubscriptions,
|
err = wasmtime_ssp_poll_oneoff(exec_env, curfds, in_copy, out,
|
||||||
nevents);
|
nsubscriptions, nevents);
|
||||||
elapsed += time_quant;
|
elapsed += time_quant;
|
||||||
|
|
||||||
if (err) {
|
if (err) {
|
||||||
|
@ -1079,7 +1088,8 @@ wasi_poll_oneoff(wasm_exec_env_t exec_env, const wasi_subscription_t *in,
|
||||||
return (wasi_errno_t)-1;
|
return (wasi_errno_t)-1;
|
||||||
|
|
||||||
#if WASM_ENABLE_THREAD_MGR == 0
|
#if WASM_ENABLE_THREAD_MGR == 0
|
||||||
err = wasmtime_ssp_poll_oneoff(curfds, in, out, nsubscriptions, &nevents);
|
err = wasmtime_ssp_poll_oneoff(exec_env, curfds, in, out, nsubscriptions,
|
||||||
|
&nevents);
|
||||||
#else
|
#else
|
||||||
err = execute_interruptible_poll_oneoff(curfds, in, out, nsubscriptions,
|
err = execute_interruptible_poll_oneoff(curfds, in, out, nsubscriptions,
|
||||||
&nevents, exec_env);
|
&nevents, exec_env);
|
||||||
|
@ -1133,7 +1143,7 @@ wasi_sock_accept(wasm_exec_env_t exec_env, wasi_fd_t fd, wasi_fdflags_t flags,
|
||||||
|
|
||||||
curfds = wasi_ctx_get_curfds(module_inst, wasi_ctx);
|
curfds = wasi_ctx_get_curfds(module_inst, wasi_ctx);
|
||||||
|
|
||||||
return wasi_ssp_sock_accept(curfds, fd, flags, fd_new);
|
return wasi_ssp_sock_accept(exec_env, curfds, fd, flags, fd_new);
|
||||||
}
|
}
|
||||||
|
|
||||||
static wasi_errno_t
|
static wasi_errno_t
|
||||||
|
@ -1152,7 +1162,7 @@ wasi_sock_addr_local(wasm_exec_env_t exec_env, wasi_fd_t fd,
|
||||||
|
|
||||||
curfds = wasi_ctx_get_curfds(module_inst, wasi_ctx);
|
curfds = wasi_ctx_get_curfds(module_inst, wasi_ctx);
|
||||||
|
|
||||||
return wasi_ssp_sock_addr_local(curfds, fd, addr);
|
return wasi_ssp_sock_addr_local(exec_env, curfds, fd, addr);
|
||||||
}
|
}
|
||||||
|
|
||||||
static wasi_errno_t
|
static wasi_errno_t
|
||||||
|
@ -1171,7 +1181,7 @@ wasi_sock_addr_remote(wasm_exec_env_t exec_env, wasi_fd_t fd,
|
||||||
|
|
||||||
curfds = wasi_ctx_get_curfds(module_inst, wasi_ctx);
|
curfds = wasi_ctx_get_curfds(module_inst, wasi_ctx);
|
||||||
|
|
||||||
return wasi_ssp_sock_addr_remote(curfds, fd, addr);
|
return wasi_ssp_sock_addr_remote(exec_env, curfds, fd, addr);
|
||||||
}
|
}
|
||||||
|
|
||||||
static wasi_errno_t
|
static wasi_errno_t
|
||||||
|
@ -1192,8 +1202,8 @@ wasi_sock_addr_resolve(wasm_exec_env_t exec_env, const char *host,
|
||||||
curfds = wasi_ctx_get_curfds(module_inst, wasi_ctx);
|
curfds = wasi_ctx_get_curfds(module_inst, wasi_ctx);
|
||||||
ns_lookup_list = wasi_ctx_get_ns_lookup_list(wasi_ctx);
|
ns_lookup_list = wasi_ctx_get_ns_lookup_list(wasi_ctx);
|
||||||
|
|
||||||
return wasi_ssp_sock_addr_resolve(curfds, ns_lookup_list, host, service,
|
return wasi_ssp_sock_addr_resolve(exec_env, curfds, ns_lookup_list, host,
|
||||||
hints, addr_info, addr_info_size,
|
service, hints, addr_info, addr_info_size,
|
||||||
max_info_size);
|
max_info_size);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1211,7 +1221,7 @@ wasi_sock_bind(wasm_exec_env_t exec_env, wasi_fd_t fd, wasi_addr_t *addr)
|
||||||
curfds = wasi_ctx_get_curfds(module_inst, wasi_ctx);
|
curfds = wasi_ctx_get_curfds(module_inst, wasi_ctx);
|
||||||
addr_pool = wasi_ctx_get_addr_pool(module_inst, wasi_ctx);
|
addr_pool = wasi_ctx_get_addr_pool(module_inst, wasi_ctx);
|
||||||
|
|
||||||
return wasi_ssp_sock_bind(curfds, addr_pool, fd, addr);
|
return wasi_ssp_sock_bind(exec_env, curfds, addr_pool, fd, addr);
|
||||||
}
|
}
|
||||||
|
|
||||||
static wasi_errno_t
|
static wasi_errno_t
|
||||||
|
@ -1234,7 +1244,7 @@ wasi_sock_connect(wasm_exec_env_t exec_env, wasi_fd_t fd, wasi_addr_t *addr)
|
||||||
curfds = wasi_ctx_get_curfds(module_inst, wasi_ctx);
|
curfds = wasi_ctx_get_curfds(module_inst, wasi_ctx);
|
||||||
addr_pool = wasi_ctx_get_addr_pool(module_inst, wasi_ctx);
|
addr_pool = wasi_ctx_get_addr_pool(module_inst, wasi_ctx);
|
||||||
|
|
||||||
return wasi_ssp_sock_connect(curfds, addr_pool, fd, addr);
|
return wasi_ssp_sock_connect(exec_env, curfds, addr_pool, fd, addr);
|
||||||
}
|
}
|
||||||
|
|
||||||
static wasi_errno_t
|
static wasi_errno_t
|
||||||
|
@ -1253,7 +1263,7 @@ wasi_sock_get_broadcast(wasm_exec_env_t exec_env, wasi_fd_t fd,
|
||||||
|
|
||||||
curfds = wasi_ctx_get_curfds(module_inst, wasi_ctx);
|
curfds = wasi_ctx_get_curfds(module_inst, wasi_ctx);
|
||||||
|
|
||||||
return wasmtime_ssp_sock_get_broadcast(curfds, fd, is_enabled);
|
return wasmtime_ssp_sock_get_broadcast(exec_env, curfds, fd, is_enabled);
|
||||||
}
|
}
|
||||||
|
|
||||||
static wasi_errno_t
|
static wasi_errno_t
|
||||||
|
@ -1272,7 +1282,7 @@ wasi_sock_get_keep_alive(wasm_exec_env_t exec_env, wasi_fd_t fd,
|
||||||
|
|
||||||
curfds = wasi_ctx_get_curfds(module_inst, wasi_ctx);
|
curfds = wasi_ctx_get_curfds(module_inst, wasi_ctx);
|
||||||
|
|
||||||
return wasmtime_ssp_sock_get_keep_alive(curfds, fd, is_enabled);
|
return wasmtime_ssp_sock_get_keep_alive(exec_env, curfds, fd, is_enabled);
|
||||||
}
|
}
|
||||||
|
|
||||||
static wasi_errno_t
|
static wasi_errno_t
|
||||||
|
@ -1292,7 +1302,8 @@ wasi_sock_get_linger(wasm_exec_env_t exec_env, wasi_fd_t fd, bool *is_enabled,
|
||||||
|
|
||||||
curfds = wasi_ctx_get_curfds(module_inst, wasi_ctx);
|
curfds = wasi_ctx_get_curfds(module_inst, wasi_ctx);
|
||||||
|
|
||||||
return wasmtime_ssp_sock_get_linger(curfds, fd, is_enabled, linger_s);
|
return wasmtime_ssp_sock_get_linger(exec_env, curfds, fd, is_enabled,
|
||||||
|
linger_s);
|
||||||
}
|
}
|
||||||
|
|
||||||
static wasi_errno_t
|
static wasi_errno_t
|
||||||
|
@ -1311,7 +1322,7 @@ wasi_sock_get_recv_buf_size(wasm_exec_env_t exec_env, wasi_fd_t fd,
|
||||||
|
|
||||||
curfds = wasi_ctx_get_curfds(module_inst, wasi_ctx);
|
curfds = wasi_ctx_get_curfds(module_inst, wasi_ctx);
|
||||||
|
|
||||||
return wasmtime_ssp_sock_get_recv_buf_size(curfds, fd, size);
|
return wasmtime_ssp_sock_get_recv_buf_size(exec_env, curfds, fd, size);
|
||||||
}
|
}
|
||||||
|
|
||||||
static wasi_errno_t
|
static wasi_errno_t
|
||||||
|
@ -1330,7 +1341,7 @@ wasi_sock_get_recv_timeout(wasm_exec_env_t exec_env, wasi_fd_t fd,
|
||||||
|
|
||||||
curfds = wasi_ctx_get_curfds(module_inst, wasi_ctx);
|
curfds = wasi_ctx_get_curfds(module_inst, wasi_ctx);
|
||||||
|
|
||||||
return wasmtime_ssp_sock_get_recv_timeout(curfds, fd, timeout_us);
|
return wasmtime_ssp_sock_get_recv_timeout(exec_env, curfds, fd, timeout_us);
|
||||||
}
|
}
|
||||||
|
|
||||||
static wasi_errno_t
|
static wasi_errno_t
|
||||||
|
@ -1349,7 +1360,7 @@ wasi_sock_get_reuse_addr(wasm_exec_env_t exec_env, wasi_fd_t fd,
|
||||||
|
|
||||||
curfds = wasi_ctx_get_curfds(module_inst, wasi_ctx);
|
curfds = wasi_ctx_get_curfds(module_inst, wasi_ctx);
|
||||||
|
|
||||||
return wasmtime_ssp_sock_get_reuse_addr(curfds, fd, is_enabled);
|
return wasmtime_ssp_sock_get_reuse_addr(exec_env, curfds, fd, is_enabled);
|
||||||
}
|
}
|
||||||
|
|
||||||
static wasi_errno_t
|
static wasi_errno_t
|
||||||
|
@ -1368,7 +1379,7 @@ wasi_sock_get_reuse_port(wasm_exec_env_t exec_env, wasi_fd_t fd,
|
||||||
|
|
||||||
curfds = wasi_ctx_get_curfds(module_inst, wasi_ctx);
|
curfds = wasi_ctx_get_curfds(module_inst, wasi_ctx);
|
||||||
|
|
||||||
return wasmtime_ssp_sock_get_reuse_port(curfds, fd, is_enabled);
|
return wasmtime_ssp_sock_get_reuse_port(exec_env, curfds, fd, is_enabled);
|
||||||
}
|
}
|
||||||
|
|
||||||
static wasi_errno_t
|
static wasi_errno_t
|
||||||
|
@ -1387,7 +1398,7 @@ wasi_sock_get_send_buf_size(wasm_exec_env_t exec_env, wasi_fd_t fd,
|
||||||
|
|
||||||
curfds = wasi_ctx_get_curfds(module_inst, wasi_ctx);
|
curfds = wasi_ctx_get_curfds(module_inst, wasi_ctx);
|
||||||
|
|
||||||
return wasmtime_ssp_sock_get_send_buf_size(curfds, fd, size);
|
return wasmtime_ssp_sock_get_send_buf_size(exec_env, curfds, fd, size);
|
||||||
}
|
}
|
||||||
|
|
||||||
static wasi_errno_t
|
static wasi_errno_t
|
||||||
|
@ -1406,7 +1417,7 @@ wasi_sock_get_send_timeout(wasm_exec_env_t exec_env, wasi_fd_t fd,
|
||||||
|
|
||||||
curfds = wasi_ctx_get_curfds(module_inst, wasi_ctx);
|
curfds = wasi_ctx_get_curfds(module_inst, wasi_ctx);
|
||||||
|
|
||||||
return wasmtime_ssp_sock_get_send_timeout(curfds, fd, timeout_us);
|
return wasmtime_ssp_sock_get_send_timeout(exec_env, curfds, fd, timeout_us);
|
||||||
}
|
}
|
||||||
|
|
||||||
static wasi_errno_t
|
static wasi_errno_t
|
||||||
|
@ -1425,7 +1436,8 @@ wasi_sock_get_tcp_fastopen_connect(wasm_exec_env_t exec_env, wasi_fd_t fd,
|
||||||
|
|
||||||
curfds = wasi_ctx_get_curfds(module_inst, wasi_ctx);
|
curfds = wasi_ctx_get_curfds(module_inst, wasi_ctx);
|
||||||
|
|
||||||
return wasmtime_ssp_sock_get_tcp_fastopen_connect(curfds, fd, is_enabled);
|
return wasmtime_ssp_sock_get_tcp_fastopen_connect(exec_env, curfds, fd,
|
||||||
|
is_enabled);
|
||||||
}
|
}
|
||||||
|
|
||||||
static wasi_errno_t
|
static wasi_errno_t
|
||||||
|
@ -1444,7 +1456,7 @@ wasi_sock_get_tcp_no_delay(wasm_exec_env_t exec_env, wasi_fd_t fd,
|
||||||
|
|
||||||
curfds = wasi_ctx_get_curfds(module_inst, wasi_ctx);
|
curfds = wasi_ctx_get_curfds(module_inst, wasi_ctx);
|
||||||
|
|
||||||
return wasmtime_ssp_sock_get_tcp_no_delay(curfds, fd, is_enabled);
|
return wasmtime_ssp_sock_get_tcp_no_delay(exec_env, curfds, fd, is_enabled);
|
||||||
}
|
}
|
||||||
|
|
||||||
static wasi_errno_t
|
static wasi_errno_t
|
||||||
|
@ -1463,7 +1475,8 @@ wasi_sock_get_tcp_quick_ack(wasm_exec_env_t exec_env, wasi_fd_t fd,
|
||||||
|
|
||||||
curfds = wasi_ctx_get_curfds(module_inst, wasi_ctx);
|
curfds = wasi_ctx_get_curfds(module_inst, wasi_ctx);
|
||||||
|
|
||||||
return wasmtime_ssp_sock_get_tcp_quick_ack(curfds, fd, is_enabled);
|
return wasmtime_ssp_sock_get_tcp_quick_ack(exec_env, curfds, fd,
|
||||||
|
is_enabled);
|
||||||
}
|
}
|
||||||
|
|
||||||
static wasi_errno_t
|
static wasi_errno_t
|
||||||
|
@ -1482,7 +1495,7 @@ wasi_sock_get_tcp_keep_idle(wasm_exec_env_t exec_env, wasi_fd_t fd,
|
||||||
|
|
||||||
curfds = wasi_ctx_get_curfds(module_inst, wasi_ctx);
|
curfds = wasi_ctx_get_curfds(module_inst, wasi_ctx);
|
||||||
|
|
||||||
return wasmtime_ssp_sock_get_tcp_keep_idle(curfds, fd, time_s);
|
return wasmtime_ssp_sock_get_tcp_keep_idle(exec_env, curfds, fd, time_s);
|
||||||
}
|
}
|
||||||
|
|
||||||
static wasi_errno_t
|
static wasi_errno_t
|
||||||
|
@ -1501,7 +1514,7 @@ wasi_sock_get_tcp_keep_intvl(wasm_exec_env_t exec_env, wasi_fd_t fd,
|
||||||
|
|
||||||
curfds = wasi_ctx_get_curfds(module_inst, wasi_ctx);
|
curfds = wasi_ctx_get_curfds(module_inst, wasi_ctx);
|
||||||
|
|
||||||
return wasmtime_ssp_sock_get_tcp_keep_intvl(curfds, fd, time_s);
|
return wasmtime_ssp_sock_get_tcp_keep_intvl(exec_env, curfds, fd, time_s);
|
||||||
}
|
}
|
||||||
|
|
||||||
static wasi_errno_t
|
static wasi_errno_t
|
||||||
|
@ -1520,7 +1533,7 @@ wasi_sock_get_ip_multicast_loop(wasm_exec_env_t exec_env, wasi_fd_t fd,
|
||||||
|
|
||||||
curfds = wasi_ctx_get_curfds(module_inst, wasi_ctx);
|
curfds = wasi_ctx_get_curfds(module_inst, wasi_ctx);
|
||||||
|
|
||||||
return wasmtime_ssp_sock_get_ip_multicast_loop(curfds, fd, ipv6,
|
return wasmtime_ssp_sock_get_ip_multicast_loop(exec_env, curfds, fd, ipv6,
|
||||||
is_enabled);
|
is_enabled);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1539,7 +1552,7 @@ wasi_sock_get_ip_ttl(wasm_exec_env_t exec_env, wasi_fd_t fd, uint8_t *ttl_s)
|
||||||
|
|
||||||
curfds = wasi_ctx_get_curfds(module_inst, wasi_ctx);
|
curfds = wasi_ctx_get_curfds(module_inst, wasi_ctx);
|
||||||
|
|
||||||
return wasmtime_ssp_sock_get_ip_ttl(curfds, fd, ttl_s);
|
return wasmtime_ssp_sock_get_ip_ttl(exec_env, curfds, fd, ttl_s);
|
||||||
}
|
}
|
||||||
|
|
||||||
static wasi_errno_t
|
static wasi_errno_t
|
||||||
|
@ -1558,7 +1571,7 @@ wasi_sock_get_ip_multicast_ttl(wasm_exec_env_t exec_env, wasi_fd_t fd,
|
||||||
|
|
||||||
curfds = wasi_ctx_get_curfds(module_inst, wasi_ctx);
|
curfds = wasi_ctx_get_curfds(module_inst, wasi_ctx);
|
||||||
|
|
||||||
return wasmtime_ssp_sock_get_ip_multicast_ttl(curfds, fd, ttl_s);
|
return wasmtime_ssp_sock_get_ip_multicast_ttl(exec_env, curfds, fd, ttl_s);
|
||||||
}
|
}
|
||||||
|
|
||||||
static wasi_errno_t
|
static wasi_errno_t
|
||||||
|
@ -1577,7 +1590,7 @@ wasi_sock_get_ipv6_only(wasm_exec_env_t exec_env, wasi_fd_t fd,
|
||||||
|
|
||||||
curfds = wasi_ctx_get_curfds(module_inst, wasi_ctx);
|
curfds = wasi_ctx_get_curfds(module_inst, wasi_ctx);
|
||||||
|
|
||||||
return wasmtime_ssp_sock_get_ipv6_only(curfds, fd, is_enabled);
|
return wasmtime_ssp_sock_get_ipv6_only(exec_env, curfds, fd, is_enabled);
|
||||||
}
|
}
|
||||||
|
|
||||||
static wasi_errno_t
|
static wasi_errno_t
|
||||||
|
@ -1592,7 +1605,7 @@ wasi_sock_listen(wasm_exec_env_t exec_env, wasi_fd_t fd, uint32 backlog)
|
||||||
|
|
||||||
curfds = wasi_ctx_get_curfds(module_inst, wasi_ctx);
|
curfds = wasi_ctx_get_curfds(module_inst, wasi_ctx);
|
||||||
|
|
||||||
return wasi_ssp_sock_listen(curfds, fd, backlog);
|
return wasi_ssp_sock_listen(exec_env, curfds, fd, backlog);
|
||||||
}
|
}
|
||||||
|
|
||||||
static wasi_errno_t
|
static wasi_errno_t
|
||||||
|
@ -1609,7 +1622,7 @@ wasi_sock_open(wasm_exec_env_t exec_env, wasi_fd_t poolfd,
|
||||||
|
|
||||||
curfds = wasi_ctx_get_curfds(module_inst, wasi_ctx);
|
curfds = wasi_ctx_get_curfds(module_inst, wasi_ctx);
|
||||||
|
|
||||||
return wasi_ssp_sock_open(curfds, poolfd, af, socktype, sockfd);
|
return wasi_ssp_sock_open(exec_env, curfds, poolfd, af, socktype, sockfd);
|
||||||
}
|
}
|
||||||
|
|
||||||
static wasi_errno_t
|
static wasi_errno_t
|
||||||
|
@ -1624,7 +1637,7 @@ wasi_sock_set_broadcast(wasm_exec_env_t exec_env, wasi_fd_t fd, bool is_enabled)
|
||||||
|
|
||||||
curfds = wasi_ctx_get_curfds(module_inst, wasi_ctx);
|
curfds = wasi_ctx_get_curfds(module_inst, wasi_ctx);
|
||||||
|
|
||||||
return wasmtime_ssp_sock_set_broadcast(curfds, fd, is_enabled);
|
return wasmtime_ssp_sock_set_broadcast(exec_env, curfds, fd, is_enabled);
|
||||||
}
|
}
|
||||||
|
|
||||||
static wasi_errno_t
|
static wasi_errno_t
|
||||||
|
@ -1640,7 +1653,7 @@ wasi_sock_set_keep_alive(wasm_exec_env_t exec_env, wasi_fd_t fd,
|
||||||
|
|
||||||
curfds = wasi_ctx_get_curfds(module_inst, wasi_ctx);
|
curfds = wasi_ctx_get_curfds(module_inst, wasi_ctx);
|
||||||
|
|
||||||
return wasmtime_ssp_sock_set_keep_alive(curfds, fd, is_enabled);
|
return wasmtime_ssp_sock_set_keep_alive(exec_env, curfds, fd, is_enabled);
|
||||||
}
|
}
|
||||||
|
|
||||||
static wasi_errno_t
|
static wasi_errno_t
|
||||||
|
@ -1656,7 +1669,8 @@ wasi_sock_set_linger(wasm_exec_env_t exec_env, wasi_fd_t fd, bool is_enabled,
|
||||||
|
|
||||||
curfds = wasi_ctx_get_curfds(module_inst, wasi_ctx);
|
curfds = wasi_ctx_get_curfds(module_inst, wasi_ctx);
|
||||||
|
|
||||||
return wasmtime_ssp_sock_set_linger(curfds, fd, is_enabled, linger_s);
|
return wasmtime_ssp_sock_set_linger(exec_env, curfds, fd, is_enabled,
|
||||||
|
linger_s);
|
||||||
}
|
}
|
||||||
|
|
||||||
static wasi_errno_t
|
static wasi_errno_t
|
||||||
|
@ -1671,7 +1685,7 @@ wasi_sock_set_recv_buf_size(wasm_exec_env_t exec_env, wasi_fd_t fd, size_t size)
|
||||||
|
|
||||||
curfds = wasi_ctx_get_curfds(module_inst, wasi_ctx);
|
curfds = wasi_ctx_get_curfds(module_inst, wasi_ctx);
|
||||||
|
|
||||||
return wasmtime_ssp_sock_set_recv_buf_size(curfds, fd, size);
|
return wasmtime_ssp_sock_set_recv_buf_size(exec_env, curfds, fd, size);
|
||||||
}
|
}
|
||||||
|
|
||||||
static wasi_errno_t
|
static wasi_errno_t
|
||||||
|
@ -1687,7 +1701,7 @@ wasi_sock_set_recv_timeout(wasm_exec_env_t exec_env, wasi_fd_t fd,
|
||||||
|
|
||||||
curfds = wasi_ctx_get_curfds(module_inst, wasi_ctx);
|
curfds = wasi_ctx_get_curfds(module_inst, wasi_ctx);
|
||||||
|
|
||||||
return wasmtime_ssp_sock_set_recv_timeout(curfds, fd, timeout_us);
|
return wasmtime_ssp_sock_set_recv_timeout(exec_env, curfds, fd, timeout_us);
|
||||||
}
|
}
|
||||||
|
|
||||||
static wasi_errno_t
|
static wasi_errno_t
|
||||||
|
@ -1703,7 +1717,7 @@ wasi_sock_set_reuse_addr(wasm_exec_env_t exec_env, wasi_fd_t fd,
|
||||||
|
|
||||||
curfds = wasi_ctx_get_curfds(module_inst, wasi_ctx);
|
curfds = wasi_ctx_get_curfds(module_inst, wasi_ctx);
|
||||||
|
|
||||||
return wasmtime_ssp_sock_set_reuse_addr(curfds, fd, is_enabled);
|
return wasmtime_ssp_sock_set_reuse_addr(exec_env, curfds, fd, is_enabled);
|
||||||
}
|
}
|
||||||
|
|
||||||
static wasi_errno_t
|
static wasi_errno_t
|
||||||
|
@ -1719,7 +1733,7 @@ wasi_sock_set_reuse_port(wasm_exec_env_t exec_env, wasi_fd_t fd,
|
||||||
|
|
||||||
curfds = wasi_ctx_get_curfds(module_inst, wasi_ctx);
|
curfds = wasi_ctx_get_curfds(module_inst, wasi_ctx);
|
||||||
|
|
||||||
return wasmtime_ssp_sock_set_reuse_port(curfds, fd, is_enabled);
|
return wasmtime_ssp_sock_set_reuse_port(exec_env, curfds, fd, is_enabled);
|
||||||
}
|
}
|
||||||
|
|
||||||
static wasi_errno_t
|
static wasi_errno_t
|
||||||
|
@ -1734,7 +1748,7 @@ wasi_sock_set_send_buf_size(wasm_exec_env_t exec_env, wasi_fd_t fd, size_t size)
|
||||||
|
|
||||||
curfds = wasi_ctx_get_curfds(module_inst, wasi_ctx);
|
curfds = wasi_ctx_get_curfds(module_inst, wasi_ctx);
|
||||||
|
|
||||||
return wasmtime_ssp_sock_set_send_buf_size(curfds, fd, size);
|
return wasmtime_ssp_sock_set_send_buf_size(exec_env, curfds, fd, size);
|
||||||
}
|
}
|
||||||
|
|
||||||
static wasi_errno_t
|
static wasi_errno_t
|
||||||
|
@ -1750,7 +1764,7 @@ wasi_sock_set_send_timeout(wasm_exec_env_t exec_env, wasi_fd_t fd,
|
||||||
|
|
||||||
curfds = wasi_ctx_get_curfds(module_inst, wasi_ctx);
|
curfds = wasi_ctx_get_curfds(module_inst, wasi_ctx);
|
||||||
|
|
||||||
return wasmtime_ssp_sock_set_send_timeout(curfds, fd, timeout_us);
|
return wasmtime_ssp_sock_set_send_timeout(exec_env, curfds, fd, timeout_us);
|
||||||
}
|
}
|
||||||
|
|
||||||
static wasi_errno_t
|
static wasi_errno_t
|
||||||
|
@ -1766,7 +1780,8 @@ wasi_sock_set_tcp_fastopen_connect(wasm_exec_env_t exec_env, wasi_fd_t fd,
|
||||||
|
|
||||||
curfds = wasi_ctx_get_curfds(module_inst, wasi_ctx);
|
curfds = wasi_ctx_get_curfds(module_inst, wasi_ctx);
|
||||||
|
|
||||||
return wasmtime_ssp_sock_set_tcp_fastopen_connect(curfds, fd, is_enabled);
|
return wasmtime_ssp_sock_set_tcp_fastopen_connect(exec_env, curfds, fd,
|
||||||
|
is_enabled);
|
||||||
}
|
}
|
||||||
|
|
||||||
static wasi_errno_t
|
static wasi_errno_t
|
||||||
|
@ -1782,7 +1797,7 @@ wasi_sock_set_tcp_no_delay(wasm_exec_env_t exec_env, wasi_fd_t fd,
|
||||||
|
|
||||||
curfds = wasi_ctx_get_curfds(module_inst, wasi_ctx);
|
curfds = wasi_ctx_get_curfds(module_inst, wasi_ctx);
|
||||||
|
|
||||||
return wasmtime_ssp_sock_set_tcp_no_delay(curfds, fd, is_enabled);
|
return wasmtime_ssp_sock_set_tcp_no_delay(exec_env, curfds, fd, is_enabled);
|
||||||
}
|
}
|
||||||
|
|
||||||
static wasi_errno_t
|
static wasi_errno_t
|
||||||
|
@ -1798,7 +1813,8 @@ wasi_sock_set_tcp_quick_ack(wasm_exec_env_t exec_env, wasi_fd_t fd,
|
||||||
|
|
||||||
curfds = wasi_ctx_get_curfds(module_inst, wasi_ctx);
|
curfds = wasi_ctx_get_curfds(module_inst, wasi_ctx);
|
||||||
|
|
||||||
return wasmtime_ssp_sock_set_tcp_quick_ack(curfds, fd, is_enabled);
|
return wasmtime_ssp_sock_set_tcp_quick_ack(exec_env, curfds, fd,
|
||||||
|
is_enabled);
|
||||||
}
|
}
|
||||||
|
|
||||||
static wasi_errno_t
|
static wasi_errno_t
|
||||||
|
@ -1814,7 +1830,7 @@ wasi_sock_set_tcp_keep_idle(wasm_exec_env_t exec_env, wasi_fd_t fd,
|
||||||
|
|
||||||
curfds = wasi_ctx_get_curfds(module_inst, wasi_ctx);
|
curfds = wasi_ctx_get_curfds(module_inst, wasi_ctx);
|
||||||
|
|
||||||
return wasmtime_ssp_sock_set_tcp_keep_idle(curfds, fd, time_s);
|
return wasmtime_ssp_sock_set_tcp_keep_idle(exec_env, curfds, fd, time_s);
|
||||||
}
|
}
|
||||||
|
|
||||||
static wasi_errno_t
|
static wasi_errno_t
|
||||||
|
@ -1830,7 +1846,7 @@ wasi_sock_set_tcp_keep_intvl(wasm_exec_env_t exec_env, wasi_fd_t fd,
|
||||||
|
|
||||||
curfds = wasi_ctx_get_curfds(module_inst, wasi_ctx);
|
curfds = wasi_ctx_get_curfds(module_inst, wasi_ctx);
|
||||||
|
|
||||||
return wasmtime_ssp_sock_set_tcp_keep_intvl(curfds, fd, time_s);
|
return wasmtime_ssp_sock_set_tcp_keep_intvl(exec_env, curfds, fd, time_s);
|
||||||
}
|
}
|
||||||
|
|
||||||
static wasi_errno_t
|
static wasi_errno_t
|
||||||
|
@ -1846,7 +1862,7 @@ wasi_sock_set_ip_multicast_loop(wasm_exec_env_t exec_env, wasi_fd_t fd,
|
||||||
|
|
||||||
curfds = wasi_ctx_get_curfds(module_inst, wasi_ctx);
|
curfds = wasi_ctx_get_curfds(module_inst, wasi_ctx);
|
||||||
|
|
||||||
return wasmtime_ssp_sock_set_ip_multicast_loop(curfds, fd, ipv6,
|
return wasmtime_ssp_sock_set_ip_multicast_loop(exec_env, curfds, fd, ipv6,
|
||||||
is_enabled);
|
is_enabled);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1867,8 +1883,8 @@ wasi_sock_set_ip_add_membership(wasm_exec_env_t exec_env, wasi_fd_t fd,
|
||||||
|
|
||||||
curfds = wasi_ctx_get_curfds(module_inst, wasi_ctx);
|
curfds = wasi_ctx_get_curfds(module_inst, wasi_ctx);
|
||||||
|
|
||||||
return wasmtime_ssp_sock_set_ip_add_membership(curfds, fd, imr_multiaddr,
|
return wasmtime_ssp_sock_set_ip_add_membership(
|
||||||
imr_interface);
|
exec_env, curfds, fd, imr_multiaddr, imr_interface);
|
||||||
}
|
}
|
||||||
|
|
||||||
static wasi_errno_t
|
static wasi_errno_t
|
||||||
|
@ -1888,8 +1904,8 @@ wasi_sock_set_ip_drop_membership(wasm_exec_env_t exec_env, wasi_fd_t fd,
|
||||||
|
|
||||||
curfds = wasi_ctx_get_curfds(module_inst, wasi_ctx);
|
curfds = wasi_ctx_get_curfds(module_inst, wasi_ctx);
|
||||||
|
|
||||||
return wasmtime_ssp_sock_set_ip_drop_membership(curfds, fd, imr_multiaddr,
|
return wasmtime_ssp_sock_set_ip_drop_membership(
|
||||||
imr_interface);
|
exec_env, curfds, fd, imr_multiaddr, imr_interface);
|
||||||
}
|
}
|
||||||
|
|
||||||
static wasi_errno_t
|
static wasi_errno_t
|
||||||
|
@ -1904,7 +1920,7 @@ wasi_sock_set_ip_ttl(wasm_exec_env_t exec_env, wasi_fd_t fd, uint8_t ttl_s)
|
||||||
|
|
||||||
curfds = wasi_ctx_get_curfds(module_inst, wasi_ctx);
|
curfds = wasi_ctx_get_curfds(module_inst, wasi_ctx);
|
||||||
|
|
||||||
return wasmtime_ssp_sock_set_ip_ttl(curfds, fd, ttl_s);
|
return wasmtime_ssp_sock_set_ip_ttl(exec_env, curfds, fd, ttl_s);
|
||||||
}
|
}
|
||||||
|
|
||||||
static wasi_errno_t
|
static wasi_errno_t
|
||||||
|
@ -1920,7 +1936,7 @@ wasi_sock_set_ip_multicast_ttl(wasm_exec_env_t exec_env, wasi_fd_t fd,
|
||||||
|
|
||||||
curfds = wasi_ctx_get_curfds(module_inst, wasi_ctx);
|
curfds = wasi_ctx_get_curfds(module_inst, wasi_ctx);
|
||||||
|
|
||||||
return wasmtime_ssp_sock_set_ip_multicast_ttl(curfds, fd, ttl_s);
|
return wasmtime_ssp_sock_set_ip_multicast_ttl(exec_env, curfds, fd, ttl_s);
|
||||||
}
|
}
|
||||||
|
|
||||||
static wasi_errno_t
|
static wasi_errno_t
|
||||||
|
@ -1935,7 +1951,7 @@ wasi_sock_set_ipv6_only(wasm_exec_env_t exec_env, wasi_fd_t fd, bool is_enabled)
|
||||||
|
|
||||||
curfds = wasi_ctx_get_curfds(module_inst, wasi_ctx);
|
curfds = wasi_ctx_get_curfds(module_inst, wasi_ctx);
|
||||||
|
|
||||||
return wasmtime_ssp_sock_set_ipv6_only(curfds, fd, is_enabled);
|
return wasmtime_ssp_sock_set_ipv6_only(exec_env, curfds, fd, is_enabled);
|
||||||
}
|
}
|
||||||
|
|
||||||
static wasi_errno_t
|
static wasi_errno_t
|
||||||
|
@ -2053,8 +2069,9 @@ wasi_sock_recv_from(wasm_exec_env_t exec_env, wasi_fd_t sock,
|
||||||
memset(buf_begin, 0, total_size);
|
memset(buf_begin, 0, total_size);
|
||||||
|
|
||||||
*ro_data_len = 0;
|
*ro_data_len = 0;
|
||||||
err = wasmtime_ssp_sock_recv_from(curfds, sock, buf_begin, total_size,
|
err = wasmtime_ssp_sock_recv_from(exec_env, curfds, sock, buf_begin,
|
||||||
ri_flags, src_addr, &recv_bytes);
|
total_size, ri_flags, src_addr,
|
||||||
|
&recv_bytes);
|
||||||
if (err != __WASI_ESUCCESS) {
|
if (err != __WASI_ESUCCESS) {
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
@ -2153,7 +2170,8 @@ wasi_sock_send(wasm_exec_env_t exec_env, wasi_fd_t sock,
|
||||||
return err;
|
return err;
|
||||||
|
|
||||||
*so_data_len = 0;
|
*so_data_len = 0;
|
||||||
err = wasmtime_ssp_sock_send(curfds, sock, buf, buf_size, &send_bytes);
|
err = wasmtime_ssp_sock_send(exec_env, curfds, sock, buf, buf_size,
|
||||||
|
&send_bytes);
|
||||||
*so_data_len = (uint32)send_bytes;
|
*so_data_len = (uint32)send_bytes;
|
||||||
|
|
||||||
wasm_runtime_free(buf);
|
wasm_runtime_free(buf);
|
||||||
|
@ -2193,8 +2211,8 @@ wasi_sock_send_to(wasm_exec_env_t exec_env, wasi_fd_t sock,
|
||||||
return err;
|
return err;
|
||||||
|
|
||||||
*so_data_len = 0;
|
*so_data_len = 0;
|
||||||
err = wasmtime_ssp_sock_send_to(curfds, addr_pool, sock, buf, buf_size,
|
err = wasmtime_ssp_sock_send_to(exec_env, curfds, addr_pool, sock, buf,
|
||||||
si_flags, dest_addr, &send_bytes);
|
buf_size, si_flags, dest_addr, &send_bytes);
|
||||||
*so_data_len = (uint32)send_bytes;
|
*so_data_len = (uint32)send_bytes;
|
||||||
|
|
||||||
wasm_runtime_free(buf);
|
wasm_runtime_free(buf);
|
||||||
|
@ -2212,7 +2230,7 @@ wasi_sock_shutdown(wasm_exec_env_t exec_env, wasi_fd_t sock, wasi_sdflags_t how)
|
||||||
if (!wasi_ctx)
|
if (!wasi_ctx)
|
||||||
return __WASI_EINVAL;
|
return __WASI_EINVAL;
|
||||||
|
|
||||||
return wasmtime_ssp_sock_shutdown(curfds, sock);
|
return wasmtime_ssp_sock_shutdown(exec_env, curfds, sock);
|
||||||
}
|
}
|
||||||
|
|
||||||
static wasi_errno_t
|
static wasi_errno_t
|
||||||
|
|
|
@ -22,6 +22,8 @@
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#include "wasm_export.h"
|
||||||
|
|
||||||
/* clang-format off */
|
/* clang-format off */
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
@ -274,37 +276,6 @@ typedef uint8_t __wasi_sdflags_t;
|
||||||
typedef uint16_t __wasi_siflags_t;
|
typedef uint16_t __wasi_siflags_t;
|
||||||
|
|
||||||
typedef uint8_t __wasi_signal_t;
|
typedef uint8_t __wasi_signal_t;
|
||||||
// 0 is reserved; POSIX has special semantics for kill(pid, 0).
|
|
||||||
#define __WASI_SIGHUP (1)
|
|
||||||
#define __WASI_SIGINT (2)
|
|
||||||
#define __WASI_SIGQUIT (3)
|
|
||||||
#define __WASI_SIGILL (4)
|
|
||||||
#define __WASI_SIGTRAP (5)
|
|
||||||
#define __WASI_SIGABRT (6)
|
|
||||||
#define __WASI_SIGBUS (7)
|
|
||||||
#define __WASI_SIGFPE (8)
|
|
||||||
#define __WASI_SIGKILL (9)
|
|
||||||
#define __WASI_SIGUSR1 (10)
|
|
||||||
#define __WASI_SIGSEGV (11)
|
|
||||||
#define __WASI_SIGUSR2 (12)
|
|
||||||
#define __WASI_SIGPIPE (13)
|
|
||||||
#define __WASI_SIGALRM (14)
|
|
||||||
#define __WASI_SIGTERM (15)
|
|
||||||
#define __WASI_SIGCHLD (16)
|
|
||||||
#define __WASI_SIGCONT (17)
|
|
||||||
#define __WASI_SIGSTOP (18)
|
|
||||||
#define __WASI_SIGTSTP (19)
|
|
||||||
#define __WASI_SIGTTIN (20)
|
|
||||||
#define __WASI_SIGTTOU (21)
|
|
||||||
#define __WASI_SIGURG (22)
|
|
||||||
#define __WASI_SIGXCPU (23)
|
|
||||||
#define __WASI_SIGXFSZ (24)
|
|
||||||
#define __WASI_SIGVTALRM (25)
|
|
||||||
#define __WASI_SIGPROF (26)
|
|
||||||
#define __WASI_SIGWINCH (27)
|
|
||||||
#define __WASI_SIGPOLL (28)
|
|
||||||
#define __WASI_SIGPWR (29)
|
|
||||||
#define __WASI_SIGSYS (30)
|
|
||||||
|
|
||||||
typedef uint16_t __wasi_subclockflags_t;
|
typedef uint16_t __wasi_subclockflags_t;
|
||||||
#define __WASI_SUBSCRIPTION_CLOCK_ABSTIME (0x0001)
|
#define __WASI_SUBSCRIPTION_CLOCK_ABSTIME (0x0001)
|
||||||
|
@ -639,17 +610,13 @@ typedef struct __wasi_addr_info_hints_t {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
__wasi_errno_t wasmtime_ssp_args_get(
|
__wasi_errno_t wasmtime_ssp_args_get(
|
||||||
#if !defined(WASMTIME_SSP_STATIC_CURFDS)
|
|
||||||
struct argv_environ_values *arg_environ,
|
struct argv_environ_values *arg_environ,
|
||||||
#endif
|
|
||||||
char **argv,
|
char **argv,
|
||||||
char *argv_buf
|
char *argv_buf
|
||||||
) WASMTIME_SSP_SYSCALL_NAME(args_get) WARN_UNUSED;
|
) WASMTIME_SSP_SYSCALL_NAME(args_get) WARN_UNUSED;
|
||||||
|
|
||||||
__wasi_errno_t wasmtime_ssp_args_sizes_get(
|
__wasi_errno_t wasmtime_ssp_args_sizes_get(
|
||||||
#if !defined(WASMTIME_SSP_STATIC_CURFDS)
|
|
||||||
struct argv_environ_values *arg_environ,
|
struct argv_environ_values *arg_environ,
|
||||||
#endif
|
|
||||||
size_t *argc,
|
size_t *argc,
|
||||||
size_t *argv_buf_size
|
size_t *argv_buf_size
|
||||||
) WASMTIME_SSP_SYSCALL_NAME(args_sizes_get) WARN_UNUSED;
|
) WASMTIME_SSP_SYSCALL_NAME(args_sizes_get) WARN_UNUSED;
|
||||||
|
@ -666,57 +633,46 @@ __wasi_errno_t wasmtime_ssp_clock_time_get(
|
||||||
) WASMTIME_SSP_SYSCALL_NAME(clock_time_get) WARN_UNUSED;
|
) WASMTIME_SSP_SYSCALL_NAME(clock_time_get) WARN_UNUSED;
|
||||||
|
|
||||||
__wasi_errno_t wasmtime_ssp_environ_get(
|
__wasi_errno_t wasmtime_ssp_environ_get(
|
||||||
#if !defined(WASMTIME_SSP_STATIC_CURFDS)
|
|
||||||
struct argv_environ_values *arg_environ,
|
struct argv_environ_values *arg_environ,
|
||||||
#endif
|
|
||||||
char **environ,
|
char **environ,
|
||||||
char *environ_buf
|
char *environ_buf
|
||||||
) WASMTIME_SSP_SYSCALL_NAME(environ_get) WARN_UNUSED;
|
) WASMTIME_SSP_SYSCALL_NAME(environ_get) WARN_UNUSED;
|
||||||
|
|
||||||
__wasi_errno_t wasmtime_ssp_environ_sizes_get(
|
__wasi_errno_t wasmtime_ssp_environ_sizes_get(
|
||||||
#if !defined(WASMTIME_SSP_STATIC_CURFDS)
|
|
||||||
struct argv_environ_values *arg_environ,
|
struct argv_environ_values *arg_environ,
|
||||||
#endif
|
|
||||||
size_t *environ_count,
|
size_t *environ_count,
|
||||||
size_t *environ_buf_size
|
size_t *environ_buf_size
|
||||||
) WASMTIME_SSP_SYSCALL_NAME(environ_sizes_get) WARN_UNUSED;
|
) WASMTIME_SSP_SYSCALL_NAME(environ_sizes_get) WARN_UNUSED;
|
||||||
|
|
||||||
__wasi_errno_t wasmtime_ssp_fd_prestat_get(
|
__wasi_errno_t wasmtime_ssp_fd_prestat_get(
|
||||||
#if !defined(WASMTIME_SSP_STATIC_CURFDS)
|
|
||||||
struct fd_prestats *prestats,
|
struct fd_prestats *prestats,
|
||||||
#endif
|
|
||||||
__wasi_fd_t fd,
|
__wasi_fd_t fd,
|
||||||
__wasi_prestat_t *buf
|
__wasi_prestat_t *buf
|
||||||
) WASMTIME_SSP_SYSCALL_NAME(fd_prestat_get) WARN_UNUSED;
|
) WASMTIME_SSP_SYSCALL_NAME(fd_prestat_get) WARN_UNUSED;
|
||||||
|
|
||||||
__wasi_errno_t wasmtime_ssp_fd_prestat_dir_name(
|
__wasi_errno_t wasmtime_ssp_fd_prestat_dir_name(
|
||||||
#if !defined(WASMTIME_SSP_STATIC_CURFDS)
|
|
||||||
struct fd_prestats *prestats,
|
struct fd_prestats *prestats,
|
||||||
#endif
|
|
||||||
__wasi_fd_t fd,
|
__wasi_fd_t fd,
|
||||||
char *path,
|
char *path,
|
||||||
size_t path_len
|
size_t path_len
|
||||||
) WASMTIME_SSP_SYSCALL_NAME(fd_prestat_dir_name) WARN_UNUSED;
|
) WASMTIME_SSP_SYSCALL_NAME(fd_prestat_dir_name) WARN_UNUSED;
|
||||||
|
|
||||||
__wasi_errno_t wasmtime_ssp_fd_close(
|
__wasi_errno_t wasmtime_ssp_fd_close(
|
||||||
#if !defined(WASMTIME_SSP_STATIC_CURFDS)
|
wasm_exec_env_t exec_env,
|
||||||
struct fd_table *curfds,
|
struct fd_table *curfds,
|
||||||
struct fd_prestats *prestats,
|
struct fd_prestats *prestats,
|
||||||
#endif
|
|
||||||
__wasi_fd_t fd
|
__wasi_fd_t fd
|
||||||
) WASMTIME_SSP_SYSCALL_NAME(fd_close) WARN_UNUSED;
|
) WASMTIME_SSP_SYSCALL_NAME(fd_close) WARN_UNUSED;
|
||||||
|
|
||||||
__wasi_errno_t wasmtime_ssp_fd_datasync(
|
__wasi_errno_t wasmtime_ssp_fd_datasync(
|
||||||
#if !defined(WASMTIME_SSP_STATIC_CURFDS)
|
wasm_exec_env_t exec_env,
|
||||||
struct fd_table *curfds,
|
struct fd_table *curfds,
|
||||||
#endif
|
|
||||||
__wasi_fd_t fd
|
__wasi_fd_t fd
|
||||||
) WASMTIME_SSP_SYSCALL_NAME(fd_datasync) WARN_UNUSED;
|
) WASMTIME_SSP_SYSCALL_NAME(fd_datasync) WARN_UNUSED;
|
||||||
|
|
||||||
__wasi_errno_t wasmtime_ssp_fd_pread(
|
__wasi_errno_t wasmtime_ssp_fd_pread(
|
||||||
#if !defined(WASMTIME_SSP_STATIC_CURFDS)
|
wasm_exec_env_t exec_env,
|
||||||
struct fd_table *curfds,
|
struct fd_table *curfds,
|
||||||
#endif
|
|
||||||
__wasi_fd_t fd,
|
__wasi_fd_t fd,
|
||||||
const __wasi_iovec_t *iovs,
|
const __wasi_iovec_t *iovs,
|
||||||
size_t iovs_len,
|
size_t iovs_len,
|
||||||
|
@ -725,9 +681,8 @@ __wasi_errno_t wasmtime_ssp_fd_pread(
|
||||||
) WASMTIME_SSP_SYSCALL_NAME(fd_pread) WARN_UNUSED;
|
) WASMTIME_SSP_SYSCALL_NAME(fd_pread) WARN_UNUSED;
|
||||||
|
|
||||||
__wasi_errno_t wasmtime_ssp_fd_pwrite(
|
__wasi_errno_t wasmtime_ssp_fd_pwrite(
|
||||||
#if !defined(WASMTIME_SSP_STATIC_CURFDS)
|
wasm_exec_env_t exec_env,
|
||||||
struct fd_table *curfds,
|
struct fd_table *curfds,
|
||||||
#endif
|
|
||||||
__wasi_fd_t fd,
|
__wasi_fd_t fd,
|
||||||
const __wasi_ciovec_t *iovs,
|
const __wasi_ciovec_t *iovs,
|
||||||
size_t iovs_len,
|
size_t iovs_len,
|
||||||
|
@ -736,9 +691,8 @@ __wasi_errno_t wasmtime_ssp_fd_pwrite(
|
||||||
) WASMTIME_SSP_SYSCALL_NAME(fd_pwrite) WARN_UNUSED;
|
) WASMTIME_SSP_SYSCALL_NAME(fd_pwrite) WARN_UNUSED;
|
||||||
|
|
||||||
__wasi_errno_t wasmtime_ssp_fd_read(
|
__wasi_errno_t wasmtime_ssp_fd_read(
|
||||||
#if !defined(WASMTIME_SSP_STATIC_CURFDS)
|
wasm_exec_env_t exec_env,
|
||||||
struct fd_table *curfds,
|
struct fd_table *curfds,
|
||||||
#endif
|
|
||||||
__wasi_fd_t fd,
|
__wasi_fd_t fd,
|
||||||
const __wasi_iovec_t *iovs,
|
const __wasi_iovec_t *iovs,
|
||||||
size_t iovs_len,
|
size_t iovs_len,
|
||||||
|
@ -746,18 +700,16 @@ __wasi_errno_t wasmtime_ssp_fd_read(
|
||||||
) WASMTIME_SSP_SYSCALL_NAME(fd_read) WARN_UNUSED;
|
) WASMTIME_SSP_SYSCALL_NAME(fd_read) WARN_UNUSED;
|
||||||
|
|
||||||
__wasi_errno_t wasmtime_ssp_fd_renumber(
|
__wasi_errno_t wasmtime_ssp_fd_renumber(
|
||||||
#if !defined(WASMTIME_SSP_STATIC_CURFDS)
|
wasm_exec_env_t exec_env,
|
||||||
struct fd_table *curfds,
|
struct fd_table *curfds,
|
||||||
struct fd_prestats *prestats,
|
struct fd_prestats *prestats,
|
||||||
#endif
|
|
||||||
__wasi_fd_t from,
|
__wasi_fd_t from,
|
||||||
__wasi_fd_t to
|
__wasi_fd_t to
|
||||||
) WASMTIME_SSP_SYSCALL_NAME(fd_renumber) WARN_UNUSED;
|
) WASMTIME_SSP_SYSCALL_NAME(fd_renumber) WARN_UNUSED;
|
||||||
|
|
||||||
__wasi_errno_t wasmtime_ssp_fd_seek(
|
__wasi_errno_t wasmtime_ssp_fd_seek(
|
||||||
#if !defined(WASMTIME_SSP_STATIC_CURFDS)
|
wasm_exec_env_t exec_env,
|
||||||
struct fd_table *curfds,
|
struct fd_table *curfds,
|
||||||
#endif
|
|
||||||
__wasi_fd_t fd,
|
__wasi_fd_t fd,
|
||||||
__wasi_filedelta_t offset,
|
__wasi_filedelta_t offset,
|
||||||
__wasi_whence_t whence,
|
__wasi_whence_t whence,
|
||||||
|
@ -765,49 +717,43 @@ __wasi_errno_t wasmtime_ssp_fd_seek(
|
||||||
) WASMTIME_SSP_SYSCALL_NAME(fd_seek) WARN_UNUSED;
|
) WASMTIME_SSP_SYSCALL_NAME(fd_seek) WARN_UNUSED;
|
||||||
|
|
||||||
__wasi_errno_t wasmtime_ssp_fd_tell(
|
__wasi_errno_t wasmtime_ssp_fd_tell(
|
||||||
#if !defined(WASMTIME_SSP_STATIC_CURFDS)
|
wasm_exec_env_t exec_env,
|
||||||
struct fd_table *curfds,
|
struct fd_table *curfds,
|
||||||
#endif
|
|
||||||
__wasi_fd_t fd,
|
__wasi_fd_t fd,
|
||||||
__wasi_filesize_t *newoffset
|
__wasi_filesize_t *newoffset
|
||||||
) WASMTIME_SSP_SYSCALL_NAME(fd_tell) WARN_UNUSED;
|
) WASMTIME_SSP_SYSCALL_NAME(fd_tell) WARN_UNUSED;
|
||||||
|
|
||||||
__wasi_errno_t wasmtime_ssp_fd_fdstat_get(
|
__wasi_errno_t wasmtime_ssp_fd_fdstat_get(
|
||||||
#if !defined(WASMTIME_SSP_STATIC_CURFDS)
|
wasm_exec_env_t exec_env,
|
||||||
struct fd_table *curfds,
|
struct fd_table *curfds,
|
||||||
#endif
|
|
||||||
__wasi_fd_t fd,
|
__wasi_fd_t fd,
|
||||||
__wasi_fdstat_t *buf
|
__wasi_fdstat_t *buf
|
||||||
) WASMTIME_SSP_SYSCALL_NAME(fd_fdstat_get) WARN_UNUSED;
|
) WASMTIME_SSP_SYSCALL_NAME(fd_fdstat_get) WARN_UNUSED;
|
||||||
|
|
||||||
__wasi_errno_t wasmtime_ssp_fd_fdstat_set_flags(
|
__wasi_errno_t wasmtime_ssp_fd_fdstat_set_flags(
|
||||||
#if !defined(WASMTIME_SSP_STATIC_CURFDS)
|
wasm_exec_env_t exec_env,
|
||||||
struct fd_table *curfds,
|
struct fd_table *curfds,
|
||||||
#endif
|
|
||||||
__wasi_fd_t fd,
|
__wasi_fd_t fd,
|
||||||
__wasi_fdflags_t flags
|
__wasi_fdflags_t flags
|
||||||
) WASMTIME_SSP_SYSCALL_NAME(fd_fdstat_set_flags) WARN_UNUSED;
|
) WASMTIME_SSP_SYSCALL_NAME(fd_fdstat_set_flags) WARN_UNUSED;
|
||||||
|
|
||||||
__wasi_errno_t wasmtime_ssp_fd_fdstat_set_rights(
|
__wasi_errno_t wasmtime_ssp_fd_fdstat_set_rights(
|
||||||
#if !defined(WASMTIME_SSP_STATIC_CURFDS)
|
wasm_exec_env_t exec_env,
|
||||||
struct fd_table *curfds,
|
struct fd_table *curfds,
|
||||||
#endif
|
|
||||||
__wasi_fd_t fd,
|
__wasi_fd_t fd,
|
||||||
__wasi_rights_t fs_rights_base,
|
__wasi_rights_t fs_rights_base,
|
||||||
__wasi_rights_t fs_rights_inheriting
|
__wasi_rights_t fs_rights_inheriting
|
||||||
) WASMTIME_SSP_SYSCALL_NAME(fd_fdstat_set_rights) WARN_UNUSED;
|
) WASMTIME_SSP_SYSCALL_NAME(fd_fdstat_set_rights) WARN_UNUSED;
|
||||||
|
|
||||||
__wasi_errno_t wasmtime_ssp_fd_sync(
|
__wasi_errno_t wasmtime_ssp_fd_sync(
|
||||||
#if !defined(WASMTIME_SSP_STATIC_CURFDS)
|
wasm_exec_env_t exec_env,
|
||||||
struct fd_table *curfds,
|
struct fd_table *curfds,
|
||||||
#endif
|
|
||||||
__wasi_fd_t fd
|
__wasi_fd_t fd
|
||||||
) WASMTIME_SSP_SYSCALL_NAME(fd_sync) WARN_UNUSED;
|
) WASMTIME_SSP_SYSCALL_NAME(fd_sync) WARN_UNUSED;
|
||||||
|
|
||||||
__wasi_errno_t wasmtime_ssp_fd_write(
|
__wasi_errno_t wasmtime_ssp_fd_write(
|
||||||
#if !defined(WASMTIME_SSP_STATIC_CURFDS)
|
wasm_exec_env_t exec_env,
|
||||||
struct fd_table *curfds,
|
struct fd_table *curfds,
|
||||||
#endif
|
|
||||||
__wasi_fd_t fd,
|
__wasi_fd_t fd,
|
||||||
const __wasi_ciovec_t *iovs,
|
const __wasi_ciovec_t *iovs,
|
||||||
size_t iovs_len,
|
size_t iovs_len,
|
||||||
|
@ -815,9 +761,8 @@ __wasi_errno_t wasmtime_ssp_fd_write(
|
||||||
) WASMTIME_SSP_SYSCALL_NAME(fd_write) WARN_UNUSED;
|
) WASMTIME_SSP_SYSCALL_NAME(fd_write) WARN_UNUSED;
|
||||||
|
|
||||||
__wasi_errno_t wasmtime_ssp_fd_advise(
|
__wasi_errno_t wasmtime_ssp_fd_advise(
|
||||||
#if !defined(WASMTIME_SSP_STATIC_CURFDS)
|
wasm_exec_env_t exec_env,
|
||||||
struct fd_table *curfds,
|
struct fd_table *curfds,
|
||||||
#endif
|
|
||||||
__wasi_fd_t fd,
|
__wasi_fd_t fd,
|
||||||
__wasi_filesize_t offset,
|
__wasi_filesize_t offset,
|
||||||
__wasi_filesize_t len,
|
__wasi_filesize_t len,
|
||||||
|
@ -825,28 +770,25 @@ __wasi_errno_t wasmtime_ssp_fd_advise(
|
||||||
) WASMTIME_SSP_SYSCALL_NAME(fd_advise) WARN_UNUSED;
|
) WASMTIME_SSP_SYSCALL_NAME(fd_advise) WARN_UNUSED;
|
||||||
|
|
||||||
__wasi_errno_t wasmtime_ssp_fd_allocate(
|
__wasi_errno_t wasmtime_ssp_fd_allocate(
|
||||||
#if !defined(WASMTIME_SSP_STATIC_CURFDS)
|
wasm_exec_env_t exec_env,
|
||||||
struct fd_table *curfds,
|
struct fd_table *curfds,
|
||||||
#endif
|
|
||||||
__wasi_fd_t fd,
|
__wasi_fd_t fd,
|
||||||
__wasi_filesize_t offset,
|
__wasi_filesize_t offset,
|
||||||
__wasi_filesize_t len
|
__wasi_filesize_t len
|
||||||
) WASMTIME_SSP_SYSCALL_NAME(fd_allocate) WARN_UNUSED;
|
) WASMTIME_SSP_SYSCALL_NAME(fd_allocate) WARN_UNUSED;
|
||||||
|
|
||||||
__wasi_errno_t wasmtime_ssp_path_create_directory(
|
__wasi_errno_t wasmtime_ssp_path_create_directory(
|
||||||
#if !defined(WASMTIME_SSP_STATIC_CURFDS)
|
wasm_exec_env_t exec_env,
|
||||||
struct fd_table *curfds,
|
struct fd_table *curfds,
|
||||||
#endif
|
|
||||||
__wasi_fd_t fd,
|
__wasi_fd_t fd,
|
||||||
const char *path,
|
const char *path,
|
||||||
size_t path_len
|
size_t path_len
|
||||||
) WASMTIME_SSP_SYSCALL_NAME(path_create_directory) WARN_UNUSED;
|
) WASMTIME_SSP_SYSCALL_NAME(path_create_directory) WARN_UNUSED;
|
||||||
|
|
||||||
__wasi_errno_t wasmtime_ssp_path_link(
|
__wasi_errno_t wasmtime_ssp_path_link(
|
||||||
#if !defined(WASMTIME_SSP_STATIC_CURFDS)
|
wasm_exec_env_t exec_env,
|
||||||
struct fd_table *curfds,
|
struct fd_table *curfds,
|
||||||
struct fd_prestats *prestats,
|
struct fd_prestats *prestats,
|
||||||
#endif
|
|
||||||
__wasi_fd_t old_fd,
|
__wasi_fd_t old_fd,
|
||||||
__wasi_lookupflags_t old_flags,
|
__wasi_lookupflags_t old_flags,
|
||||||
const char *old_path,
|
const char *old_path,
|
||||||
|
@ -857,9 +799,8 @@ __wasi_errno_t wasmtime_ssp_path_link(
|
||||||
) WASMTIME_SSP_SYSCALL_NAME(path_link) WARN_UNUSED;
|
) WASMTIME_SSP_SYSCALL_NAME(path_link) WARN_UNUSED;
|
||||||
|
|
||||||
__wasi_errno_t wasmtime_ssp_path_open(
|
__wasi_errno_t wasmtime_ssp_path_open(
|
||||||
#if !defined(WASMTIME_SSP_STATIC_CURFDS)
|
wasm_exec_env_t exec_env,
|
||||||
struct fd_table *curfds,
|
struct fd_table *curfds,
|
||||||
#endif
|
|
||||||
__wasi_fd_t dirfd,
|
__wasi_fd_t dirfd,
|
||||||
__wasi_lookupflags_t dirflags,
|
__wasi_lookupflags_t dirflags,
|
||||||
const char *path,
|
const char *path,
|
||||||
|
@ -872,9 +813,8 @@ __wasi_errno_t wasmtime_ssp_path_open(
|
||||||
) WASMTIME_SSP_SYSCALL_NAME(path_open) WARN_UNUSED;
|
) WASMTIME_SSP_SYSCALL_NAME(path_open) WARN_UNUSED;
|
||||||
|
|
||||||
__wasi_errno_t wasmtime_ssp_fd_readdir(
|
__wasi_errno_t wasmtime_ssp_fd_readdir(
|
||||||
#if !defined(WASMTIME_SSP_STATIC_CURFDS)
|
wasm_exec_env_t exec_env,
|
||||||
struct fd_table *curfds,
|
struct fd_table *curfds,
|
||||||
#endif
|
|
||||||
__wasi_fd_t fd,
|
__wasi_fd_t fd,
|
||||||
void *buf,
|
void *buf,
|
||||||
size_t buf_len,
|
size_t buf_len,
|
||||||
|
@ -883,9 +823,8 @@ __wasi_errno_t wasmtime_ssp_fd_readdir(
|
||||||
) WASMTIME_SSP_SYSCALL_NAME(fd_readdir) WARN_UNUSED;
|
) WASMTIME_SSP_SYSCALL_NAME(fd_readdir) WARN_UNUSED;
|
||||||
|
|
||||||
__wasi_errno_t wasmtime_ssp_path_readlink(
|
__wasi_errno_t wasmtime_ssp_path_readlink(
|
||||||
#if !defined(WASMTIME_SSP_STATIC_CURFDS)
|
wasm_exec_env_t exec_env,
|
||||||
struct fd_table *curfds,
|
struct fd_table *curfds,
|
||||||
#endif
|
|
||||||
__wasi_fd_t fd,
|
__wasi_fd_t fd,
|
||||||
const char *path,
|
const char *path,
|
||||||
size_t path_len,
|
size_t path_len,
|
||||||
|
@ -895,9 +834,8 @@ __wasi_errno_t wasmtime_ssp_path_readlink(
|
||||||
) WASMTIME_SSP_SYSCALL_NAME(path_readlink) WARN_UNUSED;
|
) WASMTIME_SSP_SYSCALL_NAME(path_readlink) WARN_UNUSED;
|
||||||
|
|
||||||
__wasi_errno_t wasmtime_ssp_path_rename(
|
__wasi_errno_t wasmtime_ssp_path_rename(
|
||||||
#if !defined(WASMTIME_SSP_STATIC_CURFDS)
|
wasm_exec_env_t exec_env,
|
||||||
struct fd_table *curfds,
|
struct fd_table *curfds,
|
||||||
#endif
|
|
||||||
__wasi_fd_t old_fd,
|
__wasi_fd_t old_fd,
|
||||||
const char *old_path,
|
const char *old_path,
|
||||||
size_t old_path_len,
|
size_t old_path_len,
|
||||||
|
@ -907,17 +845,15 @@ __wasi_errno_t wasmtime_ssp_path_rename(
|
||||||
) WASMTIME_SSP_SYSCALL_NAME(path_rename) WARN_UNUSED;
|
) WASMTIME_SSP_SYSCALL_NAME(path_rename) WARN_UNUSED;
|
||||||
|
|
||||||
__wasi_errno_t wasmtime_ssp_fd_filestat_get(
|
__wasi_errno_t wasmtime_ssp_fd_filestat_get(
|
||||||
#if !defined(WASMTIME_SSP_STATIC_CURFDS)
|
wasm_exec_env_t exec_env,
|
||||||
struct fd_table *curfds,
|
struct fd_table *curfds,
|
||||||
#endif
|
|
||||||
__wasi_fd_t fd,
|
__wasi_fd_t fd,
|
||||||
__wasi_filestat_t *buf
|
__wasi_filestat_t *buf
|
||||||
) WASMTIME_SSP_SYSCALL_NAME(fd_filestat_get) WARN_UNUSED;
|
) WASMTIME_SSP_SYSCALL_NAME(fd_filestat_get) WARN_UNUSED;
|
||||||
|
|
||||||
__wasi_errno_t wasmtime_ssp_fd_filestat_set_times(
|
__wasi_errno_t wasmtime_ssp_fd_filestat_set_times(
|
||||||
#if !defined(WASMTIME_SSP_STATIC_CURFDS)
|
wasm_exec_env_t exec_env,
|
||||||
struct fd_table *curfds,
|
struct fd_table *curfds,
|
||||||
#endif
|
|
||||||
__wasi_fd_t fd,
|
__wasi_fd_t fd,
|
||||||
__wasi_timestamp_t st_atim,
|
__wasi_timestamp_t st_atim,
|
||||||
__wasi_timestamp_t st_mtim,
|
__wasi_timestamp_t st_mtim,
|
||||||
|
@ -925,17 +861,15 @@ __wasi_errno_t wasmtime_ssp_fd_filestat_set_times(
|
||||||
) WASMTIME_SSP_SYSCALL_NAME(fd_filestat_set_times) WARN_UNUSED;
|
) WASMTIME_SSP_SYSCALL_NAME(fd_filestat_set_times) WARN_UNUSED;
|
||||||
|
|
||||||
__wasi_errno_t wasmtime_ssp_fd_filestat_set_size(
|
__wasi_errno_t wasmtime_ssp_fd_filestat_set_size(
|
||||||
#if !defined(WASMTIME_SSP_STATIC_CURFDS)
|
wasm_exec_env_t exec_env,
|
||||||
struct fd_table *curfds,
|
struct fd_table *curfds,
|
||||||
#endif
|
|
||||||
__wasi_fd_t fd,
|
__wasi_fd_t fd,
|
||||||
__wasi_filesize_t st_size
|
__wasi_filesize_t st_size
|
||||||
) WASMTIME_SSP_SYSCALL_NAME(fd_filestat_set_size) WARN_UNUSED;
|
) WASMTIME_SSP_SYSCALL_NAME(fd_filestat_set_size) WARN_UNUSED;
|
||||||
|
|
||||||
__wasi_errno_t wasmtime_ssp_path_filestat_get(
|
__wasi_errno_t wasmtime_ssp_path_filestat_get(
|
||||||
#if !defined(WASMTIME_SSP_STATIC_CURFDS)
|
wasm_exec_env_t exec_env,
|
||||||
struct fd_table *curfds,
|
struct fd_table *curfds,
|
||||||
#endif
|
|
||||||
__wasi_fd_t fd,
|
__wasi_fd_t fd,
|
||||||
__wasi_lookupflags_t flags,
|
__wasi_lookupflags_t flags,
|
||||||
const char *path,
|
const char *path,
|
||||||
|
@ -944,9 +878,8 @@ __wasi_errno_t wasmtime_ssp_path_filestat_get(
|
||||||
) WASMTIME_SSP_SYSCALL_NAME(path_filestat_get) WARN_UNUSED;
|
) WASMTIME_SSP_SYSCALL_NAME(path_filestat_get) WARN_UNUSED;
|
||||||
|
|
||||||
__wasi_errno_t wasmtime_ssp_path_filestat_set_times(
|
__wasi_errno_t wasmtime_ssp_path_filestat_set_times(
|
||||||
#if !defined(WASMTIME_SSP_STATIC_CURFDS)
|
wasm_exec_env_t exec_env,
|
||||||
struct fd_table *curfds,
|
struct fd_table *curfds,
|
||||||
#endif
|
|
||||||
__wasi_fd_t fd,
|
__wasi_fd_t fd,
|
||||||
__wasi_lookupflags_t flags,
|
__wasi_lookupflags_t flags,
|
||||||
const char *path,
|
const char *path,
|
||||||
|
@ -957,10 +890,9 @@ __wasi_errno_t wasmtime_ssp_path_filestat_set_times(
|
||||||
) WASMTIME_SSP_SYSCALL_NAME(path_filestat_set_times) WARN_UNUSED;
|
) WASMTIME_SSP_SYSCALL_NAME(path_filestat_set_times) WARN_UNUSED;
|
||||||
|
|
||||||
__wasi_errno_t wasmtime_ssp_path_symlink(
|
__wasi_errno_t wasmtime_ssp_path_symlink(
|
||||||
#if !defined(WASMTIME_SSP_STATIC_CURFDS)
|
wasm_exec_env_t exec_env,
|
||||||
struct fd_table *curfds,
|
struct fd_table *curfds,
|
||||||
struct fd_prestats *prestats,
|
struct fd_prestats *prestats,
|
||||||
#endif
|
|
||||||
const char *old_path,
|
const char *old_path,
|
||||||
size_t old_path_len,
|
size_t old_path_len,
|
||||||
__wasi_fd_t fd,
|
__wasi_fd_t fd,
|
||||||
|
@ -969,47 +901,30 @@ __wasi_errno_t wasmtime_ssp_path_symlink(
|
||||||
) WASMTIME_SSP_SYSCALL_NAME(path_symlink) WARN_UNUSED;
|
) WASMTIME_SSP_SYSCALL_NAME(path_symlink) WARN_UNUSED;
|
||||||
|
|
||||||
__wasi_errno_t wasmtime_ssp_path_unlink_file(
|
__wasi_errno_t wasmtime_ssp_path_unlink_file(
|
||||||
#if !defined(WASMTIME_SSP_STATIC_CURFDS)
|
wasm_exec_env_t exec_env,
|
||||||
struct fd_table *curfds,
|
struct fd_table *curfds,
|
||||||
#endif
|
|
||||||
__wasi_fd_t fd,
|
__wasi_fd_t fd,
|
||||||
const char *path,
|
const char *path,
|
||||||
size_t path_len
|
size_t path_len
|
||||||
) WASMTIME_SSP_SYSCALL_NAME(path_unlink_file) WARN_UNUSED;
|
) WASMTIME_SSP_SYSCALL_NAME(path_unlink_file) WARN_UNUSED;
|
||||||
|
|
||||||
__wasi_errno_t wasmtime_ssp_path_remove_directory(
|
__wasi_errno_t wasmtime_ssp_path_remove_directory(
|
||||||
#if !defined(WASMTIME_SSP_STATIC_CURFDS)
|
wasm_exec_env_t exec_env,
|
||||||
struct fd_table *curfds,
|
struct fd_table *curfds,
|
||||||
#endif
|
|
||||||
__wasi_fd_t fd,
|
__wasi_fd_t fd,
|
||||||
const char *path,
|
const char *path,
|
||||||
size_t path_len
|
size_t path_len
|
||||||
) WASMTIME_SSP_SYSCALL_NAME(path_remove_directory) WARN_UNUSED;
|
) WASMTIME_SSP_SYSCALL_NAME(path_remove_directory) WARN_UNUSED;
|
||||||
|
|
||||||
__wasi_errno_t wasmtime_ssp_poll_oneoff(
|
__wasi_errno_t wasmtime_ssp_poll_oneoff(
|
||||||
#if !defined(WASMTIME_SSP_STATIC_CURFDS)
|
wasm_exec_env_t exec_env,
|
||||||
struct fd_table *curfds,
|
struct fd_table *curfds,
|
||||||
#endif
|
|
||||||
const __wasi_subscription_t *in,
|
const __wasi_subscription_t *in,
|
||||||
__wasi_event_t *out,
|
__wasi_event_t *out,
|
||||||
size_t nsubscriptions,
|
size_t nsubscriptions,
|
||||||
size_t *nevents
|
size_t *nevents
|
||||||
) WASMTIME_SSP_SYSCALL_NAME(poll_oneoff) WARN_UNUSED;
|
) WASMTIME_SSP_SYSCALL_NAME(poll_oneoff) WARN_UNUSED;
|
||||||
|
|
||||||
#if 0
|
|
||||||
/**
|
|
||||||
* We throw exception in libc-wasi wrapper function wasi_proc_exit()
|
|
||||||
* but not call this function.
|
|
||||||
*/
|
|
||||||
_Noreturn void wasmtime_ssp_proc_exit(
|
|
||||||
__wasi_exitcode_t rval
|
|
||||||
) WASMTIME_SSP_SYSCALL_NAME(proc_exit);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
__wasi_errno_t wasmtime_ssp_proc_raise(
|
|
||||||
__wasi_signal_t sig
|
|
||||||
) WASMTIME_SSP_SYSCALL_NAME(proc_raise) WARN_UNUSED;
|
|
||||||
|
|
||||||
__wasi_errno_t wasmtime_ssp_random_get(
|
__wasi_errno_t wasmtime_ssp_random_get(
|
||||||
void *buf,
|
void *buf,
|
||||||
size_t buf_len
|
size_t buf_len
|
||||||
|
@ -1017,50 +932,44 @@ __wasi_errno_t wasmtime_ssp_random_get(
|
||||||
|
|
||||||
__wasi_errno_t
|
__wasi_errno_t
|
||||||
wasi_ssp_sock_accept(
|
wasi_ssp_sock_accept(
|
||||||
#if !defined(WASMTIME_SSP_STATIC_CURFDS)
|
wasm_exec_env_t exec_env,
|
||||||
struct fd_table *curfds,
|
struct fd_table *curfds,
|
||||||
#endif
|
|
||||||
__wasi_fd_t fd, __wasi_fdflags_t flags, __wasi_fd_t *fd_new
|
__wasi_fd_t fd, __wasi_fdflags_t flags, __wasi_fd_t *fd_new
|
||||||
) WARN_UNUSED;
|
) WARN_UNUSED;
|
||||||
|
|
||||||
__wasi_errno_t
|
__wasi_errno_t
|
||||||
wasi_ssp_sock_addr_local(
|
wasi_ssp_sock_addr_local(
|
||||||
#if !defined(WASMTIME_SSP_STATIC_CURFDS)
|
wasm_exec_env_t exec_env,
|
||||||
struct fd_table *curfds,
|
struct fd_table *curfds,
|
||||||
#endif
|
|
||||||
__wasi_fd_t fd, __wasi_addr_t *addr
|
__wasi_fd_t fd, __wasi_addr_t *addr
|
||||||
) WARN_UNUSED;
|
) WARN_UNUSED;
|
||||||
|
|
||||||
__wasi_errno_t
|
__wasi_errno_t
|
||||||
wasi_ssp_sock_addr_remote(
|
wasi_ssp_sock_addr_remote(
|
||||||
#if !defined(WASMTIME_SSP_STATIC_CURFDS)
|
wasm_exec_env_t exec_env,
|
||||||
struct fd_table *curfds,
|
struct fd_table *curfds,
|
||||||
#endif
|
|
||||||
__wasi_fd_t fd, __wasi_addr_t *addr
|
__wasi_fd_t fd, __wasi_addr_t *addr
|
||||||
) WARN_UNUSED;
|
) WARN_UNUSED;
|
||||||
|
|
||||||
__wasi_errno_t
|
__wasi_errno_t
|
||||||
wasi_ssp_sock_open(
|
wasi_ssp_sock_open(
|
||||||
#if !defined(WASMTIME_SSP_STATIC_CURFDS)
|
wasm_exec_env_t exec_env,
|
||||||
struct fd_table *curfds,
|
struct fd_table *curfds,
|
||||||
#endif
|
|
||||||
__wasi_fd_t poolfd, __wasi_address_family_t af, __wasi_sock_type_t socktype,
|
__wasi_fd_t poolfd, __wasi_address_family_t af, __wasi_sock_type_t socktype,
|
||||||
__wasi_fd_t *sockfd
|
__wasi_fd_t *sockfd
|
||||||
) WARN_UNUSED;
|
) WARN_UNUSED;
|
||||||
|
|
||||||
__wasi_errno_t
|
__wasi_errno_t
|
||||||
wasi_ssp_sock_bind(
|
wasi_ssp_sock_bind(
|
||||||
#if !defined(WASMTIME_SSP_STATIC_CURFDS)
|
wasm_exec_env_t exec_env,
|
||||||
struct fd_table *curfds, struct addr_pool *addr_pool,
|
struct fd_table *curfds, struct addr_pool *addr_pool,
|
||||||
#endif
|
|
||||||
__wasi_fd_t fd, __wasi_addr_t *addr
|
__wasi_fd_t fd, __wasi_addr_t *addr
|
||||||
) WARN_UNUSED;
|
) WARN_UNUSED;
|
||||||
|
|
||||||
__wasi_errno_t
|
__wasi_errno_t
|
||||||
wasi_ssp_sock_addr_resolve(
|
wasi_ssp_sock_addr_resolve(
|
||||||
#if !defined(WASMTIME_SSP_STATIC_CURFDS)
|
wasm_exec_env_t exec_env,
|
||||||
struct fd_table *curfds, char **ns_lookup_list,
|
struct fd_table *curfds, char **ns_lookup_list,
|
||||||
#endif
|
|
||||||
const char *host, const char* service,
|
const char *host, const char* service,
|
||||||
__wasi_addr_info_hints_t *hints, __wasi_addr_info_t *addr_info,
|
__wasi_addr_info_hints_t *hints, __wasi_addr_info_t *addr_info,
|
||||||
__wasi_size_t addr_info_size, __wasi_size_t *max_info_size
|
__wasi_size_t addr_info_size, __wasi_size_t *max_info_size
|
||||||
|
@ -1068,88 +977,77 @@ wasi_ssp_sock_addr_resolve(
|
||||||
|
|
||||||
__wasi_errno_t
|
__wasi_errno_t
|
||||||
wasi_ssp_sock_connect(
|
wasi_ssp_sock_connect(
|
||||||
#if !defined(WASMTIME_SSP_STATIC_CURFDS)
|
wasm_exec_env_t exec_env,
|
||||||
struct fd_table *curfds, struct addr_pool *addr_pool,
|
struct fd_table *curfds, struct addr_pool *addr_pool,
|
||||||
#endif
|
|
||||||
__wasi_fd_t fd, __wasi_addr_t *addr
|
__wasi_fd_t fd, __wasi_addr_t *addr
|
||||||
) WARN_UNUSED;
|
) WARN_UNUSED;
|
||||||
|
|
||||||
__wasi_errno_t
|
__wasi_errno_t
|
||||||
wasi_ssp_sock_get_recv_buf_size(
|
wasi_ssp_sock_get_recv_buf_size(
|
||||||
#if !defined(WASMTIME_SSP_STATIC_CURFDS)
|
wasm_exec_env_t exec_env,
|
||||||
struct fd_table *curfds,
|
struct fd_table *curfds,
|
||||||
#endif
|
|
||||||
__wasi_fd_t fd, __wasi_size_t *size
|
__wasi_fd_t fd, __wasi_size_t *size
|
||||||
) WARN_UNUSED;
|
) WARN_UNUSED;
|
||||||
|
|
||||||
__wasi_errno_t
|
__wasi_errno_t
|
||||||
wasi_ssp_sock_get_reuse_addr(
|
wasi_ssp_sock_get_reuse_addr(
|
||||||
#if !defined(WASMTIME_SSP_STATIC_CURFDS)
|
wasm_exec_env_t exec_env,
|
||||||
struct fd_table *curfds,
|
struct fd_table *curfds,
|
||||||
#endif
|
|
||||||
__wasi_fd_t fd, uint8_t *reuse
|
__wasi_fd_t fd, uint8_t *reuse
|
||||||
) WARN_UNUSED;
|
) WARN_UNUSED;
|
||||||
|
|
||||||
__wasi_errno_t
|
__wasi_errno_t
|
||||||
wasi_ssp_sock_get_reuse_port(
|
wasi_ssp_sock_get_reuse_port(
|
||||||
#if !defined(WASMTIME_SSP_STATIC_CURFDS)
|
wasm_exec_env_t exec_env,
|
||||||
struct fd_table *curfds,
|
struct fd_table *curfds,
|
||||||
#endif
|
|
||||||
__wasi_fd_t fd, uint8_t *reuse
|
__wasi_fd_t fd, uint8_t *reuse
|
||||||
) WARN_UNUSED;
|
) WARN_UNUSED;
|
||||||
|
|
||||||
__wasi_errno_t
|
__wasi_errno_t
|
||||||
wasi_ssp_sock_get_send_buf_size(
|
wasi_ssp_sock_get_send_buf_size(
|
||||||
#if !defined(WASMTIME_SSP_STATIC_CURFDS)
|
wasm_exec_env_t exec_env,
|
||||||
struct fd_table *curfds,
|
struct fd_table *curfds,
|
||||||
#endif
|
|
||||||
__wasi_fd_t fd, __wasi_size_t *size
|
__wasi_fd_t fd, __wasi_size_t *size
|
||||||
) WARN_UNUSED;
|
) WARN_UNUSED;
|
||||||
|
|
||||||
__wasi_errno_t
|
__wasi_errno_t
|
||||||
wasi_ssp_sock_set_recv_buf_size(
|
wasi_ssp_sock_set_recv_buf_size(
|
||||||
#if !defined(WASMTIME_SSP_STATIC_CURFDS)
|
wasm_exec_env_t exec_env,
|
||||||
struct fd_table *curfds,
|
struct fd_table *curfds,
|
||||||
#endif
|
|
||||||
__wasi_fd_t fd, __wasi_size_t size
|
__wasi_fd_t fd, __wasi_size_t size
|
||||||
) WARN_UNUSED;
|
) WARN_UNUSED;
|
||||||
|
|
||||||
__wasi_errno_t
|
__wasi_errno_t
|
||||||
wasi_ssp_sock_set_reuse_addr(
|
wasi_ssp_sock_set_reuse_addr(
|
||||||
#if !defined(WASMTIME_SSP_STATIC_CURFDS)
|
wasm_exec_env_t exec_env,
|
||||||
struct fd_table *curfds,
|
struct fd_table *curfds,
|
||||||
#endif
|
|
||||||
__wasi_fd_t fd, uint8_t reuse
|
__wasi_fd_t fd, uint8_t reuse
|
||||||
) WARN_UNUSED;
|
) WARN_UNUSED;
|
||||||
|
|
||||||
__wasi_errno_t
|
__wasi_errno_t
|
||||||
wasi_ssp_sock_set_reuse_port(
|
wasi_ssp_sock_set_reuse_port(
|
||||||
#if !defined(WASMTIME_SSP_STATIC_CURFDS)
|
wasm_exec_env_t exec_env,
|
||||||
struct fd_table *curfds,
|
struct fd_table *curfds,
|
||||||
#endif
|
|
||||||
__wasi_fd_t fd, uint8_t reuse
|
__wasi_fd_t fd, uint8_t reuse
|
||||||
) WARN_UNUSED;
|
) WARN_UNUSED;
|
||||||
|
|
||||||
__wasi_errno_t
|
__wasi_errno_t
|
||||||
wasi_ssp_sock_set_send_buf_size(
|
wasi_ssp_sock_set_send_buf_size(
|
||||||
#if !defined(WASMTIME_SSP_STATIC_CURFDS)
|
wasm_exec_env_t exec_env,
|
||||||
struct fd_table *curfds,
|
struct fd_table *curfds,
|
||||||
#endif
|
|
||||||
__wasi_fd_t fd, __wasi_size_t size
|
__wasi_fd_t fd, __wasi_size_t size
|
||||||
) WARN_UNUSED;
|
) WARN_UNUSED;
|
||||||
|
|
||||||
__wasi_errno_t
|
__wasi_errno_t
|
||||||
wasi_ssp_sock_listen(
|
wasi_ssp_sock_listen(
|
||||||
#if !defined(WASMTIME_SSP_STATIC_CURFDS)
|
wasm_exec_env_t exec_env,
|
||||||
struct fd_table *curfds,
|
struct fd_table *curfds,
|
||||||
#endif
|
|
||||||
__wasi_fd_t fd, __wasi_size_t backlog
|
__wasi_fd_t fd, __wasi_size_t backlog
|
||||||
) WARN_UNUSED;
|
) WARN_UNUSED;
|
||||||
|
|
||||||
__wasi_errno_t wasmtime_ssp_sock_recv(
|
__wasi_errno_t wasmtime_ssp_sock_recv(
|
||||||
#if !defined(WASMTIME_SSP_STATIC_CURFDS)
|
wasm_exec_env_t exec_env,
|
||||||
struct fd_table *curfds,
|
struct fd_table *curfds,
|
||||||
#endif
|
|
||||||
__wasi_fd_t sock,
|
__wasi_fd_t sock,
|
||||||
void *buf,
|
void *buf,
|
||||||
size_t buf_len,
|
size_t buf_len,
|
||||||
|
@ -1157,9 +1055,8 @@ __wasi_errno_t wasmtime_ssp_sock_recv(
|
||||||
) WASMTIME_SSP_SYSCALL_NAME(sock_recv) WARN_UNUSED;
|
) WASMTIME_SSP_SYSCALL_NAME(sock_recv) WARN_UNUSED;
|
||||||
|
|
||||||
__wasi_errno_t wasmtime_ssp_sock_recv_from(
|
__wasi_errno_t wasmtime_ssp_sock_recv_from(
|
||||||
#if !defined(WASMTIME_SSP_STATIC_CURFDS)
|
wasm_exec_env_t exec_env,
|
||||||
struct fd_table *curfds,
|
struct fd_table *curfds,
|
||||||
#endif
|
|
||||||
__wasi_fd_t sock,
|
__wasi_fd_t sock,
|
||||||
void *buf,
|
void *buf,
|
||||||
size_t buf_len,
|
size_t buf_len,
|
||||||
|
@ -1169,9 +1066,8 @@ __wasi_errno_t wasmtime_ssp_sock_recv_from(
|
||||||
) WASMTIME_SSP_SYSCALL_NAME(sock_recv_from) WARN_UNUSED;
|
) WASMTIME_SSP_SYSCALL_NAME(sock_recv_from) WARN_UNUSED;
|
||||||
|
|
||||||
__wasi_errno_t wasmtime_ssp_sock_send(
|
__wasi_errno_t wasmtime_ssp_sock_send(
|
||||||
#if !defined(WASMTIME_SSP_STATIC_CURFDS)
|
wasm_exec_env_t exec_env,
|
||||||
struct fd_table *curfds,
|
struct fd_table *curfds,
|
||||||
#endif
|
|
||||||
__wasi_fd_t sock,
|
__wasi_fd_t sock,
|
||||||
const void *buf,
|
const void *buf,
|
||||||
size_t buf_len,
|
size_t buf_len,
|
||||||
|
@ -1179,9 +1075,8 @@ __wasi_errno_t wasmtime_ssp_sock_send(
|
||||||
) WASMTIME_SSP_SYSCALL_NAME(sock_send) WARN_UNUSED;
|
) WASMTIME_SSP_SYSCALL_NAME(sock_send) WARN_UNUSED;
|
||||||
|
|
||||||
__wasi_errno_t wasmtime_ssp_sock_send_to(
|
__wasi_errno_t wasmtime_ssp_sock_send_to(
|
||||||
#if !defined(WASMTIME_SSP_STATIC_CURFDS)
|
wasm_exec_env_t exec_env,
|
||||||
struct fd_table *curfds, struct addr_pool *addr_pool,
|
struct fd_table *curfds, struct addr_pool *addr_pool,
|
||||||
#endif
|
|
||||||
__wasi_fd_t sock,
|
__wasi_fd_t sock,
|
||||||
const void *buf,
|
const void *buf,
|
||||||
size_t buf_len,
|
size_t buf_len,
|
||||||
|
@ -1191,317 +1086,278 @@ __wasi_errno_t wasmtime_ssp_sock_send_to(
|
||||||
) WASMTIME_SSP_SYSCALL_NAME(sock_send_to) WARN_UNUSED;
|
) WASMTIME_SSP_SYSCALL_NAME(sock_send_to) WARN_UNUSED;
|
||||||
|
|
||||||
__wasi_errno_t wasmtime_ssp_sock_shutdown(
|
__wasi_errno_t wasmtime_ssp_sock_shutdown(
|
||||||
#if !defined(WASMTIME_SSP_STATIC_CURFDS)
|
wasm_exec_env_t exec_env,
|
||||||
struct fd_table *curfds,
|
struct fd_table *curfds,
|
||||||
#endif
|
|
||||||
__wasi_fd_t sock
|
__wasi_fd_t sock
|
||||||
) WASMTIME_SSP_SYSCALL_NAME(sock_shutdown) WARN_UNUSED;
|
) WASMTIME_SSP_SYSCALL_NAME(sock_shutdown) WARN_UNUSED;
|
||||||
|
|
||||||
__wasi_errno_t wasmtime_ssp_sock_set_recv_timeout(
|
__wasi_errno_t wasmtime_ssp_sock_set_recv_timeout(
|
||||||
#if !defined(WASMTIME_SSP_STATIC_CURFDS)
|
wasm_exec_env_t exec_env,
|
||||||
struct fd_table *curfds,
|
struct fd_table *curfds,
|
||||||
#endif
|
|
||||||
__wasi_fd_t sock,
|
__wasi_fd_t sock,
|
||||||
uint64_t timeout_us
|
uint64_t timeout_us
|
||||||
) WASMTIME_SSP_SYSCALL_NAME(sock_set_recv_timeout) WARN_UNUSED;
|
) WASMTIME_SSP_SYSCALL_NAME(sock_set_recv_timeout) WARN_UNUSED;
|
||||||
|
|
||||||
__wasi_errno_t wasmtime_ssp_sock_get_recv_timeout(
|
__wasi_errno_t wasmtime_ssp_sock_get_recv_timeout(
|
||||||
#if !defined(WASMTIME_SSP_STATIC_CURFDS)
|
wasm_exec_env_t exec_env,
|
||||||
struct fd_table *curfds,
|
struct fd_table *curfds,
|
||||||
#endif
|
|
||||||
__wasi_fd_t sock,
|
__wasi_fd_t sock,
|
||||||
uint64_t *timeout_us
|
uint64_t *timeout_us
|
||||||
) WASMTIME_SSP_SYSCALL_NAME(sock_get_recv_timeout) WARN_UNUSED;
|
) WASMTIME_SSP_SYSCALL_NAME(sock_get_recv_timeout) WARN_UNUSED;
|
||||||
|
|
||||||
__wasi_errno_t wasmtime_ssp_sock_set_send_timeout(
|
__wasi_errno_t wasmtime_ssp_sock_set_send_timeout(
|
||||||
#if !defined(WASMTIME_SSP_STATIC_CURFDS)
|
wasm_exec_env_t exec_env,
|
||||||
struct fd_table *curfds,
|
struct fd_table *curfds,
|
||||||
#endif
|
|
||||||
__wasi_fd_t sock,
|
__wasi_fd_t sock,
|
||||||
uint64_t timeout_us
|
uint64_t timeout_us
|
||||||
) WASMTIME_SSP_SYSCALL_NAME(sock_set_send_timeout) WARN_UNUSED;
|
) WASMTIME_SSP_SYSCALL_NAME(sock_set_send_timeout) WARN_UNUSED;
|
||||||
|
|
||||||
__wasi_errno_t wasmtime_ssp_sock_get_send_timeout(
|
__wasi_errno_t wasmtime_ssp_sock_get_send_timeout(
|
||||||
#if !defined(WASMTIME_SSP_STATIC_CURFDS)
|
wasm_exec_env_t exec_env,
|
||||||
struct fd_table *curfds,
|
struct fd_table *curfds,
|
||||||
#endif
|
|
||||||
__wasi_fd_t sock,
|
__wasi_fd_t sock,
|
||||||
uint64_t *timeout_us
|
uint64_t *timeout_us
|
||||||
) WASMTIME_SSP_SYSCALL_NAME(sock_get_send_timeout) WARN_UNUSED;
|
) WASMTIME_SSP_SYSCALL_NAME(sock_get_send_timeout) WARN_UNUSED;
|
||||||
|
|
||||||
__wasi_errno_t wasmtime_ssp_sock_set_send_buf_size(
|
__wasi_errno_t wasmtime_ssp_sock_set_send_buf_size(
|
||||||
#if !defined(WASMTIME_SSP_STATIC_CURFDS)
|
wasm_exec_env_t exec_env,
|
||||||
struct fd_table *curfds,
|
struct fd_table *curfds,
|
||||||
#endif
|
|
||||||
__wasi_fd_t sock,
|
__wasi_fd_t sock,
|
||||||
size_t bufsiz
|
size_t bufsiz
|
||||||
) WASMTIME_SSP_SYSCALL_NAME(sock_set_send_buf_size) WARN_UNUSED;
|
) WASMTIME_SSP_SYSCALL_NAME(sock_set_send_buf_size) WARN_UNUSED;
|
||||||
|
|
||||||
__wasi_errno_t wasmtime_ssp_sock_get_send_buf_size(
|
__wasi_errno_t wasmtime_ssp_sock_get_send_buf_size(
|
||||||
#if !defined(WASMTIME_SSP_STATIC_CURFDS)
|
wasm_exec_env_t exec_env,
|
||||||
struct fd_table *curfds,
|
struct fd_table *curfds,
|
||||||
#endif
|
|
||||||
__wasi_fd_t sock,
|
__wasi_fd_t sock,
|
||||||
size_t *bufsiz
|
size_t *bufsiz
|
||||||
) WASMTIME_SSP_SYSCALL_NAME(sock_get_send_buf_size) WARN_UNUSED;
|
) WASMTIME_SSP_SYSCALL_NAME(sock_get_send_buf_size) WARN_UNUSED;
|
||||||
|
|
||||||
__wasi_errno_t wasmtime_ssp_sock_set_recv_buf_size(
|
__wasi_errno_t wasmtime_ssp_sock_set_recv_buf_size(
|
||||||
#if !defined(WASMTIME_SSP_STATIC_CURFDS)
|
wasm_exec_env_t exec_env,
|
||||||
struct fd_table *curfds,
|
struct fd_table *curfds,
|
||||||
#endif
|
|
||||||
__wasi_fd_t sock,
|
__wasi_fd_t sock,
|
||||||
size_t bufsiz
|
size_t bufsiz
|
||||||
) WASMTIME_SSP_SYSCALL_NAME(sock_set_recv_buf_size) WARN_UNUSED;
|
) WASMTIME_SSP_SYSCALL_NAME(sock_set_recv_buf_size) WARN_UNUSED;
|
||||||
|
|
||||||
__wasi_errno_t wasmtime_ssp_sock_get_recv_buf_size(
|
__wasi_errno_t wasmtime_ssp_sock_get_recv_buf_size(
|
||||||
#if !defined(WASMTIME_SSP_STATIC_CURFDS)
|
wasm_exec_env_t exec_env,
|
||||||
struct fd_table *curfds,
|
struct fd_table *curfds,
|
||||||
#endif
|
|
||||||
__wasi_fd_t sock,
|
__wasi_fd_t sock,
|
||||||
size_t *bufsiz
|
size_t *bufsiz
|
||||||
) WASMTIME_SSP_SYSCALL_NAME(sock_get_recv_buf_size) WARN_UNUSED;
|
) WASMTIME_SSP_SYSCALL_NAME(sock_get_recv_buf_size) WARN_UNUSED;
|
||||||
|
|
||||||
|
|
||||||
__wasi_errno_t wasmtime_ssp_sock_set_keep_alive(
|
__wasi_errno_t wasmtime_ssp_sock_set_keep_alive(
|
||||||
#if !defined(WASMTIME_SSP_STATIC_CURFDS)
|
wasm_exec_env_t exec_env,
|
||||||
struct fd_table *curfds,
|
struct fd_table *curfds,
|
||||||
#endif
|
|
||||||
__wasi_fd_t sock,
|
__wasi_fd_t sock,
|
||||||
bool is_enabled
|
bool is_enabled
|
||||||
) WASMTIME_SSP_SYSCALL_NAME(sock_set_keep_alive) WARN_UNUSED;
|
) WASMTIME_SSP_SYSCALL_NAME(sock_set_keep_alive) WARN_UNUSED;
|
||||||
|
|
||||||
__wasi_errno_t wasmtime_ssp_sock_get_keep_alive(
|
__wasi_errno_t wasmtime_ssp_sock_get_keep_alive(
|
||||||
#if !defined(WASMTIME_SSP_STATIC_CURFDS)
|
wasm_exec_env_t exec_env,
|
||||||
struct fd_table *curfds,
|
struct fd_table *curfds,
|
||||||
#endif
|
|
||||||
__wasi_fd_t sock,
|
__wasi_fd_t sock,
|
||||||
bool *is_enabled
|
bool *is_enabled
|
||||||
) WASMTIME_SSP_SYSCALL_NAME(sock_get_keep_alive) WARN_UNUSED;
|
) WASMTIME_SSP_SYSCALL_NAME(sock_get_keep_alive) WARN_UNUSED;
|
||||||
|
|
||||||
__wasi_errno_t wasmtime_ssp_sock_set_reuse_addr(
|
__wasi_errno_t wasmtime_ssp_sock_set_reuse_addr(
|
||||||
#if !defined(WASMTIME_SSP_STATIC_CURFDS)
|
wasm_exec_env_t exec_env,
|
||||||
struct fd_table *curfds,
|
struct fd_table *curfds,
|
||||||
#endif
|
|
||||||
__wasi_fd_t sock,
|
__wasi_fd_t sock,
|
||||||
bool is_enabled
|
bool is_enabled
|
||||||
) WASMTIME_SSP_SYSCALL_NAME(sock_set_reuse_addr) WARN_UNUSED;
|
) WASMTIME_SSP_SYSCALL_NAME(sock_set_reuse_addr) WARN_UNUSED;
|
||||||
|
|
||||||
__wasi_errno_t wasmtime_ssp_sock_get_reuse_addr(
|
__wasi_errno_t wasmtime_ssp_sock_get_reuse_addr(
|
||||||
#if !defined(WASMTIME_SSP_STATIC_CURFDS)
|
wasm_exec_env_t exec_env,
|
||||||
struct fd_table *curfds,
|
struct fd_table *curfds,
|
||||||
#endif
|
|
||||||
__wasi_fd_t sock,
|
__wasi_fd_t sock,
|
||||||
bool *is_enabled
|
bool *is_enabled
|
||||||
) WASMTIME_SSP_SYSCALL_NAME(sock_get_reuse_addr) WARN_UNUSED;
|
) WASMTIME_SSP_SYSCALL_NAME(sock_get_reuse_addr) WARN_UNUSED;
|
||||||
|
|
||||||
__wasi_errno_t wasmtime_ssp_sock_set_reuse_port(
|
__wasi_errno_t wasmtime_ssp_sock_set_reuse_port(
|
||||||
#if !defined(WASMTIME_SSP_STATIC_CURFDS)
|
wasm_exec_env_t exec_env,
|
||||||
struct fd_table *curfds,
|
struct fd_table *curfds,
|
||||||
#endif
|
|
||||||
__wasi_fd_t sock,
|
__wasi_fd_t sock,
|
||||||
bool is_enabled
|
bool is_enabled
|
||||||
) WASMTIME_SSP_SYSCALL_NAME(sock_set_reuse_port) WARN_UNUSED;
|
) WASMTIME_SSP_SYSCALL_NAME(sock_set_reuse_port) WARN_UNUSED;
|
||||||
|
|
||||||
__wasi_errno_t wasmtime_ssp_sock_get_reuse_port(
|
__wasi_errno_t wasmtime_ssp_sock_get_reuse_port(
|
||||||
#if !defined(WASMTIME_SSP_STATIC_CURFDS)
|
wasm_exec_env_t exec_env,
|
||||||
struct fd_table *curfds,
|
struct fd_table *curfds,
|
||||||
#endif
|
|
||||||
__wasi_fd_t sock,
|
__wasi_fd_t sock,
|
||||||
bool *is_enabled
|
bool *is_enabled
|
||||||
) WASMTIME_SSP_SYSCALL_NAME(sock_get_reuse_port) WARN_UNUSED;
|
) WASMTIME_SSP_SYSCALL_NAME(sock_get_reuse_port) WARN_UNUSED;
|
||||||
|
|
||||||
__wasi_errno_t wasmtime_ssp_sock_set_linger(
|
__wasi_errno_t wasmtime_ssp_sock_set_linger(
|
||||||
#if !defined(WASMTIME_SSP_STATIC_CURFDS)
|
wasm_exec_env_t exec_env,
|
||||||
struct fd_table *curfds,
|
struct fd_table *curfds,
|
||||||
#endif
|
|
||||||
__wasi_fd_t sock,
|
__wasi_fd_t sock,
|
||||||
bool is_enabled,
|
bool is_enabled,
|
||||||
int linger_s
|
int linger_s
|
||||||
) WASMTIME_SSP_SYSCALL_NAME(sock_set_linger) WARN_UNUSED;
|
) WASMTIME_SSP_SYSCALL_NAME(sock_set_linger) WARN_UNUSED;
|
||||||
|
|
||||||
__wasi_errno_t wasmtime_ssp_sock_get_linger(
|
__wasi_errno_t wasmtime_ssp_sock_get_linger(
|
||||||
#if !defined(WASMTIME_SSP_STATIC_CURFDS)
|
wasm_exec_env_t exec_env,
|
||||||
struct fd_table *curfds,
|
struct fd_table *curfds,
|
||||||
#endif
|
|
||||||
__wasi_fd_t sock, bool *is_enabled, int *linger_s
|
__wasi_fd_t sock, bool *is_enabled, int *linger_s
|
||||||
) WASMTIME_SSP_SYSCALL_NAME(sock_get_linger) WARN_UNUSED;
|
) WASMTIME_SSP_SYSCALL_NAME(sock_get_linger) WARN_UNUSED;
|
||||||
|
|
||||||
__wasi_errno_t wasmtime_ssp_sock_set_broadcast(
|
__wasi_errno_t wasmtime_ssp_sock_set_broadcast(
|
||||||
#if !defined(WASMTIME_SSP_STATIC_CURFDS)
|
wasm_exec_env_t exec_env,
|
||||||
struct fd_table *curfds,
|
struct fd_table *curfds,
|
||||||
#endif
|
|
||||||
__wasi_fd_t sock,
|
__wasi_fd_t sock,
|
||||||
bool is_enabled
|
bool is_enabled
|
||||||
) WASMTIME_SSP_SYSCALL_NAME(sock_set_broadcast) WARN_UNUSED;
|
) WASMTIME_SSP_SYSCALL_NAME(sock_set_broadcast) WARN_UNUSED;
|
||||||
|
|
||||||
__wasi_errno_t wasmtime_ssp_sock_get_broadcast(
|
__wasi_errno_t wasmtime_ssp_sock_get_broadcast(
|
||||||
#if !defined(WASMTIME_SSP_STATIC_CURFDS)
|
wasm_exec_env_t exec_env,
|
||||||
struct fd_table *curfds,
|
struct fd_table *curfds,
|
||||||
#endif
|
|
||||||
__wasi_fd_t sock,
|
__wasi_fd_t sock,
|
||||||
bool *is_enabled
|
bool *is_enabled
|
||||||
) WASMTIME_SSP_SYSCALL_NAME(sock_get_broadcast) WARN_UNUSED;
|
) WASMTIME_SSP_SYSCALL_NAME(sock_get_broadcast) WARN_UNUSED;
|
||||||
|
|
||||||
__wasi_errno_t wasmtime_ssp_sock_set_tcp_no_delay(
|
__wasi_errno_t wasmtime_ssp_sock_set_tcp_no_delay(
|
||||||
#if !defined(WASMTIME_SSP_STATIC_CURFDS)
|
wasm_exec_env_t exec_env,
|
||||||
struct fd_table *curfds,
|
struct fd_table *curfds,
|
||||||
#endif
|
|
||||||
__wasi_fd_t sock,
|
__wasi_fd_t sock,
|
||||||
bool is_enabled
|
bool is_enabled
|
||||||
) WASMTIME_SSP_SYSCALL_NAME(sock_set_tcp_no_delay) WARN_UNUSED;
|
) WASMTIME_SSP_SYSCALL_NAME(sock_set_tcp_no_delay) WARN_UNUSED;
|
||||||
|
|
||||||
__wasi_errno_t wasmtime_ssp_sock_get_tcp_no_delay(
|
__wasi_errno_t wasmtime_ssp_sock_get_tcp_no_delay(
|
||||||
#if !defined(WASMTIME_SSP_STATIC_CURFDS)
|
wasm_exec_env_t exec_env,
|
||||||
struct fd_table *curfds,
|
struct fd_table *curfds,
|
||||||
#endif
|
|
||||||
__wasi_fd_t sock,
|
__wasi_fd_t sock,
|
||||||
bool *is_enabled
|
bool *is_enabled
|
||||||
) WASMTIME_SSP_SYSCALL_NAME(sock_get_tcp_no_delay) WARN_UNUSED;
|
) WASMTIME_SSP_SYSCALL_NAME(sock_get_tcp_no_delay) WARN_UNUSED;
|
||||||
|
|
||||||
__wasi_errno_t wasmtime_ssp_sock_set_tcp_quick_ack(
|
__wasi_errno_t wasmtime_ssp_sock_set_tcp_quick_ack(
|
||||||
#if !defined(WASMTIME_SSP_STATIC_CURFDS)
|
wasm_exec_env_t exec_env,
|
||||||
struct fd_table *curfds,
|
struct fd_table *curfds,
|
||||||
#endif
|
|
||||||
__wasi_fd_t sock,
|
__wasi_fd_t sock,
|
||||||
bool is_enabled
|
bool is_enabled
|
||||||
) WASMTIME_SSP_SYSCALL_NAME(sock_set_tcp_quick_ack) WARN_UNUSED;
|
) WASMTIME_SSP_SYSCALL_NAME(sock_set_tcp_quick_ack) WARN_UNUSED;
|
||||||
|
|
||||||
__wasi_errno_t wasmtime_ssp_sock_get_tcp_quick_ack(
|
__wasi_errno_t wasmtime_ssp_sock_get_tcp_quick_ack(
|
||||||
#if !defined(WASMTIME_SSP_STATIC_CURFDS)
|
wasm_exec_env_t exec_env,
|
||||||
struct fd_table *curfds,
|
struct fd_table *curfds,
|
||||||
#endif
|
|
||||||
__wasi_fd_t sock,
|
__wasi_fd_t sock,
|
||||||
bool *is_enabled
|
bool *is_enabled
|
||||||
) WASMTIME_SSP_SYSCALL_NAME(sock_get_tcp_quick_ack) WARN_UNUSED;
|
) WASMTIME_SSP_SYSCALL_NAME(sock_get_tcp_quick_ack) WARN_UNUSED;
|
||||||
|
|
||||||
__wasi_errno_t wasmtime_ssp_sock_set_tcp_keep_idle(
|
__wasi_errno_t wasmtime_ssp_sock_set_tcp_keep_idle(
|
||||||
#if !defined(WASMTIME_SSP_STATIC_CURFDS)
|
wasm_exec_env_t exec_env,
|
||||||
struct fd_table *curfds,
|
struct fd_table *curfds,
|
||||||
#endif
|
|
||||||
__wasi_fd_t sock,
|
__wasi_fd_t sock,
|
||||||
uint32_t time_s
|
uint32_t time_s
|
||||||
) WASMTIME_SSP_SYSCALL_NAME(sock_set_tcp_keep_idle) WARN_UNUSED;
|
) WASMTIME_SSP_SYSCALL_NAME(sock_set_tcp_keep_idle) WARN_UNUSED;
|
||||||
|
|
||||||
__wasi_errno_t wasmtime_ssp_sock_get_tcp_keep_idle(
|
__wasi_errno_t wasmtime_ssp_sock_get_tcp_keep_idle(
|
||||||
#if !defined(WASMTIME_SSP_STATIC_CURFDS)
|
wasm_exec_env_t exec_env,
|
||||||
struct fd_table *curfds,
|
struct fd_table *curfds,
|
||||||
#endif
|
|
||||||
__wasi_fd_t sock,
|
__wasi_fd_t sock,
|
||||||
uint32_t *time_s
|
uint32_t *time_s
|
||||||
) WASMTIME_SSP_SYSCALL_NAME(sock_get_tcp_keep_idle) WARN_UNUSED;
|
) WASMTIME_SSP_SYSCALL_NAME(sock_get_tcp_keep_idle) WARN_UNUSED;
|
||||||
|
|
||||||
__wasi_errno_t wasmtime_ssp_sock_set_tcp_keep_intvl(
|
__wasi_errno_t wasmtime_ssp_sock_set_tcp_keep_intvl(
|
||||||
#if !defined(WASMTIME_SSP_STATIC_CURFDS)
|
wasm_exec_env_t exec_env,
|
||||||
struct fd_table *curfds,
|
struct fd_table *curfds,
|
||||||
#endif
|
|
||||||
__wasi_fd_t sock,
|
__wasi_fd_t sock,
|
||||||
uint32_t time_s
|
uint32_t time_s
|
||||||
) WASMTIME_SSP_SYSCALL_NAME(sock_set_tcp_keep_intvl) WARN_UNUSED;
|
) WASMTIME_SSP_SYSCALL_NAME(sock_set_tcp_keep_intvl) WARN_UNUSED;
|
||||||
|
|
||||||
__wasi_errno_t wasmtime_ssp_sock_get_tcp_keep_intvl(
|
__wasi_errno_t wasmtime_ssp_sock_get_tcp_keep_intvl(
|
||||||
#if !defined(WASMTIME_SSP_STATIC_CURFDS)
|
wasm_exec_env_t exec_env,
|
||||||
struct fd_table *curfds,
|
struct fd_table *curfds,
|
||||||
#endif
|
|
||||||
__wasi_fd_t sock,
|
__wasi_fd_t sock,
|
||||||
uint32_t *time_s
|
uint32_t *time_s
|
||||||
) WASMTIME_SSP_SYSCALL_NAME(sock_get_tcp_keep_intvl) WARN_UNUSED;
|
) WASMTIME_SSP_SYSCALL_NAME(sock_get_tcp_keep_intvl) WARN_UNUSED;
|
||||||
|
|
||||||
__wasi_errno_t wasmtime_ssp_sock_set_tcp_fastopen_connect(
|
__wasi_errno_t wasmtime_ssp_sock_set_tcp_fastopen_connect(
|
||||||
#if !defined(WASMTIME_SSP_STATIC_CURFDS)
|
wasm_exec_env_t exec_env,
|
||||||
struct fd_table *curfds,
|
struct fd_table *curfds,
|
||||||
#endif
|
|
||||||
__wasi_fd_t sock,
|
__wasi_fd_t sock,
|
||||||
bool is_enabled
|
bool is_enabled
|
||||||
) WASMTIME_SSP_SYSCALL_NAME(sock_set_tcp_fastopen_connect) WARN_UNUSED;
|
) WASMTIME_SSP_SYSCALL_NAME(sock_set_tcp_fastopen_connect) WARN_UNUSED;
|
||||||
|
|
||||||
__wasi_errno_t wasmtime_ssp_sock_get_tcp_fastopen_connect(
|
__wasi_errno_t wasmtime_ssp_sock_get_tcp_fastopen_connect(
|
||||||
#if !defined(WASMTIME_SSP_STATIC_CURFDS)
|
wasm_exec_env_t exec_env,
|
||||||
struct fd_table *curfds,
|
struct fd_table *curfds,
|
||||||
#endif
|
|
||||||
__wasi_fd_t sock,
|
__wasi_fd_t sock,
|
||||||
bool *is_enabled
|
bool *is_enabled
|
||||||
) WASMTIME_SSP_SYSCALL_NAME(sock_get_tcp_fastopen_connect) WARN_UNUSED;
|
) WASMTIME_SSP_SYSCALL_NAME(sock_get_tcp_fastopen_connect) WARN_UNUSED;
|
||||||
|
|
||||||
__wasi_errno_t wasmtime_ssp_sock_set_ip_multicast_loop(
|
__wasi_errno_t wasmtime_ssp_sock_set_ip_multicast_loop(
|
||||||
#if !defined(WASMTIME_SSP_STATIC_CURFDS)
|
wasm_exec_env_t exec_env,
|
||||||
struct fd_table *curfds,
|
struct fd_table *curfds,
|
||||||
#endif
|
|
||||||
__wasi_fd_t sock,
|
__wasi_fd_t sock,
|
||||||
bool ipv6,
|
bool ipv6,
|
||||||
bool is_enabled
|
bool is_enabled
|
||||||
) WASMTIME_SSP_SYSCALL_NAME(sock_set_ip_multicast_loop) WARN_UNUSED;
|
) WASMTIME_SSP_SYSCALL_NAME(sock_set_ip_multicast_loop) WARN_UNUSED;
|
||||||
|
|
||||||
__wasi_errno_t wasmtime_ssp_sock_get_ip_multicast_loop(
|
__wasi_errno_t wasmtime_ssp_sock_get_ip_multicast_loop(
|
||||||
#if !defined(WASMTIME_SSP_STATIC_CURFDS)
|
wasm_exec_env_t exec_env,
|
||||||
struct fd_table *curfds,
|
struct fd_table *curfds,
|
||||||
#endif
|
|
||||||
__wasi_fd_t sock,
|
__wasi_fd_t sock,
|
||||||
bool ipv6,
|
bool ipv6,
|
||||||
bool *is_enabled
|
bool *is_enabled
|
||||||
) WASMTIME_SSP_SYSCALL_NAME(sock_get_ip_multicast_loop) WARN_UNUSED;
|
) WASMTIME_SSP_SYSCALL_NAME(sock_get_ip_multicast_loop) WARN_UNUSED;
|
||||||
|
|
||||||
__wasi_errno_t wasmtime_ssp_sock_set_ip_add_membership(
|
__wasi_errno_t wasmtime_ssp_sock_set_ip_add_membership(
|
||||||
#if !defined(WASMTIME_SSP_STATIC_CURFDS)
|
wasm_exec_env_t exec_env,
|
||||||
struct fd_table *curfds,
|
struct fd_table *curfds,
|
||||||
#endif
|
|
||||||
__wasi_fd_t sock,
|
__wasi_fd_t sock,
|
||||||
__wasi_addr_ip_t *imr_multiaddr,
|
__wasi_addr_ip_t *imr_multiaddr,
|
||||||
uint32_t imr_interface
|
uint32_t imr_interface
|
||||||
) WASMTIME_SSP_SYSCALL_NAME(sock_set_ip_add_membership) WARN_UNUSED;
|
) WASMTIME_SSP_SYSCALL_NAME(sock_set_ip_add_membership) WARN_UNUSED;
|
||||||
|
|
||||||
__wasi_errno_t wasmtime_ssp_sock_set_ip_drop_membership(
|
__wasi_errno_t wasmtime_ssp_sock_set_ip_drop_membership(
|
||||||
#if !defined(WASMTIME_SSP_STATIC_CURFDS)
|
wasm_exec_env_t exec_env,
|
||||||
struct fd_table *curfds,
|
struct fd_table *curfds,
|
||||||
#endif
|
|
||||||
__wasi_fd_t sock,
|
__wasi_fd_t sock,
|
||||||
__wasi_addr_ip_t *imr_multiaddr,
|
__wasi_addr_ip_t *imr_multiaddr,
|
||||||
uint32_t imr_interface
|
uint32_t imr_interface
|
||||||
) WASMTIME_SSP_SYSCALL_NAME(sock_set_ip_drop_membership) WARN_UNUSED;
|
) WASMTIME_SSP_SYSCALL_NAME(sock_set_ip_drop_membership) WARN_UNUSED;
|
||||||
|
|
||||||
__wasi_errno_t wasmtime_ssp_sock_set_ip_ttl(
|
__wasi_errno_t wasmtime_ssp_sock_set_ip_ttl(
|
||||||
#if !defined(WASMTIME_SSP_STATIC_CURFDS)
|
wasm_exec_env_t exec_env,
|
||||||
struct fd_table *curfds,
|
struct fd_table *curfds,
|
||||||
#endif
|
|
||||||
__wasi_fd_t sock,
|
__wasi_fd_t sock,
|
||||||
uint8_t ttl_s
|
uint8_t ttl_s
|
||||||
) WASMTIME_SSP_SYSCALL_NAME(sock_set_ip_ttl) WARN_UNUSED;
|
) WASMTIME_SSP_SYSCALL_NAME(sock_set_ip_ttl) WARN_UNUSED;
|
||||||
|
|
||||||
__wasi_errno_t wasmtime_ssp_sock_get_ip_ttl(
|
__wasi_errno_t wasmtime_ssp_sock_get_ip_ttl(
|
||||||
#if !defined(WASMTIME_SSP_STATIC_CURFDS)
|
wasm_exec_env_t exec_env,
|
||||||
struct fd_table *curfds,
|
struct fd_table *curfds,
|
||||||
#endif
|
|
||||||
__wasi_fd_t sock,
|
__wasi_fd_t sock,
|
||||||
uint8_t *ttl_s
|
uint8_t *ttl_s
|
||||||
) WASMTIME_SSP_SYSCALL_NAME(sock_get_ip_ttl) WARN_UNUSED;
|
) WASMTIME_SSP_SYSCALL_NAME(sock_get_ip_ttl) WARN_UNUSED;
|
||||||
|
|
||||||
__wasi_errno_t wasmtime_ssp_sock_set_ip_multicast_ttl(
|
__wasi_errno_t wasmtime_ssp_sock_set_ip_multicast_ttl(
|
||||||
#if !defined(WASMTIME_SSP_STATIC_CURFDS)
|
wasm_exec_env_t exec_env,
|
||||||
struct fd_table *curfds,
|
struct fd_table *curfds,
|
||||||
#endif
|
|
||||||
__wasi_fd_t sock,
|
__wasi_fd_t sock,
|
||||||
uint8_t ttl_s
|
uint8_t ttl_s
|
||||||
) WASMTIME_SSP_SYSCALL_NAME(sock_set_ip_multicast_ttl) WARN_UNUSED;
|
) WASMTIME_SSP_SYSCALL_NAME(sock_set_ip_multicast_ttl) WARN_UNUSED;
|
||||||
|
|
||||||
__wasi_errno_t wasmtime_ssp_sock_get_ip_multicast_ttl(
|
__wasi_errno_t wasmtime_ssp_sock_get_ip_multicast_ttl(
|
||||||
#if !defined(WASMTIME_SSP_STATIC_CURFDS)
|
wasm_exec_env_t exec_env,
|
||||||
struct fd_table *curfds,
|
struct fd_table *curfds,
|
||||||
#endif
|
|
||||||
__wasi_fd_t sock,
|
__wasi_fd_t sock,
|
||||||
uint8_t *ttl_s
|
uint8_t *ttl_s
|
||||||
) WASMTIME_SSP_SYSCALL_NAME(sock_get_ip_multicast_ttl) WARN_UNUSED;
|
) WASMTIME_SSP_SYSCALL_NAME(sock_get_ip_multicast_ttl) WARN_UNUSED;
|
||||||
|
|
||||||
__wasi_errno_t wasmtime_ssp_sock_set_ipv6_only(
|
__wasi_errno_t wasmtime_ssp_sock_set_ipv6_only(
|
||||||
#if !defined(WASMTIME_SSP_STATIC_CURFDS)
|
wasm_exec_env_t exec_env,
|
||||||
struct fd_table *curfds,
|
struct fd_table *curfds,
|
||||||
#endif
|
|
||||||
__wasi_fd_t sock,
|
__wasi_fd_t sock,
|
||||||
bool is_enabled
|
bool is_enabled
|
||||||
) WASMTIME_SSP_SYSCALL_NAME(sock_set_ipv6_only) WARN_UNUSED;
|
) WASMTIME_SSP_SYSCALL_NAME(sock_set_ipv6_only) WARN_UNUSED;
|
||||||
|
|
||||||
__wasi_errno_t wasmtime_ssp_sock_get_ipv6_only(
|
__wasi_errno_t wasmtime_ssp_sock_get_ipv6_only(
|
||||||
#if !defined(WASMTIME_SSP_STATIC_CURFDS)
|
wasm_exec_env_t exec_env,
|
||||||
struct fd_table *curfds,
|
struct fd_table *curfds,
|
||||||
#endif
|
|
||||||
__wasi_fd_t sock,
|
__wasi_fd_t sock,
|
||||||
bool *is_enabled
|
bool *is_enabled
|
||||||
) WASMTIME_SSP_SYSCALL_NAME(sock_get_ipv6_only) WARN_UNUSED;
|
) WASMTIME_SSP_SYSCALL_NAME(sock_get_ipv6_only) WARN_UNUSED;
|
||||||
|
|
|
@ -0,0 +1,226 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2023 Midokura Japan KK. All rights reserved.
|
||||||
|
* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <errno.h>
|
||||||
|
|
||||||
|
#include "ssp_config.h"
|
||||||
|
#include "blocking_op.h"
|
||||||
|
|
||||||
|
int
|
||||||
|
blocking_op_close(wasm_exec_env_t exec_env, int fd)
|
||||||
|
{
|
||||||
|
if (!wasm_runtime_begin_blocking_op(exec_env)) {
|
||||||
|
errno = EINTR;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
int ret = close(fd);
|
||||||
|
wasm_runtime_end_blocking_op(exec_env);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
ssize_t
|
||||||
|
blocking_op_readv(wasm_exec_env_t exec_env, int fd, const struct iovec *iov,
|
||||||
|
int iovcnt)
|
||||||
|
{
|
||||||
|
#ifdef BH_PLATFORM_WINDOWS
|
||||||
|
errno = ENOTSUP;
|
||||||
|
return -1;
|
||||||
|
#else
|
||||||
|
if (!wasm_runtime_begin_blocking_op(exec_env)) {
|
||||||
|
errno = EINTR;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
ssize_t ret = readv(fd, iov, iovcnt);
|
||||||
|
wasm_runtime_end_blocking_op(exec_env);
|
||||||
|
return ret;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
#if CONFIG_HAS_PREADV
|
||||||
|
ssize_t
|
||||||
|
blocking_op_preadv(wasm_exec_env_t exec_env, int fd, const struct iovec *iov,
|
||||||
|
int iovcnt, off_t offset)
|
||||||
|
{
|
||||||
|
if (!wasm_runtime_begin_blocking_op(exec_env)) {
|
||||||
|
errno = EINTR;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
ssize_t ret = preadv(fd, iov, iovcnt, offset);
|
||||||
|
wasm_runtime_end_blocking_op(exec_env);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
#else /* CONFIG_HAS_PREADV */
|
||||||
|
ssize_t
|
||||||
|
blocking_op_pread(wasm_exec_env_t exec_env, int fd, void *p, size_t nb,
|
||||||
|
off_t offset)
|
||||||
|
{
|
||||||
|
#ifdef BH_PLATFORM_WINDOWS
|
||||||
|
errno = ENOTSUP;
|
||||||
|
return -1;
|
||||||
|
#else
|
||||||
|
if (!wasm_runtime_begin_blocking_op(exec_env)) {
|
||||||
|
errno = EINTR;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
ssize_t ret = pread(fd, p, nb, offset);
|
||||||
|
wasm_runtime_end_blocking_op(exec_env);
|
||||||
|
return ret;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
#endif /* CONFIG_HAS_PREADV */
|
||||||
|
|
||||||
|
ssize_t
|
||||||
|
blocking_op_writev(wasm_exec_env_t exec_env, int fd, const struct iovec *iov,
|
||||||
|
int iovcnt)
|
||||||
|
{
|
||||||
|
#ifdef BH_PLATFORM_WINDOWS
|
||||||
|
errno = ENOTSUP;
|
||||||
|
return -1;
|
||||||
|
#else
|
||||||
|
if (!wasm_runtime_begin_blocking_op(exec_env)) {
|
||||||
|
errno = EINTR;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
ssize_t ret = writev(fd, iov, iovcnt);
|
||||||
|
wasm_runtime_end_blocking_op(exec_env);
|
||||||
|
return ret;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
#if CONFIG_HAS_PWRITEV
|
||||||
|
ssize_t
|
||||||
|
blocking_op_pwritev(wasm_exec_env_t exec_env, int fd, const struct iovec *iov,
|
||||||
|
int iovcnt, off_t offset)
|
||||||
|
{
|
||||||
|
if (!wasm_runtime_begin_blocking_op(exec_env)) {
|
||||||
|
errno = EINTR;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
ssize_t ret = pwritev(fd, iov, iovcnt, offset);
|
||||||
|
wasm_runtime_end_blocking_op(exec_env);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
#else /* CONFIG_HAS_PWRITEV */
|
||||||
|
ssize_t
|
||||||
|
blocking_op_pwrite(wasm_exec_env_t exec_env, int fd, const void *p, size_t nb,
|
||||||
|
off_t offset)
|
||||||
|
{
|
||||||
|
#ifdef BH_PLATFORM_WINDOWS
|
||||||
|
errno = ENOTSUP;
|
||||||
|
return -1;
|
||||||
|
#else
|
||||||
|
if (!wasm_runtime_begin_blocking_op(exec_env)) {
|
||||||
|
errno = EINTR;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
ssize_t ret = pwrite(fd, p, nb, offset);
|
||||||
|
wasm_runtime_end_blocking_op(exec_env);
|
||||||
|
return ret;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
#endif /* CONFIG_HAS_PWRITEV */
|
||||||
|
|
||||||
|
int
|
||||||
|
blocking_op_socket_accept(wasm_exec_env_t exec_env, bh_socket_t server_sock,
|
||||||
|
bh_socket_t *sockp, void *addr,
|
||||||
|
unsigned int *addrlenp)
|
||||||
|
{
|
||||||
|
if (!wasm_runtime_begin_blocking_op(exec_env)) {
|
||||||
|
errno = EINTR;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
int ret = os_socket_accept(server_sock, sockp, addr, addrlenp);
|
||||||
|
wasm_runtime_end_blocking_op(exec_env);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
blocking_op_socket_connect(wasm_exec_env_t exec_env, bh_socket_t sock,
|
||||||
|
const char *addr, int port)
|
||||||
|
{
|
||||||
|
if (!wasm_runtime_begin_blocking_op(exec_env)) {
|
||||||
|
errno = EINTR;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
int ret = os_socket_connect(sock, addr, port);
|
||||||
|
wasm_runtime_end_blocking_op(exec_env);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
blocking_op_socket_recv_from(wasm_exec_env_t exec_env, bh_socket_t sock,
|
||||||
|
void *buf, unsigned int len, int flags,
|
||||||
|
bh_sockaddr_t *src_addr)
|
||||||
|
{
|
||||||
|
if (!wasm_runtime_begin_blocking_op(exec_env)) {
|
||||||
|
errno = EINTR;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
int ret = os_socket_recv_from(sock, buf, len, flags, src_addr);
|
||||||
|
wasm_runtime_end_blocking_op(exec_env);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
blocking_op_socket_send_to(wasm_exec_env_t exec_env, bh_socket_t sock,
|
||||||
|
const void *buf, unsigned int len, int flags,
|
||||||
|
const bh_sockaddr_t *dest_addr)
|
||||||
|
{
|
||||||
|
if (!wasm_runtime_begin_blocking_op(exec_env)) {
|
||||||
|
errno = EINTR;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
int ret = os_socket_send_to(sock, buf, len, flags, dest_addr);
|
||||||
|
wasm_runtime_end_blocking_op(exec_env);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
blocking_op_socket_addr_resolve(wasm_exec_env_t exec_env, const char *host,
|
||||||
|
const char *service, uint8_t *hint_is_tcp,
|
||||||
|
uint8_t *hint_is_ipv4,
|
||||||
|
bh_addr_info_t *addr_info,
|
||||||
|
size_t addr_info_size, size_t *max_info_size)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* Note: Unlike others, os_socket_addr_resolve() is not a simple system
|
||||||
|
* call. It's likely backed by a complex libc function, getaddrinfo().
|
||||||
|
* Depending on the implementation of getaddrinfo() and underlying
|
||||||
|
* DNS resolver, it might or might not be possible to make it return
|
||||||
|
* with os_wakeup_blocking_op().
|
||||||
|
*
|
||||||
|
* Unfortunately, many of ISC/bind based resolvers just keep going on
|
||||||
|
* interrupted system calls. It includes macOS and glibc.
|
||||||
|
*
|
||||||
|
* On the other hand, NuttX as of writing this returns EAI_AGAIN
|
||||||
|
* on EINTR.
|
||||||
|
*/
|
||||||
|
if (!wasm_runtime_begin_blocking_op(exec_env)) {
|
||||||
|
errno = EINTR;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
int ret = os_socket_addr_resolve(host, service, hint_is_tcp, hint_is_ipv4,
|
||||||
|
addr_info, addr_info_size, max_info_size);
|
||||||
|
wasm_runtime_end_blocking_op(exec_env);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
blocking_op_openat(wasm_exec_env_t exec_env, int fd, const char *path,
|
||||||
|
int oflags, mode_t mode)
|
||||||
|
{
|
||||||
|
#ifdef BH_PLATFORM_WINDOWS
|
||||||
|
errno = ENOTSUP;
|
||||||
|
return -1;
|
||||||
|
#else
|
||||||
|
if (!wasm_runtime_begin_blocking_op(exec_env)) {
|
||||||
|
errno = EINTR;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
int ret = openat(fd, path, oflags, mode);
|
||||||
|
wasm_runtime_end_blocking_op(exec_env);
|
||||||
|
return ret;
|
||||||
|
#endif
|
||||||
|
}
|
|
@ -0,0 +1,57 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2023 Midokura Japan KK. All rights reserved.
|
||||||
|
* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "bh_platform.h"
|
||||||
|
#include "wasm_export.h"
|
||||||
|
|
||||||
|
int
|
||||||
|
blocking_op_close(wasm_exec_env_t exec_env, int fd);
|
||||||
|
ssize_t
|
||||||
|
blocking_op_readv(wasm_exec_env_t exec_env, int fd, const struct iovec *iov,
|
||||||
|
int iovcnt);
|
||||||
|
ssize_t
|
||||||
|
blocking_op_preadv(wasm_exec_env_t exec_env, int fd, const struct iovec *iov,
|
||||||
|
int iovcnt, off_t offset);
|
||||||
|
ssize_t
|
||||||
|
blocking_op_pread(wasm_exec_env_t exec_env, int fd, void *p, size_t nb,
|
||||||
|
off_t offset);
|
||||||
|
ssize_t
|
||||||
|
blocking_op_writev(wasm_exec_env_t exec_env, int fd, const struct iovec *iov,
|
||||||
|
int iovcnt);
|
||||||
|
ssize_t
|
||||||
|
blocking_op_pwritev(wasm_exec_env_t exec_env, int fd, const struct iovec *iov,
|
||||||
|
int iovcnt, off_t offset);
|
||||||
|
ssize_t
|
||||||
|
blocking_op_pwrite(wasm_exec_env_t exec_env, int fd, const void *p, size_t nb,
|
||||||
|
off_t offset);
|
||||||
|
int
|
||||||
|
blocking_op_socket_accept(wasm_exec_env_t exec_env, bh_socket_t server_sock,
|
||||||
|
bh_socket_t *sockp, void *addr,
|
||||||
|
unsigned int *addrlenp);
|
||||||
|
int
|
||||||
|
blocking_op_socket_connect(wasm_exec_env_t exec_env, bh_socket_t sock,
|
||||||
|
const char *addr, int port);
|
||||||
|
int
|
||||||
|
blocking_op_socket_recv_from(wasm_exec_env_t exec_env, bh_socket_t sock,
|
||||||
|
void *buf, unsigned int len, int flags,
|
||||||
|
bh_sockaddr_t *src_addr);
|
||||||
|
int
|
||||||
|
blocking_op_socket_send_to(wasm_exec_env_t exec_env, bh_socket_t sock,
|
||||||
|
const void *buf, unsigned int len, int flags,
|
||||||
|
const bh_sockaddr_t *dest_addr);
|
||||||
|
int
|
||||||
|
blocking_op_socket_addr_resolve(wasm_exec_env_t exec_env, const char *host,
|
||||||
|
const char *service, uint8_t *hint_is_tcp,
|
||||||
|
uint8_t *hint_is_ipv4,
|
||||||
|
bh_addr_info_t *addr_info,
|
||||||
|
size_t addr_info_size, size_t *max_info_size);
|
||||||
|
|
||||||
|
#ifdef BH_PLATFORM_WINDOWS
|
||||||
|
/* TODO to be (re)moved as part of WASI on windows work */
|
||||||
|
typedef unsigned mode_t;
|
||||||
|
#endif
|
||||||
|
int
|
||||||
|
blocking_op_openat(wasm_exec_env_t exec_env, int fd, const char *path,
|
||||||
|
int oflags, mode_t mode);
|
File diff suppressed because it is too large
Load Diff
|
@ -14,8 +14,8 @@
|
||||||
#ifndef SSP_CONFIG_H
|
#ifndef SSP_CONFIG_H
|
||||||
#define SSP_CONFIG_H
|
#define SSP_CONFIG_H
|
||||||
|
|
||||||
|
#include "bh_platform.h"
|
||||||
#include "gnuc.h"
|
#include "gnuc.h"
|
||||||
#include <stdlib.h>
|
|
||||||
|
|
||||||
#if defined(__FreeBSD__) || defined(__APPLE__) \
|
#if defined(__FreeBSD__) || defined(__APPLE__) \
|
||||||
|| (defined(ANDROID) && __ANDROID_API__ < 28)
|
|| (defined(ANDROID) && __ANDROID_API__ < 28)
|
||||||
|
@ -66,7 +66,8 @@
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if !defined(__APPLE__) && !defined(ESP_PLATFORM) && !defined(_WIN32)
|
#if !defined(__APPLE__) && !defined(ESP_PLATFORM) && !defined(_WIN32) \
|
||||||
|
&& !defined(__COSMOPOLITAN__)
|
||||||
#define CONFIG_HAS_POSIX_FALLOCATE 1
|
#define CONFIG_HAS_POSIX_FALLOCATE 1
|
||||||
#else
|
#else
|
||||||
#define CONFIG_HAS_POSIX_FALLOCATE 0
|
#define CONFIG_HAS_POSIX_FALLOCATE 0
|
||||||
|
@ -84,7 +85,8 @@
|
||||||
#define CONFIG_HAS_PTHREAD_COND_TIMEDWAIT_RELATIVE_NP 0
|
#define CONFIG_HAS_PTHREAD_COND_TIMEDWAIT_RELATIVE_NP 0
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if !defined(__APPLE__) && !defined(BH_PLATFORM_LINUX_SGX) && !defined(_WIN32)
|
#if !defined(__APPLE__) && !defined(BH_PLATFORM_LINUX_SGX) && !defined(_WIN32) \
|
||||||
|
&& !defined(__COSMOPOLITAN__)
|
||||||
#define CONFIG_HAS_PTHREAD_CONDATTR_SETCLOCK 1
|
#define CONFIG_HAS_PTHREAD_CONDATTR_SETCLOCK 1
|
||||||
#else
|
#else
|
||||||
#define CONFIG_HAS_PTHREAD_CONDATTR_SETCLOCK 0
|
#define CONFIG_HAS_PTHREAD_CONDATTR_SETCLOCK 0
|
||||||
|
@ -102,10 +104,18 @@
|
||||||
#define st_mtim st_mtimespec
|
#define st_mtim st_mtimespec
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef __APPLE__
|
#if defined(O_DSYNC)
|
||||||
#define CONFIG_TLS_USE_GSBASE 1
|
#define CONFIG_HAS_O_DSYNC
|
||||||
#else
|
#endif
|
||||||
#define CONFIG_TLS_USE_GSBASE 0
|
|
||||||
|
// POSIX requires O_RSYNC to be defined, but Linux explicitly doesn't support
|
||||||
|
// it.
|
||||||
|
#if defined(O_RSYNC) && !defined(__linux__)
|
||||||
|
#define CONFIG_HAS_O_RSYNC
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(O_SYNC)
|
||||||
|
#define CONFIG_HAS_O_SYNC
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if !defined(BH_PLATFORM_LINUX_SGX)
|
#if !defined(BH_PLATFORM_LINUX_SGX)
|
||||||
|
|
|
@ -16,10 +16,6 @@
|
||||||
#include "debug_engine.h"
|
#include "debug_engine.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if WASM_ENABLE_SHARED_MEMORY != 0
|
|
||||||
#include "wasm_shared_memory.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
bh_list_link l;
|
bh_list_link l;
|
||||||
void (*destroy_cb)(WASMCluster *);
|
void (*destroy_cb)(WASMCluster *);
|
||||||
|
@ -32,6 +28,8 @@ static bh_list cluster_list_head;
|
||||||
static bh_list *const cluster_list = &cluster_list_head;
|
static bh_list *const cluster_list = &cluster_list_head;
|
||||||
static korp_mutex cluster_list_lock;
|
static korp_mutex cluster_list_lock;
|
||||||
|
|
||||||
|
static korp_mutex _exception_lock;
|
||||||
|
|
||||||
typedef void (*list_visitor)(void *, void *);
|
typedef void (*list_visitor)(void *, void *);
|
||||||
|
|
||||||
static uint32 cluster_max_thread_num = CLUSTER_MAX_THREAD_NUM;
|
static uint32 cluster_max_thread_num = CLUSTER_MAX_THREAD_NUM;
|
||||||
|
@ -52,6 +50,10 @@ thread_manager_init()
|
||||||
return false;
|
return false;
|
||||||
if (os_mutex_init(&cluster_list_lock) != 0)
|
if (os_mutex_init(&cluster_list_lock) != 0)
|
||||||
return false;
|
return false;
|
||||||
|
if (os_mutex_init(&_exception_lock) != 0) {
|
||||||
|
os_mutex_destroy(&cluster_list_lock);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -66,6 +68,7 @@ thread_manager_destroy()
|
||||||
cluster = next;
|
cluster = next;
|
||||||
}
|
}
|
||||||
wasm_cluster_cancel_all_callbacks();
|
wasm_cluster_cancel_all_callbacks();
|
||||||
|
os_mutex_destroy(&_exception_lock);
|
||||||
os_mutex_destroy(&cluster_list_lock);
|
os_mutex_destroy(&cluster_list_lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -477,9 +480,6 @@ wasm_cluster_spawn_exec_env(WASMExecEnv *exec_env)
|
||||||
wasm_module_inst_t module_inst = get_module_inst(exec_env);
|
wasm_module_inst_t module_inst = get_module_inst(exec_env);
|
||||||
wasm_module_t module;
|
wasm_module_t module;
|
||||||
wasm_module_inst_t new_module_inst;
|
wasm_module_inst_t new_module_inst;
|
||||||
#if WASM_ENABLE_LIBC_WASI != 0
|
|
||||||
WASIContext *wasi_ctx;
|
|
||||||
#endif
|
|
||||||
WASMExecEnv *new_exec_env;
|
WASMExecEnv *new_exec_env;
|
||||||
uint32 aux_stack_start, aux_stack_size;
|
uint32 aux_stack_start, aux_stack_size;
|
||||||
uint32 stack_size = 8192;
|
uint32 stack_size = 8192;
|
||||||
|
@ -517,10 +517,7 @@ wasm_cluster_spawn_exec_env(WASMExecEnv *exec_env)
|
||||||
wasm_runtime_set_custom_data_internal(
|
wasm_runtime_set_custom_data_internal(
|
||||||
new_module_inst, wasm_runtime_get_custom_data(module_inst));
|
new_module_inst, wasm_runtime_get_custom_data(module_inst));
|
||||||
|
|
||||||
#if WASM_ENABLE_LIBC_WASI != 0
|
wasm_native_inherit_contexts(new_module_inst, module_inst);
|
||||||
wasi_ctx = wasm_runtime_get_wasi_ctx(module_inst);
|
|
||||||
wasm_runtime_set_wasi_ctx(new_module_inst, wasi_ctx);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
new_exec_env = wasm_exec_env_create_internal(new_module_inst,
|
new_exec_env = wasm_exec_env_create_internal(new_module_inst,
|
||||||
exec_env->wasm_stack_size);
|
exec_env->wasm_stack_size);
|
||||||
|
@ -1062,6 +1059,19 @@ set_thread_cancel_flags(WASMExecEnv *exec_env)
|
||||||
WASM_SUSPEND_FLAG_TERMINATE);
|
WASM_SUSPEND_FLAG_TERMINATE);
|
||||||
|
|
||||||
os_mutex_unlock(&exec_env->wait_lock);
|
os_mutex_unlock(&exec_env->wait_lock);
|
||||||
|
|
||||||
|
#ifdef OS_ENABLE_WAKEUP_BLOCKING_OP
|
||||||
|
wasm_runtime_interrupt_blocking_op(exec_env);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
clear_thread_cancel_flags(WASMExecEnv *exec_env)
|
||||||
|
{
|
||||||
|
os_mutex_lock(&exec_env->wait_lock);
|
||||||
|
WASM_SUSPEND_FLAGS_FETCH_AND(exec_env->suspend_flags,
|
||||||
|
~WASM_SUSPEND_FLAG_TERMINATE);
|
||||||
|
os_mutex_unlock(&exec_env->wait_lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
int32
|
int32
|
||||||
|
@ -1240,72 +1250,55 @@ wasm_cluster_resume_all(WASMCluster *cluster)
|
||||||
os_mutex_unlock(&cluster->lock);
|
os_mutex_unlock(&cluster->lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct spread_exception_data {
|
||||||
|
WASMExecEnv *skip;
|
||||||
|
const char *exception;
|
||||||
|
};
|
||||||
|
|
||||||
static void
|
static void
|
||||||
set_exception_visitor(void *node, void *user_data)
|
set_exception_visitor(void *node, void *user_data)
|
||||||
{
|
{
|
||||||
WASMExecEnv *curr_exec_env = (WASMExecEnv *)node;
|
const struct spread_exception_data *data = user_data;
|
||||||
WASMExecEnv *exec_env = (WASMExecEnv *)user_data;
|
WASMExecEnv *exec_env = (WASMExecEnv *)node;
|
||||||
WASMModuleInstanceCommon *module_inst = get_module_inst(exec_env);
|
|
||||||
WASMModuleInstance *wasm_inst = (WASMModuleInstance *)module_inst;
|
|
||||||
|
|
||||||
if (curr_exec_env != exec_env) {
|
if (exec_env != data->skip) {
|
||||||
WASMModuleInstance *curr_wasm_inst =
|
WASMModuleInstance *wasm_inst =
|
||||||
(WASMModuleInstance *)get_module_inst(curr_exec_env);
|
(WASMModuleInstance *)get_module_inst(exec_env);
|
||||||
|
|
||||||
/* Only spread non "wasi proc exit" exception */
|
exception_lock(wasm_inst);
|
||||||
#if WASM_ENABLE_SHARED_MEMORY != 0
|
if (data->exception != NULL) {
|
||||||
if (curr_wasm_inst->memory_count > 0)
|
snprintf(wasm_inst->cur_exception, sizeof(wasm_inst->cur_exception),
|
||||||
shared_memory_lock(curr_wasm_inst->memories[0]);
|
"Exception: %s", data->exception);
|
||||||
#endif
|
|
||||||
if (!strstr(wasm_inst->cur_exception, "wasi proc exit")) {
|
|
||||||
bh_memcpy_s(curr_wasm_inst->cur_exception,
|
|
||||||
sizeof(curr_wasm_inst->cur_exception),
|
|
||||||
wasm_inst->cur_exception,
|
|
||||||
sizeof(wasm_inst->cur_exception));
|
|
||||||
}
|
}
|
||||||
#if WASM_ENABLE_SHARED_MEMORY != 0
|
else {
|
||||||
if (curr_wasm_inst->memory_count > 0)
|
wasm_inst->cur_exception[0] = '\0';
|
||||||
shared_memory_unlock(curr_wasm_inst->memories[0]);
|
}
|
||||||
#endif
|
exception_unlock(wasm_inst);
|
||||||
|
|
||||||
/* Terminate the thread so it can exit from dead loops */
|
/* Terminate the thread so it can exit from dead loops */
|
||||||
set_thread_cancel_flags(curr_exec_env);
|
if (data->exception != NULL) {
|
||||||
|
set_thread_cancel_flags(exec_env);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
clear_thread_cancel_flags(exec_env);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
clear_exception_visitor(void *node, void *user_data)
|
|
||||||
{
|
|
||||||
WASMExecEnv *exec_env = (WASMExecEnv *)user_data;
|
|
||||||
WASMExecEnv *curr_exec_env = (WASMExecEnv *)node;
|
|
||||||
|
|
||||||
if (curr_exec_env != exec_env) {
|
|
||||||
WASMModuleInstance *curr_wasm_inst =
|
|
||||||
(WASMModuleInstance *)get_module_inst(curr_exec_env);
|
|
||||||
|
|
||||||
#if WASM_ENABLE_SHARED_MEMORY != 0
|
|
||||||
if (curr_wasm_inst->memory_count > 0)
|
|
||||||
shared_memory_lock(curr_wasm_inst->memories[0]);
|
|
||||||
#endif
|
|
||||||
curr_wasm_inst->cur_exception[0] = '\0';
|
|
||||||
#if WASM_ENABLE_SHARED_MEMORY != 0
|
|
||||||
if (curr_wasm_inst->memory_count > 0)
|
|
||||||
shared_memory_unlock(curr_wasm_inst->memories[0]);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
wasm_cluster_spread_exception(WASMExecEnv *exec_env, bool clear)
|
wasm_cluster_set_exception(WASMExecEnv *exec_env, const char *exception)
|
||||||
{
|
{
|
||||||
|
const bool has_exception = exception != NULL;
|
||||||
WASMCluster *cluster = wasm_exec_env_get_cluster(exec_env);
|
WASMCluster *cluster = wasm_exec_env_get_cluster(exec_env);
|
||||||
bh_assert(cluster);
|
bh_assert(cluster);
|
||||||
|
|
||||||
|
struct spread_exception_data data;
|
||||||
|
data.skip = NULL;
|
||||||
|
data.exception = exception;
|
||||||
|
|
||||||
os_mutex_lock(&cluster->lock);
|
os_mutex_lock(&cluster->lock);
|
||||||
cluster->has_exception = !clear;
|
cluster->has_exception = has_exception;
|
||||||
traverse_list(&cluster->exec_env_list,
|
traverse_list(&cluster->exec_env_list, set_exception_visitor, &data);
|
||||||
clear ? clear_exception_visitor : set_exception_visitor,
|
|
||||||
exec_env);
|
|
||||||
os_mutex_unlock(&cluster->lock);
|
os_mutex_unlock(&cluster->lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1341,6 +1334,48 @@ wasm_cluster_spread_custom_data(WASMModuleInstanceCommon *module_inst,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if WASM_ENABLE_MODULE_INST_CONTEXT != 0
|
||||||
|
struct inst_set_context_data {
|
||||||
|
void *key;
|
||||||
|
void *ctx;
|
||||||
|
};
|
||||||
|
|
||||||
|
static void
|
||||||
|
set_context_visitor(void *node, void *user_data)
|
||||||
|
{
|
||||||
|
WASMExecEnv *curr_exec_env = (WASMExecEnv *)node;
|
||||||
|
WASMModuleInstanceCommon *module_inst = get_module_inst(curr_exec_env);
|
||||||
|
const struct inst_set_context_data *data = user_data;
|
||||||
|
|
||||||
|
wasm_runtime_set_context(module_inst, data->key, data->ctx);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
wasm_cluster_set_context(WASMModuleInstanceCommon *module_inst, void *key,
|
||||||
|
void *ctx)
|
||||||
|
{
|
||||||
|
WASMExecEnv *exec_env = wasm_clusters_search_exec_env(module_inst);
|
||||||
|
|
||||||
|
if (exec_env == NULL) {
|
||||||
|
/* Maybe threads have not been started yet. */
|
||||||
|
wasm_runtime_set_context(module_inst, key, ctx);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
WASMCluster *cluster;
|
||||||
|
struct inst_set_context_data data;
|
||||||
|
data.key = key;
|
||||||
|
data.ctx = ctx;
|
||||||
|
|
||||||
|
cluster = wasm_exec_env_get_cluster(exec_env);
|
||||||
|
bh_assert(cluster);
|
||||||
|
|
||||||
|
os_mutex_lock(&cluster->lock);
|
||||||
|
traverse_list(&cluster->exec_env_list, set_context_visitor, &data);
|
||||||
|
os_mutex_unlock(&cluster->lock);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif /* WASM_ENABLE_MODULE_INST_CONTEXT != 0 */
|
||||||
|
|
||||||
bool
|
bool
|
||||||
wasm_cluster_is_thread_terminated(WASMExecEnv *exec_env)
|
wasm_cluster_is_thread_terminated(WASMExecEnv *exec_env)
|
||||||
{
|
{
|
||||||
|
@ -1353,3 +1388,21 @@ wasm_cluster_is_thread_terminated(WASMExecEnv *exec_env)
|
||||||
|
|
||||||
return is_thread_terminated;
|
return is_thread_terminated;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
exception_lock(WASMModuleInstance *module_inst)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* Note: this lock could be per module instance if desirable.
|
||||||
|
* We can revisit on AOT version bump.
|
||||||
|
* It probably doesn't matter though because the exception handling
|
||||||
|
* logic should not be executed too frequently anyway.
|
||||||
|
*/
|
||||||
|
os_mutex_lock(&_exception_lock);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
exception_unlock(WASMModuleInstance *module_inst)
|
||||||
|
{
|
||||||
|
os_mutex_unlock(&_exception_lock);
|
||||||
|
}
|
||||||
|
|
|
@ -139,7 +139,7 @@ WASMExecEnv *
|
||||||
wasm_clusters_search_exec_env(WASMModuleInstanceCommon *module_inst);
|
wasm_clusters_search_exec_env(WASMModuleInstanceCommon *module_inst);
|
||||||
|
|
||||||
void
|
void
|
||||||
wasm_cluster_spread_exception(WASMExecEnv *exec_env, bool clear);
|
wasm_cluster_set_exception(WASMExecEnv *exec_env, const char *exception);
|
||||||
|
|
||||||
WASMExecEnv *
|
WASMExecEnv *
|
||||||
wasm_cluster_spawn_exec_env(WASMExecEnv *exec_env);
|
wasm_cluster_spawn_exec_env(WASMExecEnv *exec_env);
|
||||||
|
@ -151,6 +151,10 @@ void
|
||||||
wasm_cluster_spread_custom_data(WASMModuleInstanceCommon *module_inst,
|
wasm_cluster_spread_custom_data(WASMModuleInstanceCommon *module_inst,
|
||||||
void *custom_data);
|
void *custom_data);
|
||||||
|
|
||||||
|
void
|
||||||
|
wasm_cluster_set_context(WASMModuleInstanceCommon *module_inst, void *key,
|
||||||
|
void *ctx);
|
||||||
|
|
||||||
bool
|
bool
|
||||||
wasm_cluster_is_thread_terminated(WASMExecEnv *exec_env);
|
wasm_cluster_is_thread_terminated(WASMExecEnv *exec_env);
|
||||||
|
|
||||||
|
|
|
@ -163,6 +163,7 @@ void
|
||||||
wasi_nn_destroy(wasm_module_inst_t instance)
|
wasi_nn_destroy(wasm_module_inst_t instance)
|
||||||
{
|
{
|
||||||
WASINNContext *wasi_nn_ctx = wasm_runtime_get_wasi_nn_ctx(instance);
|
WASINNContext *wasi_nn_ctx = wasm_runtime_get_wasi_nn_ctx(instance);
|
||||||
|
bh_hash_map_remove(hashmap, (void *)instance, NULL, NULL);
|
||||||
wasi_nn_ctx_destroy(wasi_nn_ctx);
|
wasi_nn_ctx_destroy(wasi_nn_ctx);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -69,3 +69,7 @@ os_mprotect(void *addr, size_t size, int prot)
|
||||||
void
|
void
|
||||||
os_dcache_flush()
|
os_dcache_flush()
|
||||||
{}
|
{}
|
||||||
|
|
||||||
|
void
|
||||||
|
os_icache_flush(void *start, size_t len)
|
||||||
|
{}
|
||||||
|
|
|
@ -359,3 +359,7 @@ os_thread_get_stack_boundary()
|
||||||
/* TODO: get alios stack boundary */
|
/* TODO: get alios stack boundary */
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
os_thread_jit_write_protect_np(bool enabled)
|
||||||
|
{}
|
|
@ -140,16 +140,12 @@ seekdir(DIR *__dir, long __location);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if __ANDROID_API__ < 24
|
|
||||||
|
|
||||||
ssize_t
|
ssize_t
|
||||||
preadv(int __fd, const struct iovec *__iov, int __count, off_t __offset);
|
preadv(int __fd, const struct iovec *__iov, int __count, off_t __offset);
|
||||||
|
|
||||||
ssize_t
|
ssize_t
|
||||||
pwritev(int __fd, const struct iovec *__iov, int __count, off_t __offset);
|
pwritev(int __fd, const struct iovec *__iov, int __count, off_t __offset);
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
69
core/shared/platform/common/posix/posix_blocking_op.c
Normal file
69
core/shared/platform/common/posix/posix_blocking_op.c
Normal file
|
@ -0,0 +1,69 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2023 Midokura Japan KK. All rights reserved.
|
||||||
|
* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "platform_api_extension.h"
|
||||||
|
|
||||||
|
#ifdef OS_ENABLE_WAKEUP_BLOCKING_OP
|
||||||
|
|
||||||
|
static bool g_blocking_op_inited = false;
|
||||||
|
static int g_blocking_op_signo = SIGUSR1;
|
||||||
|
static sigset_t g_blocking_op_sigmask;
|
||||||
|
|
||||||
|
static void
|
||||||
|
blocking_op_sighandler(int signo)
|
||||||
|
{
|
||||||
|
/* nothing */
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
os_set_signal_number_for_blocking_op(int signo)
|
||||||
|
{
|
||||||
|
g_blocking_op_signo = signo;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
os_blocking_op_init()
|
||||||
|
{
|
||||||
|
if (g_blocking_op_inited) {
|
||||||
|
return BHT_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
sigemptyset(&g_blocking_op_sigmask);
|
||||||
|
sigaddset(&g_blocking_op_sigmask, g_blocking_op_signo);
|
||||||
|
|
||||||
|
struct sigaction sa;
|
||||||
|
sigemptyset(&sa.sa_mask);
|
||||||
|
sa.sa_flags = 0;
|
||||||
|
sa.sa_handler = blocking_op_sighandler;
|
||||||
|
if (sigaction(g_blocking_op_signo, &sa, NULL)) {
|
||||||
|
return BHT_ERROR;
|
||||||
|
}
|
||||||
|
g_blocking_op_inited = true;
|
||||||
|
return BHT_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
os_begin_blocking_op()
|
||||||
|
{
|
||||||
|
pthread_sigmask(SIG_UNBLOCK, &g_blocking_op_sigmask, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
os_end_blocking_op()
|
||||||
|
{
|
||||||
|
pthread_sigmask(SIG_BLOCK, &g_blocking_op_sigmask, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
os_wakeup_blocking_op(korp_tid tid)
|
||||||
|
{
|
||||||
|
int ret = pthread_kill(tid, g_blocking_op_signo);
|
||||||
|
if (ret != 0) {
|
||||||
|
return BHT_ERROR;
|
||||||
|
}
|
||||||
|
return BHT_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* OS_ENABLE_WAKEUP_BLOCKING_OP */
|
|
@ -5,6 +5,10 @@
|
||||||
|
|
||||||
#include "platform_api_vmcore.h"
|
#include "platform_api_vmcore.h"
|
||||||
|
|
||||||
|
#if (defined(__APPLE__) || defined(__MACH__)) && defined(__arm64__)
|
||||||
|
#include <libkern/OSCacheControl.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifndef BH_ENABLE_TRACE_MMAP
|
#ifndef BH_ENABLE_TRACE_MMAP
|
||||||
#define BH_ENABLE_TRACE_MMAP 0
|
#define BH_ENABLE_TRACE_MMAP 0
|
||||||
#endif
|
#endif
|
||||||
|
@ -36,7 +40,11 @@ void *
|
||||||
os_mmap(void *hint, size_t size, int prot, int flags)
|
os_mmap(void *hint, size_t size, int prot, int flags)
|
||||||
{
|
{
|
||||||
int map_prot = PROT_NONE;
|
int map_prot = PROT_NONE;
|
||||||
|
#if (defined(__APPLE__) || defined(__MACH__)) && defined(__arm64__)
|
||||||
|
int map_flags = MAP_ANONYMOUS | MAP_PRIVATE | MAP_JIT;
|
||||||
|
#else
|
||||||
int map_flags = MAP_ANONYMOUS | MAP_PRIVATE;
|
int map_flags = MAP_ANONYMOUS | MAP_PRIVATE;
|
||||||
|
#endif
|
||||||
uint64 request_size, page_size;
|
uint64 request_size, page_size;
|
||||||
uint8 *addr = MAP_FAILED;
|
uint8 *addr = MAP_FAILED;
|
||||||
uint32 i;
|
uint32 i;
|
||||||
|
@ -251,3 +259,11 @@ os_mprotect(void *addr, size_t size, int prot)
|
||||||
void
|
void
|
||||||
os_dcache_flush(void)
|
os_dcache_flush(void)
|
||||||
{}
|
{}
|
||||||
|
|
||||||
|
void
|
||||||
|
os_icache_flush(void *start, size_t len)
|
||||||
|
{
|
||||||
|
#if (defined(__APPLE__) || defined(__MACH__)) && defined(__arm64__)
|
||||||
|
sys_icache_invalidate(start, len);
|
||||||
|
#endif
|
||||||
|
}
|
20
core/shared/platform/common/posix/posix_sleep.c
Normal file
20
core/shared/platform/common/posix/posix_sleep.c
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2023 Midokura Japan KK. All rights reserved.
|
||||||
|
* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <time.h>
|
||||||
|
|
||||||
|
#include "platform_api_extension.h"
|
||||||
|
|
||||||
|
int
|
||||||
|
os_usleep(uint32 usec)
|
||||||
|
{
|
||||||
|
struct timespec ts;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
ts.tv_sec = usec / 1000000;
|
||||||
|
ts.tv_nsec = (usec % 1000000) * 1000;
|
||||||
|
ret = nanosleep(&ts, NULL);
|
||||||
|
return ret == 0 ? 0 : -1;
|
||||||
|
}
|
|
@ -53,7 +53,7 @@ sockaddr_to_bh_sockaddr(const struct sockaddr *sockaddr,
|
||||||
struct sockaddr_in *addr = (struct sockaddr_in *)sockaddr;
|
struct sockaddr_in *addr = (struct sockaddr_in *)sockaddr;
|
||||||
|
|
||||||
bh_sockaddr->port = ntohs(addr->sin_port);
|
bh_sockaddr->port = ntohs(addr->sin_port);
|
||||||
bh_sockaddr->addr_bufer.ipv4 = ntohl(addr->sin_addr.s_addr);
|
bh_sockaddr->addr_buffer.ipv4 = ntohl(addr->sin_addr.s_addr);
|
||||||
bh_sockaddr->is_ipv4 = true;
|
bh_sockaddr->is_ipv4 = true;
|
||||||
return BHT_OK;
|
return BHT_OK;
|
||||||
}
|
}
|
||||||
|
@ -65,12 +65,12 @@ sockaddr_to_bh_sockaddr(const struct sockaddr *sockaddr,
|
||||||
|
|
||||||
bh_sockaddr->port = ntohs(addr->sin6_port);
|
bh_sockaddr->port = ntohs(addr->sin6_port);
|
||||||
|
|
||||||
for (i = 0; i < sizeof(bh_sockaddr->addr_bufer.ipv6)
|
for (i = 0; i < sizeof(bh_sockaddr->addr_buffer.ipv6)
|
||||||
/ sizeof(bh_sockaddr->addr_bufer.ipv6[0]);
|
/ sizeof(bh_sockaddr->addr_buffer.ipv6[0]);
|
||||||
i++) {
|
i++) {
|
||||||
uint16 part_addr = addr->sin6_addr.s6_addr[i * 2]
|
uint16 part_addr = addr->sin6_addr.s6_addr[i * 2]
|
||||||
| (addr->sin6_addr.s6_addr[i * 2 + 1] << 8);
|
| (addr->sin6_addr.s6_addr[i * 2 + 1] << 8);
|
||||||
bh_sockaddr->addr_bufer.ipv6[i] = ntohs(part_addr);
|
bh_sockaddr->addr_buffer.ipv6[i] = ntohs(part_addr);
|
||||||
}
|
}
|
||||||
|
|
||||||
bh_sockaddr->is_ipv4 = false;
|
bh_sockaddr->is_ipv4 = false;
|
||||||
|
@ -91,7 +91,7 @@ bh_sockaddr_to_sockaddr(const bh_sockaddr_t *bh_sockaddr,
|
||||||
struct sockaddr_in *addr = (struct sockaddr_in *)sockaddr;
|
struct sockaddr_in *addr = (struct sockaddr_in *)sockaddr;
|
||||||
addr->sin_port = htons(bh_sockaddr->port);
|
addr->sin_port = htons(bh_sockaddr->port);
|
||||||
addr->sin_family = AF_INET;
|
addr->sin_family = AF_INET;
|
||||||
addr->sin_addr.s_addr = htonl(bh_sockaddr->addr_bufer.ipv4);
|
addr->sin_addr.s_addr = htonl(bh_sockaddr->addr_buffer.ipv4);
|
||||||
*socklen = sizeof(*addr);
|
*socklen = sizeof(*addr);
|
||||||
}
|
}
|
||||||
#ifdef IPPROTO_IPV6
|
#ifdef IPPROTO_IPV6
|
||||||
|
@ -101,10 +101,10 @@ bh_sockaddr_to_sockaddr(const bh_sockaddr_t *bh_sockaddr,
|
||||||
addr->sin6_port = htons(bh_sockaddr->port);
|
addr->sin6_port = htons(bh_sockaddr->port);
|
||||||
addr->sin6_family = AF_INET6;
|
addr->sin6_family = AF_INET6;
|
||||||
|
|
||||||
for (i = 0; i < sizeof(bh_sockaddr->addr_bufer.ipv6)
|
for (i = 0; i < sizeof(bh_sockaddr->addr_buffer.ipv6)
|
||||||
/ sizeof(bh_sockaddr->addr_bufer.ipv6[0]);
|
/ sizeof(bh_sockaddr->addr_buffer.ipv6[0]);
|
||||||
i++) {
|
i++) {
|
||||||
uint16 part_addr = htons(bh_sockaddr->addr_bufer.ipv6[i]);
|
uint16 part_addr = htons(bh_sockaddr->addr_buffer.ipv6[i]);
|
||||||
addr->sin6_addr.s6_addr[i * 2] = 0xff & part_addr;
|
addr->sin6_addr.s6_addr[i * 2] = 0xff & part_addr;
|
||||||
addr->sin6_addr.s6_addr[i * 2 + 1] = (0xff00 & part_addr) >> 8;
|
addr->sin6_addr.s6_addr[i * 2 + 1] = (0xff00 & part_addr) >> 8;
|
||||||
}
|
}
|
||||||
|
@ -799,7 +799,7 @@ os_socket_set_ip_add_membership(bh_socket_t socket,
|
||||||
{
|
{
|
||||||
assert(imr_multiaddr);
|
assert(imr_multiaddr);
|
||||||
if (is_ipv6) {
|
if (is_ipv6) {
|
||||||
#ifdef IPPROTO_IPV6
|
#if defined(IPPROTO_IPV6) && !defined(BH_PLATFORM_COSMOPOLITAN)
|
||||||
struct ipv6_mreq mreq;
|
struct ipv6_mreq mreq;
|
||||||
for (int i = 0; i < 8; i++) {
|
for (int i = 0; i < 8; i++) {
|
||||||
((uint16_t *)mreq.ipv6mr_multiaddr.s6_addr)[i] =
|
((uint16_t *)mreq.ipv6mr_multiaddr.s6_addr)[i] =
|
||||||
|
@ -837,7 +837,7 @@ os_socket_set_ip_drop_membership(bh_socket_t socket,
|
||||||
{
|
{
|
||||||
assert(imr_multiaddr);
|
assert(imr_multiaddr);
|
||||||
if (is_ipv6) {
|
if (is_ipv6) {
|
||||||
#ifdef IPPROTO_IPV6
|
#if defined(IPPROTO_IPV6) && !defined(BH_PLATFORM_COSMOPOLITAN)
|
||||||
struct ipv6_mreq mreq;
|
struct ipv6_mreq mreq;
|
||||||
for (int i = 0; i < 8; i++) {
|
for (int i = 0; i < 8; i++) {
|
||||||
((uint16_t *)mreq.ipv6mr_multiaddr.s6_addr)[i] =
|
((uint16_t *)mreq.ipv6mr_multiaddr.s6_addr)[i] =
|
||||||
|
|
|
@ -39,6 +39,9 @@ os_thread_wrapper(void *arg)
|
||||||
#ifdef OS_ENABLE_HW_BOUND_CHECK
|
#ifdef OS_ENABLE_HW_BOUND_CHECK
|
||||||
if (os_thread_signal_init(handler) != 0)
|
if (os_thread_signal_init(handler) != 0)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
#endif
|
||||||
|
#ifdef OS_ENABLE_WAKEUP_BLOCKING_OP
|
||||||
|
os_end_blocking_op();
|
||||||
#endif
|
#endif
|
||||||
start_func(thread_arg);
|
start_func(thread_arg);
|
||||||
#ifdef OS_ENABLE_HW_BOUND_CHECK
|
#ifdef OS_ENABLE_HW_BOUND_CHECK
|
||||||
|
@ -470,6 +473,14 @@ os_thread_get_stack_boundary()
|
||||||
return addr;
|
return addr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
os_thread_jit_write_protect_np(bool enabled)
|
||||||
|
{
|
||||||
|
#if (defined(__APPLE__) || defined(__MACH__)) && defined(__arm64__)
|
||||||
|
pthread_jit_write_protect_np(enabled);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef OS_ENABLE_HW_BOUND_CHECK
|
#ifdef OS_ENABLE_HW_BOUND_CHECK
|
||||||
|
|
||||||
#define SIG_ALT_STACK_SIZE (32 * 1024)
|
#define SIG_ALT_STACK_SIZE (32 * 1024)
|
||||||
|
@ -564,8 +575,8 @@ mask_signals(int how)
|
||||||
pthread_sigmask(how, &set, NULL);
|
pthread_sigmask(how, &set, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
static os_thread_local_attribute struct sigaction prev_sig_act_SIGSEGV;
|
static struct sigaction prev_sig_act_SIGSEGV;
|
||||||
static os_thread_local_attribute struct sigaction prev_sig_act_SIGBUS;
|
static struct sigaction prev_sig_act_SIGBUS;
|
||||||
|
|
||||||
/* ASAN is not designed to work with custom stack unwind or other low-level \
|
/* ASAN is not designed to work with custom stack unwind or other low-level \
|
||||||
things. > Ignore a function that does some low-level magic. (e.g. walking \
|
things. > Ignore a function that does some low-level magic. (e.g. walking \
|
||||||
|
@ -596,9 +607,12 @@ signal_callback(int sig_num, siginfo_t *sig_info, void *sig_ucontext)
|
||||||
prev_sig_act->sa_sigaction(sig_num, sig_info, sig_ucontext);
|
prev_sig_act->sa_sigaction(sig_num, sig_info, sig_ucontext);
|
||||||
}
|
}
|
||||||
else if (prev_sig_act
|
else if (prev_sig_act
|
||||||
&& ((void *)prev_sig_act->sa_sigaction == SIG_DFL
|
&& prev_sig_act->sa_handler
|
||||||
|| (void *)prev_sig_act->sa_sigaction == SIG_IGN)) {
|
/* Filter out SIG_DFL and SIG_IGN here, they will
|
||||||
sigaction(sig_num, prev_sig_act, NULL);
|
run into the else branch below */
|
||||||
|
&& (void *)prev_sig_act->sa_handler != SIG_DFL
|
||||||
|
&& (void *)prev_sig_act->sa_handler != SIG_IGN) {
|
||||||
|
prev_sig_act->sa_handler(sig_num);
|
||||||
}
|
}
|
||||||
/* Output signal info and then crash if signal is unhandled */
|
/* Output signal info and then crash if signal is unhandled */
|
||||||
else {
|
else {
|
||||||
|
|
43
core/shared/platform/cosmopolitan/platform_init.c
Normal file
43
core/shared/platform/cosmopolitan/platform_init.c
Normal file
|
@ -0,0 +1,43 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2019 Intel Corporation. All rights reserved.
|
||||||
|
* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "platform_api_vmcore.h"
|
||||||
|
|
||||||
|
int
|
||||||
|
bh_platform_init()
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
bh_platform_destroy()
|
||||||
|
{}
|
||||||
|
|
||||||
|
int
|
||||||
|
os_printf(const char *format, ...)
|
||||||
|
{
|
||||||
|
int ret = 0;
|
||||||
|
va_list ap;
|
||||||
|
|
||||||
|
va_start(ap, format);
|
||||||
|
#ifndef BH_VPRINTF
|
||||||
|
ret += vprintf(format, ap);
|
||||||
|
#else
|
||||||
|
ret += BH_VPRINTF(format, ap);
|
||||||
|
#endif
|
||||||
|
va_end(ap);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
os_vprintf(const char *format, va_list ap)
|
||||||
|
{
|
||||||
|
#ifndef BH_VPRINTF
|
||||||
|
return vprintf(format, ap);
|
||||||
|
#else
|
||||||
|
return BH_VPRINTF(format, ap);
|
||||||
|
#endif
|
||||||
|
}
|
122
core/shared/platform/cosmopolitan/platform_internal.h
Normal file
122
core/shared/platform/cosmopolitan/platform_internal.h
Normal file
|
@ -0,0 +1,122 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2019 Intel Corporation. All rights reserved.
|
||||||
|
* Copyright (C) 2023 Dylibso. All rights reserved.
|
||||||
|
* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _PLATFORM_INTERNAL_H
|
||||||
|
#define _PLATFORM_INTERNAL_H
|
||||||
|
|
||||||
|
#include <inttypes.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include <assert.h>
|
||||||
|
#include <time.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <math.h>
|
||||||
|
#include <stdarg.h>
|
||||||
|
#include <ctype.h>
|
||||||
|
#include <pthread.h>
|
||||||
|
#include <signal.h>
|
||||||
|
#include <semaphore.h>
|
||||||
|
#include <limits.h>
|
||||||
|
#include <dirent.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <poll.h>
|
||||||
|
#include <sched.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <netinet/in.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <sys/mman.h>
|
||||||
|
#include <sys/time.h>
|
||||||
|
#include <sys/uio.h>
|
||||||
|
#include <sys/ioctl.h>
|
||||||
|
#include <sys/socket.h>
|
||||||
|
#include <sys/resource.h>
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef BH_PLATFORM_COSMOPOLITAN
|
||||||
|
#define BH_PLATFORM_COSMOPOLITAN
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Stack size of applet threads's native part. */
|
||||||
|
#define BH_APPLET_PRESERVED_STACK_SIZE (32 * 1024)
|
||||||
|
|
||||||
|
/* Default thread priority */
|
||||||
|
#define BH_THREAD_DEFAULT_PRIORITY 0
|
||||||
|
|
||||||
|
typedef pthread_t korp_tid;
|
||||||
|
typedef pthread_mutex_t korp_mutex;
|
||||||
|
typedef pthread_cond_t korp_cond;
|
||||||
|
typedef pthread_t korp_thread;
|
||||||
|
typedef sem_t korp_sem;
|
||||||
|
|
||||||
|
#define OS_THREAD_MUTEX_INITIALIZER PTHREAD_MUTEX_INITIALIZER
|
||||||
|
|
||||||
|
#define os_thread_local_attribute __thread
|
||||||
|
|
||||||
|
#define bh_socket_t int
|
||||||
|
|
||||||
|
#if WASM_DISABLE_WRITE_GS_BASE == 0
|
||||||
|
#if defined(BUILD_TARGET_X86_64) || defined(BUILD_TARGET_AMD_64)
|
||||||
|
#define os_writegsbase(base_addr) \
|
||||||
|
do { \
|
||||||
|
uint64 __gs_value = (uint64)(uintptr_t)base_addr; \
|
||||||
|
asm volatile("wrgsbase %0" ::"r"(__gs_value) : "memory"); \
|
||||||
|
} while (0)
|
||||||
|
#if 0
|
||||||
|
/* _writegsbase_u64 also works, but need to add -mfsgsbase flag for gcc */
|
||||||
|
#include <immintrin.h>
|
||||||
|
#define os_writegsbase(base_addr) \
|
||||||
|
_writegsbase_u64(((uint64)(uintptr_t)base_addr))
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if WASM_DISABLE_HW_BOUND_CHECK == 0
|
||||||
|
#if defined(BUILD_TARGET_X86_64) || defined(BUILD_TARGET_AMD_64) \
|
||||||
|
|| defined(BUILD_TARGET_AARCH64) || defined(BUILD_TARGET_RISCV64_LP64D) \
|
||||||
|
|| defined(BUILD_TARGET_RISCV64_LP64)
|
||||||
|
|
||||||
|
#include <setjmp.h>
|
||||||
|
|
||||||
|
#define OS_ENABLE_HW_BOUND_CHECK
|
||||||
|
|
||||||
|
typedef jmp_buf korp_jmpbuf;
|
||||||
|
|
||||||
|
#define os_setjmp setjmp
|
||||||
|
#define os_longjmp longjmp
|
||||||
|
#define os_alloca alloca
|
||||||
|
|
||||||
|
#define os_getpagesize getpagesize
|
||||||
|
|
||||||
|
typedef void (*os_signal_handler)(void *sig_addr);
|
||||||
|
|
||||||
|
int
|
||||||
|
os_thread_signal_init(os_signal_handler handler);
|
||||||
|
|
||||||
|
void
|
||||||
|
os_thread_signal_destroy();
|
||||||
|
|
||||||
|
bool
|
||||||
|
os_thread_signal_inited();
|
||||||
|
|
||||||
|
void
|
||||||
|
os_signal_unmask();
|
||||||
|
|
||||||
|
void
|
||||||
|
os_sigreturn();
|
||||||
|
#endif /* end of BUILD_TARGET_X86_64/AMD_64/AARCH64/RISCV64 */
|
||||||
|
#endif /* end of WASM_DISABLE_HW_BOUND_CHECK */
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* end of _PLATFORM_INTERNAL_H */
|
19
core/shared/platform/cosmopolitan/shared_platform.cmake
Normal file
19
core/shared/platform/cosmopolitan/shared_platform.cmake
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
# Copyright (C) 2019 Intel Corporation. All rights reserved.
|
||||||
|
# Copyright (C) 2023 Dylibso. All rights reserved.
|
||||||
|
# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
||||||
|
|
||||||
|
set (PLATFORM_SHARED_DIR ${CMAKE_CURRENT_LIST_DIR})
|
||||||
|
|
||||||
|
add_definitions(-DBH_PLATFORM_COSMOPOLITAN)
|
||||||
|
|
||||||
|
include_directories(${PLATFORM_SHARED_DIR})
|
||||||
|
include_directories(${PLATFORM_SHARED_DIR}/../include)
|
||||||
|
|
||||||
|
include (${CMAKE_CURRENT_LIST_DIR}/../common/posix/platform_api_posix.cmake)
|
||||||
|
|
||||||
|
file (GLOB_RECURSE source_all ${PLATFORM_SHARED_DIR}/*.c)
|
||||||
|
|
||||||
|
set (PLATFORM_SHARED_SOURCE ${source_all} ${PLATFORM_COMMON_POSIX_SOURCE})
|
||||||
|
|
||||||
|
file (GLOB header ${PLATFORM_SHARED_DIR}/../include/*.h)
|
||||||
|
LIST (APPEND RUNTIME_LIB_HEADER_LIST ${header})
|
|
@ -103,6 +103,12 @@ os_sigreturn();
|
||||||
#endif /* end of BUILD_TARGET_X86_64/AMD_64/AARCH64/RISCV64 */
|
#endif /* end of BUILD_TARGET_X86_64/AMD_64/AARCH64/RISCV64 */
|
||||||
#endif /* end of WASM_DISABLE_HW_BOUND_CHECK */
|
#endif /* end of WASM_DISABLE_HW_BOUND_CHECK */
|
||||||
|
|
||||||
|
#if WASM_DISABLE_WAKEUP_BLOCKING_OP == 0
|
||||||
|
#define OS_ENABLE_WAKEUP_BLOCKING_OP
|
||||||
|
#endif
|
||||||
|
void
|
||||||
|
os_set_signal_number_for_blocking_op(int signo);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -100,6 +100,10 @@ void
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
os_icache_flush(void *start, size_t len)
|
||||||
|
{}
|
||||||
|
|
||||||
#if (WASM_MEM_DUAL_BUS_MIRROR != 0)
|
#if (WASM_MEM_DUAL_BUS_MIRROR != 0)
|
||||||
void *
|
void *
|
||||||
os_get_dbus_mirror(void *ibus)
|
os_get_dbus_mirror(void *ibus)
|
||||||
|
|
|
@ -53,6 +53,10 @@ os_thread_get_stack_boundary(void)
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
os_thread_jit_write_protect_np(bool enabled)
|
||||||
|
{}
|
||||||
|
|
||||||
int
|
int
|
||||||
os_usleep(uint32 usec)
|
os_usleep(uint32 usec)
|
||||||
{
|
{
|
||||||
|
|
|
@ -30,7 +30,7 @@ sockaddr_to_bh_sockaddr(const struct sockaddr *sockaddr, socklen_t socklen,
|
||||||
assert(socklen >= sizeof(struct sockaddr_in));
|
assert(socklen >= sizeof(struct sockaddr_in));
|
||||||
|
|
||||||
bh_sockaddr->port = ntohs(addr->sin_port);
|
bh_sockaddr->port = ntohs(addr->sin_port);
|
||||||
bh_sockaddr->addr_bufer.ipv4 = ntohl(addr->sin_addr.s_addr);
|
bh_sockaddr->addr_buffer.ipv4 = ntohl(addr->sin_addr.s_addr);
|
||||||
bh_sockaddr->is_ipv4 = true;
|
bh_sockaddr->is_ipv4 = true;
|
||||||
return BHT_OK;
|
return BHT_OK;
|
||||||
}
|
}
|
||||||
|
|
|
@ -102,6 +102,12 @@ os_sigreturn();
|
||||||
#endif /* end of BUILD_TARGET_X86_64/AMD_64/AARCH64/RISCV64 */
|
#endif /* end of BUILD_TARGET_X86_64/AMD_64/AARCH64/RISCV64 */
|
||||||
#endif /* end of WASM_DISABLE_HW_BOUND_CHECK */
|
#endif /* end of WASM_DISABLE_HW_BOUND_CHECK */
|
||||||
|
|
||||||
|
#if WASM_DISABLE_WAKEUP_BLOCKING_OP == 0
|
||||||
|
#define OS_ENABLE_WAKEUP_BLOCKING_OP
|
||||||
|
#endif
|
||||||
|
void
|
||||||
|
os_set_signal_number_for_blocking_op(int signo);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -373,6 +373,34 @@ os_sem_getvalue(korp_sem *sem, int *sval);
|
||||||
int
|
int
|
||||||
os_sem_unlink(const char *name);
|
os_sem_unlink(const char *name);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initialize process-global state for os_wakeup_blocking_op.
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
os_blocking_op_init();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Start accepting os_wakeup_blocking_op requests for the calling thread.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
os_begin_blocking_op();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Stop accepting os_wakeup_blocking_op requests for the calling thread.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
os_end_blocking_op();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Wake up the specified thread.
|
||||||
|
*
|
||||||
|
* For example, on posix-like platforms, this can be implemented by
|
||||||
|
* sending a signal (w/o SA_RESTART) which interrupts a blocking
|
||||||
|
* system call.
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
os_wakeup_blocking_op(korp_tid tid);
|
||||||
|
|
||||||
/****************************************************
|
/****************************************************
|
||||||
* Section 2 *
|
* Section 2 *
|
||||||
* Socket support *
|
* Socket support *
|
||||||
|
@ -392,7 +420,7 @@ typedef union {
|
||||||
} bh_ip_addr_buffer_t;
|
} bh_ip_addr_buffer_t;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
bh_ip_addr_buffer_t addr_bufer;
|
bh_ip_addr_buffer_t addr_buffer;
|
||||||
uint16 port;
|
uint16 port;
|
||||||
bool is_ipv4;
|
bool is_ipv4;
|
||||||
} bh_sockaddr_t;
|
} bh_sockaddr_t;
|
||||||
|
|
|
@ -81,6 +81,13 @@ os_self_thread(void);
|
||||||
uint8 *
|
uint8 *
|
||||||
os_thread_get_stack_boundary(void);
|
os_thread_get_stack_boundary(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set whether the MAP_JIT region write protection is enabled for this thread.
|
||||||
|
* Pass true to make the region executable, false to make it writable.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
os_thread_jit_write_protect_np(bool enabled);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
************** mutext APIs ***********
|
************** mutext APIs ***********
|
||||||
* vmcore: Not required until pthread is supported by runtime
|
* vmcore: Not required until pthread is supported by runtime
|
||||||
|
@ -143,6 +150,12 @@ os_get_dbus_mirror(void *ibus);
|
||||||
void
|
void
|
||||||
os_dcache_flush(void);
|
os_dcache_flush(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Flush instruction cache.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
os_icache_flush(void *start, size_t len);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -195,3 +195,7 @@ os_mprotect(void *addr, size_t size, int prot)
|
||||||
void
|
void
|
||||||
os_dcache_flush(void)
|
os_dcache_flush(void)
|
||||||
{}
|
{}
|
||||||
|
|
||||||
|
void
|
||||||
|
os_icache_flush(void *start, size_t len)
|
||||||
|
{}
|
|
@ -261,7 +261,7 @@ sockaddr_to_bh_sockaddr(const struct sockaddr *sockaddr, socklen_t socklen,
|
||||||
assert(socklen >= sizeof(struct sockaddr_in));
|
assert(socklen >= sizeof(struct sockaddr_in));
|
||||||
|
|
||||||
bh_sockaddr->port = ntohs(addr->sin_port);
|
bh_sockaddr->port = ntohs(addr->sin_port);
|
||||||
bh_sockaddr->addr_bufer.ipv4 = ntohl(addr->sin_addr.s_addr);
|
bh_sockaddr->addr_buffer.ipv4 = ntohl(addr->sin_addr.s_addr);
|
||||||
bh_sockaddr->is_ipv4 = true;
|
bh_sockaddr->is_ipv4 = true;
|
||||||
return BHT_OK;
|
return BHT_OK;
|
||||||
}
|
}
|
||||||
|
@ -279,7 +279,7 @@ bh_sockaddr_to_sockaddr(const bh_sockaddr_t *bh_sockaddr,
|
||||||
struct sockaddr_in *addr = (struct sockaddr_in *)sockaddr;
|
struct sockaddr_in *addr = (struct sockaddr_in *)sockaddr;
|
||||||
addr->sin_port = htons(bh_sockaddr->port);
|
addr->sin_port = htons(bh_sockaddr->port);
|
||||||
addr->sin_family = AF_INET;
|
addr->sin_family = AF_INET;
|
||||||
addr->sin_addr.s_addr = htonl(bh_sockaddr->addr_bufer.ipv4);
|
addr->sin_addr.s_addr = htonl(bh_sockaddr->addr_buffer.ipv4);
|
||||||
*socklen = sizeof(*addr);
|
*socklen = sizeof(*addr);
|
||||||
return BHT_OK;
|
return BHT_OK;
|
||||||
}
|
}
|
||||||
|
|
|
@ -211,6 +211,10 @@ os_thread_get_stack_boundary()
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
os_thread_jit_write_protect_np(bool enabled)
|
||||||
|
{}
|
||||||
|
|
||||||
int
|
int
|
||||||
os_rwlock_init(korp_rwlock *lock)
|
os_rwlock_init(korp_rwlock *lock)
|
||||||
{
|
{
|
||||||
|
|
|
@ -116,6 +116,12 @@ os_sigreturn();
|
||||||
#endif /* end of BUILD_TARGET_X86_64/AMD_64/AARCH64/RISCV64 */
|
#endif /* end of BUILD_TARGET_X86_64/AMD_64/AARCH64/RISCV64 */
|
||||||
#endif /* end of WASM_DISABLE_HW_BOUND_CHECK */
|
#endif /* end of WASM_DISABLE_HW_BOUND_CHECK */
|
||||||
|
|
||||||
|
#if WASM_DISABLE_WAKEUP_BLOCKING_OP == 0
|
||||||
|
#define OS_ENABLE_WAKEUP_BLOCKING_OP
|
||||||
|
#endif
|
||||||
|
void
|
||||||
|
os_set_signal_number_for_blocking_op(int signo);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -144,6 +144,10 @@ os_dcache_flush()
|
||||||
bus_sync();
|
bus_sync();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
os_icache_flush(void *start, size_t len)
|
||||||
|
{}
|
||||||
|
|
||||||
#if (WASM_MEM_DUAL_BUS_MIRROR != 0)
|
#if (WASM_MEM_DUAL_BUS_MIRROR != 0)
|
||||||
void *
|
void *
|
||||||
os_get_dbus_mirror(void *ibus)
|
os_get_dbus_mirror(void *ibus)
|
||||||
|
|
|
@ -124,6 +124,12 @@ utimensat(int fd, const char *path, const struct timespec ts[2], int flag);
|
||||||
DIR *
|
DIR *
|
||||||
fdopendir(int fd);
|
fdopendir(int fd);
|
||||||
|
|
||||||
|
#if WASM_DISABLE_WAKEUP_BLOCKING_OP == 0
|
||||||
|
#define OS_ENABLE_WAKEUP_BLOCKING_OP
|
||||||
|
#endif
|
||||||
|
void
|
||||||
|
os_set_signal_number_for_blocking_op(int signo);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -79,3 +79,7 @@ os_dcache_flush(void)
|
||||||
irq_unlock(key);
|
irq_unlock(key);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
os_icache_flush(void *start, size_t len)
|
||||||
|
{}
|
|
@ -430,3 +430,7 @@ os_thread_get_stack_boundary()
|
||||||
return NULL;
|
return NULL;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
os_thread_jit_write_protect_np(bool enabled)
|
||||||
|
{}
|
|
@ -140,6 +140,10 @@ os_thread_get_stack_boundary(void)
|
||||||
return tid->stack_addr;
|
return tid->stack_addr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
os_thread_jit_write_protect_np(bool enabled)
|
||||||
|
{}
|
||||||
|
|
||||||
int
|
int
|
||||||
os_mutex_init(korp_mutex *mutex)
|
os_mutex_init(korp_mutex *mutex)
|
||||||
{
|
{
|
||||||
|
@ -207,3 +211,7 @@ os_mprotect(void *addr, size_t size, int prot)
|
||||||
void
|
void
|
||||||
os_dcache_flush(void)
|
os_dcache_flush(void)
|
||||||
{}
|
{}
|
||||||
|
|
||||||
|
void
|
||||||
|
os_icache_flush(void *start, size_t len)
|
||||||
|
{}
|
|
@ -73,3 +73,7 @@ os_getpagesize()
|
||||||
void
|
void
|
||||||
os_dcache_flush(void)
|
os_dcache_flush(void)
|
||||||
{}
|
{}
|
||||||
|
|
||||||
|
void
|
||||||
|
os_icache_flush(void *start, size_t len)
|
||||||
|
{}
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user