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.h37
1 files changed, 37 insertions, 0 deletions
diff --git a/src/wasm-traversal.h b/src/wasm-traversal.h
index ee6d22aa5..4cf318db9 100644
--- a/src/wasm-traversal.h
+++ b/src/wasm-traversal.h
@@ -83,6 +83,8 @@ template<typename SubType, typename ReturnType = void> struct Visitor {
ReturnType visitUnreachable(Unreachable* curr) { return ReturnType(); }
ReturnType visitPush(Push* curr) { return ReturnType(); }
ReturnType visitPop(Pop* curr) { return ReturnType(); }
+ ReturnType visitTupleMake(TupleMake* curr) { return ReturnType(); }
+ ReturnType visitTupleExtract(TupleExtract* curr) { return ReturnType(); }
// Module-level visitors
ReturnType visitExport(Export* curr) { return ReturnType(); }
ReturnType visitGlobal(Global* curr) { return ReturnType(); }
@@ -192,6 +194,10 @@ template<typename SubType, typename ReturnType = void> struct Visitor {
DELEGATE(Push);
case Expression::Id::PopId:
DELEGATE(Pop);
+ case Expression::Id::TupleMakeId:
+ DELEGATE(TupleMake);
+ case Expression::Id::TupleExtractId:
+ DELEGATE(TupleExtract);
case Expression::Id::InvalidId:
default:
WASM_UNREACHABLE("unexpected expression type");
@@ -261,6 +267,8 @@ struct OverriddenVisitor {
UNIMPLEMENTED(Unreachable);
UNIMPLEMENTED(Push);
UNIMPLEMENTED(Pop);
+ UNIMPLEMENTED(TupleMake);
+ UNIMPLEMENTED(TupleExtract);
UNIMPLEMENTED(Export);
UNIMPLEMENTED(Global);
UNIMPLEMENTED(Function);
@@ -371,6 +379,10 @@ struct OverriddenVisitor {
DELEGATE(Push);
case Expression::Id::PopId:
DELEGATE(Pop);
+ case Expression::Id::TupleMakeId:
+ DELEGATE(TupleMake);
+ case Expression::Id::TupleExtractId:
+ DELEGATE(TupleExtract);
case Expression::Id::InvalidId:
default:
WASM_UNREACHABLE("unexpected expression type");
@@ -527,6 +539,12 @@ struct UnifiedExpressionVisitor : public Visitor<SubType, ReturnType> {
ReturnType visitPop(Pop* curr) {
return static_cast<SubType*>(this)->visitExpression(curr);
}
+ ReturnType visitTupleMake(TupleMake* curr) {
+ return static_cast<SubType*>(this)->visitExpression(curr);
+ }
+ ReturnType visitTupleExtract(TupleExtract* curr) {
+ return static_cast<SubType*>(this)->visitExpression(curr);
+ }
};
//
@@ -838,6 +856,12 @@ struct Walker : public VisitorType {
static void doVisitPop(SubType* self, Expression** currp) {
self->visitPop((*currp)->cast<Pop>());
}
+ static void doVisitTupleMake(SubType* self, Expression** currp) {
+ self->visitTupleMake((*currp)->cast<TupleMake>());
+ }
+ static void doVisitTupleExtract(SubType* self, Expression** currp) {
+ self->visitTupleExtract((*currp)->cast<TupleExtract>());
+ }
void setModule(Module* module) { currModule = module; }
@@ -1126,6 +1150,19 @@ struct PostWalker : public Walker<SubType, VisitorType> {
self->pushTask(SubType::doVisitPop, currp);
break;
}
+ case Expression::Id::TupleMakeId: {
+ self->pushTask(SubType::doVisitTupleMake, currp);
+ auto& operands = curr->cast<TupleMake>()->operands;
+ for (int i = int(operands.size()) - 1; i >= 0; --i) {
+ self->pushTask(SubType::scan, &operands[i]);
+ }
+ break;
+ }
+ case Expression::Id::TupleExtractId: {
+ self->pushTask(SubType::doVisitTupleExtract, currp);
+ self->pushTask(SubType::scan, &curr->cast<TupleExtract>()->tuple);
+ break;
+ }
case Expression::Id::NumExpressionIds:
WASM_UNREACHABLE("unexpected expression type");
}