| # RUN: llvm-mc -filetype=asm < %s -triple i686-windows-msvc | FileCheck %s --check-prefix=ASM |
| # RUN: llvm-mc -filetype=obj < %s -triple i686-windows-msvc | llvm-readobj -codeview | FileCheck %s --check-prefix=OBJ |
| |
| .globl _foo |
| _foo: |
| .cv_fpo_proc _foo 4 |
| pushl %ebp |
| .cv_fpo_pushreg ebp # Test without % |
| pushl %ebx |
| .cv_fpo_pushreg %ebx |
| pushl %edi |
| .cv_fpo_pushreg %edi |
| pushl %esi |
| .cv_fpo_pushreg esi |
| subl $20, %esp |
| .cv_fpo_stackalloc 20 |
| .cv_fpo_endprologue |
| |
| # ASM: .cv_fpo_proc _foo 4 |
| # ASM: pushl %ebp |
| # ASM: .cv_fpo_pushreg %ebp |
| # ASM: pushl %ebx |
| # ASM: .cv_fpo_pushreg %ebx |
| # ASM: pushl %edi |
| # ASM: .cv_fpo_pushreg %edi |
| # ASM: pushl %esi |
| # ASM: .cv_fpo_pushreg %esi |
| # ASM: subl $20, %esp |
| # ASM: .cv_fpo_stackalloc 20 |
| # ASM: .cv_fpo_endprologue |
| |
| # Clobbers |
| xorl %ebp, %ebp |
| xorl %ebx, %ebx |
| xorl %edi, %edi |
| xorl %esi, %esi |
| # Use that stack memory |
| leal 4(%esp), %eax |
| movl %eax, (%esp) |
| calll _bar |
| |
| # ASM: calll _bar |
| |
| # Epilogue |
| # FIXME: Get FPO data for this once we get it for DWARF. |
| addl $20, %esp |
| popl %esi |
| popl %edi |
| popl %ebx |
| popl %ebp |
| retl |
| .cv_fpo_endproc |
| |
| # ASM: .cv_fpo_endproc |
| |
| .section .debug$S,"dr" |
| .p2align 2 |
| .long 4 # Debug section magic |
| .cv_fpo_data _foo |
| .cv_stringtable |
| |
| # ASM: .cv_fpo_data |
| |
| # OBJ: Subsection [ |
| # OBJ-NEXT: SubSectionType: FrameData (0xF5) |
| # OBJ-NEXT: SubSectionSize: 0xC4 |
| # OBJ-NEXT: LinkageName: _foo |
| # OBJ-NEXT: FrameData { |
| # OBJ-NEXT: RvaStart: 0x0 |
| # OBJ-NEXT: CodeSize: 0x23 |
| # OBJ-NEXT: LocalSize: 0x0 |
| # OBJ-NEXT: ParamsSize: 0x4 |
| # OBJ-NEXT: MaxStackSize: 0x0 |
| # OBJ-NEXT: PrologSize: 0x7 |
| # OBJ-NEXT: SavedRegsSize: 0x0 |
| # OBJ-NEXT: Flags [ (0x4) |
| # OBJ-NEXT: IsFunctionStart (0x4) |
| # OBJ-NEXT: ] |
| # OBJ-NEXT: FrameFunc [ |
| # OBJ-NEXT: $T0 .raSearch = |
| # OBJ-NEXT: $eip $T0 ^ = |
| # OBJ-NEXT: $esp $T0 4 + = |
| # OBJ-NEXT: ] |
| # OBJ-NEXT: } |
| # OBJ-NEXT: FrameData { |
| # OBJ-NEXT: RvaStart: 0x1 |
| # OBJ-NEXT: CodeSize: 0x22 |
| # OBJ-NEXT: LocalSize: 0x0 |
| # OBJ-NEXT: ParamsSize: 0x4 |
| # OBJ-NEXT: MaxStackSize: 0x0 |
| # OBJ-NEXT: PrologSize: 0x6 |
| # OBJ-NEXT: SavedRegsSize: 0x4 |
| # OBJ-NEXT: Flags [ (0x0) |
| # OBJ-NEXT: ] |
| # OBJ-NEXT: FrameFunc [ |
| # OBJ-NEXT: $T0 .raSearch = |
| # OBJ-NEXT: $eip $T0 ^ = |
| # OBJ-NEXT: $esp $T0 4 + = |
| # OBJ-NEXT: $ebp $T0 4 - ^ = |
| # OBJ-NEXT: ] |
| # OBJ-NEXT: } |
| # OBJ-NEXT: FrameData { |
| # OBJ-NEXT: RvaStart: 0x2 |
| # OBJ-NEXT: CodeSize: 0x21 |
| # OBJ-NEXT: LocalSize: 0x0 |
| # OBJ-NEXT: ParamsSize: 0x4 |
| # OBJ-NEXT: MaxStackSize: 0x0 |
| # OBJ-NEXT: PrologSize: 0x5 |
| # OBJ-NEXT: SavedRegsSize: 0x8 |
| # OBJ-NEXT: Flags [ (0x0) |
| # OBJ-NEXT: ] |
| # OBJ-NEXT: FrameFunc [ |
| # OBJ-NEXT: $T0 .raSearch = |
| # OBJ-NEXT: $eip $T0 ^ = |
| # OBJ-NEXT: $esp $T0 4 + = |
| # OBJ-NEXT: $ebp $T0 4 - ^ = |
| # OBJ-NEXT: $ebx $T0 8 - ^ = |
| # OBJ-NEXT: ] |
| # OBJ-NEXT: } |
| # OBJ-NEXT: FrameData { |
| # OBJ-NEXT: RvaStart: 0x3 |
| # OBJ-NEXT: CodeSize: 0x20 |
| # OBJ-NEXT: LocalSize: 0x0 |
| # OBJ-NEXT: ParamsSize: 0x4 |
| # OBJ-NEXT: MaxStackSize: 0x0 |
| # OBJ-NEXT: PrologSize: 0x4 |
| # OBJ-NEXT: SavedRegsSize: 0xC |
| # OBJ-NEXT: Flags [ (0x0) |
| # OBJ-NEXT: ] |
| # OBJ-NEXT: FrameFunc [ |
| # OBJ-NEXT: $T0 .raSearch = |
| # OBJ-NEXT: $eip $T0 ^ = |
| # OBJ-NEXT: $esp $T0 4 + = |
| # OBJ-NEXT: $ebp $T0 4 - ^ = |
| # OBJ-NEXT: $ebx $T0 8 - ^ = |
| # OBJ-NEXT: $edi $T0 12 - ^ = |
| # OBJ-NEXT: ] |
| # OBJ-NEXT: } |
| # OBJ-NEXT: FrameData { |
| # OBJ-NEXT: RvaStart: 0x4 |
| # OBJ-NEXT: CodeSize: 0x1F |
| # OBJ-NEXT: LocalSize: 0x0 |
| # OBJ-NEXT: ParamsSize: 0x4 |
| # OBJ-NEXT: MaxStackSize: 0x0 |
| # OBJ-NEXT: PrologSize: 0x3 |
| # OBJ-NEXT: SavedRegsSize: 0x10 |
| # OBJ-NEXT: Flags [ (0x0) |
| # OBJ-NEXT: ] |
| # OBJ-NEXT: FrameFunc [ |
| # OBJ-NEXT: $T0 .raSearch = |
| # OBJ-NEXT: $eip $T0 ^ = |
| # OBJ-NEXT: $esp $T0 4 + = |
| # OBJ-NEXT: $ebp $T0 4 - ^ = |
| # OBJ-NEXT: $ebx $T0 8 - ^ = |
| # OBJ-NEXT: $edi $T0 12 - ^ = |
| # OBJ-NEXT: $esi $T0 16 - ^ = |
| # OBJ-NEXT: ] |
| # OBJ-NEXT: } |
| # OBJ-NEXT: FrameData { |
| # OBJ-NEXT: RvaStart: 0x7 |
| # OBJ-NEXT: CodeSize: 0x1C |
| # OBJ-NEXT: LocalSize: 0x14 |
| # OBJ-NEXT: ParamsSize: 0x4 |
| # OBJ-NEXT: MaxStackSize: 0x0 |
| # OBJ-NEXT: PrologSize: 0x0 |
| # OBJ-NEXT: SavedRegsSize: 0x10 |
| # OBJ-NEXT: Flags [ (0x0) |
| # OBJ-NEXT: ] |
| # OBJ-NEXT: FrameFunc [ |
| # OBJ-NEXT: $T0 .raSearch = |
| # OBJ-NEXT: $eip $T0 ^ = |
| # OBJ-NEXT: $esp $T0 4 + = |
| # OBJ-NEXT: $ebp $T0 4 - ^ = |
| # OBJ-NEXT: $ebx $T0 8 - ^ = |
| # OBJ-NEXT: $edi $T0 12 - ^ = |
| # OBJ-NEXT: $esi $T0 16 - ^ = |
| # OBJ-NEXT: ] |
| # OBJ-NEXT: } |
| # OBJ-NOT: FrameData |