forked from OSchip/llvm-project
Move per-function state out of TargetLowering subclasses and into
MachineFunctionInfo subclasses. llvm-svn: 101634
This commit is contained in:
parent
95c7c427aa
commit
31ae586c74
|
@ -1574,13 +1574,15 @@ static SDValue LowerMEMBARRIER(SDValue Op, SelectionDAG &DAG,
|
|||
return Res;
|
||||
}
|
||||
|
||||
static SDValue LowerVASTART(SDValue Op, SelectionDAG &DAG,
|
||||
unsigned VarArgsFrameIndex) {
|
||||
static SDValue LowerVASTART(SDValue Op, SelectionDAG &DAG) {
|
||||
MachineFunction &MF = DAG.getMachineFunction();
|
||||
ARMFunctionInfo *FuncInfo = MF.getInfo<ARMFunctionInfo>();
|
||||
|
||||
// vastart just stores the address of the VarArgsFrameIndex slot into the
|
||||
// memory location argument.
|
||||
DebugLoc dl = Op.getDebugLoc();
|
||||
EVT PtrVT = DAG.getTargetLoweringInfo().getPointerTy();
|
||||
SDValue FR = DAG.getFrameIndex(VarArgsFrameIndex, PtrVT);
|
||||
SDValue FR = DAG.getFrameIndex(FuncInfo->getVarArgsFrameIndex(), PtrVT);
|
||||
const Value *SV = cast<SrcValueSDNode>(Op.getOperand(2))->getValue();
|
||||
return DAG.getStore(Op.getOperand(0), dl, FR, Op.getOperand(1), SV, 0,
|
||||
false, false, 0);
|
||||
|
@ -1805,10 +1807,12 @@ ARMTargetLowering::LowerFormalArguments(SDValue Chain,
|
|||
// to their spots on the stack so that they may be loaded by deferencing
|
||||
// the result of va_next.
|
||||
AFI->setVarArgsRegSaveSize(VARegSaveSize);
|
||||
VarArgsFrameIndex = MFI->CreateFixedObject(VARegSaveSize, ArgOffset +
|
||||
VARegSaveSize - VARegSize,
|
||||
true, false);
|
||||
SDValue FIN = DAG.getFrameIndex(VarArgsFrameIndex, getPointerTy());
|
||||
AFI->setVarArgsFrameIndex(
|
||||
MFI->CreateFixedObject(VARegSaveSize,
|
||||
ArgOffset + VARegSaveSize - VARegSize,
|
||||
true, false));
|
||||
SDValue FIN = DAG.getFrameIndex(AFI->getVarArgsFrameIndex(),
|
||||
getPointerTy());
|
||||
|
||||
SmallVector<SDValue, 4> MemOps;
|
||||
for (; NumGPRs < 4; ++NumGPRs) {
|
||||
|
@ -1820,8 +1824,9 @@ ARMTargetLowering::LowerFormalArguments(SDValue Chain,
|
|||
|
||||
unsigned VReg = MF.addLiveIn(GPRArgRegs[NumGPRs], RC);
|
||||
SDValue Val = DAG.getCopyFromReg(Chain, dl, VReg, MVT::i32);
|
||||
SDValue Store = DAG.getStore(Val.getValue(1), dl, Val, FIN,
|
||||
PseudoSourceValue::getFixedStack(VarArgsFrameIndex), 0,
|
||||
SDValue Store =
|
||||
DAG.getStore(Val.getValue(1), dl, Val, FIN,
|
||||
PseudoSourceValue::getFixedStack(AFI->getVarArgsFrameIndex()), 0,
|
||||
false, false, 0);
|
||||
MemOps.push_back(Store);
|
||||
FIN = DAG.getNode(ISD::ADD, dl, getPointerTy(), FIN,
|
||||
|
@ -1832,7 +1837,8 @@ ARMTargetLowering::LowerFormalArguments(SDValue Chain,
|
|||
&MemOps[0], MemOps.size());
|
||||
} else
|
||||
// This will point to the next argument passed via stack.
|
||||
VarArgsFrameIndex = MFI->CreateFixedObject(4, ArgOffset, true, false);
|
||||
AFI->setVarArgsFrameIndex(MFI->CreateFixedObject(4, ArgOffset,
|
||||
true, false));
|
||||
}
|
||||
|
||||
return Chain;
|
||||
|
@ -3136,7 +3142,7 @@ SDValue ARMTargetLowering::LowerOperation(SDValue Op, SelectionDAG &DAG) {
|
|||
case ISD::BR_CC: return LowerBR_CC(Op, DAG);
|
||||
case ISD::BR_JT: return LowerBR_JT(Op, DAG);
|
||||
case ISD::DYNAMIC_STACKALLOC: return LowerDYNAMIC_STACKALLOC(Op, DAG);
|
||||
case ISD::VASTART: return LowerVASTART(Op, DAG, VarArgsFrameIndex);
|
||||
case ISD::VASTART: return LowerVASTART(Op, DAG);
|
||||
case ISD::MEMBARRIER: return LowerMEMBARRIER(Op, DAG, Subtarget);
|
||||
case ISD::SINT_TO_FP:
|
||||
case ISD::UINT_TO_FP: return LowerINT_TO_FP(Op, DAG);
|
||||
|
|
|
@ -159,7 +159,6 @@ namespace llvm {
|
|||
// ARMTargetLowering - ARM Implementation of the TargetLowering interface
|
||||
|
||||
class ARMTargetLowering : public TargetLowering {
|
||||
int VarArgsFrameIndex; // FrameIndex for start of varargs area.
|
||||
public:
|
||||
explicit ARMTargetLowering(TargetMachine &TM);
|
||||
|
||||
|
|
|
@ -85,6 +85,9 @@ class ARMFunctionInfo : public MachineFunctionInfo {
|
|||
|
||||
unsigned ConstPoolEntryUId;
|
||||
|
||||
/// VarArgsFrameIndex - FrameIndex for start of varargs area.
|
||||
int VarArgsFrameIndex;
|
||||
|
||||
public:
|
||||
ARMFunctionInfo() :
|
||||
isThumb(false),
|
||||
|
@ -94,7 +97,7 @@ public:
|
|||
FramePtrSpillOffset(0), GPRCS1Offset(0), GPRCS2Offset(0), DPRCSOffset(0),
|
||||
GPRCS1Size(0), GPRCS2Size(0), DPRCSSize(0),
|
||||
GPRCS1Frames(0), GPRCS2Frames(0), DPRCSFrames(0),
|
||||
JumpTableUId(0), ConstPoolEntryUId(0) {}
|
||||
JumpTableUId(0), ConstPoolEntryUId(0), VarArgsFrameIndex(0) {}
|
||||
|
||||
explicit ARMFunctionInfo(MachineFunction &MF) :
|
||||
isThumb(MF.getTarget().getSubtarget<ARMSubtarget>().isThumb()),
|
||||
|
@ -105,7 +108,7 @@ public:
|
|||
GPRCS1Size(0), GPRCS2Size(0), DPRCSSize(0),
|
||||
GPRCS1Frames(32), GPRCS2Frames(32), DPRCSFrames(32),
|
||||
SpilledCSRegs(MF.getTarget().getRegisterInfo()->getNumRegs()),
|
||||
JumpTableUId(0), ConstPoolEntryUId(0) {}
|
||||
JumpTableUId(0), ConstPoolEntryUId(0), VarArgsFrameIndex(0) {}
|
||||
|
||||
bool isThumbFunction() const { return isThumb; }
|
||||
bool isThumb1OnlyFunction() const { return isThumb && !hasThumb2; }
|
||||
|
@ -223,6 +226,9 @@ public:
|
|||
unsigned createConstPoolEntryUId() {
|
||||
return ConstPoolEntryUId++;
|
||||
}
|
||||
|
||||
int getVarArgsFrameIndex() const { return VarArgsFrameIndex; }
|
||||
void setVarArgsFrameIndex(int Index) { VarArgsFrameIndex = Index; }
|
||||
};
|
||||
} // End llvm namespace
|
||||
|
||||
|
|
|
@ -13,6 +13,7 @@
|
|||
|
||||
#include "AlphaISelLowering.h"
|
||||
#include "AlphaTargetMachine.h"
|
||||
#include "AlphaMachineFunctionInfo.h"
|
||||
#include "llvm/CodeGen/CallingConvLower.h"
|
||||
#include "llvm/CodeGen/MachineFrameInfo.h"
|
||||
#include "llvm/CodeGen/MachineFunction.h"
|
||||
|
@ -389,6 +390,7 @@ AlphaTargetLowering::LowerFormalArguments(SDValue Chain,
|
|||
|
||||
MachineFunction &MF = DAG.getMachineFunction();
|
||||
MachineFrameInfo *MFI = MF.getFrameInfo();
|
||||
AlphaMachineFunctionInfo *FuncInfo = MF.getInfo<AlphaMachineFunctionInfo>();
|
||||
|
||||
unsigned args_int[] = {
|
||||
Alpha::R16, Alpha::R17, Alpha::R18, Alpha::R19, Alpha::R20, Alpha::R21};
|
||||
|
@ -435,14 +437,14 @@ AlphaTargetLowering::LowerFormalArguments(SDValue Chain,
|
|||
|
||||
// If the functions takes variable number of arguments, copy all regs to stack
|
||||
if (isVarArg) {
|
||||
VarArgsOffset = Ins.size() * 8;
|
||||
FuncInfo->setVarArgsOffset(Ins.size() * 8);
|
||||
std::vector<SDValue> LS;
|
||||
for (int i = 0; i < 6; ++i) {
|
||||
if (TargetRegisterInfo::isPhysicalRegister(args_int[i]))
|
||||
args_int[i] = AddLiveIn(MF, args_int[i], &Alpha::GPRCRegClass);
|
||||
SDValue argt = DAG.getCopyFromReg(Chain, dl, args_int[i], MVT::i64);
|
||||
int FI = MFI->CreateFixedObject(8, -8 * (6 - i), true, false);
|
||||
if (i == 0) VarArgsBase = FI;
|
||||
if (i == 0) FuncInfo->setVarArgsBase(FI);
|
||||
SDValue SDFI = DAG.getFrameIndex(FI, MVT::i64);
|
||||
LS.push_back(DAG.getStore(Chain, dl, argt, SDFI, NULL, 0,
|
||||
false, false, 0));
|
||||
|
@ -725,17 +727,22 @@ SDValue AlphaTargetLowering::LowerOperation(SDValue Op, SelectionDAG &DAG) {
|
|||
false, false, 0);
|
||||
}
|
||||
case ISD::VASTART: {
|
||||
MachineFunction &MF = DAG.getMachineFunction();
|
||||
AlphaMachineFunctionInfo *FuncInfo = MF.getInfo<AlphaMachineFunctionInfo>();
|
||||
|
||||
SDValue Chain = Op.getOperand(0);
|
||||
SDValue VAListP = Op.getOperand(1);
|
||||
const Value *VAListS = cast<SrcValueSDNode>(Op.getOperand(2))->getValue();
|
||||
|
||||
// vastart stores the address of the VarArgsBase and VarArgsOffset
|
||||
SDValue FR = DAG.getFrameIndex(VarArgsBase, MVT::i64);
|
||||
SDValue FR = DAG.getFrameIndex(FuncInfo->getVarArgsBase(), MVT::i64);
|
||||
SDValue S1 = DAG.getStore(Chain, dl, FR, VAListP, VAListS, 0,
|
||||
false, false, 0);
|
||||
SDValue SA2 = DAG.getNode(ISD::ADD, dl, MVT::i64, VAListP,
|
||||
DAG.getConstant(8, MVT::i64));
|
||||
return DAG.getTruncStore(S1, dl, DAG.getConstant(VarArgsOffset, MVT::i64),
|
||||
return DAG.getTruncStore(S1, dl,
|
||||
DAG.getConstant(FuncInfo->getVarArgsOffset(),
|
||||
MVT::i64),
|
||||
SA2, NULL, 0, MVT::i32, false, false, 0);
|
||||
}
|
||||
case ISD::RETURNADDR:
|
||||
|
|
|
@ -60,8 +60,6 @@ namespace llvm {
|
|||
}
|
||||
|
||||
class AlphaTargetLowering : public TargetLowering {
|
||||
int VarArgsOffset; // What is the offset to the first vaarg
|
||||
int VarArgsBase; // What is the base FrameIndex
|
||||
public:
|
||||
explicit AlphaTargetLowering(TargetMachine &TM);
|
||||
|
||||
|
|
|
@ -30,17 +30,31 @@ class AlphaMachineFunctionInfo : public MachineFunctionInfo {
|
|||
/// the return address value.
|
||||
unsigned GlobalRetAddr;
|
||||
|
||||
/// VarArgsOffset - What is the offset to the first vaarg
|
||||
int VarArgsOffset;
|
||||
/// VarArgsBase - What is the base FrameIndex
|
||||
int VarArgsBase;
|
||||
|
||||
public:
|
||||
AlphaMachineFunctionInfo() : GlobalBaseReg(0), GlobalRetAddr(0) {}
|
||||
AlphaMachineFunctionInfo() : GlobalBaseReg(0), GlobalRetAddr(0),
|
||||
VarArgsOffset(0), VarArgsBase(0) {}
|
||||
|
||||
explicit AlphaMachineFunctionInfo(MachineFunction &MF) : GlobalBaseReg(0),
|
||||
GlobalRetAddr(0) {}
|
||||
GlobalRetAddr(0),
|
||||
VarArgsOffset(0),
|
||||
VarArgsBase(0) {}
|
||||
|
||||
unsigned getGlobalBaseReg() const { return GlobalBaseReg; }
|
||||
void setGlobalBaseReg(unsigned Reg) { GlobalBaseReg = Reg; }
|
||||
|
||||
unsigned getGlobalRetAddr() const { return GlobalRetAddr; }
|
||||
void setGlobalRetAddr(unsigned Reg) { GlobalRetAddr = Reg; }
|
||||
|
||||
int getVarArgsOffset() const { return VarArgsOffset; }
|
||||
void setVarArgsOffset(int Offset) { VarArgsOffset = Offset; }
|
||||
|
||||
int getVarArgsBase() const { return VarArgsBase; }
|
||||
void setVarArgsBase(int Base) { VarArgsBase = Base; }
|
||||
};
|
||||
|
||||
} // End llvm namespace
|
||||
|
|
|
@ -30,7 +30,6 @@ namespace llvm {
|
|||
}
|
||||
|
||||
class BlackfinTargetLowering : public TargetLowering {
|
||||
int VarArgsFrameOffset; // Frame offset to start of varargs area.
|
||||
public:
|
||||
BlackfinTargetLowering(TargetMachine &TM);
|
||||
virtual MVT::SimpleValueType getSetCCResultType(EVT VT) const;
|
||||
|
@ -39,8 +38,6 @@ namespace llvm {
|
|||
SmallVectorImpl<SDValue> &Results,
|
||||
SelectionDAG &DAG);
|
||||
|
||||
int getVarArgsFrameOffset() const { return VarArgsFrameOffset; }
|
||||
|
||||
ConstraintType getConstraintType(const std::string &Constraint) const;
|
||||
std::pair<unsigned, const TargetRegisterClass*>
|
||||
getRegForInlineAsmConstraint(const std::string &Constraint, EVT VT) const;
|
||||
|
|
|
@ -15,6 +15,7 @@
|
|||
#include "SPUISelLowering.h"
|
||||
#include "SPUTargetMachine.h"
|
||||
#include "SPUFrameInfo.h"
|
||||
#include "SPUMachineFunction.h"
|
||||
#include "llvm/Constants.h"
|
||||
#include "llvm/Function.h"
|
||||
#include "llvm/Intrinsics.h"
|
||||
|
@ -1009,6 +1010,7 @@ SPUTargetLowering::LowerFormalArguments(SDValue Chain,
|
|||
MachineFunction &MF = DAG.getMachineFunction();
|
||||
MachineFrameInfo *MFI = MF.getFrameInfo();
|
||||
MachineRegisterInfo &RegInfo = MF.getRegInfo();
|
||||
SPUFunctionInfo *FuncInfo = MF.getInfo<SPUFunctionInfo>();
|
||||
|
||||
const unsigned *ArgRegs = SPURegisterInfo::getArgRegs();
|
||||
const unsigned NumArgRegs = SPURegisterInfo::getNumArgRegs();
|
||||
|
@ -1091,9 +1093,10 @@ SPUTargetLowering::LowerFormalArguments(SDValue Chain,
|
|||
// Create the frame slot
|
||||
|
||||
for (; ArgRegIdx != NumArgRegs; ++ArgRegIdx) {
|
||||
VarArgsFrameIndex = MFI->CreateFixedObject(StackSlotSize, ArgOffset,
|
||||
true, false);
|
||||
SDValue FIN = DAG.getFrameIndex(VarArgsFrameIndex, PtrVT);
|
||||
FuncInfo->setVarArgsFrameIndex(
|
||||
MFI->CreateFixedObject(StackSlotSize, ArgOffset,
|
||||
true, false));
|
||||
SDValue FIN = DAG.getFrameIndex(FuncInfo->getVarArgsFrameIndex(), PtrVT);
|
||||
unsigned VReg = MF.addLiveIn(ArgRegs[ArgRegIdx], &SPU::R32CRegClass);
|
||||
SDValue ArgVal = DAG.getRegister(VReg, MVT::v16i8);
|
||||
SDValue Store = DAG.getStore(Chain, dl, ArgVal, FIN, NULL, 0,
|
||||
|
|
|
@ -26,14 +26,20 @@ private:
|
|||
///
|
||||
bool UsesLR;
|
||||
|
||||
// VarArgsFrameIndex - FrameIndex for start of varargs area.
|
||||
int VarArgsFrameIndex;
|
||||
|
||||
public:
|
||||
SPUFunctionInfo(MachineFunction& MF)
|
||||
: UsesLR(false)
|
||||
: UsesLR(false),
|
||||
VarArgsFrameIndex(0)
|
||||
{}
|
||||
|
||||
void setUsesLR(bool U) { UsesLR = U; }
|
||||
bool usesLR() { return UsesLR; }
|
||||
|
||||
int getVarArgsFrameIndex() const { return VarArgsFrameIndex; }
|
||||
void setVarArgsFrameIndex(int Index) { VarArgsFrameIndex = Index; }
|
||||
};
|
||||
|
||||
} // end of namespace llvm
|
||||
|
|
|
@ -456,8 +456,12 @@ LowerConstantPool(SDValue Op, SelectionDAG &DAG) {
|
|||
}
|
||||
|
||||
SDValue MBlazeTargetLowering::LowerVASTART(SDValue Op, SelectionDAG &DAG) {
|
||||
MachineFunction &MF = DAG.getMachineFunction();
|
||||
MBlazeFunctionInfo *FuncInfo = MF.getInfo<MBlazeFunctionInfo>();
|
||||
|
||||
DebugLoc dl = Op.getDebugLoc();
|
||||
SDValue FI = DAG.getFrameIndex(VarArgsFrameIndex, getPointerTy());
|
||||
SDValue FI = DAG.getFrameIndex(FuncInfo->getVarArgsFrameIndex(),
|
||||
getPointerTy());
|
||||
|
||||
// vastart just stores the address of the VarArgsFrameIndex slot into the
|
||||
// memory location argument.
|
||||
|
@ -705,7 +709,7 @@ LowerFormalArguments(SDValue Chain, CallingConv::ID CallConv, bool isVarArg,
|
|||
MBlazeFunctionInfo *MBlazeFI = MF.getInfo<MBlazeFunctionInfo>();
|
||||
|
||||
unsigned StackReg = MF.getTarget().getRegisterInfo()->getFrameRegister(MF);
|
||||
VarArgsFrameIndex = 0;
|
||||
MBlazeFI->setVarArgsFrameIndex(0);
|
||||
|
||||
// Used with vargs to acumulate store chains.
|
||||
std::vector<SDValue> OutChains;
|
||||
|
@ -818,8 +822,8 @@ LowerFormalArguments(SDValue Chain, CallingConv::ID CallConv, bool isVarArg,
|
|||
|
||||
// Record the frame index of the first variable argument
|
||||
// which is a value necessary to VASTART.
|
||||
if (!VarArgsFrameIndex)
|
||||
VarArgsFrameIndex = FI;
|
||||
if (!MBlazeFI->getVarArgsFrameIndex())
|
||||
MBlazeFI->setVarArgsFrameIndex(FI);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -63,10 +63,7 @@ namespace llvm {
|
|||
//===--------------------------------------------------------------------===//
|
||||
|
||||
class MBlazeTargetLowering : public TargetLowering {
|
||||
int VarArgsFrameIndex; // FrameIndex for start of varargs area.
|
||||
|
||||
public:
|
||||
|
||||
explicit MBlazeTargetLowering(MBlazeTargetMachine &TM);
|
||||
|
||||
/// LowerOperation - Provide custom lowering hooks for some operations.
|
||||
|
|
|
@ -79,11 +79,14 @@ private:
|
|||
/// relocation models.
|
||||
unsigned GlobalBaseReg;
|
||||
|
||||
// VarArgsFrameIndex - FrameIndex for start of varargs area.
|
||||
int VarArgsFrameIndex;
|
||||
|
||||
public:
|
||||
MBlazeFunctionInfo(MachineFunction& MF)
|
||||
: FPStackOffset(0), RAStackOffset(0), CPUTopSavedRegOff(0),
|
||||
GPHolder(-1,-1), HasLoadArgs(false), HasStoreVarArgs(false),
|
||||
SRetReturnReg(0), GlobalBaseReg(0)
|
||||
SRetReturnReg(0), GlobalBaseReg(0), VarArgsFrameIndex(0)
|
||||
{}
|
||||
|
||||
int getFPStackOffset() const { return FPStackOffset; }
|
||||
|
@ -129,6 +132,9 @@ public:
|
|||
|
||||
unsigned getGlobalBaseReg() const { return GlobalBaseReg; }
|
||||
void setGlobalBaseReg(unsigned Reg) { GlobalBaseReg = Reg; }
|
||||
|
||||
int getVarArgsFrameIndex() const { return VarArgsFrameIndex; }
|
||||
void setVarArgsFrameIndex(int Index) { VarArgsFrameIndex = Index; }
|
||||
};
|
||||
|
||||
} // end of namespace llvm
|
||||
|
|
|
@ -597,8 +597,12 @@ LowerConstantPool(SDValue Op, SelectionDAG &DAG)
|
|||
}
|
||||
|
||||
SDValue MipsTargetLowering::LowerVASTART(SDValue Op, SelectionDAG &DAG) {
|
||||
MachineFunction &MF = DAG.getMachineFunction();
|
||||
MipsFunctionInfo *FuncInfo = MF.getInfo<MipsFunctionInfo>();
|
||||
|
||||
DebugLoc dl = Op.getDebugLoc();
|
||||
SDValue FI = DAG.getFrameIndex(VarArgsFrameIndex, getPointerTy());
|
||||
SDValue FI = DAG.getFrameIndex(FuncInfo->getVarArgsFrameIndex(),
|
||||
getPointerTy());
|
||||
|
||||
// vastart just stores the address of the VarArgsFrameIndex slot into the
|
||||
// memory location argument.
|
||||
|
@ -1002,7 +1006,7 @@ MipsTargetLowering::LowerFormalArguments(SDValue Chain,
|
|||
MipsFunctionInfo *MipsFI = MF.getInfo<MipsFunctionInfo>();
|
||||
|
||||
unsigned StackReg = MF.getTarget().getRegisterInfo()->getFrameRegister(MF);
|
||||
VarArgsFrameIndex = 0;
|
||||
MipsFI->setVarArgsFrameIndex(0);
|
||||
|
||||
// Used with vargs to acumulate store chains.
|
||||
std::vector<SDValue> OutChains;
|
||||
|
@ -1143,8 +1147,8 @@ MipsTargetLowering::LowerFormalArguments(SDValue Chain,
|
|||
|
||||
// Record the frame index of the first variable argument
|
||||
// which is a value necessary to VASTART.
|
||||
if (!VarArgsFrameIndex)
|
||||
VarArgsFrameIndex = FI;
|
||||
if (!MipsFI->getVarArgsFrameIndex())
|
||||
MipsFI->setVarArgsFrameIndex(FI);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -68,10 +68,7 @@ namespace llvm {
|
|||
//===--------------------------------------------------------------------===//
|
||||
|
||||
class MipsTargetLowering : public TargetLowering {
|
||||
int VarArgsFrameIndex; // FrameIndex for start of varargs area.
|
||||
|
||||
public:
|
||||
|
||||
explicit MipsTargetLowering(MipsTargetMachine &TM);
|
||||
|
||||
/// LowerOperation - Provide custom lowering hooks for some operations.
|
||||
|
|
|
@ -80,11 +80,15 @@ private:
|
|||
/// relocation models.
|
||||
unsigned GlobalBaseReg;
|
||||
|
||||
/// VarArgsFrameIndex - FrameIndex for start of varargs area.
|
||||
int VarArgsFrameIndex;
|
||||
|
||||
public:
|
||||
MipsFunctionInfo(MachineFunction& MF)
|
||||
: FPStackOffset(0), RAStackOffset(0), CPUTopSavedRegOff(0),
|
||||
FPUTopSavedRegOff(0), GPHolder(-1,-1), HasLoadArgs(false),
|
||||
HasStoreVarArgs(false), SRetReturnReg(0), GlobalBaseReg(0)
|
||||
HasStoreVarArgs(false), SRetReturnReg(0), GlobalBaseReg(0),
|
||||
VarArgsFrameIndex(0)
|
||||
{}
|
||||
|
||||
int getFPStackOffset() const { return FPStackOffset; }
|
||||
|
@ -133,6 +137,9 @@ public:
|
|||
|
||||
unsigned getGlobalBaseReg() const { return GlobalBaseReg; }
|
||||
void setGlobalBaseReg(unsigned Reg) { GlobalBaseReg = Reg; }
|
||||
|
||||
int getVarArgsFrameIndex() const { return VarArgsFrameIndex; }
|
||||
void setVarArgsFrameIndex(int Index) { VarArgsFrameIndex = Index; }
|
||||
};
|
||||
|
||||
} // end of namespace llvm
|
||||
|
|
|
@ -16,6 +16,7 @@
|
|||
#include "PIC16AsmPrinter.h"
|
||||
#include "PIC16Section.h"
|
||||
#include "PIC16MCAsmInfo.h"
|
||||
#include "PIC16MachineFunctionInfo.h"
|
||||
#include "llvm/DerivedTypes.h"
|
||||
#include "llvm/Function.h"
|
||||
#include "llvm/Module.h"
|
||||
|
@ -379,6 +380,8 @@ bool PIC16AsmPrinter::doFinalization(Module &M) {
|
|||
void PIC16AsmPrinter::EmitFunctionFrame(MachineFunction &MF) {
|
||||
const Function *F = MF.getFunction();
|
||||
const TargetData *TD = TM.getTargetData();
|
||||
PIC16MachineFunctionInfo *FuncInfo = MF.getInfo<PIC16MachineFunctionInfo>();
|
||||
|
||||
// Emit the data section name.
|
||||
|
||||
PIC16Section *fPDataSection =
|
||||
|
@ -420,7 +423,7 @@ void PIC16AsmPrinter::EmitFunctionFrame(MachineFunction &MF) {
|
|||
Twine(" RES ") + Twine(ArgSize));
|
||||
|
||||
// Emit temporary space
|
||||
int TempSize = PTLI->GetTmpSize();
|
||||
int TempSize = FuncInfo->getTmpSize();
|
||||
if (TempSize > 0)
|
||||
OutStreamer.EmitRawText(PAN::getTempdataLabel(CurrentFnSym->getName()) +
|
||||
Twine(" RES ") + Twine(TempSize));
|
||||
|
|
|
@ -16,6 +16,7 @@
|
|||
#include "PIC16ISelLowering.h"
|
||||
#include "PIC16TargetObjectFile.h"
|
||||
#include "PIC16TargetMachine.h"
|
||||
#include "PIC16MachineFunctionInfo.h"
|
||||
#include "llvm/DerivedTypes.h"
|
||||
#include "llvm/GlobalValue.h"
|
||||
#include "llvm/Function.h"
|
||||
|
@ -144,7 +145,7 @@ static const char *getStdLibCallName(unsigned opcode) {
|
|||
|
||||
// PIC16TargetLowering Constructor.
|
||||
PIC16TargetLowering::PIC16TargetLowering(PIC16TargetMachine &TM)
|
||||
: TargetLowering(TM, new PIC16TargetObjectFile()), TmpSize(0) {
|
||||
: TargetLowering(TM, new PIC16TargetObjectFile()) {
|
||||
|
||||
Subtarget = &TM.getSubtarget<PIC16Subtarget>();
|
||||
|
||||
|
@ -321,18 +322,29 @@ static SDValue getOutFlag(SDValue &Op) {
|
|||
return Flag;
|
||||
}
|
||||
// Get the TmpOffset for FrameIndex
|
||||
unsigned PIC16TargetLowering::GetTmpOffsetForFI(unsigned FI, unsigned size) {
|
||||
unsigned PIC16TargetLowering::GetTmpOffsetForFI(unsigned FI, unsigned size,
|
||||
MachineFunction &MF) {
|
||||
PIC16MachineFunctionInfo *FuncInfo = MF.getInfo<PIC16MachineFunctionInfo>();
|
||||
std::map<unsigned, unsigned> &FiTmpOffsetMap = FuncInfo->getFiTmpOffsetMap();
|
||||
|
||||
std::map<unsigned, unsigned>::iterator
|
||||
MapIt = FiTmpOffsetMap.find(FI);
|
||||
if (MapIt != FiTmpOffsetMap.end())
|
||||
return MapIt->second;
|
||||
|
||||
// This FI (FrameIndex) is not yet mapped, so map it
|
||||
FiTmpOffsetMap[FI] = TmpSize;
|
||||
TmpSize += size;
|
||||
FiTmpOffsetMap[FI] = FuncInfo->getTmpSize();
|
||||
FuncInfo->setTmpSize(FuncInfo->getTmpSize() + size);
|
||||
return FiTmpOffsetMap[FI];
|
||||
}
|
||||
|
||||
void PIC16TargetLowering::ResetTmpOffsetMap(SelectionDAG &DAG) {
|
||||
MachineFunction &MF = DAG.getMachineFunction();
|
||||
PIC16MachineFunctionInfo *FuncInfo = MF.getInfo<PIC16MachineFunctionInfo>();
|
||||
FuncInfo->getFiTmpOffsetMap().clear();
|
||||
FuncInfo->setTmpSize(0);
|
||||
}
|
||||
|
||||
// To extract chain value from the SDValue Nodes
|
||||
// This function will help to maintain the chain extracting
|
||||
// code at one place. In case of any change in future it will
|
||||
|
@ -725,6 +737,7 @@ PIC16TargetLowering::LegalizeFrameIndex(SDValue Op, SelectionDAG &DAG,
|
|||
MachineFunction &MF = DAG.getMachineFunction();
|
||||
const Function *Func = MF.getFunction();
|
||||
MachineFrameInfo *MFI = MF.getFrameInfo();
|
||||
PIC16MachineFunctionInfo *FuncInfo = MF.getInfo<PIC16MachineFunctionInfo>();
|
||||
const std::string Name = Func->getName();
|
||||
|
||||
FrameIndexSDNode *FR = dyn_cast<FrameIndexSDNode>(Op);
|
||||
|
@ -736,7 +749,7 @@ PIC16TargetLowering::LegalizeFrameIndex(SDValue Op, SelectionDAG &DAG,
|
|||
// the list and add their requested size.
|
||||
unsigned FIndex = FR->getIndex();
|
||||
const char *tmpName;
|
||||
if (FIndex < ReservedFrameCount) {
|
||||
if (FIndex < FuncInfo->getReservedFrameCount()) {
|
||||
tmpName = ESNames::createESName(PAN::getFrameLabel(Name));
|
||||
ES = DAG.getTargetExternalSymbol(tmpName, MVT::i8);
|
||||
Offset = 0;
|
||||
|
@ -747,7 +760,7 @@ PIC16TargetLowering::LegalizeFrameIndex(SDValue Op, SelectionDAG &DAG,
|
|||
// FrameIndex has been made for some temporary storage
|
||||
tmpName = ESNames::createESName(PAN::getTempdataLabel(Name));
|
||||
ES = DAG.getTargetExternalSymbol(tmpName, MVT::i8);
|
||||
Offset = GetTmpOffsetForFI(FIndex, MFI->getObjectSize(FIndex));
|
||||
Offset = GetTmpOffsetForFI(FIndex, MFI->getObjectSize(FIndex), MF);
|
||||
}
|
||||
|
||||
return;
|
||||
|
@ -1085,14 +1098,14 @@ SDValue PIC16TargetLowering::ConvertToMemOperand(SDValue Op,
|
|||
DAG.getEntryNode(),
|
||||
Op, ES,
|
||||
DAG.getConstant (1, MVT::i8), // Banksel.
|
||||
DAG.getConstant (GetTmpOffsetForFI(FI, 1),
|
||||
DAG.getConstant (GetTmpOffsetForFI(FI, 1, MF),
|
||||
MVT::i8));
|
||||
|
||||
// Load the value from ES.
|
||||
SDVTList Tys = DAG.getVTList(MVT::i8, MVT::Other);
|
||||
SDValue Load = DAG.getNode(PIC16ISD::PIC16Load, dl, Tys, Store,
|
||||
ES, DAG.getConstant (1, MVT::i8),
|
||||
DAG.getConstant (GetTmpOffsetForFI(FI, 1),
|
||||
DAG.getConstant (GetTmpOffsetForFI(FI, 1, MF),
|
||||
MVT::i8));
|
||||
|
||||
return Load.getValue(0);
|
||||
|
@ -1647,15 +1660,19 @@ SDValue PIC16TargetLowering::LowerSUB(SDValue Op, SelectionDAG &DAG) {
|
|||
return Op;
|
||||
}
|
||||
|
||||
void PIC16TargetLowering::InitReservedFrameCount(const Function *F) {
|
||||
void PIC16TargetLowering::InitReservedFrameCount(const Function *F,
|
||||
SelectionDAG &DAG) {
|
||||
MachineFunction &MF = DAG.getMachineFunction();
|
||||
PIC16MachineFunctionInfo *FuncInfo = MF.getInfo<PIC16MachineFunctionInfo>();
|
||||
|
||||
unsigned NumArgs = F->arg_size();
|
||||
|
||||
bool isVoidFunc = (F->getReturnType()->getTypeID() == Type::VoidTyID);
|
||||
|
||||
if (isVoidFunc)
|
||||
ReservedFrameCount = NumArgs;
|
||||
FuncInfo->setReservedFrameCount(NumArgs);
|
||||
else
|
||||
ReservedFrameCount = NumArgs + 1;
|
||||
FuncInfo->setReservedFrameCount(NumArgs + 1);
|
||||
}
|
||||
|
||||
// LowerFormalArguments - Argument values are loaded from the
|
||||
|
@ -1678,9 +1695,9 @@ PIC16TargetLowering::LowerFormalArguments(SDValue Chain,
|
|||
std::string FuncName = F->getName();
|
||||
|
||||
// Reset the map of FI and TmpOffset
|
||||
ResetTmpOffsetMap();
|
||||
ResetTmpOffsetMap(DAG);
|
||||
// Initialize the ReserveFrameCount
|
||||
InitReservedFrameCount(F);
|
||||
InitReservedFrameCount(F, DAG);
|
||||
|
||||
// Create the <fname>.args external symbol.
|
||||
const char *tmpName = ESNames::createESName(PAN::getArgsLabel(FuncName));
|
||||
|
|
|
@ -168,13 +168,11 @@ namespace llvm {
|
|||
// This function returns the Tmp Offset for FrameIndex. If any TmpOffset
|
||||
// already exists for the FI then it returns the same else it creates the
|
||||
// new offset and returns.
|
||||
unsigned GetTmpOffsetForFI(unsigned FI, unsigned slot_size);
|
||||
void ResetTmpOffsetMap() { FiTmpOffsetMap.clear(); SetTmpSize(0); }
|
||||
void InitReservedFrameCount(const Function *F);
|
||||
|
||||
// Return the size of Tmp variable
|
||||
unsigned GetTmpSize() { return TmpSize; }
|
||||
void SetTmpSize(unsigned Size) { TmpSize = Size; }
|
||||
unsigned GetTmpOffsetForFI(unsigned FI, unsigned slot_size,
|
||||
MachineFunction &MF);
|
||||
void ResetTmpOffsetMap(SelectionDAG &DAG);
|
||||
void InitReservedFrameCount(const Function *F,
|
||||
SelectionDAG &DAG);
|
||||
|
||||
/// getFunctionAlignment - Return the Log2 alignment of this function.
|
||||
virtual unsigned getFunctionAlignment(const Function *) const {
|
||||
|
@ -247,17 +245,6 @@ namespace llvm {
|
|||
// Keep a pointer to SelectionDAGISel to access its public
|
||||
// interface (It is required during legalization)
|
||||
SelectionDAGISel *ISel;
|
||||
|
||||
private:
|
||||
// The frameindexes generated for spill/reload are stack based.
|
||||
// This maps maintain zero based indexes for these FIs.
|
||||
std::map<unsigned, unsigned> FiTmpOffsetMap;
|
||||
unsigned TmpSize;
|
||||
|
||||
// These are the frames for return value and argument passing
|
||||
// These FrameIndices will be expanded to foo.frame external symbol
|
||||
// and all others will be expanded to foo.tmp external symbol.
|
||||
unsigned ReservedFrameCount;
|
||||
};
|
||||
} // namespace llvm
|
||||
|
||||
|
|
|
@ -86,7 +86,7 @@ void PIC16InstrInfo::storeRegToStackSlot(MachineBasicBlock &MBB,
|
|||
//MachineRegisterInfo &RI = MF.getRegInfo();
|
||||
BuildMI(MBB, I, DL, get(PIC16::movwf))
|
||||
.addReg(SrcReg, getKillRegState(isKill))
|
||||
.addImm(PTLI->GetTmpOffsetForFI(FI, 1))
|
||||
.addImm(PTLI->GetTmpOffsetForFI(FI, 1, *MBB.getParent()))
|
||||
.addExternalSymbol(tmpName)
|
||||
.addImm(1); // Emit banksel for it.
|
||||
}
|
||||
|
@ -101,7 +101,7 @@ void PIC16InstrInfo::storeRegToStackSlot(MachineBasicBlock &MBB,
|
|||
: PIC16::save_fsr1;
|
||||
BuildMI(MBB, I, DL, get(opcode))
|
||||
.addReg(SrcReg, getKillRegState(isKill))
|
||||
.addImm(PTLI->GetTmpOffsetForFI(FI, 3))
|
||||
.addImm(PTLI->GetTmpOffsetForFI(FI, 3, *MBB.getParent()))
|
||||
.addExternalSymbol(tmpName)
|
||||
.addImm(1); // Emit banksel for it.
|
||||
}
|
||||
|
@ -127,7 +127,7 @@ void PIC16InstrInfo::loadRegFromStackSlot(MachineBasicBlock &MBB,
|
|||
//MachineFunction &MF = *MBB.getParent();
|
||||
//MachineRegisterInfo &RI = MF.getRegInfo();
|
||||
BuildMI(MBB, I, DL, get(PIC16::movf), DestReg)
|
||||
.addImm(PTLI->GetTmpOffsetForFI(FI, 1))
|
||||
.addImm(PTLI->GetTmpOffsetForFI(FI, 1, *MBB.getParent()))
|
||||
.addExternalSymbol(tmpName)
|
||||
.addImm(1); // Emit banksel for it.
|
||||
}
|
||||
|
@ -141,7 +141,7 @@ void PIC16InstrInfo::loadRegFromStackSlot(MachineBasicBlock &MBB,
|
|||
unsigned opcode = (DestReg == PIC16::FSR0) ? PIC16::restore_fsr0
|
||||
: PIC16::restore_fsr1;
|
||||
BuildMI(MBB, I, DL, get(opcode), DestReg)
|
||||
.addImm(PTLI->GetTmpOffsetForFI(FI, 3))
|
||||
.addImm(PTLI->GetTmpOffsetForFI(FI, 3, *MBB.getParent()))
|
||||
.addExternalSymbol(tmpName)
|
||||
.addImm(1); // Emit banksel for it.
|
||||
}
|
||||
|
|
|
@ -0,0 +1,52 @@
|
|||
//====- PIC16MachineFuctionInfo.h - PIC16 machine function info -*- C++ -*-===//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
// This file is distributed under the University of Illinois Open Source
|
||||
// License. See LICENSE.TXT for details.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// This file declares PIC16-specific per-machine-function information.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#ifndef PIC16MACHINEFUNCTIONINFO_H
|
||||
#define PIC16MACHINEFUNCTIONINFO_H
|
||||
|
||||
#include "llvm/CodeGen/MachineFunction.h"
|
||||
|
||||
namespace llvm {
|
||||
|
||||
/// PIC16MachineFunctionInfo - This class is derived from MachineFunction
|
||||
/// private PIC16 target-specific information for each MachineFunction.
|
||||
class PIC16MachineFunctionInfo : public MachineFunctionInfo {
|
||||
// The frameindexes generated for spill/reload are stack based.
|
||||
// This maps maintain zero based indexes for these FIs.
|
||||
std::map<unsigned, unsigned> FiTmpOffsetMap;
|
||||
unsigned TmpSize;
|
||||
|
||||
// These are the frames for return value and argument passing
|
||||
// These FrameIndices will be expanded to foo.frame external symbol
|
||||
// and all others will be expanded to foo.tmp external symbol.
|
||||
unsigned ReservedFrameCount;
|
||||
|
||||
public:
|
||||
PIC16MachineFunctionInfo()
|
||||
: TmpSize(0), ReservedFrameCount(0) {}
|
||||
|
||||
explicit PIC16MachineFunctionInfo(MachineFunction &MF)
|
||||
: TmpSize(0), ReservedFrameCount(0) {}
|
||||
|
||||
std::map<unsigned, unsigned> &getFiTmpOffsetMap() { return FiTmpOffsetMap; }
|
||||
|
||||
unsigned getTmpSize() const { return TmpSize; }
|
||||
void setTmpSize(unsigned Size) { TmpSize = Size; }
|
||||
|
||||
unsigned getReservedFrameCount() const { return ReservedFrameCount; }
|
||||
void setReservedFrameCount(unsigned Count) { ReservedFrameCount = Count; }
|
||||
};
|
||||
|
||||
} // End llvm namespace
|
||||
|
||||
#endif
|
|
@ -1291,10 +1291,6 @@ SDValue PPCTargetLowering::LowerSETCC(SDValue Op, SelectionDAG &DAG) {
|
|||
}
|
||||
|
||||
SDValue PPCTargetLowering::LowerVAARG(SDValue Op, SelectionDAG &DAG,
|
||||
int VarArgsFrameIndex,
|
||||
int VarArgsStackOffset,
|
||||
unsigned VarArgsNumGPR,
|
||||
unsigned VarArgsNumFPR,
|
||||
const PPCSubtarget &Subtarget) {
|
||||
|
||||
llvm_unreachable("VAARG not yet implemented for the SVR4 ABI!");
|
||||
|
@ -1343,18 +1339,17 @@ SDValue PPCTargetLowering::LowerTRAMPOLINE(SDValue Op, SelectionDAG &DAG) {
|
|||
}
|
||||
|
||||
SDValue PPCTargetLowering::LowerVASTART(SDValue Op, SelectionDAG &DAG,
|
||||
int VarArgsFrameIndex,
|
||||
int VarArgsStackOffset,
|
||||
unsigned VarArgsNumGPR,
|
||||
unsigned VarArgsNumFPR,
|
||||
const PPCSubtarget &Subtarget) {
|
||||
MachineFunction &MF = DAG.getMachineFunction();
|
||||
PPCFunctionInfo *FuncInfo = MF.getInfo<PPCFunctionInfo>();
|
||||
|
||||
DebugLoc dl = Op.getDebugLoc();
|
||||
|
||||
if (Subtarget.isDarwinABI() || Subtarget.isPPC64()) {
|
||||
// vastart just stores the address of the VarArgsFrameIndex slot into the
|
||||
// memory location argument.
|
||||
EVT PtrVT = DAG.getTargetLoweringInfo().getPointerTy();
|
||||
SDValue FR = DAG.getFrameIndex(VarArgsFrameIndex, PtrVT);
|
||||
SDValue FR = DAG.getFrameIndex(FuncInfo->getVarArgsFrameIndex(), PtrVT);
|
||||
const Value *SV = cast<SrcValueSDNode>(Op.getOperand(2))->getValue();
|
||||
return DAG.getStore(Op.getOperand(0), dl, FR, Op.getOperand(1), SV, 0,
|
||||
false, false, 0);
|
||||
|
@ -1385,14 +1380,16 @@ SDValue PPCTargetLowering::LowerVASTART(SDValue Op, SelectionDAG &DAG,
|
|||
// } va_list[1];
|
||||
|
||||
|
||||
SDValue ArgGPR = DAG.getConstant(VarArgsNumGPR, MVT::i32);
|
||||
SDValue ArgFPR = DAG.getConstant(VarArgsNumFPR, MVT::i32);
|
||||
SDValue ArgGPR = DAG.getConstant(FuncInfo->getVarArgsNumGPR(), MVT::i32);
|
||||
SDValue ArgFPR = DAG.getConstant(FuncInfo->getVarArgsNumFPR(), MVT::i32);
|
||||
|
||||
|
||||
EVT PtrVT = DAG.getTargetLoweringInfo().getPointerTy();
|
||||
|
||||
SDValue StackOffsetFI = DAG.getFrameIndex(VarArgsStackOffset, PtrVT);
|
||||
SDValue FR = DAG.getFrameIndex(VarArgsFrameIndex, PtrVT);
|
||||
SDValue StackOffsetFI = DAG.getFrameIndex(FuncInfo->getVarArgsStackOffset(),
|
||||
PtrVT);
|
||||
SDValue FR = DAG.getFrameIndex(FuncInfo->getVarArgsFrameIndex(),
|
||||
PtrVT);
|
||||
|
||||
uint64_t FrameOffset = PtrVT.getSizeInBits()/8;
|
||||
SDValue ConstFrameOffset = DAG.getConstant(FrameOffset, PtrVT);
|
||||
|
@ -1575,6 +1572,7 @@ PPCTargetLowering::LowerFormalArguments_SVR4(
|
|||
|
||||
MachineFunction &MF = DAG.getMachineFunction();
|
||||
MachineFrameInfo *MFI = MF.getFrameInfo();
|
||||
PPCFunctionInfo *FuncInfo = MF.getInfo<PPCFunctionInfo>();
|
||||
|
||||
EVT PtrVT = DAG.getTargetLoweringInfo().getPointerTy();
|
||||
// Potential tail calls could cause overwriting of argument stack slots.
|
||||
|
@ -1688,24 +1686,27 @@ PPCTargetLowering::LowerFormalArguments_SVR4(
|
|||
};
|
||||
const unsigned NumFPArgRegs = array_lengthof(FPArgRegs);
|
||||
|
||||
VarArgsNumGPR = CCInfo.getFirstUnallocated(GPArgRegs, NumGPArgRegs);
|
||||
VarArgsNumFPR = CCInfo.getFirstUnallocated(FPArgRegs, NumFPArgRegs);
|
||||
FuncInfo->setVarArgsNumGPR(CCInfo.getFirstUnallocated(GPArgRegs,
|
||||
NumGPArgRegs));
|
||||
FuncInfo->setVarArgsNumFPR(CCInfo.getFirstUnallocated(FPArgRegs,
|
||||
NumFPArgRegs));
|
||||
|
||||
// Make room for NumGPArgRegs and NumFPArgRegs.
|
||||
int Depth = NumGPArgRegs * PtrVT.getSizeInBits()/8 +
|
||||
NumFPArgRegs * EVT(MVT::f64).getSizeInBits()/8;
|
||||
|
||||
VarArgsStackOffset = MFI->CreateFixedObject(PtrVT.getSizeInBits()/8,
|
||||
FuncInfo->setVarArgsStackOffset(
|
||||
MFI->CreateFixedObject(PtrVT.getSizeInBits()/8,
|
||||
CCInfo.getNextStackOffset(),
|
||||
true, false);
|
||||
true, false));
|
||||
|
||||
VarArgsFrameIndex = MFI->CreateStackObject(Depth, 8, false);
|
||||
SDValue FIN = DAG.getFrameIndex(VarArgsFrameIndex, PtrVT);
|
||||
FuncInfo->setVarArgsFrameIndex(MFI->CreateStackObject(Depth, 8, false));
|
||||
SDValue FIN = DAG.getFrameIndex(FuncInfo->getVarArgsFrameIndex(), PtrVT);
|
||||
|
||||
// The fixed integer arguments of a variadic function are
|
||||
// stored to the VarArgsFrameIndex on the stack.
|
||||
unsigned GPRIndex = 0;
|
||||
for (; GPRIndex != VarArgsNumGPR; ++GPRIndex) {
|
||||
for (; GPRIndex != FuncInfo->getVarArgsNumGPR(); ++GPRIndex) {
|
||||
SDValue Val = DAG.getRegister(GPArgRegs[GPRIndex], PtrVT);
|
||||
SDValue Store = DAG.getStore(Chain, dl, Val, FIN, NULL, 0,
|
||||
false, false, 0);
|
||||
|
@ -1736,7 +1737,7 @@ PPCTargetLowering::LowerFormalArguments_SVR4(
|
|||
// The double arguments are stored to the VarArgsFrameIndex
|
||||
// on the stack.
|
||||
unsigned FPRIndex = 0;
|
||||
for (FPRIndex = 0; FPRIndex != VarArgsNumFPR; ++FPRIndex) {
|
||||
for (FPRIndex = 0; FPRIndex != FuncInfo->getVarArgsNumFPR(); ++FPRIndex) {
|
||||
SDValue Val = DAG.getRegister(FPArgRegs[FPRIndex], MVT::f64);
|
||||
SDValue Store = DAG.getStore(Chain, dl, Val, FIN, NULL, 0,
|
||||
false, false, 0);
|
||||
|
@ -1780,6 +1781,7 @@ PPCTargetLowering::LowerFormalArguments_Darwin(
|
|||
//
|
||||
MachineFunction &MF = DAG.getMachineFunction();
|
||||
MachineFrameInfo *MFI = MF.getFrameInfo();
|
||||
PPCFunctionInfo *FuncInfo = MF.getInfo<PPCFunctionInfo>();
|
||||
|
||||
EVT PtrVT = DAG.getTargetLoweringInfo().getPointerTy();
|
||||
bool isPPC64 = PtrVT == MVT::i64;
|
||||
|
@ -2090,9 +2092,10 @@ PPCTargetLowering::LowerFormalArguments_Darwin(
|
|||
if (isVarArg) {
|
||||
int Depth = ArgOffset;
|
||||
|
||||
VarArgsFrameIndex = MFI->CreateFixedObject(PtrVT.getSizeInBits()/8,
|
||||
Depth, true, false);
|
||||
SDValue FIN = DAG.getFrameIndex(VarArgsFrameIndex, PtrVT);
|
||||
FuncInfo->setVarArgsFrameIndex(
|
||||
MFI->CreateFixedObject(PtrVT.getSizeInBits()/8,
|
||||
Depth, true, false));
|
||||
SDValue FIN = DAG.getFrameIndex(FuncInfo->getVarArgsFrameIndex(), PtrVT);
|
||||
|
||||
// If this function is vararg, store any remaining integer argument regs
|
||||
// to their spots on the stack so that they may be loaded by deferencing the
|
||||
|
@ -4373,12 +4376,10 @@ SDValue PPCTargetLowering::LowerOperation(SDValue Op, SelectionDAG &DAG) {
|
|||
case ISD::SETCC: return LowerSETCC(Op, DAG);
|
||||
case ISD::TRAMPOLINE: return LowerTRAMPOLINE(Op, DAG);
|
||||
case ISD::VASTART:
|
||||
return LowerVASTART(Op, DAG, VarArgsFrameIndex, VarArgsStackOffset,
|
||||
VarArgsNumGPR, VarArgsNumFPR, PPCSubTarget);
|
||||
return LowerVASTART(Op, DAG, PPCSubTarget);
|
||||
|
||||
case ISD::VAARG:
|
||||
return LowerVAARG(Op, DAG, VarArgsFrameIndex, VarArgsStackOffset,
|
||||
VarArgsNumGPR, VarArgsNumFPR, PPCSubTarget);
|
||||
return LowerVAARG(Op, DAG, PPCSubTarget);
|
||||
|
||||
case ISD::STACKRESTORE: return LowerSTACKRESTORE(Op, DAG, PPCSubTarget);
|
||||
case ISD::DYNAMIC_STACKALLOC:
|
||||
|
|
|
@ -233,14 +233,8 @@ namespace llvm {
|
|||
}
|
||||
|
||||
class PPCTargetLowering : public TargetLowering {
|
||||
int VarArgsFrameIndex; // FrameIndex for start of varargs area.
|
||||
int VarArgsStackOffset; // StackOffset for start of stack
|
||||
// arguments.
|
||||
unsigned VarArgsNumGPR; // Index of the first unused integer
|
||||
// register for parameter passing.
|
||||
unsigned VarArgsNumFPR; // Index of the first unused double
|
||||
// register for parameter passing.
|
||||
const PPCSubtarget &PPCSubTarget;
|
||||
|
||||
public:
|
||||
explicit PPCTargetLowering(PPCTargetMachine &TM);
|
||||
|
||||
|
@ -396,12 +390,9 @@ namespace llvm {
|
|||
SDValue LowerSETCC(SDValue Op, SelectionDAG &DAG);
|
||||
SDValue LowerTRAMPOLINE(SDValue Op, SelectionDAG &DAG);
|
||||
SDValue LowerVASTART(SDValue Op, SelectionDAG &DAG,
|
||||
int VarArgsFrameIndex, int VarArgsStackOffset,
|
||||
unsigned VarArgsNumGPR, unsigned VarArgsNumFPR,
|
||||
const PPCSubtarget &Subtarget);
|
||||
SDValue LowerVAARG(SDValue Op, SelectionDAG &DAG, int VarArgsFrameIndex,
|
||||
int VarArgsStackOffset, unsigned VarArgsNumGPR,
|
||||
unsigned VarArgsNumFPR, const PPCSubtarget &Subtarget);
|
||||
SDValue LowerVAARG(SDValue Op, SelectionDAG &DAG,
|
||||
const PPCSubtarget &Subtarget);
|
||||
SDValue LowerSTACKRESTORE(SDValue Op, SelectionDAG &DAG,
|
||||
const PPCSubtarget &Subtarget);
|
||||
SDValue LowerDYNAMIC_STACKALLOC(SDValue Op, SelectionDAG &DAG,
|
||||
|
|
|
@ -58,6 +58,18 @@ private:
|
|||
/// how the caller's stack pointer should be calculated (epilog/dynamicalloc).
|
||||
bool HasFastCall;
|
||||
|
||||
/// VarArgsFrameIndex - FrameIndex for start of varargs area.
|
||||
int VarArgsFrameIndex;
|
||||
/// VarArgsStackOffset - StackOffset for start of stack
|
||||
/// arguments.
|
||||
int VarArgsStackOffset;
|
||||
/// VarArgsNumGPR - Index of the first unused integer
|
||||
/// register for parameter passing.
|
||||
unsigned VarArgsNumGPR;
|
||||
/// VarArgsNumFPR - Index of the first unused double
|
||||
/// register for parameter passing.
|
||||
unsigned VarArgsNumFPR;
|
||||
|
||||
public:
|
||||
explicit PPCFunctionInfo(MachineFunction &MF)
|
||||
: FramePointerSaveIndex(0),
|
||||
|
@ -66,7 +78,11 @@ public:
|
|||
LRStoreRequired(false),
|
||||
MinReservedArea(0),
|
||||
TailCallSPDelta(0),
|
||||
HasFastCall(false) {}
|
||||
HasFastCall(false),
|
||||
VarArgsFrameIndex(0),
|
||||
VarArgsStackOffset(0),
|
||||
VarArgsNumGPR(0),
|
||||
VarArgsNumFPR(0) {}
|
||||
|
||||
int getFramePointerSaveIndex() const { return FramePointerSaveIndex; }
|
||||
void setFramePointerSaveIndex(int Idx) { FramePointerSaveIndex = Idx; }
|
||||
|
@ -96,6 +112,18 @@ public:
|
|||
|
||||
void setHasFastCall() { HasFastCall = true; }
|
||||
bool hasFastCall() const { return HasFastCall;}
|
||||
|
||||
int getVarArgsFrameIndex() const { return VarArgsFrameIndex; }
|
||||
void setVarArgsFrameIndex(int Index) { VarArgsFrameIndex = Index; }
|
||||
|
||||
int getVarArgsStackOffset() const { return VarArgsStackOffset; }
|
||||
void setVarArgsStackOffset(int Offset) { VarArgsStackOffset = Offset; }
|
||||
|
||||
unsigned getVarArgsNumGPR() const { return VarArgsNumGPR; }
|
||||
void setVarArgsNumGPR(unsigned Num) { VarArgsNumGPR = Num; }
|
||||
|
||||
unsigned getVarArgsNumFPR() const { return VarArgsNumFPR; }
|
||||
void setVarArgsNumFPR(unsigned Num) { VarArgsNumFPR = Num; }
|
||||
};
|
||||
|
||||
} // end of namespace llvm
|
||||
|
|
|
@ -14,6 +14,7 @@
|
|||
|
||||
#include "SparcISelLowering.h"
|
||||
#include "SparcTargetMachine.h"
|
||||
#include "SparcMachineFunctionInfo.h"
|
||||
#include "llvm/Function.h"
|
||||
#include "llvm/CodeGen/CallingConvLower.h"
|
||||
#include "llvm/CodeGen/MachineFrameInfo.h"
|
||||
|
@ -89,6 +90,7 @@ SparcTargetLowering::LowerFormalArguments(SDValue Chain,
|
|||
|
||||
MachineFunction &MF = DAG.getMachineFunction();
|
||||
MachineRegisterInfo &RegInfo = MF.getRegInfo();
|
||||
SparcMachineFunctionInfo *FuncInfo = MF.getInfo<SparcMachineFunctionInfo>();
|
||||
|
||||
// Assign locations to all of the incoming arguments.
|
||||
SmallVector<CCValAssign, 16> ArgLocs;
|
||||
|
@ -226,7 +228,7 @@ SparcTargetLowering::LowerFormalArguments(SDValue Chain,
|
|||
// Store remaining ArgRegs to the stack if this is a varargs function.
|
||||
if (isVarArg) {
|
||||
// Remember the vararg offset for the va_start implementation.
|
||||
VarArgsFrameOffset = ArgOffset;
|
||||
FuncInfo->setVarArgsFrameOffset(ArgOffset);
|
||||
|
||||
std::vector<SDValue> OutChains;
|
||||
|
||||
|
@ -874,12 +876,16 @@ static SDValue LowerSELECT_CC(SDValue Op, SelectionDAG &DAG) {
|
|||
|
||||
static SDValue LowerVASTART(SDValue Op, SelectionDAG &DAG,
|
||||
SparcTargetLowering &TLI) {
|
||||
MachineFunction &MF = DAG.getMachineFunction();
|
||||
SparcMachineFunctionInfo *FuncInfo = MF.getInfo<SparcMachineFunctionInfo>();
|
||||
|
||||
// vastart just stores the address of the VarArgsFrameIndex slot into the
|
||||
// memory location argument.
|
||||
DebugLoc dl = Op.getDebugLoc();
|
||||
SDValue Offset = DAG.getNode(ISD::ADD, dl, MVT::i32,
|
||||
SDValue Offset =
|
||||
DAG.getNode(ISD::ADD, dl, MVT::i32,
|
||||
DAG.getRegister(SP::I6, MVT::i32),
|
||||
DAG.getConstant(TLI.getVarArgsFrameOffset(),
|
||||
DAG.getConstant(FuncInfo->getVarArgsFrameOffset(),
|
||||
MVT::i32));
|
||||
const Value *SV = cast<SrcValueSDNode>(Op.getOperand(2))->getValue();
|
||||
return DAG.getStore(Op.getOperand(0), dl, Offset, Op.getOperand(1), SV, 0,
|
||||
|
|
|
@ -41,13 +41,10 @@ namespace llvm {
|
|||
}
|
||||
|
||||
class SparcTargetLowering : public TargetLowering {
|
||||
int VarArgsFrameOffset; // Frame offset to start of varargs area.
|
||||
public:
|
||||
SparcTargetLowering(TargetMachine &TM);
|
||||
virtual SDValue LowerOperation(SDValue Op, SelectionDAG &DAG);
|
||||
|
||||
int getVarArgsFrameOffset() const { return VarArgsFrameOffset; }
|
||||
|
||||
/// computeMaskedBitsForTargetNode - Determine which of the bits specified
|
||||
/// in Mask are known to be either zero or one and return them in the
|
||||
/// KnownZero/KnownOne bitsets.
|
||||
|
|
|
@ -20,12 +20,20 @@ namespace llvm {
|
|||
class SparcMachineFunctionInfo : public MachineFunctionInfo {
|
||||
private:
|
||||
unsigned GlobalBaseReg;
|
||||
|
||||
/// VarArgsFrameOffset - Frame offset to start of varargs area.
|
||||
int VarArgsFrameOffset;
|
||||
|
||||
public:
|
||||
SparcMachineFunctionInfo() : GlobalBaseReg(0) {}
|
||||
explicit SparcMachineFunctionInfo(MachineFunction &MF) : GlobalBaseReg(0) {}
|
||||
SparcMachineFunctionInfo() : GlobalBaseReg(0), VarArgsFrameOffset(0) {}
|
||||
explicit SparcMachineFunctionInfo(MachineFunction &MF)
|
||||
: GlobalBaseReg(0), VarArgsFrameOffset(0) {}
|
||||
|
||||
unsigned getGlobalBaseReg() const { return GlobalBaseReg; }
|
||||
void setGlobalBaseReg(unsigned Reg) { GlobalBaseReg = Reg; }
|
||||
|
||||
int getVarArgsFrameOffset() const { return VarArgsFrameOffset; }
|
||||
void setVarArgsFrameOffset(int Offset) { VarArgsFrameOffset = Offset; }
|
||||
};
|
||||
}
|
||||
|
||||
|
|
|
@ -1204,6 +1204,8 @@ X86TargetLowering::LowerReturn(SDValue Chain,
|
|||
CallingConv::ID CallConv, bool isVarArg,
|
||||
const SmallVectorImpl<ISD::OutputArg> &Outs,
|
||||
DebugLoc dl, SelectionDAG &DAG) {
|
||||
MachineFunction &MF = DAG.getMachineFunction();
|
||||
X86MachineFunctionInfo *FuncInfo = MF.getInfo<X86MachineFunctionInfo>();
|
||||
|
||||
SmallVector<CCValAssign, 16> RVLocs;
|
||||
CCState CCInfo(CallConv, isVarArg, getTargetMachine(),
|
||||
|
@ -1221,7 +1223,8 @@ X86TargetLowering::LowerReturn(SDValue Chain,
|
|||
SmallVector<SDValue, 6> RetOps;
|
||||
RetOps.push_back(Chain); // Operand #0 = Chain (updated below)
|
||||
// Operand #1 = Bytes To Pop
|
||||
RetOps.push_back(DAG.getTargetConstant(getBytesToPopOnReturn(), MVT::i16));
|
||||
RetOps.push_back(DAG.getTargetConstant(FuncInfo->getBytesToPopOnReturn(),
|
||||
MVT::i16));
|
||||
|
||||
// Copy the result values into the output registers.
|
||||
for (unsigned i = 0; i != RVLocs.size(); ++i) {
|
||||
|
@ -1617,7 +1620,8 @@ X86TargetLowering::LowerFormalArguments(SDValue Chain,
|
|||
// the start of the first vararg value... for expansion of llvm.va_start.
|
||||
if (isVarArg) {
|
||||
if (Is64Bit || CallConv != CallingConv::X86_FastCall) {
|
||||
VarArgsFrameIndex = MFI->CreateFixedObject(1, StackSize, true, false);
|
||||
FuncInfo->setVarArgsFrameIndex(MFI->CreateFixedObject(1, StackSize,
|
||||
true, false));
|
||||
}
|
||||
if (Is64Bit) {
|
||||
unsigned TotalNumIntRegs = 0, TotalNumXMMRegs = 0;
|
||||
|
@ -1665,16 +1669,17 @@ X86TargetLowering::LowerFormalArguments(SDValue Chain,
|
|||
// For X86-64, if there are vararg parameters that are passed via
|
||||
// registers, then we must store them to their spots on the stack so they
|
||||
// may be loaded by deferencing the result of va_next.
|
||||
VarArgsGPOffset = NumIntRegs * 8;
|
||||
VarArgsFPOffset = TotalNumIntRegs * 8 + NumXMMRegs * 16;
|
||||
RegSaveFrameIndex = MFI->CreateStackObject(TotalNumIntRegs * 8 +
|
||||
TotalNumXMMRegs * 16, 16,
|
||||
false);
|
||||
FuncInfo->setVarArgsGPOffset(NumIntRegs * 8);
|
||||
FuncInfo->setVarArgsFPOffset(TotalNumIntRegs * 8 + NumXMMRegs * 16);
|
||||
FuncInfo->setRegSaveFrameIndex(
|
||||
MFI->CreateStackObject(TotalNumIntRegs * 8 + TotalNumXMMRegs * 16, 16,
|
||||
false));
|
||||
|
||||
// Store the integer parameter registers.
|
||||
SmallVector<SDValue, 8> MemOps;
|
||||
SDValue RSFIN = DAG.getFrameIndex(RegSaveFrameIndex, getPointerTy());
|
||||
unsigned Offset = VarArgsGPOffset;
|
||||
SDValue RSFIN = DAG.getFrameIndex(FuncInfo->getRegSaveFrameIndex(),
|
||||
getPointerTy());
|
||||
unsigned Offset = FuncInfo->getVarArgsGPOffset();
|
||||
for (; NumIntRegs != TotalNumIntRegs; ++NumIntRegs) {
|
||||
SDValue FIN = DAG.getNode(ISD::ADD, dl, getPointerTy(), RSFIN,
|
||||
DAG.getIntPtrConstant(Offset));
|
||||
|
@ -1683,7 +1688,8 @@ X86TargetLowering::LowerFormalArguments(SDValue Chain,
|
|||
SDValue Val = DAG.getCopyFromReg(Chain, dl, VReg, MVT::i64);
|
||||
SDValue Store =
|
||||
DAG.getStore(Val.getValue(1), dl, Val, FIN,
|
||||
PseudoSourceValue::getFixedStack(RegSaveFrameIndex),
|
||||
PseudoSourceValue::getFixedStack(
|
||||
FuncInfo->getRegSaveFrameIndex()),
|
||||
Offset, false, false, 0);
|
||||
MemOps.push_back(Store);
|
||||
Offset += 8;
|
||||
|
@ -1698,8 +1704,10 @@ X86TargetLowering::LowerFormalArguments(SDValue Chain,
|
|||
SDValue ALVal = DAG.getCopyFromReg(DAG.getEntryNode(), dl, AL, MVT::i8);
|
||||
SaveXMMOps.push_back(ALVal);
|
||||
|
||||
SaveXMMOps.push_back(DAG.getIntPtrConstant(RegSaveFrameIndex));
|
||||
SaveXMMOps.push_back(DAG.getIntPtrConstant(VarArgsFPOffset));
|
||||
SaveXMMOps.push_back(DAG.getIntPtrConstant(
|
||||
FuncInfo->getRegSaveFrameIndex()));
|
||||
SaveXMMOps.push_back(DAG.getIntPtrConstant(
|
||||
FuncInfo->getVarArgsFPOffset()));
|
||||
|
||||
for (; NumXMMRegs != TotalNumXMMRegs; ++NumXMMRegs) {
|
||||
unsigned VReg = MF.addLiveIn(XMMArgRegs[NumXMMRegs],
|
||||
|
@ -1720,22 +1728,22 @@ X86TargetLowering::LowerFormalArguments(SDValue Chain,
|
|||
|
||||
// Some CCs need callee pop.
|
||||
if (IsCalleePop(isVarArg, CallConv)) {
|
||||
BytesToPopOnReturn = StackSize; // Callee pops everything.
|
||||
FuncInfo->setBytesToPopOnReturn(StackSize); // Callee pops everything.
|
||||
} else {
|
||||
BytesToPopOnReturn = 0; // Callee pops nothing.
|
||||
FuncInfo->setBytesToPopOnReturn(0); // Callee pops nothing.
|
||||
// If this is an sret function, the return should pop the hidden pointer.
|
||||
if (!Is64Bit && !IsTailCallConvention(CallConv) && ArgsAreStructReturn(Ins))
|
||||
BytesToPopOnReturn = 4;
|
||||
FuncInfo->setBytesToPopOnReturn(4);
|
||||
}
|
||||
|
||||
if (!Is64Bit) {
|
||||
RegSaveFrameIndex = 0xAAAAAAA; // RegSaveFrameIndex is X86-64 only.
|
||||
// RegSaveFrameIndex is X86-64 only.
|
||||
FuncInfo->setRegSaveFrameIndex(0xAAAAAAA);
|
||||
if (CallConv == CallingConv::X86_FastCall)
|
||||
VarArgsFrameIndex = 0xAAAAAAA; // fastcc functions can't have varargs.
|
||||
// fastcc functions can't have varargs.
|
||||
FuncInfo->setVarArgsFrameIndex(0xAAAAAAA);
|
||||
}
|
||||
|
||||
FuncInfo->setBytesToPopOnReturn(BytesToPopOnReturn);
|
||||
|
||||
return Chain;
|
||||
}
|
||||
|
||||
|
@ -6776,13 +6784,17 @@ X86TargetLowering::EmitTargetCodeForMemcpy(SelectionDAG &DAG, DebugLoc dl,
|
|||
}
|
||||
|
||||
SDValue X86TargetLowering::LowerVASTART(SDValue Op, SelectionDAG &DAG) {
|
||||
MachineFunction &MF = DAG.getMachineFunction();
|
||||
X86MachineFunctionInfo *FuncInfo = MF.getInfo<X86MachineFunctionInfo>();
|
||||
|
||||
const Value *SV = cast<SrcValueSDNode>(Op.getOperand(2))->getValue();
|
||||
DebugLoc dl = Op.getDebugLoc();
|
||||
|
||||
if (!Subtarget->is64Bit()) {
|
||||
// vastart just stores the address of the VarArgsFrameIndex slot into the
|
||||
// memory location argument.
|
||||
SDValue FR = DAG.getFrameIndex(VarArgsFrameIndex, getPointerTy());
|
||||
SDValue FR = DAG.getFrameIndex(FuncInfo->getVarArgsFrameIndex(),
|
||||
getPointerTy());
|
||||
return DAG.getStore(Op.getOperand(0), dl, FR, Op.getOperand(1), SV, 0,
|
||||
false, false, 0);
|
||||
}
|
||||
|
@ -6796,7 +6808,8 @@ SDValue X86TargetLowering::LowerVASTART(SDValue Op, SelectionDAG &DAG) {
|
|||
SDValue FIN = Op.getOperand(1);
|
||||
// Store gp_offset
|
||||
SDValue Store = DAG.getStore(Op.getOperand(0), dl,
|
||||
DAG.getConstant(VarArgsGPOffset, MVT::i32),
|
||||
DAG.getConstant(FuncInfo->getVarArgsGPOffset(),
|
||||
MVT::i32),
|
||||
FIN, SV, 0, false, false, 0);
|
||||
MemOps.push_back(Store);
|
||||
|
||||
|
@ -6804,14 +6817,16 @@ SDValue X86TargetLowering::LowerVASTART(SDValue Op, SelectionDAG &DAG) {
|
|||
FIN = DAG.getNode(ISD::ADD, dl, getPointerTy(),
|
||||
FIN, DAG.getIntPtrConstant(4));
|
||||
Store = DAG.getStore(Op.getOperand(0), dl,
|
||||
DAG.getConstant(VarArgsFPOffset, MVT::i32),
|
||||
DAG.getConstant(FuncInfo->getVarArgsFPOffset(),
|
||||
MVT::i32),
|
||||
FIN, SV, 0, false, false, 0);
|
||||
MemOps.push_back(Store);
|
||||
|
||||
// Store ptr to overflow_arg_area
|
||||
FIN = DAG.getNode(ISD::ADD, dl, getPointerTy(),
|
||||
FIN, DAG.getIntPtrConstant(4));
|
||||
SDValue OVFIN = DAG.getFrameIndex(VarArgsFrameIndex, getPointerTy());
|
||||
SDValue OVFIN = DAG.getFrameIndex(FuncInfo->getVarArgsFrameIndex(),
|
||||
getPointerTy());
|
||||
Store = DAG.getStore(Op.getOperand(0), dl, OVFIN, FIN, SV, 0,
|
||||
false, false, 0);
|
||||
MemOps.push_back(Store);
|
||||
|
@ -6819,7 +6834,8 @@ SDValue X86TargetLowering::LowerVASTART(SDValue Op, SelectionDAG &DAG) {
|
|||
// Store ptr to reg_save_area.
|
||||
FIN = DAG.getNode(ISD::ADD, dl, getPointerTy(),
|
||||
FIN, DAG.getIntPtrConstant(8));
|
||||
SDValue RSFIN = DAG.getFrameIndex(RegSaveFrameIndex, getPointerTy());
|
||||
SDValue RSFIN = DAG.getFrameIndex(FuncInfo->getRegSaveFrameIndex(),
|
||||
getPointerTy());
|
||||
Store = DAG.getStore(Op.getOperand(0), dl, RSFIN, FIN, SV, 0,
|
||||
false, false, 0);
|
||||
MemOps.push_back(Store);
|
||||
|
|
|
@ -374,12 +374,6 @@ namespace llvm {
|
|||
//===--------------------------------------------------------------------===//
|
||||
// X86TargetLowering - X86 Implementation of the TargetLowering interface
|
||||
class X86TargetLowering : public TargetLowering {
|
||||
int VarArgsFrameIndex; // FrameIndex for start of varargs area.
|
||||
int RegSaveFrameIndex; // X86-64 vararg func register save area.
|
||||
unsigned VarArgsGPOffset; // X86-64 vararg func int reg offset.
|
||||
unsigned VarArgsFPOffset; // X86-64 vararg func fp reg offset.
|
||||
int BytesToPopOnReturn; // Number of arg bytes ret should pop.
|
||||
|
||||
public:
|
||||
explicit X86TargetLowering(X86TargetMachine &TM);
|
||||
|
||||
|
@ -401,11 +395,6 @@ namespace llvm {
|
|||
getPICJumpTableRelocBaseExpr(const MachineFunction *MF,
|
||||
unsigned JTI, MCContext &Ctx) const;
|
||||
|
||||
// Return the number of bytes that a function should pop when it returns (in
|
||||
// addition to the space used by the return address).
|
||||
//
|
||||
unsigned getBytesToPopOnReturn() const { return BytesToPopOnReturn; }
|
||||
|
||||
/// getStackPtrReg - Return the stack pointer register we are using: either
|
||||
/// ESP or RSP.
|
||||
unsigned getStackPtrReg() const { return X86StackPtr; }
|
||||
|
|
|
@ -31,7 +31,8 @@ class X86MachineFunctionInfo : public MachineFunctionInfo {
|
|||
/// stack frame in bytes.
|
||||
unsigned CalleeSavedFrameSize;
|
||||
|
||||
/// BytesToPopOnReturn - Number of bytes function pops on return.
|
||||
/// BytesToPopOnReturn - Number of bytes function pops on return (in addition
|
||||
/// to the space used by the return address).
|
||||
/// Used on windows platform for stdcall & fastcall name decoration
|
||||
unsigned BytesToPopOnReturn;
|
||||
|
||||
|
@ -56,6 +57,15 @@ class X86MachineFunctionInfo : public MachineFunctionInfo {
|
|||
/// when allocating, even if there may not actually be a frame pointer used.
|
||||
bool ReserveFP;
|
||||
|
||||
/// VarArgsFrameIndex - FrameIndex for start of varargs area.
|
||||
int VarArgsFrameIndex;
|
||||
/// RegSaveFrameIndex - X86-64 vararg func register save area.
|
||||
int RegSaveFrameIndex;
|
||||
/// VarArgsGPOffset - X86-64 vararg func int reg offset.
|
||||
unsigned VarArgsGPOffset;
|
||||
/// VarArgsFPOffset - X86-64 vararg func fp reg offset.
|
||||
unsigned VarArgsFPOffset;
|
||||
|
||||
public:
|
||||
X86MachineFunctionInfo() : ForceFramePointer(false),
|
||||
CalleeSavedFrameSize(0),
|
||||
|
@ -63,7 +73,11 @@ public:
|
|||
ReturnAddrIndex(0),
|
||||
TailCallReturnAddrDelta(0),
|
||||
SRetReturnReg(0),
|
||||
GlobalBaseReg(0) {}
|
||||
GlobalBaseReg(0),
|
||||
VarArgsFrameIndex(0),
|
||||
RegSaveFrameIndex(0),
|
||||
VarArgsGPOffset(0),
|
||||
VarArgsFPOffset(0) {}
|
||||
|
||||
explicit X86MachineFunctionInfo(MachineFunction &MF)
|
||||
: ForceFramePointer(false),
|
||||
|
@ -73,7 +87,11 @@ public:
|
|||
TailCallReturnAddrDelta(0),
|
||||
SRetReturnReg(0),
|
||||
GlobalBaseReg(0),
|
||||
ReserveFP(false) {}
|
||||
ReserveFP(false),
|
||||
VarArgsFrameIndex(0),
|
||||
RegSaveFrameIndex(0),
|
||||
VarArgsGPOffset(0),
|
||||
VarArgsFPOffset(0) {}
|
||||
|
||||
bool getForceFramePointer() const { return ForceFramePointer;}
|
||||
void setForceFramePointer(bool forceFP) { ForceFramePointer = forceFP; }
|
||||
|
@ -98,6 +116,18 @@ public:
|
|||
|
||||
bool getReserveFP() const { return ReserveFP; }
|
||||
void setReserveFP(bool reserveFP) { ReserveFP = reserveFP; }
|
||||
|
||||
int getVarArgsFrameIndex() const { return VarArgsFrameIndex; }
|
||||
void setVarArgsFrameIndex(int Idx) { VarArgsFrameIndex = Idx; }
|
||||
|
||||
int getRegSaveFrameIndex() const { return RegSaveFrameIndex; }
|
||||
void setRegSaveFrameIndex(int Idx) { RegSaveFrameIndex = Idx; }
|
||||
|
||||
unsigned getVarArgsGPOffset() const { return VarArgsGPOffset; }
|
||||
void setVarArgsGPOffset(unsigned Offset) { VarArgsGPOffset = Offset; }
|
||||
|
||||
unsigned getVarArgsFPOffset() const { return VarArgsFPOffset; }
|
||||
void setVarArgsFPOffset(unsigned Offset) { VarArgsFPOffset = Offset; }
|
||||
};
|
||||
|
||||
} // End llvm namespace
|
||||
|
|
Loading…
Reference in New Issue