mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-15 20:29:48 +00:00
69114ee016
Win64 has specific contraints on what valid prologues and epilogues look like. This constraint is born from the flexibility and descriptiveness of Win64's unwind opcodes. Prologues previously emitted by LLVM could not be represented by the unwind opcodes, preventing operations powered by stack unwinding to successfully work. Differential Revision: http://reviews.llvm.org/D7520 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@228641 91177308-0d34-0410-b5e6-96231b3b80d8
122 lines
3.5 KiB
LLVM
122 lines
3.5 KiB
LLVM
; RUN: llc < %s -mtriple=x86_64-pc-win32 | FileCheck %s
|
|
|
|
define i32 @f1(i32 %p1, i32 %p2, i32 %p3, i32 %p4, i32 %p5) "no-frame-pointer-elim"="true" {
|
|
; CHECK-LABEL: f1:
|
|
; CHECK: movl 48(%rbp), %eax
|
|
ret i32 %p5
|
|
}
|
|
|
|
define void @f2(i32 %p, ...) "no-frame-pointer-elim"="true" {
|
|
; CHECK-LABEL: f2:
|
|
; CHECK: .seh_stackalloc 8
|
|
; CHECK: leaq 16(%rsp), %rbp
|
|
; CHECK: .seh_setframe 5, 16
|
|
; CHECK: movq %rdx, 16(%rbp)
|
|
; CHECK: leaq 16(%rbp), %rax
|
|
%ap = alloca i8, align 8
|
|
call void @llvm.va_start(i8* %ap)
|
|
ret void
|
|
}
|
|
|
|
define i8* @f3() "no-frame-pointer-elim"="true" {
|
|
; CHECK-LABEL: f3:
|
|
; CHECK: leaq (%rsp), %rbp
|
|
; CHECK: .seh_setframe 5, 0
|
|
; CHECK: movq 8(%rbp), %rax
|
|
%ra = call i8* @llvm.returnaddress(i32 0)
|
|
ret i8* %ra
|
|
}
|
|
|
|
define i8* @f4() "no-frame-pointer-elim"="true" {
|
|
; CHECK-LABEL: f4:
|
|
; CHECK: pushq %rbp
|
|
; CHECK: .seh_pushreg 5
|
|
; CHECK: subq $304, %rsp
|
|
; CHECK: .seh_stackalloc 304
|
|
; CHECK: leaq 128(%rsp), %rbp
|
|
; CHECK: .seh_setframe 5, 128
|
|
; CHECK: .seh_endprologue
|
|
; CHECK: movq 184(%rbp), %rax
|
|
alloca [300 x i8]
|
|
%ra = call i8* @llvm.returnaddress(i32 0)
|
|
ret i8* %ra
|
|
}
|
|
|
|
declare void @external(i8*)
|
|
|
|
define void @f5() "no-frame-pointer-elim"="true" {
|
|
; CHECK-LABEL: f5:
|
|
; CHECK: subq $336, %rsp
|
|
; CHECK: .seh_stackalloc 336
|
|
; CHECK: leaq 128(%rsp), %rbp
|
|
; CHECK: .seh_setframe 5, 128
|
|
; CHECK: leaq -92(%rbp), %rcx
|
|
; CHECK: callq external
|
|
%a = alloca [300 x i8]
|
|
%gep = getelementptr [300 x i8]* %a, i32 0, i32 0
|
|
call void @external(i8* %gep)
|
|
ret void
|
|
}
|
|
|
|
define void @f6(i32 %p, ...) "no-frame-pointer-elim"="true" {
|
|
; CHECK-LABEL: f6:
|
|
; CHECK: subq $336, %rsp
|
|
; CHECK: .seh_stackalloc 336
|
|
; CHECK: leaq 128(%rsp), %rbp
|
|
; CHECK: .seh_setframe 5, 128
|
|
; CHECK: leaq -92(%rbp), %rcx
|
|
; CHECK: callq external
|
|
%a = alloca [300 x i8]
|
|
%gep = getelementptr [300 x i8]* %a, i32 0, i32 0
|
|
call void @external(i8* %gep)
|
|
ret void
|
|
}
|
|
|
|
define i32 @f7(i32 %a, i32 %b, i32 %c, i32 %d, i32 %e) "no-frame-pointer-elim"="true" {
|
|
; CHECK-LABEL: f7:
|
|
; CHECK: pushq %rbp
|
|
; CHECK: .seh_pushreg 5
|
|
; CHECK: subq $320, %rsp
|
|
; CHECK: .seh_stackalloc 320
|
|
; CHECK: leaq 128(%rsp), %rbp
|
|
; CHECK: .seh_setframe 5, 128
|
|
; CHECK: movl 240(%rbp), %eax
|
|
; CHECK: leaq 192(%rbp), %rsp
|
|
alloca [300 x i8], align 64
|
|
ret i32 %e
|
|
}
|
|
|
|
define i32 @f8(i32 %a, i32 %b, i32 %c, i32 %d, i32 %e) "no-frame-pointer-elim"="true" {
|
|
; CHECK-LABEL: f8:
|
|
; CHECK: subq $384, %rsp
|
|
; CHECK: .seh_stackalloc 384
|
|
; CHECK: leaq 128(%rsp), %rbp
|
|
; CHECK: .seh_setframe 5, 128
|
|
|
|
%alloca = alloca [300 x i8], align 64
|
|
; CHECK: andq $-64, %rsp
|
|
; CHECK: movq %rsp, %rbx
|
|
|
|
alloca i32, i32 %a
|
|
; CHECK: movl %ecx, %eax
|
|
; CHECK: leaq 15(,%rax,4), %rax
|
|
; CHECK: andq $-16, %rax
|
|
; CHECK: callq __chkstk
|
|
; CHECK: subq %rax, %rsp
|
|
|
|
%gep = getelementptr [300 x i8]* %alloca, i32 0, i32 0
|
|
call void @external(i8* %gep)
|
|
; CHECK: subq $32, %rsp
|
|
; CHECK: leaq (%rbx), %rcx
|
|
; CHECK: callq external
|
|
; CHECK: addq $32, %rsp
|
|
|
|
ret i32 %e
|
|
; CHECK: movl %esi, %eax
|
|
; CHECK: leaq 256(%rbp), %rsp
|
|
}
|
|
|
|
declare i8* @llvm.returnaddress(i32) nounwind readnone
|
|
|
|
declare void @llvm.va_start(i8*) nounwind
|