mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-05-02 04:39:35 +00:00
Proper flag __alloca call
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@37923 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
50b153335d
commit
4304bcc1ed
@ -3602,8 +3602,9 @@ SDOperand X86TargetLowering::LowerCALL(SDOperand Op, SelectionDAG &DAG) {
|
|||||||
// bytes in one go. Touching the stack at 4K increments is necessary to ensure
|
// 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
|
// that the guard pages used by the OS virtual memory manager are allocated in
|
||||||
// correct sequence.
|
// correct sequence.
|
||||||
SDOperand X86TargetLowering::LowerDYNAMIC_STACKALLOC(SDOperand Op,
|
SDOperand
|
||||||
SelectionDAG &DAG) {
|
X86TargetLowering::LowerDYNAMIC_STACKALLOC(SDOperand Op,
|
||||||
|
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");
|
||||||
|
|
||||||
@ -3612,27 +3613,29 @@ SDOperand X86TargetLowering::LowerDYNAMIC_STACKALLOC(SDOperand Op,
|
|||||||
SDOperand Size = Op.getOperand(1);
|
SDOperand Size = Op.getOperand(1);
|
||||||
// FIXME: Ensure alignment here
|
// FIXME: Ensure alignment here
|
||||||
|
|
||||||
TargetLowering::ArgListTy Args;
|
SDOperand Flag;
|
||||||
TargetLowering::ArgListEntry Entry;
|
|
||||||
MVT::ValueType IntPtr = getPointerTy();
|
MVT::ValueType IntPtr = getPointerTy();
|
||||||
MVT::ValueType SPTy = (Subtarget->is64Bit() ? MVT::i64 : MVT::i32);
|
MVT::ValueType SPTy = (Subtarget->is64Bit() ? MVT::i64 : MVT::i32);
|
||||||
const Type *IntPtrTy = getTargetData()->getIntPtrType();
|
|
||||||
|
|
||||||
Entry.Node = Size;
|
|
||||||
Entry.Ty = IntPtrTy;
|
|
||||||
Entry.isInReg = true; // Should pass in EAX
|
|
||||||
Args.push_back(Entry);
|
|
||||||
std::pair<SDOperand, SDOperand> CallResult =
|
|
||||||
LowerCallTo(Chain, IntPtrTy, false, false, CallingConv::C, false,
|
|
||||||
DAG.getExternalSymbol("_alloca", IntPtr), Args, DAG);
|
|
||||||
|
|
||||||
SDOperand SP = DAG.getCopyFromReg(CallResult.second, X86StackPtr, SPTy);
|
Chain = DAG.getCopyToReg(Chain, X86::EAX, Size, Flag);
|
||||||
|
Flag = Chain.getValue(1);
|
||||||
|
|
||||||
|
SDVTList NodeTys = DAG.getVTList(MVT::Other, MVT::Flag);
|
||||||
|
SDOperand Ops[] = { Chain,
|
||||||
|
DAG.getTargetExternalSymbol("_alloca", IntPtr),
|
||||||
|
DAG.getRegister(X86::EAX, IntPtr),
|
||||||
|
Flag };
|
||||||
|
Chain = DAG.getNode(X86ISD::CALL, NodeTys, Ops, 4);
|
||||||
|
Flag = Chain.getValue(1);
|
||||||
|
|
||||||
|
Chain = DAG.getCopyFromReg(Chain, X86StackPtr, SPTy).getValue(1);
|
||||||
|
|
||||||
std::vector<MVT::ValueType> Tys;
|
std::vector<MVT::ValueType> Tys;
|
||||||
Tys.push_back(SPTy);
|
Tys.push_back(SPTy);
|
||||||
Tys.push_back(MVT::Other);
|
Tys.push_back(MVT::Other);
|
||||||
SDOperand Ops[2] = { SP, CallResult.second };
|
SDOperand Ops1[2] = { Chain.getValue(0), Chain };
|
||||||
return DAG.getNode(ISD::MERGE_VALUES, Tys, Ops, 2);
|
return DAG.getNode(ISD::MERGE_VALUES, Tys, Ops1, 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
SDOperand
|
SDOperand
|
||||||
|
Loading…
x
Reference in New Issue
Block a user