30 if (CFSize >= ((1 << 8) - 1) * 4 / 2)
66 Amount = (Amount+Align-1)/Align*Align;
70 if (Opc == ARM::ADJCALLSTACKDOWN || Opc == ARM::tADJCALLSTACKDOWN) {
73 assert(Opc == ARM::ADJCALLSTACKUP || Opc == ARM::tADJCALLSTACKUP);
96 unsigned FramePtr = RegInfo->getFrameRegister(MF);
97 unsigned BasePtr = RegInfo->getBaseRegister();
100 NumBytes = (NumBytes + 3) & ~3;
105 unsigned GPRCS1Size = 0, GPRCS2Size = 0, DPRCSSize = 0;
106 int FramePtrSpillFI = 0;
109 emitSPUpdate(MBB, MBBI, TII, dl, *RegInfo, -ArgRegsSaveSize,
119 for (
unsigned i = 0, e = CSI.size(); i != e; ++i) {
120 unsigned Reg = CSI[i].getReg();
121 int FI = CSI[i].getFrameIdx();
129 FramePtrSpillFI = FI;
137 FramePtrSpillFI = FI;
148 if (MBBI != MBB.
end() && MBBI->getOpcode() == ARM::tPUSH) {
150 if (MBBI != MBB.
end())
151 dl = MBBI->getDebugLoc();
155 unsigned DPRCSOffset = NumBytes - (GPRCS1Size + GPRCS2Size + DPRCSSize);
156 unsigned GPRCS2Offset = DPRCSOffset + DPRCSSize;
157 unsigned GPRCS1Offset = GPRCS2Offset + GPRCS2Size;
158 bool HasFP =
hasFP(MF);
165 NumBytes = DPRCSOffset;
167 int FramePtrOffsetInBlock = 0;
169 FramePtrOffsetInBlock = NumBytes;
175 FramePtrOffsetInBlock += MFI->
getObjectOffset(FramePtrSpillFI) + GPRCS1Size;
177 .addReg(ARM::SP).
addImm(FramePtrOffsetInBlock / 4)
200 if (RegInfo->needsStackRealignment(MF))
207 if (RegInfo->hasBasePointer(MF))
219 for (
unsigned i = 0; CSRegs[i]; ++i)
220 if (Reg == CSRegs[i])
244 assert((MBBI->getOpcode() == ARM::tBX_RET ||
245 MBBI->getOpcode() == ARM::tPOP_RET) &&
246 "Can only insert epilog into returning blocks");
258 const uint16_t *CSRegs = RegInfo->getCalleeSavedRegs();
259 unsigned FramePtr = RegInfo->getFrameRegister(MF);
266 if (MBBI != MBB.
begin()) {
286 "No scratch register to restore SP from FP!");
297 if (MBBI->getOpcode() == ARM::tBX_RET &&
298 &MBB.
front() != MBBI &&
299 prior(MBBI)->getOpcode() == ARM::tPOP) {
308 if (ArgRegsSaveSize) {
321 emitSPUpdate(MBB, MBBI, TII, dl, *RegInfo, ArgRegsSaveSize);
324 BuildMI(MBB, MBBI, dl, TII.get(ARM::tBX_RET_vararg))
336 const std::vector<CalleeSavedInfo> &CSI,
345 if (MI != MBB.
end()) DL = MI->getDebugLoc();
349 for (
unsigned i = CSI.size(); i != 0; --i) {
350 unsigned Reg = CSI[i-1].getReg();
356 if (Reg == ARM::LR) {
375 const std::vector<CalleeSavedInfo> &CSI,
389 bool NumRegs =
false;
390 for (
unsigned i = CSI.size(); i != 0; --i) {
391 unsigned Reg = CSI[i-1].getReg();
392 if (Reg == ARM::LR) {
397 (*MIB).setDesc(TII.get(ARM::tPOP_RET));
unsigned getStackAlignment() const
const MachineFunction * getParent() const
instr_iterator erase(instr_iterator I)
bool spillCalleeSavedRegisters(MachineBasicBlock &MBB, MachineBasicBlock::iterator MI, const std::vector< CalleeSavedInfo > &CSI, const TargetRegisterInfo *TRI) const
void addLiveIn(unsigned Reg)
bool isReturnAddressTaken() const
void eliminateCallFramePseudoInstr(MachineFunction &MF, MachineBasicBlock &MBB, MachineBasicBlock::iterator MI) const
static bool isCalleeSavedRegister(unsigned Reg, const uint16_t *CSRegs)
void setGPRCalleeSavedArea2Offset(unsigned o)
LLVM_ATTRIBUTE_NORETURN void report_fatal_error(const char *reason, bool gen_crash_diag=true)
unsigned getDPRCalleeSavedAreaSize() const
const std::vector< CalleeSavedInfo > & getCalleeSavedInfo() const
void emitPrologue(MachineFunction &MF) const
uint64_t getStackSize() const
static const MachineInstrBuilder & AddDefaultPred(const MachineInstrBuilder &MIB)
const HexagonInstrInfo * TII
static bool isCSRestore(MachineInstr *MI, const uint16_t *CSRegs)
bool tryFoldSPUpdateIntoPushPop(MachineFunction &MF, MachineInstr *MI, unsigned NumBytes)
Abstract Stack Frame Information.
void setDPRCalleeSavedAreaOffset(unsigned o)
const MachineInstrBuilder & addImm(int64_t Val) const
unsigned getNumOperands() const
void setFramePtrSpillOffset(unsigned o)
const MachineBasicBlock & front() const
bool isFI() const
isFI - Tests if this is a MO_FrameIndex operand.
bool isLiveIn(unsigned Reg) const
int getOffsetAdjustment() const
void setShouldRestoreSPFromFP(bool s)
iterator getLastNonDebugInstr()
unsigned getKillRegState(bool B)
unsigned getDefRegState(bool B)
bundle_iterator< MachineInstr, instr_iterator > iterator
void emitSPUpdate(MachineBasicBlock &MBB, MachineBasicBlock::iterator MI, DebugLoc dl, const TargetInstrInfo &TII, unsigned ScratchReg, int64_t NumBytes, MachineInstr::MIFlag MIFlags=MachineInstr::NoFlags)
bool hasStackFrame() const
void setStackSize(uint64_t Size)
const MachineOperand & getOperand(unsigned i) const
unsigned getFramePtrSpillOffset() const
void emitThumbRegPlusImmediate(MachineBasicBlock &MBB, MachineBasicBlock::iterator &MBBI, DebugLoc dl, unsigned DestReg, unsigned BaseReg, int NumBytes, const TargetInstrInfo &TII, const ARMBaseRegisterInfo &MRI, unsigned MIFlags=0)
const MachineInstrBuilder & setMIFlags(unsigned Flags) const
void setGPRCalleeSavedArea2Size(unsigned s)
MachineInstrBuilder BuildMI(MachineFunction &MF, DebugLoc DL, const MCInstrDesc &MCID)
void DeleteMachineInstr(MachineInstr *MI)
virtual const TargetFrameLowering * getFrameLowering() const
const MCInstrDesc & get(unsigned Opcode) const
int64_t getObjectOffset(int ObjectIdx) const
virtual const TargetInstrInfo * getInstrInfo() const
void setGPRCalleeSavedArea1Size(unsigned s)
bool restoreCalleeSavedRegisters(MachineBasicBlock &MBB, MachineBasicBlock::iterator MI, const std::vector< CalleeSavedInfo > &CSI, const TargetRegisterInfo *TRI) const
bool hasFP(const MachineFunction &MF) const
unsigned getMaxCallFrameSize() const
void setOffsetAdjustment(int Adj)
MachineFrameInfo * getFrameInfo()
void emitEpilogue(MachineFunction &MF, MachineBasicBlock &MBB) const
static cl::opt< AlignMode > Align(cl::desc("Load/store alignment support"), cl::Hidden, cl::init(DefaultAlign), cl::values(clEnumValN(DefaultAlign,"arm-default-align","Generate unaligned accesses only on hardware/OS ""combinations that are known to support them"), clEnumValN(StrictAlign,"arm-strict-align","Disallow all unaligned memory accesses"), clEnumValN(NoStrictAlign,"arm-no-strict-align","Allow unaligned memory accesses"), clEnumValEnd))
static DebugLoc get(unsigned Line, unsigned Col, MDNode *Scope, MDNode *InlinedAt=0)
void setGPRCalleeSavedArea1Offset(unsigned o)
MachineRegisterInfo & getRegInfo()
const TargetMachine & getTarget() const
void setDPRCalleeSavedAreaSize(unsigned s)
const MachineInstrBuilder & copyImplicitOps(const MachineInstr *OtherMI)
Copy all the implicit operands from OtherMI onto this one.
instr_iterator insert(instr_iterator I, MachineInstr *M)
virtual const TargetRegisterInfo * getRegisterInfo() const
bool hasVarSizedObjects() const
unsigned getReg() const
getReg - Returns the register number.
bool hasReservedCallFrame(const MachineFunction &MF) const
unsigned getGPRCalleeSavedArea1Size() const
bool isPhysRegUsed(unsigned Reg) const
ItTy prior(ItTy it, Dist n)
const MCRegisterInfo & MRI
unsigned getGPRCalleeSavedArea2Size() const
unsigned getArgRegsSaveSize(unsigned Align=0) const
const MachineInstrBuilder & addReg(unsigned RegNo, unsigned flags=0, unsigned SubReg=0) const
DebugLoc getDebugLoc() const
bool shouldRestoreSPFromFP() const