29#define UNITS_PER_WORD 4
30#define MIN_FRAME_SIZE (8 * UNITS_PER_WORD)
35 STI(STI), TII(*STI.getInstrInfo()), TRI(STI.getRegisterInfo()) {}
44 assert(&
MBB == &MF.
front() &&
"Shrink-wrapping not yet implemented");
55 uint64_t PrevStackSize = StackSize;
58 StackSize += (16 - StackSize) & 0xf;
60 if (STI.isWindowedABI()) {
63 if (MaxAlignment > 32)
64 StackSize += MaxAlignment;
66 if (StackSize <= 32760) {
91 if (MaxAlignment > 32) {
92 TII.loadImmediate(
MBB,
MBBI, &RegMisAlign, MaxAlignment - 1);
93 TII.loadImmediate(
MBB,
MBBI, &Reg, MaxAlignment);
140 TII.adjustStackPtr(SP, -StackSize,
MBB,
MBBI);
156 for (
unsigned i = 0, e = CSI.size(); i < e; ++i) {
159 int FI = Info.getFrameIdx();
163 bool IsStoreInst =
false;
164 if (
MBBI->getOpcode() == TargetOpcode::COPY && Info.isSpilledToReg()) {
167 IsStoreInst = Info.getDstReg() == DstReg.
asMCReg() &&
168 Info.getReg() == Reg.asMCReg();
171 IsStoreInst = Reg.asMCReg() == Info.getReg() && StoreFI == FI;
174 "Unexpected callee-saved register store instruction");
181 for (
const auto &
I : CSI) {
209 if (StackSize != PrevStackSize) {
243 for (
unsigned i = 0, e = CSI.size(); i < e; ++i) {
247 int FI = Info.getFrameIdx();
251 bool IsRestoreInst =
false;
252 if (
I->getOpcode() == TargetOpcode::COPY && Info.isSpilledToReg()) {
253 Register Reg =
I->getOperand(0).getReg();
254 Register DstReg =
I->getOperand(1).getReg();
255 IsRestoreInst = Info.getDstReg() == DstReg.
asMCReg() &&
256 Info.getReg() == Reg.asMCReg();
258 Register Reg = TII.isLoadFromStackSlot(*
I, LoadFI);
259 IsRestoreInst = Info.getReg() == Reg.asMCReg() && LoadFI == FI;
262 "Unexpected callee-saved register restore instruction");
265 if (STI.isWindowedABI()) {
278 if (STI.isWindowedABI())
288 TII.adjustStackPtr(SP, StackSize,
MBB,
MBBI);
297 if (STI.isWindowedABI())
300 for (
unsigned i = 0, e = CSI.
size(); i != e; ++i) {
307 bool IsA0AndRetAddrIsTaken =
309 if (!IsA0AndRetAddrIsTaken)
313 bool IsKill = !IsA0AndRetAddrIsTaken;
315 TII.storeRegToStackSlot(EntryBlock,
MI, Reg, IsKill, CSI[i].getFrameIdx(),
325 if (STI.isWindowedABI())
335 int64_t Amount =
I->getOperand(0).getImm();
337 if (
I->getOpcode() == Xtensa::ADJCALLSTACKDOWN)
340 TII.adjustStackPtr(Xtensa::SP, Amount,
MBB,
I);
351 if (STI.isWindowedABI()) {
368 unsigned ScavSlotsNum = 0;
376 ScavSlotsNum = std::max(ScavSlotsNum, 1u);
379 unsigned Size = TRI->getSpillSize(RC);
380 Align Alignment = TRI->getSpillAlign(RC);
381 for (
unsigned I = 0;
I < ScavSlotsNum;
I++) {
383 RS->addScavengingFrameIndex(FI);
385 if (IsLargeFunction &&
386 XtensaFI->getBranchRelaxationScratchFrameIndex() == -1)
387 XtensaFI->setBranchRelaxationScratchFrameIndex(FI);
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
MachineBasicBlock MachineBasicBlock::iterator MBBI
Promote Memory to Register
This file declares the machine register scavenger class.
Represent a constant reference to an array (0 or more elements consecutively in memory),...
size_t size() const
Get the array size.
BitVector & set()
Set all bits in the bitvector.
The CalleeSavedInfo class tracks the information need to locate where a callee saved register is in t...
static MCCFIInstruction createDefCfaRegister(MCSymbol *L, unsigned Register, SMLoc Loc={})
.cfi_def_cfa_register modifies a rule for computing CFA.
static MCCFIInstruction cfiDefCfa(MCSymbol *L, unsigned Register, int64_t Offset, SMLoc Loc={})
.cfi_def_cfa defines a rule for computing CFA as: take address from Register and add Offset to it.
static MCCFIInstruction createOffset(MCSymbol *L, unsigned Register, int64_t Offset, SMLoc Loc={})
.cfi_offset Previous value of Register is saved at offset Offset from CFA.
static MCCFIInstruction cfiDefCfaOffset(MCSymbol *L, int64_t Offset, SMLoc Loc={})
.cfi_def_cfa_offset modifies a rule for computing CFA.
const MCRegisterInfo * getRegisterInfo() const
MCRegisterInfo base class - We assume that the target defines a static array of MCRegisterDesc object...
virtual int64_t getDwarfRegNum(MCRegister Reg, bool isEH) const
Map a target register to an equivalent dwarf register number.
Wrapper class representing physical registers. Should be passed by value.
void addLiveIn(MCRegister PhysReg, LaneBitmask LaneMask=LaneBitmask::getAll())
Adds the specified register as a live in.
MachineInstrBundleIterator< MachineInstr > iterator
The MachineFrameInfo class represents an abstract stack frame until prolog/epilog code is inserted.
bool hasVarSizedObjects() const
This method may be called any time after instruction selection is complete to determine if the stack ...
uint64_t getStackSize() const
Return the number of bytes that must be allocated to hold all of the fixed size frame objects.
bool adjustsStack() const
Return true if this function adjusts the stack – e.g., when calling another function.
bool isReturnAddressTaken() const
This method may be called any time after instruction selection is complete to determine if there is a...
Align getMaxAlign() const
Return alignment of this function's frame.
void setObjectOffset(int ObjectIdx, int64_t SPOffset)
Set the stack frame offset of the specified object.
LLVM_ABI uint64_t estimateStackSize(const MachineFunction &MF) const
Estimate and return the size of the stack frame.
LLVM_ABI int CreateSpillStackObject(uint64_t Size, Align Alignment, TargetStackID::Value StackID=TargetStackID::Default)
Create a new statically sized stack object that represents a spill slot, returning a nonnegative iden...
const std::vector< CalleeSavedInfo > & getCalleeSavedInfo() const
Returns a reference to call saved info vector for the current function.
int getObjectIndexEnd() const
Return one past the maximum frame object index.
int64_t getObjectOffset(int ObjectIdx) const
Return the assigned stack offset of the specified object from the incoming stack pointer.
void setStackSize(uint64_t Size)
Set the size of the stack.
int getObjectIndexBegin() const
Return the minimum frame object index.
bool isDeadObjectIndex(int ObjectIdx) const
Returns true if the specified index corresponds to a dead object.
unsigned addFrameInst(const MCCFIInstruction &Inst)
MachineFrameInfo & getFrameInfo()
getFrameInfo - Return the frame info object for the current function.
MCContext & getContext() const
LLVM_ABI bool disableFramePointerElim() const
Returns true if frame pointer elimination should be disabled for this function.
Ty * getInfo()
getInfo - Keep track of various per-function pieces of information for backends that would like to do...
const MachineBasicBlock & front() const
int64_t estimateFunctionSizeInBytes()
Return an estimate of the function's code size, taking into account block and function alignment.
const MachineInstrBuilder & addCFIIndex(unsigned CFIIndex) const
const MachineInstrBuilder & addReg(Register RegNo, RegState Flags={}, unsigned SubReg=0) const
Add a new virtual register operand.
const MachineInstrBuilder & setMIFlag(MachineInstr::MIFlag Flag) const
const MachineInstrBuilder & addImm(int64_t Val) const
Add a new immediate operand.
Represent a mutable reference to an array (0 or more elements consecutively in memory),...
Wrapper class representing virtual and physical registers.
MCRegister asMCReg() const
Utility to check-convert this value to a MCRegister.
bool hasFP(const MachineFunction &MF) const
hasFP - Return true if the specified function should have a dedicated frame pointer register.
virtual bool hasReservedCallFrame(const MachineFunction &MF) const
hasReservedCallFrame - Under normal circumstances, when a frame pointer is not required,...
virtual void determineCalleeSaves(MachineFunction &MF, BitVector &SavedRegs, RegScavenger *RS=nullptr) const
This method determines which of the registers reported by TargetRegisterInfo::getCalleeSavedRegs() sh...
TargetFrameLowering(StackDirection D, Align StackAl, int LAO, Align TransAl=Align(1), bool StackReal=true)
virtual bool restoreCalleeSavedRegisters(MachineBasicBlock &MBB, MachineBasicBlock::iterator MI, MutableArrayRef< CalleeSavedInfo > CSI, const TargetRegisterInfo *TRI) const
restoreCalleeSavedRegisters - Issues instruction(s) to restore all callee saved registers and returns...
TargetRegisterInfo base class - We assume that the target defines a static array of TargetRegisterDes...
void emitEpilogue(MachineFunction &MF, MachineBasicBlock &MBB) const override
void processFunctionBeforeFrameFinalized(MachineFunction &MF, RegScavenger *RS) const override
processFunctionBeforeFrameFinalized - This method is called immediately before the specified function...
bool hasFPImpl(const MachineFunction &MF) const override
bool restoreCalleeSavedRegisters(MachineBasicBlock &MBB, MachineBasicBlock::iterator MI, MutableArrayRef< CalleeSavedInfo > CSI, const TargetRegisterInfo *TRI) const override
restoreCalleeSavedRegisters - Issues instruction(s) to restore all callee saved registers and returns...
void emitPrologue(MachineFunction &, MachineBasicBlock &) const override
emitProlog/emitEpilog - These methods insert prolog and epilog code into the function.
XtensaFrameLowering(const XtensaSubtarget &STI)
bool spillCalleeSavedRegisters(MachineBasicBlock &MBB, MachineBasicBlock::iterator MI, ArrayRef< CalleeSavedInfo > CSI, const TargetRegisterInfo *TRI) const override
spillCalleeSavedRegisters - Issues instruction(s) to spill all callee saved registers and returns tru...
MachineBasicBlock::iterator eliminateCallFramePseudoInstr(MachineFunction &MF, MachineBasicBlock &MBB, MachineBasicBlock::iterator I) const override
This method is called during prolog/epilog code insertion to eliminate call frame setup and destroy p...
void determineCalleeSaves(MachineFunction &MF, BitVector &SavedRegs, RegScavenger *RS) const override
This method determines which of the registers reported by TargetRegisterInfo::getCalleeSavedRegs() sh...
bool isSaveFrameRegister() const
This is an optimization pass for GlobalISel generic memory operations.
MachineInstrBuilder BuildMI(MachineFunction &MF, const MIMetadata &MIMD, const MCInstrDesc &MCID)
Builder interface. Specify how to create the initial instruction itself.
constexpr bool isInt(int64_t x)
Checks if an integer fits into the given bit width.
@ Kill
The last use of a register.
@ Define
Register definition.
MCRegisterClass TargetRegisterClass
This struct is a compact representation of a valid (non-zero power of two) alignment.
constexpr uint64_t value() const
This is a hole in the type system and should not be abused.