diff options
Diffstat (limited to 'test/CodeGen/X86/win-catchpad-nested.ll')
| -rw-r--r-- | test/CodeGen/X86/win-catchpad-nested.ll | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/test/CodeGen/X86/win-catchpad-nested.ll b/test/CodeGen/X86/win-catchpad-nested.ll new file mode 100644 index 0000000000000..7afcd9cc1f3e1 --- /dev/null +++ b/test/CodeGen/X86/win-catchpad-nested.ll @@ -0,0 +1,42 @@ +; RUN: llc -mtriple=x86_64-pc-windows-coreclr < %s | FileCheck %s + +declare void @ProcessCLRException() + +declare void @f() + +define void @test1() personality void ()* @ProcessCLRException { +entry: + invoke void @f() + to label %exit unwind label %catch.dispatch.1 +exit: + ret void + +catch.dispatch.1: + %cs1 = catchswitch within none [label %outer.catch] unwind to caller + +outer.catch: + %cp1 = catchpad within %cs1 [i32 1] + invoke void @f() [ "funclet"(token %cp1) ] + to label %outer.ret unwind label %catch.dispatch.2 +outer.ret: + catchret from %cp1 to label %exit + +catch.dispatch.2: + %cs2 = catchswitch within %cp1 [label %inner.catch] unwind to caller +inner.catch: + %cp2 = catchpad within %cs2 [i32 2] + catchret from %cp2 to label %outer.ret +} + +; Check the catchret targets +; CHECK-LABEL: test1: # @test1 +; CHECK: [[Exit:^[^: ]+]]: # Block address taken +; CHECK-NEXT: # %exit +; CHECK: [[OuterRet:^[^: ]+]]: # Block address taken +; CHECK-NEXT: # %outer.ret +; CHECK-NEXT: leaq [[Exit]](%rip), %rax +; CHECK: retq # CATCHRET +; CHECK: {{^[^: ]+}}: # %inner.catch +; CHECK: .seh_endprolog +; CHECK-NEXT: leaq [[OuterRet]](%rip), %rax +; CHECK: retq # CATCHRET |
