[WebAssembly] Exception handling: Switch to the new proposal


[WebAssembly] Exception handling: Switch to the new proposal

This switches the EH implementation to the new proposal:
(The previous proposal was

  • Instruction changes
    • Now we have one single catch instruction that returns a except_ref value
    • throw now can take variable number of operations
    • rethrow does not have 'depth' argument anymore
    • br_on_exn queries an except_ref to see if it matches the tag and branches to the given label if true.
    • extract_exception is a pseudo instruction that simulates popping values from wasm stack. This is to make br_on_exn, a very special instruction, work: br_on_exn puts values onto the stack only if it is taken, and the # of values can vay depending on the tag.
  • Now there's only one catch per try, this patch removes all special handling for terminate pad with a call to __clang_call_terminate. Before it was the only case there are two catch clauses (a normal catch and catch_all per try).
  • Make rethrow act as a terminator like throw. This splits BB after rethrow in WasmEHPrepare, and deletes an unnecessary unreachable after rethrow in LateEHPrepare.
  • Now we stop at all catchpads (because we add wasm catch instruction that catches all exceptions), this creates new findWasmUnwindDestinations function in SelectionDAGBuilder.
  • Now we use br_on_exn instrution to figure out if an except_ref matches the current tag or not, LateEHPrepare generates this sequence for catch pads:
block i32
br_on_exn $__cpp_exception
  • Branch analysis for br_on_exn in WebAssemblyInstrInfo
  • Other various misc. changes to switch to the new proposal.

Reviewers: dschuff

Subscribers: sbc100, jgravelle-google, sunfish, llvm-commits

Differential Revision: https://reviews.llvm.org/D57134