This is an archive of the discontinued LLVM Phabricator instance.

[WebAssembly] Error out on indirect uses of setjmp
ClosedPublic

Authored by aheejin on Sep 7 2021, 10:15 AM.

Details

Summary

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

  1. 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
  2. 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)

Diff Detail

Event Timeline

aheejin created this revision.Sep 7 2021, 10:15 AM
aheejin requested review of this revision.Sep 7 2021, 10:15 AM
Herald added a project: Restricted Project. · View Herald TranscriptSep 7 2021, 10:15 AM
dschuff accepted this revision.Sep 7 2021, 2:05 PM
dschuff added inline comments.
llvm/lib/Target/WebAssembly/WebAssemblyLowerEmscriptenEHSjLj.cpp
881

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"

This revision is now accepted and ready to land.Sep 7 2021, 2:05 PM
aheejin updated this revision to Diff 371206.Sep 7 2021, 3:50 PM
aheejin marked an inline comment as done.

Change the error message

This revision was landed with ongoing or failed builds.Sep 7 2021, 3:53 PM
This revision was automatically updated to reflect the committed changes.
thakis added a subscriber: thakis.Sep 7 2021, 4:01 PM

This seems to break tests: http://45.33.8.238/linux/55329/step_12.txt

Please take a look!

This test don't pass
x64 windows > LLVM.CodeGen/WebAssembly::lower-em-sjlj-indirect-setjmp.ll

Oh sorry, I forgot to change the test, and somehow missed the breakage notifications. And thank you @MaskRay for fixing this.