1# RUN: llvm-mc -filetype=asm < %s -triple i686-windows-msvc | FileCheck %s --check-prefix=ASM 2# RUN: llvm-mc -filetype=obj < %s -triple i686-windows-msvc | llvm-readobj -codeview | FileCheck %s --check-prefix=OBJ 3 4.globl _foo 5_foo: 6 .cv_fpo_proc _foo 4 7 pushl %ebp 8 .cv_fpo_pushreg ebp # Test without % 9 pushl %ebx 10 .cv_fpo_pushreg %ebx 11 pushl %edi 12 .cv_fpo_pushreg %edi 13 pushl %esi 14 .cv_fpo_pushreg esi 15 subl $20, %esp 16 .cv_fpo_stackalloc 20 17 .cv_fpo_endprologue 18 19 # ASM: .cv_fpo_proc _foo 4 20 # ASM: pushl %ebp 21 # ASM: .cv_fpo_pushreg %ebp 22 # ASM: pushl %ebx 23 # ASM: .cv_fpo_pushreg %ebx 24 # ASM: pushl %edi 25 # ASM: .cv_fpo_pushreg %edi 26 # ASM: pushl %esi 27 # ASM: .cv_fpo_pushreg %esi 28 # ASM: subl $20, %esp 29 # ASM: .cv_fpo_stackalloc 20 30 # ASM: .cv_fpo_endprologue 31 32 # Clobbers 33 xorl %ebp, %ebp 34 xorl %ebx, %ebx 35 xorl %edi, %edi 36 xorl %esi, %esi 37 # Use that stack memory 38 leal 4(%esp), %eax 39 movl %eax, (%esp) 40 calll _bar 41 42 # ASM: calll _bar 43 44 # Epilogue 45 # FIXME: Get FPO data for this once we get it for DWARF. 46 addl $20, %esp 47 popl %esi 48 popl %edi 49 popl %ebx 50 popl %ebp 51 retl 52 .cv_fpo_endproc 53 54 # ASM: .cv_fpo_endproc 55 56 .section .debug$S,"dr" 57 .p2align 2 58 .long 4 # Debug section magic 59 .cv_fpo_data _foo 60 .cv_stringtable 61 62 # ASM: .cv_fpo_data 63 64# OBJ: Subsection [ 65# OBJ-NEXT: SubSectionType: FrameData (0xF5) 66# OBJ-NEXT: SubSectionSize: 0xC4 67# OBJ-NEXT: LinkageName: _foo 68# OBJ-NEXT: FrameData { 69# OBJ-NEXT: RvaStart: 0x0 70# OBJ-NEXT: CodeSize: 0x23 71# OBJ-NEXT: LocalSize: 0x0 72# OBJ-NEXT: ParamsSize: 0x4 73# OBJ-NEXT: MaxStackSize: 0x0 74# OBJ-NEXT: FrameFunc: $T0 .raSearch = $eip $T0 ^ = $esp $T0 4 + = 75# OBJ-NEXT: PrologSize: 0x7 76# OBJ-NEXT: SavedRegsSize: 0x0 77# OBJ-NEXT: Flags [ (0x4) 78# OBJ-NEXT: IsFunctionStart (0x4) 79# OBJ-NEXT: ] 80# OBJ-NEXT: } 81# OBJ-NEXT: FrameData { 82# OBJ-NEXT: RvaStart: 0x1 83# OBJ-NEXT: CodeSize: 0x22 84# OBJ-NEXT: LocalSize: 0x0 85# OBJ-NEXT: ParamsSize: 0x4 86# OBJ-NEXT: MaxStackSize: 0x0 87# OBJ-NEXT: FrameFunc: $T0 .raSearch = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 4 - ^ = 88# OBJ-NEXT: PrologSize: 0x6 89# OBJ-NEXT: SavedRegsSize: 0x4 90# OBJ-NEXT: Flags [ (0x0) 91# OBJ-NEXT: ] 92# OBJ-NEXT: } 93# OBJ-NEXT: FrameData { 94# OBJ-NEXT: RvaStart: 0x2 95# OBJ-NEXT: CodeSize: 0x21 96# OBJ-NEXT: LocalSize: 0x0 97# OBJ-NEXT: ParamsSize: 0x4 98# OBJ-NEXT: MaxStackSize: 0x0 99# OBJ-NEXT: FrameFunc: $T0 .raSearch = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 4 - ^ = $ebx $T0 8 - ^ = 100# OBJ-NEXT: PrologSize: 0x5 101# OBJ-NEXT: SavedRegsSize: 0x8 102# OBJ-NEXT: Flags [ (0x0) 103# OBJ-NEXT: ] 104# OBJ-NEXT: } 105# OBJ-NEXT: FrameData { 106# OBJ-NEXT: RvaStart: 0x3 107# OBJ-NEXT: CodeSize: 0x20 108# OBJ-NEXT: LocalSize: 0x0 109# OBJ-NEXT: ParamsSize: 0x4 110# OBJ-NEXT: MaxStackSize: 0x0 111# OBJ-NEXT: FrameFunc: $T0 .raSearch = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 4 - ^ = $ebx $T0 8 - ^ = $edi $T0 12 - ^ = 112# OBJ-NEXT: PrologSize: 0x4 113# OBJ-NEXT: SavedRegsSize: 0xC 114# OBJ-NEXT: Flags [ (0x0) 115# OBJ-NEXT: ] 116# OBJ-NEXT: } 117# OBJ-NEXT: FrameData { 118# OBJ-NEXT: RvaStart: 0x4 119# OBJ-NEXT: CodeSize: 0x1F 120# OBJ-NEXT: LocalSize: 0x0 121# OBJ-NEXT: ParamsSize: 0x4 122# OBJ-NEXT: MaxStackSize: 0x0 123# OBJ-NEXT: FrameFunc: $T0 .raSearch = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 4 - ^ = $ebx $T0 8 - ^ = $edi $T0 12 - ^ = $esi $T0 16 - ^ = 124# OBJ-NEXT: PrologSize: 0x3 125# OBJ-NEXT: SavedRegsSize: 0x10 126# OBJ-NEXT: Flags [ (0x0) 127# OBJ-NEXT: ] 128# OBJ-NEXT: } 129# OBJ-NEXT: FrameData { 130# OBJ-NEXT: RvaStart: 0x7 131# OBJ-NEXT: CodeSize: 0x1C 132# OBJ-NEXT: LocalSize: 0x14 133# OBJ-NEXT: ParamsSize: 0x4 134# OBJ-NEXT: MaxStackSize: 0x0 135# OBJ-NEXT: FrameFunc: $T0 .raSearch = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 4 - ^ = $ebx $T0 8 - ^ = $edi $T0 12 - ^ = $esi $T0 16 - ^ = 136# OBJ-NEXT: PrologSize: 0x0 137# OBJ-NEXT: SavedRegsSize: 0x10 138# OBJ-NEXT: Flags [ (0x0) 139# OBJ-NEXT: ] 140# OBJ-NEXT: } 141# OBJ-NOT: FrameData 142