1*9880d681SAndroid Build Coastguard Worker; RUN: llc -mtriple=x86_64-windows-msvc < %s | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker 3*9880d681SAndroid Build Coastguard Workertarget datalayout = "e-m:w-i64:64-f80:128-n8:16:32:64-S128" 4*9880d681SAndroid Build Coastguard Workertarget triple = "x86_64-pc-windows-msvc" 5*9880d681SAndroid Build Coastguard Worker 6*9880d681SAndroid Build Coastguard Worker%eh.ThrowInfo = type { i32, i32, i32, i32 } 7*9880d681SAndroid Build Coastguard Worker%rtti.TypeDescriptor2 = type { i8**, i8*, [3 x i8] } 8*9880d681SAndroid Build Coastguard Worker 9*9880d681SAndroid Build Coastguard Worker@"\01??_7type_info@@6B@" = external constant i8* 10*9880d681SAndroid Build Coastguard Worker@"\01??_R0H@8" = internal global %rtti.TypeDescriptor2 { i8** @"\01??_7type_info@@6B@", i8* null, [3 x i8] c".H\00" } 11*9880d681SAndroid Build Coastguard Worker 12*9880d681SAndroid Build Coastguard Workerdefine void @test1(i1 %B) personality i32 (...)* @__CxxFrameHandler3 { 13*9880d681SAndroid Build Coastguard Workerentry: 14*9880d681SAndroid Build Coastguard Worker invoke void @g() 15*9880d681SAndroid Build Coastguard Worker to label %unreachable unwind label %catch.dispatch 16*9880d681SAndroid Build Coastguard Worker 17*9880d681SAndroid Build Coastguard Workercatch.dispatch: 18*9880d681SAndroid Build Coastguard Worker %cs1 = catchswitch within none [label %catch] unwind to caller 19*9880d681SAndroid Build Coastguard Worker 20*9880d681SAndroid Build Coastguard Workercatch: 21*9880d681SAndroid Build Coastguard Worker %cp = catchpad within %cs1 [i8* null, i32 64, i8* null] 22*9880d681SAndroid Build Coastguard Worker br label %catch.loop 23*9880d681SAndroid Build Coastguard Worker 24*9880d681SAndroid Build Coastguard Workercatch.loop: 25*9880d681SAndroid Build Coastguard Worker br i1 %B, label %catchret, label %catch.loop 26*9880d681SAndroid Build Coastguard Worker 27*9880d681SAndroid Build Coastguard Workercatchret: 28*9880d681SAndroid Build Coastguard Worker catchret from %cp to label %try.cont 29*9880d681SAndroid Build Coastguard Worker 30*9880d681SAndroid Build Coastguard Workertry.cont: 31*9880d681SAndroid Build Coastguard Worker ret void 32*9880d681SAndroid Build Coastguard Worker 33*9880d681SAndroid Build Coastguard Workerunreachable: 34*9880d681SAndroid Build Coastguard Worker unreachable 35*9880d681SAndroid Build Coastguard Worker} 36*9880d681SAndroid Build Coastguard Worker 37*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test1: 38*9880d681SAndroid Build Coastguard Worker 39*9880d681SAndroid Build Coastguard Worker; The entry funclet contains %entry and %try.cont 40*9880d681SAndroid Build Coastguard Worker; CHECK: # %entry 41*9880d681SAndroid Build Coastguard Worker; CHECK: # %try.cont 42*9880d681SAndroid Build Coastguard Worker; CHECK: retq 43*9880d681SAndroid Build Coastguard Worker 44*9880d681SAndroid Build Coastguard Worker; The catch funclet contains %catch and %catchret 45*9880d681SAndroid Build Coastguard Worker; CHECK: # %catch{{$}} 46*9880d681SAndroid Build Coastguard Worker; CHECK: # %catchret 47*9880d681SAndroid Build Coastguard Worker; CHECK: retq 48*9880d681SAndroid Build Coastguard Worker 49*9880d681SAndroid Build Coastguard Workerdeclare void @g() 50*9880d681SAndroid Build Coastguard Worker 51*9880d681SAndroid Build Coastguard Worker 52*9880d681SAndroid Build Coastguard Workerdefine i32 @test2(i1 %B) personality i32 (...)* @__CxxFrameHandler3 { 53*9880d681SAndroid Build Coastguard Workerentry: 54*9880d681SAndroid Build Coastguard Worker invoke void @_CxxThrowException(i8* null, %eh.ThrowInfo* null) #1 55*9880d681SAndroid Build Coastguard Worker to label %unreachable unwind label %catch.dispatch 56*9880d681SAndroid Build Coastguard Worker 57*9880d681SAndroid Build Coastguard Workercatch.dispatch: ; preds = %entry 58*9880d681SAndroid Build Coastguard Worker %cs1 = catchswitch within none [label %catch] unwind to caller 59*9880d681SAndroid Build Coastguard Worker 60*9880d681SAndroid Build Coastguard Workercatch: ; preds = %catch.dispatch 61*9880d681SAndroid Build Coastguard Worker %0 = catchpad within %cs1 [i8* null, i32 64, i8* null] 62*9880d681SAndroid Build Coastguard Worker invoke void @_CxxThrowException(i8* null, %eh.ThrowInfo* null) #1 ["funclet"(token %0)] 63*9880d681SAndroid Build Coastguard Worker to label %unreachable unwind label %catch.dispatch.1 64*9880d681SAndroid Build Coastguard Worker 65*9880d681SAndroid Build Coastguard Workercatch.dispatch.1: ; preds = %catch 66*9880d681SAndroid Build Coastguard Worker %cs2 = catchswitch within %0 [label %catch.3] unwind to caller 67*9880d681SAndroid Build Coastguard Worker 68*9880d681SAndroid Build Coastguard Workercatch.3: ; preds = %catch.dispatch.1 69*9880d681SAndroid Build Coastguard Worker %1 = catchpad within %cs2 [i8* null, i32 64, i8* null] 70*9880d681SAndroid Build Coastguard Worker catchret from %1 to label %try.cont 71*9880d681SAndroid Build Coastguard Worker 72*9880d681SAndroid Build Coastguard Workertry.cont: ; preds = %catch.3 73*9880d681SAndroid Build Coastguard Worker catchret from %0 to label %try.cont.5 74*9880d681SAndroid Build Coastguard Worker 75*9880d681SAndroid Build Coastguard Workertry.cont.5: ; preds = %try.cont 76*9880d681SAndroid Build Coastguard Worker ret i32 0 77*9880d681SAndroid Build Coastguard Worker 78*9880d681SAndroid Build Coastguard Workerunreachable: ; preds = %catch, %entry 79*9880d681SAndroid Build Coastguard Worker unreachable 80*9880d681SAndroid Build Coastguard Worker} 81*9880d681SAndroid Build Coastguard Worker 82*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test2: 83*9880d681SAndroid Build Coastguard Worker 84*9880d681SAndroid Build Coastguard Worker; The parent function contains %entry and %try.cont.5 85*9880d681SAndroid Build Coastguard Worker; CHECK: .seh_proc 86*9880d681SAndroid Build Coastguard Worker; CHECK: # %entry 87*9880d681SAndroid Build Coastguard Worker; CHECK: # %try.cont.5 88*9880d681SAndroid Build Coastguard Worker; CHECK: retq 89*9880d681SAndroid Build Coastguard Worker 90*9880d681SAndroid Build Coastguard Worker; The inner catch funclet contains %catch.3 91*9880d681SAndroid Build Coastguard Worker; CHECK: .seh_proc 92*9880d681SAndroid Build Coastguard Worker; CHECK: # %catch.3{{$}} 93*9880d681SAndroid Build Coastguard Worker; CHECK: retq 94*9880d681SAndroid Build Coastguard Worker 95*9880d681SAndroid Build Coastguard Worker; The outer catch funclet contains %catch 96*9880d681SAndroid Build Coastguard Worker; CHECK: .seh_proc 97*9880d681SAndroid Build Coastguard Worker; CHECK: # %catch{{$}} 98*9880d681SAndroid Build Coastguard Worker; CHECK: callq _CxxThrowException 99*9880d681SAndroid Build Coastguard Worker; CHECK: # %unreachable 100*9880d681SAndroid Build Coastguard Worker; CHECK: ud2 101*9880d681SAndroid Build Coastguard Worker 102*9880d681SAndroid Build Coastguard Worker 103*9880d681SAndroid Build Coastguard Workerdefine void @test3(i1 %V) #0 personality i8* bitcast (i32 (...)* @__CxxFrameHandler3 to i8*) { 104*9880d681SAndroid Build Coastguard Workerentry: 105*9880d681SAndroid Build Coastguard Worker invoke void @g() 106*9880d681SAndroid Build Coastguard Worker to label %try.cont unwind label %catch.dispatch 107*9880d681SAndroid Build Coastguard Worker 108*9880d681SAndroid Build Coastguard Workercatch.dispatch: ; preds = %entry 109*9880d681SAndroid Build Coastguard Worker %cs1 = catchswitch within none [label %catch.2] unwind label %catch.dispatch.1 110*9880d681SAndroid Build Coastguard Worker 111*9880d681SAndroid Build Coastguard Workercatch.2: ; preds = %catch.dispatch 112*9880d681SAndroid Build Coastguard Worker %0 = catchpad within %cs1 [%rtti.TypeDescriptor2* @"\01??_R0H@8", i32 0, i8* null] 113*9880d681SAndroid Build Coastguard Worker tail call void @exit(i32 0) #2 [ "funclet"(token %0) ] 114*9880d681SAndroid Build Coastguard Worker unreachable 115*9880d681SAndroid Build Coastguard Worker 116*9880d681SAndroid Build Coastguard Workercatch.dispatch.1: ; preds = %catch.dispatch 117*9880d681SAndroid Build Coastguard Worker %cs2 = catchswitch within none [label %catch] unwind to caller 118*9880d681SAndroid Build Coastguard Worker 119*9880d681SAndroid Build Coastguard Workercatch: ; preds = %catch.dispatch.1 120*9880d681SAndroid Build Coastguard Worker %1 = catchpad within %cs2 [i8* null, i32 64, i8* null] 121*9880d681SAndroid Build Coastguard Worker tail call void @exit(i32 0) #2 [ "funclet"(token %1) ] 122*9880d681SAndroid Build Coastguard Worker unreachable 123*9880d681SAndroid Build Coastguard Worker 124*9880d681SAndroid Build Coastguard Workertry.cont: ; preds = %entry 125*9880d681SAndroid Build Coastguard Worker br i1 %V, label %exit_one, label %exit_two 126*9880d681SAndroid Build Coastguard Worker 127*9880d681SAndroid Build Coastguard Workerexit_one: 128*9880d681SAndroid Build Coastguard Worker tail call void @exit(i32 0) 129*9880d681SAndroid Build Coastguard Worker unreachable 130*9880d681SAndroid Build Coastguard Worker 131*9880d681SAndroid Build Coastguard Workerexit_two: 132*9880d681SAndroid Build Coastguard Worker tail call void @exit(i32 0) 133*9880d681SAndroid Build Coastguard Worker unreachable 134*9880d681SAndroid Build Coastguard Worker} 135*9880d681SAndroid Build Coastguard Worker 136*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test3: 137*9880d681SAndroid Build Coastguard Worker 138*9880d681SAndroid Build Coastguard Worker; The entry funclet contains %entry and %try.cont 139*9880d681SAndroid Build Coastguard Worker; CHECK: # %entry 140*9880d681SAndroid Build Coastguard Worker; CHECK: # %try.cont 141*9880d681SAndroid Build Coastguard Worker; CHECK: callq exit 142*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: # exit_one 143*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: # exit_two 144*9880d681SAndroid Build Coastguard Worker; CHECK: ud2 145*9880d681SAndroid Build Coastguard Worker 146*9880d681SAndroid Build Coastguard Worker; The catch(...) funclet contains %catch.2 147*9880d681SAndroid Build Coastguard Worker; CHECK: # %catch.2{{$}} 148*9880d681SAndroid Build Coastguard Worker; CHECK: callq exit 149*9880d681SAndroid Build Coastguard Worker; CHECK: ud2 150*9880d681SAndroid Build Coastguard Worker 151*9880d681SAndroid Build Coastguard Worker; The catch(int) funclet contains %catch 152*9880d681SAndroid Build Coastguard Worker; CHECK: # %catch{{$}} 153*9880d681SAndroid Build Coastguard Worker; CHECK: callq exit 154*9880d681SAndroid Build Coastguard Worker; CHECK: ud2 155*9880d681SAndroid Build Coastguard Worker 156*9880d681SAndroid Build Coastguard Workerdeclare void @exit(i32) noreturn nounwind 157*9880d681SAndroid Build Coastguard Workerdeclare void @_CxxThrowException(i8*, %eh.ThrowInfo*) 158*9880d681SAndroid Build Coastguard Workerdeclare i32 @__CxxFrameHandler3(...) 159