• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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; CHECK: $tryMap$try_in_catch:
66; CHECK-NEXT: .long   2
67; CHECK-NEXT: .long   2
68; CHECK-NEXT: .long   3
69; CHECK-NEXT: .long   1
70; CHECK-NEXT: .long   ($handlerMap$0$try_in_catch)
71; CHECK-NEXT: .long   0
72; CHECK-NEXT: .long   0
73; CHECK-NEXT: .long   3
74; CHECK-NEXT: .long   1
75; CHECK-NEXT: .long   ($handlerMap$1$try_in_catch)
76
77; CHECK: $handlerMap$0$try_in_catch:
78; CHECK-NEXT:   .long   64
79; CHECK-NEXT:   .long   0
80; CHECK-NEXT:   .long   0
81; CHECK-NEXT:   .long   "?catch${{[0-9]+}}@?0?try_in_catch@4HA"
82; X64-NEXT:   .long   56
83
84; CHECK: $handlerMap$1$try_in_catch:
85; CHECK-NEXT:   .long   64
86; CHECK-NEXT:   .long   0
87; CHECK-NEXT:   .long   0
88; CHECK-NEXT:   .long   "?catch${{[0-9]+}}@?0?try_in_catch@4HA"
89; X64-NEXT:   .long   56
90
91; X64: $ip2state$try_in_catch:
92; X64-NEXT: .long   .Lfunc_begin0@IMGREL
93; X64-NEXT: .long   -1
94; X64-NEXT: .long   .Ltmp0@IMGREL+1
95; X64-NEXT: .long   0
96; X64-NEXT: .long   .Ltmp1@IMGREL+1
97; X64-NEXT: .long   -1
98; X64-NEXT: .long   "?catch$2@?0?try_in_catch@4HA"@IMGREL
99; X64-NEXT: .long   1
100; X64-NEXT: .long   .Ltmp2@IMGREL+1
101; X64-NEXT: .long   2
102; X64-NEXT: .long   .Ltmp3@IMGREL+1
103; X64-NEXT: .long   1
104; X64-NEXT: .long   "?catch$4@?0?try_in_catch@4HA"@IMGREL
105; X64-NEXT: .long   3
106