| ; 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 |