1*9880d681SAndroid Build Coastguard Worker; RUN: llc -verify-machineinstrs -mtriple=i686-pc-windows-msvc < %s | FileCheck --check-prefix=X86 %s 2*9880d681SAndroid Build Coastguard Worker; RUN: llc -verify-machineinstrs -mtriple=x86_64-pc-windows-msvc < %s | FileCheck --check-prefix=X64 %s 3*9880d681SAndroid Build Coastguard Worker 4*9880d681SAndroid Build Coastguard Worker%struct.Dtor = type { i8 } 5*9880d681SAndroid Build Coastguard Worker 6*9880d681SAndroid Build Coastguard Workerdefine void @simple_cleanup() #0 personality i8* bitcast (i32 (...)* @__CxxFrameHandler3 to i8*) { 7*9880d681SAndroid Build Coastguard Workerentry: 8*9880d681SAndroid Build Coastguard Worker %o = alloca %struct.Dtor, align 1 9*9880d681SAndroid Build Coastguard Worker invoke void @f(i32 1) 10*9880d681SAndroid Build Coastguard Worker to label %invoke.cont unwind label %ehcleanup 11*9880d681SAndroid Build Coastguard Worker 12*9880d681SAndroid Build Coastguard Workerinvoke.cont: ; preds = %entry 13*9880d681SAndroid Build Coastguard Worker call x86_thiscallcc void @"\01??1Dtor@@QAE@XZ"(%struct.Dtor* %o) #2 14*9880d681SAndroid Build Coastguard Worker ret void 15*9880d681SAndroid Build Coastguard Worker 16*9880d681SAndroid Build Coastguard Workerehcleanup: ; preds = %entry 17*9880d681SAndroid Build Coastguard Worker %0 = cleanuppad within none [] 18*9880d681SAndroid Build Coastguard Worker call x86_thiscallcc void @"\01??1Dtor@@QAE@XZ"(%struct.Dtor* %o) #2 [ "funclet"(token %0) ] 19*9880d681SAndroid Build Coastguard Worker cleanupret from %0 unwind to caller 20*9880d681SAndroid Build Coastguard Worker} 21*9880d681SAndroid Build Coastguard Worker 22*9880d681SAndroid Build Coastguard Worker; CHECK: simple_cleanup: # @simple_cleanup 23*9880d681SAndroid Build Coastguard Worker; CHECK: pushq %rbp 24*9880d681SAndroid Build Coastguard Worker; CHECK: subq $48, %rsp 25*9880d681SAndroid Build Coastguard Worker; CHECK: leaq 48(%rsp), %rbp 26*9880d681SAndroid Build Coastguard Worker; CHECK: movq $-2, -8(%rbp) 27*9880d681SAndroid Build Coastguard Worker; CHECK: movl $1, %ecx 28*9880d681SAndroid Build Coastguard Worker; CHECK: callq f 29*9880d681SAndroid Build Coastguard Worker; CHECK: callq "??1Dtor@@QAE@XZ" 30*9880d681SAndroid Build Coastguard Worker; CHECK: nop 31*9880d681SAndroid Build Coastguard Worker; CHECK: addq $48, %rsp 32*9880d681SAndroid Build Coastguard Worker; CHECK: popq %rbp 33*9880d681SAndroid Build Coastguard Worker; CHECK: retq 34*9880d681SAndroid Build Coastguard Worker 35*9880d681SAndroid Build Coastguard Worker; CHECK: "?dtor$2@?0?simple_cleanup@4HA": 36*9880d681SAndroid Build Coastguard Worker; CHECK: callq "??1Dtor@@QAE@XZ" 37*9880d681SAndroid Build Coastguard Worker; CHECK: retq 38*9880d681SAndroid Build Coastguard Worker 39*9880d681SAndroid Build Coastguard Worker; CHECK: $cppxdata$simple_cleanup: 40*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .long 429065506 41*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .long 1 42*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .long ($stateUnwindMap$simple_cleanup)@IMGREL 43*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .long 0 44*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .long 0 45*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .long 3 46*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .long ($ip2state$simple_cleanup)@IMGREL 47*9880d681SAndroid Build Coastguard Worker; UnwindHelp offset should match the -2 store above 48*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .long 40 49*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .long 0 50*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .long 1 51*9880d681SAndroid Build Coastguard Worker 52*9880d681SAndroid Build Coastguard Workerdeclare void @f(i32) #0 53*9880d681SAndroid Build Coastguard Worker 54*9880d681SAndroid Build Coastguard Workerdeclare i32 @__CxxFrameHandler3(...) 55*9880d681SAndroid Build Coastguard Worker 56*9880d681SAndroid Build Coastguard Worker; Function Attrs: nounwind 57*9880d681SAndroid Build Coastguard Workerdeclare x86_thiscallcc void @"\01??1Dtor@@QAE@XZ"(%struct.Dtor*) #1 58*9880d681SAndroid Build Coastguard Worker 59*9880d681SAndroid Build Coastguard Workerdefine void @nested_cleanup() #0 personality i8* bitcast (i32 (...)* @__CxxFrameHandler3 to i8*) { 60*9880d681SAndroid Build Coastguard Workerentry: 61*9880d681SAndroid Build Coastguard Worker %o1 = alloca %struct.Dtor, align 1 62*9880d681SAndroid Build Coastguard Worker %o2 = alloca %struct.Dtor, align 1 63*9880d681SAndroid Build Coastguard Worker invoke void @f(i32 1) 64*9880d681SAndroid Build Coastguard Worker to label %invoke.cont unwind label %cleanup.outer 65*9880d681SAndroid Build Coastguard Worker 66*9880d681SAndroid Build Coastguard Workerinvoke.cont: ; preds = %entry 67*9880d681SAndroid Build Coastguard Worker invoke void @f(i32 2) 68*9880d681SAndroid Build Coastguard Worker to label %invoke.cont.1 unwind label %cleanup.inner 69*9880d681SAndroid Build Coastguard Worker 70*9880d681SAndroid Build Coastguard Workerinvoke.cont.1: ; preds = %invoke.cont 71*9880d681SAndroid Build Coastguard Worker call x86_thiscallcc void @"\01??1Dtor@@QAE@XZ"(%struct.Dtor* %o2) #2 72*9880d681SAndroid Build Coastguard Worker invoke void @f(i32 3) 73*9880d681SAndroid Build Coastguard Worker to label %invoke.cont.2 unwind label %cleanup.outer 74*9880d681SAndroid Build Coastguard Worker 75*9880d681SAndroid Build Coastguard Workerinvoke.cont.2: ; preds = %invoke.cont.1 76*9880d681SAndroid Build Coastguard Worker call x86_thiscallcc void @"\01??1Dtor@@QAE@XZ"(%struct.Dtor* %o1) #2 77*9880d681SAndroid Build Coastguard Worker ret void 78*9880d681SAndroid Build Coastguard Worker 79*9880d681SAndroid Build Coastguard Workercleanup.inner: ; preds = %invoke.cont 80*9880d681SAndroid Build Coastguard Worker %0 = cleanuppad within none [] 81*9880d681SAndroid Build Coastguard Worker call x86_thiscallcc void @"\01??1Dtor@@QAE@XZ"(%struct.Dtor* %o2) #2 [ "funclet"(token %0) ] 82*9880d681SAndroid Build Coastguard Worker cleanupret from %0 unwind label %cleanup.outer 83*9880d681SAndroid Build Coastguard Worker 84*9880d681SAndroid Build Coastguard Workercleanup.outer: ; preds = %invoke.cont.1, %cleanup.inner, %entry 85*9880d681SAndroid Build Coastguard Worker %1 = cleanuppad within none [] 86*9880d681SAndroid Build Coastguard Worker call x86_thiscallcc void @"\01??1Dtor@@QAE@XZ"(%struct.Dtor* %o1) #2 [ "funclet"(token %1) ] 87*9880d681SAndroid Build Coastguard Worker cleanupret from %1 unwind to caller 88*9880d681SAndroid Build Coastguard Worker} 89*9880d681SAndroid Build Coastguard Worker 90*9880d681SAndroid Build Coastguard Worker; X86-LABEL: _nested_cleanup: 91*9880d681SAndroid Build Coastguard Worker; X86: pushl $1 92*9880d681SAndroid Build Coastguard Worker; X86: calll _f 93*9880d681SAndroid Build Coastguard Worker; X86: pushl $2 94*9880d681SAndroid Build Coastguard Worker; X86: calll _f 95*9880d681SAndroid Build Coastguard Worker; X86: pushl $3 96*9880d681SAndroid Build Coastguard Worker; X86: calll _f 97*9880d681SAndroid Build Coastguard Worker 98*9880d681SAndroid Build Coastguard Worker; X86: "?dtor$[[cleanup_inner:[0-9]+]]@?0?nested_cleanup@4HA": 99*9880d681SAndroid Build Coastguard Worker; X86: LBB1_[[cleanup_inner]]: # %cleanup.inner{{$}} 100*9880d681SAndroid Build Coastguard Worker; X86: pushl %ebp 101*9880d681SAndroid Build Coastguard Worker; X86: leal {{.*}}(%ebp), %ecx 102*9880d681SAndroid Build Coastguard Worker; X86: calll "??1Dtor@@QAE@XZ" 103*9880d681SAndroid Build Coastguard Worker; X86: popl %ebp 104*9880d681SAndroid Build Coastguard Worker; X86: retl 105*9880d681SAndroid Build Coastguard Worker 106*9880d681SAndroid Build Coastguard Worker; X86: "?dtor$[[cleanup_outer:[0-9]+]]@?0?nested_cleanup@4HA": 107*9880d681SAndroid Build Coastguard Worker; X86: LBB1_[[cleanup_outer]]: # %cleanup.outer{{$}} 108*9880d681SAndroid Build Coastguard Worker; X86: pushl %ebp 109*9880d681SAndroid Build Coastguard Worker; X86: leal {{.*}}(%ebp), %ecx 110*9880d681SAndroid Build Coastguard Worker; X86: calll "??1Dtor@@QAE@XZ" 111*9880d681SAndroid Build Coastguard Worker; X86: popl %ebp 112*9880d681SAndroid Build Coastguard Worker; X86: retl 113*9880d681SAndroid Build Coastguard Worker 114*9880d681SAndroid Build Coastguard Worker; X86: L__ehtable$nested_cleanup: 115*9880d681SAndroid Build Coastguard Worker; X86: .long 429065506 116*9880d681SAndroid Build Coastguard Worker; X86: .long 2 117*9880d681SAndroid Build Coastguard Worker; X86: .long ($stateUnwindMap$nested_cleanup) 118*9880d681SAndroid Build Coastguard Worker; X86: .long 0 119*9880d681SAndroid Build Coastguard Worker; X86: .long 0 120*9880d681SAndroid Build Coastguard Worker; X86: .long 0 121*9880d681SAndroid Build Coastguard Worker; X86: .long 0 122*9880d681SAndroid Build Coastguard Worker; X86: .long 0 123*9880d681SAndroid Build Coastguard Worker; X86: .long 1 124*9880d681SAndroid Build Coastguard Worker; X86: $stateUnwindMap$nested_cleanup: 125*9880d681SAndroid Build Coastguard Worker; X86: .long -1 126*9880d681SAndroid Build Coastguard Worker; X86: .long "?dtor$[[cleanup_outer]]@?0?nested_cleanup@4HA" 127*9880d681SAndroid Build Coastguard Worker; X86: .long 0 128*9880d681SAndroid Build Coastguard Worker; X86: .long "?dtor$[[cleanup_inner]]@?0?nested_cleanup@4HA" 129*9880d681SAndroid Build Coastguard Worker 130*9880d681SAndroid Build Coastguard Worker; X64-LABEL: nested_cleanup: 131*9880d681SAndroid Build Coastguard Worker; X64: .Lfunc_begin1: 132*9880d681SAndroid Build Coastguard Worker; X64: .Ltmp13: 133*9880d681SAndroid Build Coastguard Worker; X64: movl $1, %ecx 134*9880d681SAndroid Build Coastguard Worker; X64: callq f 135*9880d681SAndroid Build Coastguard Worker; X64: .Ltmp15: 136*9880d681SAndroid Build Coastguard Worker; X64: movl $2, %ecx 137*9880d681SAndroid Build Coastguard Worker; X64: callq f 138*9880d681SAndroid Build Coastguard Worker; X64: .Ltmp16: 139*9880d681SAndroid Build Coastguard Worker; X64: callq "??1Dtor@@QAE@XZ" 140*9880d681SAndroid Build Coastguard Worker; X64: .Ltmp17: 141*9880d681SAndroid Build Coastguard Worker; X64: movl $3, %ecx 142*9880d681SAndroid Build Coastguard Worker; X64: callq f 143*9880d681SAndroid Build Coastguard Worker; X64: .Ltmp18: 144*9880d681SAndroid Build Coastguard Worker 145*9880d681SAndroid Build Coastguard Worker; X64: "?dtor$[[cleanup_inner:[0-9]+]]@?0?nested_cleanup@4HA": 146*9880d681SAndroid Build Coastguard Worker; X64: LBB1_[[cleanup_inner]]: # %cleanup.inner{{$}} 147*9880d681SAndroid Build Coastguard Worker; X64: pushq %rbp 148*9880d681SAndroid Build Coastguard Worker; X64: leaq {{.*}}(%rbp), %rcx 149*9880d681SAndroid Build Coastguard Worker; X64: callq "??1Dtor@@QAE@XZ" 150*9880d681SAndroid Build Coastguard Worker; X64: popq %rbp 151*9880d681SAndroid Build Coastguard Worker; X64: retq 152*9880d681SAndroid Build Coastguard Worker 153*9880d681SAndroid Build Coastguard Worker; X64: .seh_handlerdata 154*9880d681SAndroid Build Coastguard Worker; X64: .text 155*9880d681SAndroid Build Coastguard Worker; X64: .seh_endproc 156*9880d681SAndroid Build Coastguard Worker 157*9880d681SAndroid Build Coastguard Worker; X64: "?dtor$[[cleanup_outer:[0-9]+]]@?0?nested_cleanup@4HA": 158*9880d681SAndroid Build Coastguard Worker; X64: LBB1_[[cleanup_outer]]: # %cleanup.outer{{$}} 159*9880d681SAndroid Build Coastguard Worker; X64: pushq %rbp 160*9880d681SAndroid Build Coastguard Worker; X64: leaq {{.*}}(%rbp), %rcx 161*9880d681SAndroid Build Coastguard Worker; X64: callq "??1Dtor@@QAE@XZ" 162*9880d681SAndroid Build Coastguard Worker; X64: popq %rbp 163*9880d681SAndroid Build Coastguard Worker; X64: retq 164*9880d681SAndroid Build Coastguard Worker 165*9880d681SAndroid Build Coastguard Worker; X64: .section .xdata,"dr" 166*9880d681SAndroid Build Coastguard Worker; X64-NEXT: .p2align 2 167*9880d681SAndroid Build Coastguard Worker; X64: $cppxdata$nested_cleanup: 168*9880d681SAndroid Build Coastguard Worker; X64-NEXT: .long 429065506 169*9880d681SAndroid Build Coastguard Worker; X64-NEXT: .long 2 170*9880d681SAndroid Build Coastguard Worker; X64-NEXT: .long ($stateUnwindMap$nested_cleanup)@IMGREL 171*9880d681SAndroid Build Coastguard Worker; X64-NEXT: .long 0 172*9880d681SAndroid Build Coastguard Worker; X64-NEXT: .long 0 173*9880d681SAndroid Build Coastguard Worker; X64-NEXT: .long 5 174*9880d681SAndroid Build Coastguard Worker; X64-NEXT: .long ($ip2state$nested_cleanup)@IMGREL 175*9880d681SAndroid Build Coastguard Worker; X64-NEXT: .long 56 176*9880d681SAndroid Build Coastguard Worker; X64-NEXT: .long 0 177*9880d681SAndroid Build Coastguard Worker; X64-NEXT: .long 1 178*9880d681SAndroid Build Coastguard Worker 179*9880d681SAndroid Build Coastguard Worker; X64: $stateUnwindMap$nested_cleanup: 180*9880d681SAndroid Build Coastguard Worker; X64-NEXT: .long -1 181*9880d681SAndroid Build Coastguard Worker; X64-NEXT: .long "?dtor$[[cleanup_outer]]@?0?nested_cleanup@4HA"@IMGREL 182*9880d681SAndroid Build Coastguard Worker; X64-NEXT: .long 0 183*9880d681SAndroid Build Coastguard Worker; X64-NEXT: .long "?dtor$[[cleanup_inner]]@?0?nested_cleanup@4HA"@IMGREL 184*9880d681SAndroid Build Coastguard Worker 185*9880d681SAndroid Build Coastguard Worker; X64: $ip2state$nested_cleanup: 186*9880d681SAndroid Build Coastguard Worker; X64-NEXT: .long .Lfunc_begin1@IMGREL 187*9880d681SAndroid Build Coastguard Worker; X64-NEXT: .long -1 188*9880d681SAndroid Build Coastguard Worker; X64-NEXT: .long .Ltmp13@IMGREL 189*9880d681SAndroid Build Coastguard Worker; X64-NEXT: .long 0 190*9880d681SAndroid Build Coastguard Worker; X64-NEXT: .long .Ltmp15@IMGREL 191*9880d681SAndroid Build Coastguard Worker; X64-NEXT: .long 1 192*9880d681SAndroid Build Coastguard Worker; X64-NEXT: .long .Ltmp17@IMGREL 193*9880d681SAndroid Build Coastguard Worker; X64-NEXT: .long 0 194*9880d681SAndroid Build Coastguard Worker; X64-NEXT: .long .Ltmp18@IMGREL+1 195*9880d681SAndroid Build Coastguard Worker; X64-NEXT: .long -1 196*9880d681SAndroid Build Coastguard Worker 197*9880d681SAndroid Build Coastguard Workerattributes #0 = { "disable-tail-calls"="false" "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "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" } 198*9880d681SAndroid Build Coastguard Workerattributes #1 = { nounwind "disable-tail-calls"="false" "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "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" } 199*9880d681SAndroid Build Coastguard Workerattributes #2 = { nounwind } 200