summaryrefslogtreecommitdiff
path: root/src/wasm-traversal.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/wasm-traversal.h')
-rw-r--r--src/wasm-traversal.h192
1 files changed, 192 insertions, 0 deletions
diff --git a/src/wasm-traversal.h b/src/wasm-traversal.h
index cd83aa1b6..b32babf74 100644
--- a/src/wasm-traversal.h
+++ b/src/wasm-traversal.h
@@ -88,6 +88,18 @@ template<typename SubType, typename ReturnType = void> struct Visitor {
ReturnType visitTupleExtract(TupleExtract* curr) { return ReturnType(); }
ReturnType visitI31New(I31New* curr) { return ReturnType(); }
ReturnType visitI31Get(I31Get* curr) { return ReturnType(); }
+ ReturnType visitRefTest(RefTest* curr) { return ReturnType(); }
+ ReturnType visitRefCast(RefCast* curr) { return ReturnType(); }
+ ReturnType visitBrOnCast(BrOnCast* curr) { return ReturnType(); }
+ ReturnType visitRttCanon(RttCanon* curr) { return ReturnType(); }
+ ReturnType visitRttSub(RttSub* curr) { return ReturnType(); }
+ ReturnType visitStructNew(StructNew* curr) { return ReturnType(); }
+ ReturnType visitStructGet(StructGet* curr) { return ReturnType(); }
+ ReturnType visitStructSet(StructSet* curr) { return ReturnType(); }
+ ReturnType visitArrayNew(ArrayNew* curr) { return ReturnType(); }
+ ReturnType visitArrayGet(ArrayGet* curr) { return ReturnType(); }
+ ReturnType visitArraySet(ArraySet* curr) { return ReturnType(); }
+ ReturnType visitArrayLen(ArrayLen* curr) { return ReturnType(); }
// Module-level visitors
ReturnType visitExport(Export* curr) { return ReturnType(); }
ReturnType visitGlobal(Global* curr) { return ReturnType(); }
@@ -207,6 +219,30 @@ template<typename SubType, typename ReturnType = void> struct Visitor {
DELEGATE(I31New);
case Expression::Id::I31GetId:
DELEGATE(I31Get);
+ case Expression::Id::RefTestId:
+ DELEGATE(RefTest);
+ case Expression::Id::RefCastId:
+ DELEGATE(RefCast);
+ case Expression::Id::BrOnCastId:
+ DELEGATE(BrOnCast);
+ case Expression::Id::RttCanonId:
+ DELEGATE(RttCanon);
+ case Expression::Id::RttSubId:
+ DELEGATE(RttSub);
+ case Expression::Id::StructNewId:
+ DELEGATE(StructNew);
+ case Expression::Id::StructGetId:
+ DELEGATE(StructGet);
+ case Expression::Id::StructSetId:
+ DELEGATE(StructSet);
+ case Expression::Id::ArrayNewId:
+ DELEGATE(ArrayNew);
+ case Expression::Id::ArrayGetId:
+ DELEGATE(ArrayGet);
+ case Expression::Id::ArraySetId:
+ DELEGATE(ArraySet);
+ case Expression::Id::ArrayLenId:
+ DELEGATE(ArrayLen);
case Expression::Id::InvalidId:
default:
WASM_UNREACHABLE("unexpected expression type");
@@ -281,6 +317,18 @@ struct OverriddenVisitor {
UNIMPLEMENTED(TupleExtract);
UNIMPLEMENTED(I31New);
UNIMPLEMENTED(I31Get);
+ UNIMPLEMENTED(RefTest);
+ UNIMPLEMENTED(RefCast);
+ UNIMPLEMENTED(BrOnCast);
+ UNIMPLEMENTED(RttCanon);
+ UNIMPLEMENTED(RttSub);
+ UNIMPLEMENTED(StructNew);
+ UNIMPLEMENTED(StructGet);
+ UNIMPLEMENTED(StructSet);
+ UNIMPLEMENTED(ArrayNew);
+ UNIMPLEMENTED(ArrayGet);
+ UNIMPLEMENTED(ArraySet);
+ UNIMPLEMENTED(ArrayLen);
UNIMPLEMENTED(Export);
UNIMPLEMENTED(Global);
UNIMPLEMENTED(Function);
@@ -401,6 +449,30 @@ struct OverriddenVisitor {
DELEGATE(I31New);
case Expression::Id::I31GetId:
DELEGATE(I31Get);
+ case Expression::Id::RefTestId:
+ DELEGATE(RefTest);
+ case Expression::Id::RefCastId:
+ DELEGATE(RefCast);
+ case Expression::Id::BrOnCastId:
+ DELEGATE(BrOnCast);
+ case Expression::Id::RttCanonId:
+ DELEGATE(RttCanon);
+ case Expression::Id::RttSubId:
+ DELEGATE(RttSub);
+ case Expression::Id::StructNewId:
+ DELEGATE(StructNew);
+ case Expression::Id::StructGetId:
+ DELEGATE(StructGet);
+ case Expression::Id::StructSetId:
+ DELEGATE(StructSet);
+ case Expression::Id::ArrayNewId:
+ DELEGATE(ArrayNew);
+ case Expression::Id::ArrayGetId:
+ DELEGATE(ArrayGet);
+ case Expression::Id::ArraySetId:
+ DELEGATE(ArraySet);
+ case Expression::Id::ArrayLenId:
+ DELEGATE(ArrayLen);
case Expression::Id::InvalidId:
default:
WASM_UNREACHABLE("unexpected expression type");
@@ -572,6 +644,42 @@ struct UnifiedExpressionVisitor : public Visitor<SubType, ReturnType> {
ReturnType visitI31Get(I31Get* curr) {
return static_cast<SubType*>(this)->visitExpression(curr);
}
+ ReturnType visitRefTest(RefTest* curr) {
+ return static_cast<SubType*>(this)->visitExpression(curr);
+ }
+ ReturnType visitRefCast(RefCast* curr) {
+ return static_cast<SubType*>(this)->visitExpression(curr);
+ }
+ ReturnType visitBrOnCast(BrOnCast* curr) {
+ return static_cast<SubType*>(this)->visitExpression(curr);
+ }
+ ReturnType visitRttCanon(RttCanon* curr) {
+ return static_cast<SubType*>(this)->visitExpression(curr);
+ }
+ ReturnType visitRttSub(RttSub* curr) {
+ return static_cast<SubType*>(this)->visitExpression(curr);
+ }
+ ReturnType visitStructNew(StructNew* curr) {
+ return static_cast<SubType*>(this)->visitExpression(curr);
+ }
+ ReturnType visitStructGet(StructGet* curr) {
+ return static_cast<SubType*>(this)->visitExpression(curr);
+ }
+ ReturnType visitStructSet(StructSet* curr) {
+ return static_cast<SubType*>(this)->visitExpression(curr);
+ }
+ ReturnType visitArrayNew(ArrayNew* curr) {
+ return static_cast<SubType*>(this)->visitExpression(curr);
+ }
+ ReturnType visitArrayGet(ArrayGet* curr) {
+ return static_cast<SubType*>(this)->visitExpression(curr);
+ }
+ ReturnType visitArraySet(ArraySet* curr) {
+ return static_cast<SubType*>(this)->visitExpression(curr);
+ }
+ ReturnType visitArrayLen(ArrayLen* curr) {
+ return static_cast<SubType*>(this)->visitExpression(curr);
+ }
};
//
@@ -898,6 +1006,42 @@ struct Walker : public VisitorType {
static void doVisitI31Get(SubType* self, Expression** currp) {
self->visitI31Get((*currp)->cast<I31Get>());
}
+ static void doVisitRefTest(SubType* self, Expression** currp) {
+ self->visitRefTest((*currp)->cast<RefTest>());
+ }
+ static void doVisitRefCast(SubType* self, Expression** currp) {
+ self->visitRefCast((*currp)->cast<RefCast>());
+ }
+ static void doVisitBrOnCast(SubType* self, Expression** currp) {
+ self->visitBrOnCast((*currp)->cast<BrOnCast>());
+ }
+ static void doVisitRttCanon(SubType* self, Expression** currp) {
+ self->visitRttCanon((*currp)->cast<RttCanon>());
+ }
+ static void doVisitRttSub(SubType* self, Expression** currp) {
+ self->visitRttSub((*currp)->cast<RttSub>());
+ }
+ static void doVisitStructNew(SubType* self, Expression** currp) {
+ self->visitStructNew((*currp)->cast<StructNew>());
+ }
+ static void doVisitStructGet(SubType* self, Expression** currp) {
+ self->visitStructGet((*currp)->cast<StructGet>());
+ }
+ static void doVisitStructSet(SubType* self, Expression** currp) {
+ self->visitStructSet((*currp)->cast<StructSet>());
+ }
+ static void doVisitArrayNew(SubType* self, Expression** currp) {
+ self->visitArrayNew((*currp)->cast<ArrayNew>());
+ }
+ static void doVisitArrayGet(SubType* self, Expression** currp) {
+ self->visitArrayGet((*currp)->cast<ArrayGet>());
+ }
+ static void doVisitArraySet(SubType* self, Expression** currp) {
+ self->visitArraySet((*currp)->cast<ArraySet>());
+ }
+ static void doVisitArrayLen(SubType* self, Expression** currp) {
+ self->visitArrayLen((*currp)->cast<ArrayLen>());
+ }
void setModule(Module* module) { currModule = module; }
@@ -1209,6 +1353,54 @@ struct PostWalker : public Walker<SubType, VisitorType> {
self->pushTask(SubType::scan, &curr->cast<I31Get>()->i31);
break;
}
+ case Expression::Id::RefTestId:
+ self->pushTask(SubType::doVisitRefTest, currp);
+ WASM_UNREACHABLE("TODO (gc): ref.test");
+ break;
+ case Expression::Id::RefCastId:
+ self->pushTask(SubType::doVisitRefCast, currp);
+ WASM_UNREACHABLE("TODO (gc): ref.cast");
+ break;
+ case Expression::Id::BrOnCastId:
+ self->pushTask(SubType::doVisitBrOnCast, currp);
+ WASM_UNREACHABLE("TODO (gc): br_on_cast");
+ break;
+ case Expression::Id::RttCanonId:
+ self->pushTask(SubType::doVisitRttCanon, currp);
+ WASM_UNREACHABLE("TODO (gc): rtt.canon");
+ break;
+ case Expression::Id::RttSubId:
+ self->pushTask(SubType::doVisitRttSub, currp);
+ WASM_UNREACHABLE("TODO (gc): rtt.sub");
+ break;
+ case Expression::Id::StructNewId:
+ self->pushTask(SubType::doVisitStructNew, currp);
+ WASM_UNREACHABLE("TODO (gc): struct.new");
+ break;
+ case Expression::Id::StructGetId:
+ self->pushTask(SubType::doVisitStructGet, currp);
+ WASM_UNREACHABLE("TODO (gc): struct.get");
+ break;
+ case Expression::Id::StructSetId:
+ self->pushTask(SubType::doVisitStructSet, currp);
+ WASM_UNREACHABLE("TODO (gc): struct.set");
+ break;
+ case Expression::Id::ArrayNewId:
+ self->pushTask(SubType::doVisitArrayNew, currp);
+ WASM_UNREACHABLE("TODO (gc): array.new");
+ break;
+ case Expression::Id::ArrayGetId:
+ self->pushTask(SubType::doVisitArrayGet, currp);
+ WASM_UNREACHABLE("TODO (gc): array.get");
+ break;
+ case Expression::Id::ArraySetId:
+ self->pushTask(SubType::doVisitArraySet, currp);
+ WASM_UNREACHABLE("TODO (gc): array.set");
+ break;
+ case Expression::Id::ArrayLenId:
+ self->pushTask(SubType::doVisitArrayLen, currp);
+ WASM_UNREACHABLE("TODO (gc): array.len");
+ break;
case Expression::Id::NumExpressionIds:
WASM_UNREACHABLE("unexpected expression type");
}