فهرست منبع

Synchronize the GC spec tests to the commit from December 9. 2024. (#4022)

- Synchronize the GC spec tests to the commit from December 9. 2024.
- Revise the error messages to be consistent with the spec test cases.
- bypass gc spec test on the nuttx platform as a workaround
liang.he 1 سال پیش
والد
کامیت
e3ddbd58f7

+ 2 - 1
.github/workflows/spec_test_on_nuttx.yml

@@ -127,7 +127,8 @@ jobs:
         wamr_feature_option:
           # Empty option for default
           - { option: "", mode: "" }
-          - { option: "CONFIG_INTERPRETERS_WAMR_GC CONFIG_INTERPRETERS_WAMR_AOT_STACK_FRAME", mode: "-G" }
+          # need to install menhir
+          # - { option: "CONFIG_INTERPRETERS_WAMR_GC CONFIG_INTERPRETERS_WAMR_AOT_STACK_FRAME", mode: "-G" }
 
         exclude:
           # XIP is not fully supported yet on RISCV64, some relocations can not be resolved

+ 4 - 4
core/iwasm/common/wasm_runtime_common.c

@@ -3014,9 +3014,9 @@ static const char *exception_msgs[] = {
     "wasm operand stack overflow",    /* EXCE_OPERAND_STACK_OVERFLOW */
     "failed to compile fast jit function", /* EXCE_FAILED_TO_COMPILE_FAST_JIT_FUNC */
     /* GC related exceptions */
-    "null function object",           /* EXCE_NULL_FUNC_OBJ */
-    "null structure object",          /* EXCE_NULL_STRUCT_OBJ */
-    "null array reference",              /* EXCE_NULL_ARRAY_OBJ */
+    "null function reference",        /* EXCE_NULL_FUNC_OBJ */
+    "null structure reference",       /* EXCE_NULL_STRUCT_OBJ */
+    "null array reference",           /* EXCE_NULL_ARRAY_OBJ */
     "null i31 reference",             /* EXCE_NULL_I31_OBJ */
     "null reference",                 /* EXCE_NULL_REFERENCE */
     "create rtt type failed",         /* EXCE_FAILED_TO_CREATE_RTT_TYPE */
@@ -3024,7 +3024,7 @@ static const char *exception_msgs[] = {
     "create array object failed",     /* EXCE_FAILED_TO_CREATE_ARRAY_OBJ */
     "create externref object failed", /* EXCE_FAILED_TO_CREATE_EXTERNREF_OBJ */
     "cast failure",                   /* EXCE_CAST_FAILURE */
-    "out of bounds array access",      /* EXCE_ARRAY_IDX_OOB */
+    "out of bounds array access",     /* EXCE_ARRAY_IDX_OOB */
     /* stringref related exceptions */
     "create string object failed",    /* EXCE_FAILED_TO_CREATE_STRING */
     "create stringref failed",        /* EXCE_FAILED_TO_CREATE_STRINGREF */

+ 6 - 4
core/iwasm/interpreter/wasm_interp_classic.c

@@ -2649,7 +2649,7 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module,
                 read_leb_uint32(frame_ip, frame_ip_end, type_index);
                 func_obj = POP_REF();
                 if (!func_obj) {
-                    wasm_set_exception(module, "null function object");
+                    wasm_set_exception(module, "null function reference");
                     goto got_exception;
                 }
 
@@ -2666,7 +2666,7 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module,
                 read_leb_uint32(frame_ip, frame_ip_end, type_index);
                 func_obj = POP_REF();
                 if (!func_obj) {
-                    wasm_set_exception(module, "null function object");
+                    wasm_set_exception(module, "null function reference");
                     goto got_exception;
                 }
 
@@ -2813,7 +2813,8 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module,
                         struct_obj = POP_REF();
 
                         if (!struct_obj) {
-                            wasm_set_exception(module, "null structure object");
+                            wasm_set_exception(module,
+                                               "null structure reference");
                             goto got_exception;
                         }
 
@@ -2869,7 +2870,8 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module,
 
                         struct_obj = POP_REF();
                         if (!struct_obj) {
-                            wasm_set_exception(module, "null structure object");
+                            wasm_set_exception(module,
+                                               "null structure reference");
                             goto got_exception;
                         }
 

+ 6 - 4
core/iwasm/interpreter/wasm_interp_fast.c

@@ -1992,7 +1992,7 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module,
 #endif
                 func_obj = POP_REF();
                 if (!func_obj) {
-                    wasm_set_exception(module, "null function object");
+                    wasm_set_exception(module, "null function reference");
                     goto got_exception;
                 }
 
@@ -2007,7 +2007,7 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module,
 #endif
                 func_obj = POP_REF();
                 if (!func_obj) {
-                    wasm_set_exception(module, "null function object");
+                    wasm_set_exception(module, "null function reference");
                     goto got_exception;
                 }
 
@@ -2148,7 +2148,8 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module,
                         struct_obj = POP_REF();
 
                         if (!struct_obj) {
-                            wasm_set_exception(module, "null structure object");
+                            wasm_set_exception(module,
+                                               "null structure reference");
                             goto got_exception;
                         }
 
@@ -2204,7 +2205,8 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module,
 
                         struct_obj = POP_REF();
                         if (!struct_obj) {
-                            wasm_set_exception(module, "null structure object");
+                            wasm_set_exception(module,
+                                               "null structure reference");
                             goto got_exception;
                         }
 

+ 3 - 2
core/iwasm/interpreter/wasm_loader.c

@@ -2139,8 +2139,9 @@ load_type_section(const uint8 *buf, const uint8 *buf_end, WASMModule *module,
                     if (!wasm_type_is_subtype_of(cur_type, parent_type,
                                                  module->types,
                                                  module->type_count)) {
-                        set_error_buf(error_buf, error_buf_size,
-                                      "sub type does not match super type");
+                        set_error_buf_v(error_buf, error_buf_size,
+                                        "sub type %u does not match super type",
+                                        processed_type_count + j);
                         return false;
                     }
                 }

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

@@ -4660,7 +4660,7 @@ llvm_jit_table_init(WASMModuleInstance *module_inst, uint32 tbl_idx,
             if (!(func_obj = wasm_create_func_obj(module_inst,
                                                   init_values[i].u.ref_index,
                                                   true, NULL, 0))) {
-                wasm_set_exception(module_inst, "null function object");
+                wasm_set_exception(module_inst, "null function reference");
                 return;
             }
             table_elems[i] = func_obj;

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

@@ -100,7 +100,12 @@ def ignore_the_case(
         return True
 
     if gc_flag:
-        if case_name in ["array_init_elem", "array_init_data"]:
+        if case_name in [
+            "array_init_elem",
+            "array_init_data",
+            "array_new_data",
+            "array_new_elem"
+        ]:
             return True
 
     if sgx_flag:

تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 336 - 390
tests/wamr-test-suites/spec-test-script/gc_ignore_cases.patch


+ 18 - 15
tests/wamr-test-suites/spec-test-script/gc_nuttx_tail_call.patch

@@ -1,53 +1,56 @@
 diff --git a/test/core/return_call.wast b/test/core/return_call.wast
-index ad66acca..b27af19b 100644
+index 8a3d7512..5a4eba68 100644
 --- a/test/core/return_call.wast
 +++ b/test/core/return_call.wast
-@@ -102,20 +102,20 @@
- 
+@@ -103,22 +103,22 @@
  (assert_return (invoke "count" (i64.const 0)) (i64.const 0))
  (assert_return (invoke "count" (i64.const 1000)) (i64.const 0))
+ (;Return to the original configuration after we have corrected the error in the AOT/JIT tail-call implementation.;)
 -(assert_return (invoke "count" (i64.const 100_000)) (i64.const 0))
-+(assert_return (invoke "count" (i64.const 1001)) (i64.const 0))
++(assert_return (invoke "count" (i64.const 1_001)) (i64.const 0))
  
  (assert_return (invoke "even" (i64.const 0)) (i32.const 44))
  (assert_return (invoke "even" (i64.const 1)) (i32.const 99))
  (assert_return (invoke "even" (i64.const 100)) (i32.const 44))
  (assert_return (invoke "even" (i64.const 77)) (i32.const 99))
+ (;Return to the original configuration after we have corrected the error in the AOT/JIT tail-call implementation.;)
 -(assert_return (invoke "even" (i64.const 100_000)) (i32.const 44))
 -(assert_return (invoke "even" (i64.const 100_001)) (i32.const 99))
-+(assert_return (invoke "even" (i64.const 1000)) (i32.const 44))
-+(assert_return (invoke "even" (i64.const 1001)) (i32.const 99))
++(assert_return (invoke "even" (i64.const 1_000)) (i32.const 44))
++(assert_return (invoke "even" (i64.const 1_001)) (i32.const 99))
  (assert_return (invoke "odd" (i64.const 0)) (i32.const 99))
  (assert_return (invoke "odd" (i64.const 1)) (i32.const 44))
  (assert_return (invoke "odd" (i64.const 200)) (i32.const 99))
  (assert_return (invoke "odd" (i64.const 77)) (i32.const 44))
+ (;Return to the original configuration after we have corrected the error in the AOT/JIT tail-call implementation.;)
 -(assert_return (invoke "odd" (i64.const 100_000)) (i32.const 99))
--(assert_return (invoke "odd" (i64.const 99_999)) (i32.const 44))
-+(assert_return (invoke "odd" (i64.const 1000)) (i32.const 99))
-+(assert_return (invoke "odd" (i64.const 999)) (i32.const 44))
+-(assert_return (invoke "odd" (i64.const  99_999)) (i32.const 44))
++(assert_return (invoke "odd" (i64.const 1_000)) (i32.const 99))
++(assert_return (invoke "odd" (i64.const   999)) (i32.const 44))
  
  
  ;; Invalid typing
 diff --git a/test/core/return_call_indirect.wast b/test/core/return_call_indirect.wast
-index 6b95c24b..a9e86d42 100644
+index 7f68b4a5..08a31417 100644
 --- a/test/core/return_call_indirect.wast
 +++ b/test/core/return_call_indirect.wast
-@@ -257,14 +257,14 @@
+@@ -257,15 +257,15 @@
  (assert_return (invoke "even" (i32.const 1)) (i32.const 99))
  (assert_return (invoke "even" (i32.const 100)) (i32.const 44))
  (assert_return (invoke "even" (i32.const 77)) (i32.const 99))
 -(assert_return (invoke "even" (i32.const 100_000)) (i32.const 44))
 -(assert_return (invoke "even" (i32.const 111_111)) (i32.const 99))
-+(assert_return (invoke "even" (i32.const 1000)) (i32.const 44))
-+(assert_return (invoke "even" (i32.const 1111)) (i32.const 99))
++(assert_return (invoke "even" (i32.const 1_000)) (i32.const 44))
++(assert_return (invoke "even" (i32.const 1_001)) (i32.const 99))
  (assert_return (invoke "odd" (i32.const 0)) (i32.const 99))
  (assert_return (invoke "odd" (i32.const 1)) (i32.const 44))
  (assert_return (invoke "odd" (i32.const 200)) (i32.const 99))
  (assert_return (invoke "odd" (i32.const 77)) (i32.const 44))
+ (;Return to the original configuration after we have corrected the error in the AOT/JIT tail-call implementation.;)
 -(assert_return (invoke "odd" (i32.const 100_002)) (i32.const 99))
 -(assert_return (invoke "odd" (i32.const 100_003)) (i32.const 44))
-+(assert_return (invoke "odd" (i32.const 1002)) (i32.const 99))
-+(assert_return (invoke "odd" (i32.const 1003)) (i32.const 44))
++(assert_return (invoke "odd" (i32.const 1_002)) (i32.const 99))
++(assert_return (invoke "odd" (i32.const 1_003)) (i32.const 44))
  
  
  ;; Invalid syntax

+ 9 - 2
tests/wamr-test-suites/test_wamr.sh

@@ -467,8 +467,8 @@ function spec_test()
         git clone -b main --single-branch https://github.com/WebAssembly/gc.git spec
         pushd spec
 
-        # Reset to commit: "[test] Unify the error message."
-        git reset --hard 0caaadc65b5e1910512d8ae228502edcf9d60390
+        #  Dec 9, 2024. Merge branch 'funcref'
+        git reset --hard 756060f5816c7e2159f4817fbdee76cf52f9c923
         git apply ../../spec-test-script/gc_ignore_cases.patch || exit 1
 
         if [[ ${ENABLE_QEMU} == 1 ]]; then
@@ -477,6 +477,13 @@ function spec_test()
             git apply ../../spec-test-script/gc_nuttx_tail_call.patch || exit 1
         fi
 
+        # As of version 1.0.36, wabt is still unable to correctly handle the GC proposal.
+        # 
+        # $ $ /opt/wabt-1.0.36/bin/wast2json --enable-all ../spec/test/core/br_if.wast
+        # 
+        # ../spec/test/core/br_if.wast:670:26: error: unexpected token "null", expected a numeric index or a name (e.g. 12 or $foo).
+        #     (func $f (param (ref null $t)) (result funcref) (local.get 0))
+        #
         compile_reference_interpreter
     elif [[ ${ENABLE_MEMORY64} == 1 ]]; then
         echo "checkout spec for memory64 proposal"

برخی فایل ها در این مقایسه diff نمایش داده نمی شوند زیرا تعداد فایل ها بسیار زیاد است