xref: /llvm-project/llvm/test/CodeGen/WinEH/wineh-statenumbering.ll (revision cdd685e17c91b517e3a011988f9c1d9a30594d06)
1; RUN: opt -mtriple=i686-pc-windows-msvc -S -x86-winehstate  < %s | FileCheck %s
2
3target datalayout = "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32"
4target triple = "i686-pc-windows-msvc"
5
6%rtti.TypeDescriptor2 = type { ptr, ptr, [3 x i8] }
7%eh.CatchableType = type { i32, ptr, i32, i32, i32, i32, ptr }
8%eh.CatchableTypeArray.1 = type { i32, [1 x ptr] }
9%eh.ThrowInfo = type { i32, ptr, ptr, ptr }
10
11$"\01??_R0H@8" = comdat any
12
13$"_CT??_R0H@84" = comdat any
14
15$_CTA1H = comdat any
16
17$_TI1H = comdat any
18
19@"\01??_7type_info@@6B@" = external constant ptr
20@"\01??_R0H@8" = linkonce_odr global %rtti.TypeDescriptor2 { ptr @"\01??_7type_info@@6B@", ptr null, [3 x i8] c".H\00" }, comdat
21@"_CT??_R0H@84" = linkonce_odr unnamed_addr constant %eh.CatchableType { i32 1, ptr @"\01??_R0H@8", i32 0, i32 -1, i32 0, i32 4, ptr null }, section ".xdata", comdat
22@_CTA1H = linkonce_odr unnamed_addr constant %eh.CatchableTypeArray.1 { i32 1, [1 x ptr] [ptr @"_CT??_R0H@84"] }, section ".xdata", comdat
23@_TI1H = linkonce_odr unnamed_addr constant %eh.ThrowInfo { i32 0, ptr null, ptr null, ptr @_CTA1H }, section ".xdata", comdat
24
25define i32 @main() #0 personality ptr @__CxxFrameHandler3 {
26entry:
27  %tmp = alloca i32, align 4
28  ; CHECK: entry:
29  ; CHECK:   store i32 -1
30  ; CHECK:   call void @g(i32 3)
31  ; CHECK-NEXT:   call void @g(i32 4)
32  ; CHECK-NEXT:   call void @g(i32 5)
33  call void @g(i32 3)
34  call void @g(i32 4)
35  call void @g(i32 5)
36  store i32 0, ptr %tmp, align 4
37  ; CHECK:   store i32 0
38  ; CHECK:   invoke void @_CxxThrowException(
39  invoke void @_CxxThrowException(ptr %tmp, ptr nonnull @_TI1H) #1
40          to label %unreachable.for.entry unwind label %catch.dispatch
41
42catch.dispatch:                                   ; preds = %entry
43  %cs1 = catchswitch within none [label %catch] unwind to caller
44
45catch:                                            ; preds = %catch.dispatch
46  %0 = catchpad within %cs1 [ptr null, i32 u0x40, ptr null]
47  ; CHECK: catch:
48  ; CHECK:   store i32 2
49  ; CHECK:   invoke void @_CxxThrowException(
50  invoke void @_CxxThrowException(ptr null, ptr null) [ "funclet"(token %0) ]
51          to label %unreachable unwind label %catch.dispatch.1
52
53catch.dispatch.1:                                 ; preds = %catch
54  %cs2 = catchswitch within %0 [label %catch.3] unwind to caller
55catch.3:                                          ; preds = %catch.dispatch.1
56  %1 = catchpad within %cs2 [ptr null, i32 u0x40, ptr null]
57  ; CHECK: catch.3:
58  ; CHECK:   store i32 3
59  ; CHECK:   call void @g(i32 1)
60  ; CHECK-NEXT:   call void @g(i32 2)
61  ; CHECK-NEXT:   call void @g(i32 3)
62  call void @g(i32 1)
63  call void @g(i32 2)
64  call void @g(i32 3)
65  catchret from %1 to label %try.cont
66
67try.cont:                                         ; preds = %catch.3
68  ; CHECK: try.cont:
69  ; CHECK:   store i32 1
70  ; CHECK:   call void @g(i32 2)
71  ; CHECK-NEXT:   call void @g(i32 3)
72  ; CHECK-NEXT:   call void @g(i32 4)
73  call void @g(i32 2)
74  call void @g(i32 3)
75  call void @g(i32 4)
76  unreachable
77
78unreachable:                                      ; preds = %catch
79  unreachable
80
81unreachable.for.entry:                            ; preds = %entry
82  unreachable
83}
84
85define i32 @nopads() #0 personality ptr @__CxxFrameHandler3 {
86  ret i32 0
87}
88
89; CHECK-LABEL: define i32 @nopads()
90; CHECK-NEXT: ret i32 0
91; CHECK-NOT: __ehhandler$nopads
92
93; CHECK-LABEL: define void @PR25926()
94define void @PR25926() personality ptr @__CxxFrameHandler3 {
95entry:
96  ; CHECK: entry:
97  ; CHECK:   store i32 -1
98  ; CHECK:   store i32 0
99  ; CHECK:   invoke void @_CxxThrowException(
100  invoke void @_CxxThrowException(ptr null, ptr null)
101          to label %unreachable unwind label %catch.dispatch
102
103catch.dispatch:                                   ; preds = %entry
104  %0 = catchswitch within none [label %catch] unwind to caller
105
106catch:                                            ; preds = %catch.dispatch
107  %1 = catchpad within %0 [ptr null, i32 64, ptr null]
108  ; CHECK: catch:
109  ; CHECK:   store i32 3
110  ; CHECK:   invoke void @_CxxThrowException(
111  invoke void @_CxxThrowException(ptr null, ptr null) [ "funclet"(token %1) ]
112          to label %unreachable1 unwind label %catch.dispatch1
113
114catch.dispatch1:                                  ; preds = %catch
115  %2 = catchswitch within %1 [label %catch2] unwind label %ehcleanup
116
117catch2:                                           ; preds = %catch.dispatch1
118  %3 = catchpad within %2 [ptr null, i32 64, ptr null]
119  catchret from %3 to label %try.cont
120
121try.cont:                                         ; preds = %catch2
122  ; CHECK: try.cont:
123  ; CHECK:   store i32 1
124  ; CHECK:   call void @dtor()
125  ; CHECK-NEXT:   call void @dtor()
126  ; CHECK-NEXT:   call void @dtor()
127  call void @dtor() #3 [ "funclet"(token %1) ]
128  call void @dtor() #3 [ "funclet"(token %1) ]
129  call void @dtor() #3 [ "funclet"(token %1) ]
130  catchret from %1 to label %try.cont4
131
132try.cont4:                                        ; preds = %try.cont
133  ret void
134
135ehcleanup:                                        ; preds = %catch.dispatch1
136  %4 = cleanuppad within %1 []
137  ; CHECK: ehcleanup:
138  ; CHECK:   call void @dtor()
139  call void @dtor() #3 [ "funclet"(token %4) ]
140  cleanupret from %4 unwind to caller
141
142unreachable:                                      ; preds = %entry
143  unreachable
144
145unreachable1:                                     ; preds = %catch
146  unreachable
147}
148
149; CHECK-LABEL: define void @required_state_store(
150define void @required_state_store(i1 zeroext %cond) personality ptr @_except_handler3 {
151entry:
152  %__exception_code = alloca i32, align 4
153  call void (...) @llvm.localescape(ptr nonnull %__exception_code)
154; CHECK:   store i32 -1
155; CHECK:   call void @g(i32 0)
156  call void @g(i32 0)
157  br i1 %cond, label %if.then, label %if.end
158
159if.then:                                          ; preds = %entry
160; CHECK:        store i32 0
161; CHECK-NEXT:   invoke void @g(i32 1)
162  invoke void @g(i32 1)
163          to label %if.end unwind label %catch.dispatch
164
165catch.dispatch:                                   ; preds = %if.then
166  %0 = catchswitch within none [label %__except.ret] unwind to caller
167
168__except.ret:                                     ; preds = %catch.dispatch
169  %1 = catchpad within %0 [ptr @"\01?filt$0@0@required_state_store@@"]
170  catchret from %1 to label %if.end
171
172if.end:                                           ; preds = %if.then, %__except.ret, %entry
173; CHECK:        store i32 -1
174; CHECK-NEXT:   call void @dtor()
175  call void @dtor()
176  ret void
177}
178
179define internal i32 @"\01?filt$0@0@required_state_store@@"() {
180entry:
181  %0 = tail call ptr @llvm.frameaddress(i32 1)
182  %1 = tail call ptr @llvm.eh.recoverfp(ptr @required_state_store, ptr %0)
183  %2 = tail call ptr @llvm.localrecover(ptr @required_state_store, ptr %1, i32 0)
184  %3 = getelementptr inbounds i8, ptr %0, i32 -20
185  %4 = load ptr, ptr %3, align 4
186  %5 = getelementptr inbounds { ptr, ptr }, ptr %4, i32 0, i32 0
187  %6 = load ptr, ptr %5, align 4
188  %7 = load i32, ptr %6, align 4
189  store i32 %7, ptr %2, align 4
190  ret i32 1
191}
192
193declare void @g(i32) #0
194
195declare void @dtor()
196
197declare x86_stdcallcc void @_CxxThrowException(ptr, ptr)
198
199declare i32 @__CxxFrameHandler3(...)
200
201declare ptr @llvm.frameaddress(i32)
202
203declare ptr @llvm.eh.recoverfp(ptr, ptr)
204
205declare ptr @llvm.localrecover(ptr, ptr, i32)
206
207declare void @llvm.localescape(...)
208
209declare i32 @_except_handler3(...)
210
211attributes #0 = { "disable-tail-calls"="false" "less-precise-fpmad"="false" "frame-pointer"="none" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "no-realign-stack" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" }
212attributes #1 = { noreturn }
213
214!llvm.ident = !{!0}
215
216!0 = !{!"clang version 3.8.0 (trunk 245153) (llvm/trunk 245238)"}
217