[llvm] r227503 - Update comments to use unreachable instead of llvm.trap, as implemented now

Reid Kleckner reid at kleckner.net
Thu Jan 29 14:33:00 PST 2015


Author: rnk
Date: Thu Jan 29 16:33:00 2015
New Revision: 227503

URL: http://llvm.org/viewvc/llvm-project?rev=227503&view=rev
Log:
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

Modified:
    llvm/trunk/lib/Target/X86/X86FrameLowering.cpp
    llvm/trunk/lib/Target/X86/X86FrameLowering.h
    llvm/trunk/lib/Target/X86/X86InstrControl.td
    llvm/trunk/test/CodeGen/X86/win_chkstk.ll

Modified: llvm/trunk/lib/Target/X86/X86FrameLowering.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86FrameLowering.cpp?rev=227503&r1=227502&r2=227503&view=diff
==============================================================================
--- llvm/trunk/lib/Target/X86/X86FrameLowering.cpp (original)
+++ llvm/trunk/lib/Target/X86/X86FrameLowering.cpp Thu Jan 29 16:33:00 2015
@@ -408,10 +408,16 @@ static bool usesTheStack(const MachineFu
   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()) {
@@ -758,7 +764,7 @@ void X86FrameLowering::emitPrologue(Mach
     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);
@@ -788,12 +794,23 @@ void X86FrameLowering::emitPrologue(Mach
         .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

Modified: llvm/trunk/lib/Target/X86/X86FrameLowering.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86FrameLowering.h?rev=227503&r1=227502&r2=227503&view=diff
==============================================================================
--- llvm/trunk/lib/Target/X86/X86FrameLowering.h (original)
+++ llvm/trunk/lib/Target/X86/X86FrameLowering.h Thu Jan 29 16:33:00 2015
@@ -27,8 +27,8 @@ public:
   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,

Modified: llvm/trunk/lib/Target/X86/X86InstrControl.td
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86InstrControl.td?rev=227503&r1=227502&r2=227503&view=diff
==============================================================================
--- llvm/trunk/lib/Target/X86/X86InstrControl.td (original)
+++ llvm/trunk/lib/Target/X86/X86InstrControl.td Thu Jan 29 16:33:00 2015
@@ -279,7 +279,8 @@ let isCall = 1, Uses = [RSP], SchedRW =
 }
 
 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 {

Modified: llvm/trunk/test/CodeGen/X86/win_chkstk.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/win_chkstk.ll?rev=227503&r1=227502&r2=227503&view=diff
==============================================================================
--- llvm/trunk/test/CodeGen/X86/win_chkstk.ll (original)
+++ llvm/trunk/test/CodeGen/X86/win_chkstk.ll Thu Jan 29 16:33:00 2015
@@ -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
@@ -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
@@ -52,6 +55,8 @@ define x86_64_win64cc i32 @main4k_win64(
 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





More information about the llvm-commits mailing list