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