summaryrefslogtreecommitdiffstats
path: root/llvm/test/MC/COFF/cv-fpo-realign.s
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/test/MC/COFF/cv-fpo-realign.s')
-rw-r--r--llvm/test/MC/COFF/cv-fpo-realign.s199
1 files changed, 199 insertions, 0 deletions
diff --git a/llvm/test/MC/COFF/cv-fpo-realign.s b/llvm/test/MC/COFF/cv-fpo-realign.s
new file mode 100644
index 00000000000..247cad9334b
--- /dev/null
+++ b/llvm/test/MC/COFF/cv-fpo-realign.s
@@ -0,0 +1,199 @@
+# 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
OpenPOWER on IntegriCloud