ARMFrameLowering.h revision dce4a407a24b04eebc6a376f8e62b41aaa7b071f
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//==-- ARMTargetFrameLowering.h - Define frame lowering for ARM --*- C++ -*-==// 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The LLVM Compiler Infrastructure 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This file is distributed under the University of Illinois Open Source 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// License. See LICENSE.TXT for details. 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//===----------------------------------------------------------------------===// 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//===----------------------------------------------------------------------===// 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef ARM_FRAMEINFO_H 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define ARM_FRAMEINFO_H 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ARMSubtarget.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "llvm/Target/TargetFrameLowering.h" 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace llvm { 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) class ARMSubtarget; 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ARMFrameLowering : public TargetFrameLowering { 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)protected: 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ARMSubtarget &STI; 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)public: 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit ARMFrameLowering(const ARMSubtarget &sti) 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : TargetFrameLowering(StackGrowsDown, sti.getStackAlignment(), 0, 4), 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) STI(sti) { 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// emitProlog/emitEpilog - These methods insert prolog and epilog code into 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// the function. 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void emitPrologue(MachineFunction &MF) const override; 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void emitEpilogue(MachineFunction &MF, MachineBasicBlock &MBB) const override; 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool spillCalleeSavedRegisters(MachineBasicBlock &MBB, 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MachineBasicBlock::iterator MI, 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::vector<CalleeSavedInfo> &CSI, 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const TargetRegisterInfo *TRI) const override; 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool restoreCalleeSavedRegisters(MachineBasicBlock &MBB, 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MachineBasicBlock::iterator MI, 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::vector<CalleeSavedInfo> &CSI, 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const TargetRegisterInfo *TRI) const override; 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool hasFP(const MachineFunction &MF) const override; 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool hasReservedCallFrame(const MachineFunction &MF) const override; 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool canSimplifyCallFramePseudos(const MachineFunction &MF) const override; 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int getFrameIndexReference(const MachineFunction &MF, int FI, 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned &FrameReg) const override; 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int ResolveFrameIndexReference(const MachineFunction &MF, int FI, 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned &FrameReg, int SPAdj) const; 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int getFrameIndexOffset(const MachineFunction &MF, int FI) const override; 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void processFunctionBeforeCalleeSavedScan(MachineFunction &MF, 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RegScavenger *RS) const override; 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void adjustForSegmentedStacks(MachineFunction &MF) const override; 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 62 private: 63 void emitPushInst(MachineBasicBlock &MBB, MachineBasicBlock::iterator MI, 64 const std::vector<CalleeSavedInfo> &CSI, unsigned StmOpc, 65 unsigned StrOpc, bool NoGap, 66 bool(*Func)(unsigned, bool), unsigned NumAlignedDPRCS2Regs, 67 unsigned MIFlags = 0) const; 68 void emitPopInst(MachineBasicBlock &MBB, MachineBasicBlock::iterator MI, 69 const std::vector<CalleeSavedInfo> &CSI, unsigned LdmOpc, 70 unsigned LdrOpc, bool isVarArg, bool NoGap, 71 bool(*Func)(unsigned, bool), 72 unsigned NumAlignedDPRCS2Regs) const; 73 74 void 75 eliminateCallFramePseudoInstr(MachineFunction &MF, 76 MachineBasicBlock &MBB, 77 MachineBasicBlock::iterator MI) const override; 78}; 79 80} // End llvm namespace 81 82#endif 83