Skip to content

Commit

Permalink
Merging r227503:
Browse files Browse the repository at this point in the history
------------------------------------------------------------------------
r227503 | reid | 2015-01-29 17:33:00 -0500 (Thu, 29 Jan 2015) | 11 lines

Update comments to use unreachable instead of llvm.trap, as implemented now

win64: Call __chkstk through a register with the large code model

Fixes half of PR18582. True dynamic allocas will still have a
CALL64pcrel32 which will fail.

Reviewers: majnemer

Differential Revision: http://reviews.llvm.org/D7267

------------------------------------------------------------------------

git-svn-id: https://llvm.org/svn/llvm-project/llvm/branches/release_36@236302 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
tstellarAMD committed May 1, 2015
1 parent 928bfce commit d0505d6
Show file tree
Hide file tree
Showing 4 changed files with 35 additions and 12 deletions.
35 changes: 26 additions & 9 deletions lib/Target/X86/X86FrameLowering.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -375,10 +375,16 @@ static bool usesTheStack(const MachineFunction &MF) {
return false;
}

void X86FrameLowering::getStackProbeFunction(const X86Subtarget &STI,
void X86FrameLowering::getStackProbeFunction(const MachineFunction &MF,
const X86Subtarget &STI,
unsigned &CallOp,
const char *&Symbol) {
CallOp = STI.is64Bit() ? X86::W64ALLOCA : X86::CALLpcrel32;
if (STI.is64Bit())
CallOp = MF.getTarget().getCodeModel() == CodeModel::Large
? X86::CALL64r
: X86::W64ALLOCA;
else
CallOp = X86::CALLpcrel32;

if (STI.is64Bit()) {
if (STI.isTargetCygMing()) {
Expand Down Expand Up @@ -725,7 +731,7 @@ void X86FrameLowering::emitPrologue(MachineFunction &MF) const {
const char *StackProbeSymbol;
unsigned CallOp;

getStackProbeFunction(STI, CallOp, StackProbeSymbol);
getStackProbeFunction(MF, STI, CallOp, StackProbeSymbol);

// Check whether EAX is livein for this function.
bool isEAXAlive = isEAXLiveIn(MF);
Expand Down Expand Up @@ -755,12 +761,23 @@ void X86FrameLowering::emitPrologue(MachineFunction &MF) const {
.setMIFlag(MachineInstr::FrameSetup);
}

BuildMI(MBB, MBBI, DL,
TII.get(CallOp))
.addExternalSymbol(StackProbeSymbol)
.addReg(StackPtr, RegState::Define | RegState::Implicit)
.addReg(X86::EFLAGS, RegState::Define | RegState::Implicit)
.setMIFlag(MachineInstr::FrameSetup);
if (Is64Bit && MF.getTarget().getCodeModel() == CodeModel::Large) {
// For the large code model, we have to call through a register. Use R11,
// as it is unused and clobbered by all probe functions.
BuildMI(MBB, MBBI, DL, TII.get(X86::MOV64ri), X86::R11)
.addExternalSymbol(StackProbeSymbol);
BuildMI(MBB, MBBI, DL, TII.get(CallOp))
.addReg(X86::R11)
.addReg(StackPtr, RegState::Define | RegState::Implicit)
.addReg(X86::EFLAGS, RegState::Define | RegState::Implicit)
.setMIFlag(MachineInstr::FrameSetup);
} else {
BuildMI(MBB, MBBI, DL, TII.get(CallOp))
.addExternalSymbol(StackProbeSymbol)
.addReg(StackPtr, RegState::Define | RegState::Implicit)
.addReg(X86::EFLAGS, RegState::Define | RegState::Implicit)
.setMIFlag(MachineInstr::FrameSetup);
}

if (Is64Bit) {
// MSVC x64's __chkstk and cygwin/mingw's ___chkstk_ms do not adjust %rsp
Expand Down
4 changes: 2 additions & 2 deletions lib/Target/X86/X86FrameLowering.h
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,8 @@ class X86FrameLowering : public TargetFrameLowering {
explicit X86FrameLowering(StackDirection D, unsigned StackAl, int LAO)
: TargetFrameLowering(StackGrowsDown, StackAl, LAO) {}

static void getStackProbeFunction(const X86Subtarget &STI,
unsigned &CallOp,
static void getStackProbeFunction(const MachineFunction &MF,
const X86Subtarget &STI, unsigned &CallOp,
const char *&Symbol);

void emitCalleeSavedFrameMoves(MachineBasicBlock &MBB,
Expand Down
3 changes: 2 additions & 1 deletion lib/Target/X86/X86InstrControl.td
Original file line number Diff line number Diff line change
Expand Up @@ -279,7 +279,8 @@ let isCall = 1, Uses = [RSP], SchedRW = [WriteJump] in {
}

let isCall = 1, isCodeGenOnly = 1 in
// __chkstk(MSVC): clobber R10, R11 and EFLAGS.
// __chkstk(MSVC): clobber R10, R11 and EFLAGS
// ___chkstk_ms(Mingw64): clobber R10, R11 and EFLAGS
// ___chkstk(Mingw64): clobber R10, R11, RAX and EFLAGS, and update RSP.
let Defs = [RAX, R10, R11, RSP, EFLAGS],
Uses = [RSP] in {
Expand Down
5 changes: 5 additions & 0 deletions test/CodeGen/X86/win_chkstk.ll
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
; RUN: llc < %s -mtriple=i686-pc-win32 | FileCheck %s -check-prefix=WIN_X32
; RUN: llc < %s -mtriple=x86_64-pc-win32 | FileCheck %s -check-prefix=WIN_X64
; RUN: llc < %s -mtriple=x86_64-pc-win32 -code-model=large | FileCheck %s -check-prefix=WIN64_LARGE
; RUN: llc < %s -mtriple=i686-pc-mingw32 | FileCheck %s -check-prefix=MINGW_X32
; RUN: llc < %s -mtriple=x86_64-pc-mingw32 | FileCheck %s -check-prefix=MINGW_X64
; RUN: llc < %s -mtriple=i386-pc-linux | FileCheck %s -check-prefix=LINUX
Expand All @@ -16,6 +17,8 @@ define i32 @main4k() nounwind {
entry:
; WIN_X32: calll __chkstk
; WIN_X64: callq __chkstk
; WIN64_LARGE: movabsq $__chkstk, %r11
; WIN64_LARGE: callq *%r11
; MINGW_X32: calll __alloca
; MINGW_X64: callq ___chkstk_ms
; LINUX-NOT: call __chkstk
Expand Down Expand Up @@ -52,6 +55,8 @@ define x86_64_win64cc i32 @main4k_win64() nounwind {
entry:
; WIN_X32: calll __chkstk
; WIN_X64: callq __chkstk
; WIN64_LARGE: movabsq $__chkstk, %r11
; WIN64_LARGE: callq *%r11
; MINGW_X32: calll __alloca
; MINGW_X64: callq ___chkstk_ms
; LINUX-NOT: call __chkstk
Expand Down

0 comments on commit d0505d6

Please sign in to comment.