summaryrefslogtreecommitdiff
path: root/src/ast_utils.h
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2017-10-24 16:48:13 -0700
committerGitHub <noreply@github.com>2017-10-24 16:48:13 -0700
commit059e6e37ce17fb16d1087d00579a92d7b8634c25 (patch)
treec05db4142ba38f44e67c1c776ac3bcea25f8f88f /src/ast_utils.h
parentde4b36f88138637132f428789187cde9fb499dd2 (diff)
downloadbinaryen-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.h26
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--) {