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