mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-08-25 00:29:20 +00:00
X86: Add alloca probing to dynamic alloca on Windows. Fixes PR8424.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@116984 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
d6865de2d2
commit
e9c253e0bc
@ -424,7 +424,7 @@ X86TargetLowering::X86TargetLowering(X86TargetMachine &TM)
|
||||
setOperationAction(ISD::STACKRESTORE, MVT::Other, Expand);
|
||||
if (Subtarget->is64Bit())
|
||||
setOperationAction(ISD::DYNAMIC_STACKALLOC, MVT::i64, Expand);
|
||||
if (Subtarget->isTargetCygMing())
|
||||
if (Subtarget->isTargetCygMing() || Subtarget->isTargetWindows())
|
||||
setOperationAction(ISD::DYNAMIC_STACKALLOC, MVT::i32, Custom);
|
||||
else
|
||||
setOperationAction(ISD::DYNAMIC_STACKALLOC, MVT::i32, Expand);
|
||||
@ -7483,8 +7483,8 @@ SDValue X86TargetLowering::LowerBRCOND(SDValue Op, SelectionDAG &DAG) const {
|
||||
SDValue
|
||||
X86TargetLowering::LowerDYNAMIC_STACKALLOC(SDValue Op,
|
||||
SelectionDAG &DAG) const {
|
||||
assert(Subtarget->isTargetCygMing() &&
|
||||
"This should be used only on Cygwin/Mingw targets");
|
||||
assert(Subtarget->isTargetCygMing() || Subtarget->isTargetWindows() &&
|
||||
"This should be used only on Windows targets");
|
||||
DebugLoc dl = Op.getDebugLoc();
|
||||
|
||||
// Get the inputs.
|
||||
@ -7501,7 +7501,7 @@ X86TargetLowering::LowerDYNAMIC_STACKALLOC(SDValue Op,
|
||||
|
||||
SDVTList NodeTys = DAG.getVTList(MVT::Other, MVT::Flag);
|
||||
|
||||
Chain = DAG.getNode(X86ISD::MINGW_ALLOCA, dl, NodeTys, Chain, Flag);
|
||||
Chain = DAG.getNode(X86ISD::WIN_ALLOCA, dl, NodeTys, Chain, Flag);
|
||||
Flag = Chain.getValue(1);
|
||||
|
||||
Chain = DAG.getCopyFromReg(Chain, dl, X86StackPtr, SPTy).getValue(1);
|
||||
@ -8911,7 +8911,7 @@ const char *X86TargetLowering::getTargetNodeName(unsigned Opcode) const {
|
||||
case X86ISD::PUNPCKHQDQ: return "X86ISD::PUNPCKHQDQ";
|
||||
case X86ISD::VASTART_SAVE_XMM_REGS: return "X86ISD::VASTART_SAVE_XMM_REGS";
|
||||
case X86ISD::VAARG_64: return "X86ISD::VAARG_64";
|
||||
case X86ISD::MINGW_ALLOCA: return "X86ISD::MINGW_ALLOCA";
|
||||
case X86ISD::WIN_ALLOCA: return "X86ISD::WIN_ALLOCA";
|
||||
}
|
||||
}
|
||||
|
||||
@ -9874,7 +9874,7 @@ X86TargetLowering::EmitLoweredSelect(MachineInstr *MI,
|
||||
}
|
||||
|
||||
MachineBasicBlock *
|
||||
X86TargetLowering::EmitLoweredMingwAlloca(MachineInstr *MI,
|
||||
X86TargetLowering::EmitLoweredWinAlloca(MachineInstr *MI,
|
||||
MachineBasicBlock *BB) const {
|
||||
const TargetInstrInfo *TII = getTargetMachine().getInstrInfo();
|
||||
DebugLoc DL = MI->getDebugLoc();
|
||||
@ -9884,8 +9884,11 @@ X86TargetLowering::EmitLoweredMingwAlloca(MachineInstr *MI,
|
||||
// FIXME: The code should be tweaked as soon as we'll try to do codegen for
|
||||
// mingw-w64.
|
||||
|
||||
const char *StackProbeSymbol =
|
||||
Subtarget->isTargetWindows() ? "_chkstk" : "_alloca";
|
||||
|
||||
BuildMI(*BB, MI, DL, TII->get(X86::CALLpcrel32))
|
||||
.addExternalSymbol("_alloca")
|
||||
.addExternalSymbol(StackProbeSymbol)
|
||||
.addReg(X86::EAX, RegState::Implicit)
|
||||
.addReg(X86::ESP, RegState::Implicit)
|
||||
.addReg(X86::EAX, RegState::Define | RegState::Implicit)
|
||||
@ -9952,8 +9955,8 @@ X86TargetLowering::EmitInstrWithCustomInserter(MachineInstr *MI,
|
||||
MachineBasicBlock *BB) const {
|
||||
switch (MI->getOpcode()) {
|
||||
default: assert(false && "Unexpected instr type to insert");
|
||||
case X86::MINGW_ALLOCA:
|
||||
return EmitLoweredMingwAlloca(MI, BB);
|
||||
case X86::WIN_ALLOCA:
|
||||
return EmitLoweredWinAlloca(MI, BB);
|
||||
case X86::TLSCall_32:
|
||||
case X86::TLSCall_64:
|
||||
return EmitLoweredTLSCall(MI, BB);
|
||||
|
@ -253,8 +253,8 @@ namespace llvm {
|
||||
// with control flow.
|
||||
VASTART_SAVE_XMM_REGS,
|
||||
|
||||
// MINGW_ALLOCA - MingW's __alloca call to do stack probing.
|
||||
MINGW_ALLOCA,
|
||||
// WIN_ALLOCA - Windows's _chkstk call to do stack probing.
|
||||
WIN_ALLOCA,
|
||||
|
||||
// ATOMADD64_DAG, ATOMSUB64_DAG, ATOMOR64_DAG, ATOMAND64_DAG,
|
||||
// ATOMXOR64_DAG, ATOMNAND64_DAG, ATOMSWAP64_DAG -
|
||||
@ -870,7 +870,7 @@ namespace llvm {
|
||||
MachineBasicBlock *EmitLoweredSelect(MachineInstr *I,
|
||||
MachineBasicBlock *BB) const;
|
||||
|
||||
MachineBasicBlock *EmitLoweredMingwAlloca(MachineInstr *MI,
|
||||
MachineBasicBlock *EmitLoweredWinAlloca(MachineInstr *MI,
|
||||
MachineBasicBlock *BB) const;
|
||||
|
||||
MachineBasicBlock *EmitLoweredTLSCall(MachineInstr *MI,
|
||||
|
@ -94,18 +94,18 @@ def VAARG_64 : I<0, Pseudo,
|
||||
(X86vaarg64 addr:$ap, imm:$size, imm:$mode, imm:$align)),
|
||||
(implicit EFLAGS)]>;
|
||||
|
||||
// Dynamic stack allocation yields _alloca call for Cygwin/Mingw targets. Calls
|
||||
// to _alloca is needed to probe the stack when allocating more than 4k bytes in
|
||||
// one go. Touching the stack at 4K increments is necessary to ensure that the
|
||||
// guard pages used by the OS virtual memory manager are allocated in correct
|
||||
// sequence.
|
||||
// Dynamic stack allocation yields a _chkstk or _alloca call for all Windows
|
||||
// targets. These calls are needed to probe the stack when allocating more than
|
||||
// 4k bytes in one go. Touching the stack at 4K increments is necessary to
|
||||
// ensure that the guard pages used by the OS virtual memory manager are
|
||||
// allocated in correct sequence.
|
||||
// The main point of having separate instruction are extra unmodelled effects
|
||||
// (compared to ordinary calls) like stack pointer change.
|
||||
|
||||
let Defs = [EAX, ESP, EFLAGS], Uses = [ESP] in
|
||||
def MINGW_ALLOCA : I<0, Pseudo, (outs), (ins),
|
||||
"# dynamic stack allocation",
|
||||
[(X86MingwAlloca)]>;
|
||||
def WIN_ALLOCA : I<0, Pseudo, (outs), (ins),
|
||||
"# dynamic stack allocation",
|
||||
[(X86WinAlloca)]>;
|
||||
}
|
||||
|
||||
|
||||
|
@ -202,9 +202,9 @@ def X86and_flag : SDNode<"X86ISD::AND", SDTBinaryArithWithFlags,
|
||||
|
||||
def X86mul_imm : SDNode<"X86ISD::MUL_IMM", SDTIntBinOp>;
|
||||
|
||||
def X86MingwAlloca : SDNode<"X86ISD::MINGW_ALLOCA", SDTX86Void,
|
||||
[SDNPHasChain, SDNPInFlag, SDNPOutFlag]>;
|
||||
|
||||
def X86WinAlloca : SDNode<"X86ISD::WIN_ALLOCA", SDTX86Void,
|
||||
[SDNPHasChain, SDNPInFlag, SDNPOutFlag]>;
|
||||
|
||||
def X86TLSCall : SDNode<"X86ISD::TLSCALL", SDT_X86TLSCALL,
|
||||
[]>;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user