Explorar el Código

Merge branch main into dev/exce_handling

Wenyong Huang hace 2 años
padre
commit
d70d0633d2
Se han modificado 36 ficheros con 448 adiciones y 291 borrados
  1. 1 1
      .github/workflows/build_docker_images.yml
  2. 2 2
      .github/workflows/build_iwasm_release.yml
  3. 5 5
      .github/workflows/build_llvm_libraries.yml
  4. 2 2
      .github/workflows/build_wamr_lldb.yml
  5. 1 1
      .github/workflows/build_wamr_sdk.yml
  6. 1 1
      .github/workflows/build_wamr_vscode_ext.yml
  7. 2 2
      .github/workflows/build_wamrc.yml
  8. 1 1
      .github/workflows/coding_guidelines.yml
  9. 12 12
      .github/workflows/compilation_on_android_ubuntu.yml
  10. 6 6
      .github/workflows/compilation_on_macos.yml
  11. 3 3
      .github/workflows/compilation_on_nuttx.yml
  12. 5 5
      .github/workflows/compilation_on_sgx.yml
  13. 2 2
      .github/workflows/compilation_on_windows.yml
  14. 1 1
      .github/workflows/create_tag.yml
  15. 1 1
      .github/workflows/hadolint_dockerfiles.yml
  16. 10 10
      .github/workflows/nightly_run.yml
  17. 1 1
      .github/workflows/release_process.yml
  18. 1 1
      .github/workflows/reuse_latest_release_binaries.yml
  19. 4 4
      .github/workflows/spec_test_on_nuttx.yml
  20. 76 0
      RELEASE_NOTES.md
  21. 14 8
      core/iwasm/common/wasm_c_api.c
  22. 16 5
      core/iwasm/compilation/aot_compiler.c
  23. 0 6
      core/iwasm/compilation/aot_llvm.c
  24. 1 1
      core/iwasm/compilation/aot_llvm_extra2.cpp
  25. 1 1
      core/iwasm/compilation/aot_llvm_extra2.h
  26. 9 4
      core/iwasm/fast-jit/jit_frontend.c
  27. 44 27
      core/iwasm/interpreter/wasm_interp_classic.c
  28. 119 87
      core/iwasm/interpreter/wasm_loader.c
  29. 83 75
      core/iwasm/interpreter/wasm_mini_loader.c
  30. 1 1
      core/iwasm/interpreter/wasm_runtime.c
  31. 1 0
      core/shared/platform/common/posix/posix_memmap.c
  32. 4 0
      core/shared/platform/common/posix/posix_thread.c
  33. 1 1
      core/version.h
  34. 1 1
      tests/wamr-test-suites/test_wamr.sh
  35. 12 11
      wamr-compiler/CMakeLists.txt
  36. 4 2
      wamr-compiler/main.c

+ 1 - 1
.github/workflows/build_docker_images.yml

@@ -21,7 +21,7 @@ jobs:
 
 
     steps:
     steps:
       - name: Checkout repository
       - name: Checkout repository
-        uses: actions/checkout@v3
+        uses: actions/checkout@v4
 
 
       - name: Build and save Docker image(wasm-debug-server:${{ inputs.ver_num }}) to tar file
       - name: Build and save Docker image(wasm-debug-server:${{ inputs.ver_num }}) to tar file
         run: |
         run: |

+ 2 - 2
.github/workflows/build_iwasm_release.yml

@@ -35,11 +35,11 @@ jobs:
   build:
   build:
     runs-on: ${{ inputs.runner }}
     runs-on: ${{ inputs.runner }}
     steps:
     steps:
-      - uses: actions/checkout@v3
+      - uses: actions/checkout@v4
 
 
       - name: get cached LLVM libraries
       - name: get cached LLVM libraries
         id: retrieve_llvm_libs
         id: retrieve_llvm_libs
-        uses: actions/cache@v3
+        uses: actions/cache@v4
         with:
         with:
           path: |
           path: |
             ./core/deps/llvm/build/bin
             ./core/deps/llvm/build/bin

+ 5 - 5
.github/workflows/build_llvm_libraries.yml

@@ -31,7 +31,7 @@ jobs:
 
 
     steps:
     steps:
       - name: checkout
       - name: checkout
-        uses: actions/checkout@v3
+        uses: actions/checkout@v4
 
 
       - name: install dependencies
       - name: install dependencies
         run: /usr/bin/env python3 -m pip install -r requirements.txt
         run: /usr/bin/env python3 -m pip install -r requirements.txt
@@ -52,7 +52,7 @@ jobs:
 
 
       - name: Cache LLVM libraries
       - name: Cache LLVM libraries
         id: retrieve_llvm_libs
         id: retrieve_llvm_libs
-        uses: actions/cache@v3
+        uses: actions/cache@v4
         with:
         with:
           path: |
           path: |
             ./core/deps/llvm/build/bin
             ./core/deps/llvm/build/bin
@@ -62,7 +62,7 @@ jobs:
             ./core/deps/llvm/build/share
             ./core/deps/llvm/build/share
           key: ${{ steps.create_lib_cache_key.outputs.key}}
           key: ${{ steps.create_lib_cache_key.outputs.key}}
 
 
-      - uses: actions/cache@v3
+      - uses: actions/cache@v4
         with:
         with:
           path: ~/.ccache
           path: ~/.ccache
           key: 0-ccache-${{ inputs.os }}-${{ steps.get_last_commit.outputs.last_commit }}
           key: 0-ccache-${{ inputs.os }}-${{ steps.get_last_commit.outputs.last_commit }}
@@ -70,7 +70,7 @@ jobs:
             0-ccache-${{ inputs.os }}
             0-ccache-${{ inputs.os }}
         if: steps.retrieve_llvm_libs.outputs.cache-hit != 'true' && inputs.os == 'ubuntu-20.04'
         if: steps.retrieve_llvm_libs.outputs.cache-hit != 'true' && inputs.os == 'ubuntu-20.04'
 
 
-      - uses: actions/cache@v3
+      - uses: actions/cache@v4
         with:
         with:
           path: ~/.cache/ccache
           path: ~/.cache/ccache
           key: 0-ccache-${{ inputs.os }}-${{ steps.get_last_commit.outputs.last_commit }}
           key: 0-ccache-${{ inputs.os }}-${{ steps.get_last_commit.outputs.last_commit }}
@@ -82,7 +82,7 @@ jobs:
       - run: sudo apt install -y ccache ninja-build
       - run: sudo apt install -y ccache ninja-build
         if: steps.retrieve_llvm_libs.outputs.cache-hit != 'true' && startsWith(inputs.os, 'ubuntu') && inputs.container_image == ''
         if: steps.retrieve_llvm_libs.outputs.cache-hit != 'true' && startsWith(inputs.os, 'ubuntu') && inputs.container_image == ''
 
 
-      - uses: actions/cache@v3
+      - uses: actions/cache@v4
         with:
         with:
           path: ~/Library/Caches/ccache
           path: ~/Library/Caches/ccache
           key: 0-ccache-${{ inputs.os }}-${{ steps.get_last_commit.outputs.last_commit }}
           key: 0-ccache-${{ inputs.os }}-${{ steps.get_last_commit.outputs.last_commit }}

+ 2 - 2
.github/workflows/build_wamr_lldb.yml

@@ -47,7 +47,7 @@ jobs:
       PYTHON_UBUNTU_STANDALONE_BUILD: https://github.com/indygreg/python-build-standalone/releases/download/20230507/cpython-3.10.11+20230507-x86_64-unknown-linux-gnu-install_only.tar.gz
       PYTHON_UBUNTU_STANDALONE_BUILD: https://github.com/indygreg/python-build-standalone/releases/download/20230507/cpython-3.10.11+20230507-x86_64-unknown-linux-gnu-install_only.tar.gz
       PYTHON_MACOS_STANDALONE_BUILD: https://github.com/indygreg/python-build-standalone/releases/download/20230507/cpython-3.10.11+20230507-x86_64-apple-darwin-install_only.tar.gz
       PYTHON_MACOS_STANDALONE_BUILD: https://github.com/indygreg/python-build-standalone/releases/download/20230507/cpython-3.10.11+20230507-x86_64-apple-darwin-install_only.tar.gz
     steps:
     steps:
-      - uses: actions/checkout@v3
+      - uses: actions/checkout@v4
 
 
       - name: download and install wasi-sdk
       - name: download and install wasi-sdk
         run: |
         run: |
@@ -60,7 +60,7 @@ jobs:
 
 
       - name: Cache build
       - name: Cache build
         id: lldb_build_cache
         id: lldb_build_cache
-        uses: actions/cache@v3
+        uses: actions/cache@v4
         with:
         with:
           path: |
           path: |
             ./core/deps/llvm-project/build/bin
             ./core/deps/llvm-project/build/bin

+ 1 - 1
.github/workflows/build_wamr_sdk.yml

@@ -35,7 +35,7 @@ jobs:
   build:
   build:
     runs-on: ${{ inputs.runner }}
     runs-on: ${{ inputs.runner }}
     steps:
     steps:
-      - uses: actions/checkout@v3
+      - uses: actions/checkout@v4
 
 
       - name: download and install wasi-sdk
       - name: download and install wasi-sdk
         run: |
         run: |

+ 1 - 1
.github/workflows/build_wamr_vscode_ext.yml

@@ -18,7 +18,7 @@ jobs:
   build:
   build:
     runs-on: ubuntu-22.04
     runs-on: ubuntu-22.04
     steps:
     steps:
-      - uses: actions/checkout@v3
+      - uses: actions/checkout@v4
 
 
       - name: Use Node.js 16.x
       - name: Use Node.js 16.x
         uses: actions/setup-node@v3
         uses: actions/setup-node@v3

+ 2 - 2
.github/workflows/build_wamrc.yml

@@ -35,11 +35,11 @@ jobs:
   build:
   build:
     runs-on: ${{ inputs.runner }}
     runs-on: ${{ inputs.runner }}
     steps:
     steps:
-      - uses: actions/checkout@v3
+      - uses: actions/checkout@v4
 
 
       - name: get cached LLVM libraries
       - name: get cached LLVM libraries
         id: retrieve_llvm_libs
         id: retrieve_llvm_libs
-        uses: actions/cache@v3
+        uses: actions/cache@v4
         with:
         with:
           path: |
           path: |
             ./core/deps/llvm/build/bin
             ./core/deps/llvm/build/bin

+ 1 - 1
.github/workflows/coding_guidelines.yml

@@ -19,7 +19,7 @@ jobs:
     runs-on: ubuntu-20.04
     runs-on: ubuntu-20.04
     steps:
     steps:
       - name: checkout
       - name: checkout
-        uses: actions/checkout@v3
+        uses: actions/checkout@v4
         with:
         with:
           fetch-depth: 0
           fetch-depth: 0
 
 

+ 12 - 12
.github/workflows/compilation_on_android_ubuntu.yml

@@ -85,13 +85,13 @@ jobs:
             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 }}
     steps:
     steps:
       - name: checkout
       - name: checkout
-        uses: actions/checkout@v3
+        uses: actions/checkout@v4
 
 
       # since jobs.id can't contain the dot character
       # since jobs.id can't contain the dot character
       # it is hard to use `format` to assemble the cache key
       # it is hard to use `format` to assemble the cache key
       - name: Get LLVM libraries
       - name: Get LLVM libraries
         id: retrieve_llvm_libs
         id: retrieve_llvm_libs
-        uses: actions/cache@v3
+        uses: actions/cache@v4
         with:
         with:
           path: |
           path: |
             ./core/deps/llvm/build/bin
             ./core/deps/llvm/build/bin
@@ -214,13 +214,13 @@ jobs:
             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 }}
     steps:
     steps:
       - name: checkout
       - name: checkout
-        uses: actions/checkout@v3
+        uses: actions/checkout@v4
 
 
       # only download llvm cache when needed
       # only download llvm cache when needed
       - name: Get LLVM libraries
       - name: Get LLVM libraries
         id: retrieve_llvm_libs
         id: retrieve_llvm_libs
         if: endsWith(matrix.make_options_run_mode, '_JIT_BUILD_OPTIONS')
         if: endsWith(matrix.make_options_run_mode, '_JIT_BUILD_OPTIONS')
-        uses: actions/cache@v3
+        uses: actions/cache@v4
         with:
         with:
           path: |
           path: |
             ./core/deps/llvm/build/bin
             ./core/deps/llvm/build/bin
@@ -285,12 +285,12 @@ jobs:
 
 
     steps:
     steps:
       - name: checkout
       - name: checkout
-        uses: actions/checkout@v3
+        uses: actions/checkout@v4
 
 
       - name: Get LLVM libraries
       - name: Get LLVM libraries
         id: retrieve_llvm_libs
         id: retrieve_llvm_libs
         if: (!endsWith(matrix.make_options, '_INTERP_BUILD_OPTIONS'))
         if: (!endsWith(matrix.make_options, '_INTERP_BUILD_OPTIONS'))
-        uses: actions/cache@v3
+        uses: actions/cache@v4
         with:
         with:
           path: |
           path: |
             ./core/deps/llvm/build/bin
             ./core/deps/llvm/build/bin
@@ -351,7 +351,7 @@ jobs:
             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 }}
     steps:
     steps:
       - name: checkout
       - name: checkout
-        uses: actions/checkout@v3
+        uses: actions/checkout@v4
 
 
       - name: download and install wasi-sdk
       - name: download and install wasi-sdk
         run: |
         run: |
@@ -368,7 +368,7 @@ jobs:
           sudo mv wabt-1.0.31 wabt
           sudo mv wabt-1.0.31 wabt
       - name: Get LLVM libraries
       - name: Get LLVM libraries
         id: retrieve_llvm_libs
         id: retrieve_llvm_libs
-        uses: actions/cache@v3
+        uses: actions/cache@v4
         with:
         with:
           path: |
           path: |
             ./core/deps/llvm/build/bin
             ./core/deps/llvm/build/bin
@@ -520,7 +520,7 @@ jobs:
             test_option: $SIMD_TEST_OPTIONS
             test_option: $SIMD_TEST_OPTIONS
     steps:
     steps:
       - name: checkout
       - name: checkout
-        uses: actions/checkout@v3
+        uses: actions/checkout@v4
 
 
       - name: download and install wasi-sdk
       - name: download and install wasi-sdk
         if: matrix.test_option == '$WASI_TEST_OPTIONS'
         if: matrix.test_option == '$WASI_TEST_OPTIONS'
@@ -555,7 +555,7 @@ jobs:
       - name: Get LLVM libraries
       - name: Get LLVM libraries
         if: env.USE_LLVM == 'true'
         if: env.USE_LLVM == 'true'
         id: retrieve_llvm_libs
         id: retrieve_llvm_libs
-        uses: actions/cache@v3
+        uses: actions/cache@v4
         with:
         with:
           path: |
           path: |
             ./core/deps/llvm/build/bin
             ./core/deps/llvm/build/bin
@@ -617,7 +617,7 @@ jobs:
 
 
     steps:
     steps:
       - name: checkout
       - name: checkout
-        uses: actions/checkout@v3
+        uses: actions/checkout@v4
 
 
       - name: install dependencies
       - name: install dependencies
         run: |
         run: |
@@ -636,7 +636,7 @@ jobs:
 
 
       - name: Cache LLDB
       - name: Cache LLDB
         id: cache-lldb
         id: cache-lldb
-        uses: actions/cache@v3
+        uses: actions/cache@v4
         env:
         env:
           cache-name: cache-lldb-vscode
           cache-name: cache-lldb-vscode
         with:
         with:

+ 6 - 6
.github/workflows/compilation_on_macos.yml

@@ -71,11 +71,11 @@ jobs:
             llvm_cache_key: ${{ needs.build_llvm_libraries.outputs.cache_key }}
             llvm_cache_key: ${{ needs.build_llvm_libraries.outputs.cache_key }}
     steps:
     steps:
       - name: checkout
       - name: checkout
-        uses: actions/checkout@v3
+        uses: actions/checkout@v4
 
 
       - name: Get LLVM libraries
       - name: Get LLVM libraries
         id: retrieve_llvm_libs
         id: retrieve_llvm_libs
-        uses: actions/cache@v3
+        uses: actions/cache@v4
         with:
         with:
           path: |
           path: |
             ./core/deps/llvm/build/bin
             ./core/deps/llvm/build/bin
@@ -174,13 +174,13 @@ jobs:
             llvm_cache_key: ${{ needs.build_llvm_libraries.outputs.cache_key }}
             llvm_cache_key: ${{ needs.build_llvm_libraries.outputs.cache_key }}
     steps:
     steps:
       - name: checkout
       - name: checkout
-        uses: actions/checkout@v3
+        uses: actions/checkout@v4
 
 
       # only download llvm cache when needed
       # only download llvm cache when needed
       - name: Get LLVM libraries
       - name: Get LLVM libraries
         id: retrieve_llvm_libs
         id: retrieve_llvm_libs
         if: endsWith(matrix.make_options_run_mode, '_JIT_BUILD_OPTIONS')
         if: endsWith(matrix.make_options_run_mode, '_JIT_BUILD_OPTIONS')
-        uses: actions/cache@v3
+        uses: actions/cache@v4
         with:
         with:
           path: |
           path: |
             ./core/deps/llvm/build/bin
             ./core/deps/llvm/build/bin
@@ -226,7 +226,7 @@ jobs:
           ]
           ]
     steps:
     steps:
       - name: checkout
       - name: checkout
-        uses: actions/checkout@v3
+        uses: actions/checkout@v4
 
 
       - name: download and install wabt
       - name: download and install wabt
         run: |
         run: |
@@ -258,7 +258,7 @@ jobs:
           ]
           ]
     steps:
     steps:
       - name: checkout
       - name: checkout
-        uses: actions/checkout@v3
+        uses: actions/checkout@v4
 
 
       - name: download and install wasi-sdk
       - name: download and install wasi-sdk
         run: |
         run: |

+ 3 - 3
.github/workflows/compilation_on_nuttx.yml

@@ -87,21 +87,21 @@ jobs:
 
 
     steps:
     steps:
       - name: Checkout NuttX
       - name: Checkout NuttX
-        uses: actions/checkout@v3
+        uses: actions/checkout@v4
         with:
         with:
           repository: apache/incubator-nuttx
           repository: apache/incubator-nuttx
           ref: releases/12.4
           ref: releases/12.4
           path: nuttx
           path: nuttx
 
 
       - name: Checkout NuttX Apps
       - name: Checkout NuttX Apps
-        uses: actions/checkout@v3
+        uses: actions/checkout@v4
         with:
         with:
           repository: apache/incubator-nuttx-apps
           repository: apache/incubator-nuttx-apps
           ref: releases/12.4
           ref: releases/12.4
           path: apps
           path: apps
 
 
       - name: Checkout WAMR
       - name: Checkout WAMR
-        uses: actions/checkout@v3
+        uses: actions/checkout@v4
         with:
         with:
           repository: ${{ github.repository }}
           repository: ${{ github.repository }}
           path: apps/interpreters/wamr/wamr
           path: apps/interpreters/wamr/wamr

+ 5 - 5
.github/workflows/compilation_on_sgx.yml

@@ -119,7 +119,7 @@ jobs:
           source /opt/intel/sgxsdk/environment
           source /opt/intel/sgxsdk/environment
 
 
       - name: checkout
       - name: checkout
-        uses: actions/checkout@v3
+        uses: actions/checkout@v4
 
 
       - name: Build iwasm
       - name: Build iwasm
         run: |
         run: |
@@ -165,7 +165,7 @@ jobs:
 
 
     steps:
     steps:
       - name: checkout
       - name: checkout
-        uses: actions/checkout@v3
+        uses: actions/checkout@v4
 
 
       - name: download and install wasi-sdk
       - name: download and install wasi-sdk
         run: |
         run: |
@@ -221,7 +221,7 @@ jobs:
       - name: Get LLVM libraries
       - name: Get LLVM libraries
         if: matrix.iwasm_make_options_run_mode == '$AOT_BUILD_OPTIONS'
         if: matrix.iwasm_make_options_run_mode == '$AOT_BUILD_OPTIONS'
         id: retrieve_llvm_libs
         id: retrieve_llvm_libs
-        uses: actions/cache@v3
+        uses: actions/cache@v4
         with:
         with:
           path: |
           path: |
             ./core/deps/llvm/build/bin
             ./core/deps/llvm/build/bin
@@ -290,12 +290,12 @@ jobs:
 
 
     steps:
     steps:
       - name: checkout
       - name: checkout
-        uses: actions/checkout@v3
+        uses: actions/checkout@v4
 
 
       - name: Get LLVM libraries
       - name: Get LLVM libraries
         if: matrix.running_mode == 'aot'
         if: matrix.running_mode == 'aot'
         id: retrieve_llvm_libs
         id: retrieve_llvm_libs
-        uses: actions/cache@v3
+        uses: actions/cache@v4
         with:
         with:
           path: |
           path: |
             ./core/deps/llvm/build/bin
             ./core/deps/llvm/build/bin

+ 2 - 2
.github/workflows/compilation_on_windows.yml

@@ -74,7 +74,7 @@ jobs:
           "-DWAMR_BUILD_LIBC_UVWASI=0 -DWAMR_BUILD_LIBC_WASI=1"
           "-DWAMR_BUILD_LIBC_UVWASI=0 -DWAMR_BUILD_LIBC_WASI=1"
         ]
         ]
     steps:
     steps:
-      - uses: actions/checkout@v3
+      - uses: actions/checkout@v4
 
 
       - name: clone uvwasi library
       - name: clone uvwasi library
         if: ${{ !contains(matrix.build_options, '-DWAMR_BUILD_LIBC_UVWASI=0') }}
         if: ${{ !contains(matrix.build_options, '-DWAMR_BUILD_LIBC_UVWASI=0') }}
@@ -108,7 +108,7 @@ jobs:
           ]
           ]
     steps:
     steps:
       - name: checkout
       - name: checkout
-        uses: actions/checkout@v3
+        uses: actions/checkout@v4
 
 
       - name: download and install wasi-sdk
       - name: download and install wasi-sdk
         if: matrix.test_option == '$WASI_TEST_OPTIONS'
         if: matrix.test_option == '$WASI_TEST_OPTIONS'

+ 1 - 1
.github/workflows/create_tag.yml

@@ -24,7 +24,7 @@ jobs:
       new_tag: ${{ steps.preparation.outputs.new_tag }}
       new_tag: ${{ steps.preparation.outputs.new_tag }}
 
 
     steps:
     steps:
-      - uses: actions/checkout@v3
+      - uses: actions/checkout@v4
         # Full git history is needed to get a proper list of commits and tags
         # Full git history is needed to get a proper list of commits and tags
         with:
         with:
           fetch-depth: 0
           fetch-depth: 0

+ 1 - 1
.github/workflows/hadolint_dockerfiles.yml

@@ -34,7 +34,7 @@ jobs:
 
 
     steps:
     steps:
       - name: Checkout repository
       - name: Checkout repository
-        uses: actions/checkout@v3
+        uses: actions/checkout@v4
 
 
       # on default, hadolint will fail on warnings and errors
       # on default, hadolint will fail on warnings and errors
       - name: Run hadolint on dockerfiles
       - name: Run hadolint on dockerfiles

+ 10 - 10
.github/workflows/nightly_run.yml

@@ -68,13 +68,13 @@ jobs:
             llvm_cache_key: ${{ needs.build_llvm_libraries_on_ubuntu_2004.outputs.cache_key }}  
             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@v4
 
 
       # since jobs.id can't contain the dot character
       # since jobs.id can't contain the dot character
       # it is hard to use `format` to assemble the cache key
       # it is hard to use `format` to assemble the cache key
       - name: Get LLVM libraries
       - name: Get LLVM libraries
         id: retrieve_llvm_libs
         id: retrieve_llvm_libs
-        uses: actions/cache@v3
+        uses: actions/cache@v4
         with:
         with:
           path: |
           path: |
             ./core/deps/llvm/build/bin
             ./core/deps/llvm/build/bin
@@ -199,13 +199,13 @@ jobs:
 
 
     steps:
     steps:
       - name: checkout
       - name: checkout
-        uses: actions/checkout@v3
+        uses: actions/checkout@v4
 
 
       # only download llvm cache when needed
       # only download llvm cache when needed
       - name: Get LLVM libraries
       - name: Get LLVM libraries
         id: retrieve_llvm_libs
         id: retrieve_llvm_libs
         if: endsWith(matrix.make_options_run_mode, '_JIT_BUILD_OPTIONS')
         if: endsWith(matrix.make_options_run_mode, '_JIT_BUILD_OPTIONS')
-        uses: actions/cache@v3
+        uses: actions/cache@v4
         with:
         with:
           path: |
           path: |
             ./core/deps/llvm/build/bin
             ./core/deps/llvm/build/bin
@@ -347,12 +347,12 @@ jobs:
             sanitizer: asan
             sanitizer: asan
     steps:
     steps:
       - name: checkout
       - name: checkout
-        uses: actions/checkout@v3
+        uses: actions/checkout@v4
 
 
       - name: Get LLVM libraries
       - name: Get LLVM libraries
         id: retrieve_llvm_libs
         id: retrieve_llvm_libs
         if: (!endsWith(matrix.make_options, '_INTERP_BUILD_OPTIONS'))
         if: (!endsWith(matrix.make_options, '_INTERP_BUILD_OPTIONS'))
-        uses: actions/cache@v3
+        uses: actions/cache@v4
         with:
         with:
           path: |
           path: |
             ./core/deps/llvm/build/bin
             ./core/deps/llvm/build/bin
@@ -414,7 +414,7 @@ jobs:
             llvm_cache_key: ${{ needs.build_llvm_libraries_on_ubuntu_2004.outputs.cache_key }}
             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@v4
 
 
       - name: download and install wasi-sdk
       - name: download and install wasi-sdk
         run: |
         run: |
@@ -431,7 +431,7 @@ jobs:
 
 
       - name: Get LLVM libraries
       - name: Get LLVM libraries
         id: retrieve_llvm_libs
         id: retrieve_llvm_libs
-        uses: actions/cache@v3
+        uses: actions/cache@v4
         with:
         with:
           path: |
           path: |
             ./core/deps/llvm/build/bin
             ./core/deps/llvm/build/bin
@@ -601,7 +601,7 @@ jobs:
             test_option: $SIMD_TEST_OPTIONS
             test_option: $SIMD_TEST_OPTIONS
     steps:
     steps:
       - name: checkout
       - name: checkout
-        uses: actions/checkout@v3
+        uses: actions/checkout@v4
 
 
       - name: download and install wasi-sdk
       - name: download and install wasi-sdk
         if: matrix.test_option == '$WASI_TEST_OPTIONS'
         if: matrix.test_option == '$WASI_TEST_OPTIONS'
@@ -639,7 +639,7 @@ jobs:
       - name: Get LLVM libraries
       - name: Get LLVM libraries
         if: env.USE_LLVM == 'true'
         if: env.USE_LLVM == 'true'
         id: retrieve_llvm_libs
         id: retrieve_llvm_libs
-        uses: actions/cache@v3
+        uses: actions/cache@v4
         with:
         with:
           path: |
           path: |
             ./core/deps/llvm/build/bin
             ./core/deps/llvm/build/bin

+ 1 - 1
.github/workflows/release_process.yml

@@ -28,7 +28,7 @@ jobs:
     outputs:
     outputs:
       upload_url: ${{ steps.create_release.outputs.upload_url }}
       upload_url: ${{ steps.create_release.outputs.upload_url }}
     steps:
     steps:
-      - uses: actions/checkout@v3
+      - uses: actions/checkout@v4
 
 
       - name: prepare the release note
       - name: prepare the release note
         run: |
         run: |

+ 1 - 1
.github/workflows/reuse_latest_release_binaries.yml

@@ -28,7 +28,7 @@ jobs:
     outputs:
     outputs:
       result: ${{ steps.try_reuse.outputs.result }}
       result: ${{ steps.try_reuse.outputs.result }}
     steps:
     steps:
-      - uses: actions/checkout@v3
+      - uses: actions/checkout@v4
         # Full git history is needed to get a proper list of commits and tags
         # Full git history is needed to get a proper list of commits and tags
         with:
         with:
           fetch-depth: 0
           fetch-depth: 0

+ 4 - 4
.github/workflows/spec_test_on_nuttx.yml

@@ -96,21 +96,21 @@ jobs:
 
 
     steps:
     steps:
       - name: Checkout NuttX
       - name: Checkout NuttX
-        uses: actions/checkout@v3
+        uses: actions/checkout@v4
         with:
         with:
           repository: apache/incubator-nuttx
           repository: apache/incubator-nuttx
           ref: releases/12.4
           ref: releases/12.4
           path: nuttx
           path: nuttx
 
 
       - name: Checkout NuttX Apps
       - name: Checkout NuttX Apps
-        uses: actions/checkout@v3
+        uses: actions/checkout@v4
         with:
         with:
           repository: apache/incubator-nuttx-apps
           repository: apache/incubator-nuttx-apps
           ref: releases/12.4
           ref: releases/12.4
           path: apps
           path: apps
 
 
       - name: Checkout WAMR
       - name: Checkout WAMR
-        uses: actions/checkout@v3
+        uses: actions/checkout@v4
         with:
         with:
           repository: ${{ github.repository }}
           repository: ${{ github.repository }}
           path: apps/interpreters/wamr/wamr
           path: apps/interpreters/wamr/wamr
@@ -118,7 +118,7 @@ jobs:
       - name: Get LLVM libraries
       - name: Get LLVM libraries
         if: contains(matrix.wamr_test_option.mode, 'aot')
         if: contains(matrix.wamr_test_option.mode, 'aot')
         id: retrieve_llvm_libs
         id: retrieve_llvm_libs
-        uses: actions/cache@v3
+        uses: actions/cache@v4
         with:
         with:
           path: |
           path: |
             ./core/deps/llvm/build/bin
             ./core/deps/llvm/build/bin

+ 76 - 0
RELEASE_NOTES.md

@@ -1,3 +1,79 @@
+## WAMR-1.3.2
+
+### Breaking Changes
+
+### New Features
+- Implement Exception Handling for classic interpreter (#3096)
+  - Use `cmake -DWAMR_BUILD_EXCE_HANDLING=1/0` option to enable/disable
+    the feature, and by default it is disabled
+  - It is still in highly experimental stage
+
+### Bug Fixes
+- Fix build errors when initializing wasm_val_t values with macros (#3007)
+- fix(wasm-c-api): Do not clone stack frames if there's no trap (#3008)
+- classic-interp: Handle SIMD opcode when JIT is enabled (#3046)
+- fast-interp: Fix dynamic offset error issue in else branch (#3058)
+- wasm_cluster_destroy_spawned_exec_env: Avoid "invalid exec env" trap (#3068)
+- thread-mgr: Fix locking problems around aux stack allocation (#3073)
+- cosmopolitan: Update compiler and update platform_internal.h (#3079)
+- wasi: Apply wasm_runtime_begin_blocking_op to poll as well (#3080)
+- Fix memory/table segment checks in memory.init/table.init (#3081)
+- perf profiling: Adjust the calculation of execution time (#3089)
+- aot: Fix LLVMSetTailCallKind check (#3099)
+- fast-interp: Fix stack recovery for else branch (#3100)
+- fast-interp: Fix frame_offset pop order (#3101)
+- Fix AOT compilation on MacOS (#3102)
+- fast-interp: Fix block with parameter in polymorphic stack issue (#3112)
+- Fix read and validation of misc/simd/atomic sub opcodes (#3115)
+
+### Enhancements
+- Clear compilation warning and dead code (#3002)
+- aot debug: Try to use a bit more appropriate file names (#3000)
+- Increase default app thread stack size (#3010)
+- Rename rwlock_init to avoid conflict (#3016)
+- nuttx: Use larger alignment for os_mmap and comment why (#3017)
+- Allow using mmap for shared memory if hw bound check is disabled (#3029)
+- Don't redefine D_INO if already defined (#3036)
+- Enhancements on wasm function execution time statistic (#2985)
+- wamr-compiler: Fix non-x86{_64} host builds (#3037)
+- Disable quick aot entry for interp and fast-jit (#3039)
+- nuttx: Add option to enable quick aot entry (#3040)
+- Set CONFIG_HAS_CAP_ENTER to support posix file api for freertos (#3041)
+- Revert "Enable MAP_32BIT for macOS (#2992)" (#3032)
+- Enable quick aot entry when hw bound check is disabled (#3044)
+- Do not inherit WASM_SUSPEND_FLAG_BLOCKING from the parent thread (#3051)
+- wasm_runtime_begin_blocking_op: A comment about usage expectation (#3056)
+- Check arguments before calling bh_hash_map_find (#3055)
+- Fix aot large model (--size-level=0) with LLVM 18 (#3057)
+- Add flag to control Winsocket initialization (#3060)
+- nuttx: If STACK_GUARD_SIZE is not set, leave it to config.h (#2927)
+- Enhance setting write gs base with cmake variable (#3066)
+- aot_reloc_x86_64.c: Suggest to try --size-level=0 as well (#3067)
+- Fix some issues reported by CodeQL (#3064)
+- Remove a lot of "unused parameter" warnings (#3075)
+- Forward log and log level to custom bh_log callback (#3070)
+- Fix inconsistent code style in aot_loader.c (#3082)
+- freertos: Thread exit more common (#3094)
+- Fix windows build error and compilation warnings (#3095)
+
+### Others
+- Fix nightly-run CI failure (#3014)
+- Build samples in debug mode (#3019)
+- Remove deprecated tests in language-bindings python (#3018)
+- Avoid unused thread_id warning and recompile multi-module sample (#3033)
+- samples/terminate: Add a sample to demonstrate wasm_runtime_terminate (#3043)
+- Bump NuttX version to 12.4.x in CI (#3047)
+- perf_tune.md: Add refine the calling processes between host and wasm (#3065)
+- build_wamr.md: Update the document (#3074)
+- Fix download link for wasi-sdk (#3077)
+- README.md: Fix typo tunning to tuning (#3078)
+- Update outdated reference link in multi_module.md (#3092)
+- Add comments to suppress warning from clang-tidy (#3088)
+- CI: Update version of checkout to suppress warnings (#3093)
+- test_wamr.sh: Allow using test script on different platforms (#3098)
+
+---
+
 ## WAMR-1.3.1
 ## WAMR-1.3.1
 
 
 ### Breaking Changes
 ### Breaking Changes

+ 14 - 8
core/iwasm/common/wasm_c_api.c

@@ -1934,8 +1934,8 @@ wasm_frame_vec_clone_internal(Vector *src, Vector *out)
         return;
         return;
     }
     }
 
 
-    bh_memcpy_s(out->data, src->num_elems * sizeof(WASMCApiFrame), src->data,
-                src->num_elems * sizeof(WASMCApiFrame));
+    bh_memcpy_s(out->data, (uint32)(src->num_elems * sizeof(WASMCApiFrame)),
+                src->data, (uint32)(src->num_elems * sizeof(WASMCApiFrame)));
     out->num_elems = src->num_elems;
     out->num_elems = src->num_elems;
 }
 }
 
 
@@ -2962,8 +2962,10 @@ wasm_func_new_basic(wasm_store_t *store, const wasm_functype_t *type,
     if (!(func->type = wasm_functype_copy(type))) {
     if (!(func->type = wasm_functype_copy(type))) {
         goto failed;
         goto failed;
     }
     }
-    func->param_count = func->type->params->num_elems;
-    func->result_count = func->type->results->num_elems;
+    /* func type's param_count and result_count were checked in
+       loader and are no larger than UINT16_MAX */
+    func->param_count = (uint16)func->type->params->num_elems;
+    func->result_count = (uint16)func->type->results->num_elems;
 
 
     RETURN_OBJ(func, wasm_func_delete)
     RETURN_OBJ(func, wasm_func_delete)
 }
 }
@@ -2994,8 +2996,10 @@ wasm_func_new_with_env_basic(wasm_store_t *store, const wasm_functype_t *type,
     if (!(func->type = wasm_functype_copy(type))) {
     if (!(func->type = wasm_functype_copy(type))) {
         goto failed;
         goto failed;
     }
     }
-    func->param_count = func->type->params->num_elems;
-    func->result_count = func->type->results->num_elems;
+    /* func type's param_count and result_count were checked in
+       loader and are no larger than UINT16_MAX */
+    func->param_count = (uint16)func->type->params->num_elems;
+    func->result_count = (uint16)func->type->results->num_elems;
 
 
     RETURN_OBJ(func, wasm_func_delete)
     RETURN_OBJ(func, wasm_func_delete)
 }
 }
@@ -3085,8 +3089,10 @@ wasm_func_new_internal(wasm_store_t *store, uint16 func_idx_rt,
     if (!func->type) {
     if (!func->type) {
         goto failed;
         goto failed;
     }
     }
-    func->param_count = func->type->params->num_elems;
-    func->result_count = func->type->results->num_elems;
+    /* func type's param_count and result_count were checked in
+       loader and are no larger than UINT16_MAX */
+    func->param_count = (uint16)func->type->params->num_elems;
+    func->result_count = (uint16)func->type->results->num_elems;
 
 
     /* will add name information when processing "exports" */
     /* will add name information when processing "exports" */
     func->store = store;
     func->store = store;

+ 16 - 5
core/iwasm/compilation/aot_compiler.c

@@ -1050,7 +1050,9 @@ aot_compile_func(AOTCompContext *comp_ctx, uint32 func_index)
                 uint32 opcode1;
                 uint32 opcode1;
 
 
                 read_leb_uint32(frame_ip, frame_ip_end, opcode1);
                 read_leb_uint32(frame_ip, frame_ip_end, opcode1);
-                opcode = (uint32)opcode1;
+                /* opcode1 was checked in loader and is no larger than
+                   UINT8_MAX */
+                opcode = (uint8)opcode1;
 
 
 #if WASM_ENABLE_BULK_MEMORY != 0
 #if WASM_ENABLE_BULK_MEMORY != 0
                 if (WASM_OP_MEMORY_INIT <= opcode
                 if (WASM_OP_MEMORY_INIT <= opcode
@@ -1211,10 +1213,13 @@ aot_compile_func(AOTCompContext *comp_ctx, uint32 func_index)
             case WASM_OP_ATOMIC_PREFIX:
             case WASM_OP_ATOMIC_PREFIX:
             {
             {
                 uint8 bin_op, op_type;
                 uint8 bin_op, op_type;
+                uint32 opcode1;
+
+                read_leb_uint32(frame_ip, frame_ip_end, opcode1);
+                /* opcode1 was checked in loader and is no larger than
+                   UINT8_MAX */
+                opcode = (uint8)opcode1;
 
 
-                if (frame_ip < frame_ip_end) {
-                    opcode = *frame_ip++;
-                }
                 if (opcode != WASM_OP_ATOMIC_FENCE) {
                 if (opcode != WASM_OP_ATOMIC_FENCE) {
                     read_leb_uint32(frame_ip, frame_ip_end, align);
                     read_leb_uint32(frame_ip, frame_ip_end, align);
                     read_leb_uint32(frame_ip, frame_ip_end, offset);
                     read_leb_uint32(frame_ip, frame_ip_end, offset);
@@ -1364,11 +1369,17 @@ aot_compile_func(AOTCompContext *comp_ctx, uint32 func_index)
 #if WASM_ENABLE_SIMD != 0
 #if WASM_ENABLE_SIMD != 0
             case WASM_OP_SIMD_PREFIX:
             case WASM_OP_SIMD_PREFIX:
             {
             {
+                uint32 opcode1;
+
                 if (!comp_ctx->enable_simd) {
                 if (!comp_ctx->enable_simd) {
                     goto unsupport_simd;
                     goto unsupport_simd;
                 }
                 }
 
 
-                opcode = *frame_ip++;
+                read_leb_uint32(frame_ip, frame_ip_end, opcode1);
+                /* opcode1 was checked in loader and is no larger than
+                   UINT8_MAX */
+                opcode = (uint8)opcode1;
+
                 /* follow the order of enum WASMSimdEXTOpcode in
                 /* follow the order of enum WASMSimdEXTOpcode in
                    wasm_opcode.h */
                    wasm_opcode.h */
                 switch (opcode) {
                 switch (opcode) {

+ 0 - 6
core/iwasm/compilation/aot_llvm.c

@@ -533,18 +533,12 @@ 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;

+ 1 - 1
core/iwasm/compilation/aot_llvm_extra2.cpp

@@ -163,7 +163,7 @@ LLVMCreateTargetMachineWithOpts(LLVMTargetRef ctarget, const char *triple,
 }
 }
 
 
 /* https://reviews.llvm.org/D153107 */
 /* https://reviews.llvm.org/D153107 */
-#if LLVM_VERSION_MAJOR < 17
+#if LLVM_VERSION_MAJOR < 18
 using namespace llvm;
 using namespace llvm;
 
 
 LLVMTailCallKind
 LLVMTailCallKind

+ 1 - 1
core/iwasm/compilation/aot_llvm_extra2.h

@@ -17,7 +17,7 @@ LLVMCreateTargetMachineWithOpts(LLVMTargetRef ctarget, const char *triple,
                                 const char *StackUsageOutput);
                                 const char *StackUsageOutput);
 
 
 /* https://reviews.llvm.org/D153107 */
 /* https://reviews.llvm.org/D153107 */
-#if LLVM_VERSION_MAJOR < 17
+#if LLVM_VERSION_MAJOR < 18
 typedef enum {
 typedef enum {
     LLVMTailCallKindNone = 0,
     LLVMTailCallKindNone = 0,
     LLVMTailCallKindTail = 1,
     LLVMTailCallKindTail = 1,

+ 9 - 4
core/iwasm/fast-jit/jit_frontend.c

@@ -2257,7 +2257,9 @@ jit_compile_func(JitCompContext *cc)
                 uint32 opcode1;
                 uint32 opcode1;
 
 
                 read_leb_uint32(frame_ip, frame_ip_end, opcode1);
                 read_leb_uint32(frame_ip, frame_ip_end, opcode1);
-                opcode = (uint32)opcode1;
+                /* opcode1 was checked in loader and is no larger than
+                   UINT8_MAX */
+                opcode = (uint8)opcode1;
 
 
                 switch (opcode) {
                 switch (opcode) {
                     case WASM_OP_I32_TRUNC_SAT_S_F32:
                     case WASM_OP_I32_TRUNC_SAT_S_F32:
@@ -2396,10 +2398,13 @@ jit_compile_func(JitCompContext *cc)
             case WASM_OP_ATOMIC_PREFIX:
             case WASM_OP_ATOMIC_PREFIX:
             {
             {
                 uint8 bin_op, op_type;
                 uint8 bin_op, op_type;
+                uint32 opcode1;
+
+                read_leb_uint32(frame_ip, frame_ip_end, opcode1);
+                /* opcode1 was checked in loader and is no larger than
+                   UINT8_MAX */
+                opcode = (uint8)opcode1;
 
 
-                if (frame_ip < frame_ip_end) {
-                    opcode = *frame_ip++;
-                }
                 if (opcode != WASM_OP_ATOMIC_FENCE) {
                 if (opcode != WASM_OP_ATOMIC_FENCE) {
                     read_leb_uint32(frame_ip, frame_ip_end, align);
                     read_leb_uint32(frame_ip, frame_ip_end, align);
                     read_leb_uint32(frame_ip, frame_ip_end, offset);
                     read_leb_uint32(frame_ip, frame_ip_end, offset);

+ 44 - 27
core/iwasm/interpreter/wasm_interp_classic.c

@@ -1387,18 +1387,23 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module,
                                             /* push exception_tag_index and
                                             /* push exception_tag_index and
                                              * exception values for rethrow */
                                              * exception values for rethrow */
                                             PUSH_I32(exception_tag_index);
                                             PUSH_I32(exception_tag_index);
-                                            word_copy(frame_sp,
-                                                      frame_sp_old
-                                                          - cell_num_to_copy,
-                                                      cell_num_to_copy);
-                                            frame_sp += cell_num_to_copy;
-                                            /* push exception values for catch
-                                             */
-                                            word_copy(frame_sp,
-                                                      frame_sp_old
-                                                          - cell_num_to_copy,
-                                                      cell_num_to_copy);
-                                            frame_sp += cell_num_to_copy;
+                                            if (cell_num_to_copy > 0) {
+                                                word_copy(
+                                                    frame_sp,
+                                                    frame_sp_old
+                                                        - cell_num_to_copy,
+                                                    cell_num_to_copy);
+                                                frame_sp += cell_num_to_copy;
+                                                /* push exception values for
+                                                 * catch
+                                                 */
+                                                word_copy(
+                                                    frame_sp,
+                                                    frame_sp_old
+                                                        - cell_num_to_copy,
+                                                    cell_num_to_copy);
+                                                frame_sp += cell_num_to_copy;
+                                            }
 
 
                                             /* advance to handler */
                                             /* advance to handler */
                                             HANDLE_OP_END();
                                             HANDLE_OP_END();
@@ -1427,11 +1432,13 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module,
                                         frame_csp -= lookup_depth;
                                         frame_csp -= lookup_depth;
 
 
                                         /* push exception values for catch */
                                         /* push exception values for catch */
-                                        word_copy(frame_sp,
-                                                  frame_sp_old
-                                                      - cell_num_to_copy,
-                                                  cell_num_to_copy);
-                                        frame_sp += cell_num_to_copy;
+                                        if (cell_num_to_copy > 0) {
+                                            word_copy(frame_sp,
+                                                      frame_sp_old
+                                                          - cell_num_to_copy,
+                                                      cell_num_to_copy);
+                                            frame_sp += cell_num_to_copy;
+                                        }
 
 
                                         /* tag_index is already stored in
                                         /* tag_index is already stored in
                                          * exception_tag_index */
                                          * exception_tag_index */
@@ -1452,11 +1459,13 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module,
                                         /* push exception_tag_index and
                                         /* push exception_tag_index and
                                          * exception values for rethrow */
                                          * exception values for rethrow */
                                         PUSH_I32(exception_tag_index);
                                         PUSH_I32(exception_tag_index);
-                                        word_copy(frame_sp,
-                                                  frame_sp_old
-                                                      - cell_num_to_copy,
-                                                  cell_num_to_copy);
-                                        frame_sp += cell_num_to_copy;
+                                        if (cell_num_to_copy > 0) {
+                                            word_copy(frame_sp,
+                                                      frame_sp_old
+                                                          - cell_num_to_copy,
+                                                      cell_num_to_copy);
+                                            frame_sp += cell_num_to_copy;
+                                        }
                                         /* catch_all has no exception values */
                                         /* catch_all has no exception values */
 
 
                                         /* advance to handler */
                                         /* advance to handler */
@@ -1483,10 +1492,12 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module,
                              * The values are copied to the CALLER FRAME
                              * The values are copied to the CALLER FRAME
                              * (prev_frame->sp) same behvior ad WASM_OP_RETURN
                              * (prev_frame->sp) same behvior ad WASM_OP_RETURN
                              */
                              */
-                            word_copy(prev_frame->sp,
-                                      frame_sp_old - cell_num_to_copy,
-                                      cell_num_to_copy);
-                            prev_frame->sp += cell_num_to_copy;
+                            if (cell_num_to_copy > 0) {
+                                word_copy(prev_frame->sp,
+                                          frame_sp_old - cell_num_to_copy,
+                                          cell_num_to_copy);
+                                prev_frame->sp += cell_num_to_copy;
+                            }
                             *((int32 *)(prev_frame->sp)) = exception_tag_index;
                             *((int32 *)(prev_frame->sp)) = exception_tag_index;
                             prev_frame->sp++;
                             prev_frame->sp++;
 
 
@@ -3500,6 +3511,8 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module,
                 uint32 opcode1;
                 uint32 opcode1;
 
 
                 read_leb_uint32(frame_ip, frame_ip_end, opcode1);
                 read_leb_uint32(frame_ip, frame_ip_end, opcode1);
+                /* opcode1 was checked in loader and is no larger than
+                   UINT8_MAX */
                 opcode = (uint8)opcode1;
                 opcode = (uint8)opcode1;
 
 
                 switch (opcode) {
                 switch (opcode) {
@@ -3832,8 +3845,12 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module,
             HANDLE_OP(WASM_OP_ATOMIC_PREFIX)
             HANDLE_OP(WASM_OP_ATOMIC_PREFIX)
             {
             {
                 uint32 offset = 0, align, addr;
                 uint32 offset = 0, align, addr;
+                uint32 opcode1;
 
 
-                opcode = *frame_ip++;
+                read_leb_uint32(frame_ip, frame_ip_end, opcode1);
+                /* opcode1 was checked in loader and is no larger than
+                   UINT8_MAX */
+                opcode = (uint8)opcode1;
 
 
                 if (opcode != WASM_OP_ATOMIC_FENCE) {
                 if (opcode != WASM_OP_ATOMIC_FENCE) {
                     read_leb_uint32(frame_ip, frame_ip_end, align);
                     read_leb_uint32(frame_ip, frame_ip_end, align);

+ 119 - 87
core/iwasm/interpreter/wasm_loader.c

@@ -4679,6 +4679,7 @@ wasm_loader_find_block_addr(WASMExecEnv *exec_env, BlockAddr *block_addr_cache,
                     return true;
                     return true;
                 }
                 }
                 else {
                 else {
+                    skip_leb(p);
                     /* the DELEGATE opcode ends the tryblock, */
                     /* the DELEGATE opcode ends the tryblock, */
                     block_nested_depth--;
                     block_nested_depth--;
                     if (block_nested_depth
                     if (block_nested_depth
@@ -5091,9 +5092,13 @@ wasm_loader_find_block_addr(WASMExecEnv *exec_env, BlockAddr *block_addr_cache,
 #if (WASM_ENABLE_WAMR_COMPILER != 0) || (WASM_ENABLE_JIT != 0)
 #if (WASM_ENABLE_WAMR_COMPILER != 0) || (WASM_ENABLE_JIT != 0)
             case WASM_OP_SIMD_PREFIX:
             case WASM_OP_SIMD_PREFIX:
             {
             {
-                /* TODO: shall we ceate a table to be friendly to branch
-                 * prediction */
-                opcode = read_uint8(p);
+                uint32 opcode1;
+
+                read_leb_uint32(p, p_end, opcode1);
+                /* opcode1 was checked in wasm_loader_prepare_bytecode and
+                   is no larger than UINT8_MAX */
+                opcode = (uint8)opcode1;
+
                 /* follow the order of enum WASMSimdEXTOpcode in wasm_opcode.h
                 /* follow the order of enum WASMSimdEXTOpcode in wasm_opcode.h
                  */
                  */
                 switch (opcode) {
                 switch (opcode) {
@@ -5183,8 +5188,14 @@ wasm_loader_find_block_addr(WASMExecEnv *exec_env, BlockAddr *block_addr_cache,
 #if WASM_ENABLE_SHARED_MEMORY != 0
 #if WASM_ENABLE_SHARED_MEMORY != 0
             case WASM_OP_ATOMIC_PREFIX:
             case WASM_OP_ATOMIC_PREFIX:
             {
             {
-                /* atomic_op (1 u8) + memarg (2 u32_leb) */
-                opcode = read_uint8(p);
+                uint32 opcode1;
+
+                /* atomic_op (u32_leb) + memarg (2 u32_leb) */
+                read_leb_uint32(p, p_end, opcode1);
+                /* opcode1 was checked in wasm_loader_prepare_bytecode and
+                   is no larger than UINT8_MAX */
+                opcode = (uint8)opcode1;
+
                 if (opcode != WASM_OP_ATOMIC_FENCE) {
                 if (opcode != WASM_OP_ATOMIC_FENCE) {
                     skip_leb_uint32(p, p_end); /* align */
                     skip_leb_uint32(p, p_end); /* align */
                     skip_leb_uint32(p, p_end); /* offset */
                     skip_leb_uint32(p, p_end); /* offset */
@@ -5279,9 +5290,8 @@ typedef struct BranchBlock {
     BranchBlockPatch *patch_list;
     BranchBlockPatch *patch_list;
     /* This is used to save params frame_offset of of if block */
     /* This is used to save params frame_offset of of if block */
     int16 *param_frame_offsets;
     int16 *param_frame_offsets;
-    /* This is used to store available param num for if/else branch, so the else
-     * opcode can know how many parameters should be copied to the stack */
-    uint32 available_param_num;
+    /* This is used to recover dynamic offset for else branch */
+    uint16 start_dynamic_offset;
 #endif
 #endif
 
 
     /* Indicate the operand stack is in polymorphic state.
     /* Indicate the operand stack is in polymorphic state.
@@ -7128,6 +7138,40 @@ fail:
     return NULL;
     return NULL;
 }
 }
 
 
+#if WASM_ENABLE_EXCE_HANDLING != 0
+static BranchBlock *
+check_branch_block_for_delegate(WASMLoaderContext *loader_ctx, uint8 **p_buf,
+                                uint8 *buf_end, char *error_buf,
+                                uint32 error_buf_size)
+{
+    uint8 *p = *p_buf, *p_end = buf_end;
+    BranchBlock *frame_csp_tmp;
+    uint32 depth;
+
+    read_leb_uint32(p, p_end, depth);
+    /*
+     * Note: "delegate 0" means the surrounding block, not the
+     * try-delegate block itself.
+     *
+     * Note: the caller hasn't popped the try-delegate frame yet.
+     */
+    bh_assert(loader_ctx->csp_num > 0);
+    if (loader_ctx->csp_num - 1 <= depth) {
+        set_error_buf(error_buf, error_buf_size, "unknown delegate label");
+        goto fail;
+    }
+    frame_csp_tmp = loader_ctx->frame_csp - depth - 2;
+#if WASM_ENABLE_FAST_INTERP != 0
+    emit_br_info(frame_csp_tmp);
+#endif
+
+    *p_buf = p;
+    return frame_csp_tmp;
+fail:
+    return NULL;
+}
+#endif
+
 static bool
 static bool
 check_block_stack(WASMLoaderContext *loader_ctx, BranchBlock *block,
 check_block_stack(WASMLoaderContext *loader_ctx, BranchBlock *block,
                   char *error_buf, uint32 error_buf_size)
                   char *error_buf, uint32 error_buf_size)
@@ -7218,18 +7262,15 @@ fail:
  * 1) POP original parameter out;
  * 1) POP original parameter out;
  * 2) Push and copy original values to dynamic space.
  * 2) Push and copy original values to dynamic space.
  * The copy instruction format:
  * The copy instruction format:
- *   Part a: available param count
+ *   Part a: param count
  *   Part b: all param total cell num
  *   Part b: all param total cell num
  *   Part c: each param's cell_num, src offset and dst offset
  *   Part c: each param's cell_num, src offset and dst offset
  *   Part d: each param's src offset
  *   Part d: each param's src offset
  *   Part e: each param's dst offset
  *   Part e: each param's dst offset
- * Note: if the stack is in polymorphic state, the actual copied parameters may
- * be fewer than the defined number in block type
  */
  */
 static bool
 static bool
 copy_params_to_dynamic_space(WASMLoaderContext *loader_ctx, bool is_if_block,
 copy_params_to_dynamic_space(WASMLoaderContext *loader_ctx, bool is_if_block,
-                             uint32 *p_available_param_count, char *error_buf,
-                             uint32 error_buf_size)
+                             char *error_buf, uint32 error_buf_size)
 {
 {
     bool ret = false;
     bool ret = false;
     int16 *frame_offset = NULL;
     int16 *frame_offset = NULL;
@@ -7241,91 +7282,72 @@ copy_params_to_dynamic_space(WASMLoaderContext *loader_ctx, bool is_if_block,
     BlockType *block_type = &block->block_type;
     BlockType *block_type = &block->block_type;
     WASMType *wasm_type = block_type->u.type;
     WASMType *wasm_type = block_type->u.type;
     uint32 param_count = block_type->u.type->param_count;
     uint32 param_count = block_type->u.type->param_count;
-    uint32 available_param_count = 0;
     int16 condition_offset = 0;
     int16 condition_offset = 0;
     bool disable_emit = false;
     bool disable_emit = false;
     int16 operand_offset = 0;
     int16 operand_offset = 0;
-    uint64 size;
-
-    if (is_if_block)
-        condition_offset = *loader_ctx->frame_offset;
-
-    /* POP original parameter out */
-    for (i = 0; i < param_count; i++) {
-        int32 available_stack_cell =
-            (int32)(loader_ctx->stack_cell_num - block->stack_cell_num);
-
-        if (available_stack_cell <= 0 && block->is_stack_polymorphic)
-            break;
-
-        POP_OFFSET_TYPE(wasm_type->types[param_count - i - 1]);
-        wasm_loader_emit_backspace(loader_ctx, sizeof(int16));
-    }
-    available_param_count = i;
 
 
-    size =
-        (uint64)available_param_count * (sizeof(*cells) + sizeof(*src_offsets));
+    uint64 size = (uint64)param_count * (sizeof(*cells) + sizeof(*src_offsets));
+    bh_assert(size > 0);
 
 
     /* For if block, we also need copy the condition operand offset. */
     /* For if block, we also need copy the condition operand offset. */
     if (is_if_block)
     if (is_if_block)
         size += sizeof(*cells) + sizeof(*src_offsets);
         size += sizeof(*cells) + sizeof(*src_offsets);
 
 
     /* Allocate memory for the emit data */
     /* Allocate memory for the emit data */
-    if ((size > 0)
-        && !(emit_data = loader_malloc(size, error_buf, error_buf_size)))
+    if (!(emit_data = loader_malloc(size, error_buf, error_buf_size)))
         return false;
         return false;
 
 
     cells = emit_data;
     cells = emit_data;
     src_offsets = (int16 *)(cells + param_count);
     src_offsets = (int16 *)(cells + param_count);
 
 
+    if (is_if_block)
+        condition_offset = *loader_ctx->frame_offset;
+
+    /* POP original parameter out */
+    for (i = 0; i < param_count; i++) {
+        POP_OFFSET_TYPE(wasm_type->types[param_count - i - 1]);
+        wasm_loader_emit_backspace(loader_ctx, sizeof(int16));
+    }
     frame_offset = loader_ctx->frame_offset;
     frame_offset = loader_ctx->frame_offset;
 
 
     /* Get each param's cell num and src offset */
     /* Get each param's cell num and src offset */
-    for (i = 0; i < available_param_count; i++) {
+    for (i = 0; i < param_count; i++) {
         cell = (uint8)wasm_value_type_cell_num(wasm_type->types[i]);
         cell = (uint8)wasm_value_type_cell_num(wasm_type->types[i]);
         cells[i] = cell;
         cells[i] = cell;
         src_offsets[i] = *frame_offset;
         src_offsets[i] = *frame_offset;
         frame_offset += cell;
         frame_offset += cell;
     }
     }
-
     /* emit copy instruction */
     /* emit copy instruction */
     emit_label(EXT_OP_COPY_STACK_VALUES);
     emit_label(EXT_OP_COPY_STACK_VALUES);
     /* Part a) */
     /* Part a) */
-    emit_uint32(loader_ctx, is_if_block ? available_param_count + 1
-                                        : available_param_count);
+    emit_uint32(loader_ctx, is_if_block ? param_count + 1 : param_count);
     /* Part b) */
     /* Part b) */
     emit_uint32(loader_ctx, is_if_block ? wasm_type->param_cell_num + 1
     emit_uint32(loader_ctx, is_if_block ? wasm_type->param_cell_num + 1
                                         : wasm_type->param_cell_num);
                                         : wasm_type->param_cell_num);
     /* Part c) */
     /* Part c) */
-    for (i = 0; i < available_param_count; i++)
+    for (i = 0; i < param_count; i++)
         emit_byte(loader_ctx, cells[i]);
         emit_byte(loader_ctx, cells[i]);
     if (is_if_block)
     if (is_if_block)
         emit_byte(loader_ctx, 1);
         emit_byte(loader_ctx, 1);
 
 
     /* Part d) */
     /* Part d) */
-    for (i = 0; i < available_param_count; i++)
+    for (i = 0; i < param_count; i++)
         emit_operand(loader_ctx, src_offsets[i]);
         emit_operand(loader_ctx, src_offsets[i]);
     if (is_if_block)
     if (is_if_block)
         emit_operand(loader_ctx, condition_offset);
         emit_operand(loader_ctx, condition_offset);
 
 
     /* Part e) */
     /* Part e) */
     /* Push to dynamic space. The push will emit the dst offset. */
     /* Push to dynamic space. The push will emit the dst offset. */
-    for (i = 0; i < available_param_count; i++)
+    for (i = 0; i < param_count; i++)
         PUSH_OFFSET_TYPE(wasm_type->types[i]);
         PUSH_OFFSET_TYPE(wasm_type->types[i]);
     if (is_if_block)
     if (is_if_block)
         PUSH_OFFSET_TYPE(VALUE_TYPE_I32);
         PUSH_OFFSET_TYPE(VALUE_TYPE_I32);
 
 
-    if (p_available_param_count) {
-        *p_available_param_count = available_param_count;
-    }
-
     ret = true;
     ret = true;
 
 
 fail:
 fail:
     /* Free the emit data */
     /* Free the emit data */
-    if (emit_data) {
-        wasm_runtime_free(emit_data);
-    }
+    wasm_runtime_free(emit_data);
 
 
     return ret;
     return ret;
 }
 }
@@ -7615,6 +7637,7 @@ re_scan:
 
 
                     BranchBlock *cur_block = loader_ctx->frame_csp - 1;
                     BranchBlock *cur_block = loader_ctx->frame_csp - 1;
 #if WASM_ENABLE_FAST_INTERP != 0
 #if WASM_ENABLE_FAST_INTERP != 0
+                    uint32 cell_num;
                     available_params = block_type.u.type->param_count;
                     available_params = block_type.u.type->param_count;
 #endif
 #endif
                     for (i = 0; i < block_type.u.type->param_count; i++) {
                     for (i = 0; i < block_type.u.type->param_count; i++) {
@@ -7632,6 +7655,13 @@ re_scan:
 
 
                         POP_TYPE(
                         POP_TYPE(
                             wasm_type->types[wasm_type->param_count - i - 1]);
                             wasm_type->types[wasm_type->param_count - i - 1]);
+#if WASM_ENABLE_FAST_INTERP != 0
+                        /* decrease the frame_offset pointer accordingly to keep
+                         * consistent with frame_ref stack */
+                        cell_num = wasm_value_type_cell_num(
+                            wasm_type->types[wasm_type->param_count - i - 1]);
+                        loader_ctx->frame_offset -= cell_num;
+#endif
                     }
                     }
                 }
                 }
                 PUSH_CSP(LABEL_TYPE_BLOCK + (opcode - WASM_OP_BLOCK),
                 PUSH_CSP(LABEL_TYPE_BLOCK + (opcode - WASM_OP_BLOCK),
@@ -7640,12 +7670,26 @@ re_scan:
                 /* Pass parameters to block */
                 /* Pass parameters to block */
                 if (BLOCK_HAS_PARAM(block_type)) {
                 if (BLOCK_HAS_PARAM(block_type)) {
                     for (i = 0; i < block_type.u.type->param_count; i++) {
                     for (i = 0; i < block_type.u.type->param_count; i++) {
-                        PUSH_TYPE(block_type.u.type->types[i]);
 #if WASM_ENABLE_FAST_INTERP != 0
 #if WASM_ENABLE_FAST_INTERP != 0
+                        uint32 cell_num = wasm_value_type_cell_num(
+                            block_type.u.type->types[i]);
                         if (i >= available_params) {
                         if (i >= available_params) {
-                            PUSH_OFFSET_TYPE(block_type.u.type->types[i]);
+                            /* If there isn't enough data on stack, push a dummy
+                             * offset to keep the stack consistent with
+                             * frame_ref.
+                             * Since the stack is already in polymorphic state,
+                             * the opcode will not be executed, so the dummy
+                             * offset won't cause any error */
+                            *loader_ctx->frame_offset++ = 0;
+                            if (cell_num > 1) {
+                                *loader_ctx->frame_offset++ = 0;
+                            }
+                        }
+                        else {
+                            loader_ctx->frame_offset += cell_num;
                         }
                         }
 #endif
 #endif
+                        PUSH_TYPE(block_type.u.type->types[i]);
                     }
                     }
                 }
                 }
 
 
@@ -7655,9 +7699,8 @@ re_scan:
 
 
                     if (BLOCK_HAS_PARAM(block_type)) {
                     if (BLOCK_HAS_PARAM(block_type)) {
                         /* Make sure params are in dynamic space */
                         /* Make sure params are in dynamic space */
-                        if (!copy_params_to_dynamic_space(loader_ctx, false,
-                                                          NULL, error_buf,
-                                                          error_buf_size))
+                        if (!copy_params_to_dynamic_space(
+                                loader_ctx, false, error_buf, error_buf_size))
                             goto fail;
                             goto fail;
                     }
                     }
 
 
@@ -7690,17 +7733,21 @@ re_scan:
                      * recover them before entering else branch.
                      * recover them before entering else branch.
                      *
                      *
                      */
                      */
-                    if (if_condition_available && BLOCK_HAS_PARAM(block_type)) {
+                    if (BLOCK_HAS_PARAM(block_type)) {
                         uint64 size;
                         uint64 size;
 
 
-                        /* skip the if condition operand offset */
-                        wasm_loader_emit_backspace(loader_ctx, sizeof(int16));
+                        /* In polymorphic state, there may be no if condition on
+                         * the stack, so the offset may not emitted */
+                        if (if_condition_available) {
+                            /* skip the if condition operand offset */
+                            wasm_loader_emit_backspace(loader_ctx,
+                                                       sizeof(int16));
+                        }
                         /* skip the if label */
                         /* skip the if label */
                         skip_label();
                         skip_label();
                         /* Emit a copy instruction */
                         /* Emit a copy instruction */
                         if (!copy_params_to_dynamic_space(
                         if (!copy_params_to_dynamic_space(
-                                loader_ctx, true, &block->available_param_num,
-                                error_buf, error_buf_size))
+                                loader_ctx, true, error_buf, error_buf_size))
                             goto fail;
                             goto fail;
 
 
                         /* Emit the if instruction */
                         /* Emit the if instruction */
@@ -7721,9 +7768,8 @@ re_scan:
                                         - size / sizeof(int16),
                                         - size / sizeof(int16),
                                     (uint32)size);
                                     (uint32)size);
                     }
                     }
-                    else {
-                        block->available_param_num = 0;
-                    }
+
+                    block->start_dynamic_offset = loader_ctx->dynamic_offset;
 
 
                     emit_empty_label_addr_and_frame_ip(PATCH_ELSE);
                     emit_empty_label_addr_and_frame_ip(PATCH_ELSE);
                     emit_empty_label_addr_and_frame_ip(PATCH_END);
                     emit_empty_label_addr_and_frame_ip(PATCH_END);
@@ -7830,16 +7876,10 @@ re_scan:
             case WASM_OP_DELEGATE:
             case WASM_OP_DELEGATE:
             {
             {
                 /* check  target block is valid */
                 /* check  target block is valid */
-                if (!(frame_csp_tmp = check_branch_block(
+                if (!(frame_csp_tmp = check_branch_block_for_delegate(
                           loader_ctx, &p, p_end, error_buf, error_buf_size)))
                           loader_ctx, &p, p_end, error_buf, error_buf_size)))
                     goto fail;
                     goto fail;
 
 
-                /* valid types */
-                if (LABEL_TYPE_TRY != frame_csp_tmp->label_type) {
-                    snprintf(error_buf, error_buf_size, "unknown label");
-                    goto fail;
-                }
-
                 BranchBlock *cur_block = loader_ctx->frame_csp - 1;
                 BranchBlock *cur_block = loader_ctx->frame_csp - 1;
                 uint8 label_type = cur_block->label_type;
                 uint8 label_type = cur_block->label_type;
 
 
@@ -7979,21 +8019,13 @@ re_scan:
 
 
 #if WASM_ENABLE_FAST_INTERP != 0
 #if WASM_ENABLE_FAST_INTERP != 0
                 /* Recover top param_count values of frame_offset stack */
                 /* Recover top param_count values of frame_offset stack */
-                if (block->available_param_num) {
+                if (BLOCK_HAS_PARAM((block_type))) {
                     uint32 size;
                     uint32 size;
-                    size = sizeof(int16) * block->available_param_num;
+                    size = sizeof(int16) * block_type.u.type->param_cell_num;
                     bh_memcpy_s(loader_ctx->frame_offset, size,
                     bh_memcpy_s(loader_ctx->frame_offset, size,
                                 block->param_frame_offsets, size);
                                 block->param_frame_offsets, size);
                     loader_ctx->frame_offset += (size / sizeof(int16));
                     loader_ctx->frame_offset += (size / sizeof(int16));
-
-                    /* recover dynamic offset */
-                    for (i = 0; i < block->available_param_num; i++) {
-                        if (block->param_frame_offsets[i]
-                            >= loader_ctx->dynamic_offset) {
-                            loader_ctx->dynamic_offset =
-                                block->param_frame_offsets[i] + 1;
-                        }
-                    }
+                    loader_ctx->dynamic_offset = block->start_dynamic_offset;
                 }
                 }
 #endif
 #endif
 
 
@@ -8222,11 +8254,11 @@ re_scan:
                      idx--) {
                      idx--) {
                     ret_type = *(func->func_type->types
                     ret_type = *(func->func_type->types
                                  + func->func_type->param_count + idx);
                                  + func->func_type->param_count + idx);
-                    POP_TYPE(ret_type);
 #if WASM_ENABLE_FAST_INTERP != 0
 #if WASM_ENABLE_FAST_INTERP != 0
                     /* emit the offset after return opcode */
                     /* emit the offset after return opcode */
                     POP_OFFSET_TYPE(ret_type);
                     POP_OFFSET_TYPE(ret_type);
 #endif
 #endif
+                    POP_TYPE(ret_type);
                 }
                 }
 
 
                 RESET_STACK();
                 RESET_STACK();
@@ -8266,10 +8298,10 @@ re_scan:
                 if (func_type->param_count > 0) {
                 if (func_type->param_count > 0) {
                     for (idx = (int32)(func_type->param_count - 1); idx >= 0;
                     for (idx = (int32)(func_type->param_count - 1); idx >= 0;
                          idx--) {
                          idx--) {
-                        POP_TYPE(func_type->types[idx]);
 #if WASM_ENABLE_FAST_INTERP != 0
 #if WASM_ENABLE_FAST_INTERP != 0
                         POP_OFFSET_TYPE(func_type->types[idx]);
                         POP_OFFSET_TYPE(func_type->types[idx]);
 #endif
 #endif
+                        POP_TYPE(func_type->types[idx]);
                     }
                     }
                 }
                 }
 
 
@@ -8367,10 +8399,10 @@ re_scan:
                 if (func_type->param_count > 0) {
                 if (func_type->param_count > 0) {
                     for (idx = (int32)(func_type->param_count - 1); idx >= 0;
                     for (idx = (int32)(func_type->param_count - 1); idx >= 0;
                          idx--) {
                          idx--) {
-                        POP_TYPE(func_type->types[idx]);
 #if WASM_ENABLE_FAST_INTERP != 0
 #if WASM_ENABLE_FAST_INTERP != 0
                         POP_OFFSET_TYPE(func_type->types[idx]);
                         POP_OFFSET_TYPE(func_type->types[idx]);
 #endif
 #endif
+                        POP_TYPE(func_type->types[idx]);
                     }
                     }
                 }
                 }
 
 
@@ -9814,8 +9846,8 @@ re_scan:
             {
             {
                 uint32 opcode1;
                 uint32 opcode1;
 
 
-                CHECK_BUF(p, p_end, 1);
-                opcode1 = read_uint8(p);
+                read_leb_uint32(p, p_end, opcode1);
+
                 /* follow the order of enum WASMSimdEXTOpcode in wasm_opcode.h
                 /* follow the order of enum WASMSimdEXTOpcode in wasm_opcode.h
                  */
                  */
                 switch (opcode1) {
                 switch (opcode1) {
@@ -10476,8 +10508,8 @@ re_scan:
             {
             {
                 uint32 opcode1;
                 uint32 opcode1;
 
 
-                CHECK_BUF(p, p_end, 1);
-                opcode1 = read_uint8(p);
+                read_leb_uint32(p, p_end, opcode1);
+
 #if WASM_ENABLE_FAST_INTERP != 0
 #if WASM_ENABLE_FAST_INTERP != 0
                 emit_byte(loader_ctx, opcode1);
                 emit_byte(loader_ctx, opcode1);
 #endif
 #endif

+ 83 - 75
core/iwasm/interpreter/wasm_mini_loader.c

@@ -3492,8 +3492,11 @@ wasm_loader_find_block_addr(WASMExecEnv *exec_env, BlockAddr *block_addr_cache,
                 uint32 opcode1;
                 uint32 opcode1;
 
 
                 read_leb_uint32(p, p_end, opcode1);
                 read_leb_uint32(p, p_end, opcode1);
+                /* opcode1 was checked in wasm_loader_prepare_bytecode and
+                   is no larger than UINT8_MAX */
+                opcode = (uint8)opcode1;
 
 
-                switch (opcode1) {
+                switch (opcode) {
                     case WASM_OP_I32_TRUNC_SAT_S_F32:
                     case WASM_OP_I32_TRUNC_SAT_S_F32:
                     case WASM_OP_I32_TRUNC_SAT_U_F32:
                     case WASM_OP_I32_TRUNC_SAT_U_F32:
                     case WASM_OP_I32_TRUNC_SAT_S_F64:
                     case WASM_OP_I32_TRUNC_SAT_S_F64:
@@ -3549,8 +3552,14 @@ wasm_loader_find_block_addr(WASMExecEnv *exec_env, BlockAddr *block_addr_cache,
 #if WASM_ENABLE_SHARED_MEMORY != 0
 #if WASM_ENABLE_SHARED_MEMORY != 0
             case WASM_OP_ATOMIC_PREFIX:
             case WASM_OP_ATOMIC_PREFIX:
             {
             {
-                /* atomic_op (1 u8) + memarg (2 u32_leb) */
-                opcode = read_uint8(p);
+                uint32 opcode1;
+
+                /* atomic_op (u32_leb) + memarg (2 u32_leb) */
+                read_leb_uint32(p, p_end, opcode1);
+                /* opcode1 was checked in wasm_loader_prepare_bytecode and
+                   is no larger than UINT8_MAX */
+                opcode = (uint8)opcode1;
+
                 if (opcode != WASM_OP_ATOMIC_FENCE) {
                 if (opcode != WASM_OP_ATOMIC_FENCE) {
                     skip_leb_uint32(p, p_end); /* align */
                     skip_leb_uint32(p, p_end); /* align */
                     skip_leb_uint32(p, p_end); /* offset */
                     skip_leb_uint32(p, p_end); /* offset */
@@ -3614,6 +3623,8 @@ typedef struct BranchBlock {
     /* This is used to store available param num for if/else branch, so the else
     /* This is used to store available param num for if/else branch, so the else
      * opcode can know how many parameters should be copied to the stack */
      * opcode can know how many parameters should be copied to the stack */
     uint32 available_param_num;
     uint32 available_param_num;
+    /* This is used to recover dynamic offset for else branch */
+    uint16 start_dynamic_offset;
 #endif
 #endif
 
 
     /* Indicate the operand stack is in polymorphic state.
     /* Indicate the operand stack is in polymorphic state.
@@ -5363,18 +5374,15 @@ fail:
  * 1) POP original parameter out;
  * 1) POP original parameter out;
  * 2) Push and copy original values to dynamic space.
  * 2) Push and copy original values to dynamic space.
  * The copy instruction format:
  * The copy instruction format:
- *   Part a: available param count
+ *   Part a: param count
  *   Part b: all param total cell num
  *   Part b: all param total cell num
  *   Part c: each param's cell_num, src offset and dst offset
  *   Part c: each param's cell_num, src offset and dst offset
  *   Part d: each param's src offset
  *   Part d: each param's src offset
  *   Part e: each param's dst offset
  *   Part e: each param's dst offset
- * Note: if the stack is in polymorphic state, the actual copied parameters may
- * be fewer than the defined number in block type
  */
  */
 static bool
 static bool
 copy_params_to_dynamic_space(WASMLoaderContext *loader_ctx, bool is_if_block,
 copy_params_to_dynamic_space(WASMLoaderContext *loader_ctx, bool is_if_block,
-                             uint32 *p_available_param_count, char *error_buf,
-                             uint32 error_buf_size)
+                             char *error_buf, uint32 error_buf_size)
 {
 {
     bool ret = false;
     bool ret = false;
     int16 *frame_offset = NULL;
     int16 *frame_offset = NULL;
@@ -5386,91 +5394,72 @@ copy_params_to_dynamic_space(WASMLoaderContext *loader_ctx, bool is_if_block,
     BlockType *block_type = &block->block_type;
     BlockType *block_type = &block->block_type;
     WASMType *wasm_type = block_type->u.type;
     WASMType *wasm_type = block_type->u.type;
     uint32 param_count = block_type->u.type->param_count;
     uint32 param_count = block_type->u.type->param_count;
-    uint32 available_param_count = 0;
     int16 condition_offset = 0;
     int16 condition_offset = 0;
     bool disable_emit = false;
     bool disable_emit = false;
     int16 operand_offset = 0;
     int16 operand_offset = 0;
-    uint64 size;
 
 
-    if (is_if_block)
-        condition_offset = *loader_ctx->frame_offset;
-
-    /* POP original parameter out */
-    for (i = 0; i < param_count; i++) {
-        int32 available_stack_cell =
-            (int32)(loader_ctx->stack_cell_num - block->stack_cell_num);
-
-        if (available_stack_cell <= 0 && block->is_stack_polymorphic)
-            break;
-
-        POP_OFFSET_TYPE(wasm_type->types[param_count - i - 1]);
-        wasm_loader_emit_backspace(loader_ctx, sizeof(int16));
-    }
-    available_param_count = i;
-
-    size =
-        (uint64)available_param_count * (sizeof(*cells) + sizeof(*src_offsets));
+    uint64 size = (uint64)param_count * (sizeof(*cells) + sizeof(*src_offsets));
+    bh_assert(size > 0);
 
 
     /* For if block, we also need copy the condition operand offset. */
     /* For if block, we also need copy the condition operand offset. */
     if (is_if_block)
     if (is_if_block)
         size += sizeof(*cells) + sizeof(*src_offsets);
         size += sizeof(*cells) + sizeof(*src_offsets);
 
 
     /* Allocate memory for the emit data */
     /* Allocate memory for the emit data */
-    if ((size > 0)
-        && !(emit_data = loader_malloc(size, error_buf, error_buf_size)))
+    if (!(emit_data = loader_malloc(size, error_buf, error_buf_size)))
         return false;
         return false;
 
 
     cells = emit_data;
     cells = emit_data;
     src_offsets = (int16 *)(cells + param_count);
     src_offsets = (int16 *)(cells + param_count);
 
 
+    if (is_if_block)
+        condition_offset = *loader_ctx->frame_offset;
+
+    /* POP original parameter out */
+    for (i = 0; i < param_count; i++) {
+        POP_OFFSET_TYPE(wasm_type->types[param_count - i - 1]);
+        wasm_loader_emit_backspace(loader_ctx, sizeof(int16));
+    }
     frame_offset = loader_ctx->frame_offset;
     frame_offset = loader_ctx->frame_offset;
 
 
     /* Get each param's cell num and src offset */
     /* Get each param's cell num and src offset */
-    for (i = 0; i < available_param_count; i++) {
+    for (i = 0; i < param_count; i++) {
         cell = (uint8)wasm_value_type_cell_num(wasm_type->types[i]);
         cell = (uint8)wasm_value_type_cell_num(wasm_type->types[i]);
         cells[i] = cell;
         cells[i] = cell;
         src_offsets[i] = *frame_offset;
         src_offsets[i] = *frame_offset;
         frame_offset += cell;
         frame_offset += cell;
     }
     }
-
     /* emit copy instruction */
     /* emit copy instruction */
     emit_label(EXT_OP_COPY_STACK_VALUES);
     emit_label(EXT_OP_COPY_STACK_VALUES);
     /* Part a) */
     /* Part a) */
-    emit_uint32(loader_ctx, is_if_block ? available_param_count + 1
-                                        : available_param_count);
+    emit_uint32(loader_ctx, is_if_block ? param_count + 1 : param_count);
     /* Part b) */
     /* Part b) */
     emit_uint32(loader_ctx, is_if_block ? wasm_type->param_cell_num + 1
     emit_uint32(loader_ctx, is_if_block ? wasm_type->param_cell_num + 1
                                         : wasm_type->param_cell_num);
                                         : wasm_type->param_cell_num);
     /* Part c) */
     /* Part c) */
-    for (i = 0; i < available_param_count; i++)
+    for (i = 0; i < param_count; i++)
         emit_byte(loader_ctx, cells[i]);
         emit_byte(loader_ctx, cells[i]);
     if (is_if_block)
     if (is_if_block)
         emit_byte(loader_ctx, 1);
         emit_byte(loader_ctx, 1);
 
 
     /* Part d) */
     /* Part d) */
-    for (i = 0; i < available_param_count; i++)
+    for (i = 0; i < param_count; i++)
         emit_operand(loader_ctx, src_offsets[i]);
         emit_operand(loader_ctx, src_offsets[i]);
     if (is_if_block)
     if (is_if_block)
         emit_operand(loader_ctx, condition_offset);
         emit_operand(loader_ctx, condition_offset);
 
 
     /* Part e) */
     /* Part e) */
     /* Push to dynamic space. The push will emit the dst offset. */
     /* Push to dynamic space. The push will emit the dst offset. */
-    for (i = 0; i < available_param_count; i++)
+    for (i = 0; i < param_count; i++)
         PUSH_OFFSET_TYPE(wasm_type->types[i]);
         PUSH_OFFSET_TYPE(wasm_type->types[i]);
     if (is_if_block)
     if (is_if_block)
         PUSH_OFFSET_TYPE(VALUE_TYPE_I32);
         PUSH_OFFSET_TYPE(VALUE_TYPE_I32);
 
 
-    if (p_available_param_count) {
-        *p_available_param_count = available_param_count;
-    }
-
     ret = true;
     ret = true;
 
 
 fail:
 fail:
     /* Free the emit data */
     /* Free the emit data */
-    if (emit_data) {
-        wasm_runtime_free(emit_data);
-    }
+    wasm_runtime_free(emit_data);
 
 
     return ret;
     return ret;
 }
 }
@@ -5672,6 +5661,7 @@ re_scan:
 
 
                     BranchBlock *cur_block = loader_ctx->frame_csp - 1;
                     BranchBlock *cur_block = loader_ctx->frame_csp - 1;
 #if WASM_ENABLE_FAST_INTERP != 0
 #if WASM_ENABLE_FAST_INTERP != 0
+                    uint32 cell_num;
                     available_params = block_type.u.type->param_count;
                     available_params = block_type.u.type->param_count;
 #endif
 #endif
                     for (i = 0; i < block_type.u.type->param_count; i++) {
                     for (i = 0; i < block_type.u.type->param_count; i++) {
@@ -5689,6 +5679,13 @@ re_scan:
 
 
                         POP_TYPE(
                         POP_TYPE(
                             wasm_type->types[wasm_type->param_count - i - 1]);
                             wasm_type->types[wasm_type->param_count - i - 1]);
+#if WASM_ENABLE_FAST_INTERP != 0
+                        /* decrease the frame_offset pointer accordingly to keep
+                         * consistent with frame_ref stack */
+                        cell_num = wasm_value_type_cell_num(
+                            wasm_type->types[wasm_type->param_count - i - 1]);
+                        loader_ctx->frame_offset -= cell_num;
+#endif
                     }
                     }
                 }
                 }
 
 
@@ -5698,12 +5695,26 @@ re_scan:
                 /* Pass parameters to block */
                 /* Pass parameters to block */
                 if (BLOCK_HAS_PARAM(block_type)) {
                 if (BLOCK_HAS_PARAM(block_type)) {
                     for (i = 0; i < block_type.u.type->param_count; i++) {
                     for (i = 0; i < block_type.u.type->param_count; i++) {
-                        PUSH_TYPE(block_type.u.type->types[i]);
 #if WASM_ENABLE_FAST_INTERP != 0
 #if WASM_ENABLE_FAST_INTERP != 0
+                        uint32 cell_num = wasm_value_type_cell_num(
+                            block_type.u.type->types[i]);
                         if (i >= available_params) {
                         if (i >= available_params) {
-                            PUSH_OFFSET_TYPE(block_type.u.type->types[i]);
+                            /* If there isn't enough data on stack, push a dummy
+                             * offset to keep the stack consistent with
+                             * frame_ref.
+                             * Since the stack is already in polymorphic state,
+                             * the opcode will not be executed, so the dummy
+                             * offset won't cause any error */
+                            *loader_ctx->frame_offset++ = 0;
+                            if (cell_num > 1) {
+                                *loader_ctx->frame_offset++ = 0;
+                            }
+                        }
+                        else {
+                            loader_ctx->frame_offset += cell_num;
                         }
                         }
 #endif
 #endif
+                        PUSH_TYPE(block_type.u.type->types[i]);
                     }
                     }
                 }
                 }
 
 
@@ -5712,9 +5723,8 @@ re_scan:
                     skip_label();
                     skip_label();
                     if (BLOCK_HAS_PARAM(block_type)) {
                     if (BLOCK_HAS_PARAM(block_type)) {
                         /* Make sure params are in dynamic space */
                         /* Make sure params are in dynamic space */
-                        if (!copy_params_to_dynamic_space(loader_ctx, false,
-                                                          NULL, error_buf,
-                                                          error_buf_size))
+                        if (!copy_params_to_dynamic_space(
+                                loader_ctx, false, error_buf, error_buf_size))
                             goto fail;
                             goto fail;
                     }
                     }
                     if (opcode == WASM_OP_LOOP) {
                     if (opcode == WASM_OP_LOOP) {
@@ -5741,17 +5751,21 @@ re_scan:
                      * recover them before entering else branch.
                      * recover them before entering else branch.
                      *
                      *
                      */
                      */
-                    if (if_condition_available && BLOCK_HAS_PARAM(block_type)) {
+                    if (BLOCK_HAS_PARAM(block_type)) {
                         uint64 size;
                         uint64 size;
 
 
-                        /* skip the if condition operand offset */
-                        wasm_loader_emit_backspace(loader_ctx, sizeof(int16));
+                        /* In polymorphic state, there may be no if condition on
+                         * the stack, so the offset may not emitted */
+                        if (if_condition_available) {
+                            /* skip the if condition operand offset */
+                            wasm_loader_emit_backspace(loader_ctx,
+                                                       sizeof(int16));
+                        }
                         /* skip the if label */
                         /* skip the if label */
                         skip_label();
                         skip_label();
                         /* Emit a copy instruction */
                         /* Emit a copy instruction */
                         if (!copy_params_to_dynamic_space(
                         if (!copy_params_to_dynamic_space(
-                                loader_ctx, true, &block->available_param_num,
-                                error_buf, error_buf_size))
+                                loader_ctx, true, error_buf, error_buf_size))
                             goto fail;
                             goto fail;
 
 
                         /* Emit the if instruction */
                         /* Emit the if instruction */
@@ -5772,9 +5786,8 @@ re_scan:
                                         - size / sizeof(int16),
                                         - size / sizeof(int16),
                                     (uint32)size);
                                     (uint32)size);
                     }
                     }
-                    else {
-                        block->available_param_num = 0;
-                    }
+
+                    block->start_dynamic_offset = loader_ctx->dynamic_offset;
 
 
                     emit_empty_label_addr_and_frame_ip(PATCH_ELSE);
                     emit_empty_label_addr_and_frame_ip(PATCH_ELSE);
                     emit_empty_label_addr_and_frame_ip(PATCH_END);
                     emit_empty_label_addr_and_frame_ip(PATCH_END);
@@ -5818,21 +5831,13 @@ re_scan:
 
 
 #if WASM_ENABLE_FAST_INTERP != 0
 #if WASM_ENABLE_FAST_INTERP != 0
                 /* Recover top param_count values of frame_offset stack */
                 /* Recover top param_count values of frame_offset stack */
-                if (block->available_param_num) {
+                if (BLOCK_HAS_PARAM((block_type))) {
                     uint32 size;
                     uint32 size;
-                    size = sizeof(int16) * block->available_param_num;
+                    size = sizeof(int16) * block_type.u.type->param_cell_num;
                     bh_memcpy_s(loader_ctx->frame_offset, size,
                     bh_memcpy_s(loader_ctx->frame_offset, size,
                                 block->param_frame_offsets, size);
                                 block->param_frame_offsets, size);
                     loader_ctx->frame_offset += (size / sizeof(int16));
                     loader_ctx->frame_offset += (size / sizeof(int16));
-
-                    /* recover dynamic offset */
-                    for (i = 0; i < block->available_param_num; i++) {
-                        if (block->param_frame_offsets[i]
-                            >= loader_ctx->dynamic_offset) {
-                            loader_ctx->dynamic_offset =
-                                block->param_frame_offsets[i] + 1;
-                        }
-                    }
+                    loader_ctx->dynamic_offset = block->start_dynamic_offset;
                 }
                 }
 #endif
 #endif
 
 
@@ -6019,11 +6024,11 @@ re_scan:
                      idx--) {
                      idx--) {
                     ret_type = *(func->func_type->types
                     ret_type = *(func->func_type->types
                                  + func->func_type->param_count + idx);
                                  + func->func_type->param_count + idx);
-                    POP_TYPE(ret_type);
 #if WASM_ENABLE_FAST_INTERP != 0
 #if WASM_ENABLE_FAST_INTERP != 0
                     /* emit the offset after return opcode */
                     /* emit the offset after return opcode */
                     POP_OFFSET_TYPE(ret_type);
                     POP_OFFSET_TYPE(ret_type);
 #endif
 #endif
+                    POP_TYPE(ret_type);
                 }
                 }
 
 
                 RESET_STACK();
                 RESET_STACK();
@@ -6062,10 +6067,10 @@ re_scan:
                 if (func_type->param_count > 0) {
                 if (func_type->param_count > 0) {
                     for (idx = (int32)(func_type->param_count - 1); idx >= 0;
                     for (idx = (int32)(func_type->param_count - 1); idx >= 0;
                          idx--) {
                          idx--) {
-                        POP_TYPE(func_type->types[idx]);
 #if WASM_ENABLE_FAST_INTERP != 0
 #if WASM_ENABLE_FAST_INTERP != 0
                         POP_OFFSET_TYPE(func_type->types[idx]);
                         POP_OFFSET_TYPE(func_type->types[idx]);
 #endif
 #endif
+                        POP_TYPE(func_type->types[idx]);
                     }
                     }
                 }
                 }
 
 
@@ -6143,10 +6148,10 @@ re_scan:
                 if (func_type->param_count > 0) {
                 if (func_type->param_count > 0) {
                     for (idx = (int32)(func_type->param_count - 1); idx >= 0;
                     for (idx = (int32)(func_type->param_count - 1); idx >= 0;
                          idx--) {
                          idx--) {
-                        POP_TYPE(func_type->types[idx]);
 #if WASM_ENABLE_FAST_INTERP != 0
 #if WASM_ENABLE_FAST_INTERP != 0
                         POP_OFFSET_TYPE(func_type->types[idx]);
                         POP_OFFSET_TYPE(func_type->types[idx]);
 #endif
 #endif
+                        POP_TYPE(func_type->types[idx]);
                     }
                     }
                 }
                 }
 
 
@@ -7468,11 +7473,14 @@ re_scan:
 #if WASM_ENABLE_SHARED_MEMORY != 0
 #if WASM_ENABLE_SHARED_MEMORY != 0
             case WASM_OP_ATOMIC_PREFIX:
             case WASM_OP_ATOMIC_PREFIX:
             {
             {
-                opcode = read_uint8(p);
+                uint32 opcode1;
+
+                read_leb_uint32(p, p_end, opcode1);
+
 #if WASM_ENABLE_FAST_INTERP != 0
 #if WASM_ENABLE_FAST_INTERP != 0
-                emit_byte(loader_ctx, opcode);
+                emit_byte(loader_ctx, opcode1);
 #endif
 #endif
-                if (opcode != WASM_OP_ATOMIC_FENCE) {
+                if (opcode1 != WASM_OP_ATOMIC_FENCE) {
                     CHECK_MEMORY();
                     CHECK_MEMORY();
                     read_leb_uint32(p, p_end, align);      /* align */
                     read_leb_uint32(p, p_end, align);      /* align */
                     read_leb_uint32(p, p_end, mem_offset); /* offset */
                     read_leb_uint32(p, p_end, mem_offset); /* offset */
@@ -7483,7 +7491,7 @@ re_scan:
 #if WASM_ENABLE_JIT != 0 || WASM_ENABLE_WAMR_COMPILER != 0
 #if WASM_ENABLE_JIT != 0 || WASM_ENABLE_WAMR_COMPILER != 0
                 func->has_memory_operations = true;
                 func->has_memory_operations = true;
 #endif
 #endif
-                switch (opcode) {
+                switch (opcode1) {
                     case WASM_OP_ATOMIC_NOTIFY:
                     case WASM_OP_ATOMIC_NOTIFY:
                         POP2_AND_PUSH(VALUE_TYPE_I32, VALUE_TYPE_I32);
                         POP2_AND_PUSH(VALUE_TYPE_I32, VALUE_TYPE_I32);
                         break;
                         break;

+ 1 - 1
core/iwasm/interpreter/wasm_runtime.c

@@ -1061,7 +1061,7 @@ export_tags_instantiate(const WASMModule *module,
         if (export->kind == EXPORT_KIND_TAG) {
         if (export->kind == EXPORT_KIND_TAG) {
             export_tag->name = export->name;
             export_tag->name = export->name;
 
 
-            bh_assert((uint32)(module_inst->export_tags));
+            bh_assert(module_inst->e->tags);
 
 
             export_tag->tag = &module_inst->e->tags[export->index];
             export_tag->tag = &module_inst->e->tags[export->index];
             export_tag++;
             export_tag++;

+ 1 - 0
core/shared/platform/common/posix/posix_memmap.c

@@ -7,6 +7,7 @@
 
 
 #if defined(__APPLE__) || defined(__MACH__)
 #if defined(__APPLE__) || defined(__MACH__)
 #include <libkern/OSCacheControl.h>
 #include <libkern/OSCacheControl.h>
+#include <TargetConditionals.h>
 #endif
 #endif
 
 
 #ifndef BH_ENABLE_TRACE_MMAP
 #ifndef BH_ENABLE_TRACE_MMAP

+ 4 - 0
core/shared/platform/common/posix/posix_thread.c

@@ -9,6 +9,10 @@
 #include "platform_api_vmcore.h"
 #include "platform_api_vmcore.h"
 #include "platform_api_extension.h"
 #include "platform_api_extension.h"
 
 
+#if defined(__APPLE__) || defined(__MACH__)
+#include <TargetConditionals.h>
+#endif
+
 typedef struct {
 typedef struct {
     thread_start_routine_t start;
     thread_start_routine_t start;
     void *arg;
     void *arg;

+ 1 - 1
core/version.h

@@ -7,5 +7,5 @@
 #define _WAMR_VERSION_H_
 #define _WAMR_VERSION_H_
 #define WAMR_VERSION_MAJOR 1
 #define WAMR_VERSION_MAJOR 1
 #define WAMR_VERSION_MINOR 3
 #define WAMR_VERSION_MINOR 3
-#define WAMR_VERSION_PATCH 1
+#define WAMR_VERSION_PATCH 2
 #endif
 #endif

+ 1 - 1
tests/wamr-test-suites/test_wamr.sh

@@ -121,7 +121,7 @@ do
         ;;
         ;;
         m)
         m)
         echo "set compile target of wamr" ${OPTARG}
         echo "set compile target of wamr" ${OPTARG}
-        TARGET=${OPTARG^^} # set target to uppercase if input x86_32 or x86_64 --> X86_32 and X86_64
+        TARGET=$(echo "$OPTARG" | tr '[a-z]' '[A-Z]') # set target to uppercase if input x86_32 or x86_64 --> X86_32 and X86_64
         ;;
         ;;
         w)
         w)
         echo "enable WASI threads"
         echo "enable WASI threads"

+ 12 - 11
wamr-compiler/CMakeLists.txt

@@ -59,30 +59,31 @@ if (DEFINED WAMR_BUILD_AOT_FUNC_PREFIX)
 endif ()
 endif ()
 
 
 if (NOT WAMR_BUILD_TARGET)
 if (NOT WAMR_BUILD_TARGET)
-  if (CMAKE_HOST_SYSTEM_PROCESSOR STREQUAL "x86_64")
+  string(TOLOWER "${CMAKE_HOST_SYSTEM_PROCESSOR}" HOST_SYSTEM_PROCESSOR)
+  if (${HOST_SYSTEM_PROCESSOR} STREQUAL "x86_64")
     set (WAMR_BUILD_TARGET "X86_64")
     set (WAMR_BUILD_TARGET "X86_64")
-  elseif (CMAKE_HOST_SYSTEM_PROCESSOR STREQUAL "i686")
+  elseif (${HOST_SYSTEM_PROCESSOR} STREQUAL "i686")
     set (WAMR_BUILD_TARGET "X86_32")
     set (WAMR_BUILD_TARGET "X86_32")
-  elseif (CMAKE_HOST_SYSTEM_PROCESSOR STREQUAL "amd64")
+  elseif (${HOST_SYSTEM_PROCESSOR} STREQUAL "amd64")
     set (WAMR_BUILD_TARGET "AMD_64")
     set (WAMR_BUILD_TARGET "AMD_64")
-  elseif (CMAKE_HOST_SYSTEM_PROCESSOR STREQUAL "aarch64"
-          OR CMAKE_HOST_SYSTEM_PROCESSOR STREQUAL "arm64")
+  elseif (${HOST_SYSTEM_PROCESSOR} STREQUAL "aarch64"
+          OR ${HOST_SYSTEM_PROCESSOR} STREQUAL "arm64")
     set (WAMR_BUILD_TARGET "AARCH64")
     set (WAMR_BUILD_TARGET "AARCH64")
-  elseif (CMAKE_HOST_SYSTEM_PROCESSOR MATCHES "arm.*")
+  elseif (${HOST_SYSTEM_PROCESSOR} MATCHES "arm.*")
     message(STATUS "Assuming ${CMAKE_HOST_SYSTEM_PROCESSOR} as ARM_32")
     message(STATUS "Assuming ${CMAKE_HOST_SYSTEM_PROCESSOR} as ARM_32")
     set (WAMR_BUILD_TARGET "ARM_32")
     set (WAMR_BUILD_TARGET "ARM_32")
-  elseif (CMAKE_HOST_SYSTEM_PROCESSOR STREQUAL "mips")
+  elseif (${HOST_SYSTEM_PROCESSOR} STREQUAL "mips")
     set (WAMR_BUILD_TARGET "MIPS_32")
     set (WAMR_BUILD_TARGET "MIPS_32")
-  elseif (CMAKE_HOST_SYSTEM_PROCESSOR STREQUAL "xtensa")
+  elseif (${HOST_SYSTEM_PROCESSOR} STREQUAL "xtensa")
     set (WAMR_BUILD_TARGET "XTENSA_32")
     set (WAMR_BUILD_TARGET "XTENSA_32")
-  elseif (CMAKE_HOST_SYSTEM_PROCESSOR STREQUAL "riscv64")
+  elseif (${HOST_SYSTEM_PROCESSOR} STREQUAL "riscv64")
     set (WAMR_BUILD_TARGET "RISCV64")
     set (WAMR_BUILD_TARGET "RISCV64")
-  elseif (CMAKE_HOST_SYSTEM_PROCESSOR STREQUAL "riscv")
+  elseif (${HOST_SYSTEM_PROCESSOR} STREQUAL "riscv")
     message(STATUS "Assuming ${CMAKE_HOST_SYSTEM_PROCESSOR} as RISCV32")
     message(STATUS "Assuming ${CMAKE_HOST_SYSTEM_PROCESSOR} as RISCV32")
     set (WAMR_BUILD_TARGET "RISCV32")
     set (WAMR_BUILD_TARGET "RISCV32")
   else ()
   else ()
     message (FATAL_ERROR "Unsupported CMAKE_HOST_SYSTEM_PROCESSOR "
     message (FATAL_ERROR "Unsupported CMAKE_HOST_SYSTEM_PROCESSOR "
-    "${CMAKE_HOST_SYSTEM_PROCESSOR}")
+	                 "${CMAKE_HOST_SYSTEM_PROCESSOR}")
   endif()
   endif()
 
 
   if (WAMR_BUILD_PLATFORM STREQUAL "windows")
   if (WAMR_BUILD_PLATFORM STREQUAL "windows")

+ 4 - 2
wamr-compiler/main.c

@@ -627,8 +627,10 @@ main(int argc, char *argv[])
             goto fail1;
             goto fail1;
     }
     }
 
 
-    if (get_package_type(wasm_file, wasm_file_size) != Wasm_Module_Bytecode) {
-        printf("Invalid file type: expected wasm file but got other\n");
+    if (wasm_file_size >= 4 /* length of MAGIC NUMBER */
+        && get_package_type(wasm_file, wasm_file_size)
+               != Wasm_Module_Bytecode) {
+        printf("Invalid wasm file: magic header not detected\n");
         goto fail2;
         goto fail2;
     }
     }