mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-09-27 15:57:13 +00:00
Properly lower DYNAMIC_STACKALLOC - bracket all black magic with
CALLSEQ_BEGIN & CALLSEQ_END. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@52225 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
797d95188d
commit
096b461b2e
@ -4803,17 +4803,19 @@ X86TargetLowering::LowerDYNAMIC_STACKALLOC(SDOperand Op,
|
|||||||
SelectionDAG &DAG) {
|
SelectionDAG &DAG) {
|
||||||
assert(Subtarget->isTargetCygMing() &&
|
assert(Subtarget->isTargetCygMing() &&
|
||||||
"This should be used only on Cygwin/Mingw targets");
|
"This should be used only on Cygwin/Mingw targets");
|
||||||
|
|
||||||
// Get the inputs.
|
// Get the inputs.
|
||||||
SDOperand Chain = Op.getOperand(0);
|
SDOperand Chain = Op.getOperand(0);
|
||||||
SDOperand Size = Op.getOperand(1);
|
SDOperand Size = Op.getOperand(1);
|
||||||
// FIXME: Ensure alignment here
|
// FIXME: Ensure alignment here
|
||||||
|
|
||||||
SDOperand Flag;
|
SDOperand Flag;
|
||||||
|
|
||||||
MVT IntPtr = getPointerTy();
|
MVT IntPtr = getPointerTy();
|
||||||
MVT SPTy = Subtarget->is64Bit() ? MVT::i64 : MVT::i32;
|
MVT SPTy = Subtarget->is64Bit() ? MVT::i64 : MVT::i32;
|
||||||
|
|
||||||
|
Chain = DAG.getCALLSEQ_START(Chain, DAG.getIntPtrConstant(0));
|
||||||
|
|
||||||
Chain = DAG.getCopyToReg(Chain, X86::EAX, Size, Flag);
|
Chain = DAG.getCopyToReg(Chain, X86::EAX, Size, Flag);
|
||||||
Flag = Chain.getValue(1);
|
Flag = Chain.getValue(1);
|
||||||
|
|
||||||
@ -4821,12 +4823,18 @@ X86TargetLowering::LowerDYNAMIC_STACKALLOC(SDOperand Op,
|
|||||||
SDOperand Ops[] = { Chain,
|
SDOperand Ops[] = { Chain,
|
||||||
DAG.getTargetExternalSymbol("_alloca", IntPtr),
|
DAG.getTargetExternalSymbol("_alloca", IntPtr),
|
||||||
DAG.getRegister(X86::EAX, IntPtr),
|
DAG.getRegister(X86::EAX, IntPtr),
|
||||||
|
DAG.getRegister(X86StackPtr, SPTy),
|
||||||
Flag };
|
Flag };
|
||||||
Chain = DAG.getNode(X86ISD::CALL, NodeTys, Ops, 4);
|
Chain = DAG.getNode(X86ISD::CALL, NodeTys, Ops, 5);
|
||||||
Flag = Chain.getValue(1);
|
Flag = Chain.getValue(1);
|
||||||
|
|
||||||
|
Chain = DAG.getCALLSEQ_END(Chain,
|
||||||
|
DAG.getIntPtrConstant(0),
|
||||||
|
DAG.getIntPtrConstant(0),
|
||||||
|
Flag);
|
||||||
|
|
||||||
Chain = DAG.getCopyFromReg(Chain, X86StackPtr, SPTy).getValue(1);
|
Chain = DAG.getCopyFromReg(Chain, X86StackPtr, SPTy).getValue(1);
|
||||||
|
|
||||||
std::vector<MVT> Tys;
|
std::vector<MVT> Tys;
|
||||||
Tys.push_back(SPTy);
|
Tys.push_back(SPTy);
|
||||||
Tys.push_back(MVT::Other);
|
Tys.push_back(MVT::Other);
|
||||||
|
Loading…
Reference in New Issue
Block a user