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

GC: Enable extern cases, fix build issues (#1965)

Wenyong Huang 2 лет назад
Родитель
Сommit
776d10f82c

+ 1 - 1
core/iwasm/common/gc/gc_type.c

@@ -373,7 +373,7 @@ wasm_func_type_is_subtype_of(const WASMFuncType *type1,
                              const WASMFuncType *type2,
                              const WASMTypePtr *types, uint32 type_count)
 {
-    const WASMRefType *ref_type1, *ref_type2;
+    const WASMRefType *ref_type1 = NULL, *ref_type2 = NULL;
     uint32 i, j1 = 0, j2 = 0;
 
     if (type1 == type2)

+ 2 - 2
core/iwasm/common/wasm_application.c

@@ -698,7 +698,7 @@ execute_func(WASMModuleInstanceCommon *module_inst, const char *name,
                         WASMObjectRef obj = wasm_externref_obj_to_internal_obj(
                             (WASMExternrefObjectRef)gc_obj);
                         if (wasm_obj_is_anyref_obj(obj))
-                            os_printf("%p:ref.extern",
+                            os_printf("%" PRIxPTR ":ref.extern",
                                       wasm_anyref_obj_get_value(
                                           (WASMAnyrefObjectRef)obj));
                         else
@@ -713,7 +713,7 @@ execute_func(WASMModuleInstanceCommon *module_inst, const char *name,
                     else if (wasm_obj_is_eq_obj(gc_obj))
                         os_printf("ref.eq");
                     else if (wasm_obj_is_anyref_obj(gc_obj))
-                        os_printf("%p:ref.host",
+                        os_printf("%" PRIxPTR ":ref.host",
                                   wasm_anyref_obj_get_value(
                                       (WASMAnyrefObjectRef)gc_obj));
                     else if (wasm_obj_is_internal_obj(gc_obj))

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

@@ -11389,7 +11389,7 @@ re_scan:
                     case WASM_OP_ARRAY_NEW_CANON_DATA:
                     case WASM_OP_ARRAY_NEW_CANON_ELEM:
                     {
-                        uint32 u32;
+                        uint32 u32 = 0;
 
                         read_leb_uint32(p, p_end, type_idx);
 #if WASM_ENABLE_FAST_INTERP != 0

+ 1 - 1
core/shared/mem-alloc/ems/ems_kfc.c

@@ -445,7 +445,7 @@ gc_show_fragment(void *heap_arg)
     gct_vm_mutex_lock(&heap->lock);
     gc_traverse_tree(&(heap->kfc_tree_root), (gc_size_t *)stats, &n);
     gct_vm_mutex_unlock(&heap->lock);
-    os_printf("\n[GC %p top sizes] %" PRIu32 " %" PRIu32 " %" RIu32 "\n", heap,
+    os_printf("\n[GC %p top sizes] %" PRIu32 " %" PRIu32 " %" PRIu32 "\n", heap,
               stats[0], stats[1], stats[2]);
 }
 #endif

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

@@ -77,7 +77,7 @@ def ignore_the_case(
         return True
 
     if gc_flag:
-        if case_name in ["type-canon", "type-equivalence", "type-rec", "extern"]:
+        if case_name in ["type-canon", "type-equivalence", "type-rec"]:
             return True;
 
     if sgx_flag:

+ 21 - 0
tests/wamr-test-suites/spec-test-script/gc_ignore_cases.patch

@@ -179,6 +179,27 @@ index 7ee75b20..f2287add 100644
  
  (assert_invalid
    (module
+diff --git a/test/core/gc/extern.wast b/test/core/gc/extern.wast
+index 1f32a0ab..93177e8b 100644
+--- a/test/core/gc/extern.wast
++++ b/test/core/gc/extern.wast
+@@ -36,14 +36,14 @@
+ (assert_return (invoke "internalize" (ref.extern 1)) (ref.host 1))
+ (assert_return (invoke "internalize" (ref.null extern)) (ref.null any))
+ 
+-(assert_return (invoke "externalize" (ref.host 2)) (ref.extern 2))
++;;(assert_return (invoke "externalize" (ref.host 2)) (ref.extern 2))
+ (assert_return (invoke "externalize" (ref.null any)) (ref.null extern))
+ 
+ (assert_return (invoke "externalize-i" (i32.const 0)) (ref.null extern))
+ (assert_return (invoke "externalize-i" (i32.const 1)) (ref.extern))
+ (assert_return (invoke "externalize-i" (i32.const 2)) (ref.extern))
+ (assert_return (invoke "externalize-i" (i32.const 3)) (ref.extern))
+-(assert_return (invoke "externalize-i" (i32.const 4)) (ref.extern))
++;;(assert_return (invoke "externalize-i" (i32.const 4)) (ref.extern))
+ (assert_return (invoke "externalize-i" (i32.const 5)) (ref.null extern))
+ 
+ (assert_return (invoke "externalize-ii" (i32.const 0)) (ref.null any))
 diff --git a/test/core/gc/struct.wast b/test/core/gc/struct.wast
 index bbd2c94a..dc490f62 100644
 --- a/test/core/gc/struct.wast

+ 10 - 1
tests/wamr-test-suites/spec-test-script/runtest.py

@@ -434,6 +434,9 @@ def parse_simple_const_w_type(number, type):
     elif type == "ref.extern":
         number = int(number, 16) if '0x' in number else int(number)
         return number, "0x{:x}:ref.extern".format(number)
+    elif type == "ref.host":
+        number = int(number, 16) if '0x' in number else int(number)
+        return number, "0x{:x}:ref.host".format(number)
     else:
         raise Exception("invalid value {} and type {}".format(number, type))
 
@@ -630,6 +633,9 @@ def simple_value_comparison(out, expected):
     elif "ref.extern" == expected_type:
         out_val_binary = out_val
         expected_val_binary = expected_val
+    elif "ref.host" == expected_type:
+        out_val_binary = out_val
+        expected_val_binary = expected_val
     else:
         assert(0), "unknown 'expected_type' {}".format(expected_type)
 
@@ -778,6 +784,9 @@ def test_assert_return(r, opts, form):
                 elif "ref.extern" == splitted[0]:
                     number, _ = parse_simple_const_w_type(splitted[1], splitted[0])
                     args.append(str(number))
+                elif "ref.host" == splitted[0]:
+                    number, _ = parse_simple_const_w_type(splitted[1], splitted[0])
+                    args.append(str(number))
                 else:
                     assert(0), "an unkonwn parameter type"
 
@@ -787,7 +796,7 @@ def test_assert_return(r, opts, form):
             returns = re.split("\)\s*\(", m.group(3)[1:-1])
         # processed numbers in strings
         if len(returns) == 1 and returns[0] in ["ref.array", "ref.struct", "ref.i31",
-                                                "ref.eq", "ref.any",
+                                                "ref.eq", "ref.any", "ref.extern",
                                                 "ref.func", "ref.null"]:
             expected = [returns[0]]
         elif len(returns) == 1 and returns[0] in ["func:ref.null", "any:ref.null",