ARMFrameLowering.h revision 252503
1218885Sdim//==-- ARMTargetFrameLowering.h - Define frame lowering for ARM --*- C++ -*-==// 2218885Sdim// 3218885Sdim// The LLVM Compiler Infrastructure 4218885Sdim// 5218885Sdim// This file is distributed under the University of Illinois Open Source 6218885Sdim// License. See LICENSE.TXT for details. 7218885Sdim// 8218885Sdim//===----------------------------------------------------------------------===// 9218885Sdim// 10218885Sdim// 11218885Sdim// 12218885Sdim//===----------------------------------------------------------------------===// 13218885Sdim 14218885Sdim#ifndef ARM_FRAMEINFO_H 15218885Sdim#define ARM_FRAMEINFO_H 16218885Sdim 17218885Sdim#include "ARM.h" 18218885Sdim#include "ARMSubtarget.h" 19218885Sdim#include "llvm/Target/TargetFrameLowering.h" 20218885Sdim 21218885Sdimnamespace llvm { 22218885Sdim class ARMSubtarget; 23218885Sdim 24218885Sdimclass ARMFrameLowering : public TargetFrameLowering { 25218885Sdimprotected: 26218885Sdim const ARMSubtarget &STI; 27218885Sdim 28218885Sdimpublic: 29218885Sdim explicit ARMFrameLowering(const ARMSubtarget &sti) 30252503Sandrew : TargetFrameLowering(StackGrowsDown, sti.getStackAlignment(), 0, 8), 31218885Sdim STI(sti) { 32218885Sdim } 33218885Sdim 34218885Sdim /// emitProlog/emitEpilog - These methods insert prolog and epilog code into 35218885Sdim /// the function. 36218885Sdim void emitPrologue(MachineFunction &MF) const; 37218885Sdim void emitEpilogue(MachineFunction &MF, MachineBasicBlock &MBB) const; 38218885Sdim 39218885Sdim bool spillCalleeSavedRegisters(MachineBasicBlock &MBB, 40218885Sdim MachineBasicBlock::iterator MI, 41218885Sdim const std::vector<CalleeSavedInfo> &CSI, 42218885Sdim const TargetRegisterInfo *TRI) const; 43218885Sdim 44218885Sdim bool restoreCalleeSavedRegisters(MachineBasicBlock &MBB, 45218885Sdim MachineBasicBlock::iterator MI, 46218885Sdim const std::vector<CalleeSavedInfo> &CSI, 47218885Sdim const TargetRegisterInfo *TRI) const; 48218885Sdim 49218885Sdim bool hasFP(const MachineFunction &MF) const; 50218885Sdim bool hasReservedCallFrame(const MachineFunction &MF) const; 51218885Sdim bool canSimplifyCallFramePseudos(const MachineFunction &MF) const; 52218885Sdim int getFrameIndexReference(const MachineFunction &MF, int FI, 53218885Sdim unsigned &FrameReg) const; 54221345Sdim int ResolveFrameIndexReference(const MachineFunction &MF, 55221345Sdim int FI, 56218885Sdim unsigned &FrameReg, int SPAdj) const; 57218885Sdim int getFrameIndexOffset(const MachineFunction &MF, int FI) const; 58218885Sdim 59218885Sdim void processFunctionBeforeCalleeSavedScan(MachineFunction &MF, 60218885Sdim RegScavenger *RS) const; 61218885Sdim 62218885Sdim private: 63218885Sdim void emitPushInst(MachineBasicBlock &MBB, MachineBasicBlock::iterator MI, 64218885Sdim const std::vector<CalleeSavedInfo> &CSI, unsigned StmOpc, 65218885Sdim unsigned StrOpc, bool NoGap, 66234353Sdim bool(*Func)(unsigned, bool), unsigned NumAlignedDPRCS2Regs, 67221345Sdim unsigned MIFlags = 0) const; 68218885Sdim void emitPopInst(MachineBasicBlock &MBB, MachineBasicBlock::iterator MI, 69218885Sdim const std::vector<CalleeSavedInfo> &CSI, unsigned LdmOpc, 70218885Sdim unsigned LdrOpc, bool isVarArg, bool NoGap, 71234353Sdim bool(*Func)(unsigned, bool), 72234353Sdim unsigned NumAlignedDPRCS2Regs) const; 73249423Sdim 74249423Sdim virtual void eliminateCallFramePseudoInstr( 75249423Sdim MachineFunction &MF, 76249423Sdim MachineBasicBlock &MBB, 77249423Sdim MachineBasicBlock::iterator MI) const; 78218885Sdim}; 79218885Sdim 80218885Sdim} // End llvm namespace 81218885Sdim 82218885Sdim#endif 83