| # 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 |