116c29b5f285f375be53dabaa73e3e91107485fe4Anton Korobeynikov//==- MSP430FrameLowering.h - Define frame lowering for MSP430 --*- C++ -*--==//
233464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov//
333464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov//                     The LLVM Compiler Infrastructure
433464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov//
533464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov// This file is distributed under the University of Illinois Open Source
633464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov// License. See LICENSE.TXT for details.
733464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov//
833464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov//===----------------------------------------------------------------------===//
933464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov//
1033464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov//
1133464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov//
1233464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov//===----------------------------------------------------------------------===//
1333464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov
1433464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov#ifndef MSP430_FRAMEINFO_H
1533464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov#define MSP430_FRAMEINFO_H
1633464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov
1733464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov#include "MSP430.h"
1833464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov#include "MSP430Subtarget.h"
1916c29b5f285f375be53dabaa73e3e91107485fe4Anton Korobeynikov#include "llvm/Target/TargetFrameLowering.h"
2033464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov
2133464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikovnamespace llvm {
2233464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov  class MSP430Subtarget;
2333464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov
2416c29b5f285f375be53dabaa73e3e91107485fe4Anton Korobeynikovclass MSP430FrameLowering : public TargetFrameLowering {
2533464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikovprotected:
2633464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov  const MSP430Subtarget &STI;
2733464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov
2833464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikovpublic:
2916c29b5f285f375be53dabaa73e3e91107485fe4Anton Korobeynikov  explicit MSP430FrameLowering(const MSP430Subtarget &sti)
3016c29b5f285f375be53dabaa73e3e91107485fe4Anton Korobeynikov    : TargetFrameLowering(TargetFrameLowering::StackGrowsDown, 2, -2), STI(sti) {
3133464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov  }
3233464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov
3333464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov  /// emitProlog/emitEpilog - These methods insert prolog and epilog code into
3433464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov  /// the function.
3533464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov  void emitPrologue(MachineFunction &MF) const;
3633464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov  void emitEpilogue(MachineFunction &MF, MachineBasicBlock &MBB) const;
37d0c38176690e9602a93a20a43f1bd084564a8116Anton Korobeynikov
38700ed80d3da5e98e05ceb90e9bfb66058581a6dbEli Bendersky  void eliminateCallFramePseudoInstr(MachineFunction &MF,
39700ed80d3da5e98e05ceb90e9bfb66058581a6dbEli Bendersky                                     MachineBasicBlock &MBB,
40700ed80d3da5e98e05ceb90e9bfb66058581a6dbEli Bendersky                                     MachineBasicBlock::iterator I) const;
41700ed80d3da5e98e05ceb90e9bfb66058581a6dbEli Bendersky
42cd775ceff0b25a0b026f643a7990c2924bd310a3Anton Korobeynikov  bool spillCalleeSavedRegisters(MachineBasicBlock &MBB,
43cd775ceff0b25a0b026f643a7990c2924bd310a3Anton Korobeynikov                                 MachineBasicBlock::iterator MI,
44cd775ceff0b25a0b026f643a7990c2924bd310a3Anton Korobeynikov                                 const std::vector<CalleeSavedInfo> &CSI,
45cd775ceff0b25a0b026f643a7990c2924bd310a3Anton Korobeynikov                                 const TargetRegisterInfo *TRI) const;
46cd775ceff0b25a0b026f643a7990c2924bd310a3Anton Korobeynikov  bool restoreCalleeSavedRegisters(MachineBasicBlock &MBB,
47cd775ceff0b25a0b026f643a7990c2924bd310a3Anton Korobeynikov                                   MachineBasicBlock::iterator MI,
48cd775ceff0b25a0b026f643a7990c2924bd310a3Anton Korobeynikov                                   const std::vector<CalleeSavedInfo> &CSI,
49cd775ceff0b25a0b026f643a7990c2924bd310a3Anton Korobeynikov                                   const TargetRegisterInfo *TRI) const;
50cd775ceff0b25a0b026f643a7990c2924bd310a3Anton Korobeynikov
51d0c38176690e9602a93a20a43f1bd084564a8116Anton Korobeynikov  bool hasFP(const MachineFunction &MF) const;
52d0c38176690e9602a93a20a43f1bd084564a8116Anton Korobeynikov  bool hasReservedCallFrame(const MachineFunction &MF) const;
533080d23fde4981835d8a7faf46c152441fadb11fHal Finkel  void processFunctionBeforeFrameFinalized(MachineFunction &MF,
543080d23fde4981835d8a7faf46c152441fadb11fHal Finkel                                       RegScavenger *RS = NULL) const;
5533464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov};
5633464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov
5733464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov} // End llvm namespace
5833464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov
5933464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov#endif
60