diff options
-rw-r--r-- | src/wasm-interpreter.h | 5 | ||||
-rw-r--r-- | src/wasm-s-parser.h | 4 | ||||
-rw-r--r-- | src/wasm.h | 17 |
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); |