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.
These EHPadUnwindMap related stuff has been deleted because we stop at every catchpads now, so we don't need to worry about where we unwind next after an exception is not caught by a catchpad.