xref: /llvm-project/llvm/test/CodeGen/AArch64/win-catchpad-nested-cxx.ll (revision 1ee315ae7964c8433b772e0b5d667834994ba753)
1; RUN: llc -verify-machineinstrs -mtriple=aarch64-pc-windows-msvc < %s \
2; RUN:     | FileCheck --check-prefix=CHECK %s
3
4; Loosely based on IR for this C++ source code:
5;   void f(int p);
6;   void try_in_catch() {
7;     try {
8;       f(1);
9;     } catch (...) {
10;       try {
11;         f(2);
12;       } catch (...) {
13;         f(3);
14;       }
15;     }
16;   }
17
18declare void @f(i32 %p)
19declare i32 @__CxxFrameHandler3(...)
20
21define i32 @try_in_catch() personality ptr @__CxxFrameHandler3 {
22entry:
23  invoke void @f(i32 1)
24          to label %try.cont unwind label %catch.dispatch.1
25try.cont:
26  ret i32 0
27
28catch.dispatch.1:
29  %cs1 = catchswitch within none [label %handler1] unwind to caller
30handler1:
31  %h1 = catchpad within %cs1 [ptr null, i32 64, ptr null]
32  invoke void @f(i32 2) [ "funclet"(token %h1) ]
33          to label %catchret1 unwind label %catch.dispatch.2
34catchret1:
35  catchret from %h1 to label %try.cont
36
37catch.dispatch.2:
38  %cs2 = catchswitch within %h1 [label %handler2] unwind to caller
39handler2:
40  %h2 = catchpad within %cs2 [ptr null, i32 64, ptr null]
41  call void @f(i32 3)
42  catchret from %h2 to label %catchret1
43}
44
45; CHECK-LABEL: $cppxdata$try_in_catch:
46; CHECK-NEXT: .word   429065506
47; CHECK-NEXT: .word   4
48; CHECK-NEXT: .word   ($stateUnwindMap$try_in_catch)
49; CHECK-NEXT: .word   2
50; CHECK-NEXT: .word   ($tryMap$try_in_catch)
51; ip2state num + ptr
52; CHECK-NEXT: .word   7
53; CHECK-NEXT: .word   ($ip2state$try_in_catch)
54; unwindhelp offset
55; CHECK-NEXT: .word   -16
56; CHECK-NEXT: .word   0
57; EHFlags
58; CHECK-NEXT: .word   1
59
60; CHECK-LABEL: $tryMap$try_in_catch:
61; CHECK-NEXT: .word   0
62; CHECK-NEXT: .word   0
63; CHECK-NEXT: .word   3
64; CHECK-NEXT: .word   1
65; CHECK-NEXT: .word   ($handlerMap$0$try_in_catch)
66; CHECK-NEXT: .word   2
67; CHECK-NEXT: .word   2
68; CHECK-NEXT: .word   3
69; CHECK-NEXT: .word   1
70; CHECK-NEXT: .word   ($handlerMap$1$try_in_catch)
71
72; CHECK: $handlerMap$0$try_in_catch:
73; CHECK-NEXT:   .word   64
74; CHECK-NEXT:   .word   0
75; CHECK-NEXT:   .word   0
76; CHECK-NEXT:   .word   "?catch${{[0-9]+}}@?0?try_in_catch@4HA"
77; CHECK-NEXT:   .word   0
78
79; CHECK: $handlerMap$1$try_in_catch:
80; CHECK-NEXT:   .word   64
81; CHECK-NEXT:   .word   0
82; CHECK-NEXT:   .word   0
83; CHECK-NEXT:   .word   "?catch${{[0-9]+}}@?0?try_in_catch@4HA"
84; CHECK-NEXT:   .word   0
85
86; CHECK: $ip2state$try_in_catch:
87; CHECK-NEXT: .word   .Lfunc_begin0@IMGREL
88; CHECK-NEXT: .word   -1
89; CHECK-NEXT: .word   .Ltmp0@IMGREL
90; CHECK-NEXT: .word   0
91; CHECK-NEXT: .word   .Ltmp1@IMGREL
92; CHECK-NEXT: .word   -1
93; CHECK-NEXT: .word   "?catch$2@?0?try_in_catch@4HA"@IMGREL
94; CHECK-NEXT: .word   1
95; CHECK-NEXT: .word   .Ltmp2@IMGREL
96; CHECK-NEXT: .word   2
97; CHECK-NEXT: .word   .Ltmp3@IMGREL
98; CHECK-NEXT: .word   1
99; CHECK-NEXT: .word   "?catch$4@?0?try_in_catch@4HA"@IMGREL
100; CHECK-NEXT: .word   3
101