diff options
author | Alon Zakai <alonzakai@gmail.com> | 2017-10-24 16:48:13 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-10-24 16:48:13 -0700 |
commit | 059e6e37ce17fb16d1087d00579a92d7b8634c25 (patch) | |
tree | c05db4142ba38f44e67c1c776ac3bcea25f8f88f /src/ast_utils.h | |
parent | de4b36f88138637132f428789187cde9fb499dd2 (diff) | |
download | binaryen-059e6e37ce17fb16d1087d00579a92d7b8634c25.tar.gz binaryen-059e6e37ce17fb16d1087d00579a92d7b8634c25.tar.bz2 binaryen-059e6e37ce17fb16d1087d00579a92d7b8634c25.zip |
Fix atomics refinalization (we were missing some glue) (#1241)
And add a visitor which must override all its elements, so this never happens again
Diffstat (limited to 'src/ast_utils.h')
-rw-r--r-- | src/ast_utils.h | 26 |
1 files changed, 24 insertions, 2 deletions
diff --git a/src/ast_utils.h b/src/ast_utils.h index 6e5251860..4a8d9ff80 100644 --- a/src/ast_utils.h +++ b/src/ast_utils.h @@ -76,7 +76,7 @@ struct ExpressionAnalyzer { // vs // (block (unreachable)) // This converts to the latter form. -struct ReFinalize : public WalkerPass<PostWalker<ReFinalize>> { +struct ReFinalize : public WalkerPass<PostWalker<ReFinalize, OverriddenVisitor<ReFinalize>>> { bool isFunctionParallel() override { return true; } Pass* create() override { return new ReFinalize; } @@ -154,6 +154,8 @@ struct ReFinalize : public WalkerPass<PostWalker<ReFinalize>> { void visitStore(Store *curr) { curr->finalize(); } void visitAtomicRMW(AtomicRMW *curr) { curr->finalize(); } void visitAtomicCmpxchg(AtomicCmpxchg *curr) { curr->finalize(); } + void visitAtomicWait(AtomicWait* curr) { curr->finalize(); } + void visitAtomicWake(AtomicWake* curr) { curr->finalize(); } void visitConst(Const *curr) { curr->finalize(); } void visitUnary(Unary *curr) { curr->finalize(); } void visitBinary(Binary *curr) { curr->finalize(); } @@ -173,6 +175,14 @@ struct ReFinalize : public WalkerPass<PostWalker<ReFinalize>> { } } + void visitFunctionType(FunctionType* curr) { WASM_UNREACHABLE(); } + void visitImport(Import* curr) { WASM_UNREACHABLE(); } + void visitExport(Export* curr) { WASM_UNREACHABLE(); } + void visitGlobal(Global* curr) { WASM_UNREACHABLE(); } + void visitTable(Table* curr) { WASM_UNREACHABLE(); } + void visitMemory(Memory* curr) { WASM_UNREACHABLE(); } + void visitModule(Module* curr) { WASM_UNREACHABLE(); } + WasmType getValueType(Expression* value) { return value ? value->type : none; } @@ -186,7 +196,7 @@ struct ReFinalize : public WalkerPass<PostWalker<ReFinalize>> { // Re-finalize a single node. This is slow, if you want to refinalize // an entire ast, use ReFinalize -struct ReFinalizeNode : public Visitor<ReFinalizeNode> { +struct ReFinalizeNode : public OverriddenVisitor<ReFinalizeNode> { void visitBlock(Block *curr) { curr->finalize(); } void visitIf(If *curr) { curr->finalize(); } void visitLoop(Loop *curr) { curr->finalize(); } @@ -201,6 +211,10 @@ struct ReFinalizeNode : public Visitor<ReFinalizeNode> { void visitSetGlobal(SetGlobal *curr) { curr->finalize(); } void visitLoad(Load *curr) { curr->finalize(); } void visitStore(Store *curr) { curr->finalize(); } + void visitAtomicRMW(AtomicRMW* curr) { curr->finalize(); } + void visitAtomicCmpxchg(AtomicCmpxchg* curr) { curr->finalize(); } + void visitAtomicWait(AtomicWait* curr) { curr->finalize(); } + void visitAtomicWake(AtomicWake* curr) { curr->finalize(); } void visitConst(Const *curr) { curr->finalize(); } void visitUnary(Unary *curr) { curr->finalize(); } void visitBinary(Binary *curr) { curr->finalize(); } @@ -211,6 +225,14 @@ struct ReFinalizeNode : public Visitor<ReFinalizeNode> { void visitNop(Nop *curr) { curr->finalize(); } void visitUnreachable(Unreachable *curr) { curr->finalize(); } + void visitFunctionType(FunctionType* curr) { WASM_UNREACHABLE(); } + void visitImport(Import* curr) { WASM_UNREACHABLE(); } + void visitExport(Export* curr) { WASM_UNREACHABLE(); } + void visitGlobal(Global* curr) { WASM_UNREACHABLE(); } + void visitTable(Table* curr) { WASM_UNREACHABLE(); } + void visitMemory(Memory* curr) { WASM_UNREACHABLE(); } + void visitModule(Module* curr) { WASM_UNREACHABLE(); } + // given a stack of nested expressions, update them all from child to parent static void updateStack(std::vector<Expression*>& expressionStack) { for (int i = int(expressionStack.size()) - 1; i >= 0; i--) { |