# RUN: llvm-mc -triple=i686-windows-msvc -filetype=obj < %s | llvm-readobj --codeview - | FileCheck %s # Test for .cv_fpo_stackalign. We should generate FPO data that restores CSRs # at each instruction, and in the last FrameData we should use the '@' # alignment operator to define $T0, the vframe value. # Based on this C code: # void usevals(int, int, double*); # int realign_with_csrs() { # int a = getval(); # int b = getval(); # double __declspec(align(8)) force_alignment = 0.42; # usevals(a, b, &force_alignment); # return a + b; # } # CHECK: Subsection [ # CHECK: SubSectionType: Symbols (0xF1) # CHECK: Compile3Sym { # CHECK: Kind: S_COMPILE3 (0x113C) # CHECK: } # CHECK: ] # CHECK: Subsection [ # CHECK: SubSectionType: FrameData (0xF5) # CHECK: FrameData { # CHECK: FrameFunc [ # CHECK: $T0 .raSearch = # CHECK: $eip $T0 ^ = # CHECK: $esp $T0 4 + = # CHECK: ] # CHECK: } # CHECK: FrameData { # CHECK: FrameFunc [ # CHECK: $T0 .raSearch = # CHECK: $eip $T0 ^ = # CHECK: $esp $T0 4 + = # CHECK: $ebp $T0 4 - ^ = # CHECK: ] # CHECK: } # CHECK: FrameData { # CHECK: FrameFunc [ # CHECK: $T0 $ebp 4 + = # CHECK: $eip $T0 ^ = # CHECK: $esp $T0 4 + = # CHECK: $ebp $T0 4 - ^ = # CHECK: ] # CHECK: } # CHECK: FrameData { # CHECK: FrameFunc [ # CHECK: $T0 $ebp 4 + = # CHECK: $eip $T0 ^ = # CHECK: $esp $T0 4 + = # CHECK: $ebp $T0 4 - ^ = # CHECK: $edi $T0 8 - ^ = # CHECK: ] # CHECK: } # CHECK: FrameData { # CHECK: FrameFunc [ # CHECK: $T0 $ebp 4 + = # CHECK: $eip $T0 ^ = # CHECK: $esp $T0 4 + = # CHECK: $ebp $T0 4 - ^ = # CHECK: $edi $T0 8 - ^ = # CHECK: $esi $T0 12 - ^ = # CHECK: ] # CHECK: } # CHECK: FrameData { # CHECK: FrameFunc [ # CHECK: $T1 $ebp 4 + = # CHECK: $T0 $T1 12 - 8 @ = # CHECK: $eip $T1 ^ = # CHECK: $esp $T1 4 + = # CHECK: $ebp $T1 4 - ^ = # CHECK: $edi $T1 8 - ^ = # CHECK: $esi $T1 12 - ^ = # CHECK: ] # CHECK: } # CHECK: ] # CHECK: Subsection [ # CHECK: SubSectionType: Symbols (0xF1) # CHECK: ] # CHECK: Subsection [ # CHECK: SubSectionType: FileChecksums (0xF4) # CHECK: ] # CHECK: Subsection [ # CHECK: SubSectionType: StringTable (0xF3) # CHECK: ] .text .def _realign_with_csrs; .scl 2; .type 32; .endef .globl _realign_with_csrs # -- Begin function realign_with_csrs _realign_with_csrs: # @realign_with_csrs Lfunc_begin0: .cv_func_id 0 .cv_file 1 "C:\\src\\llvm-project\\build\\t.c" "2A4F9B6BBBF7845521201755D1B14ACC" 1 .cv_loc 0 1 4 0 # t.c:4:0 .cv_fpo_proc _realign_with_csrs 0 # %bb.0: # %entry pushl %ebp .cv_fpo_pushreg %ebp movl %esp, %ebp .cv_fpo_setframe %ebp Ltmp0: pushl %edi .cv_fpo_pushreg %edi pushl %esi .cv_fpo_pushreg %esi andl $-8, %esp .cv_fpo_stackalign 8 subl $8, %esp .cv_fpo_stackalloc 8 .cv_fpo_endprologue .cv_loc 0 1 5 0 # t.c:5:0 calll _getval movl %eax, %esi .cv_loc 0 1 6 0 # t.c:6:0 calll _getval movl %eax, %edi movl %esp, %eax .cv_loc 0 1 7 0 # t.c:7:0 movl $1071309127, 4(%esp) # imm = 0x3FDAE147 movl $-1374389535, (%esp) # imm = 0xAE147AE1 .cv_loc 0 1 8 0 # t.c:8:0 pushl %eax pushl %edi pushl %esi calll _usevals addl $12, %esp .cv_loc 0 1 9 0 # t.c:9:0 addl %esi, %edi movl %edi, %eax leal -8(%ebp), %esp popl %esi popl %edi popl %ebp retl Ltmp1: .cv_fpo_endproc Lfunc_end0: # -- End function .section .debug$S,"dr" .p2align 2 .long 4 # Debug section magic .long 241 .long Ltmp3-Ltmp2 # Subsection size Ltmp2: .short Ltmp5-Ltmp4 # Record length Ltmp4: .short 4412 # Record kind: S_COMPILE3 .long 0 # Flags and language .short 7 # CPUType .short 8 # Frontend version .short 0 .short 0 .short 0 .short 8000 # Backend version .short 0 .short 0 .short 0 .asciz "clang version 8.0.0 " # Null-terminated compiler version string Ltmp5: Ltmp3: .p2align 2 .cv_fpo_data _realign_with_csrs .long 241 # Symbol subsection for realign_with_csrs .long Ltmp7-Ltmp6 # Subsection size Ltmp6: .short Ltmp9-Ltmp8 # Record length Ltmp8: .short 4423 # Record kind: S_GPROC32_ID .long 0 # PtrParent .long 0 # PtrEnd .long 0 # PtrNext .long Lfunc_end0-_realign_with_csrs # Code size .long 0 # Offset after prologue .long 0 # Offset before epilogue .long 0 # Function type index .secrel32 _realign_with_csrs # Function section relative address .secidx _realign_with_csrs # Function section index .byte 0 # Flags .asciz "realign_with_csrs" # Function name Ltmp9: .short Ltmp11-Ltmp10 # Record length Ltmp10: .short 4114 # Record kind: S_FRAMEPROC .long 12 # FrameSize .long 0 # Padding .long 0 # Offset of padding .long 8 # Bytes of callee saved registers .long 0 # Exception handler offset .short 0 # Exception handler section .long 1196032 # Flags (defines frame register) Ltmp11: .short 2 # Record length .short 4431 # Record kind: S_PROC_ID_END Ltmp7: .p2align 2 .cv_filechecksums # File index to string table offset subsection .cv_stringtable # String table