Most of the complexity here is emitting filter expressions as standalone
LLVM functions. The filter functions are used in catch clauses in place
of type_info globals, and LLVM does the rest of the lowering.
Major aspects that still need work:
- __try body outlining with noinline and optnone.
- Cleanup support for __finally and destructors. LLVM won't be able to lower the current IR to anything useful.
- Local variable access in filter expressions.
- Don't use TLS to figure out which filter function fired. This requires work in LLVM.