AArch64FrameLowering.h [plain text]
#ifndef LLVM_AARCH64_FRAMEINFO_H
#define LLVM_AARCH64_FRAMEINFO_H
#include "AArch64Subtarget.h"
#include "llvm/Target/TargetFrameLowering.h"
namespace llvm {
class AArch64Subtarget;
class AArch64FrameLowering : public TargetFrameLowering {
private:
struct LoadStoreMethod {
const TargetRegisterClass *RegClass;
unsigned PairOpcode;
unsigned SingleOpcode; };
protected:
const AArch64Subtarget &STI;
public:
explicit AArch64FrameLowering(const AArch64Subtarget &sti)
: TargetFrameLowering(TargetFrameLowering::StackGrowsDown, 16, 0, 16),
STI(sti) {
}
virtual void emitPrologue(MachineFunction &MF) const;
virtual void emitEpilogue(MachineFunction &MF, MachineBasicBlock &MBB) const;
void splitSPAdjustments(uint64_t Total, uint64_t &Initial,
uint64_t &Residual) const;
int64_t resolveFrameIndexReference(MachineFunction &MF, int FrameIndex,
unsigned &FrameReg, int SPAdj,
bool IsCalleeSaveOp) const;
virtual void processFunctionBeforeCalleeSavedScan(MachineFunction &MF,
RegScavenger *RS) const;
virtual bool spillCalleeSavedRegisters(MachineBasicBlock &MBB,
MachineBasicBlock::iterator MI,
const std::vector<CalleeSavedInfo> &CSI,
const TargetRegisterInfo *TRI) const;
virtual bool restoreCalleeSavedRegisters(MachineBasicBlock &MBB,
MachineBasicBlock::iterator MI,
const std::vector<CalleeSavedInfo> &CSI,
const TargetRegisterInfo *TRI) const;
void eliminateCallFramePseudoInstr(MachineFunction &MF,
MachineBasicBlock &MBB,
MachineBasicBlock::iterator MI) const;
bool determinePrologueDeath(MachineBasicBlock &MBB, unsigned Reg) const;
void emitFrameMemOps(bool isStore, MachineBasicBlock &MBB,
MachineBasicBlock::iterator MI,
const std::vector<CalleeSavedInfo> &CSI,
const TargetRegisterInfo *TRI,
const LoadStoreMethod PossibleClasses[],
unsigned NumClasses) const;
virtual bool hasFP(const MachineFunction &MF) const;
virtual bool useFPForAddressing(const MachineFunction &MF) const;
virtual bool hasReservedCallFrame(const MachineFunction &MF) const;
};
}
#endif