1; RUN: llc -stack-symbol-ordering=0 -mtriple=x86_64-windows-msvc < %s | FileCheck %s --check-prefix=X64 2; RUN: llc -stack-symbol-ordering=0 -mtriple=i686-windows-msvc < %s | FileCheck %s --check-prefix=X86 3 4declare void @llvm.va_start(ptr) 5declare void @llvm.va_end(ptr) 6declare i32 @__CxxFrameHandler3(...) 7declare void @g() 8 9define i32 @f(i32 %a, ...) personality ptr @__CxxFrameHandler3 { 10entry: 11 %ap = alloca ptr 12 invoke void @g() 13 to label %return unwind label %catch.dispatch 14 15catch.dispatch: ; preds = %entry 16 %cs1 = catchswitch within none [label %catch] unwind to caller 17 18catch: ; preds = %catch.dispatch 19 %0 = catchpad within %cs1 [ptr null, i32 64, ptr null] 20 call void @llvm.va_start(ptr %ap) 21 %argp.cur = load ptr, ptr %ap 22 %arg2 = load i32, ptr %argp.cur 23 call void @llvm.va_end(ptr %ap) 24 catchret from %0 to label %return 25 26return: ; preds = %entry, %catch 27 %retval.0 = phi i32 [ %arg2, %catch ], [ -1, %entry ] 28 ret i32 %retval.0 29} 30 31; X64-LABEL: .seh_proc f 32; X64: pushq %rbp 33; X64: subq $64, %rsp 34; X64: leaq 64(%rsp), %rbp 35; X64: movq $-2, -8(%rbp) 36; X64: movl $-1, -20(%rbp) # 4-byte Folded Spill 37; X64: callq g 38; X64: .LBB0_1 39; X64: movl -20(%rbp), %eax # 4-byte Reload 40; X64: addq $64, %rsp 41; X64: popq %rbp 42 43; X64-LABEL: "?catch${{[0-9]}}@?0?f@4HA": 44; X64: .seh_proc "?catch${{[0-9]}}@?0?f@4HA" 45; X64: movq %rdx, 16(%rsp) 46; X64: pushq %rbp 47; X64: subq $32, %rsp 48; X64: leaq 64(%rdx), %rbp 49; arg2 is at RBP+40: 50; start at arg2 51; + 8 for arg1 52; + 8 for retaddr 53; + 8 for RBP 54; + 64 for stackalloc 55; - 64 for setframe 56; = 40 57; X64: movl 24(%rbp), %eax 58; X64: movl %eax, -20(%rbp) # 4-byte Spill 59; X64: leaq .LBB0_1(%rip), %rax 60; X64: addq $32, %rsp 61; X64: popq %rbp 62; X64: retq # CATCHRET 63 64; X86-LABEL: _f: # @f 65; X86: pushl %ebp 66; X86: movl %esp, %ebp 67; X86: pushl %ebx 68; X86: pushl %edi 69; X86: pushl %esi 70; X86: subl $24, %esp 71; X86: movl $-1, -36(%ebp) 72; X86: calll _g 73; X86: LBB0_[[retbb:[0-9]+]]: 74; X86: movl -36(%ebp), %eax 75; X86: addl $24, %esp 76; X86: popl %esi 77; X86: popl %edi 78; X86: popl %ebx 79; X86: popl %ebp 80; X86: retl 81 82; X86: LBB0_[[restorebb:[0-9]+]]: # Block address taken 83; X86: addl $12, %ebp 84; arg2 is at EBP offset 12: 85; + 4 for arg1 86; + 4 for retaddr 87; + 4 for EBP 88; X86: movl 12(%ebp), %eax 89; X86: movl %eax, -36(%ebp) 90; X86: jmp LBB0_[[retbb]] 91 92; X86-LABEL: "?catch${{[0-9]}}@?0?f@4HA": 93; X86: pushl %ebp 94; X86: addl $12, %ebp 95; Done due to mov %esp, %ebp 96; X86: leal 12(%ebp), %eax 97; X86: movl $LBB0_[[restorebb]], %eax 98; X86: popl %ebp 99; X86: retl # CATCHRET 100