@@ -748,17 +748,7 @@ void X86FrameLowering::emitStackProbeCall(MachineFunction &MF,
748
748
else
749
749
CallOp = X86::CALLpcrel32;
750
750
751
- const char *Symbol;
752
- if (Is64Bit) {
753
- if (STI.isTargetCygMing ()) {
754
- Symbol = " ___chkstk_ms" ;
755
- } else {
756
- Symbol = " __chkstk" ;
757
- }
758
- } else if (STI.isTargetCygMing ())
759
- Symbol = " _alloca" ;
760
- else
761
- Symbol = " _chkstk" ;
751
+ StringRef Symbol = STI.getTargetLowering ()->getStackProbeSymbolName (MF);
762
752
763
753
MachineInstrBuilder CI;
764
754
MachineBasicBlock::iterator ExpansionMBBI = std::prev (MBBI);
@@ -769,10 +759,11 @@ void X86FrameLowering::emitStackProbeCall(MachineFunction &MF,
769
759
// For the large code model, we have to call through a register. Use R11,
770
760
// as it is scratch in all supported calling conventions.
771
761
BuildMI (MBB, MBBI, DL, TII.get (X86::MOV64ri), X86::R11)
772
- .addExternalSymbol (Symbol);
762
+ .addExternalSymbol (MF. createExternalSymbolName ( Symbol) );
773
763
CI = BuildMI (MBB, MBBI, DL, TII.get (CallOp)).addReg (X86::R11);
774
764
} else {
775
- CI = BuildMI (MBB, MBBI, DL, TII.get (CallOp)).addExternalSymbol (Symbol);
765
+ CI = BuildMI (MBB, MBBI, DL, TII.get (CallOp))
766
+ .addExternalSymbol (MF.createExternalSymbolName (Symbol));
776
767
}
777
768
778
769
unsigned AX = Is64Bit ? X86::RAX : X86::EAX;
@@ -783,13 +774,13 @@ void X86FrameLowering::emitStackProbeCall(MachineFunction &MF,
783
774
.addReg (SP, RegState::Define | RegState::Implicit)
784
775
.addReg (X86::EFLAGS, RegState::Define | RegState::Implicit);
785
776
786
- if (Is64Bit ) {
777
+ if (!STI. isTargetWin32 () ) {
787
778
// MSVC x64's __chkstk and cygwin/mingw's ___chkstk_ms do not adjust %rsp
788
779
// themselves. It also does not clobber %rax so we can reuse it when
789
780
// adjusting %rsp.
790
- BuildMI (MBB, MBBI, DL, TII.get (X86::SUB64rr), X86::RSP )
791
- .addReg (X86::RSP )
792
- .addReg (X86::RAX );
781
+ BuildMI (MBB, MBBI, DL, TII.get (getSUBrrOpcode (Is64Bit)), SP )
782
+ .addReg (SP )
783
+ .addReg (AX );
793
784
}
794
785
795
786
if (InProlog) {
@@ -978,7 +969,8 @@ void X86FrameLowering::emitPrologue(MachineFunction &MF,
978
969
X86FI->setCalleeSavedFrameSize (
979
970
X86FI->getCalleeSavedFrameSize () - TailCallReturnAddrDelta);
980
971
981
- bool UseStackProbe = (STI.isOSWindows () && !STI.isTargetMachO ());
972
+ bool UseRedZone = false ;
973
+ bool UseStackProbe = !STI.getTargetLowering ()->getStackProbeSymbolName (MF).empty ();
982
974
983
975
// The default stack probe size is 4096 if the function has no stackprobesize
984
976
// attribute.
@@ -1007,6 +999,7 @@ void X86FrameLowering::emitPrologue(MachineFunction &MF,
1007
999
!TRI->needsStackRealignment (MF) &&
1008
1000
!MFI.hasVarSizedObjects () && // No dynamic alloca.
1009
1001
!MFI.adjustsStack () && // No calls.
1002
+ !UseStackProbe && // No stack probes.
1010
1003
!IsWin64CC && // Win64 has no Red Zone
1011
1004
!MFI.hasCopyImplyingStackAdjustment () && // Don't push and pop.
1012
1005
!MF.shouldSplitStack ()) { // Regular stack
@@ -1015,6 +1008,7 @@ void X86FrameLowering::emitPrologue(MachineFunction &MF,
1015
1008
X86FI->setUsesRedZone (MinSize > 0 || StackSize > 0 );
1016
1009
StackSize = std::max (MinSize, StackSize > 128 ? StackSize - 128 : 0 );
1017
1010
MFI.setStackSize (StackSize);
1011
+ UseRedZone = true ;
1018
1012
}
1019
1013
1020
1014
// Insert stack pointer adjustment for later moving of return addr. Only
@@ -1192,6 +1186,8 @@ void X86FrameLowering::emitPrologue(MachineFunction &MF,
1192
1186
if (IsWin64Prologue && !IsFunclet && TRI->needsStackRealignment (MF))
1193
1187
AlignedNumBytes = alignTo (AlignedNumBytes, MaxAlign);
1194
1188
if (AlignedNumBytes >= StackProbeSize && UseStackProbe) {
1189
+ assert (!UseRedZone && " The Red Zone is not accounted for in stack probes" );
1190
+
1195
1191
// Check whether EAX is livein for this block.
1196
1192
bool isEAXAlive = isEAXLiveIn (MBB);
1197
1193
0 commit comments