summaryrefslogtreecommitdiff
path: root/src/passes
diff options
context:
space:
mode:
Diffstat (limited to 'src/passes')
-rw-r--r--src/passes/ConstHoisting.cpp4
-rw-r--r--src/passes/FuncCastEmulation.cpp8
-rw-r--r--src/passes/InstrumentLocals.cpp24
3 files changed, 33 insertions, 3 deletions
diff --git a/src/passes/ConstHoisting.cpp b/src/passes/ConstHoisting.cpp
index 3b34751ff..a972c05fb 100644
--- a/src/passes/ConstHoisting.cpp
+++ b/src/passes/ConstHoisting.cpp
@@ -97,7 +97,9 @@ private:
case Type::funcref:
case Type::externref:
case Type::exnref:
- case Type::anyref: {
+ case Type::anyref:
+ case Type::eqref:
+ case Type::i31ref: {
return false;
}
case Type::none:
diff --git a/src/passes/FuncCastEmulation.cpp b/src/passes/FuncCastEmulation.cpp
index 101834790..6f5e9d611 100644
--- a/src/passes/FuncCastEmulation.cpp
+++ b/src/passes/FuncCastEmulation.cpp
@@ -68,7 +68,9 @@ static Expression* toABI(Expression* value, Module* module) {
case Type::funcref:
case Type::externref:
case Type::exnref:
- case Type::anyref: {
+ case Type::anyref:
+ case Type::eqref:
+ case Type::i31ref: {
WASM_UNREACHABLE("reference types cannot be converted to i64");
}
case Type::none: {
@@ -112,7 +114,9 @@ static Expression* fromABI(Expression* value, Type type, Module* module) {
case Type::funcref:
case Type::externref:
case Type::exnref:
- case Type::anyref: {
+ case Type::anyref:
+ case Type::eqref:
+ case Type::i31ref: {
WASM_UNREACHABLE("reference types cannot be converted from i64");
}
case Type::none: {
diff --git a/src/passes/InstrumentLocals.cpp b/src/passes/InstrumentLocals.cpp
index f9c26d788..8803a7811 100644
--- a/src/passes/InstrumentLocals.cpp
+++ b/src/passes/InstrumentLocals.cpp
@@ -60,6 +60,8 @@ Name get_funcref("get_funcref");
Name get_externref("get_externref");
Name get_exnref("get_exnref");
Name get_anyref("get_anyref");
+Name get_eqref("get_eqref");
+Name get_i31ref("get_i31ref");
Name get_v128("get_v128");
Name set_i32("set_i32");
@@ -70,6 +72,8 @@ Name set_funcref("set_funcref");
Name set_externref("set_externref");
Name set_exnref("set_exnref");
Name set_anyref("set_anyref");
+Name set_eqref("set_eqref");
+Name set_i31ref("set_i31ref");
Name set_v128("set_v128");
struct InstrumentLocals : public WalkerPass<PostWalker<InstrumentLocals>> {
@@ -104,6 +108,12 @@ struct InstrumentLocals : public WalkerPass<PostWalker<InstrumentLocals>> {
case Type::anyref:
import = get_anyref;
break;
+ case Type::eqref:
+ import = get_eqref;
+ break;
+ case Type::i31ref:
+ import = get_i31ref;
+ break;
case Type::none:
case Type::unreachable:
WASM_UNREACHABLE("unexpected type");
@@ -153,6 +163,12 @@ struct InstrumentLocals : public WalkerPass<PostWalker<InstrumentLocals>> {
case Type::anyref:
import = set_anyref;
break;
+ case Type::eqref:
+ import = set_eqref;
+ break;
+ case Type::i31ref:
+ import = set_i31ref;
+ break;
case Type::unreachable:
return; // nothing to do here
case Type::none:
@@ -203,6 +219,14 @@ struct InstrumentLocals : public WalkerPass<PostWalker<InstrumentLocals>> {
curr, get_anyref, {Type::i32, Type::i32, Type::anyref}, Type::anyref);
addImport(
curr, set_anyref, {Type::i32, Type::i32, Type::anyref}, Type::anyref);
+ addImport(
+ curr, get_eqref, {Type::i32, Type::i32, Type::eqref}, Type::eqref);
+ addImport(
+ curr, set_eqref, {Type::i32, Type::i32, Type::eqref}, Type::eqref);
+ addImport(
+ curr, get_i31ref, {Type::i32, Type::i32, Type::i31ref}, Type::i31ref);
+ addImport(
+ curr, set_i31ref, {Type::i32, Type::i32, Type::i31ref}, Type::i31ref);
}
}
if (curr->features.hasSIMD()) {