Просмотр исходного кода

Update spec test to latest commit (#3293)

- Update spec test cases to commit bc76fd79cfe61033d7f4ad4a7e8fc4f996dc5ba8 on Apr. 3
- Update wabt binary to 1.0.34 to support newer spec cases
- Add comparison between table declared elem type and table elem segment value type
- Add a function to decide whether to execute test cases in a running mode
- Keep using interpreter in GC spec because wat2wasm in wabt can't compile if.wast w/o errors
- Re-factoring threads spec test case processing
- Since wabt 1.0.34 release isn't compatible with ubuntu 20.04, compile it from source code
- Disable CI to run aot multi-module temporarily, and will enable it in another PR
liang.he 1 год назад
Родитель
Сommit
b2eb7d838d

+ 11 - 7
.github/workflows/compilation_on_sgx.yml

@@ -269,23 +269,24 @@ jobs:
     strategy:
       matrix:
         running_mode: ["classic-interp", "fast-interp", "aot", "fast-jit"]
-        test_option: ["-x -p -s spec -b -P", "-x -p -s spec -S -b -P", "-x -p -s spec -X -b -P"]
+        # FIXME: use binary release(adding -b) instead of building from source after upgrading to 22.04
+        test_option: ["-x -p -s spec -P", "-x -p -s spec -S -P", "-x -p -s spec -X -P"]
         llvm_cache_key: ["${{ needs.build_llvm_libraries.outputs.cache_key }}"]
         exclude:
           # classic-interp, fast-interp and fast-jit don't support simd
           - running_mode: "classic-interp"
-            test_option: "-x -p -s spec -S -b -P"
+            test_option: "-x -p -s spec -S -P"
           - running_mode: "fast-interp"
-            test_option: "-x -p -s spec -S -b -P"
+            test_option: "-x -p -s spec -S -P"
           - running_mode: "fast-jit"
-            test_option: "-x -p -s spec -S -b -P"
+            test_option: "-x -p -s spec -S -P"
           # classic-interp, fast-interp and fast jit don't support XIP
           - running_mode: "classic-interp"
-            test_option: "-x -p -s spec -X -b -P"
+            test_option: "-x -p -s spec -X -P"
           - running_mode: "fast-interp"
-            test_option: "-x -p -s spec -X -b -P"
+            test_option: "-x -p -s spec -X -P"
           - running_mode: "fast-jit"
-            test_option: "-x -p -s spec -X -b -P"
+            test_option: "-x -p -s spec -X -P"
 
     steps:
       - name: checkout
@@ -320,6 +321,9 @@ jobs:
           sudo apt update
           sudo apt install -y libsgx-launch libsgx-urts
 
+      - name: install for wabt compilation
+        run: sudo apt update && sudo apt install -y ninja-build
+
       - name: run spec tests
         run: |
           source /opt/intel/sgxsdk/environment

+ 8 - 4
.github/workflows/nightly_run.yml

@@ -36,10 +36,11 @@ env:
   LLVM_EAGER_JIT_BUILD_OPTIONS: "-DWAMR_BUILD_AOT=1 -DWAMR_BUILD_FAST_INTERP=0 -DWAMR_BUILD_INTERP=0 -DWAMR_BUILD_FAST_JIT=0 -DWAMR_BUILD_JIT=1 -DWAMR_BUILD_LAZY_JIT=0"
   MULTI_TIER_JIT_BUILD_OPTIONS: "-DWAMR_BUILD_AOT=1 -DWAMR_BUILD_FAST_INTERP=0 -DWAMR_BUILD_INTERP=1 -DWAMR_BUILD_FAST_JIT=1 -DWAMR_BUILD_JIT=1 -DWAMR_BUILD_LAZY_JIT=1"
   # For Spec Test
-  DEFAULT_TEST_OPTIONS: "-s spec -b -P"
-  MULTI_MODULES_TEST_OPTIONS: "-s spec -b -M -P"
-  SIMD_TEST_OPTIONS: "-s spec -b -S -P"
-  THREADS_TEST_OPTIONS: "-s spec -b -p -P"
+  # FIXME: use binary release(adding -b) instead of building from source after upgrading to 22.04
+  DEFAULT_TEST_OPTIONS: "-s spec -P"
+  MULTI_MODULES_TEST_OPTIONS: "-s spec -M -P"
+  SIMD_TEST_OPTIONS: "-s spec -S -P"
+  THREADS_TEST_OPTIONS: "-s spec -p -P"
   X86_32_TARGET_TEST_OPTIONS: "-m x86_32 -P"
   WASI_TEST_OPTIONS: "-s wasi_certification -w"
 
@@ -719,6 +720,9 @@ jobs:
         if: matrix.running_mode == 'aot' && matrix.test_option == '$WASI_TEST_OPTIONS'
         run: sudo apt-get update && sudo apt install -y jq
 
+      - name: install for wabt compilation
+        run: sudo apt update && sudo apt install -y ninja-build
+
       - name: Build WASI thread tests
         if: matrix.test_option == '$WASI_TEST_OPTIONS'
         run: bash build.sh --sysroot "$SYSROOT_PATH"

+ 12 - 11
core/iwasm/aot/aot_runtime.c

@@ -120,7 +120,6 @@ check_global_init_expr(const AOTModule *module, uint32 global_index,
         return false;
     }
 
-#if WASM_ENABLE_GC == 0
     /**
      * Currently, constant expressions occurring as initializers of
      * globals are further constrained in that contained global.get
@@ -129,24 +128,26 @@ check_global_init_expr(const AOTModule *module, uint32 global_index,
      * And initializer expression cannot reference a mutable global.
      */
     if (global_index >= module->import_global_count
-        || module->import_globals->type.is_mutable) {
-        set_error_buf(error_buf, error_buf_size,
-                      "constant expression required");
-        return false;
-    }
-#else
-    if (global_index >= module->import_global_count + module->global_count) {
+    /* make spec test happy */
+#if WASM_ENABLE_GC != 0
+                            + module->global_count
+#endif
+    ) {
         set_error_buf_v(error_buf, error_buf_size, "unknown global %u",
                         global_index);
         return false;
     }
-    if (global_index < module->import_global_count
-        && module->import_globals[global_index].type.is_mutable) {
+
+    if (
+    /* make spec test happy */
+#if WASM_ENABLE_GC != 0
+        global_index < module->import_global_count &&
+#endif
+        module->import_globals[global_index].type.is_mutable) {
         set_error_buf(error_buf, error_buf_size,
                       "constant expression required");
         return false;
     }
-#endif
 
     return true;
 }

+ 77 - 24
core/iwasm/interpreter/wasm_loader.c

@@ -830,39 +830,35 @@ load_init_expr(WASMModule *module, const uint8 **p_buf, const uint8 *buf_end,
                 read_leb_uint32(p, p_end, cur_value.global_index);
                 global_idx = cur_value.global_index;
 
-#if WASM_ENABLE_GC == 0
-                if (global_idx >= module->import_global_count) {
-                    /**
-                     * Currently, constant expressions occurring as initializers
-                     * of globals are further constrained in that contained
-                     * global.get instructions are
-                     * only allowed to refer to imported globals.
-                     */
+                /*
+                 * Currently, constant expressions occurring as initializers
+                 * of globals are further constrained in that contained
+                 * global.get instructions are
+                 * only allowed to refer to imported globals.
+                 *
+                 * https://webassembly.github.io/spec/core/valid/instructions.html#constant-expressions
+                 */
+                if (global_idx >= module->import_global_count
+                /* make spec test happy */
+#if WASM_ENABLE_GC != 0
+                                      + module->global_count
+#endif
+                ) {
                     set_error_buf_v(error_buf, error_buf_size,
                                     "unknown global %u", global_idx);
                     goto fail;
                 }
-                if (module->import_globals[global_idx]
+                if (
+                /* make spec test happy */
+#if WASM_ENABLE_GC != 0
+                    global_idx < module->import_global_count &&
+#endif
+                    module->import_globals[global_idx]
                         .u.global.type.is_mutable) {
                     set_error_buf_v(error_buf, error_buf_size,
                                     "constant expression required");
                     goto fail;
                 }
-#else
-                if (global_idx
-                    >= module->import_global_count + module->global_count) {
-                    set_error_buf_v(error_buf, error_buf_size,
-                                    "unknown global %u", global_idx);
-                    goto fail;
-                }
-                if (global_idx < module->import_global_count
-                    && module->import_globals[global_idx]
-                           .u.global.type.is_mutable) {
-                    set_error_buf_v(error_buf, error_buf_size,
-                                    "constant expression required");
-                    goto fail;
-                }
-#endif
 
                 if (global_idx < module->import_global_count) {
                     global_type = module->import_globals[global_idx]
@@ -4244,6 +4240,43 @@ fail:
     return false;
 }
 
+/* Element segments must match element type of table */
+static bool
+check_table_elem_type(WASMModule *module, uint32 table_index,
+                      uint32 type_from_elem_seg, char *error_buf,
+                      uint32 error_buf_size)
+{
+    uint32 table_declared_elem_type;
+
+    if (table_index < module->import_table_count)
+        table_declared_elem_type =
+            module->import_tables[table_index].u.table.elem_type;
+    else
+        table_declared_elem_type = (module->tables + table_index)->elem_type;
+
+    if (table_declared_elem_type == type_from_elem_seg)
+        return true;
+
+#if WASM_ENABLE_GC != 0
+    /*
+     * balance in: anyref, funcref, (ref.null func) and (ref.func)
+     */
+    if (table_declared_elem_type == REF_TYPE_ANYREF)
+        return true;
+
+    if (table_declared_elem_type == VALUE_TYPE_FUNCREF
+        && type_from_elem_seg == REF_TYPE_HT_NON_NULLABLE)
+        return true;
+
+    if (table_declared_elem_type == REF_TYPE_HT_NULLABLE
+        && type_from_elem_seg == REF_TYPE_HT_NON_NULLABLE)
+        return true;
+#endif
+
+    set_error_buf(error_buf, error_buf_size, "type mismatch");
+    return false;
+}
+
 #if WASM_ENABLE_REF_TYPES != 0 || WASM_ENABLE_GC != 0
 static bool
 load_elem_type(WASMModule *module, const uint8 **p_buf, const uint8 *buf_end,
@@ -4479,6 +4512,12 @@ load_table_segment_section(const uint8 *buf, const uint8 *buf_end,
                             return false;
                     }
 
+                    if (!check_table_elem_type(module,
+                                               table_segment->table_index,
+                                               table_segment->elem_type,
+                                               error_buf, error_buf_size))
+                        return false;
+
                     break;
                 }
                 /* elemkind + passive/declarative */
@@ -4530,6 +4569,13 @@ load_table_segment_section(const uint8 *buf, const uint8 *buf_end,
                                                 error_buf_size))
                             return false;
                     }
+
+                    if (!check_table_elem_type(module,
+                                               table_segment->table_index,
+                                               table_segment->elem_type,
+                                               error_buf, error_buf_size))
+                        return false;
+
                     break;
                 case 5:
                 case 7:
@@ -4566,6 +4612,13 @@ load_table_segment_section(const uint8 *buf, const uint8 *buf_end,
             if (!load_func_index_vec(&p, p_end, module, table_segment,
                                      error_buf, error_buf_size))
                 return false;
+
+            table_segment->elem_type = VALUE_TYPE_FUNCREF;
+
+            if (!check_table_elem_type(module, table_segment->table_index,
+                                       table_segment->elem_type, error_buf,
+                                       error_buf_size))
+                return false;
 #endif /* end of WASM_ENABLE_REF_TYPES != 0 || WASM_ENABLE_GC != 0 */
 
 #if WASM_ENABLE_WAMR_COMPILER != 0

+ 8 - 0
core/iwasm/libraries/libc-builtin/libc_builtin_wrapper.c

@@ -1001,6 +1001,12 @@ print_i32_wrapper(wasm_exec_env_t exec_env, int32 i32)
     os_printf("in specttest.print_i32(%" PRId32 ")\n", i32);
 }
 
+static void
+print_i64_wrapper(wasm_exec_env_t exec_env, int64 i64)
+{
+    os_printf("in specttest.print_i64(%" PRId32 ")\n", i64);
+}
+
 static void
 print_i32_f32_wrapper(wasm_exec_env_t exec_env, int32 i32, float f32)
 {
@@ -1091,6 +1097,7 @@ static NativeSymbol native_symbols_libc_builtin[] = {
 static NativeSymbol native_symbols_spectest[] = {
     REG_NATIVE_FUNC(print, "()"),
     REG_NATIVE_FUNC(print_i32, "(i)"),
+    REG_NATIVE_FUNC(print_i64, "(I)"),
     REG_NATIVE_FUNC(print_i32_f32, "(if)"),
     REG_NATIVE_FUNC(print_f64_f64, "(FF)"),
     REG_NATIVE_FUNC(print_f32, "(f)"),
@@ -1136,6 +1143,7 @@ static WASMNativeGlobalDef native_global_defs[] = {
     { "test", "global-f32", VALUE_TYPE_F32, false, .value.f32 = 0 },
     { "test", "global-mut-i32", VALUE_TYPE_I32, true, .value.i32 = 0 },
     { "test", "global-mut-i64", VALUE_TYPE_I64, true, .value.i64 = 0 },
+    { "test", "g", VALUE_TYPE_I32, true, .value.i32 = 0 },
 #if WASM_ENABLE_GC != 0
     { "G", "g", VALUE_TYPE_I32, false, .value.i32 = 4 },
     { "M", "g", REF_TYPE_HT_NON_NULLABLE, false, .value.gc_obj = 0 },

+ 6 - 13
tests/wamr-test-suites/spec-test-script/all.py

@@ -47,7 +47,6 @@ IWASM_CMD = get_iwasm_cmd(PLATFORM_NAME)
 IWASM_SGX_CMD = "../../../product-mini/platforms/linux-sgx/enclave-sample/iwasm"
 IWASM_QEMU_CMD = "iwasm"
 SPEC_TEST_DIR = "spec/test/core"
-EXCE_HANDLING_DIR = "exception-handling/test/core"
 WAST2WASM_CMD = exe_file_path("./wabt/out/gcc/Release/wat2wasm")
 SPEC_INTERPRETER_CMD = "spec/interpreter/wasm"
 WAMRC_CMD = "../../../wamr-compiler/build/wamrc"
@@ -87,7 +86,7 @@ def ignore_the_case(
     if case_name in ["comments", "inline-module", "names"]:
         return True
 
-    if not multi_module_flag and case_name in ["imports", "linking"]:
+    if not multi_module_flag and case_name in ["imports", "linking", "simd_linking"]:
         return True
 
     # Note: x87 doesn't preserve sNaN and makes some relevant tests fail.
@@ -143,10 +142,6 @@ def preflight_check(aot_flag, eh_flag):
         print(f"Can not find {WAMRC_CMD}")
         return False
 
-    if eh_flag and not pathlib.Path(EXCE_HANDLING_DIR).resolve().exists():
-        print(f"Can not find {EXCE_HANDLING_DIR}")
-        return False
-
     return True
 
 
@@ -171,7 +166,7 @@ def test_case(
 ):
     CMD = [sys.executable, "runtest.py"]
     CMD.append("--wast2wasm")
-    CMD.append(WAST2WASM_CMD if not gc_flag and not memory64_flag else SPEC_INTERPRETER_CMD)
+    CMD.append(WAST2WASM_CMD if not gc_flag else SPEC_INTERPRETER_CMD)
     CMD.append("--interpreter")
     if sgx_flag:
         CMD.append(IWASM_SGX_CMD)
@@ -310,11 +305,7 @@ def test_suite(
         case_list.extend(gc_case_list)
 
     if eh_flag:
-        eh_path = pathlib.Path(EXCE_HANDLING_DIR).resolve()
-        if not eh_path.exists():
-            print(f"can not find spec test cases at {eh_path}")
-            return False
-        eh_case_list = sorted(eh_path.glob("*.wast"))
+        eh_case_list = sorted(suite_path.glob("*.wast"))
         eh_case_list_include = [test for test in eh_case_list if test.stem in ["throw", "tag", "try_catch", "rethrow", "try_delegate"]]
         case_list.extend(eh_case_list_include)
 
@@ -337,7 +328,9 @@ def test_suite(
             qemu_flag,
         ):
             filtered_case_list.append(case_path)
-    print(f"---> {len(case_list)} --filter--> {len(filtered_case_list)}")
+        else:
+            print(f"---> skip {case_name}")
+    print(f"---> {len(case_list)} ---filter--> {len(filtered_case_list)}")
     case_list = filtered_case_list
 
     case_count = len(case_list)

+ 533 - 5
tests/wamr-test-suites/spec-test-script/exception_handling.patch

@@ -1,20 +1,548 @@
+diff --git a/test/core/data.wast b/test/core/data.wast
+index b1e1239..a0f6967 100644
+--- a/test/core/data.wast
++++ b/test/core/data.wast
+@@ -312,7 +312,8 @@
+     "\02\01\41\00\0b"                       ;; active data segment 0 for memory 1
+     "\00"                                   ;; empty vec(byte)
+   )
+-  "unknown memory 1"
++  ;; TODO: restore after supporting multi memory"
++  "unknown memory"
+ )
+
+ ;; Data segment with memory index 0 (no memory section)
+@@ -334,7 +335,8 @@
+     "\02\01\41\00\0b"                       ;; active data segment 0 for memory 1
+     "\00"                                   ;; empty vec(byte)
+   )
+-  "unknown memory 1"
++  ;; TODO: restore after supporting multi memory"
++  "unknown memory"
+ )
+
+ ;; Data segment with memory index 1 and vec(byte) as above,
+@@ -354,7 +356,8 @@
+     "\20\21\22\23\24\25\26\27\28\29\2a\2b\2c\2d\2e\2f"
+     "\30\31\32\33\34\35\36\37\38\39\3a\3b\3c\3d"
+   )
+-  "unknown memory 1"
++  ;; TODO: restore after supporting multi memory"
++  "unknown memory"
+ )
+
+ ;; Data segment with memory index 1 and specially crafted vec(byte) after.
+@@ -374,7 +377,8 @@
+     "\20\21\22\23\24\25\26\27\28\29\2a\2b\2c\2d\2e\2f"
+     "\30\31\32\33\34\35\36\37\38\39\3a\3b\3c\3d"
+   )
+-  "unknown memory 1"
++  ;; TODO: restore after supporting multi memory"
++  "unknown memory"
+ )
+
+
+diff --git a/test/core/elem.wast b/test/core/elem.wast
+index 33b3f67..c72431c 100644
+--- a/test/core/elem.wast
++++ b/test/core/elem.wast
+@@ -595,9 +595,11 @@
+   (func $const-i32-d (type $out-i32) (i32.const 68))
+ )
+
++(;
+ (assert_return (invoke $module1 "call-7") (i32.const 67))
+ (assert_return (invoke $module1 "call-8") (i32.const 68))
+ (assert_return (invoke $module1 "call-9") (i32.const 66))
++;)
+
+ (module $module3
+   (type $out-i32 (func (result i32)))
+@@ -608,9 +610,11 @@
+   (func $const-i32-f (type $out-i32) (i32.const 70))
+ )
+
++(;
+ (assert_return (invoke $module1 "call-7") (i32.const 67))
+ (assert_return (invoke $module1 "call-8") (i32.const 69))
+ (assert_return (invoke $module1 "call-9") (i32.const 70))
++;)
+
+ ;; Element segments must match element type of table
+
+@@ -643,6 +647,7 @@
+
+ ;; Initializing a table with an externref-type element segment
+
++(;
+ (module $m
+ 	(table $t (export "table") 2 externref)
+ 	(func (export "get") (param $i i32) (result externref)
+@@ -667,9 +672,11 @@
+
+ (assert_return (invoke $m "get" (i32.const 0)) (ref.null extern))
+ (assert_return (invoke $m "get" (i32.const 1)) (ref.extern 137))
++;)
+
+ ;; Initializing a table with imported funcref global
+
++(;
+ (module $module4
+   (func (result i32)
+     i32.const 42
+@@ -690,3 +697,4 @@
+ )
+
+ (assert_return (invoke "call_imported_elem") (i32.const 42))
++;)
+\ No newline at end of file
 diff --git a/test/core/try_catch.wast b/test/core/try_catch.wast
 index 2a0e9ff6..f243489d 100644
 --- a/test/core/try_catch.wast
 +++ b/test/core/try_catch.wast
 @@ -203,7 +203,6 @@
- 
+
  (assert_return (invoke "catch-param-i32" (i32.const 5)) (i32.const 5))
- 
+
 -(assert_return (invoke "catch-imported") (i32.const 2))
- 
+
  (assert_return (invoke "catchless-try" (i32.const 0)) (i32.const 0))
  (assert_return (invoke "catchless-try" (i32.const 1)) (i32.const 1))
 @@ -231,7 +230,6 @@
    )
  )
- 
+
 -(assert_return (invoke "imported-mismatch") (i32.const 3))
- 
+
  (assert_malformed
    (module quote "(module (func (catch_all)))")
+
+diff --git a/test/core/ref_func.wast b/test/core/ref_func.wast
+index adb5cb7..6396013 100644
+--- a/test/core/ref_func.wast
++++ b/test/core/ref_func.wast
+@@ -4,7 +4,7 @@
+ (register "M")
+
+ (module
+-  (func $f (import "M" "f") (param i32) (result i32))
++  (func $f (param $x i32) (result i32) (local.get $x))
+   (func $g (param $x i32) (result i32)
+     (i32.add (local.get $x) (i32.const 1))
+   )
+diff --git a/test/core/table_copy.wast b/test/core/table_copy.wast
+index 380e84e..59230cf 100644
+--- a/test/core/table_copy.wast
++++ b/test/core/table_copy.wast
+@@ -14,11 +14,11 @@
+
+ (module
+   (type (func (result i32)))  ;; type #0
+-  (import "a" "ef0" (func (result i32)))    ;; index 0
+-  (import "a" "ef1" (func (result i32)))
+-  (import "a" "ef2" (func (result i32)))
+-  (import "a" "ef3" (func (result i32)))
+-  (import "a" "ef4" (func (result i32)))    ;; index 4
++  (func (result i32) (i32.const 0))    ;; index 0
++  (func (result i32) (i32.const 1))
++  (func (result i32) (i32.const 2))
++  (func (result i32) (i32.const 3))
++  (func (result i32) (i32.const 4))    ;; index 4
+   (table $t0 30 30 funcref)
+   (table $t1 30 30 funcref)
+   (elem (table $t0) (i32.const 2) func 3 1 4 1)
+@@ -106,11 +106,11 @@
+
+ (module
+   (type (func (result i32)))  ;; type #0
+-  (import "a" "ef0" (func (result i32)))    ;; index 0
+-  (import "a" "ef1" (func (result i32)))
+-  (import "a" "ef2" (func (result i32)))
+-  (import "a" "ef3" (func (result i32)))
+-  (import "a" "ef4" (func (result i32)))    ;; index 4
++  (func (result i32) (i32.const 0))    ;; index 0
++  (func (result i32) (i32.const 1))
++  (func (result i32) (i32.const 2))
++  (func (result i32) (i32.const 3))
++  (func (result i32) (i32.const 4))    ;; index 4
+   (table $t0 30 30 funcref)
+   (table $t1 30 30 funcref)
+   (elem (table $t0) (i32.const 2) func 3 1 4 1)
+@@ -198,11 +198,11 @@
+
+ (module
+   (type (func (result i32)))  ;; type #0
+-  (import "a" "ef0" (func (result i32)))    ;; index 0
+-  (import "a" "ef1" (func (result i32)))
+-  (import "a" "ef2" (func (result i32)))
+-  (import "a" "ef3" (func (result i32)))
+-  (import "a" "ef4" (func (result i32)))    ;; index 4
++  (func (result i32) (i32.const 0))    ;; index 0
++  (func (result i32) (i32.const 1))
++  (func (result i32) (i32.const 2))
++  (func (result i32) (i32.const 3))
++  (func (result i32) (i32.const 4))    ;; index 4
+   (table $t0 30 30 funcref)
+   (table $t1 30 30 funcref)
+   (elem (table $t0) (i32.const 2) func 3 1 4 1)
+@@ -290,11 +290,11 @@
+
+ (module
+   (type (func (result i32)))  ;; type #0
+-  (import "a" "ef0" (func (result i32)))    ;; index 0
+-  (import "a" "ef1" (func (result i32)))
+-  (import "a" "ef2" (func (result i32)))
+-  (import "a" "ef3" (func (result i32)))
+-  (import "a" "ef4" (func (result i32)))    ;; index 4
++  (func (result i32) (i32.const 0))    ;; index 0
++  (func (result i32) (i32.const 1))
++  (func (result i32) (i32.const 2))
++  (func (result i32) (i32.const 3))
++  (func (result i32) (i32.const 4))    ;; index 4
+   (table $t0 30 30 funcref)
+   (table $t1 30 30 funcref)
+   (elem (table $t0) (i32.const 2) func 3 1 4 1)
+@@ -382,11 +382,11 @@
+
+ (module
+   (type (func (result i32)))  ;; type #0
+-  (import "a" "ef0" (func (result i32)))    ;; index 0
+-  (import "a" "ef1" (func (result i32)))
+-  (import "a" "ef2" (func (result i32)))
+-  (import "a" "ef3" (func (result i32)))
+-  (import "a" "ef4" (func (result i32)))    ;; index 4
++  (func (result i32) (i32.const 0))    ;; index 0
++  (func (result i32) (i32.const 1))
++  (func (result i32) (i32.const 2))
++  (func (result i32) (i32.const 3))
++  (func (result i32) (i32.const 4))    ;; index 4
+   (table $t0 30 30 funcref)
+   (table $t1 30 30 funcref)
+   (elem (table $t0) (i32.const 2) func 3 1 4 1)
+@@ -474,11 +474,11 @@
+
+ (module
+   (type (func (result i32)))  ;; type #0
+-  (import "a" "ef0" (func (result i32)))    ;; index 0
+-  (import "a" "ef1" (func (result i32)))
+-  (import "a" "ef2" (func (result i32)))
+-  (import "a" "ef3" (func (result i32)))
+-  (import "a" "ef4" (func (result i32)))    ;; index 4
++  (func (result i32) (i32.const 0))    ;; index 0
++  (func (result i32) (i32.const 1))
++  (func (result i32) (i32.const 2))
++  (func (result i32) (i32.const 3))
++  (func (result i32) (i32.const 4))    ;; index 4
+   (table $t0 30 30 funcref)
+   (table $t1 30 30 funcref)
+   (elem (table $t0) (i32.const 2) func 3 1 4 1)
+@@ -566,11 +566,11 @@
+
+ (module
+   (type (func (result i32)))  ;; type #0
+-  (import "a" "ef0" (func (result i32)))    ;; index 0
+-  (import "a" "ef1" (func (result i32)))
+-  (import "a" "ef2" (func (result i32)))
+-  (import "a" "ef3" (func (result i32)))
+-  (import "a" "ef4" (func (result i32)))    ;; index 4
++  (func (result i32) (i32.const 0))    ;; index 0
++  (func (result i32) (i32.const 1))
++  (func (result i32) (i32.const 2))
++  (func (result i32) (i32.const 3))
++  (func (result i32) (i32.const 4))    ;; index 4
+   (table $t0 30 30 funcref)
+   (table $t1 30 30 funcref)
+   (elem (table $t0) (i32.const 2) func 3 1 4 1)
+@@ -658,11 +658,11 @@
+
+ (module
+   (type (func (result i32)))  ;; type #0
+-  (import "a" "ef0" (func (result i32)))    ;; index 0
+-  (import "a" "ef1" (func (result i32)))
+-  (import "a" "ef2" (func (result i32)))
+-  (import "a" "ef3" (func (result i32)))
+-  (import "a" "ef4" (func (result i32)))    ;; index 4
++  (func (result i32) (i32.const 0))    ;; index 0
++  (func (result i32) (i32.const 1))
++  (func (result i32) (i32.const 2))
++  (func (result i32) (i32.const 3))
++  (func (result i32) (i32.const 4))    ;; index 4
+   (table $t0 30 30 funcref)
+   (table $t1 30 30 funcref)
+   (elem (table $t0) (i32.const 2) func 3 1 4 1)
+@@ -750,11 +750,11 @@
+
+ (module
+   (type (func (result i32)))  ;; type #0
+-  (import "a" "ef0" (func (result i32)))    ;; index 0
+-  (import "a" "ef1" (func (result i32)))
+-  (import "a" "ef2" (func (result i32)))
+-  (import "a" "ef3" (func (result i32)))
+-  (import "a" "ef4" (func (result i32)))    ;; index 4
++  (func (result i32) (i32.const 0))    ;; index 0
++  (func (result i32) (i32.const 1))
++  (func (result i32) (i32.const 2))
++  (func (result i32) (i32.const 3))
++  (func (result i32) (i32.const 4))    ;; index 4
+   (table $t0 30 30 funcref)
+   (table $t1 30 30 funcref)
+   (elem (table $t0) (i32.const 2) func 3 1 4 1)
+@@ -842,11 +842,11 @@
+
+ (module
+   (type (func (result i32)))  ;; type #0
+-  (import "a" "ef0" (func (result i32)))    ;; index 0
+-  (import "a" "ef1" (func (result i32)))
+-  (import "a" "ef2" (func (result i32)))
+-  (import "a" "ef3" (func (result i32)))
+-  (import "a" "ef4" (func (result i32)))    ;; index 4
++  (func (result i32) (i32.const 0))    ;; index 0
++  (func (result i32) (i32.const 1))
++  (func (result i32) (i32.const 2))
++  (func (result i32) (i32.const 3))
++  (func (result i32) (i32.const 4))    ;; index 4
+   (table $t0 30 30 funcref)
+   (table $t1 30 30 funcref)
+   (elem (table $t1) (i32.const 2) func 3 1 4 1)
+@@ -934,11 +934,11 @@
+
+ (module
+   (type (func (result i32)))  ;; type #0
+-  (import "a" "ef0" (func (result i32)))    ;; index 0
+-  (import "a" "ef1" (func (result i32)))
+-  (import "a" "ef2" (func (result i32)))
+-  (import "a" "ef3" (func (result i32)))
+-  (import "a" "ef4" (func (result i32)))    ;; index 4
++  (func (result i32) (i32.const 0))    ;; index 0
++  (func (result i32) (i32.const 1))
++  (func (result i32) (i32.const 2))
++  (func (result i32) (i32.const 3))
++  (func (result i32) (i32.const 4))    ;; index 4
+   (table $t0 30 30 funcref)
+   (table $t1 30 30 funcref)
+   (elem (table $t1) (i32.const 2) func 3 1 4 1)
+@@ -1026,11 +1026,11 @@
+
+ (module
+   (type (func (result i32)))  ;; type #0
+-  (import "a" "ef0" (func (result i32)))    ;; index 0
+-  (import "a" "ef1" (func (result i32)))
+-  (import "a" "ef2" (func (result i32)))
+-  (import "a" "ef3" (func (result i32)))
+-  (import "a" "ef4" (func (result i32)))    ;; index 4
++  (func (result i32) (i32.const 0))    ;; index 0
++  (func (result i32) (i32.const 1))
++  (func (result i32) (i32.const 2))
++  (func (result i32) (i32.const 3))
++  (func (result i32) (i32.const 4))    ;; index 4
+   (table $t0 30 30 funcref)
+   (table $t1 30 30 funcref)
+   (elem (table $t1) (i32.const 2) func 3 1 4 1)
+@@ -1118,11 +1118,11 @@
+
+ (module
+   (type (func (result i32)))  ;; type #0
+-  (import "a" "ef0" (func (result i32)))    ;; index 0
+-  (import "a" "ef1" (func (result i32)))
+-  (import "a" "ef2" (func (result i32)))
+-  (import "a" "ef3" (func (result i32)))
+-  (import "a" "ef4" (func (result i32)))    ;; index 4
++  (func (result i32) (i32.const 0))    ;; index 0
++  (func (result i32) (i32.const 1))
++  (func (result i32) (i32.const 2))
++  (func (result i32) (i32.const 3))
++  (func (result i32) (i32.const 4))    ;; index 4
+   (table $t0 30 30 funcref)
+   (table $t1 30 30 funcref)
+   (elem (table $t1) (i32.const 2) func 3 1 4 1)
+@@ -1210,11 +1210,11 @@
+
+ (module
+   (type (func (result i32)))  ;; type #0
+-  (import "a" "ef0" (func (result i32)))    ;; index 0
+-  (import "a" "ef1" (func (result i32)))
+-  (import "a" "ef2" (func (result i32)))
+-  (import "a" "ef3" (func (result i32)))
+-  (import "a" "ef4" (func (result i32)))    ;; index 4
++  (func (result i32) (i32.const 0))    ;; index 0
++  (func (result i32) (i32.const 1))
++  (func (result i32) (i32.const 2))
++  (func (result i32) (i32.const 3))
++  (func (result i32) (i32.const 4))    ;; index 4
+   (table $t0 30 30 funcref)
+   (table $t1 30 30 funcref)
+   (elem (table $t1) (i32.const 2) func 3 1 4 1)
+@@ -1302,11 +1302,11 @@
+
+ (module
+   (type (func (result i32)))  ;; type #0
+-  (import "a" "ef0" (func (result i32)))    ;; index 0
+-  (import "a" "ef1" (func (result i32)))
+-  (import "a" "ef2" (func (result i32)))
+-  (import "a" "ef3" (func (result i32)))
+-  (import "a" "ef4" (func (result i32)))    ;; index 4
++  (func (result i32) (i32.const 0))    ;; index 0
++  (func (result i32) (i32.const 1))
++  (func (result i32) (i32.const 2))
++  (func (result i32) (i32.const 3))
++  (func (result i32) (i32.const 4))    ;; index 4
+   (table $t0 30 30 funcref)
+   (table $t1 30 30 funcref)
+   (elem (table $t1) (i32.const 2) func 3 1 4 1)
+@@ -1394,11 +1394,11 @@
+
+ (module
+   (type (func (result i32)))  ;; type #0
+-  (import "a" "ef0" (func (result i32)))    ;; index 0
+-  (import "a" "ef1" (func (result i32)))
+-  (import "a" "ef2" (func (result i32)))
+-  (import "a" "ef3" (func (result i32)))
+-  (import "a" "ef4" (func (result i32)))    ;; index 4
++  (func (result i32) (i32.const 0))    ;; index 0
++  (func (result i32) (i32.const 1))
++  (func (result i32) (i32.const 2))
++  (func (result i32) (i32.const 3))
++  (func (result i32) (i32.const 4))    ;; index 4
+   (table $t0 30 30 funcref)
+   (table $t1 30 30 funcref)
+   (elem (table $t1) (i32.const 2) func 3 1 4 1)
+@@ -1486,11 +1486,11 @@
+
+ (module
+   (type (func (result i32)))  ;; type #0
+-  (import "a" "ef0" (func (result i32)))    ;; index 0
+-  (import "a" "ef1" (func (result i32)))
+-  (import "a" "ef2" (func (result i32)))
+-  (import "a" "ef3" (func (result i32)))
+-  (import "a" "ef4" (func (result i32)))    ;; index 4
++  (func (result i32) (i32.const 0))    ;; index 0
++  (func (result i32) (i32.const 1))
++  (func (result i32) (i32.const 2))
++  (func (result i32) (i32.const 3))
++  (func (result i32) (i32.const 4))    ;; index 4
+   (table $t0 30 30 funcref)
+   (table $t1 30 30 funcref)
+   (elem (table $t1) (i32.const 2) func 3 1 4 1)
+@@ -1578,11 +1578,11 @@
+
+ (module
+   (type (func (result i32)))  ;; type #0
+-  (import "a" "ef0" (func (result i32)))    ;; index 0
+-  (import "a" "ef1" (func (result i32)))
+-  (import "a" "ef2" (func (result i32)))
+-  (import "a" "ef3" (func (result i32)))
+-  (import "a" "ef4" (func (result i32)))    ;; index 4
++  (func (result i32) (i32.const 0))    ;; index 0
++  (func (result i32) (i32.const 1))
++  (func (result i32) (i32.const 2))
++  (func (result i32) (i32.const 3))
++  (func (result i32) (i32.const 4))    ;; index 4
+   (table $t0 30 30 funcref)
+   (table $t1 30 30 funcref)
+   (elem (table $t1) (i32.const 2) func 3 1 4 1)
+diff --git a/test/core/table_init.wast b/test/core/table_init.wast
+index 0b2d26f..3c595e5 100644
+--- a/test/core/table_init.wast
++++ b/test/core/table_init.wast
+@@ -14,11 +14,11 @@
+
+ (module
+   (type (func (result i32)))  ;; type #0
+-  (import "a" "ef0" (func (result i32)))    ;; index 0
+-  (import "a" "ef1" (func (result i32)))
+-  (import "a" "ef2" (func (result i32)))
+-  (import "a" "ef3" (func (result i32)))
+-  (import "a" "ef4" (func (result i32)))    ;; index 4
++  (func (result i32) (i32.const 0))    ;; index 0
++  (func (result i32) (i32.const 1))
++  (func (result i32) (i32.const 2))
++  (func (result i32) (i32.const 3))
++  (func (result i32) (i32.const 4))    ;; index 4
+   (table $t0 30 30 funcref)
+   (table $t1 30 30 funcref)
+   (elem (table $t0) (i32.const 2) func 3 1 4 1)
+@@ -72,11 +72,11 @@
+
+ (module
+   (type (func (result i32)))  ;; type #0
+-  (import "a" "ef0" (func (result i32)))    ;; index 0
+-  (import "a" "ef1" (func (result i32)))
+-  (import "a" "ef2" (func (result i32)))
+-  (import "a" "ef3" (func (result i32)))
+-  (import "a" "ef4" (func (result i32)))    ;; index 4
++  (func (result i32) (i32.const 0))    ;; index 0
++  (func (result i32) (i32.const 1))
++  (func (result i32) (i32.const 2))
++  (func (result i32) (i32.const 3))
++  (func (result i32) (i32.const 4))    ;; index 4
+   (table $t0 30 30 funcref)
+   (table $t1 30 30 funcref)
+   (elem (table $t0) (i32.const 2) func 3 1 4 1)
+@@ -130,11 +130,11 @@
+
+ (module
+   (type (func (result i32)))  ;; type #0
+-  (import "a" "ef0" (func (result i32)))    ;; index 0
+-  (import "a" "ef1" (func (result i32)))
+-  (import "a" "ef2" (func (result i32)))
+-  (import "a" "ef3" (func (result i32)))
+-  (import "a" "ef4" (func (result i32)))    ;; index 4
++  (func (result i32) (i32.const 0))    ;; index 0
++  (func (result i32) (i32.const 1))
++  (func (result i32) (i32.const 2))
++  (func (result i32) (i32.const 3))
++  (func (result i32) (i32.const 4))    ;; index 4
+   (table $t0 30 30 funcref)
+   (table $t1 30 30 funcref)
+   (elem (table $t0) (i32.const 2) func 3 1 4 1)
+@@ -196,11 +196,11 @@
+
+ (module
+   (type (func (result i32)))  ;; type #0
+-  (import "a" "ef0" (func (result i32)))    ;; index 0
+-  (import "a" "ef1" (func (result i32)))
+-  (import "a" "ef2" (func (result i32)))
+-  (import "a" "ef3" (func (result i32)))
+-  (import "a" "ef4" (func (result i32)))    ;; index 4
++  (func (result i32) (i32.const 0))    ;; index 0
++  (func (result i32) (i32.const 1))
++  (func (result i32) (i32.const 2))
++  (func (result i32) (i32.const 3))
++  (func (result i32) (i32.const 4))    ;; index 4
+   (table $t0 30 30 funcref)
+   (table $t1 30 30 funcref)
+   (elem (table $t1) (i32.const 2) func 3 1 4 1)
+@@ -254,11 +254,11 @@
+
+ (module
+   (type (func (result i32)))  ;; type #0
+-  (import "a" "ef0" (func (result i32)))    ;; index 0
+-  (import "a" "ef1" (func (result i32)))
+-  (import "a" "ef2" (func (result i32)))
+-  (import "a" "ef3" (func (result i32)))
+-  (import "a" "ef4" (func (result i32)))    ;; index 4
++  (func (result i32) (i32.const 0))    ;; index 0
++  (func (result i32) (i32.const 1))
++  (func (result i32) (i32.const 2))
++  (func (result i32) (i32.const 3))
++  (func (result i32) (i32.const 4))    ;; index 4
+   (table $t0 30 30 funcref)
+   (table $t1 30 30 funcref)
+   (elem (table $t1) (i32.const 2) func 3 1 4 1)
+@@ -312,11 +312,11 @@
+
+ (module
+   (type (func (result i32)))  ;; type #0
+-  (import "a" "ef0" (func (result i32)))    ;; index 0
+-  (import "a" "ef1" (func (result i32)))
+-  (import "a" "ef2" (func (result i32)))
+-  (import "a" "ef3" (func (result i32)))
+-  (import "a" "ef4" (func (result i32)))    ;; index 4
++  (func (result i32) (i32.const 0))    ;; index 0
++  (func (result i32) (i32.const 1))
++  (func (result i32) (i32.const 2))
++  (func (result i32) (i32.const 3))
++  (func (result i32) (i32.const 4))    ;; index 4
+   (table $t0 30 30 funcref)
+   (table $t1 30 30 funcref)
+   (elem (table $t1) (i32.const 2) func 3 1 4 1)

+ 91 - 333
tests/wamr-test-suites/spec-test-script/ignore_cases.patch

@@ -1,120 +1,52 @@
-diff --git a/test/core/binary.wast b/test/core/binary.wast
-index 891aad3..07356a3 100644
---- a/test/core/binary.wast
-+++ b/test/core/binary.wast
-@@ -206,7 +206,7 @@
- )
- 
- ;; Type section with signed LEB128 encoded type
--(assert_malformed
-+(;assert_malformed
-   (module binary
-     "\00asm" "\01\00\00\00"
-     "\01"                     ;; Type section id
-@@ -216,7 +216,7 @@
-     "\00\00"
-   )
-   "integer representation too long"
--)
-+;)
- 
- ;; Unsigned LEB128 must not be overlong
- (assert_malformed
-@@ -1683,7 +1683,7 @@
- )
- 
- ;; 2 elem segment declared, 1 given
--(assert_malformed
-+(;assert_malformed
-   (module binary
-     "\00asm" "\01\00\00\00"
-     "\01\04\01"                             ;; type section
-@@ -1696,7 +1696,7 @@
-     ;; "\00\41\00\0b\01\00"                 ;; elem 1 (missed)
-   )
-   "unexpected end"
--)
-+;)
- 
- ;; 2 elem segment declared, 1.5 given
- (assert_malformed
-@@ -1813,7 +1813,7 @@
- )
- 
- ;; 1 br_table target declared, 2 given
--(assert_malformed
-+(;assert_malformed
-   (module binary
-     "\00asm" "\01\00\00\00"
-     "\01\04\01"                             ;; type section
-@@ -1832,7 +1832,7 @@
-     "\0b\0b\0b"                             ;; end
-   )
-   "unexpected end"
--)
-+;)
- 
- ;; Start section
- (module binary
 diff --git a/test/core/data.wast b/test/core/data.wast
-index 4f339be..0b5b3e6 100644
+index b1e1239..a0f6967 100644
 --- a/test/core/data.wast
 +++ b/test/core/data.wast
-@@ -306,9 +306,10 @@
+@@ -312,7 +312,8 @@
      "\02\01\41\00\0b"                       ;; active data segment 0 for memory 1
      "\00"                                   ;; empty vec(byte)
    )
 -  "unknown memory 1"
++  ;; TODO: restore after supporting multi memory"
 +  "unknown memory"
  )
  
-+(; not supported by wat2wasm
  ;; Data segment with memory index 0 (no memory section)
- (assert_invalid
-   (module binary
-@@ -317,7 +318,7 @@
-     "\00\41\00\0b"                          ;; active data segment 0 for memory 0
-     "\00"                                   ;; empty vec(byte)
-   )
--  "unknown memory 0"
-+  "unknown memory"
- )
- 
- ;; Data segment with memory index 1 (no memory section)
-@@ -328,7 +329,7 @@
+@@ -334,7 +335,8 @@
      "\02\01\41\00\0b"                       ;; active data segment 0 for memory 1
      "\00"                                   ;; empty vec(byte)
    )
 -  "unknown memory 1"
++  ;; TODO: restore after supporting multi memory"
 +  "unknown memory"
  )
  
  ;; Data segment with memory index 1 and vec(byte) as above,
-@@ -348,7 +349,7 @@
+@@ -354,7 +356,8 @@
      "\20\21\22\23\24\25\26\27\28\29\2a\2b\2c\2d\2e\2f"
      "\30\31\32\33\34\35\36\37\38\39\3a\3b\3c\3d"
    )
 -  "unknown memory 1"
++  ;; TODO: restore after supporting multi memory"
 +  "unknown memory"
  )
  
  ;; Data segment with memory index 1 and specially crafted vec(byte) after.
-@@ -368,8 +369,9 @@
+@@ -374,7 +377,8 @@
      "\20\21\22\23\24\25\26\27\28\29\2a\2b\2c\2d\2e\2f"
      "\30\31\32\33\34\35\36\37\38\39\3a\3b\3c\3d"
    )
 -  "unknown memory 1"
++  ;; TODO: restore after supporting multi memory"
 +  "unknown memory"
  )
-+;)
  
  
- ;; Invalid offsets
 diff --git a/test/core/elem.wast b/test/core/elem.wast
-index 575ecef..6eecab9 100644
+index 33b3f67..c72431c 100644
 --- a/test/core/elem.wast
 +++ b/test/core/elem.wast
-@@ -571,9 +571,11 @@
+@@ -595,9 +595,11 @@
    (func $const-i32-d (type $out-i32) (i32.const 68))
  )
  
@@ -126,7 +58,7 @@ index 575ecef..6eecab9 100644
  
  (module $module3
    (type $out-i32 (func (result i32)))
-@@ -584,6 +586,8 @@
+@@ -608,9 +610,11 @@
    (func $const-i32-f (type $out-i32) (i32.const 70))
  )
  
@@ -135,219 +67,69 @@ index 575ecef..6eecab9 100644
  (assert_return (invoke $module1 "call-8") (i32.const 69))
  (assert_return (invoke $module1 "call-9") (i32.const 70))
 +;)
-diff --git a/test/core/global.wast b/test/core/global.wast
-index 9fa5e22..8c4b949 100644
---- a/test/core/global.wast
-+++ b/test/core/global.wast
-@@ -328,10 +328,12 @@
-   "type mismatch"
- )
  
-+(;
- (assert_invalid
-   (module (global (import "" "") externref) (global funcref (global.get 0)))
-   "type mismatch"
- )
-+;)
+ ;; Element segments must match element type of table
  
- (assert_invalid
-   (module (global (import "test" "global-i32") i32) (global i32 (global.get 0) (global.get 0)))
-diff --git a/test/core/imports.wast b/test/core/imports.wast
-index 35e8c91..a7a459d 100644
---- a/test/core/imports.wast
-+++ b/test/core/imports.wast
-@@ -577,6 +577,7 @@
- (assert_return (invoke "grow" (i32.const 1)) (i32.const -1))
- (assert_return (invoke "grow" (i32.const 0)) (i32.const 2))
- 
-+(; unsupported by multi-module currently
- (module $Mgm
-   (memory (export "memory") 1) ;; initial size is 1
-   (func (export "grow") (result i32) (memory.grow (i32.const 1)))
-@@ -596,6 +597,7 @@
-   (func (export "size") (result i32) (memory.size))
- )
- (assert_return (invoke $Mgim2 "size") (i32.const 3))
-+;)
+@@ -643,6 +647,7 @@
  
- 
- ;; Syntax errors
-diff --git a/test/core/linking.wast b/test/core/linking.wast
-index 994e0f4..d0bfb5f 100644
---- a/test/core/linking.wast
-+++ b/test/core/linking.wast
-@@ -64,6 +64,7 @@
-   (export "Mg.set_mut" (func $set_mut))
- )
- 
-+(;
- (assert_return (get $Mg "glob") (i32.const 42))
- (assert_return (get $Ng "Mg.glob") (i32.const 42))
- (assert_return (get $Ng "glob") (i32.const 43))
-@@ -81,6 +82,7 @@
- (assert_return (get $Ng "Mg.mut_glob") (i32.const 241))
- (assert_return (invoke $Mg "get_mut") (i32.const 241))
- (assert_return (invoke $Ng "Mg.get_mut") (i32.const 241))
-+;)
- 
- 
- (assert_unlinkable
-@@ -165,6 +167,7 @@
-   )
- )
+ ;; Initializing a table with an externref-type element segment
  
 +(;
- (assert_return (invoke $Mt "call" (i32.const 2)) (i32.const 4))
- (assert_return (invoke $Nt "Mt.call" (i32.const 2)) (i32.const 4))
- (assert_return (invoke $Nt "call" (i32.const 2)) (i32.const 5))
-@@ -187,6 +190,7 @@
- 
- (assert_return (invoke $Nt "call" (i32.const 3)) (i32.const -4))
- (assert_trap (invoke $Nt "call" (i32.const 4)) "indirect call type mismatch")
-+;)
- 
- (module $Ot
-   (type (func (result i32)))
-@@ -201,6 +205,7 @@
-   )
- )
- 
-+(;
- (assert_return (invoke $Mt "call" (i32.const 3)) (i32.const 4))
- (assert_return (invoke $Nt "Mt.call" (i32.const 3)) (i32.const 4))
- (assert_return (invoke $Nt "call Mt.call" (i32.const 3)) (i32.const 4))
-@@ -225,6 +230,7 @@
- (assert_trap (invoke $Ot "call" (i32.const 0)) "uninitialized element")
- 
- (assert_trap (invoke $Ot "call" (i32.const 20)) "undefined element")
-+;)
- 
- (module
-   (table (import "Mt" "tab") 0 funcref)
-@@ -263,6 +269,7 @@
- 
- ;; Unlike in the v1 spec, active element segments stored before an
- ;; out-of-bounds access persist after the instantiation failure.
-+(;
- (assert_trap
-   (module
-     (table (import "Mt" "tab") 10 funcref)
-@@ -274,7 +281,9 @@
- )
- (assert_return (invoke $Mt "call" (i32.const 7)) (i32.const 0))
- (assert_trap (invoke $Mt "call" (i32.const 8)) "uninitialized element")
-+;)
- 
-+(;
- (assert_trap
-   (module
-     (table (import "Mt" "tab") 10 funcref)
-@@ -286,6 +295,7 @@
-   "out of bounds memory access"
- )
- (assert_return (invoke $Mt "call" (i32.const 7)) (i32.const 0))
-+;)
+ (module $m
+ 	(table $t (export "table") 2 externref)
+ 	(func (export "get") (param $i i32) (result externref)
+@@ -667,9 +672,11 @@
  
- 
- (module $Mtable_ex
-@@ -299,6 +309,7 @@
-   (table (import "Mtable_ex" "t-extern") 1 externref)
- )
- 
-+(;
- (assert_unlinkable
-   (module (table (import "Mtable_ex" "t-func") 1 externref))
-   "incompatible import type"
-@@ -307,6 +318,7 @@
-   (module (table (import "Mtable_ex" "t-extern") 1 funcref))
-   "incompatible import type"
- )
+ (assert_return (invoke $m "get" (i32.const 0)) (ref.null extern))
+ (assert_return (invoke $m "get" (i32.const 1)) (ref.extern 137))
 +;)
  
- 
- ;; Memories
-@@ -346,10 +358,12 @@
-   )
- )
+ ;; Initializing a table with imported funcref global
  
 +(;
- (assert_return (invoke $Mm "load" (i32.const 12)) (i32.const 0xa7))
- (assert_return (invoke $Nm "Mm.load" (i32.const 12)) (i32.const 0xa7))
- (assert_return (invoke $Nm "load" (i32.const 12)) (i32.const 0xf2))
- (assert_return (invoke $Om "load" (i32.const 12)) (i32.const 0xa7))
-+;)
- 
- (module
-   (memory (import "Mm" "mem") 0)
-@@ -372,6 +386,7 @@
-   )
+ (module $module4
+   (func (result i32)
+     i32.const 42
+@@ -690,3 +697,4 @@
  )
  
-+(;
- (assert_return (invoke $Pm "grow" (i32.const 0)) (i32.const 1))
- (assert_return (invoke $Pm "grow" (i32.const 2)) (i32.const 1))
- (assert_return (invoke $Pm "grow" (i32.const 0)) (i32.const 3))
-@@ -380,6 +395,7 @@
- (assert_return (invoke $Pm "grow" (i32.const 0)) (i32.const 5))
- (assert_return (invoke $Pm "grow" (i32.const 1)) (i32.const -1))
- (assert_return (invoke $Pm "grow" (i32.const 0)) (i32.const 5))
-+;)
- 
- (assert_unlinkable
-   (module
-@@ -403,8 +419,10 @@
-   )
-   "out of bounds memory access"
- )
-+(;
- (assert_return (invoke $Mm "load" (i32.const 0)) (i32.const 97))
- (assert_return (invoke $Mm "load" (i32.const 327670)) (i32.const 0))
+ (assert_return (invoke "call_imported_elem") (i32.const 42))
 +;)
- 
- (assert_trap
-   (module
-@@ -416,7 +434,9 @@
+\ No newline at end of file
+diff --git a/test/core/if.wast b/test/core/if.wast
+index 2ea45f6..6f07304 100644
+--- a/test/core/if.wast
++++ b/test/core/if.wast
+@@ -530,7 +530,10 @@
+   (func (export "atypical-condition")
+     i32.const 0
+     (if (then) (else))
+-    (if (i32.const 1) (i32.eqz) (then) (else))
++    ;; restore after wabt(> 1.34.0) supports it
++    (i32.const 1)
++    (i32.eqz)
++    (if (then) (else))
    )
-   "out of bounds table access"
- )
-+(;
- (assert_return (invoke $Mm "load" (i32.const 0)) (i32.const 97))
-+;)
- 
- ;; Store is modified if the start function traps.
- (module $Ms
-@@ -432,6 +452,7 @@
  )
- (register "Ms" $Ms)
- 
-+(;
- (assert_trap
-   (module
-     (import "Ms" "memory" (memory 1))
-@@ -451,3 +472,4 @@
  
- (assert_return (invoke $Ms "get memory[0]") (i32.const 104))  ;; 'h'
- (assert_return (invoke $Ms "get table[0]") (i32.const 0xdead))
-+;)
 diff --git a/test/core/ref_func.wast b/test/core/ref_func.wast
-index adb5cb7..590f626 100644
+index adb5cb7..6396013 100644
 --- a/test/core/ref_func.wast
 +++ b/test/core/ref_func.wast
-@@ -4,7 +4,8 @@
+@@ -4,7 +4,7 @@
  (register "M")
  
  (module
 -  (func $f (import "M" "f") (param i32) (result i32))
-+  (; aot mode does not support module linking ;)
 +  (func $f (param $x i32) (result i32) (local.get $x))
    (func $g (param $x i32) (result i32)
      (i32.add (local.get $x) (i32.const 1))
    )
 diff --git a/test/core/table_copy.wast b/test/core/table_copy.wast
-index 380e84e..f37e745 100644
+index 380e84e..59230cf 100644
 --- a/test/core/table_copy.wast
 +++ b/test/core/table_copy.wast
-@@ -14,11 +14,12 @@
+@@ -14,11 +14,11 @@
  
  (module
    (type (func (result i32)))  ;; type #0
@@ -356,16 +138,15 @@ index 380e84e..f37e745 100644
 -  (import "a" "ef2" (func (result i32)))
 -  (import "a" "ef3" (func (result i32)))
 -  (import "a" "ef4" (func (result i32)))    ;; index 4
-+  ;; aot mode does not support module linking
 +  (func (result i32) (i32.const 0))    ;; index 0
 +  (func (result i32) (i32.const 1))
 +  (func (result i32) (i32.const 2))
 +  (func (result i32) (i32.const 3))
-+  (func (result i32) (i32.const 4))     ;; index 4
++  (func (result i32) (i32.const 4))    ;; index 4
    (table $t0 30 30 funcref)
    (table $t1 30 30 funcref)
    (elem (table $t0) (i32.const 2) func 3 1 4 1)
-@@ -106,11 +107,11 @@
+@@ -106,11 +106,11 @@
  
  (module
    (type (func (result i32)))  ;; type #0
@@ -374,15 +155,15 @@ index 380e84e..f37e745 100644
 -  (import "a" "ef2" (func (result i32)))
 -  (import "a" "ef3" (func (result i32)))
 -  (import "a" "ef4" (func (result i32)))    ;; index 4
-+  (func (export "ef0") (result i32) (i32.const 0))    ;; index 0
-+  (func (export "ef1") (result i32) (i32.const 1))
-+  (func (export "ef2") (result i32) (i32.const 2))
-+  (func (export "ef3") (result i32) (i32.const 3))
-+  (func (export "ef4") (result i32) (i32.const 4))     ;; index 4
++  (func (result i32) (i32.const 0))    ;; index 0
++  (func (result i32) (i32.const 1))
++  (func (result i32) (i32.const 2))
++  (func (result i32) (i32.const 3))
++  (func (result i32) (i32.const 4))    ;; index 4
    (table $t0 30 30 funcref)
    (table $t1 30 30 funcref)
    (elem (table $t0) (i32.const 2) func 3 1 4 1)
-@@ -198,11 +199,11 @@
+@@ -198,11 +198,11 @@
  
  (module
    (type (func (result i32)))  ;; type #0
@@ -395,11 +176,11 @@ index 380e84e..f37e745 100644
 +  (func (result i32) (i32.const 1))
 +  (func (result i32) (i32.const 2))
 +  (func (result i32) (i32.const 3))
-+  (func (result i32) (i32.const 4))     ;; index 4
++  (func (result i32) (i32.const 4))    ;; index 4
    (table $t0 30 30 funcref)
    (table $t1 30 30 funcref)
    (elem (table $t0) (i32.const 2) func 3 1 4 1)
-@@ -290,11 +291,11 @@
+@@ -290,11 +290,11 @@
  
  (module
    (type (func (result i32)))  ;; type #0
@@ -412,11 +193,11 @@ index 380e84e..f37e745 100644
 +  (func (result i32) (i32.const 1))
 +  (func (result i32) (i32.const 2))
 +  (func (result i32) (i32.const 3))
-+  (func (result i32) (i32.const 4))     ;; index 4
++  (func (result i32) (i32.const 4))    ;; index 4
    (table $t0 30 30 funcref)
    (table $t1 30 30 funcref)
    (elem (table $t0) (i32.const 2) func 3 1 4 1)
-@@ -382,11 +383,11 @@
+@@ -382,11 +382,11 @@
  
  (module
    (type (func (result i32)))  ;; type #0
@@ -429,11 +210,11 @@ index 380e84e..f37e745 100644
 +  (func (result i32) (i32.const 1))
 +  (func (result i32) (i32.const 2))
 +  (func (result i32) (i32.const 3))
-+  (func (result i32) (i32.const 4))     ;; index 4
++  (func (result i32) (i32.const 4))    ;; index 4
    (table $t0 30 30 funcref)
    (table $t1 30 30 funcref)
    (elem (table $t0) (i32.const 2) func 3 1 4 1)
-@@ -474,11 +475,11 @@
+@@ -474,11 +474,11 @@
  
  (module
    (type (func (result i32)))  ;; type #0
@@ -446,11 +227,11 @@ index 380e84e..f37e745 100644
 +  (func (result i32) (i32.const 1))
 +  (func (result i32) (i32.const 2))
 +  (func (result i32) (i32.const 3))
-+  (func (result i32) (i32.const 4))     ;; index 4
++  (func (result i32) (i32.const 4))    ;; index 4
    (table $t0 30 30 funcref)
    (table $t1 30 30 funcref)
    (elem (table $t0) (i32.const 2) func 3 1 4 1)
-@@ -566,11 +567,11 @@
+@@ -566,11 +566,11 @@
  
  (module
    (type (func (result i32)))  ;; type #0
@@ -463,11 +244,11 @@ index 380e84e..f37e745 100644
 +  (func (result i32) (i32.const 1))
 +  (func (result i32) (i32.const 2))
 +  (func (result i32) (i32.const 3))
-+  (func (result i32) (i32.const 4))     ;; index 4
++  (func (result i32) (i32.const 4))    ;; index 4
    (table $t0 30 30 funcref)
    (table $t1 30 30 funcref)
    (elem (table $t0) (i32.const 2) func 3 1 4 1)
-@@ -658,11 +659,11 @@
+@@ -658,11 +658,11 @@
  
  (module
    (type (func (result i32)))  ;; type #0
@@ -480,11 +261,11 @@ index 380e84e..f37e745 100644
 +  (func (result i32) (i32.const 1))
 +  (func (result i32) (i32.const 2))
 +  (func (result i32) (i32.const 3))
-+  (func (result i32) (i32.const 4))     ;; index 4
++  (func (result i32) (i32.const 4))    ;; index 4
    (table $t0 30 30 funcref)
    (table $t1 30 30 funcref)
    (elem (table $t0) (i32.const 2) func 3 1 4 1)
-@@ -750,11 +751,11 @@
+@@ -750,11 +750,11 @@
  
  (module
    (type (func (result i32)))  ;; type #0
@@ -497,11 +278,11 @@ index 380e84e..f37e745 100644
 +  (func (result i32) (i32.const 1))
 +  (func (result i32) (i32.const 2))
 +  (func (result i32) (i32.const 3))
-+  (func (result i32) (i32.const 4))     ;; index 4
++  (func (result i32) (i32.const 4))    ;; index 4
    (table $t0 30 30 funcref)
    (table $t1 30 30 funcref)
    (elem (table $t0) (i32.const 2) func 3 1 4 1)
-@@ -842,11 +843,11 @@
+@@ -842,11 +842,11 @@
  
  (module
    (type (func (result i32)))  ;; type #0
@@ -514,11 +295,11 @@ index 380e84e..f37e745 100644
 +  (func (result i32) (i32.const 1))
 +  (func (result i32) (i32.const 2))
 +  (func (result i32) (i32.const 3))
-+  (func (result i32) (i32.const 4))     ;; index 4
++  (func (result i32) (i32.const 4))    ;; index 4
    (table $t0 30 30 funcref)
    (table $t1 30 30 funcref)
    (elem (table $t1) (i32.const 2) func 3 1 4 1)
-@@ -934,11 +935,11 @@
+@@ -934,11 +934,11 @@
  
  (module
    (type (func (result i32)))  ;; type #0
@@ -531,11 +312,11 @@ index 380e84e..f37e745 100644
 +  (func (result i32) (i32.const 1))
 +  (func (result i32) (i32.const 2))
 +  (func (result i32) (i32.const 3))
-+  (func (result i32) (i32.const 4))     ;; index 4
++  (func (result i32) (i32.const 4))    ;; index 4
    (table $t0 30 30 funcref)
    (table $t1 30 30 funcref)
    (elem (table $t1) (i32.const 2) func 3 1 4 1)
-@@ -1026,11 +1027,11 @@
+@@ -1026,11 +1026,11 @@
  
  (module
    (type (func (result i32)))  ;; type #0
@@ -548,11 +329,11 @@ index 380e84e..f37e745 100644
 +  (func (result i32) (i32.const 1))
 +  (func (result i32) (i32.const 2))
 +  (func (result i32) (i32.const 3))
-+  (func (result i32) (i32.const 4))     ;; index 4
++  (func (result i32) (i32.const 4))    ;; index 4
    (table $t0 30 30 funcref)
    (table $t1 30 30 funcref)
    (elem (table $t1) (i32.const 2) func 3 1 4 1)
-@@ -1118,11 +1119,11 @@
+@@ -1118,11 +1118,11 @@
  
  (module
    (type (func (result i32)))  ;; type #0
@@ -565,11 +346,11 @@ index 380e84e..f37e745 100644
 +  (func (result i32) (i32.const 1))
 +  (func (result i32) (i32.const 2))
 +  (func (result i32) (i32.const 3))
-+  (func (result i32) (i32.const 4))     ;; index 4
++  (func (result i32) (i32.const 4))    ;; index 4
    (table $t0 30 30 funcref)
    (table $t1 30 30 funcref)
    (elem (table $t1) (i32.const 2) func 3 1 4 1)
-@@ -1210,11 +1211,11 @@
+@@ -1210,11 +1210,11 @@
  
  (module
    (type (func (result i32)))  ;; type #0
@@ -582,11 +363,11 @@ index 380e84e..f37e745 100644
 +  (func (result i32) (i32.const 1))
 +  (func (result i32) (i32.const 2))
 +  (func (result i32) (i32.const 3))
-+  (func (result i32) (i32.const 4))     ;; index 4
++  (func (result i32) (i32.const 4))    ;; index 4
    (table $t0 30 30 funcref)
    (table $t1 30 30 funcref)
    (elem (table $t1) (i32.const 2) func 3 1 4 1)
-@@ -1302,11 +1303,11 @@
+@@ -1302,11 +1302,11 @@
  
  (module
    (type (func (result i32)))  ;; type #0
@@ -599,11 +380,11 @@ index 380e84e..f37e745 100644
 +  (func (result i32) (i32.const 1))
 +  (func (result i32) (i32.const 2))
 +  (func (result i32) (i32.const 3))
-+  (func (result i32) (i32.const 4))     ;; index 4
++  (func (result i32) (i32.const 4))    ;; index 4
    (table $t0 30 30 funcref)
    (table $t1 30 30 funcref)
    (elem (table $t1) (i32.const 2) func 3 1 4 1)
-@@ -1394,11 +1395,11 @@
+@@ -1394,11 +1394,11 @@
  
  (module
    (type (func (result i32)))  ;; type #0
@@ -616,11 +397,11 @@ index 380e84e..f37e745 100644
 +  (func (result i32) (i32.const 1))
 +  (func (result i32) (i32.const 2))
 +  (func (result i32) (i32.const 3))
-+  (func (result i32) (i32.const 4))     ;; index 4
++  (func (result i32) (i32.const 4))    ;; index 4
    (table $t0 30 30 funcref)
    (table $t1 30 30 funcref)
    (elem (table $t1) (i32.const 2) func 3 1 4 1)
-@@ -1486,11 +1487,11 @@
+@@ -1486,11 +1486,11 @@
  
  (module
    (type (func (result i32)))  ;; type #0
@@ -633,11 +414,11 @@ index 380e84e..f37e745 100644
 +  (func (result i32) (i32.const 1))
 +  (func (result i32) (i32.const 2))
 +  (func (result i32) (i32.const 3))
-+  (func (result i32) (i32.const 4))     ;; index 4
++  (func (result i32) (i32.const 4))    ;; index 4
    (table $t0 30 30 funcref)
    (table $t1 30 30 funcref)
    (elem (table $t1) (i32.const 2) func 3 1 4 1)
-@@ -1578,11 +1579,11 @@
+@@ -1578,11 +1578,11 @@
  
  (module
    (type (func (result i32)))  ;; type #0
@@ -650,15 +431,15 @@ index 380e84e..f37e745 100644
 +  (func (result i32) (i32.const 1))
 +  (func (result i32) (i32.const 2))
 +  (func (result i32) (i32.const 3))
-+  (func (result i32) (i32.const 4))     ;; index 4
++  (func (result i32) (i32.const 4))    ;; index 4
    (table $t0 30 30 funcref)
    (table $t1 30 30 funcref)
    (elem (table $t1) (i32.const 2) func 3 1 4 1)
 diff --git a/test/core/table_init.wast b/test/core/table_init.wast
-index 0b2d26f..bdab6a0 100644
+index 0b2d26f..3c595e5 100644
 --- a/test/core/table_init.wast
 +++ b/test/core/table_init.wast
-@@ -14,11 +14,12 @@
+@@ -14,11 +14,11 @@
  
  (module
    (type (func (result i32)))  ;; type #0
@@ -667,7 +448,6 @@ index 0b2d26f..bdab6a0 100644
 -  (import "a" "ef2" (func (result i32)))
 -  (import "a" "ef3" (func (result i32)))
 -  (import "a" "ef4" (func (result i32)))    ;; index 4
-+  ;; aot mode does not support module linking
 +  (func (result i32) (i32.const 0))    ;; index 0
 +  (func (result i32) (i32.const 1))
 +  (func (result i32) (i32.const 2))
@@ -676,7 +456,7 @@ index 0b2d26f..bdab6a0 100644
    (table $t0 30 30 funcref)
    (table $t1 30 30 funcref)
    (elem (table $t0) (i32.const 2) func 3 1 4 1)
-@@ -72,11 +73,12 @@
+@@ -72,11 +72,11 @@
  
  (module
    (type (func (result i32)))  ;; type #0
@@ -685,7 +465,6 @@ index 0b2d26f..bdab6a0 100644
 -  (import "a" "ef2" (func (result i32)))
 -  (import "a" "ef3" (func (result i32)))
 -  (import "a" "ef4" (func (result i32)))    ;; index 4
-+  ;; aot mode does not support module linking
 +  (func (result i32) (i32.const 0))    ;; index 0
 +  (func (result i32) (i32.const 1))
 +  (func (result i32) (i32.const 2))
@@ -694,7 +473,7 @@ index 0b2d26f..bdab6a0 100644
    (table $t0 30 30 funcref)
    (table $t1 30 30 funcref)
    (elem (table $t0) (i32.const 2) func 3 1 4 1)
-@@ -130,11 +132,12 @@
+@@ -130,11 +130,11 @@
  
  (module
    (type (func (result i32)))  ;; type #0
@@ -703,7 +482,6 @@ index 0b2d26f..bdab6a0 100644
 -  (import "a" "ef2" (func (result i32)))
 -  (import "a" "ef3" (func (result i32)))
 -  (import "a" "ef4" (func (result i32)))    ;; index 4
-+  ;; aot mode does not support module linking
 +  (func (result i32) (i32.const 0))    ;; index 0
 +  (func (result i32) (i32.const 1))
 +  (func (result i32) (i32.const 2))
@@ -712,7 +490,7 @@ index 0b2d26f..bdab6a0 100644
    (table $t0 30 30 funcref)
    (table $t1 30 30 funcref)
    (elem (table $t0) (i32.const 2) func 3 1 4 1)
-@@ -196,11 +199,12 @@
+@@ -196,11 +196,11 @@
  
  (module
    (type (func (result i32)))  ;; type #0
@@ -721,7 +499,6 @@ index 0b2d26f..bdab6a0 100644
 -  (import "a" "ef2" (func (result i32)))
 -  (import "a" "ef3" (func (result i32)))
 -  (import "a" "ef4" (func (result i32)))    ;; index 4
-+  ;; aot mode does not support module linking
 +  (func (result i32) (i32.const 0))    ;; index 0
 +  (func (result i32) (i32.const 1))
 +  (func (result i32) (i32.const 2))
@@ -730,7 +507,7 @@ index 0b2d26f..bdab6a0 100644
    (table $t0 30 30 funcref)
    (table $t1 30 30 funcref)
    (elem (table $t1) (i32.const 2) func 3 1 4 1)
-@@ -254,11 +258,12 @@
+@@ -254,11 +254,11 @@
  
  (module
    (type (func (result i32)))  ;; type #0
@@ -739,7 +516,6 @@ index 0b2d26f..bdab6a0 100644
 -  (import "a" "ef2" (func (result i32)))
 -  (import "a" "ef3" (func (result i32)))
 -  (import "a" "ef4" (func (result i32)))    ;; index 4
-+  ;; aot mode does not support module linking
 +  (func (result i32) (i32.const 0))    ;; index 0
 +  (func (result i32) (i32.const 1))
 +  (func (result i32) (i32.const 2))
@@ -748,7 +524,7 @@ index 0b2d26f..bdab6a0 100644
    (table $t0 30 30 funcref)
    (table $t1 30 30 funcref)
    (elem (table $t1) (i32.const 2) func 3 1 4 1)
-@@ -312,11 +317,12 @@
+@@ -312,11 +312,11 @@
  
  (module
    (type (func (result i32)))  ;; type #0
@@ -757,7 +533,6 @@ index 0b2d26f..bdab6a0 100644
 -  (import "a" "ef2" (func (result i32)))
 -  (import "a" "ef3" (func (result i32)))
 -  (import "a" "ef4" (func (result i32)))    ;; index 4
-+  ;; aot mode does not support module linking
 +  (func (result i32) (i32.const 0))    ;; index 0
 +  (func (result i32) (i32.const 1))
 +  (func (result i32) (i32.const 2))
@@ -766,20 +541,3 @@ index 0b2d26f..bdab6a0 100644
    (table $t0 30 30 funcref)
    (table $t1 30 30 funcref)
    (elem (table $t1) (i32.const 2) func 3 1 4 1)
-diff --git a/test/core/unreached-valid.wast b/test/core/unreached-valid.wast
-index b7ebabf..4f2abfb 100644
---- a/test/core/unreached-valid.wast
-+++ b/test/core/unreached-valid.wast
-@@ -46,6 +46,7 @@
- 
- ;; Validation after unreachable
- 
-+(;
- (module
-   (func (export "meet-bottom")
-     (block (result f64)
-@@ -61,3 +62,4 @@
- )
- 
- (assert_trap (invoke "meet-bottom") "unreachable")
-+;)

+ 0 - 28
tests/wamr-test-suites/spec-test-script/memory64.patch

@@ -1,28 +0,0 @@
-diff --git a/test/core/memory.wast b/test/core/memory.wast
-index 1dd5b84..497b69f 100644
---- a/test/core/memory.wast
-+++ b/test/core/memory.wast
-@@ -76,17 +76,17 @@
-   "memory size must be at most 65536 pages (4GiB)"
- )
- 
--(assert_invalid
-+(assert_malformed
-   (module quote "(memory 0x1_0000_0000)")
--  "memory size must be at most 65536 pages (4GiB)"
-+  "i32 constant out of range"
- )
--(assert_invalid
-+(assert_malformed
-   (module quote "(memory 0x1_0000_0000 0x1_0000_0000)")
--  "memory size must be at most 65536 pages (4GiB)"
-+  "i32 constant out of range"
- )
--(assert_invalid
-+(assert_malformed
-   (module quote "(memory 0 0x1_0000_0000)")
--  "memory size must be at most 65536 pages (4GiB)"
-+  "i32 constant out of range"
- )
- 
- (module

+ 857 - 0
tests/wamr-test-suites/spec-test-script/memory64_ignore_cases.patch

@@ -0,0 +1,857 @@
+diff --git a/test/core/address.wast b/test/core/address.wast
+index 8e52030..de0d0cb 100644
+--- a/test/core/address.wast
++++ b/test/core/address.wast
+@@ -210,7 +210,7 @@
+ (assert_trap (invoke "16s_bad" (i32.const 1)) "out of bounds memory access")
+ (assert_trap (invoke "32_bad" (i32.const 1)) "out of bounds memory access")
+ 
+-(assert_invalid
++(assert_malformed
+   (module quote
+     "(memory 1)"
+     "(func (drop (i32.load offset=4294967296 (i32.const 0))))"
+diff --git a/test/core/binary.wast b/test/core/binary.wast
+index 4090b2c..18f66b4 100644
+--- a/test/core/binary.wast
++++ b/test/core/binary.wast
+@@ -206,7 +206,7 @@
+ )
+ 
+ ;; Type section with signed LEB128 encoded type
+-(assert_malformed
++(;assert_malformed
+   (module binary
+     "\00asm" "\01\00\00\00"
+     "\01"                     ;; Type section id
+@@ -216,7 +216,7 @@
+     "\00\00"
+   )
+   "integer representation too long"
+-)
++;)
+ 
+ ;; Unsigned LEB128 must not be overlong
+ (assert_malformed
+@@ -1683,7 +1683,7 @@
+ )
+ 
+ ;; 2 elem segment declared, 1 given
+-(assert_malformed
++(;assert_malformed
+   (module binary
+     "\00asm" "\01\00\00\00"
+     "\01\04\01"                             ;; type section
+@@ -1696,7 +1696,7 @@
+     ;; "\00\41\00\0b\01\00"                 ;; elem 1 (missed)
+   )
+   "unexpected end"
+-)
++;)
+ 
+ ;; 2 elem segment declared, 1.5 given
+ (assert_malformed
+@@ -1813,7 +1813,7 @@
+ )
+ 
+ ;; 1 br_table target declared, 2 given
+-(assert_malformed
++(;assert_malformed
+   (module binary
+     "\00asm" "\01\00\00\00"
+     "\01\04\01"                             ;; type section
+@@ -1832,7 +1832,7 @@
+     "\0b\0b\0b"                             ;; end
+   )
+   "unexpected end"
+-)
++;)
+ 
+ ;; Start section
+ (module binary
+diff --git a/test/core/data.wast b/test/core/data.wast
+index b1e1239..74a7b04 100644
+--- a/test/core/data.wast
++++ b/test/core/data.wast
+@@ -312,9 +312,10 @@
+     "\02\01\41\00\0b"                       ;; active data segment 0 for memory 1
+     "\00"                                   ;; empty vec(byte)
+   )
+-  "unknown memory 1"
++  "unknown memory"
+ )
+ 
++(; not supported by wat2wasm
+ ;; Data segment with memory index 0 (no memory section)
+ (assert_invalid
+   (module binary
+@@ -323,7 +324,7 @@
+     "\00\41\00\0b"                          ;; active data segment 0 for memory 0
+     "\00"                                   ;; empty vec(byte)
+   )
+-  "unknown memory 0"
++  "unknown memory"
+ )
+ 
+ ;; Data segment with memory index 1 (no memory section)
+@@ -334,7 +335,7 @@
+     "\02\01\41\00\0b"                       ;; active data segment 0 for memory 1
+     "\00"                                   ;; empty vec(byte)
+   )
+-  "unknown memory 1"
++  "unknown memory"
+ )
+ 
+ ;; Data segment with memory index 1 and vec(byte) as above,
+@@ -354,7 +355,7 @@
+     "\20\21\22\23\24\25\26\27\28\29\2a\2b\2c\2d\2e\2f"
+     "\30\31\32\33\34\35\36\37\38\39\3a\3b\3c\3d"
+   )
+-  "unknown memory 1"
++  "unknown memory"
+ )
+ 
+ ;; Data segment with memory index 1 and specially crafted vec(byte) after.
+@@ -374,8 +375,9 @@
+     "\20\21\22\23\24\25\26\27\28\29\2a\2b\2c\2d\2e\2f"
+     "\30\31\32\33\34\35\36\37\38\39\3a\3b\3c\3d"
+   )
+-  "unknown memory 1"
++  "unknown memory"
+ )
++;)
+ 
+ 
+ ;; Invalid offsets
+diff --git a/test/core/elem.wast b/test/core/elem.wast
+index 575ecef..6eecab9 100644
+--- a/test/core/elem.wast
++++ b/test/core/elem.wast
+@@ -571,9 +571,11 @@
+   (func $const-i32-d (type $out-i32) (i32.const 68))
+ )
+ 
++(;
+ (assert_return (invoke $module1 "call-7") (i32.const 67))
+ (assert_return (invoke $module1 "call-8") (i32.const 68))
+ (assert_return (invoke $module1 "call-9") (i32.const 66))
++;)
+ 
+ (module $module3
+   (type $out-i32 (func (result i32)))
+@@ -584,6 +586,8 @@
+   (func $const-i32-f (type $out-i32) (i32.const 70))
+ )
+ 
++(;
+ (assert_return (invoke $module1 "call-7") (i32.const 67))
+ (assert_return (invoke $module1 "call-8") (i32.const 69))
+ (assert_return (invoke $module1 "call-9") (i32.const 70))
++;)
+diff --git a/test/core/global.wast b/test/core/global.wast
+index e40a305..8f8f25b 100644
+--- a/test/core/global.wast
++++ b/test/core/global.wast
+@@ -328,10 +328,12 @@
+   "type mismatch"
+ )
+ 
++(;
+ (assert_invalid
+   (module (global (import "" "") externref) (global funcref (global.get 0)))
+   "type mismatch"
+ )
++;)
+ 
+ (assert_invalid
+   (module (global (import "test" "global-i32") i32) (global i32 (global.get 0) (global.get 0)))
+diff --git a/test/core/if.wast b/test/core/if.wast
+index 2ea45f6..b6dd504 100644
+--- a/test/core/if.wast
++++ b/test/core/if.wast
+@@ -527,11 +527,12 @@
+ 
+   ;; Atypical folded condition syntax
+ 
+-  (func (export "atypical-condition")
+-    i32.const 0
+-    (if (then) (else))
+-    (if (i32.const 1) (i32.eqz) (then) (else))
+-  )
++  ;; FIXME: uncomment me if the next wabt can compile it w/o error
++  ;; (func (export "atypical-condition")
++  ;;   i32.const 0
++  ;;   (if (then) (else))
++  ;;   (if (i32.const 1) (i32.eqz) (then) (else))
++  ;; )
+ )
+ 
+ (assert_return (invoke "empty" (i32.const 0)))
+@@ -730,7 +731,7 @@
+ 
+ (assert_return (invoke "type-use"))
+ 
+-(assert_return (invoke "atypical-condition"))
++;; (assert_return (invoke "atypical-condition"))
+ 
+ (assert_malformed
+   (module quote
+diff --git a/test/core/imports.wast b/test/core/imports.wast
+index 69f76a0..a3844c6 100644
+--- a/test/core/imports.wast
++++ b/test/core/imports.wast
+@@ -572,6 +572,7 @@
+ (assert_return (invoke "grow" (i32.const 1)) (i32.const -1))
+ (assert_return (invoke "grow" (i32.const 0)) (i32.const 2))
+ 
++(; unsupported by multi-module currently
+ (module $Mgm
+   (memory (export "memory") 1) ;; initial size is 1
+   (func (export "grow") (result i32) (memory.grow (i32.const 1)))
+@@ -591,6 +592,7 @@
+   (func (export "size") (result i32) (memory.size))
+ )
+ (assert_return (invoke $Mgim2 "size") (i32.const 3))
++;)
+ 
+ 
+ ;; Syntax errors
+diff --git a/test/core/linking.wast b/test/core/linking.wast
+index 994e0f4..d0bfb5f 100644
+--- a/test/core/linking.wast
++++ b/test/core/linking.wast
+@@ -64,6 +64,7 @@
+   (export "Mg.set_mut" (func $set_mut))
+ )
+ 
++(;
+ (assert_return (get $Mg "glob") (i32.const 42))
+ (assert_return (get $Ng "Mg.glob") (i32.const 42))
+ (assert_return (get $Ng "glob") (i32.const 43))
+@@ -81,6 +82,7 @@
+ (assert_return (get $Ng "Mg.mut_glob") (i32.const 241))
+ (assert_return (invoke $Mg "get_mut") (i32.const 241))
+ (assert_return (invoke $Ng "Mg.get_mut") (i32.const 241))
++;)
+ 
+ 
+ (assert_unlinkable
+@@ -165,6 +167,7 @@
+   )
+ )
+ 
++(;
+ (assert_return (invoke $Mt "call" (i32.const 2)) (i32.const 4))
+ (assert_return (invoke $Nt "Mt.call" (i32.const 2)) (i32.const 4))
+ (assert_return (invoke $Nt "call" (i32.const 2)) (i32.const 5))
+@@ -187,6 +190,7 @@
+ 
+ (assert_return (invoke $Nt "call" (i32.const 3)) (i32.const -4))
+ (assert_trap (invoke $Nt "call" (i32.const 4)) "indirect call type mismatch")
++;)
+ 
+ (module $Ot
+   (type (func (result i32)))
+@@ -201,6 +205,7 @@
+   )
+ )
+ 
++(;
+ (assert_return (invoke $Mt "call" (i32.const 3)) (i32.const 4))
+ (assert_return (invoke $Nt "Mt.call" (i32.const 3)) (i32.const 4))
+ (assert_return (invoke $Nt "call Mt.call" (i32.const 3)) (i32.const 4))
+@@ -225,6 +230,7 @@
+ (assert_trap (invoke $Ot "call" (i32.const 0)) "uninitialized element")
+ 
+ (assert_trap (invoke $Ot "call" (i32.const 20)) "undefined element")
++;)
+ 
+ (module
+   (table (import "Mt" "tab") 0 funcref)
+@@ -263,6 +269,7 @@
+ 
+ ;; Unlike in the v1 spec, active element segments stored before an
+ ;; out-of-bounds access persist after the instantiation failure.
++(;
+ (assert_trap
+   (module
+     (table (import "Mt" "tab") 10 funcref)
+@@ -274,7 +281,9 @@
+ )
+ (assert_return (invoke $Mt "call" (i32.const 7)) (i32.const 0))
+ (assert_trap (invoke $Mt "call" (i32.const 8)) "uninitialized element")
++;)
+ 
++(;
+ (assert_trap
+   (module
+     (table (import "Mt" "tab") 10 funcref)
+@@ -286,6 +295,7 @@
+   "out of bounds memory access"
+ )
+ (assert_return (invoke $Mt "call" (i32.const 7)) (i32.const 0))
++;)
+ 
+ 
+ (module $Mtable_ex
+@@ -299,6 +309,7 @@
+   (table (import "Mtable_ex" "t-extern") 1 externref)
+ )
+ 
++(;
+ (assert_unlinkable
+   (module (table (import "Mtable_ex" "t-func") 1 externref))
+   "incompatible import type"
+@@ -307,6 +318,7 @@
+   (module (table (import "Mtable_ex" "t-extern") 1 funcref))
+   "incompatible import type"
+ )
++;)
+ 
+ 
+ ;; Memories
+@@ -346,10 +358,12 @@
+   )
+ )
+ 
++(;
+ (assert_return (invoke $Mm "load" (i32.const 12)) (i32.const 0xa7))
+ (assert_return (invoke $Nm "Mm.load" (i32.const 12)) (i32.const 0xa7))
+ (assert_return (invoke $Nm "load" (i32.const 12)) (i32.const 0xf2))
+ (assert_return (invoke $Om "load" (i32.const 12)) (i32.const 0xa7))
++;)
+ 
+ (module
+   (memory (import "Mm" "mem") 0)
+@@ -372,6 +386,7 @@
+   )
+ )
+ 
++(;
+ (assert_return (invoke $Pm "grow" (i32.const 0)) (i32.const 1))
+ (assert_return (invoke $Pm "grow" (i32.const 2)) (i32.const 1))
+ (assert_return (invoke $Pm "grow" (i32.const 0)) (i32.const 3))
+@@ -380,6 +395,7 @@
+ (assert_return (invoke $Pm "grow" (i32.const 0)) (i32.const 5))
+ (assert_return (invoke $Pm "grow" (i32.const 1)) (i32.const -1))
+ (assert_return (invoke $Pm "grow" (i32.const 0)) (i32.const 5))
++;)
+ 
+ (assert_unlinkable
+   (module
+@@ -403,8 +419,10 @@
+   )
+   "out of bounds memory access"
+ )
++(;
+ (assert_return (invoke $Mm "load" (i32.const 0)) (i32.const 97))
+ (assert_return (invoke $Mm "load" (i32.const 327670)) (i32.const 0))
++;)
+ 
+ (assert_trap
+   (module
+@@ -416,7 +434,9 @@
+   )
+   "out of bounds table access"
+ )
++(;
+ (assert_return (invoke $Mm "load" (i32.const 0)) (i32.const 97))
++;)
+ 
+ ;; Store is modified if the start function traps.
+ (module $Ms
+@@ -432,6 +452,7 @@
+ )
+ (register "Ms" $Ms)
+ 
++(;
+ (assert_trap
+   (module
+     (import "Ms" "memory" (memory 1))
+@@ -451,3 +472,4 @@
+ 
+ (assert_return (invoke $Ms "get memory[0]") (i32.const 104))  ;; 'h'
+ (assert_return (invoke $Ms "get table[0]") (i32.const 0xdead))
++;)
+diff --git a/test/core/memory.wast b/test/core/memory.wast
+index 1dd5b84..497b69f 100644
+--- a/test/core/memory.wast
++++ b/test/core/memory.wast
+@@ -76,17 +76,17 @@
+   "memory size must be at most 65536 pages (4GiB)"
+ )
+ 
+-(assert_invalid
++(assert_malformed
+   (module quote "(memory 0x1_0000_0000)")
+-  "memory size must be at most 65536 pages (4GiB)"
++  "i32 constant out of range"
+ )
+-(assert_invalid
++(assert_malformed
+   (module quote "(memory 0x1_0000_0000 0x1_0000_0000)")
+-  "memory size must be at most 65536 pages (4GiB)"
++  "i32 constant out of range"
+ )
+-(assert_invalid
++(assert_malformed
+   (module quote "(memory 0 0x1_0000_0000)")
+-  "memory size must be at most 65536 pages (4GiB)"
++  "i32 constant out of range"
+ )
+ 
+ (module
+diff --git a/test/core/ref_func.wast b/test/core/ref_func.wast
+index adb5cb7..590f626 100644
+--- a/test/core/ref_func.wast
++++ b/test/core/ref_func.wast
+@@ -4,7 +4,8 @@
+ (register "M")
+ 
+ (module
+-  (func $f (import "M" "f") (param i32) (result i32))
++  (; aot mode does not support module linking ;)
++  (func $f (param $x i32) (result i32) (local.get $x))
+   (func $g (param $x i32) (result i32)
+     (i32.add (local.get $x) (i32.const 1))
+   )
+diff --git a/test/core/table_copy.wast b/test/core/table_copy.wast
+index 380e84e..f37e745 100644
+--- a/test/core/table_copy.wast
++++ b/test/core/table_copy.wast
+@@ -14,11 +14,12 @@
+ 
+ (module
+   (type (func (result i32)))  ;; type #0
+-  (import "a" "ef0" (func (result i32)))    ;; index 0
+-  (import "a" "ef1" (func (result i32)))
+-  (import "a" "ef2" (func (result i32)))
+-  (import "a" "ef3" (func (result i32)))
+-  (import "a" "ef4" (func (result i32)))    ;; index 4
++  ;; aot mode does not support module linking
++  (func (result i32) (i32.const 0))    ;; index 0
++  (func (result i32) (i32.const 1))
++  (func (result i32) (i32.const 2))
++  (func (result i32) (i32.const 3))
++  (func (result i32) (i32.const 4))     ;; index 4
+   (table $t0 30 30 funcref)
+   (table $t1 30 30 funcref)
+   (elem (table $t0) (i32.const 2) func 3 1 4 1)
+@@ -106,11 +107,11 @@
+ 
+ (module
+   (type (func (result i32)))  ;; type #0
+-  (import "a" "ef0" (func (result i32)))    ;; index 0
+-  (import "a" "ef1" (func (result i32)))
+-  (import "a" "ef2" (func (result i32)))
+-  (import "a" "ef3" (func (result i32)))
+-  (import "a" "ef4" (func (result i32)))    ;; index 4
++  (func (export "ef0") (result i32) (i32.const 0))    ;; index 0
++  (func (export "ef1") (result i32) (i32.const 1))
++  (func (export "ef2") (result i32) (i32.const 2))
++  (func (export "ef3") (result i32) (i32.const 3))
++  (func (export "ef4") (result i32) (i32.const 4))     ;; index 4
+   (table $t0 30 30 funcref)
+   (table $t1 30 30 funcref)
+   (elem (table $t0) (i32.const 2) func 3 1 4 1)
+@@ -198,11 +199,11 @@
+ 
+ (module
+   (type (func (result i32)))  ;; type #0
+-  (import "a" "ef0" (func (result i32)))    ;; index 0
+-  (import "a" "ef1" (func (result i32)))
+-  (import "a" "ef2" (func (result i32)))
+-  (import "a" "ef3" (func (result i32)))
+-  (import "a" "ef4" (func (result i32)))    ;; index 4
++  (func (result i32) (i32.const 0))    ;; index 0
++  (func (result i32) (i32.const 1))
++  (func (result i32) (i32.const 2))
++  (func (result i32) (i32.const 3))
++  (func (result i32) (i32.const 4))     ;; index 4
+   (table $t0 30 30 funcref)
+   (table $t1 30 30 funcref)
+   (elem (table $t0) (i32.const 2) func 3 1 4 1)
+@@ -290,11 +291,11 @@
+ 
+ (module
+   (type (func (result i32)))  ;; type #0
+-  (import "a" "ef0" (func (result i32)))    ;; index 0
+-  (import "a" "ef1" (func (result i32)))
+-  (import "a" "ef2" (func (result i32)))
+-  (import "a" "ef3" (func (result i32)))
+-  (import "a" "ef4" (func (result i32)))    ;; index 4
++  (func (result i32) (i32.const 0))    ;; index 0
++  (func (result i32) (i32.const 1))
++  (func (result i32) (i32.const 2))
++  (func (result i32) (i32.const 3))
++  (func (result i32) (i32.const 4))     ;; index 4
+   (table $t0 30 30 funcref)
+   (table $t1 30 30 funcref)
+   (elem (table $t0) (i32.const 2) func 3 1 4 1)
+@@ -382,11 +383,11 @@
+ 
+ (module
+   (type (func (result i32)))  ;; type #0
+-  (import "a" "ef0" (func (result i32)))    ;; index 0
+-  (import "a" "ef1" (func (result i32)))
+-  (import "a" "ef2" (func (result i32)))
+-  (import "a" "ef3" (func (result i32)))
+-  (import "a" "ef4" (func (result i32)))    ;; index 4
++  (func (result i32) (i32.const 0))    ;; index 0
++  (func (result i32) (i32.const 1))
++  (func (result i32) (i32.const 2))
++  (func (result i32) (i32.const 3))
++  (func (result i32) (i32.const 4))     ;; index 4
+   (table $t0 30 30 funcref)
+   (table $t1 30 30 funcref)
+   (elem (table $t0) (i32.const 2) func 3 1 4 1)
+@@ -474,11 +475,11 @@
+ 
+ (module
+   (type (func (result i32)))  ;; type #0
+-  (import "a" "ef0" (func (result i32)))    ;; index 0
+-  (import "a" "ef1" (func (result i32)))
+-  (import "a" "ef2" (func (result i32)))
+-  (import "a" "ef3" (func (result i32)))
+-  (import "a" "ef4" (func (result i32)))    ;; index 4
++  (func (result i32) (i32.const 0))    ;; index 0
++  (func (result i32) (i32.const 1))
++  (func (result i32) (i32.const 2))
++  (func (result i32) (i32.const 3))
++  (func (result i32) (i32.const 4))     ;; index 4
+   (table $t0 30 30 funcref)
+   (table $t1 30 30 funcref)
+   (elem (table $t0) (i32.const 2) func 3 1 4 1)
+@@ -566,11 +567,11 @@
+ 
+ (module
+   (type (func (result i32)))  ;; type #0
+-  (import "a" "ef0" (func (result i32)))    ;; index 0
+-  (import "a" "ef1" (func (result i32)))
+-  (import "a" "ef2" (func (result i32)))
+-  (import "a" "ef3" (func (result i32)))
+-  (import "a" "ef4" (func (result i32)))    ;; index 4
++  (func (result i32) (i32.const 0))    ;; index 0
++  (func (result i32) (i32.const 1))
++  (func (result i32) (i32.const 2))
++  (func (result i32) (i32.const 3))
++  (func (result i32) (i32.const 4))     ;; index 4
+   (table $t0 30 30 funcref)
+   (table $t1 30 30 funcref)
+   (elem (table $t0) (i32.const 2) func 3 1 4 1)
+@@ -658,11 +659,11 @@
+ 
+ (module
+   (type (func (result i32)))  ;; type #0
+-  (import "a" "ef0" (func (result i32)))    ;; index 0
+-  (import "a" "ef1" (func (result i32)))
+-  (import "a" "ef2" (func (result i32)))
+-  (import "a" "ef3" (func (result i32)))
+-  (import "a" "ef4" (func (result i32)))    ;; index 4
++  (func (result i32) (i32.const 0))    ;; index 0
++  (func (result i32) (i32.const 1))
++  (func (result i32) (i32.const 2))
++  (func (result i32) (i32.const 3))
++  (func (result i32) (i32.const 4))     ;; index 4
+   (table $t0 30 30 funcref)
+   (table $t1 30 30 funcref)
+   (elem (table $t0) (i32.const 2) func 3 1 4 1)
+@@ -750,11 +751,11 @@
+ 
+ (module
+   (type (func (result i32)))  ;; type #0
+-  (import "a" "ef0" (func (result i32)))    ;; index 0
+-  (import "a" "ef1" (func (result i32)))
+-  (import "a" "ef2" (func (result i32)))
+-  (import "a" "ef3" (func (result i32)))
+-  (import "a" "ef4" (func (result i32)))    ;; index 4
++  (func (result i32) (i32.const 0))    ;; index 0
++  (func (result i32) (i32.const 1))
++  (func (result i32) (i32.const 2))
++  (func (result i32) (i32.const 3))
++  (func (result i32) (i32.const 4))     ;; index 4
+   (table $t0 30 30 funcref)
+   (table $t1 30 30 funcref)
+   (elem (table $t0) (i32.const 2) func 3 1 4 1)
+@@ -842,11 +843,11 @@
+ 
+ (module
+   (type (func (result i32)))  ;; type #0
+-  (import "a" "ef0" (func (result i32)))    ;; index 0
+-  (import "a" "ef1" (func (result i32)))
+-  (import "a" "ef2" (func (result i32)))
+-  (import "a" "ef3" (func (result i32)))
+-  (import "a" "ef4" (func (result i32)))    ;; index 4
++  (func (result i32) (i32.const 0))    ;; index 0
++  (func (result i32) (i32.const 1))
++  (func (result i32) (i32.const 2))
++  (func (result i32) (i32.const 3))
++  (func (result i32) (i32.const 4))     ;; index 4
+   (table $t0 30 30 funcref)
+   (table $t1 30 30 funcref)
+   (elem (table $t1) (i32.const 2) func 3 1 4 1)
+@@ -934,11 +935,11 @@
+ 
+ (module
+   (type (func (result i32)))  ;; type #0
+-  (import "a" "ef0" (func (result i32)))    ;; index 0
+-  (import "a" "ef1" (func (result i32)))
+-  (import "a" "ef2" (func (result i32)))
+-  (import "a" "ef3" (func (result i32)))
+-  (import "a" "ef4" (func (result i32)))    ;; index 4
++  (func (result i32) (i32.const 0))    ;; index 0
++  (func (result i32) (i32.const 1))
++  (func (result i32) (i32.const 2))
++  (func (result i32) (i32.const 3))
++  (func (result i32) (i32.const 4))     ;; index 4
+   (table $t0 30 30 funcref)
+   (table $t1 30 30 funcref)
+   (elem (table $t1) (i32.const 2) func 3 1 4 1)
+@@ -1026,11 +1027,11 @@
+ 
+ (module
+   (type (func (result i32)))  ;; type #0
+-  (import "a" "ef0" (func (result i32)))    ;; index 0
+-  (import "a" "ef1" (func (result i32)))
+-  (import "a" "ef2" (func (result i32)))
+-  (import "a" "ef3" (func (result i32)))
+-  (import "a" "ef4" (func (result i32)))    ;; index 4
++  (func (result i32) (i32.const 0))    ;; index 0
++  (func (result i32) (i32.const 1))
++  (func (result i32) (i32.const 2))
++  (func (result i32) (i32.const 3))
++  (func (result i32) (i32.const 4))     ;; index 4
+   (table $t0 30 30 funcref)
+   (table $t1 30 30 funcref)
+   (elem (table $t1) (i32.const 2) func 3 1 4 1)
+@@ -1118,11 +1119,11 @@
+ 
+ (module
+   (type (func (result i32)))  ;; type #0
+-  (import "a" "ef0" (func (result i32)))    ;; index 0
+-  (import "a" "ef1" (func (result i32)))
+-  (import "a" "ef2" (func (result i32)))
+-  (import "a" "ef3" (func (result i32)))
+-  (import "a" "ef4" (func (result i32)))    ;; index 4
++  (func (result i32) (i32.const 0))    ;; index 0
++  (func (result i32) (i32.const 1))
++  (func (result i32) (i32.const 2))
++  (func (result i32) (i32.const 3))
++  (func (result i32) (i32.const 4))     ;; index 4
+   (table $t0 30 30 funcref)
+   (table $t1 30 30 funcref)
+   (elem (table $t1) (i32.const 2) func 3 1 4 1)
+@@ -1210,11 +1211,11 @@
+ 
+ (module
+   (type (func (result i32)))  ;; type #0
+-  (import "a" "ef0" (func (result i32)))    ;; index 0
+-  (import "a" "ef1" (func (result i32)))
+-  (import "a" "ef2" (func (result i32)))
+-  (import "a" "ef3" (func (result i32)))
+-  (import "a" "ef4" (func (result i32)))    ;; index 4
++  (func (result i32) (i32.const 0))    ;; index 0
++  (func (result i32) (i32.const 1))
++  (func (result i32) (i32.const 2))
++  (func (result i32) (i32.const 3))
++  (func (result i32) (i32.const 4))     ;; index 4
+   (table $t0 30 30 funcref)
+   (table $t1 30 30 funcref)
+   (elem (table $t1) (i32.const 2) func 3 1 4 1)
+@@ -1302,11 +1303,11 @@
+ 
+ (module
+   (type (func (result i32)))  ;; type #0
+-  (import "a" "ef0" (func (result i32)))    ;; index 0
+-  (import "a" "ef1" (func (result i32)))
+-  (import "a" "ef2" (func (result i32)))
+-  (import "a" "ef3" (func (result i32)))
+-  (import "a" "ef4" (func (result i32)))    ;; index 4
++  (func (result i32) (i32.const 0))    ;; index 0
++  (func (result i32) (i32.const 1))
++  (func (result i32) (i32.const 2))
++  (func (result i32) (i32.const 3))
++  (func (result i32) (i32.const 4))     ;; index 4
+   (table $t0 30 30 funcref)
+   (table $t1 30 30 funcref)
+   (elem (table $t1) (i32.const 2) func 3 1 4 1)
+@@ -1394,11 +1395,11 @@
+ 
+ (module
+   (type (func (result i32)))  ;; type #0
+-  (import "a" "ef0" (func (result i32)))    ;; index 0
+-  (import "a" "ef1" (func (result i32)))
+-  (import "a" "ef2" (func (result i32)))
+-  (import "a" "ef3" (func (result i32)))
+-  (import "a" "ef4" (func (result i32)))    ;; index 4
++  (func (result i32) (i32.const 0))    ;; index 0
++  (func (result i32) (i32.const 1))
++  (func (result i32) (i32.const 2))
++  (func (result i32) (i32.const 3))
++  (func (result i32) (i32.const 4))     ;; index 4
+   (table $t0 30 30 funcref)
+   (table $t1 30 30 funcref)
+   (elem (table $t1) (i32.const 2) func 3 1 4 1)
+@@ -1486,11 +1487,11 @@
+ 
+ (module
+   (type (func (result i32)))  ;; type #0
+-  (import "a" "ef0" (func (result i32)))    ;; index 0
+-  (import "a" "ef1" (func (result i32)))
+-  (import "a" "ef2" (func (result i32)))
+-  (import "a" "ef3" (func (result i32)))
+-  (import "a" "ef4" (func (result i32)))    ;; index 4
++  (func (result i32) (i32.const 0))    ;; index 0
++  (func (result i32) (i32.const 1))
++  (func (result i32) (i32.const 2))
++  (func (result i32) (i32.const 3))
++  (func (result i32) (i32.const 4))     ;; index 4
+   (table $t0 30 30 funcref)
+   (table $t1 30 30 funcref)
+   (elem (table $t1) (i32.const 2) func 3 1 4 1)
+@@ -1578,11 +1579,11 @@
+ 
+ (module
+   (type (func (result i32)))  ;; type #0
+-  (import "a" "ef0" (func (result i32)))    ;; index 0
+-  (import "a" "ef1" (func (result i32)))
+-  (import "a" "ef2" (func (result i32)))
+-  (import "a" "ef3" (func (result i32)))
+-  (import "a" "ef4" (func (result i32)))    ;; index 4
++  (func (result i32) (i32.const 0))    ;; index 0
++  (func (result i32) (i32.const 1))
++  (func (result i32) (i32.const 2))
++  (func (result i32) (i32.const 3))
++  (func (result i32) (i32.const 4))     ;; index 4
+   (table $t0 30 30 funcref)
+   (table $t1 30 30 funcref)
+   (elem (table $t1) (i32.const 2) func 3 1 4 1)
+diff --git a/test/core/table_init.wast b/test/core/table_init.wast
+index 0b2d26f..bdab6a0 100644
+--- a/test/core/table_init.wast
++++ b/test/core/table_init.wast
+@@ -14,11 +14,12 @@
+ 
+ (module
+   (type (func (result i32)))  ;; type #0
+-  (import "a" "ef0" (func (result i32)))    ;; index 0
+-  (import "a" "ef1" (func (result i32)))
+-  (import "a" "ef2" (func (result i32)))
+-  (import "a" "ef3" (func (result i32)))
+-  (import "a" "ef4" (func (result i32)))    ;; index 4
++  ;; aot mode does not support module linking
++  (func (result i32) (i32.const 0))    ;; index 0
++  (func (result i32) (i32.const 1))
++  (func (result i32) (i32.const 2))
++  (func (result i32) (i32.const 3))
++  (func (result i32) (i32.const 4))    ;; index 4
+   (table $t0 30 30 funcref)
+   (table $t1 30 30 funcref)
+   (elem (table $t0) (i32.const 2) func 3 1 4 1)
+@@ -72,11 +73,12 @@
+ 
+ (module
+   (type (func (result i32)))  ;; type #0
+-  (import "a" "ef0" (func (result i32)))    ;; index 0
+-  (import "a" "ef1" (func (result i32)))
+-  (import "a" "ef2" (func (result i32)))
+-  (import "a" "ef3" (func (result i32)))
+-  (import "a" "ef4" (func (result i32)))    ;; index 4
++  ;; aot mode does not support module linking
++  (func (result i32) (i32.const 0))    ;; index 0
++  (func (result i32) (i32.const 1))
++  (func (result i32) (i32.const 2))
++  (func (result i32) (i32.const 3))
++  (func (result i32) (i32.const 4))    ;; index 4
+   (table $t0 30 30 funcref)
+   (table $t1 30 30 funcref)
+   (elem (table $t0) (i32.const 2) func 3 1 4 1)
+@@ -130,11 +132,12 @@
+ 
+ (module
+   (type (func (result i32)))  ;; type #0
+-  (import "a" "ef0" (func (result i32)))    ;; index 0
+-  (import "a" "ef1" (func (result i32)))
+-  (import "a" "ef2" (func (result i32)))
+-  (import "a" "ef3" (func (result i32)))
+-  (import "a" "ef4" (func (result i32)))    ;; index 4
++  ;; aot mode does not support module linking
++  (func (result i32) (i32.const 0))    ;; index 0
++  (func (result i32) (i32.const 1))
++  (func (result i32) (i32.const 2))
++  (func (result i32) (i32.const 3))
++  (func (result i32) (i32.const 4))    ;; index 4
+   (table $t0 30 30 funcref)
+   (table $t1 30 30 funcref)
+   (elem (table $t0) (i32.const 2) func 3 1 4 1)
+@@ -196,11 +199,12 @@
+ 
+ (module
+   (type (func (result i32)))  ;; type #0
+-  (import "a" "ef0" (func (result i32)))    ;; index 0
+-  (import "a" "ef1" (func (result i32)))
+-  (import "a" "ef2" (func (result i32)))
+-  (import "a" "ef3" (func (result i32)))
+-  (import "a" "ef4" (func (result i32)))    ;; index 4
++  ;; aot mode does not support module linking
++  (func (result i32) (i32.const 0))    ;; index 0
++  (func (result i32) (i32.const 1))
++  (func (result i32) (i32.const 2))
++  (func (result i32) (i32.const 3))
++  (func (result i32) (i32.const 4))    ;; index 4
+   (table $t0 30 30 funcref)
+   (table $t1 30 30 funcref)
+   (elem (table $t1) (i32.const 2) func 3 1 4 1)
+@@ -254,11 +258,12 @@
+ 
+ (module
+   (type (func (result i32)))  ;; type #0
+-  (import "a" "ef0" (func (result i32)))    ;; index 0
+-  (import "a" "ef1" (func (result i32)))
+-  (import "a" "ef2" (func (result i32)))
+-  (import "a" "ef3" (func (result i32)))
+-  (import "a" "ef4" (func (result i32)))    ;; index 4
++  ;; aot mode does not support module linking
++  (func (result i32) (i32.const 0))    ;; index 0
++  (func (result i32) (i32.const 1))
++  (func (result i32) (i32.const 2))
++  (func (result i32) (i32.const 3))
++  (func (result i32) (i32.const 4))    ;; index 4
+   (table $t0 30 30 funcref)
+   (table $t1 30 30 funcref)
+   (elem (table $t1) (i32.const 2) func 3 1 4 1)
+@@ -312,11 +317,12 @@
+ 
+ (module
+   (type (func (result i32)))  ;; type #0
+-  (import "a" "ef0" (func (result i32)))    ;; index 0
+-  (import "a" "ef1" (func (result i32)))
+-  (import "a" "ef2" (func (result i32)))
+-  (import "a" "ef3" (func (result i32)))
+-  (import "a" "ef4" (func (result i32)))    ;; index 4
++  ;; aot mode does not support module linking
++  (func (result i32) (i32.const 0))    ;; index 0
++  (func (result i32) (i32.const 1))
++  (func (result i32) (i32.const 2))
++  (func (result i32) (i32.const 3))
++  (func (result i32) (i32.const 4))    ;; index 4
+   (table $t0 30 30 funcref)
+   (table $t1 30 30 funcref)
+   (elem (table $t1) (i32.const 2) func 3 1 4 1)
+diff --git a/test/core/unreached-valid.wast b/test/core/unreached-valid.wast
+index b7ebabf..4f2abfb 100644
+--- a/test/core/unreached-valid.wast
++++ b/test/core/unreached-valid.wast
+@@ -46,6 +46,7 @@
+ 
+ ;; Validation after unreachable
+ 
++(;
+ (module
+   (func (export "meet-bottom")
+     (block (result f64)
+@@ -61,3 +62,4 @@
+ )
+ 
+ (assert_trap (invoke "meet-bottom") "unreachable")
++;)

+ 94 - 144
tests/wamr-test-suites/spec-test-script/multi_module_aot_ignore_cases.patch

@@ -1,174 +1,124 @@
-diff --git a/test/core/linking.wast b/test/core/linking.wast
-index d0bfb5f..6617945 100644
---- a/test/core/linking.wast
-+++ b/test/core/linking.wast
-@@ -35,7 +35,7 @@
+diff --git a/test/core/imports.wast b/test/core/imports.wast
+index 0cc07cb..4e8367a 100644
+--- a/test/core/imports.wast
++++ b/test/core/imports.wast
+@@ -86,7 +86,7 @@
+ (assert_return (invoke "print64" (i64.const 24)))
  
+ (assert_invalid
+-  (module 
++  (module
+     (type (func (result i32)))
+     (import "test" "func" (func (type 1)))
+   )
+@@ -578,6 +578,7 @@
+ (assert_return (invoke "grow" (i32.const 1)) (i32.const -1))
+ (assert_return (invoke "grow" (i32.const 0)) (i32.const 2))
  
- ;; Globals
--
 +(;
- (module $Mg
-   (global $glob (export "glob") i32 (i32.const 42))
-   (func (export "get") (result i32) (global.get $glob))
-@@ -63,7 +63,7 @@
-   (export "Mg.get_mut" (func $get_mut))
-   (export "Mg.set_mut" (func $set_mut))
+ (module $Mgm
+   (memory (export "memory") 1) ;; initial size is 1
+   (func (export "grow") (result i32) (memory.grow (i32.const 1)))
+@@ -586,7 +587,7 @@
+ (assert_return (invoke $Mgm "grow") (i32.const 1)) ;; now size is 2
+ (module $Mgim1
+   ;; imported memory limits should match, because external memory size is 2 now
+-  (memory (export "memory") (import "grown-memory" "memory") 2) 
++  (memory (export "memory") (import "grown-memory" "memory") 2)
+   (func (export "grow") (result i32) (memory.grow (i32.const 1)))
+ )
+ (register "grown-imported-memory" $Mgim1)
+@@ -597,7 +598,7 @@
+   (func (export "size") (result i32) (memory.size))
  )
+ (assert_return (invoke $Mgim2 "size") (i32.const 3))
 -
 +;)
- (;
- (assert_return (get $Mg "glob") (i32.const 42))
- (assert_return (get $Ng "Mg.glob") (i32.const 42))
-@@ -84,7 +84,7 @@
- (assert_return (invoke $Ng "Mg.get_mut") (i32.const 241))
- ;)
  
--
+ ;; Syntax errors
+ 
+@@ -669,6 +670,7 @@
+   "import after memory"
+ )
+ 
 +(;
- (assert_unlinkable
-   (module (import "Mg" "mut_glob" (global i32)))
-   "incompatible import type"
-@@ -166,7 +166,7 @@
-     (call_indirect (type 1) (local.get 0))
+ ;; This module is required to validate, regardless of whether it can be
+ ;; linked. Overloading is not possible in wasm itself, but it is possible
+ ;; in modules from which wasm can import.
+@@ -695,3 +697,4 @@
    )
+   "unknown import"
  )
--
 +;)
- (;
- (assert_return (invoke $Mt "call" (i32.const 2)) (i32.const 4))
- (assert_return (invoke $Nt "Mt.call" (i32.const 2)) (i32.const 4))
-@@ -191,7 +191,7 @@
- (assert_return (invoke $Nt "call" (i32.const 3)) (i32.const -4))
- (assert_trap (invoke $Nt "call" (i32.const 4)) "indirect call type mismatch")
- ;)
--
-+(;
- (module $Ot
-   (type (func (result i32)))
+\ No newline at end of file
+diff --git a/test/core/linking.wast b/test/core/linking.wast
+index 994e0f4..8fbcc02 100644
+--- a/test/core/linking.wast
++++ b/test/core/linking.wast
+@@ -19,11 +19,11 @@
+ (assert_return (invoke $Nf "call") (i32.const 3))
+ (assert_return (invoke $Nf "call Mf.call") (i32.const 2))
  
-@@ -204,7 +204,7 @@
-     (call_indirect (type 0) (local.get 0))
-   )
+-(module
++(module $M1
+   (import "spectest" "print_i32" (func $f (param i32)))
+   (export "print" (func $f))
  )
--
-+;)
- (;
- (assert_return (invoke $Mt "call" (i32.const 3)) (i32.const 4))
- (assert_return (invoke $Nt "Mt.call" (i32.const 3)) (i32.const 4))
-@@ -231,7 +231,7 @@
+-(register "reexport_f")
++(register "reexport_f" $M1)
+ (assert_unlinkable
+   (module (import "reexport_f" "print" (func (param i64))))
+   "incompatible import type"
+@@ -35,7 +35,6 @@
+ 
  
- (assert_trap (invoke $Ot "call" (i32.const 20)) "undefined element")
- ;)
+ ;; Globals
 -
-+(;
- (module
-   (table (import "Mt" "tab") 0 funcref)
-   (elem (i32.const 9) $f)
-@@ -266,7 +266,7 @@
-   "unknown import"
+ (module $Mg
+   (global $glob (export "glob") i32 (i32.const 42))
+   (func (export "get") (result i32) (global.get $glob))
+@@ -47,6 +46,7 @@
  )
- (assert_trap (invoke $Mt "call" (i32.const 7)) "uninitialized element")
+ (register "Mg" $Mg)
+ 
++(; only sharing initial values
+ (module $Ng
+   (global $x (import "Mg" "glob") i32)
+   (global $mut_glob (import "Mg" "mut_glob") (mut i32))
+@@ -81,7 +81,7 @@
+ (assert_return (get $Ng "Mg.mut_glob") (i32.const 241))
+ (assert_return (invoke $Mg "get_mut") (i32.const 241))
+ (assert_return (invoke $Ng "Mg.get_mut") (i32.const 241))
 -
 +;)
- ;; Unlike in the v1 spec, active element segments stored before an
- ;; out-of-bounds access persist after the instantiation failure.
- (;
-@@ -297,7 +297,7 @@
- (assert_return (invoke $Mt "call" (i32.const 7)) (i32.const 0))
- ;)
  
+ (assert_unlinkable
+   (module (import "Mg" "mut_glob" (global i32)))
+@@ -130,7 +130,7 @@
+ 
+ 
+ ;; Tables
 -
-+(;
- (module $Mtable_ex
-   (table $t1 (export "t-func") 1 funcref)
-   (table $t2 (export "t-extern") 1 externref)
-@@ -308,7 +308,7 @@
-   (table (import "Mtable_ex" "t-func") 1 funcref)
-   (table (import "Mtable_ex" "t-extern") 1 externref)
++(; no such support
+ (module $Mt
+   (type (func (result i32)))
+   (type (func))
+@@ -307,10 +307,11 @@
+   (module (table (import "Mtable_ex" "t-extern") 1 funcref))
+   "incompatible import type"
  )
--
 +;)
- (;
- (assert_unlinkable
-   (module (table (import "Mtable_ex" "t-func") 1 externref))
-@@ -322,7 +322,7 @@
  
  
  ;; Memories
 -
-+(;
++(; no such support
  (module $Mm
    (memory (export "mem") 1 5)
    (data (i32.const 10) "\00\01\02\03\04\05\06\07\08\09")
-@@ -357,14 +357,14 @@
-     (i32.load8_u (local.get 0))
-   )
- )
--
-+;)
- (;
- (assert_return (invoke $Mm "load" (i32.const 12)) (i32.const 0xa7))
- (assert_return (invoke $Nm "Mm.load" (i32.const 12)) (i32.const 0xa7))
- (assert_return (invoke $Nm "load" (i32.const 12)) (i32.const 0xf2))
- (assert_return (invoke $Om "load" (i32.const 12)) (i32.const 0xa7))
- ;)
--
-+(;
- (module
-   (memory (import "Mm" "mem") 0)
-   (data (i32.const 0xffff) "a")
-@@ -385,7 +385,7 @@
-     (memory.grow (local.get 0))
-   )
- )
--
-+;)
- (;
- (assert_return (invoke $Pm "grow" (i32.const 0)) (i32.const 1))
- (assert_return (invoke $Pm "grow" (i32.const 2)) (i32.const 1))
-@@ -396,7 +396,7 @@
- (assert_return (invoke $Pm "grow" (i32.const 1)) (i32.const -1))
- (assert_return (invoke $Pm "grow" (i32.const 0)) (i32.const 5))
- ;)
--
-+(;
- (assert_unlinkable
-   (module
-     (func $host (import "spectest" "print"))
-@@ -419,11 +419,12 @@
-   )
-   "out of bounds memory access"
- )
-+;)
- (;
- (assert_return (invoke $Mm "load" (i32.const 0)) (i32.const 97))
- (assert_return (invoke $Mm "load" (i32.const 327670)) (i32.const 0))
- ;)
--
-+(;
- (assert_trap
-   (module
-     (memory (import "Mm" "mem") 1)
-@@ -434,10 +435,11 @@
-   )
-   "out of bounds table access"
- )
-+;)
- (;
- (assert_return (invoke $Mm "load" (i32.const 0)) (i32.const 97))
- ;)
--
-+(;
- ;; Store is modified if the start function traps.
- (module $Ms
-   (type $t (func (result i32)))
-@@ -451,7 +453,7 @@
-   )
- )
- (register "Ms" $Ms)
--
+@@ -451,3 +452,4 @@
+ 
+ (assert_return (invoke $Ms "get memory[0]") (i32.const 104))  ;; 'h'
+ (assert_return (invoke $Ms "get table[0]") (i32.const 0xdead))
 +;)
- (;
- (assert_trap
-   (module
+\ No newline at end of file

+ 5 - 3
tests/wamr-test-suites/spec-test-script/runtest.py

@@ -1074,12 +1074,14 @@ def compile_wast_to_wasm(form, wast_tempfile, wasm_tempfile, opts):
     log("Compiling WASM to '%s'" % wasm_tempfile)
 
     # default arguments
-    if opts.gc or opts.memory64:
+    if opts.gc:
         cmd = [opts.wast2wasm, "-u", "-d", wast_tempfile, "-o", wasm_tempfile]
     elif opts.eh:
-        cmd = [opts.wast2wasm, "--enable-thread", "--no-check", "--enable-exceptions", "--enable-tail-call", wast_tempfile, "-o", wasm_tempfile ]
+        cmd = [opts.wast2wasm, "--enable-threads", "--no-check", "--enable-exceptions", "--enable-tail-call", wast_tempfile, "-o", wasm_tempfile ]
+    elif opts.memory64:
+        cmd = [opts.wast2wasm, "--enable-memory64", "--no-check", wast_tempfile, "-o", wasm_tempfile ]
     else:
-        cmd = [opts.wast2wasm, "--enable-thread", "--no-check",
+        cmd = [opts.wast2wasm, "--enable-threads", "--no-check",
                wast_tempfile, "-o", wasm_tempfile ]
 
     # remove reference-type and bulk-memory enabling options since a WABT

+ 2 - 2
tests/wamr-test-suites/spec-test-script/simd_ignore_cases.patch

@@ -1,5 +1,5 @@
 diff --git a/test/core/simd/simd_lane.wast b/test/core/simd/simd_lane.wast
-index 9d4b5fd7..4656dd2b 100644
+index 9b66f53..48a4e6d 100644
 --- a/test/core/simd/simd_lane.wast
 +++ b/test/core/simd/simd_lane.wast
 @@ -602,23 +602,23 @@
@@ -50,7 +50,7 @@ index 9d4b5fd7..4656dd2b 100644
  ;; Non-nat lane index
  
 diff --git a/test/core/simd/simd_load.wast b/test/core/simd/simd_load.wast
-index 4b2edc16..c7639218 100644
+index 4b2edc1..c763921 100644
 --- a/test/core/simd/simd_load.wast
 +++ b/test/core/simd/simd_load.wast
 @@ -124,7 +124,7 @@

+ 128 - 114
tests/wamr-test-suites/test_wamr.sh

@@ -8,7 +8,7 @@
 function DEBUG() {
   [[ -n $(env | grep "\<DEBUG\>") ]] && $@
 }
-DEBUG set -xv pipefail
+DEBUG set -exv pipefail
 
 function help()
 {
@@ -361,6 +361,7 @@ function sightglass_test()
 
 function setup_wabt()
 {
+    WABT_VERSION=1.0.34
     if [ ${WABT_BINARY_RELEASE} == "YES" ]; then
         echo "download a binary release and install"
         local WAT2WASM=${WORK_DIR}/wabt/out/gcc/Release/wat2wasm
@@ -382,16 +383,16 @@ function setup_wabt()
                     exit 1
                     ;;
             esac
-            if [ ! -f /tmp/wabt-1.0.31-${WABT_PLATFORM}.tar.gz ]; then
+            if [ ! -f /tmp/wabt-${WABT_VERSION}-${WABT_PLATFORM}.tar.gz ]; then
                 curl -L \
-                    https://github.com/WebAssembly/wabt/releases/download/1.0.31/wabt-1.0.31-${WABT_PLATFORM}.tar.gz \
-                    -o /tmp/wabt-1.0.31-${WABT_PLATFORM}.tar.gz
+                    https://github.com/WebAssembly/wabt/releases/download/${WABT_VERSION}/wabt-${WABT_VERSION}-${WABT_PLATFORM}.tar.gz \
+                    -o /tmp/wabt-${WABT_VERSION}-${WABT_PLATFORM}.tar.gz
             fi
 
             cd /tmp \
-            && tar zxf wabt-1.0.31-${WABT_PLATFORM}.tar.gz \
+            && tar zxf wabt-${WABT_VERSION}-${WABT_PLATFORM}.tar.gz \
             && mkdir -p ${WORK_DIR}/wabt/out/gcc/Release/ \
-            && install wabt-1.0.31/bin/wa* ${WORK_DIR}/wabt/out/gcc/Release/ \
+            && install wabt-${WABT_VERSION}/bin/* ${WORK_DIR}/wabt/out/gcc/Release/ \
             && cd -
         fi
     else
@@ -402,10 +403,11 @@ function setup_wabt()
         fi
         echo "upate wabt"
         cd wabt
-        git pull
+        git fetch origin
         git reset --hard origin/main
+        git checkout tags/${WABT_VERSION} -B ${WABT_VERSION}
         cd ..
-        make -C wabt gcc-release -j 4
+        make -C wabt gcc-release -j 4 || exit 1
     fi
 }
 
@@ -429,112 +431,76 @@ function spec_test()
     touch ${REPORT_DIR}/spec_test_report.txt
 
     cd ${WORK_DIR}
-    if [ ! -d "spec" ];then
-        echo "spec not exist, clone it from github"
-        git clone -b master --single-branch https://github.com/WebAssembly/spec
-    fi
-
-    pushd spec
-
-    # restore and clean everything
-    git reset --hard HEAD
 
     # update basic test cases
-    echo "update spec test cases"
-    git fetch origin main
-    # restore from XX_ignore_cases.patch
-    # resotre branch
-    git checkout -B main
-    # [spec] Update note on module initialization trapping (#1493)
-    git reset --hard 044d0d2e77bdcbe891f7e0b9dd2ac01d56435f0b
-    git apply ../../spec-test-script/ignore_cases.patch
-    if [[ ${ENABLE_SIMD} == 1 ]]; then
-        git apply ../../spec-test-script/simd_ignore_cases.patch
-    fi
-    if [[ ${ENABLE_MULTI_MODULE} == 1 && $1 == 'aot'  ]]; then
-        git apply ../../spec-test-script/multi_module_aot_ignore_cases.patch
-    fi
+    echo "downloading spec test cases..."
 
-    # udpate thread cases
+    rm -rf spec
     if [ ${ENABLE_MULTI_THREAD} == 1 ]; then
-        echo "checkout spec for threads proposal"
-        if [[ -z $(git remote -v | grep "\<threads\>") ]]; then
-            git remote add threads https://github.com/WebAssembly/threads
-        fi
+        echo "checkout spec from threads proposal"
 
-        # fetch spec for threads proposal
-        git fetch threads
-        # Fix error in Web embedding desc for atomic.notify (#185)
-        git reset --hard 85b562cd6805947876ec5e8b975ab0127c55a0a2
-        git checkout threads/main
+        # check spec test cases for threads
+        git clone -b main --single-branch https://github.com/WebAssembly/threads.git spec
+        pushd spec
 
-        git apply ../../spec-test-script/thread_proposal_ignore_cases.patch
-        git apply ../../spec-test-script/thread_proposal_fix_atomic_case.patch
+        # May 31, 2012 [interpreter] implement atomic.wait and atomic.notify (#194)
+        git reset --hard 09f2831349bf409187abb6f7868482a8079f2264
+        git apply ../../spec-test-script/thread_proposal_ignore_cases.patch || exit 1
+        git apply ../../spec-test-script/thread_proposal_fix_atomic_case.patch || exit 1
         git apply ../../spec-test-script/thread_proposal_remove_memory64_flag_case.patch
-    fi
-
-    if [ ${ENABLE_EH} == 1 ]; then
+    elif [ ${ENABLE_EH} == 1 ]; then
         echo "checkout exception-handling test cases"
-        popd
-        if [ ! -d "exception-handling" ];then
-            echo "exception-handling not exist, clone it from github"
-            git clone -b master --single-branch https://github.com/WebAssembly/exception-handling
-        fi
-        pushd exception-handling
-
-        # restore and clean everything
-        git reset --hard 51c721661b671bb7dc4b3a3acb9e079b49778d36
 
-        if [[ ${ENABLE_MULTI_MODULE} == 0 ]]; then
-            git apply ../../spec-test-script/exception_handling.patch
-        fi
-
-        popd
-        echo $(pwd)
-    fi
+        git clone -b main --single-branch https://github.com/WebAssembly/exception-handling spec
+        pushd spec
 
-    # update GC cases
-    if [[ ${ENABLE_GC} == 1 ]]; then
+        # Jun 6, 2023 Merge branch 'upstream' into merge-upstream
+        git reset --hard 51c721661b671bb7dc4b3a3acb9e079b49778d36
+        git apply ../../spec-test-script/exception_handling.patch || exit 1
+    elif [[ ${ENABLE_GC} == 1 ]]; then
         echo "checkout spec for GC proposal"
 
-        popd
-        rm -fr spec
         # check spec test cases for GC
         git clone -b main --single-branch https://github.com/WebAssembly/gc.git spec
         pushd spec
 
-        git restore . && git clean -ffd .
         # Reset to commit: "[test] Unify the error message."
         git reset --hard 0caaadc65b5e1910512d8ae228502edcf9d60390
-        git apply ../../spec-test-script/gc_ignore_cases.patch
+        git apply ../../spec-test-script/gc_ignore_cases.patch || exit 1
 
         if [[ ${ENABLE_QEMU} == 1 ]]; then
             # Decrease the recursive count for tail call cases as nuttx qemu's
             # native stack size is much smaller
-            git apply ../../spec-test-script/gc_nuttx_tail_call.patch
+            git apply ../../spec-test-script/gc_nuttx_tail_call.patch || exit 1
         fi
 
         compile_reference_interpreter
-    fi
-
-    # update memory64 cases
-    if [[ ${ENABLE_MEMORY64} == 1 ]]; then
+    elif [[ ${ENABLE_MEMORY64} == 1 ]]; then
         echo "checkout spec for memory64 proposal"
 
-        popd
-        rm -fr spec
         # check spec test cases for memory64
         git clone -b main --single-branch https://github.com/WebAssembly/memory64.git spec
         pushd spec
 
-        git restore . && git clean -ffd .
         # Reset to commit: "Merge remote-tracking branch 'upstream/main' into merge2"
         git reset --hard 48e69f394869c55b7bbe14ac963c09f4605490b6
         git checkout 044d0d2e77bdcbe891f7e0b9dd2ac01d56435f0b -- test/core/elem.wast test/core/data.wast
-        git apply ../../spec-test-script/ignore_cases.patch
-        git apply ../../spec-test-script/memory64.patch
+        git apply ../../spec-test-script/memory64_ignore_cases.patch || exit 1
+    else
+        echo "checkout spec for default proposal"
 
-        compile_reference_interpreter
+        git clone -b main --single-branch https://github.com/WebAssembly/spec
+        pushd spec
+
+        # Apr 3, 2024 [js-api] Integrate with the ResizableArrayBuffer proposal (#1300)
+        git reset --hard bc76fd79cfe61033d7f4ad4a7e8fc4f996dc5ba8
+        git apply ../../spec-test-script/ignore_cases.patch || exit 1
+        if [[ ${ENABLE_SIMD} == 1 ]]; then
+            git apply ../../spec-test-script/simd_ignore_cases.patch || exit 1
+        fi
+        if [[ ${ENABLE_MULTI_MODULE} == 1 ]]; then
+            git apply ../../spec-test-script/multi_module_aot_ignore_cases.patch || exit 1
+        fi
     fi
 
     popd
@@ -547,29 +513,20 @@ function spec_test()
 
     local ARGS_FOR_SPEC_TEST=""
 
-    # multi-module only enable in interp mode and aot mode
     if [[ 1 == ${ENABLE_MULTI_MODULE} ]]; then
-        if [[ $1 == 'classic-interp' || $1 == 'fast-interp' || $1 == 'aot' ]]; then
-            ARGS_FOR_SPEC_TEST+="-M "
-        fi
+        ARGS_FOR_SPEC_TEST+="-M "
     fi
 
     if [[ 1 == ${ENABLE_EH} ]]; then
         ARGS_FOR_SPEC_TEST+="-e "
     fi
 
-    # sgx only enable in interp mode and aot mode
     if [[ ${SGX_OPT} == "--sgx" ]];then
-        if [[ $1 == 'classic-interp' || $1 == 'fast-interp' || $1 == 'aot' || $1 == 'fast-jit' ]]; then
-          ARGS_FOR_SPEC_TEST+="-x "
-        fi
+        ARGS_FOR_SPEC_TEST+="-x "
     fi
 
-    # simd only enable in jit mode and aot mode
     if [[ ${ENABLE_SIMD} == 1 ]]; then
-        if [[ $1 == 'jit' || $1 == 'aot' ]]; then
-          ARGS_FOR_SPEC_TEST+="-S "
-        fi
+        ARGS_FOR_SPEC_TEST+="-S "
     fi
 
     if [[ ${ENABLE_MULTI_THREAD} == 1 ]]; then
@@ -596,11 +553,8 @@ function spec_test()
         ARGS_FOR_SPEC_TEST+="--gc "
     fi
 
-    # wasm64(memory64) is only enabled in interp and aot mode
     if [[ 1 == ${ENABLE_MEMORY64} ]]; then
-        if [[ $1 == 'classic-interp' || $1 == 'aot' ]]; then
-            ARGS_FOR_SPEC_TEST+="--memory64 "
-        fi
+        ARGS_FOR_SPEC_TEST+="--memory64 "
     fi
 
     if [[ ${ENABLE_QEMU} == 1 ]]; then
@@ -888,11 +842,79 @@ function collect_coverage()
     fi
 }
 
+# decide whether execute test cases in current running mode based on the current configuration or not
+# return 1 if the test case should be executed, otherwise return 0
+function do_execute_in_running_mode()
+{
+    local RUNNING_MODE="$1"
+
+    if [[ ${ENABLE_MEMORY64} -eq 1 ]]; then
+        if [[ "${RUNNING_MODE}" != "classic-interp" \
+                && "${RUNNING_MODE}" != "aot" ]]; then
+            echo "support memory64(wasm64) in classic-interp mode and aot mode"
+            return 0
+        fi
+    fi
+
+    # FIXME: add "aot" after fix the linking failure
+    if [[ ${ENABLE_MULTI_MODULE} -eq 1 ]]; then
+        if [[ "${RUNNING_MODE}" != "classic-interp" \
+                && "${RUNNING_MODE}" != "fast-interp" ]]; then
+            echo "support multi-module in both interp modes"
+            return 0
+        fi
+    fi
+
+    if [[ ${SGX_OPT} == "--sgx" ]]; then
+        if [[ "${RUNNING_MODE}" != "classic-interp" \
+                && "${RUNNING_MODE}" != "fast-interp" \
+                && "${RUNNING_MODE}" != "aot" \
+                && "${RUNNING_MODE}" != "fast-jit" ]]; then
+            echo "support sgx in both interp modes, fast-jit mode and aot mode"
+            return 0
+        fi
+    fi
+
+    if [[ ${ENABLE_SIMD} -eq 1 ]]; then
+        if [[ "${RUNNING_MODE}" != "jit" && "${RUNNING_MODE}" != "aot" ]]; then
+            echo "support simd in llvm-jit mode and aot mode"
+            return 0;
+        fi
+    fi
+
+    if [[ ${TARGET} == "X86_32" ]]; then
+        if [[ "${RUNNING_MODE}" == "jit" || "${RUNNING_MODE}" == "fast-jit" ]]; then
+            echo "both llvm-jit mode and fast-jit mode do not support X86_32 target"
+            return 0;
+        fi
+    fi
+
+    if [[ ${ENABLE_GC} -eq 1 ]]; then
+        if [[ "${RUNNING_MODE}" != "classic-interp" \
+                && "${RUNNING_MODE}" != "fast-interp" \
+                && "${RUNNING_MODE}" != "jit" \
+                && "${RUNNING_MODE}" != "aot" ]]; then
+            echo "support gc in both interp modes, llvm-jit mode and aot mode"
+            return 0;
+        fi
+    fi
+
+    if [[ ${ENABLE_EH} -eq 1 ]]; then
+        if [[ "${RUNNING_MODE}" != "classic-interp" ]]; then
+            echo "support exception handling in classic-interp"
+            return 0;
+        fi
+    fi
+
+    # by default, always execute the test case
+    return 1
+}
+
 function trigger()
 {
     # Check if REQUIREMENT_NAME is set, if set, only calling requirement test and early return
     if [[ -n $REQUIREMENT_NAME ]]; then
-        python ${REQUIREMENT_SCRIPT_DIR}/run_requirement.py -o ${REPORT_DIR}/ -r "$REQUIREMENT_NAME" "${SUBREQUIREMENT_IDS[@]}" 
+        python ${REQUIREMENT_SCRIPT_DIR}/run_requirement.py -o ${REPORT_DIR}/ -r "$REQUIREMENT_NAME" "${SUBREQUIREMENT_IDS[@]}"
         # early return with the python script exit status
         return $?
     fi
@@ -901,6 +923,7 @@ function trigger()
     # default enabled features
     EXTRA_COMPILE_FLAGS+=" -DWAMR_BUILD_BULK_MEMORY=1"
     EXTRA_COMPILE_FLAGS+=" -DWAMR_BUILD_REF_TYPES=1"
+    EXTRA_COMPILE_FLAGS+=" -DWAMR_BUILD_LIBC_WASI=0"
 
     if [[ ${ENABLE_MULTI_MODULE} == 1 ]];then
         EXTRA_COMPILE_FLAGS+=" -DWAMR_BUILD_MULTI_MODULE=1"
@@ -976,14 +999,16 @@ function trigger()
     fi
 
     for t in "${TYPE[@]}"; do
+        do_execute_in_running_mode $t
+        if [[ $? -eq 1 ]]; then
+            echo "execute in running mode" $t
+        else
+            echo "skip in running mode" $t
+            continue
+        fi
+
         case $t in
             "classic-interp")
-                if [[ ${ENABLE_SIMD} == 1 ]]; then
-                    echo "does not support SIMD in interp mode, bypass"
-                    continue
-                fi
-
-                echo "work in classic-interp mode"
                 # classic-interp
                 BUILD_FLAGS="$CLASSIC_INTERP_COMPILE_FLAGS $EXTRA_COMPILE_FLAGS"
                 if [[ ${ENABLE_QEMU} == 0 ]]; then
@@ -996,12 +1021,6 @@ function trigger()
             ;;
 
             "fast-interp")
-                if [[ ${ENABLE_SIMD} == 1 ]]; then
-                    echo "does not support SIMD in interp mode, bypass"
-                    continue
-                fi
-
-                echo "work in fast-interp mode"
                 # fast-interp
                 BUILD_FLAGS="$FAST_INTERP_COMPILE_FLAGS $EXTRA_COMPILE_FLAGS"
                 if [[ ${ENABLE_QEMU} == 0 ]]; then
@@ -1014,11 +1033,6 @@ function trigger()
             ;;
 
             "jit")
-                if [[ ${TARGET} == "X86_32" ]]; then
-                    echo "does not support an X86_32 target in JIT mode, bypass"
-                    continue
-                fi
-
                 echo "work in orc jit eager compilation mode"
                 BUILD_FLAGS="$ORC_EAGER_JIT_COMPILE_FLAGS $EXTRA_COMPILE_FLAGS"
                 build_iwasm_with_cfg $BUILD_FLAGS
@@ -1098,6 +1112,6 @@ else
 fi
 
 echo -e "Test finish. Reports are under ${REPORT_DIR}"
-DEBUG set +xv pipefail
+DEBUG set +exv pipefail
 echo "TEST SUCCESSFUL"
 exit 0

+ 1 - 1
tests/wamr-test-suites/wamr-compiler-test-script/run_wamr_compiler_tests.sh

@@ -18,5 +18,5 @@ for wat_file in ../../wamr-compiler/*.wat; do
     echo "Compiling $wasm_file to $aot_file"
     $WAMRC_CMD -o $aot_file $wasm_file
     echo "Testing $aot_file"
-    $IWASM_CMD "$aot_file"
+    $IWASM_CMD -f _start "$aot_file"
 done