From ec37b00b17fba355ac6d4a1bee918d3004c54584 Mon Sep 17 00:00:00 2001 From: Cameron Esfahani Date: Fri, 8 Oct 2010 19:24:18 +0000 Subject: [PATCH] Recommit 116056, now with the missing file... git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@116083 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/X86/X86ISelLowering.cpp | 6 +++++- lib/Target/X86/X86TargetMachine.cpp | 3 ++- test/CodeGen/X86/win64_params.ll | 11 +++++++++++ 3 files changed, 18 insertions(+), 2 deletions(-) create mode 100644 test/CodeGen/X86/win64_params.ll diff --git a/lib/Target/X86/X86ISelLowering.cpp b/lib/Target/X86/X86ISelLowering.cpp index 66f9612e027..27226d885d7 100644 --- a/lib/Target/X86/X86ISelLowering.cpp +++ b/lib/Target/X86/X86ISelLowering.cpp @@ -1701,8 +1701,12 @@ X86TargetLowering::LowerFormalArguments(SDValue Chain, TotalNumXMMRegs = 0; if (IsWin64) { + const TargetFrameInfo &TFI = *getTargetMachine().getFrameInfo(); + // Get to the caller-allocated home save location. Add 8 to account + // for the return address. + int HomeOffset = TFI.getOffsetOfLocalArea() + 8; FuncInfo->setRegSaveFrameIndex( - MFI->CreateFixedObject(1, NumIntRegs * 8, false)); + MFI->CreateFixedObject(1, NumIntRegs * 8 + HomeOffset, false)); FuncInfo->setVarArgsFrameIndex(FuncInfo->getRegSaveFrameIndex()); } else { // For X86-64, if there are vararg parameters that are passed via diff --git a/lib/Target/X86/X86TargetMachine.cpp b/lib/Target/X86/X86TargetMachine.cpp index ad2980e558b..4e435eecb1e 100644 --- a/lib/Target/X86/X86TargetMachine.cpp +++ b/lib/Target/X86/X86TargetMachine.cpp @@ -121,7 +121,8 @@ X86TargetMachine::X86TargetMachine(const Target &T, const std::string &TT, Subtarget(TT, FS, is64Bit), FrameInfo(TargetFrameInfo::StackGrowsDown, Subtarget.getStackAlignment(), - Subtarget.is64Bit() ? -8 : -4), + (Subtarget.isTargetWin64() ? -40 : + (Subtarget.is64Bit() ? -8 : -4))), ELFWriterInfo(is64Bit, true) { DefRelocModel = getRelocationModel(); diff --git a/test/CodeGen/X86/win64_params.ll b/test/CodeGen/X86/win64_params.ll new file mode 100644 index 00000000000..0b67368e04f --- /dev/null +++ b/test/CodeGen/X86/win64_params.ll @@ -0,0 +1,11 @@ +; RUN: llc < %s -mtriple=x86_64-pc-win32 | FileCheck %s + +; Verify that the 5th and 6th parameters are coming from the correct location +; on the stack. +define i32 @f6(i32 %p1, i32 %p2, i32 %p3, i32 %p4, i32 %p5, i32 %p6) nounwind readnone optsize { +entry: +; CHECK: movl 80(%rsp), %eax +; CHECK: addl 72(%rsp), %eax + %add = add nsw i32 %p6, %p5 + ret i32 %add +} -- 2.34.1