|  | # 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 | 
|  | movl	%ebp, %esp | 
|  | .cv_fpo_setframe %ebp | 
|  | 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: movl	%ebp, %esp | 
|  | # ASM: .cv_fpo_setframe %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 %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: | 
|  | # 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:      FrameFunc: $T0 .raSearch = $eip $T0 ^ = $esp $T0 4 + = | 
|  | # OBJ-NEXT:      PrologSize: 0x9 | 
|  | # OBJ-NEXT:      SavedRegsSize: 0x0 | 
|  | # OBJ-NEXT:      Flags [ (0x4) | 
|  | # OBJ-NEXT:        IsFunctionStart (0x4) | 
|  | # 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:      FrameFunc: $T0 .raSearch = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 4 - ^ = | 
|  | # OBJ-NEXT:      PrologSize: 0x8 | 
|  | # OBJ-NEXT:      SavedRegsSize: 0x4 | 
|  | # OBJ-NEXT:      Flags [ (0x0) | 
|  | # 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:      FrameFunc: $T0 $ebp 4 + = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 4 - ^ = | 
|  | # OBJ-NEXT:      PrologSize: 0x6 | 
|  | # OBJ-NEXT:      SavedRegsSize: 0x4 | 
|  | # OBJ-NEXT:      Flags [ (0x0) | 
|  | # 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:      FrameFunc: $T0 $ebp 4 + = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 4 - ^ = $ebx $T0 8 - ^ = | 
|  | # OBJ-NEXT:      PrologSize: 0x5 | 
|  | # OBJ-NEXT:      SavedRegsSize: 0x8 | 
|  | # OBJ-NEXT:      Flags [ (0x0) | 
|  | # OBJ-NEXT:      ] | 
|  | # OBJ-NEXT:    } | 
|  | # OBJ-NEXT:    FrameData { | 
|  | # OBJ-NEXT:      RvaStart: 0x5 | 
|  | # OBJ-NEXT:      CodeSize: 0x1E | 
|  | # OBJ-NEXT:      LocalSize: 0x0 | 
|  | # OBJ-NEXT:      ParamsSize: 0x4 | 
|  | # OBJ-NEXT:      MaxStackSize: 0x0 | 
|  | # OBJ-NEXT:      FrameFunc: $T0 $ebp 4 + = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 4 - ^ = $ebx $T0 8 - ^ = $edi $T0 12 - ^ = | 
|  | # OBJ-NEXT:      PrologSize: 0x4 | 
|  | # OBJ-NEXT:      SavedRegsSize: 0xC | 
|  | # OBJ-NEXT:      Flags [ (0x0) | 
|  | # OBJ-NEXT:      ] | 
|  | # OBJ-NEXT:    } | 
|  | # OBJ-NEXT:    FrameData { | 
|  | # OBJ-NEXT:      RvaStart: 0x6 | 
|  | # OBJ-NEXT:      CodeSize: 0x1D | 
|  | # OBJ-NEXT:      LocalSize: 0x0 | 
|  | # OBJ-NEXT:      ParamsSize: 0x4 | 
|  | # OBJ-NEXT:      MaxStackSize: 0x0 | 
|  | # OBJ-NEXT:      FrameFunc: $T0 $ebp 4 + = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 4 - ^ = $ebx $T0 8 - ^ = $edi $T0 12 - ^ = $esi $T0 16 - ^ = | 
|  | # OBJ-NEXT:      PrologSize: 0x3 | 
|  | # OBJ-NEXT:      SavedRegsSize: 0x10 | 
|  | # OBJ-NEXT:      Flags [ (0x0) | 
|  | # OBJ-NEXT:      ] | 
|  | # OBJ-NEXT:    } | 
|  | # OBJ-NOT: FrameData |