summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Lively <tlively@google.com>2024-07-18 13:54:21 -0400
committerGitHub <noreply@github.com>2024-07-18 10:54:21 -0700
commit08436189d3f35c958872b34bf8b0a8575e186d27 (patch)
tree593dd20aedbb6cff8cbdce589abb5dcd6818c0aa
parent6b93a84032cd00840c797d52ac01a7ca3bcb913e (diff)
downloadbinaryen-08436189d3f35c958872b34bf8b0a8575e186d27.tar.gz
binaryen-08436189d3f35c958872b34bf8b0a8575e186d27.tar.bz2
binaryen-08436189d3f35c958872b34bf8b0a8575e186d27.zip
[threads] Simplify and generalize reftype writing without GC (#6766)
Similar to #6765, but for types instead of heap types. Generalize the logic for transforming written reference types to types that are supported without GC so that it will automatically handle shared types and other new types correctly.
-rwxr-xr-xscripts/fuzz_opt.py2
-rw-r--r--src/wasm/wasm-binary.cpp24
-rw-r--r--test/lit/basic/shared-types-no-gc.wast (renamed from test/lit/basic/shared-null-no-gc.wast)15
3 files changed, 20 insertions, 21 deletions
diff --git a/scripts/fuzz_opt.py b/scripts/fuzz_opt.py
index a591f9414..e7826c0f3 100755
--- a/scripts/fuzz_opt.py
+++ b/scripts/fuzz_opt.py
@@ -361,7 +361,7 @@ INITIAL_CONTENTS_IGNORE = [
'shared-absheaptype.wast',
'type-ssa-shared.wast',
'shared-ref_eq.wast',
- 'shared-null-no-gc.wast',
+ 'shared-types-no-gc.wast',
]
diff --git a/src/wasm/wasm-binary.cpp b/src/wasm/wasm-binary.cpp
index d35edadc8..20815b701 100644
--- a/src/wasm/wasm-binary.cpp
+++ b/src/wasm/wasm-binary.cpp
@@ -1520,23 +1520,15 @@ void WasmBinaryWriter::writeType(Type type) {
// internally use more refined versions of those types, but we cannot emit
// those more refined types.
if (!wasm->features.hasGC()) {
- if (Type::isSubType(type, Type(HeapType::func, Nullable))) {
- o << S32LEB(BinaryConsts::EncodedType::funcref);
- return;
- }
- if (Type::isSubType(type, Type(HeapType::ext, Nullable))) {
- o << S32LEB(BinaryConsts::EncodedType::externref);
- return;
- }
- if (Type::isSubType(type, Type(HeapType::exn, Nullable))) {
- o << S32LEB(BinaryConsts::EncodedType::exnref);
- return;
- }
- if (Type::isSubType(type, Type(HeapType::string, Nullable))) {
- o << S32LEB(BinaryConsts::EncodedType::stringref);
- return;
+ auto ht = type.getHeapType();
+ if (ht.isBasic() && ht.getBasic(Unshared) == HeapType::string) {
+ // Do not overgeneralize stringref to anyref. We have tests that when a
+ // stringref is expected, we actually get a stringref. If we see a
+ // string, the stringref feature must be enabled.
+ type = Type(HeapTypes::string.getBasic(ht.getShared()), Nullable);
+ } else {
+ type = Type(type.getHeapType().getTop(), Nullable);
}
- WASM_UNREACHABLE("bad type without GC");
}
auto heapType = type.getHeapType();
if (type.isNullable() && heapType.isBasic() && !heapType.isShared()) {
diff --git a/test/lit/basic/shared-null-no-gc.wast b/test/lit/basic/shared-types-no-gc.wast
index b920f80f8..94c664f58 100644
--- a/test/lit/basic/shared-null-no-gc.wast
+++ b/test/lit/basic/shared-types-no-gc.wast
@@ -1,19 +1,26 @@
;; NOTE: Assertions have been generated by update_lit_checks.py and should not be edited.
-;; Test that we can write a binary without crashing when using a shared bottom
-;; type without GC enabled.
+;; Test that we can write a binary without crashing when using shared reference
+;; types without GC enabled.
;; RUN: wasm-opt %s --enable-reference-types --enable-shared-everything --roundtrip -S -o - | filecheck %s
(module
- ;; CHECK: (func $test
+ ;; CHECK: (func $null
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (ref.null (shared nofunc))
;; CHECK-NEXT: )
;; CHECK-NEXT: )
- (func $test
+ (func $null
(drop
(ref.null (shared func))
)
)
+
+ ;; CHECK: (func $signature (result (ref null (shared func)))
+ ;; CHECK-NEXT: (unreachable)
+ ;; CHECK-NEXT: )
+ (func $signature (result (ref null (shared func)))
+ (unreachable)
+ )
)