This switches the EH implementation to the new proposal.
(The previous proposal is here.)
- 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:
catch block i32 br_on_exn $__cpp_exception end_block extract_exception
- Branch analysis for br_on_exn in WebAssemblyInstrInfo
- Other various misc. changes to switch to the new proposal.
We don't need catch intrinsic anymore; we don't lower them to catch instruction in isel but we add all catch instructions in LateEHPrepare.