Both Wasm & Emscripten SjLj handling has a restriction that setjmp
cannot be called indirectly. I thought we have been erroring out on
indirect uses of setjmp, but some recent CL disrupted the logic and
we are not erroring out anymore.
We currently
- Collect functions that contain setjmp calls in SetjmpUsers. This only counts direct calls: https://github.com/llvm/llvm-project/blob/8f77dc459e31aad6daab89a124fa92067916274c/llvm/lib/Target/WebAssembly/WebAssemblyLowerEmscriptenEHSjLj.cpp#L869-L878
- Run runSjLjOnFunction only on those SetjmpUsers. Within runSjLjOnFunction, if we see an indirect use of setjmp, we error out: https://github.com/llvm/llvm-project/blob/8f77dc459e31aad6daab89a124fa92067916274c/llvm/lib/Target/WebAssembly/WebAssemblyLowerEmscriptenEHSjLj.cpp#L1218-L1221
So if there are only indirect setjmp calls within the module,
SetjmpUsers will be empty, and runSjLjOnFunction is not even entered
once. And the indirect setjmp call will error out at link time. So in
this CL we check for the indirect uses of setjmp upfront before we
enter runSjLjOnFunction.
Also this currently errors out on invoke @setjmp, which can only occur
when using Wasm EH + Wasm SjLj within a function. We recently added Wasm
SjLj support but we don't support using Wasm EH + Wasm SjLj in the same
function yet. We plan to add this support very soon, so I don't think
it's worth creating another test file just for this. (This is an error
test so it needs its own file)
This error could probably be a bit clearer. e.g. what exactly does not support indirect use of setjmp? Maybe "wasm does not support indirect use of setjmp" or even just "indirect use of setjmp is not supported"