1*9880d681SAndroid Build Coastguard Worker; RUN: llc -mtriple=i686-pc-windows-msvc -stack-symbol-ordering=0 < %s | FileCheck --check-prefix=X86 %s 2*9880d681SAndroid Build Coastguard Worker; RUN: llc -mtriple=x86_64-pc-windows-msvc -stack-symbol-ordering=0 < %s | FileCheck --check-prefix=X64 %s 3*9880d681SAndroid Build Coastguard Worker 4*9880d681SAndroid Build Coastguard Workerdeclare i32 @__CxxFrameHandler3(...) 5*9880d681SAndroid Build Coastguard Workerdeclare void @Dtor(i64* %o) 6*9880d681SAndroid Build Coastguard Workerdeclare void @f(i32) 7*9880d681SAndroid Build Coastguard Worker 8*9880d681SAndroid Build Coastguard Workerdefine void @realigned_cleanup() personality i32 (...)* @__CxxFrameHandler3 { 9*9880d681SAndroid Build Coastguard Workerentry: 10*9880d681SAndroid Build Coastguard Worker ; Overalign %o to cause stack realignment. 11*9880d681SAndroid Build Coastguard Worker %o = alloca i64, align 32 12*9880d681SAndroid Build Coastguard Worker invoke void @f(i32 1) 13*9880d681SAndroid Build Coastguard Worker to label %invoke.cont unwind label %ehcleanup 14*9880d681SAndroid Build Coastguard Worker 15*9880d681SAndroid Build Coastguard Workerinvoke.cont: ; preds = %entry 16*9880d681SAndroid Build Coastguard Worker call void @Dtor(i64* %o) 17*9880d681SAndroid Build Coastguard Worker ret void 18*9880d681SAndroid Build Coastguard Worker 19*9880d681SAndroid Build Coastguard Workerehcleanup: ; preds = %entry 20*9880d681SAndroid Build Coastguard Worker %0 = cleanuppad within none [] 21*9880d681SAndroid Build Coastguard Worker call void @Dtor(i64* %o) [ "funclet"(token %0) ] 22*9880d681SAndroid Build Coastguard Worker cleanupret from %0 unwind to caller 23*9880d681SAndroid Build Coastguard Worker} 24*9880d681SAndroid Build Coastguard Worker 25*9880d681SAndroid Build Coastguard Worker; X86-LABEL: _realigned_cleanup: # @realigned_cleanup 26*9880d681SAndroid Build Coastguard Worker; X86: pushl %ebp 27*9880d681SAndroid Build Coastguard Worker; X86: movl %esp, %ebp 28*9880d681SAndroid Build Coastguard Worker; X86: pushl %ebx 29*9880d681SAndroid Build Coastguard Worker; X86: pushl %edi 30*9880d681SAndroid Build Coastguard Worker; X86: pushl %esi 31*9880d681SAndroid Build Coastguard Worker; X86: andl $-32, %esp 32*9880d681SAndroid Build Coastguard Worker; X86: subl $96, %esp 33*9880d681SAndroid Build Coastguard Worker; X86: movl %esp, %esi 34*9880d681SAndroid Build Coastguard Worker; EBP will reload from this offset. 35*9880d681SAndroid Build Coastguard Worker; X86: movl %ebp, 28(%esi) 36*9880d681SAndroid Build Coastguard Worker; The last EH reg field is the state number, so dtor adjust is this +4. 37*9880d681SAndroid Build Coastguard Worker; X86: movl $-1, 72(%esi) 38*9880d681SAndroid Build Coastguard Worker 39*9880d681SAndroid Build Coastguard Worker; X86-LABEL: "?dtor$2@?0?realigned_cleanup@4HA": 40*9880d681SAndroid Build Coastguard Worker; X86: pushl %ebp 41*9880d681SAndroid Build Coastguard Worker; X86: leal -76(%ebp), %esi 42*9880d681SAndroid Build Coastguard Worker; X86: movl 28(%esi), %ebp 43*9880d681SAndroid Build Coastguard Worker; We used to have a bug where we clobbered ESI after the prologue. 44*9880d681SAndroid Build Coastguard Worker; X86-NOT: movl {{.*}}, %esi 45*9880d681SAndroid Build Coastguard Worker; X86: popl %ebp 46*9880d681SAndroid Build Coastguard Worker; X86: retl # CLEANUPRET 47*9880d681SAndroid Build Coastguard Worker 48*9880d681SAndroid Build Coastguard Worker; X64-LABEL: realigned_cleanup: # @realigned_cleanup 49*9880d681SAndroid Build Coastguard Worker; X64: pushq %rbp 50*9880d681SAndroid Build Coastguard Worker; X64: .seh_pushreg 5 51*9880d681SAndroid Build Coastguard Worker; X64: pushq %rbx 52*9880d681SAndroid Build Coastguard Worker; X64: .seh_pushreg 3 53*9880d681SAndroid Build Coastguard Worker; X64: subq $104, %rsp 54*9880d681SAndroid Build Coastguard Worker; X64: .seh_stackalloc 104 55*9880d681SAndroid Build Coastguard Worker; X64: leaq 96(%rsp), %rbp 56*9880d681SAndroid Build Coastguard Worker; X64: .seh_setframe 5, 96 57*9880d681SAndroid Build Coastguard Worker; X64: .seh_endprologue 58*9880d681SAndroid Build Coastguard Worker; X64: andq $-32, %rsp 59*9880d681SAndroid Build Coastguard Worker; X64: movq %rsp, %rbx 60*9880d681SAndroid Build Coastguard Worker; RBP will reload from this offset. 61*9880d681SAndroid Build Coastguard Worker; X64: movq %rbp, 56(%rbx) 62*9880d681SAndroid Build Coastguard Worker; X64: movq $-2, (%rbp) 63*9880d681SAndroid Build Coastguard Worker 64*9880d681SAndroid Build Coastguard Worker; X64-LABEL: "?dtor$2@?0?realigned_cleanup@4HA": 65*9880d681SAndroid Build Coastguard Worker; X64: movq %rdx, 16(%rsp) 66*9880d681SAndroid Build Coastguard Worker; X64: pushq %rbp 67*9880d681SAndroid Build Coastguard Worker; X64: .seh_pushreg 5 68*9880d681SAndroid Build Coastguard Worker; X64: pushq %rbx 69*9880d681SAndroid Build Coastguard Worker; X64: .seh_pushreg 3 70*9880d681SAndroid Build Coastguard Worker; X64: subq $40, %rsp 71*9880d681SAndroid Build Coastguard Worker; X64: .seh_stackalloc 40 72*9880d681SAndroid Build Coastguard Worker; X64: leaq 96(%rdx), %rbp 73*9880d681SAndroid Build Coastguard Worker; X64: .seh_endprologue 74*9880d681SAndroid Build Coastguard Worker; X64: andq $-32, %rdx 75*9880d681SAndroid Build Coastguard Worker; X64: movq %rdx, %rbx 76*9880d681SAndroid Build Coastguard Worker; X64-NOT: mov{{.*}}, %rbx 77*9880d681SAndroid Build Coastguard Worker; X64: popq %rbp 78*9880d681SAndroid Build Coastguard Worker; X64: retq # CLEANUPRET 79