Skip to content

Commit

Permalink
LLVM 19 + setjmp/longjmp doc (#480)
Browse files Browse the repository at this point in the history
* llvmorg-19.1.0-rc3

* document setjmp/longjmp support

* README.md: mention SetjmpLongjmp.md

* bump wasi-libc

For following changes:

* WebAssembly/wasi-libc#526
* WebAssembly/wasi-libc#529

* bump llvm to llvmorg-19.1.0-rc4

* bump llvm to llvmorg-19.1.0
  • Loading branch information
yamt authored Sep 24, 2024
1 parent adbbf2c commit 54545d5
Show file tree
Hide file tree
Showing 4 changed files with 84 additions and 5 deletions.
10 changes: 7 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -203,12 +203,16 @@ disabled in a configure step before building with WASI SDK.
## Notable Limitations

This repository does not yet support __C++ exceptions__. C++ code is supported
only with -fno-exceptions for now. Similarly, there is not yet support for
setjmp/longjmp. Work on support for [exception handling] is underway at the
language level which will support both of these features.
only with -fno-exceptions for now.
Work on support for [exception handling] is underway at the
language level which will support the features.

[exception handling]: https://github.com/WebAssembly/exception-handling/

See [C setjmp/longjmp support] about setjmp/longjmp support.

[C setjmp/longjmp support]: SetjmpLongjmp.md

This repository experimentally supports __threads__ with
`--target=wasm32-wasi-threads`. It uses WebAssembly's [threads] primitives
(atomics, `wait`/`notify`, shared memory) and [wasi-threads] for spawning
Expand Down
75 changes: 75 additions & 0 deletions SetjmpLongjmp.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
# C setjmp/longjmp support

## 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

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

### Example with LTO

```shell
clang -Os -flto=full -mllvm -wasm-enable-sjlj -Wl,-mllvm,-wasm-enable-sjlj -o your_app.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 [phase3] version

### Example with the latest exception handling proposal

Because the current version of WASI-SDK produces an old version
of [exception handling proposal] instructions, if your runtime
implements the latest version of the proposal, you need to convert
your module to the latest version.

[toywasm] is an example of such runtimes.

You can use binaryen `wasm-opt` command for the conversion.

```shell
wasm-opt --translate-to-exnref -all -o your_app.exnref.wasm your_app.wasm
```

Then you can run it with a runtime supporting the latest version of
[exception handling proposal].

```shell
toywasm --wasi your_app.exnref.wasm
```
(You may need to enable the support with `-D TOYWASM_ENABLE_WASM_EXCEPTION_HANDLING=ON`.)

### Example with the phase3 exception handling proposal (a bit older version)

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

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

```shell
iwasm your_app.wasm
```
(You may need to enable the support with `-D WAMR_BUILD_EXCE_HANDLING=1 -D WAMR_BUILD_FAST_INTERP=0`.)

[exception handling proposal]: https://github.com/WebAssembly/exception-handling/
[phase3]: https://github.com/WebAssembly/exception-handling/tree/main/proposals/exception-handling/legacy
[toywasm]: https://github.com/yamt/toywasm
[wasm-micro-runtime]: https://github.com/bytecodealliance/wasm-micro-runtime
2 changes: 1 addition & 1 deletion src/llvm-project

0 comments on commit 54545d5

Please sign in to comment.