summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/wasm-interpreter.h5
-rw-r--r--src/wasm-s-parser.h4
-rw-r--r--src/wasm.h17
3 files changed, 25 insertions, 1 deletions
diff --git a/src/wasm-interpreter.h b/src/wasm-interpreter.h
index dc88e296a..a95fa43ba 100644
--- a/src/wasm-interpreter.h
+++ b/src/wasm-interpreter.h
@@ -671,6 +671,11 @@ private:
NOTE_ENTER("Nop");
return Flow();
}
+ Flow visitUnreachable(Unreachable *curr) override {
+ NOTE_ENTER("Unreachable");
+ trap();
+ return Flow();
+ }
void trap() {
instance.externalInterface->trap();
diff --git a/src/wasm-s-parser.h b/src/wasm-s-parser.h
index eb86376ab..20091fc2c 100644
--- a/src/wasm-s-parser.h
+++ b/src/wasm-s-parser.h
@@ -570,6 +570,10 @@ public:
if (str[1] == 'a') return makeSwitch(s); // aka tableswitch
abort_on(str);
}
+ case 'u': {
+ if (str[1] == 'n') return allocator.alloc<Unreachable>();
+ abort_on(str);
+ }
default: abort_on(str);
}
}
diff --git a/src/wasm.h b/src/wasm.h
index 16685d596..7db8c8540 100644
--- a/src/wasm.h
+++ b/src/wasm.h
@@ -256,7 +256,8 @@ public:
ConvertId = 18,
SelectId = 19,
HostId = 20,
- NopId = 21
+ NopId = 21,
+ UnreachableId = 22
};
Id _id;
@@ -826,6 +827,15 @@ public:
}
};
+class Unreachable : public Expression {
+public:
+ Unreachable() : Expression(UnreachableId) {}
+
+ std::ostream& doPrint(std::ostream &o, unsigned indent) {
+ return printMinorOpening(o, "unreachable") << ')';
+ }
+};
+
// Globals
struct NameType {
@@ -1090,6 +1100,7 @@ struct WasmVisitor {
virtual ReturnType visitSelect(Select *curr) { abort(); }
virtual ReturnType visitHost(Host *curr) { abort(); }
virtual ReturnType visitNop(Nop *curr) { abort(); }
+ virtual ReturnType visitUnreachable(Unreachable *curr) { abort(); }
ReturnType visit(Expression *curr) {
assert(curr);
@@ -1115,6 +1126,7 @@ struct WasmVisitor {
case Expression::Id::SelectId: return visitSelect((Select*)curr);
case Expression::Id::HostId: return visitHost((Host*)curr);
case Expression::Id::NopId: return visitNop((Nop*)curr);
+ case Expression::Id::UnreachableId: return visitUnreachable((Unreachable*)curr);
default: {
std::cerr << "visiting unknown expression " << curr->_id << '\n';
abort();
@@ -1151,6 +1163,7 @@ std::ostream& Expression::print(std::ostream &o, unsigned indent) {
void visitSelect(Select *curr) override { curr->doPrint(o, indent); }
void visitHost(Host *curr) override { curr->doPrint(o, indent); }
void visitNop(Nop *curr) override { curr->doPrint(o, indent); }
+ void visitUnreachable(Unreachable *curr) override { curr->doPrint(o, indent); }
};
ExpressionPrinter(o, indent).visit(this);
@@ -1195,6 +1208,7 @@ struct WasmWalker : public WasmVisitor<void> {
void visitSelect(Select *curr) override {}
void visitHost(Host *curr) override {}
void visitNop(Nop *curr) override {}
+ void visitUnreachable(Unreachable *curr) override {}
// children-first
void walk(Expression*& curr) {
@@ -1286,6 +1300,7 @@ struct WasmWalker : public WasmVisitor<void> {
}
}
void visitNop(Nop *curr) override {}
+ void visitUnreachable(Unreachable *curr) override {}
};
ChildWalker(*this).visit(curr);