forked from OSchip/llvm-project
200 lines
5.8 KiB
ArmAsm
200 lines
5.8 KiB
ArmAsm
# 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
|