From e2f49d8227f2b71e4dede5cf4074bb9f65e3d77f Mon Sep 17 00:00:00 2001 From: Heejin Ahn Date: Tue, 13 Aug 2019 00:29:26 +0900 Subject: Add basic exception handling support (#2282) This adds basic support for exception handling instructions, according to the spec: https://github.com/WebAssembly/exception-handling/blob/master/proposals/Exceptions.md This PR includes support for: - Binary reading/writing - Wast reading/writing - Stack IR - Validation - binaryen.js + C API - Few IR routines: branch-utils, type-updating, etc - Few passes: just enough to make `wasm-opt -O` pass - Tests This PR does not include support for many optimization passes, fuzzer, or interpreter. They will be follow-up PRs. Try-catch construct is modeled in Binaryen IR in a similar manner to that of if-else: each of try body and catch body will contain a block, which can be omitted if there is only a single instruction. This block will not be emitted in wast or binary, as in if-else. As in if-else, `class Try` contains two expressions each for try body and catch body, and `catch` is not modeled as an instruction. `exnref` value pushed by `catch` is get by `pop` instruction. `br_on_exn` is special: it returns different types of values when taken and not taken. We make `exnref`, the type `br_on_exn` pushes if not taken, as `br_on_exn`'s type. --- src/binaryen-c.h | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) (limited to 'src/binaryen-c.h') diff --git a/src/binaryen-c.h b/src/binaryen-c.h index dc5d50fef..37e8c3204 100644 --- a/src/binaryen-c.h +++ b/src/binaryen-c.h @@ -127,6 +127,10 @@ BinaryenExpressionId BinaryenMemoryInitId(void); BinaryenExpressionId BinaryenDataDropId(void); BinaryenExpressionId BinaryenMemoryCopyId(void); BinaryenExpressionId BinaryenMemoryFillId(void); +BinaryenExpressionId BinaryenTryId(void); +BinaryenExpressionId BinaryenThrowId(void); +BinaryenExpressionId BinaryenRethrowId(void); +BinaryenExpressionId BinaryenBrOnExnId(void); BinaryenExpressionId BinaryenPushId(void); BinaryenExpressionId BinaryenPopId(void); @@ -701,6 +705,19 @@ BinaryenExpressionRef BinaryenMemoryFill(BinaryenModuleRef module, BinaryenExpressionRef dest, BinaryenExpressionRef value, BinaryenExpressionRef size); +BinaryenExpressionRef BinaryenTry(BinaryenModuleRef module, + BinaryenExpressionRef body, + BinaryenExpressionRef catchBody); +BinaryenExpressionRef BinaryenThrow(BinaryenModuleRef module, + const char* event, + BinaryenExpressionRef* operands, + BinaryenIndex numOperands); +BinaryenExpressionRef BinaryenRethrow(BinaryenModuleRef module, + BinaryenExpressionRef exnref); +BinaryenExpressionRef BinaryenBrOnExn(BinaryenModuleRef module, + const char* name, + const char* eventName, + BinaryenExpressionRef exnref); BinaryenExpressionRef BinaryenPush(BinaryenModuleRef module, BinaryenExpressionRef value); BinaryenExpressionRef BinaryenPop(BinaryenModuleRef module, BinaryenType type); @@ -855,6 +872,20 @@ BinaryenExpressionRef BinaryenMemoryFillGetDest(BinaryenExpressionRef expr); BinaryenExpressionRef BinaryenMemoryFillGetValue(BinaryenExpressionRef expr); BinaryenExpressionRef BinaryenMemoryFillGetSize(BinaryenExpressionRef expr); +BinaryenExpressionRef BinaryenTryGetBody(BinaryenExpressionRef expr); +BinaryenExpressionRef BinaryenTryGetCatchBody(BinaryenExpressionRef expr); + +const char* BinaryenThrowGetEvent(BinaryenExpressionRef expr); +BinaryenExpressionRef BinaryenThrowGetOperand(BinaryenExpressionRef expr, + BinaryenIndex index); +BinaryenIndex BinaryenThrowGetNumOperands(BinaryenExpressionRef expr); + +BinaryenExpressionRef BinaryenRethrowGetExnref(BinaryenExpressionRef expr); + +const char* BinaryenBrOnExnGetEvent(BinaryenExpressionRef expr); +const char* BinaryenBrOnExnGetName(BinaryenExpressionRef expr); +BinaryenExpressionRef BinaryenBrOnExnGetExnref(BinaryenExpressionRef expr); + BinaryenExpressionRef BinaryenPushGetValue(BinaryenExpressionRef expr); // Functions -- cgit v1.2.3