summaryrefslogtreecommitdiff
path: root/test/CodeGen/X86/win-catchpad-nested.ll
diff options
context:
space:
mode:
Diffstat (limited to 'test/CodeGen/X86/win-catchpad-nested.ll')
-rw-r--r--test/CodeGen/X86/win-catchpad-nested.ll42
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