1 //==- AArch64FrameLowering.h - Define frame lowering for AArch64 -*- C++ -*--=// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 // 10 // This class implements the AArch64-specific parts of the TargetFrameLowering 11 // class. 12 // 13 //===----------------------------------------------------------------------===// 14 15 #ifndef LLVM_AARCH64_FRAMEINFO_H 16 #define LLVM_AARCH64_FRAMEINFO_H 17 18 #include "AArch64Subtarget.h" 19 #include "llvm/Target/TargetFrameLowering.h" 20 21 namespace llvm { 22 class AArch64Subtarget; 23 24 class AArch64FrameLowering : public TargetFrameLowering { 25 private: 26 // In order to unify the spilling and restoring of callee-saved registers into 27 // emitFrameMemOps, we need to be able to specify which instructions to use 28 // for the relevant memory operations on each register class. An array of the 29 // following struct is populated and passed in to achieve this. 30 struct LoadStoreMethod { 31 const TargetRegisterClass *RegClass; // E.g. GPR64RegClass 32 33 // The preferred instruction. 34 unsigned PairOpcode; // E.g. LSPair64_STR 35 36 // Sometimes only a single register can be handled at once. 37 unsigned SingleOpcode; // E.g. LS64_STR 38 }; 39 protected: 40 const AArch64Subtarget &STI; 41 42 public: 43 explicit AArch64FrameLowering(const AArch64Subtarget &sti) 44 : TargetFrameLowering(TargetFrameLowering::StackGrowsDown, 16, 0, 16), 45 STI(sti) { 46 } 47 48 /// emitProlog/emitEpilog - These methods insert prolog and epilog code into 49 /// the function. 50 virtual void emitPrologue(MachineFunction &MF) const; 51 virtual void emitEpilogue(MachineFunction &MF, MachineBasicBlock &MBB) const; 52 53 /// Decides how much stack adjustment to perform in each phase of the prologue 54 /// and epilogue. 55 void splitSPAdjustments(uint64_t Total, uint64_t &Initial, 56 uint64_t &Residual) const; 57 58 int64_t resolveFrameIndexReference(MachineFunction &MF, int FrameIndex, 59 unsigned &FrameReg, int SPAdj, 60 bool IsCalleeSaveOp) const; 61 62 virtual void processFunctionBeforeCalleeSavedScan(MachineFunction &MF, 63 RegScavenger *RS) const; 64 65 virtual bool spillCalleeSavedRegisters(MachineBasicBlock &MBB, 66 MachineBasicBlock::iterator MI, 67 const std::vector<CalleeSavedInfo> &CSI, 68 const TargetRegisterInfo *TRI) const; 69 virtual bool restoreCalleeSavedRegisters(MachineBasicBlock &MBB, 70 MachineBasicBlock::iterator MI, 71 const std::vector<CalleeSavedInfo> &CSI, 72 const TargetRegisterInfo *TRI) const; 73 74 void eliminateCallFramePseudoInstr(MachineFunction &MF, 75 MachineBasicBlock &MBB, 76 MachineBasicBlock::iterator MI) const; 77 78 /// If the register is X30 (i.e. LR) and the return address is used in the 79 /// function then the callee-save store doesn't actually kill the register, 80 /// otherwise it does. 81 bool determinePrologueDeath(MachineBasicBlock &MBB, unsigned Reg) const; 82 83 /// This function emits the loads or stores required during prologue and 84 /// epilogue as efficiently as possible. 85 /// 86 /// The operations involved in setting up and tearing down the frame are 87 /// similar enough to warrant a shared function, particularly as discrepancies 88 /// between the two would be disastrous. 89 void emitFrameMemOps(bool isStore, MachineBasicBlock &MBB, 90 MachineBasicBlock::iterator MI, 91 const std::vector<CalleeSavedInfo> &CSI, 92 const TargetRegisterInfo *TRI, 93 const LoadStoreMethod PossibleClasses[], 94 unsigned NumClasses) const; 95 96 97 virtual bool hasFP(const MachineFunction &MF) const; 98 99 virtual bool useFPForAddressing(const MachineFunction &MF) const; 100 101 /// On AA 102 virtual bool hasReservedCallFrame(const MachineFunction &MF) const; 103 104 }; 105 106 } // End llvm namespace 107 108 #endif 109