1*9880d681SAndroid Build Coastguard Worker; RUN: sed -e s/.T1:// %s | not llvm-as -disable-output 2>&1 | FileCheck --check-prefix=CHECK1 %s 2*9880d681SAndroid Build Coastguard Worker; RUN: sed -e s/.T2:// %s | not llvm-as -disable-output 2>&1 | FileCheck --check-prefix=CHECK2 %s 3*9880d681SAndroid Build Coastguard Worker; RUN: sed -e s/.T3:// %s | not llvm-as -disable-output 2>&1 | FileCheck --check-prefix=CHECK3 %s 4*9880d681SAndroid Build Coastguard Worker; RUN: sed -e s/.T4:// %s | not llvm-as -disable-output 2>&1 | FileCheck --check-prefix=CHECK4 %s 5*9880d681SAndroid Build Coastguard Worker; RUN: sed -e s/.T5:// %s | not opt -verify -disable-output 2>&1 | FileCheck --check-prefix=CHECK5 %s 6*9880d681SAndroid Build Coastguard Worker; RUN: sed -e s/.T6:// %s | not opt -verify -disable-output 2>&1 | FileCheck --check-prefix=CHECK6 %s 7*9880d681SAndroid Build Coastguard Worker; RUN: sed -e s/.T7:// %s | not opt -verify -disable-output 2>&1 | FileCheck --check-prefix=CHECK7 %s 8*9880d681SAndroid Build Coastguard Worker; RUN: sed -e s/.T8:// %s | not opt -verify -disable-output 2>&1 | FileCheck --check-prefix=CHECK8 %s 9*9880d681SAndroid Build Coastguard Worker; RUN: sed -e s/.T9:// %s | not opt -verify -disable-output 2>&1 | FileCheck --check-prefix=CHECK9 %s 10*9880d681SAndroid Build Coastguard Worker; RUN: sed -e s/.T10:// %s | not opt -verify -disable-output 2>&1 | FileCheck --check-prefix=CHECK10 %s 11*9880d681SAndroid Build Coastguard Worker; RUN: sed -e s/.T11:// %s | not opt -verify -disable-output 2>&1 | FileCheck --check-prefix=CHECK11 %s 12*9880d681SAndroid Build Coastguard Worker; RUN: sed -e s/.T12:// %s | not opt -verify -disable-output 2>&1 | FileCheck --check-prefix=CHECK12 %s 13*9880d681SAndroid Build Coastguard Worker; RUN: sed -e s/.T13:// %s | not opt -verify -disable-output 2>&1 | FileCheck --check-prefix=CHECK13 %s 14*9880d681SAndroid Build Coastguard Worker; RUN: sed -e s/.T14:// %s | not opt -verify -disable-output 2>&1 | FileCheck --check-prefix=CHECK14 %s 15*9880d681SAndroid Build Coastguard Worker; RUN: sed -e s/.T15:// %s | not opt -verify -disable-output 2>&1 | FileCheck --check-prefix=CHECK15 %s 16*9880d681SAndroid Build Coastguard Worker; RUN: sed -e s/.T16:// %s | not opt -verify -disable-output 2>&1 | FileCheck --check-prefix=CHECK16 %s 17*9880d681SAndroid Build Coastguard Worker; RUN: sed -e s/.T17:// %s | not opt -verify -disable-output 2>&1 | FileCheck --check-prefix=CHECK17 %s 18*9880d681SAndroid Build Coastguard Worker; RUN: sed -e s/.T18:// %s | not opt -verify -disable-output 2>&1 | FileCheck --check-prefix=CHECK18 %s 19*9880d681SAndroid Build Coastguard Worker; RUN: sed -e s/.T19:// %s | not opt -verify -disable-output 2>&1 | FileCheck --check-prefix=CHECK19 %s 20*9880d681SAndroid Build Coastguard Worker; RUN: sed -e s/.T20:// %s | not opt -verify -disable-output 2>&1 | FileCheck --check-prefix=CHECK20 %s 21*9880d681SAndroid Build Coastguard Worker; RUN: sed -e s/.T21:// %s | not opt -verify -disable-output 2>&1 | FileCheck --check-prefix=CHECK21 %s 22*9880d681SAndroid Build Coastguard Worker; RUN: sed -e s/.T22:// %s | not opt -verify -disable-output 2>&1 | FileCheck --check-prefix=CHECK22 %s 23*9880d681SAndroid Build Coastguard Worker; RUN: sed -e s/.T23:// %s | not opt -verify -disable-output 2>&1 | FileCheck --check-prefix=CHECK23 %s 24*9880d681SAndroid Build Coastguard Worker; RUN: sed -e s/.T24:// %s | not opt -verify -disable-output 2>&1 | FileCheck --check-prefix=CHECK24 %s 25*9880d681SAndroid Build Coastguard Worker; RUN: sed -e s/.T25:// %s | not opt -verify -disable-output 2>&1 | FileCheck --check-prefix=CHECK25 %s 26*9880d681SAndroid Build Coastguard Worker; RUN: sed -e s/.T26:// %s | not opt -verify -disable-output 2>&1 | FileCheck --check-prefix=CHECK26 %s 27*9880d681SAndroid Build Coastguard Worker 28*9880d681SAndroid Build Coastguard Workerdeclare void @g() 29*9880d681SAndroid Build Coastguard Worker 30*9880d681SAndroid Build Coastguard Worker;T1: define void @f() { 31*9880d681SAndroid Build Coastguard Worker;T1: entry: 32*9880d681SAndroid Build Coastguard Worker;T1: catchret from undef to label %next 33*9880d681SAndroid Build Coastguard Worker;T1: ; CHECK1: CatchReturnInst needs to be provided a CatchPad 34*9880d681SAndroid Build Coastguard Worker;T1: next: 35*9880d681SAndroid Build Coastguard Worker;T1: unreachable 36*9880d681SAndroid Build Coastguard Worker;T1: } 37*9880d681SAndroid Build Coastguard Worker 38*9880d681SAndroid Build Coastguard Worker;T2: define void @f() { 39*9880d681SAndroid Build Coastguard Worker;T2: entry: 40*9880d681SAndroid Build Coastguard Worker;T2: %x = cleanuppad within none [] 41*9880d681SAndroid Build Coastguard Worker;T2: ; catchret's first operand's operator must be catchpad 42*9880d681SAndroid Build Coastguard Worker;T2: catchret from %x to label %entry 43*9880d681SAndroid Build Coastguard Worker;T2: ; CHECK2: CatchReturnInst needs to be provided a CatchPad 44*9880d681SAndroid Build Coastguard Worker;T2: } 45*9880d681SAndroid Build Coastguard Worker 46*9880d681SAndroid Build Coastguard Worker;T3: define void @f() { 47*9880d681SAndroid Build Coastguard Worker;T3: entry: 48*9880d681SAndroid Build Coastguard Worker;T3: cleanupret from undef unwind label %next 49*9880d681SAndroid Build Coastguard Worker;T3: ; CHECK3: CleanupReturnInst needs to be provided a CleanupPad 50*9880d681SAndroid Build Coastguard Worker;T3: next: 51*9880d681SAndroid Build Coastguard Worker;T3: unreachable 52*9880d681SAndroid Build Coastguard Worker;T3: } 53*9880d681SAndroid Build Coastguard Worker 54*9880d681SAndroid Build Coastguard Worker;T4: define void @f() { 55*9880d681SAndroid Build Coastguard Worker;T4: entry: 56*9880d681SAndroid Build Coastguard Worker;T4: %cs = catchswitch within none [label %next] unwind to caller 57*9880d681SAndroid Build Coastguard Worker;T4: next: 58*9880d681SAndroid Build Coastguard Worker;T4: %x = catchpad within %cs [] 59*9880d681SAndroid Build Coastguard Worker;T4: ; cleanupret first operand's operator must be cleanuppad 60*9880d681SAndroid Build Coastguard Worker;T4: cleanupret from %x unwind to caller 61*9880d681SAndroid Build Coastguard Worker;T4: ; CHECK4: CleanupReturnInst needs to be provided a CleanupPad 62*9880d681SAndroid Build Coastguard Worker;T4: } 63*9880d681SAndroid Build Coastguard Worker 64*9880d681SAndroid Build Coastguard Worker;T5: define void @f() personality void ()* @g { 65*9880d681SAndroid Build Coastguard Worker;T5: entry: 66*9880d681SAndroid Build Coastguard Worker;T5: ret void 67*9880d681SAndroid Build Coastguard Worker;T5: switch: 68*9880d681SAndroid Build Coastguard Worker;T5: %cs = catchswitch within none [label %catch] unwind to caller 69*9880d681SAndroid Build Coastguard Worker;T5: catch: 70*9880d681SAndroid Build Coastguard Worker;T5: catchpad within %cs [] 71*9880d681SAndroid Build Coastguard Worker;T5: unreachable 72*9880d681SAndroid Build Coastguard Worker;T5: bogus: 73*9880d681SAndroid Build Coastguard Worker;T5: cleanuppad within %cs [] 74*9880d681SAndroid Build Coastguard Worker;T5: ; CHECK5: CleanupPadInst has an invalid parent 75*9880d681SAndroid Build Coastguard Worker;T5: unreachable 76*9880d681SAndroid Build Coastguard Worker;T5: } 77*9880d681SAndroid Build Coastguard Worker 78*9880d681SAndroid Build Coastguard Worker;T6: define void @f() personality void ()* @g { 79*9880d681SAndroid Build Coastguard Worker;T6: entry: 80*9880d681SAndroid Build Coastguard Worker;T6: ret void 81*9880d681SAndroid Build Coastguard Worker;T6: switch1: 82*9880d681SAndroid Build Coastguard Worker;T6: %cs1 = catchswitch within none [label %catch1] unwind label %catch2 83*9880d681SAndroid Build Coastguard Worker;T6: ; CHECK6: Block containg CatchPadInst must be jumped to only by its catchswitch 84*9880d681SAndroid Build Coastguard Worker;T6: catch1: 85*9880d681SAndroid Build Coastguard Worker;T6: catchpad within %cs1 [] 86*9880d681SAndroid Build Coastguard Worker;T6: unreachable 87*9880d681SAndroid Build Coastguard Worker;T6: switch2: 88*9880d681SAndroid Build Coastguard Worker;T6: %cs2 = catchswitch within none [label %catch2] unwind to caller 89*9880d681SAndroid Build Coastguard Worker;T6: catch2: 90*9880d681SAndroid Build Coastguard Worker;T6: catchpad within %cs2 [] 91*9880d681SAndroid Build Coastguard Worker;T6: unreachable 92*9880d681SAndroid Build Coastguard Worker;T6: } 93*9880d681SAndroid Build Coastguard Worker 94*9880d681SAndroid Build Coastguard Worker;T7: define void @f() personality void ()* @g { 95*9880d681SAndroid Build Coastguard Worker;T7: entry: 96*9880d681SAndroid Build Coastguard Worker;T7: ret void 97*9880d681SAndroid Build Coastguard Worker;T7: switch1: 98*9880d681SAndroid Build Coastguard Worker;T7: %cs1 = catchswitch within none [label %catch1] unwind to caller 99*9880d681SAndroid Build Coastguard Worker;T7: catch1: 100*9880d681SAndroid Build Coastguard Worker;T7: catchpad within %cs1 [] 101*9880d681SAndroid Build Coastguard Worker;T7: unreachable 102*9880d681SAndroid Build Coastguard Worker;T7: switch2: 103*9880d681SAndroid Build Coastguard Worker;T7: %cs2 = catchswitch within %cs1 [label %catch2] unwind to caller 104*9880d681SAndroid Build Coastguard Worker;T7: ; CHECK7: CatchSwitchInst has an invalid parent 105*9880d681SAndroid Build Coastguard Worker;T7: catch2: 106*9880d681SAndroid Build Coastguard Worker;T7: catchpad within %cs2 [] 107*9880d681SAndroid Build Coastguard Worker;T7: unreachable 108*9880d681SAndroid Build Coastguard Worker;T7: } 109*9880d681SAndroid Build Coastguard Worker 110*9880d681SAndroid Build Coastguard Worker;T8: define void @f() personality void ()* @g { 111*9880d681SAndroid Build Coastguard Worker;T8: entry: 112*9880d681SAndroid Build Coastguard Worker;T8: ret void 113*9880d681SAndroid Build Coastguard Worker;T8: switch1: 114*9880d681SAndroid Build Coastguard Worker;T8: %cs1 = catchswitch within none [ label %switch1 ] unwind to caller 115*9880d681SAndroid Build Coastguard Worker;T8: ; CHECK8: CatchSwitchInst handlers must be catchpads 116*9880d681SAndroid Build Coastguard Worker;T8: } 117*9880d681SAndroid Build Coastguard Worker 118*9880d681SAndroid Build Coastguard Worker;T9: define void @f() personality void ()* @g { 119*9880d681SAndroid Build Coastguard Worker;T9: entry: 120*9880d681SAndroid Build Coastguard Worker;T9: ret void 121*9880d681SAndroid Build Coastguard Worker;T9: cleanup: 122*9880d681SAndroid Build Coastguard Worker;T9: %cp = cleanuppad within none [] 123*9880d681SAndroid Build Coastguard Worker;T9: invoke void @g() [ "funclet"(token %cp) ] 124*9880d681SAndroid Build Coastguard Worker;T9: to label %exit unwind label %cleanup 125*9880d681SAndroid Build Coastguard Worker;T9: ; CHECK9: EH pad cannot handle exceptions raised within it 126*9880d681SAndroid Build Coastguard Worker;T9: ; CHECK9-NEXT: %cp = cleanuppad within none [] 127*9880d681SAndroid Build Coastguard Worker;T9: ; CHECK9-NEXT: invoke void @g() [ "funclet"(token %cp) ] 128*9880d681SAndroid Build Coastguard Worker;T9: exit: 129*9880d681SAndroid Build Coastguard Worker;T9: ret void 130*9880d681SAndroid Build Coastguard Worker;T9: } 131*9880d681SAndroid Build Coastguard Worker 132*9880d681SAndroid Build Coastguard Worker;T10: define void @f() personality void ()* @g { 133*9880d681SAndroid Build Coastguard Worker;T10: entry: 134*9880d681SAndroid Build Coastguard Worker;T10: ret void 135*9880d681SAndroid Build Coastguard Worker;T10: cleanup1: 136*9880d681SAndroid Build Coastguard Worker;T10: %cp1 = cleanuppad within none [] 137*9880d681SAndroid Build Coastguard Worker;T10: unreachable 138*9880d681SAndroid Build Coastguard Worker;T10: switch: 139*9880d681SAndroid Build Coastguard Worker;T10: %cs = catchswitch within %cp1 [label %catch] unwind to caller 140*9880d681SAndroid Build Coastguard Worker;T10: catch: 141*9880d681SAndroid Build Coastguard Worker;T10: %catchp1 = catchpad within %cs [i32 1] 142*9880d681SAndroid Build Coastguard Worker;T10: unreachable 143*9880d681SAndroid Build Coastguard Worker;T10: cleanup2: 144*9880d681SAndroid Build Coastguard Worker;T10: %cp2 = cleanuppad within %catchp1 [] 145*9880d681SAndroid Build Coastguard Worker;T10: unreachable 146*9880d681SAndroid Build Coastguard Worker;T10: cleanup3: 147*9880d681SAndroid Build Coastguard Worker;T10: %cp3 = cleanuppad within %cp2 [] 148*9880d681SAndroid Build Coastguard Worker;T10: cleanupret from %cp3 unwind label %switch 149*9880d681SAndroid Build Coastguard Worker;T10: ; CHECK10: EH pad cannot handle exceptions raised within it 150*9880d681SAndroid Build Coastguard Worker;T10: ; CHECK10-NEXT: %cs = catchswitch within %cp1 [label %catch] unwind to caller 151*9880d681SAndroid Build Coastguard Worker;T10: ; CHECK10-NEXT: cleanupret from %cp3 unwind label %switch 152*9880d681SAndroid Build Coastguard Worker;T10: } 153*9880d681SAndroid Build Coastguard Worker 154*9880d681SAndroid Build Coastguard Worker;T11: define void @f() personality void ()* @g { 155*9880d681SAndroid Build Coastguard Worker;T11: entry: 156*9880d681SAndroid Build Coastguard Worker;T11: ret void 157*9880d681SAndroid Build Coastguard Worker;T11: cleanup1: 158*9880d681SAndroid Build Coastguard Worker;T11: %cp1 = cleanuppad within none [] 159*9880d681SAndroid Build Coastguard Worker;T11: unreachable 160*9880d681SAndroid Build Coastguard Worker;T11: cleanup2: 161*9880d681SAndroid Build Coastguard Worker;T11: %cp2 = cleanuppad within %cp1 [] 162*9880d681SAndroid Build Coastguard Worker;T11: unreachable 163*9880d681SAndroid Build Coastguard Worker;T11: switch: 164*9880d681SAndroid Build Coastguard Worker;T11: %cs = catchswitch within none [label %catch] unwind label %cleanup2 165*9880d681SAndroid Build Coastguard Worker;T11: ; CHECK11: A single unwind edge may only enter one EH pad 166*9880d681SAndroid Build Coastguard Worker;T11: ; CHECK11-NEXT: %cs = catchswitch within none [label %catch] unwind label %cleanup2 167*9880d681SAndroid Build Coastguard Worker;T11: catch: 168*9880d681SAndroid Build Coastguard Worker;T11: catchpad within %cs [i32 1] 169*9880d681SAndroid Build Coastguard Worker;T11: unreachable 170*9880d681SAndroid Build Coastguard Worker;T11: } 171*9880d681SAndroid Build Coastguard Worker 172*9880d681SAndroid Build Coastguard Worker;T12: define void @f() personality void ()* @g { 173*9880d681SAndroid Build Coastguard Worker;T12: entry: 174*9880d681SAndroid Build Coastguard Worker;T12: ret void 175*9880d681SAndroid Build Coastguard Worker;T12: cleanup: 176*9880d681SAndroid Build Coastguard Worker;T12: %cp = cleanuppad within none [] 177*9880d681SAndroid Build Coastguard Worker;T12: cleanupret from %cp unwind label %switch 178*9880d681SAndroid Build Coastguard Worker;T12: ; CHECK12: A cleanupret must exit its cleanup 179*9880d681SAndroid Build Coastguard Worker;T12: ; CHECK12-NEXT: cleanupret from %cp unwind label %switch 180*9880d681SAndroid Build Coastguard Worker;T12: switch: 181*9880d681SAndroid Build Coastguard Worker;T12: %cs = catchswitch within %cp [label %catch] unwind to caller 182*9880d681SAndroid Build Coastguard Worker;T12: catch: 183*9880d681SAndroid Build Coastguard Worker;T12: catchpad within %cs [i32 1] 184*9880d681SAndroid Build Coastguard Worker;T12: unreachable 185*9880d681SAndroid Build Coastguard Worker;T12: } 186*9880d681SAndroid Build Coastguard Worker 187*9880d681SAndroid Build Coastguard Worker;T13: define void @f() personality void ()* @g { 188*9880d681SAndroid Build Coastguard Worker;T13: entry: 189*9880d681SAndroid Build Coastguard Worker;T13: ret void 190*9880d681SAndroid Build Coastguard Worker;T13: switch: 191*9880d681SAndroid Build Coastguard Worker;T13: %cs = catchswitch within none [label %catch] unwind label %switch 192*9880d681SAndroid Build Coastguard Worker;T13: ; CHECK13: EH pad cannot handle exceptions raised within it 193*9880d681SAndroid Build Coastguard Worker;T13: ; CHECK13-NEXT: %cs = catchswitch within none [label %catch] unwind label %switch 194*9880d681SAndroid Build Coastguard Worker;T13: catch: 195*9880d681SAndroid Build Coastguard Worker;T13: catchpad within %cs [i32 0] 196*9880d681SAndroid Build Coastguard Worker;T13: unreachable 197*9880d681SAndroid Build Coastguard Worker;T13: } 198*9880d681SAndroid Build Coastguard Worker 199*9880d681SAndroid Build Coastguard Worker;T14: define void @f() personality void ()* @g { 200*9880d681SAndroid Build Coastguard Worker;T14: entry: 201*9880d681SAndroid Build Coastguard Worker;T14: ret void 202*9880d681SAndroid Build Coastguard Worker;T14: cleanup: 203*9880d681SAndroid Build Coastguard Worker;T14: %cp = cleanuppad within none [] 204*9880d681SAndroid Build Coastguard Worker;T14: unreachable 205*9880d681SAndroid Build Coastguard Worker;T14: left: 206*9880d681SAndroid Build Coastguard Worker;T14: cleanupret from %cp unwind label %switch 207*9880d681SAndroid Build Coastguard Worker;T14: right: 208*9880d681SAndroid Build Coastguard Worker;T14: cleanupret from %cp unwind to caller 209*9880d681SAndroid Build Coastguard Worker;T14: ; CHECK14: Unwind edges out of a funclet pad must have the same unwind dest 210*9880d681SAndroid Build Coastguard Worker;T14: ; CHECK14-NEXT: %cp = cleanuppad within none [] 211*9880d681SAndroid Build Coastguard Worker;T14: ; CHECK14-NEXT: cleanupret from %cp unwind label %switch 212*9880d681SAndroid Build Coastguard Worker;T14: ; CHECK14-NEXT: cleanupret from %cp unwind to caller 213*9880d681SAndroid Build Coastguard Worker;T14: switch: 214*9880d681SAndroid Build Coastguard Worker;T14: %cs = catchswitch within none [label %catch] unwind to caller 215*9880d681SAndroid Build Coastguard Worker;T14: catch: 216*9880d681SAndroid Build Coastguard Worker;T14: catchpad within %cs [i32 1] 217*9880d681SAndroid Build Coastguard Worker;T14: unreachable 218*9880d681SAndroid Build Coastguard Worker;T14: } 219*9880d681SAndroid Build Coastguard Worker 220*9880d681SAndroid Build Coastguard Worker;T15: define void @f() personality void ()* @g { 221*9880d681SAndroid Build Coastguard Worker;T15: entry: 222*9880d681SAndroid Build Coastguard Worker;T15: ret void 223*9880d681SAndroid Build Coastguard Worker;T15: switch: 224*9880d681SAndroid Build Coastguard Worker;T15: %cs = catchswitch within none [label %catch] unwind to caller 225*9880d681SAndroid Build Coastguard Worker;T15: catch: 226*9880d681SAndroid Build Coastguard Worker;T15: %catch.pad = catchpad within %cs [i32 1] 227*9880d681SAndroid Build Coastguard Worker;T15: invoke void @g() [ "funclet"(token %catch.pad) ] 228*9880d681SAndroid Build Coastguard Worker;T15: to label %unreachable unwind label %target1 229*9880d681SAndroid Build Coastguard Worker;T15: unreachable: 230*9880d681SAndroid Build Coastguard Worker;T15: unreachable 231*9880d681SAndroid Build Coastguard Worker;T15: target1: 232*9880d681SAndroid Build Coastguard Worker;T15: cleanuppad within none [] 233*9880d681SAndroid Build Coastguard Worker;T15: unreachable 234*9880d681SAndroid Build Coastguard Worker;T15: target2: 235*9880d681SAndroid Build Coastguard Worker;T15: cleanuppad within none [] 236*9880d681SAndroid Build Coastguard Worker;T15: unreachable 237*9880d681SAndroid Build Coastguard Worker;T15: nested.1: 238*9880d681SAndroid Build Coastguard Worker;T15: %nested.pad.1 = cleanuppad within %catch.pad [] 239*9880d681SAndroid Build Coastguard Worker;T15: unreachable 240*9880d681SAndroid Build Coastguard Worker;T15: nested.2: 241*9880d681SAndroid Build Coastguard Worker;T15: %nested.pad.2 = cleanuppad within %nested.pad.1 [] 242*9880d681SAndroid Build Coastguard Worker;T15: cleanupret from %nested.pad.2 unwind label %target2 243*9880d681SAndroid Build Coastguard Worker;T15: ; CHECK15: Unwind edges out of a funclet pad must have the same unwind dest 244*9880d681SAndroid Build Coastguard Worker;T15: ; CHECK15-NEXT: %catch.pad = catchpad within %cs [i32 1] 245*9880d681SAndroid Build Coastguard Worker;T15: ; CHECK15-NEXT: cleanupret from %nested.pad.2 unwind label %target2 246*9880d681SAndroid Build Coastguard Worker;T15: ; CHECK15-NEXT: invoke void @g() [ "funclet"(token %catch.pad) ] 247*9880d681SAndroid Build Coastguard Worker;T15: ; CHECK15-NEXT: to label %unreachable unwind label %target1 248*9880d681SAndroid Build Coastguard Worker;T15: } 249*9880d681SAndroid Build Coastguard Worker 250*9880d681SAndroid Build Coastguard Worker;T16: define void @f() personality void ()* @g { 251*9880d681SAndroid Build Coastguard Worker;T16: entry: 252*9880d681SAndroid Build Coastguard Worker;T16: ret void 253*9880d681SAndroid Build Coastguard Worker;T16: switch: 254*9880d681SAndroid Build Coastguard Worker;T16: %cs = catchswitch within none [label %catch] unwind to caller 255*9880d681SAndroid Build Coastguard Worker;T16: catch: 256*9880d681SAndroid Build Coastguard Worker;T16: %catch.pad = catchpad within %cs [i32 1] 257*9880d681SAndroid Build Coastguard Worker;T16: invoke void @g() [ "funclet"(token %catch.pad) ] 258*9880d681SAndroid Build Coastguard Worker;T16: to label %unreachable unwind label %target1 259*9880d681SAndroid Build Coastguard Worker;T16: ; CHECK16: Unwind edges out of a catch must have the same unwind dest as the parent catchswitch 260*9880d681SAndroid Build Coastguard Worker;T16: ; CHECK16-NEXT: %catch.pad = catchpad within %cs [i32 1] 261*9880d681SAndroid Build Coastguard Worker;T16: ; CHECK16-NEXT: invoke void @g() [ "funclet"(token %catch.pad) ] 262*9880d681SAndroid Build Coastguard Worker;T16: ; CHECK16-NEXT: to label %unreachable unwind label %target1 263*9880d681SAndroid Build Coastguard Worker;T16: ; CHECK16-NEXT: %cs = catchswitch within none [label %catch] unwind to caller 264*9880d681SAndroid Build Coastguard Worker;T16: unreachable: 265*9880d681SAndroid Build Coastguard Worker;T16: unreachable 266*9880d681SAndroid Build Coastguard Worker;T16: target1: 267*9880d681SAndroid Build Coastguard Worker;T16: cleanuppad within none [] 268*9880d681SAndroid Build Coastguard Worker;T16: unreachable 269*9880d681SAndroid Build Coastguard Worker;T16: } 270*9880d681SAndroid Build Coastguard Worker 271*9880d681SAndroid Build Coastguard Worker;T17: define void @f() personality void ()* @g { 272*9880d681SAndroid Build Coastguard Worker;T17: entry: 273*9880d681SAndroid Build Coastguard Worker;T17: ret void 274*9880d681SAndroid Build Coastguard Worker;T17: switch: 275*9880d681SAndroid Build Coastguard Worker;T17: %cs = catchswitch within none [label %catch] unwind label %target1 276*9880d681SAndroid Build Coastguard Worker;T17: catch: 277*9880d681SAndroid Build Coastguard Worker;T17: %catch.pad = catchpad within %cs [i32 1] 278*9880d681SAndroid Build Coastguard Worker;T17: invoke void @g() [ "funclet"(token %catch.pad) ] 279*9880d681SAndroid Build Coastguard Worker;T17: to label %unreachable unwind label %target2 280*9880d681SAndroid Build Coastguard Worker;T17: ; CHECK17: Unwind edges out of a catch must have the same unwind dest as the parent catchswitch 281*9880d681SAndroid Build Coastguard Worker;T17: ; CHECK17-NEXT: %catch.pad = catchpad within %cs [i32 1] 282*9880d681SAndroid Build Coastguard Worker;T17: ; CHECK17-NEXT: invoke void @g() [ "funclet"(token %catch.pad) ] 283*9880d681SAndroid Build Coastguard Worker;T17: ; CHECK17-NEXT: to label %unreachable unwind label %target2 284*9880d681SAndroid Build Coastguard Worker;T17: ; CHECK17-NEXT: %cs = catchswitch within none [label %catch] unwind label %target1 285*9880d681SAndroid Build Coastguard Worker;T17: unreachable: 286*9880d681SAndroid Build Coastguard Worker;T17: unreachable 287*9880d681SAndroid Build Coastguard Worker;T17: target1: 288*9880d681SAndroid Build Coastguard Worker;T17: cleanuppad within none [] 289*9880d681SAndroid Build Coastguard Worker;T17: unreachable 290*9880d681SAndroid Build Coastguard Worker;T17: target2: 291*9880d681SAndroid Build Coastguard Worker;T17: cleanuppad within none [] 292*9880d681SAndroid Build Coastguard Worker;T17: unreachable 293*9880d681SAndroid Build Coastguard Worker;T17: } 294*9880d681SAndroid Build Coastguard Worker 295*9880d681SAndroid Build Coastguard Worker;T18: define void @f() personality void ()* @g { 296*9880d681SAndroid Build Coastguard Worker;T18: entry: 297*9880d681SAndroid Build Coastguard Worker;T18: invoke void @g() 298*9880d681SAndroid Build Coastguard Worker;T18: to label %invoke.cont unwind label %left 299*9880d681SAndroid Build Coastguard Worker;T18: invoke.cont: 300*9880d681SAndroid Build Coastguard Worker;T18: invoke void @g() 301*9880d681SAndroid Build Coastguard Worker;T18: to label %unreachable unwind label %right 302*9880d681SAndroid Build Coastguard Worker;T18: left: 303*9880d681SAndroid Build Coastguard Worker;T18: %cp.left = cleanuppad within none [] 304*9880d681SAndroid Build Coastguard Worker;T18: invoke void @g() [ "funclet"(token %cp.left) ] 305*9880d681SAndroid Build Coastguard Worker;T18: to label %unreachable unwind label %right 306*9880d681SAndroid Build Coastguard Worker;T18: right: 307*9880d681SAndroid Build Coastguard Worker;T18: %cp.right = cleanuppad within none [] 308*9880d681SAndroid Build Coastguard Worker;T18: invoke void @g() [ "funclet"(token %cp.right) ] 309*9880d681SAndroid Build Coastguard Worker;T18: to label %unreachable unwind label %left 310*9880d681SAndroid Build Coastguard Worker;T18: ; CHECK18: EH pads can't handle each other's exceptions 311*9880d681SAndroid Build Coastguard Worker;T18: ; CHECK18-NEXT: %cp.left = cleanuppad within none [] 312*9880d681SAndroid Build Coastguard Worker;T18: ; CHECK18-NEXT: invoke void @g() [ "funclet"(token %cp.left) ] 313*9880d681SAndroid Build Coastguard Worker;T18: ; CHECK18-NEXT: to label %unreachable unwind label %right 314*9880d681SAndroid Build Coastguard Worker;T18: ; CHECK18-NEXT: %cp.right = cleanuppad within none [] 315*9880d681SAndroid Build Coastguard Worker;T18: ; CHECK18-NEXT: invoke void @g() [ "funclet"(token %cp.right) ] 316*9880d681SAndroid Build Coastguard Worker;T18: ; CHECK18-NEXT: to label %unreachable unwind label %left 317*9880d681SAndroid Build Coastguard Worker;T18: unreachable: 318*9880d681SAndroid Build Coastguard Worker;T18: unreachable 319*9880d681SAndroid Build Coastguard Worker;T18: } 320*9880d681SAndroid Build Coastguard Worker 321*9880d681SAndroid Build Coastguard Worker;T19: define void @f() personality void ()* @g { 322*9880d681SAndroid Build Coastguard Worker;T19: entry: 323*9880d681SAndroid Build Coastguard Worker;T19: ret void 324*9880d681SAndroid Build Coastguard Worker;T19: red: 325*9880d681SAndroid Build Coastguard Worker;T19: %redpad = cleanuppad within none [] 326*9880d681SAndroid Build Coastguard Worker;T19: unreachable 327*9880d681SAndroid Build Coastguard Worker;T19: red.inner: 328*9880d681SAndroid Build Coastguard Worker;T19: %innerpad = cleanuppad within %redpad [] 329*9880d681SAndroid Build Coastguard Worker;T19: invoke void @g() [ "funclet"(token %innerpad) ] 330*9880d681SAndroid Build Coastguard Worker;T19: to label %unreachable unwind label %green 331*9880d681SAndroid Build Coastguard Worker;T19: green: 332*9880d681SAndroid Build Coastguard Worker;T19: %greenswitch = catchswitch within none [label %catch] unwind label %blue 333*9880d681SAndroid Build Coastguard Worker;T19: catch: 334*9880d681SAndroid Build Coastguard Worker;T19: catchpad within %greenswitch [i32 42] 335*9880d681SAndroid Build Coastguard Worker;T19: unreachable 336*9880d681SAndroid Build Coastguard Worker;T19: blue: 337*9880d681SAndroid Build Coastguard Worker;T19: %bluepad = cleanuppad within none [] 338*9880d681SAndroid Build Coastguard Worker;T19: cleanupret from %bluepad unwind label %red 339*9880d681SAndroid Build Coastguard Worker;T19: ; CHECK19: EH pads can't handle each other's exceptions 340*9880d681SAndroid Build Coastguard Worker;T19: ; CHECK19-NEXT: %redpad = cleanuppad within none [] 341*9880d681SAndroid Build Coastguard Worker;T19: ; CHECK19-NEXT: invoke void @g() [ "funclet"(token %innerpad) ] 342*9880d681SAndroid Build Coastguard Worker;T19: ; CHECK19-NEXT: to label %unreachable unwind label %green 343*9880d681SAndroid Build Coastguard Worker;T19: ; CHECK19-NEXT: %greenswitch = catchswitch within none [label %catch] unwind label %blue 344*9880d681SAndroid Build Coastguard Worker;T19: ; CHECK19-NEXT: %bluepad = cleanuppad within none [] 345*9880d681SAndroid Build Coastguard Worker;T19: ; CHECK19-NEXT: cleanupret from %bluepad unwind label %red 346*9880d681SAndroid Build Coastguard Worker;T19: unreachable: 347*9880d681SAndroid Build Coastguard Worker;T19: unreachable 348*9880d681SAndroid Build Coastguard Worker;T19: } 349*9880d681SAndroid Build Coastguard Worker 350*9880d681SAndroid Build Coastguard Worker;T20: define void @f() personality void ()* @g { 351*9880d681SAndroid Build Coastguard Worker;T20: entry: 352*9880d681SAndroid Build Coastguard Worker;T20: ret void 353*9880d681SAndroid Build Coastguard Worker;T20: switch: 354*9880d681SAndroid Build Coastguard Worker;T20: %cs = catchswitch within none [label %catch] unwind label %catch 355*9880d681SAndroid Build Coastguard Worker;T20: ; CHECK20: Catchswitch cannot unwind to one of its catchpads 356*9880d681SAndroid Build Coastguard Worker;T20: ; CHECK20-NEXT: %cs = catchswitch within none [label %catch] unwind label %catch 357*9880d681SAndroid Build Coastguard Worker;T20: ; CHECK20-NEXT: %cp = catchpad within %cs [i32 4] 358*9880d681SAndroid Build Coastguard Worker;T20: catch: 359*9880d681SAndroid Build Coastguard Worker;T20: %cp = catchpad within %cs [i32 4] 360*9880d681SAndroid Build Coastguard Worker;T20: unreachable 361*9880d681SAndroid Build Coastguard Worker;T20: } 362*9880d681SAndroid Build Coastguard Worker 363*9880d681SAndroid Build Coastguard Worker;T21: define void @f() personality void ()* @g { 364*9880d681SAndroid Build Coastguard Worker;T21: entry: 365*9880d681SAndroid Build Coastguard Worker;T21: ret void 366*9880d681SAndroid Build Coastguard Worker;T21: switch: 367*9880d681SAndroid Build Coastguard Worker;T21: %cs = catchswitch within none [label %catch1] unwind label %catch2 368*9880d681SAndroid Build Coastguard Worker;T21: ; CHECK21: Catchswitch cannot unwind to one of its catchpads 369*9880d681SAndroid Build Coastguard Worker;T21: ; CHECK21-NEXT: %cs = catchswitch within none [label %catch1] unwind label %catch2 370*9880d681SAndroid Build Coastguard Worker;T21: ; CHECK21-NEXT: %cp2 = catchpad within %cs [i32 2] 371*9880d681SAndroid Build Coastguard Worker;T21: catch1: 372*9880d681SAndroid Build Coastguard Worker;T21: %cp1 = catchpad within %cs [i32 1] 373*9880d681SAndroid Build Coastguard Worker;T21: unreachable 374*9880d681SAndroid Build Coastguard Worker;T21: catch2: 375*9880d681SAndroid Build Coastguard Worker;T21: %cp2 = catchpad within %cs [i32 2] 376*9880d681SAndroid Build Coastguard Worker;T21: unreachable 377*9880d681SAndroid Build Coastguard Worker;T21: } 378*9880d681SAndroid Build Coastguard Worker 379*9880d681SAndroid Build Coastguard Worker;T22: define void @f() personality void ()* @g { 380*9880d681SAndroid Build Coastguard Worker;T22: invoke void @g() 381*9880d681SAndroid Build Coastguard Worker;T22: to label %merge unwind label %cleanup 382*9880d681SAndroid Build Coastguard Worker;T22: 383*9880d681SAndroid Build Coastguard Worker;T22: cleanup: 384*9880d681SAndroid Build Coastguard Worker;T22: %outer = cleanuppad within none [] 385*9880d681SAndroid Build Coastguard Worker;T22: invoke void @g() [ "funclet"(token %outer) ] 386*9880d681SAndroid Build Coastguard Worker;T22: to label %merge unwind label %merge 387*9880d681SAndroid Build Coastguard Worker;T22: ; CHECK22: The unwind destination does not have an exception handling instruction! 388*9880d681SAndroid Build Coastguard Worker;T22: ; CHECK22: invoke void @g() [ "funclet"(token %outer) ] 389*9880d681SAndroid Build Coastguard Worker;T22: ; CHECK22: to label %merge unwind label %merge 390*9880d681SAndroid Build Coastguard Worker;T22: 391*9880d681SAndroid Build Coastguard Worker;T22: merge: 392*9880d681SAndroid Build Coastguard Worker;T22: unreachable 393*9880d681SAndroid Build Coastguard Worker;T22: } 394*9880d681SAndroid Build Coastguard Worker 395*9880d681SAndroid Build Coastguard Worker;T23: define void @f() personality void ()* @g { 396*9880d681SAndroid Build Coastguard Worker;T23: invoke void @g() 397*9880d681SAndroid Build Coastguard Worker;T23: to label %exit unwind label %pad 398*9880d681SAndroid Build Coastguard Worker;T23: 399*9880d681SAndroid Build Coastguard Worker;T23: pad: 400*9880d681SAndroid Build Coastguard Worker;T23: %outer = catchpad within %outer [] 401*9880d681SAndroid Build Coastguard Worker;T23: ; CHECK23: CatchPadInst needs to be directly nested in a CatchSwitchInst. 402*9880d681SAndroid Build Coastguard Worker;T23: ; CHECK23: %outer = catchpad within %outer [] 403*9880d681SAndroid Build Coastguard Worker;T23: unreachable 404*9880d681SAndroid Build Coastguard Worker;T23: 405*9880d681SAndroid Build Coastguard Worker;T23: exit: 406*9880d681SAndroid Build Coastguard Worker;T23: unreachable 407*9880d681SAndroid Build Coastguard Worker;T23: } 408*9880d681SAndroid Build Coastguard Worker 409*9880d681SAndroid Build Coastguard Worker;T24: define void @f() personality void ()* @g { 410*9880d681SAndroid Build Coastguard Worker;T24: invoke void @g() 411*9880d681SAndroid Build Coastguard Worker;T24: to label %exit unwind label %pad 412*9880d681SAndroid Build Coastguard Worker;T24: ; CHECK24: A single unwind edge may only enter one EH pad 413*9880d681SAndroid Build Coastguard Worker;T24: ; CHECK24: invoke void @g() 414*9880d681SAndroid Build Coastguard Worker;T24: ; CHECK24: to label %exit unwind label %pad 415*9880d681SAndroid Build Coastguard Worker;T24: 416*9880d681SAndroid Build Coastguard Worker;T24: pad: 417*9880d681SAndroid Build Coastguard Worker;T24: %outer = cleanuppad within %outer [] 418*9880d681SAndroid Build Coastguard Worker;T24: ; CHECK24: FuncletPadInst must not be nested within itself 419*9880d681SAndroid Build Coastguard Worker;T24: ; CHECK24: %outer = cleanuppad within %outer [] 420*9880d681SAndroid Build Coastguard Worker;T24: unreachable 421*9880d681SAndroid Build Coastguard Worker;T24: 422*9880d681SAndroid Build Coastguard Worker;T24: exit: 423*9880d681SAndroid Build Coastguard Worker;T24: unreachable 424*9880d681SAndroid Build Coastguard Worker;T24: } 425*9880d681SAndroid Build Coastguard Worker 426*9880d681SAndroid Build Coastguard Worker;T25: define void @f() personality void ()* @g { 427*9880d681SAndroid Build Coastguard Worker;T25: entry: 428*9880d681SAndroid Build Coastguard Worker;T25: unreachable 429*9880d681SAndroid Build Coastguard Worker;T25: 430*9880d681SAndroid Build Coastguard Worker;T25: catch.dispatch: 431*9880d681SAndroid Build Coastguard Worker;T25: %cs = catchswitch within %cp2 [label %catch] unwind label %ehcleanup 432*9880d681SAndroid Build Coastguard Worker;T25: ; CHECK25: EH pad jumps through a cycle of pads 433*9880d681SAndroid Build Coastguard Worker;T25: ; CHECK25: %cs = catchswitch within %cp2 [label %catch] unwind label %ehcleanup 434*9880d681SAndroid Build Coastguard Worker;T25: 435*9880d681SAndroid Build Coastguard Worker;T25: catch: 436*9880d681SAndroid Build Coastguard Worker;T25: %cp2 = catchpad within %cs [i8* null, i32 64, i8* null] 437*9880d681SAndroid Build Coastguard Worker;T25: unreachable 438*9880d681SAndroid Build Coastguard Worker;T25: 439*9880d681SAndroid Build Coastguard Worker;T25: ehcleanup: 440*9880d681SAndroid Build Coastguard Worker;T25: %cp3 = cleanuppad within none [] 441*9880d681SAndroid Build Coastguard Worker;T25: cleanupret from %cp3 unwind to caller 442*9880d681SAndroid Build Coastguard Worker;T25: } 443*9880d681SAndroid Build Coastguard Worker 444*9880d681SAndroid Build Coastguard Worker;T26: define void @f() personality void ()* @g { 445*9880d681SAndroid Build Coastguard Worker;T26: entry: 446*9880d681SAndroid Build Coastguard Worker;T26: ret void 447*9880d681SAndroid Build Coastguard Worker;T26: 448*9880d681SAndroid Build Coastguard Worker;T26: ehcleanup: 449*9880d681SAndroid Build Coastguard Worker;T26: cleanuppad within none [] 450*9880d681SAndroid Build Coastguard Worker;T26: cleanupret from none unwind label %ehcleanup 451*9880d681SAndroid Build Coastguard Worker;T26: ; CHECK26: A cleanupret must exit its cleanup 452*9880d681SAndroid Build Coastguard Worker;T26: ; CHECK26: cleanupret from none unwind label %ehcleanup 453*9880d681SAndroid Build Coastguard Worker;T26: ; CHECK26: CleanupReturnInst needs to be provided a CleanupPad 454*9880d681SAndroid Build Coastguard Worker;T26: ; CHECK26: cleanupret from none unwind label %ehcleanup 455*9880d681SAndroid Build Coastguard Worker;T26: ; CHECK26: token none 456*9880d681SAndroid Build Coastguard Worker;T26: } 457