You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
wasi-sdk/SetjmpLongjmp.md

2.6 KiB

C setjmp/longjmp support

WASI-SDK provides basic setjmp/longjmp support.

Note that it's still under active development and may change in future versions.

Build an application

To build an application using setjmp/longjmp, you need two things:

  • Enable the necessary LLVM translation (-mllvm -wasm-enable-sjlj)

  • Link the setjmp library (-lsetjmp)

Example without LTO

clang -Os -mllvm -wasm-enable-sjlj -o your_app.legacy.wasm your_app.c -lsetjmp

Example with LTO

clang -Os -flto=full -mllvm -wasm-enable-sjlj -Wl,-mllvm,-wasm-enable-sjlj -o your_app.legacy.wasm your_app.c -lsetjmp

Run an application

To run the application built as in the previous section, you need to use a runtime with exception handling proposal support.

Unfortunately, there are two incompatible versions of exception handling proposal, which is commonly implemented by runtimes.

  • The latest version with exnref

  • The legacy phase3 version

Example with the latest exception handling proposal

By default, the current version of WASI-SDK produces the legacy "phase3" version of exception handling proposal instructions.

You can tell the llvm to produce the latest version of proposal by specifying -mllvm -wasm-use-legacy-eh=false. This is expected to be the default in a future version.

Alternatively, you can use binaryen wasm-opt command to convert existing modules from the legacy "phase3" version to the "exnref" version.

wasm-opt --translate-to-exnref -all -o your_app.wasm your_app.legacy.wasm

Then you can run it with a runtime supporting the "exnref" version of the proposal. toywasm is an example of such runtimes.

toywasm --wasi your_app.wasm

(You may need to enable the support with -D TOYWASM_ENABLE_WASM_EXCEPTION_HANDLING=ON.)

Example with the legacy phase3 exception handling proposal

If your runtime supports the legacy phase3 version of exception handling proposal, which is the same version as what WASI-SDK currently produces by default, you can run the produced module as it is.

For example, the classic interpreter of wasm-micro-runtime is one of such runtimes.

iwasm your_app.legacy.wasm

(You may need to enable the support with -D WAMR_BUILD_EXCE_HANDLING=1 -D WAMR_BUILD_FAST_INTERP=0.)