On Wasm, it's not currently possibly to change which `personality` is attached to a given IR function. This is primarily because no matter what `personality` is attached, codegen creates a call to a `Unwind_CallPersonality` wrapper hard-coded to call c++abi's personality. In order to allow alternative personalities without introducing bloat at each personality call site, this PR adjusts the ABI of the personality on Wasm. `Unwind_CallPersonality` is moved to `libcxxabi` under the name `__gxx_wasm_personality_v0`, with the "real" personality code renamed `__gxx_personality_imp` and called by `__gxx_wasm_personality_v0` (after resetting the landing pad context). The signature of EH personalities on Wasm is now `int personality(void* exception_object)` (where the int return is `_Unwind_Reason_Code` and the `void*` is `_Unwind_Exception*`), and personalities are expected to `__wasm_lpad_context.selector = 0;`. Based on #175202
113 lines
3.2 KiB
YAML
113 lines
3.2 KiB
YAML
# RUN: llc -mtriple=wasm32-unknown-unknown -wasm-use-legacy-eh -wasm-enable-eh -exception-model=wasm -mattr=+exception-handling -run-pass wasm-late-eh-prepare -run-pass wasm-cfg-stackify %s -o - | FileCheck %s
|
|
|
|
--- |
|
|
target triple = "wasm32-unknown-unknown"
|
|
|
|
declare i32 @__gxx_wasm_personality_v0(ptr)
|
|
declare void @foo()
|
|
define void @eh_label_test() personality ptr @__gxx_wasm_personality_v0 {
|
|
ret void
|
|
}
|
|
define void @unreachable_ehpad_test() personality ptr @__gxx_wasm_personality_v0 {
|
|
ret void
|
|
}
|
|
define void @empty_cleanuppad_test() personality ptr @__gxx_wasm_personality_v0 {
|
|
ret void
|
|
}
|
|
...
|
|
|
|
---
|
|
# This tests 'try' and 'catch' instructions are correctly placed with respect to
|
|
# EH_LABEL instructions.
|
|
# CHECK-LABEL: name: eh_label_test
|
|
name: eh_label_test
|
|
liveins:
|
|
- { reg: '$arguments' }
|
|
frameInfo:
|
|
hasCalls: true
|
|
body: |
|
|
bb.0:
|
|
; TRY should be before EH_LABEL wrappers of throwing calls
|
|
; CHECK: bb.0
|
|
; CHECK: TRY
|
|
; CHECK-NEXT: EH_LABEL
|
|
; CHECK-NEXT: CALL @foo
|
|
; CHECK-NEXT: EH_LABEL
|
|
successors: %bb.1, %bb.2
|
|
EH_LABEL <mcsymbol .Ltmp0>
|
|
CALL @foo, implicit-def dead $arguments, implicit $sp32, implicit $sp64
|
|
EH_LABEL <mcsymbol .Ltmp1>
|
|
BR %bb.2, implicit-def dead $arguments
|
|
|
|
bb.1 (landing-pad):
|
|
; predecessors: %bb.0
|
|
successors: %bb.2
|
|
; CATCH_ALL_LEGACY should be after EH_LABELs in the beginning of an EH pad.
|
|
; (Sometimes there are multiple EH_LABELs in an EH pad. This test tests
|
|
; that.) GLOBAL_SET should follow right after that.
|
|
; CHECK: bb.1
|
|
; CHECK: EH_LABEL
|
|
; CHECK: EH_LABEL
|
|
; CHECK-NEXT: CATCH_ALL_LEGACY
|
|
; CHECK-NEXT: GLOBAL_SET_I32
|
|
EH_LABEL <mcsymbol .Ltmp2>
|
|
EH_LABEL <mcsymbol .Ltmp2>
|
|
CATCHRET %bb.2, %bb.1, implicit-def dead $arguments
|
|
|
|
bb.2:
|
|
; predecessors: %bb.0, %bb.1
|
|
RETURN implicit-def dead $arguments
|
|
...
|
|
|
|
---
|
|
# Unreachable EH pads should be removed by LateEHPrepare.
|
|
# CHECK-LABEL: name: unreachable_ehpad_test
|
|
name: unreachable_ehpad_test
|
|
liveins:
|
|
- { reg: '$arguments' }
|
|
body: |
|
|
; CHECK: bb.0
|
|
bb.0:
|
|
successors: %bb.2
|
|
BR %bb.2, implicit-def dead $arguments
|
|
|
|
; This EH pad is unreachable, so it should be removed by LateEHPrepare
|
|
; CHECK-NOT: bb.1 (landing-pad)
|
|
bb.1 (landing-pad):
|
|
successors: %bb.2
|
|
EH_LABEL <mcsymbol .Ltmp2>
|
|
CATCHRET %bb.2, %bb.1, implicit-def dead $arguments
|
|
|
|
; This BB should remain (it will be renumbered to bb.1)
|
|
; CHECK: bb.1
|
|
bb.2:
|
|
; predecessors: %bb.0, %bb.1
|
|
RETURN implicit-def dead $arguments
|
|
...
|
|
|
|
---
|
|
# Regression test for a bug that LateEHPrepare::addCatchAll didn't handle empty
|
|
# cleanup pads. (It tried to get debug info from end() iterator.)
|
|
name: empty_cleanuppad_test
|
|
liveins:
|
|
- { reg: '$arguments' }
|
|
body: |
|
|
bb.0:
|
|
successors: %bb.1, %bb.3
|
|
EH_LABEL <mcsymbol .Ltmp0>
|
|
CALL @foo, implicit-def dead $arguments, implicit $sp32, implicit $sp64
|
|
EH_LABEL <mcsymbol .Ltmp1>
|
|
BR %bb.3, implicit-def dead $arguments
|
|
|
|
;; Empty cleanuppad
|
|
bb.1 (landing-pad):
|
|
successors: %bb.2
|
|
EH_LABEL <mcsymbol .Ltmp2>
|
|
|
|
bb.2:
|
|
successors: %bb.3
|
|
CLEANUPRET %bb.1, implicit-def dead $arguments
|
|
|
|
bb.3:
|
|
RETURN implicit-def dead $arguments
|
|
...
|