1*9880d681SAndroid Build Coastguard Worker //===-- PPCFrameLowering.h - Define frame lowering for PowerPC --*- C++ -*-===// 2*9880d681SAndroid Build Coastguard Worker // 3*9880d681SAndroid Build Coastguard Worker // The LLVM Compiler Infrastructure 4*9880d681SAndroid Build Coastguard Worker // 5*9880d681SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source 6*9880d681SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details. 7*9880d681SAndroid Build Coastguard Worker // 8*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===// 9*9880d681SAndroid Build Coastguard Worker // 10*9880d681SAndroid Build Coastguard Worker // 11*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===// 12*9880d681SAndroid Build Coastguard Worker 13*9880d681SAndroid Build Coastguard Worker #ifndef LLVM_LIB_TARGET_POWERPC_PPCFRAMELOWERING_H 14*9880d681SAndroid Build Coastguard Worker #define LLVM_LIB_TARGET_POWERPC_PPCFRAMELOWERING_H 15*9880d681SAndroid Build Coastguard Worker 16*9880d681SAndroid Build Coastguard Worker #include "PPC.h" 17*9880d681SAndroid Build Coastguard Worker #include "llvm/ADT/STLExtras.h" 18*9880d681SAndroid Build Coastguard Worker #include "llvm/Target/TargetFrameLowering.h" 19*9880d681SAndroid Build Coastguard Worker #include "llvm/Target/TargetMachine.h" 20*9880d681SAndroid Build Coastguard Worker 21*9880d681SAndroid Build Coastguard Worker namespace llvm { 22*9880d681SAndroid Build Coastguard Worker class PPCSubtarget; 23*9880d681SAndroid Build Coastguard Worker 24*9880d681SAndroid Build Coastguard Worker class PPCFrameLowering: public TargetFrameLowering { 25*9880d681SAndroid Build Coastguard Worker const PPCSubtarget &Subtarget; 26*9880d681SAndroid Build Coastguard Worker const unsigned ReturnSaveOffset; 27*9880d681SAndroid Build Coastguard Worker const unsigned TOCSaveOffset; 28*9880d681SAndroid Build Coastguard Worker const unsigned FramePointerSaveOffset; 29*9880d681SAndroid Build Coastguard Worker const unsigned LinkageSize; 30*9880d681SAndroid Build Coastguard Worker const unsigned BasePointerSaveOffset; 31*9880d681SAndroid Build Coastguard Worker 32*9880d681SAndroid Build Coastguard Worker /** 33*9880d681SAndroid Build Coastguard Worker * \brief Find register[s] that can be used in function prologue and epilogue 34*9880d681SAndroid Build Coastguard Worker * 35*9880d681SAndroid Build Coastguard Worker * Find register[s] that can be use as scratch register[s] in function 36*9880d681SAndroid Build Coastguard Worker * prologue and epilogue to save various registers (Link Register, Base 37*9880d681SAndroid Build Coastguard Worker * Pointer, etc.). Prefer R0/R12, if available. Otherwise choose whatever 38*9880d681SAndroid Build Coastguard Worker * register[s] are available. 39*9880d681SAndroid Build Coastguard Worker * 40*9880d681SAndroid Build Coastguard Worker * This method will return true if it is able to find enough unique scratch 41*9880d681SAndroid Build Coastguard Worker * registers (1 or 2 depending on the requirement). If it is unable to find 42*9880d681SAndroid Build Coastguard Worker * enough available registers in the block, it will return false and set 43*9880d681SAndroid Build Coastguard Worker * any passed output parameter that corresponds to a required unique register 44*9880d681SAndroid Build Coastguard Worker * to PPC::NoRegister. 45*9880d681SAndroid Build Coastguard Worker * 46*9880d681SAndroid Build Coastguard Worker * \param[in] MBB The machine basic block to find an available register for 47*9880d681SAndroid Build Coastguard Worker * \param[in] UseAtEnd Specify whether the scratch register will be used at 48*9880d681SAndroid Build Coastguard Worker * the end of the basic block (i.e., will the scratch 49*9880d681SAndroid Build Coastguard Worker * register kill a register defined in the basic block) 50*9880d681SAndroid Build Coastguard Worker * \param[in] TwoUniqueRegsRequired Specify whether this basic block will 51*9880d681SAndroid Build Coastguard Worker * require two unique scratch registers. 52*9880d681SAndroid Build Coastguard Worker * \param[out] SR1 The scratch register to use 53*9880d681SAndroid Build Coastguard Worker * \param[out] SR2 The second scratch register. If this pointer is not null 54*9880d681SAndroid Build Coastguard Worker * the function will attempt to set it to an available 55*9880d681SAndroid Build Coastguard Worker * register regardless of whether there is a hard requirement 56*9880d681SAndroid Build Coastguard Worker * for two unique scratch registers. 57*9880d681SAndroid Build Coastguard Worker * \return true if the required number of registers was found. 58*9880d681SAndroid Build Coastguard Worker * false if the required number of scratch register weren't available. 59*9880d681SAndroid Build Coastguard Worker * If either output parameter refers to a required scratch register 60*9880d681SAndroid Build Coastguard Worker * that isn't available, it will be set to an invalid value. 61*9880d681SAndroid Build Coastguard Worker */ 62*9880d681SAndroid Build Coastguard Worker bool findScratchRegister(MachineBasicBlock *MBB, 63*9880d681SAndroid Build Coastguard Worker bool UseAtEnd, 64*9880d681SAndroid Build Coastguard Worker bool TwoUniqueRegsRequired = false, 65*9880d681SAndroid Build Coastguard Worker unsigned *SR1 = nullptr, 66*9880d681SAndroid Build Coastguard Worker unsigned *SR2 = nullptr) const; 67*9880d681SAndroid Build Coastguard Worker bool twoUniqueScratchRegsRequired(MachineBasicBlock *MBB) const; 68*9880d681SAndroid Build Coastguard Worker 69*9880d681SAndroid Build Coastguard Worker /** 70*9880d681SAndroid Build Coastguard Worker * \brief Create branch instruction for PPC::TCRETURN* (tail call return) 71*9880d681SAndroid Build Coastguard Worker * 72*9880d681SAndroid Build Coastguard Worker * \param[in] MBB that is terminated by PPC::TCRETURN* 73*9880d681SAndroid Build Coastguard Worker */ 74*9880d681SAndroid Build Coastguard Worker void createTailCallBranchInstr(MachineBasicBlock &MBB) const; 75*9880d681SAndroid Build Coastguard Worker 76*9880d681SAndroid Build Coastguard Worker public: 77*9880d681SAndroid Build Coastguard Worker PPCFrameLowering(const PPCSubtarget &STI); 78*9880d681SAndroid Build Coastguard Worker 79*9880d681SAndroid Build Coastguard Worker unsigned determineFrameLayout(MachineFunction &MF, 80*9880d681SAndroid Build Coastguard Worker bool UpdateMF = true, 81*9880d681SAndroid Build Coastguard Worker bool UseEstimate = false) const; 82*9880d681SAndroid Build Coastguard Worker 83*9880d681SAndroid Build Coastguard Worker /// emitProlog/emitEpilog - These methods insert prolog and epilog code into 84*9880d681SAndroid Build Coastguard Worker /// the function. 85*9880d681SAndroid Build Coastguard Worker void emitPrologue(MachineFunction &MF, MachineBasicBlock &MBB) const override; 86*9880d681SAndroid Build Coastguard Worker void emitEpilogue(MachineFunction &MF, MachineBasicBlock &MBB) const override; 87*9880d681SAndroid Build Coastguard Worker 88*9880d681SAndroid Build Coastguard Worker bool hasFP(const MachineFunction &MF) const override; 89*9880d681SAndroid Build Coastguard Worker bool needsFP(const MachineFunction &MF) const; 90*9880d681SAndroid Build Coastguard Worker void replaceFPWithRealFP(MachineFunction &MF) const; 91*9880d681SAndroid Build Coastguard Worker 92*9880d681SAndroid Build Coastguard Worker void determineCalleeSaves(MachineFunction &MF, BitVector &SavedRegs, 93*9880d681SAndroid Build Coastguard Worker RegScavenger *RS = nullptr) const override; 94*9880d681SAndroid Build Coastguard Worker void processFunctionBeforeFrameFinalized(MachineFunction &MF, 95*9880d681SAndroid Build Coastguard Worker RegScavenger *RS = nullptr) const override; 96*9880d681SAndroid Build Coastguard Worker void addScavengingSpillSlot(MachineFunction &MF, RegScavenger *RS) const; 97*9880d681SAndroid Build Coastguard Worker 98*9880d681SAndroid Build Coastguard Worker bool spillCalleeSavedRegisters(MachineBasicBlock &MBB, 99*9880d681SAndroid Build Coastguard Worker MachineBasicBlock::iterator MI, 100*9880d681SAndroid Build Coastguard Worker const std::vector<CalleeSavedInfo> &CSI, 101*9880d681SAndroid Build Coastguard Worker const TargetRegisterInfo *TRI) const override; 102*9880d681SAndroid Build Coastguard Worker 103*9880d681SAndroid Build Coastguard Worker MachineBasicBlock::iterator 104*9880d681SAndroid Build Coastguard Worker eliminateCallFramePseudoInstr(MachineFunction &MF, MachineBasicBlock &MBB, 105*9880d681SAndroid Build Coastguard Worker MachineBasicBlock::iterator I) const override; 106*9880d681SAndroid Build Coastguard Worker 107*9880d681SAndroid Build Coastguard Worker bool restoreCalleeSavedRegisters(MachineBasicBlock &MBB, 108*9880d681SAndroid Build Coastguard Worker MachineBasicBlock::iterator MI, 109*9880d681SAndroid Build Coastguard Worker const std::vector<CalleeSavedInfo> &CSI, 110*9880d681SAndroid Build Coastguard Worker const TargetRegisterInfo *TRI) const override; 111*9880d681SAndroid Build Coastguard Worker 112*9880d681SAndroid Build Coastguard Worker /// targetHandlesStackFrameRounding - Returns true if the target is 113*9880d681SAndroid Build Coastguard Worker /// responsible for rounding up the stack frame (probably at emitPrologue 114*9880d681SAndroid Build Coastguard Worker /// time). targetHandlesStackFrameRounding()115*9880d681SAndroid Build Coastguard Worker bool targetHandlesStackFrameRounding() const override { return true; } 116*9880d681SAndroid Build Coastguard Worker 117*9880d681SAndroid Build Coastguard Worker /// getReturnSaveOffset - Return the previous frame offset to save the 118*9880d681SAndroid Build Coastguard Worker /// return address. getReturnSaveOffset()119*9880d681SAndroid Build Coastguard Worker unsigned getReturnSaveOffset() const { return ReturnSaveOffset; } 120*9880d681SAndroid Build Coastguard Worker 121*9880d681SAndroid Build Coastguard Worker /// getTOCSaveOffset - Return the previous frame offset to save the 122*9880d681SAndroid Build Coastguard Worker /// TOC register -- 64-bit SVR4 ABI only. getTOCSaveOffset()123*9880d681SAndroid Build Coastguard Worker unsigned getTOCSaveOffset() const { return TOCSaveOffset; } 124*9880d681SAndroid Build Coastguard Worker 125*9880d681SAndroid Build Coastguard Worker /// getFramePointerSaveOffset - Return the previous frame offset to save the 126*9880d681SAndroid Build Coastguard Worker /// frame pointer. getFramePointerSaveOffset()127*9880d681SAndroid Build Coastguard Worker unsigned getFramePointerSaveOffset() const { return FramePointerSaveOffset; } 128*9880d681SAndroid Build Coastguard Worker 129*9880d681SAndroid Build Coastguard Worker /// getBasePointerSaveOffset - Return the previous frame offset to save the 130*9880d681SAndroid Build Coastguard Worker /// base pointer. getBasePointerSaveOffset()131*9880d681SAndroid Build Coastguard Worker unsigned getBasePointerSaveOffset() const { return BasePointerSaveOffset; } 132*9880d681SAndroid Build Coastguard Worker 133*9880d681SAndroid Build Coastguard Worker /// getLinkageSize - Return the size of the PowerPC ABI linkage area. 134*9880d681SAndroid Build Coastguard Worker /// getLinkageSize()135*9880d681SAndroid Build Coastguard Worker unsigned getLinkageSize() const { return LinkageSize; } 136*9880d681SAndroid Build Coastguard Worker 137*9880d681SAndroid Build Coastguard Worker const SpillSlot * 138*9880d681SAndroid Build Coastguard Worker getCalleeSavedSpillSlots(unsigned &NumEntries) const override; 139*9880d681SAndroid Build Coastguard Worker 140*9880d681SAndroid Build Coastguard Worker bool enableShrinkWrapping(const MachineFunction &MF) const override; 141*9880d681SAndroid Build Coastguard Worker 142*9880d681SAndroid Build Coastguard Worker /// Methods used by shrink wrapping to determine if MBB can be used for the 143*9880d681SAndroid Build Coastguard Worker /// function prologue/epilogue. 144*9880d681SAndroid Build Coastguard Worker bool canUseAsPrologue(const MachineBasicBlock &MBB) const override; 145*9880d681SAndroid Build Coastguard Worker bool canUseAsEpilogue(const MachineBasicBlock &MBB) const override; 146*9880d681SAndroid Build Coastguard Worker }; 147*9880d681SAndroid Build Coastguard Worker } // End llvm namespace 148*9880d681SAndroid Build Coastguard Worker 149*9880d681SAndroid Build Coastguard Worker #endif 150