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