diff options
author | Thomas Lively <7121787+tlively@users.noreply.github.com> | 2020-03-05 15:52:44 -0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-03-05 15:52:44 -0800 |
commit | 9e3dbb1f668a14341e9aebae479537d4a26095a5 (patch) | |
tree | 9857d50c3373c3f6320ca3f2586bd499bc40b224 /src/wasm-traversal.h | |
parent | 3a275d0627da443cce93631a64d78e7b3f441416 (diff) | |
download | binaryen-9e3dbb1f668a14341e9aebae479537d4a26095a5.tar.gz binaryen-9e3dbb1f668a14341e9aebae479537d4a26095a5.tar.bz2 binaryen-9e3dbb1f668a14341e9aebae479537d4a26095a5.zip |
Initial multivalue support (#2675)
Implements parsing and emitting of tuple creation and extraction and tuple-typed control flow for both the text and binary formats.
TODO:
- Extend Precompute/interpreter to handle tuple values
- C and JS API support/testing
- Figure out how to lower in stack IR
- Fuzzing
Diffstat (limited to 'src/wasm-traversal.h')
-rw-r--r-- | src/wasm-traversal.h | 37 |
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"); } |