xref: /llvm-project/llvm/test/CodeGen/X86/windows-seh-EHa-TryInFinally.ll (revision b9ae06ba15936c9802d5668cea260ad36a243a10)
1; RUN: llc -verify-machineinstrs < %s | FileCheck %s
2
3; CHECK-LABEL: "?fin$0@0@main@@"
4; CHECK:      .seh_handlerdata
5; CHECK:      .set ".L?fin$0@0@main@@$parent_frame_offset", 48
6; CHECK-NEXT:        .long   (.Llsda_end1-.Llsda_begin1)/16
7; CHECK-NEXT: .Llsda_begin1:
8; CHECK-NEXT:        .long   .Ltmp
9; CHECK-NEXT:        .long   .Ltmp
10; CHECK-NEXT:        .long   "?dtor$
11; CHECK-NEXT:        .long   0
12; CHECK-NEXT: .Llsda_end1:
13
14; ModuleID = 'windows-seh-EHa-TryInFinally.cpp'
15source_filename = "windows-seh-EHa-TryInFinally.cpp"
16target datalayout = "e-m:w-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
17target triple = "x86_64-unknown-windows-msvc"
18
19$"??_C@_0CI@MDFPIOJJ@?5?9?9?9?5Test?5_Try?5in?5_finally?5?9?9?9?5i@" = comdat any
20
21$"??_C@_0BN@HHKJHLBE@?5?5In?5Inner?5_finally?5i?5?$DN?5?$CFd?5?6?$AA@" = comdat any
22
23$"??_C@_0BN@HAIIIOKI@?5?5In?5outer?5_finally?5i?5?$DN?5?$CFd?5?6?$AA@" = comdat any
24
25$"??_C@_0BJ@OJMMAGCD@?5?5In?5outer?5_try?5i?5?$DN?5?$CFd?5?6?$AA@" = comdat any
26
27$"??_C@_0CG@ENDJHCGA@?5?9?9?9?5In?5outer?5except?5handler?5i?5?$DN@" = comdat any
28
29@"??_C@_0CI@MDFPIOJJ@?5?9?9?9?5Test?5_Try?5in?5_finally?5?9?9?9?5i@" = linkonce_odr dso_local unnamed_addr constant [40 x i8] c" --- Test _Try in _finally --- i = %d \0A\00", comdat, align 1
30@"??_C@_0BN@HHKJHLBE@?5?5In?5Inner?5_finally?5i?5?$DN?5?$CFd?5?6?$AA@" = linkonce_odr dso_local unnamed_addr constant [29 x i8] c"  In Inner _finally i = %d \0A\00", comdat, align 1
31@"??_C@_0BN@HAIIIOKI@?5?5In?5outer?5_finally?5i?5?$DN?5?$CFd?5?6?$AA@" = linkonce_odr dso_local unnamed_addr constant [29 x i8] c"  In outer _finally i = %d \0A\00", comdat, align 1
32@"??_C@_0BJ@OJMMAGCD@?5?5In?5outer?5_try?5i?5?$DN?5?$CFd?5?6?$AA@" = linkonce_odr dso_local unnamed_addr constant [25 x i8] c"  In outer _try i = %d \0A\00", comdat, align 1
33@"??_C@_0CG@ENDJHCGA@?5?9?9?9?5In?5outer?5except?5handler?5i?5?$DN@" = linkonce_odr dso_local unnamed_addr constant [38 x i8] c" --- In outer except handler i = %d \0A\00", comdat, align 1
34
35; Function Attrs: noinline norecurse optnone
36define dso_local i32 @main() #0 personality ptr @__C_specific_handler {
37entry:
38  %retval = alloca i32, align 4
39  %i = alloca i32, align 4
40  %__exception_code = alloca i32, align 4
41  call void (...) @llvm.localescape(ptr %i)
42  store i32 0, ptr %retval, align 4
43  store i32 0, ptr %i, align 4
44  br label %for.cond
45
46for.cond:                                         ; preds = %for.inc, %entry
47  %0 = load i32, ptr %i, align 4
48  %cmp = icmp slt i32 %0, 3
49  br i1 %cmp, label %for.body, label %for.end
50
51for.body:                                         ; preds = %for.cond
52  %1 = load i32, ptr %i, align 4
53  call void (...) @"?printf@@YAXZZ"(ptr @"??_C@_0CI@MDFPIOJJ@?5?9?9?9?5Test?5_Try?5in?5_finally?5?9?9?9?5i@", i32 %1)
54  invoke void @llvm.seh.try.begin()
55          to label %invoke.cont unwind label %catch.dispatch
56
57invoke.cont:                                      ; preds = %for.body
58  invoke void @llvm.seh.try.begin()
59          to label %invoke.cont1 unwind label %ehcleanup
60
61invoke.cont1:                                     ; preds = %invoke.cont
62  %2 = load volatile i32, ptr %i, align 4
63  invoke void (...) @"?printf@@YAXZZ"(ptr @"??_C@_0BJ@OJMMAGCD@?5?5In?5outer?5_try?5i?5?$DN?5?$CFd?5?6?$AA@", i32 %2) #6
64          to label %invoke.cont2 unwind label %ehcleanup
65
66invoke.cont2:                                     ; preds = %invoke.cont1
67  %3 = load volatile i32, ptr %i, align 4
68  %cmp3 = icmp eq i32 %3, 0
69  br i1 %cmp3, label %if.then, label %if.end
70
71if.then:                                          ; preds = %invoke.cont2
72  store volatile i32 0, ptr inttoptr (i64 17 to ptr), align 4
73  br label %if.end
74
75if.end:                                           ; preds = %if.then, %invoke.cont2
76  invoke void @llvm.seh.try.end()
77          to label %invoke.cont4 unwind label %ehcleanup
78
79invoke.cont4:                                     ; preds = %if.end
80  %4 = call ptr @llvm.localaddress()
81  invoke void @"?fin$0@0@main@@"(i8 0, ptr %4) #6
82          to label %invoke.cont5 unwind label %catch.dispatch
83
84invoke.cont5:                                     ; preds = %invoke.cont4
85  invoke void @llvm.seh.try.end()
86          to label %invoke.cont7 unwind label %catch.dispatch
87
88catch.dispatch:                                   ; preds = %invoke.cont5, %invoke.cont6, %ehcleanup, %invoke.cont4, %for.body
89  %5 = catchswitch within none [label %__except] unwind to caller
90
91__except:                                         ; preds = %catch.dispatch
92  %6 = catchpad within %5 [ptr null]
93  catchret from %6 to label %__except8
94
95__except8:                                        ; preds = %__except
96  %7 = call i32 @llvm.eh.exceptioncode(token %6)
97  store i32 %7, ptr %__exception_code, align 4
98  %8 = load i32, ptr %i, align 4
99  call void (...) @"?printf@@YAXZZ"(ptr @"??_C@_0CG@ENDJHCGA@?5?9?9?9?5In?5outer?5except?5handler?5i?5?$DN@", i32 %8)
100  br label %__try.cont
101
102__try.cont:                                       ; preds = %__except8, %invoke.cont7
103  br label %for.inc
104
105for.inc:                                          ; preds = %__try.cont
106  %9 = load i32, ptr %i, align 4
107  %inc = add nsw i32 %9, 1
108  store i32 %inc, ptr %i, align 4
109  br label %for.cond
110
111invoke.cont7:                                     ; preds = %invoke.cont5
112  br label %__try.cont
113
114ehcleanup:                                        ; preds = %if.end, %invoke.cont1, %invoke.cont
115  %10 = cleanuppad within none []
116  %11 = call ptr @llvm.localaddress()
117  invoke void @"?fin$0@0@main@@"(i8 1, ptr %11) #6 [ "funclet"(token %10) ]
118          to label %invoke.cont6 unwind label %catch.dispatch
119
120invoke.cont6:                                     ; preds = %ehcleanup
121  cleanupret from %10 unwind label %catch.dispatch
122
123for.end:                                          ; preds = %for.cond
124  ret i32 0
125}
126
127declare dso_local void @"?printf@@YAXZZ"(...) #1
128
129; Function Attrs: nounwind willreturn
130declare dso_local void @llvm.seh.try.begin() #2
131
132declare dso_local i32 @__C_specific_handler(...)
133
134; Function Attrs: noinline
135define internal void @"?fin$0@0@main@@"(i8 %abnormal_termination, ptr %frame_pointer) #3 personality ptr @__C_specific_handler {
136entry:
137  %frame_pointer.addr = alloca ptr, align 8
138  %abnormal_termination.addr = alloca i8, align 1
139  %0 = call ptr @llvm.localrecover(ptr @main, ptr %frame_pointer, i32 0)
140  %i = bitcast ptr %0 to ptr
141  store ptr %frame_pointer, ptr %frame_pointer.addr, align 8
142  store i8 %abnormal_termination, ptr %abnormal_termination.addr, align 1
143  invoke void @llvm.seh.try.begin()
144          to label %invoke.cont unwind label %ehcleanup
145
146invoke.cont:                                      ; preds = %entry
147  %1 = load volatile i32, ptr %i, align 4
148  invoke void (...) @"?printf@@YAXZZ"(ptr @"??_C@_0BN@HAIIIOKI@?5?5In?5outer?5_finally?5i?5?$DN?5?$CFd?5?6?$AA@", i32 %1) #6
149          to label %invoke.cont1 unwind label %ehcleanup
150
151invoke.cont1:                                     ; preds = %invoke.cont
152  %2 = load volatile i32, ptr %i, align 4
153  %cmp = icmp eq i32 %2, 1
154  br i1 %cmp, label %if.then, label %if.end
155
156if.then:                                          ; preds = %invoke.cont1
157  store volatile i32 0, ptr inttoptr (i64 17 to ptr), align 4
158  br label %if.end
159
160if.end:                                           ; preds = %if.then, %invoke.cont1
161  invoke void @llvm.seh.try.end()
162          to label %invoke.cont2 unwind label %ehcleanup
163
164invoke.cont2:                                     ; preds = %if.end
165  call void @"?fin$1@0@main@@"(i8 0, ptr %frame_pointer)
166  ret void
167
168ehcleanup:                                        ; preds = %if.end, %invoke.cont, %entry
169  %3 = cleanuppad within none []
170  call void @"?fin$1@0@main@@"(i8 1, ptr %frame_pointer) [ "funclet"(token %3) ]
171  cleanupret from %3 unwind to caller
172}
173
174; Function Attrs: nounwind readnone
175declare ptr @llvm.localrecover(ptr, ptr, i32 immarg) #4
176
177; Function Attrs: noinline
178define internal void @"?fin$1@0@main@@"(i8 %abnormal_termination, ptr %frame_pointer) #3 {
179entry:
180  %frame_pointer.addr = alloca ptr, align 8
181  %abnormal_termination.addr = alloca i8, align 1
182  %0 = call ptr @llvm.localrecover(ptr @main, ptr %frame_pointer, i32 0)
183  %i = bitcast ptr %0 to ptr
184  store ptr %frame_pointer, ptr %frame_pointer.addr, align 8
185  store i8 %abnormal_termination, ptr %abnormal_termination.addr, align 1
186  %1 = load i32, ptr %i, align 4
187  call void (...) @"?printf@@YAXZZ"(ptr @"??_C@_0BN@HHKJHLBE@?5?5In?5Inner?5_finally?5i?5?$DN?5?$CFd?5?6?$AA@", i32 %1)
188  %2 = load i32, ptr %i, align 4
189  %cmp = icmp eq i32 %2, 2
190  br i1 %cmp, label %if.then, label %if.end
191
192if.then:                                          ; preds = %entry
193  store volatile i32 0, ptr inttoptr (i64 17 to ptr), align 4
194  br label %if.end
195
196if.end:                                           ; preds = %if.then, %entry
197  ret void
198}
199
200; Function Attrs: nounwind willreturn
201declare dso_local void @llvm.seh.try.end() #2
202
203; Function Attrs: nounwind readnone
204declare ptr @llvm.localaddress() #4
205
206; Function Attrs: nounwind readnone
207declare i32 @llvm.eh.exceptioncode(token) #4
208
209; Function Attrs: nounwind
210declare void @llvm.localescape(...) #5
211
212attributes #0 = { noinline norecurse optnone "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "frame-pointer"="none" "less-precise-fpmad"="false" "min-legal-vector-width"="0" "no-infs-fp-math"="false" "no-jump-tables"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" "stack-protector-buffer-size"="8" "target-features"="+cx8,+mmx,+sse,+sse2,+x87" "unsafe-fp-math"="false" "use-soft-float"="false" }
213attributes #1 = { "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "frame-pointer"="none" "less-precise-fpmad"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" "stack-protector-buffer-size"="8" "target-features"="+cx8,+mmx,+sse,+sse2,+x87" "unsafe-fp-math"="false" "use-soft-float"="false" }
214attributes #2 = { nounwind willreturn }
215attributes #3 = { noinline "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "frame-pointer"="none" "less-precise-fpmad"="false" "min-legal-vector-width"="0" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" "stack-protector-buffer-size"="8" "target-features"="+cx8,+mmx,+sse,+sse2,+x87" "unsafe-fp-math"="false" "use-soft-float"="false" }
216attributes #4 = { nounwind readnone }
217attributes #5 = { nounwind }
218attributes #6 = { noinline }
219
220!llvm.module.flags = !{!0, !1}
221
222!0 = !{i32 1, !"wchar_size", i32 2}
223!1 = !{i32 2, !"eh-asynch", i32 1}
224
225