106d02d03SReid Kleckner# RUN: llvm-mc -triple=i686-windows-msvc %s -filetype=obj -o %t.obj 2*e29e30b1SFangrui Song# RUN: llvm-readobj --codeview %t.obj | FileCheck %s 306d02d03SReid Kleckner 406d02d03SReid Kleckner# The .cv_string directive mainly exists as a convenience for manually writing 506d02d03SReid Kleckner# FPO data in assembler. Test that we can write FPO data using this directive, 606d02d03SReid Kleckner# and that the string comes out in the dumper. 706d02d03SReid Kleckner 806d02d03SReid Kleckner# void g(int); 906d02d03SReid Kleckner# void f(int x) { 1006d02d03SReid Kleckner# g(x+1); 1106d02d03SReid Kleckner# } 1206d02d03SReid Kleckner 1306d02d03SReid Kleckner# CHECK: FrameFunc [ 1406d02d03SReid Kleckner# CHECK-NEXT: abc = 1506d02d03SReid Kleckner# CHECK-NEXT: def = 1606d02d03SReid Kleckner# CHECK-NEXT: ghi = 1706d02d03SReid Kleckner# CHECK-NEXT: ] 1806d02d03SReid Kleckner 1906d02d03SReid Kleckner .text 2006d02d03SReid Kleckner .def @feat.00; 2106d02d03SReid Kleckner .scl 3; 2206d02d03SReid Kleckner .type 0; 2306d02d03SReid Kleckner .endef 2406d02d03SReid Kleckner .globl @feat.00 2506d02d03SReid Kleckner.set @feat.00, 1 2606d02d03SReid Kleckner .def _f; 2706d02d03SReid Kleckner .scl 2; 2806d02d03SReid Kleckner .type 32; 2906d02d03SReid Kleckner .endef 3006d02d03SReid Kleckner .globl _f # -- Begin function f 3106d02d03SReid Kleckner .p2align 4, 0x90 3206d02d03SReid Kleckner_f: # @f 3306d02d03SReid KlecknerLfunc_begin0: 3406d02d03SReid Kleckner# %bb.0: # %entry 3506d02d03SReid Kleckner pushl %ebp 3606d02d03SReid Kleckner movl %esp, %ebp 3706d02d03SReid Kleckner subl $8, %esp 3806d02d03SReid Kleckner movl 8(%ebp), %eax 3906d02d03SReid Kleckner movl 8(%ebp), %ecx 4006d02d03SReid Kleckner addl $1, %ecx 4106d02d03SReid Kleckner movl %ecx, (%esp) 4206d02d03SReid Kleckner movl %eax, -4(%ebp) # 4-byte Spill 4306d02d03SReid Kleckner calll _g 4406d02d03SReid Kleckner addl $8, %esp 4506d02d03SReid Kleckner popl %ebp 4606d02d03SReid Kleckner retl 4706d02d03SReid KlecknerLfunc_end0: 4806d02d03SReid Kleckner # -- End function 4906d02d03SReid Kleckner .section .debug$S,"dr" 5006d02d03SReid Kleckner .p2align 2 5106d02d03SReid Kleckner .long 4 # Debug section magic 5206d02d03SReid Kleckner 5306d02d03SReid Kleckner # Open coded frame data 5406d02d03SReid Kleckner .long 245 5506d02d03SReid Kleckner .long Lfoo_fpo_end-Lfoo_fpo_begin # Subsection size 5606d02d03SReid KlecknerLfoo_fpo_begin: 5706d02d03SReid Kleckner .long _f 5806d02d03SReid Kleckner .long 0 5906d02d03SReid Kleckner .long Lfunc_end0-Lfunc_begin0 6006d02d03SReid Kleckner .long 24 # LocalSize 6106d02d03SReid Kleckner .long 0 # ParamSize 6206d02d03SReid Kleckner .long 0 # MaxStackSize 6306d02d03SReid Kleckner .cv_string "abc = def = ghi = " 6406d02d03SReid Kleckner .short 0 # PrologSize 6506d02d03SReid Kleckner .short 0 # SavedRegSize 6606d02d03SReid Kleckner .long 0x4 # Flags 6706d02d03SReid KlecknerLfoo_fpo_end: 6806d02d03SReid Kleckner .p2align 2 6906d02d03SReid Kleckner .cv_stringtable # String table 70