mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-28 19:31:58 +00:00
8a24e83550
Calls with inalloca are lowered by skipping all stores for arguments passed in memory and the initial stack adjustment to allocate argument memory. Now the frontend is responsible for the memory layout, and the backend doesn't have to do any work. As a result these changes are pretty minimal. Reviewers: echristo Differential Revision: http://llvm-reviews.chandlerc.com/D2637 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@200596 91177308-0d34-0410-b5e6-96231b3b80d8
35 lines
819 B
LLVM
35 lines
819 B
LLVM
; RUN: llc < %s -mtriple=i686-pc-win32 | FileCheck %s
|
|
|
|
%Foo = type { i32, i32 }
|
|
|
|
%frame = type { %Foo, i32, %Foo }
|
|
|
|
declare void @f(%frame* inalloca %a)
|
|
|
|
declare void @Foo_ctor(%Foo* %this)
|
|
|
|
define void @g() {
|
|
entry:
|
|
%args = alloca %frame, inalloca
|
|
%c = getelementptr %frame* %args, i32 0, i32 2
|
|
; CHECK: movl $20, %eax
|
|
; CHECK: calll __chkstk
|
|
; CHECK: movl %esp,
|
|
call void @Foo_ctor(%Foo* %c)
|
|
; CHECK: leal 12(%{{.*}}),
|
|
; CHECK: subl $4, %esp
|
|
; CHECK: calll _Foo_ctor
|
|
; CHECK: addl $4, %esp
|
|
%b = getelementptr %frame* %args, i32 0, i32 1
|
|
store i32 42, i32* %b
|
|
; CHECK: movl $42,
|
|
%a = getelementptr %frame* %args, i32 0, i32 0
|
|
call void @Foo_ctor(%Foo* %a)
|
|
; CHECK: subl $4, %esp
|
|
; CHECK: calll _Foo_ctor
|
|
; CHECK: addl $4, %esp
|
|
call void @f(%frame* inalloca %args)
|
|
; CHECK: calll _f
|
|
ret void
|
|
}
|