131d157ae1ac2cd9c787dc3c1d28e64c682803844Jia Liu//===-- SparcFrameLowering.h - Define frame lowering for Sparc --*- 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 SPARC_FRAMEINFO_H
1533464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov#define SPARC_FRAMEINFO_H
1633464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov
1733464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov#include "Sparc.h"
1816c29b5f285f375be53dabaa73e3e91107485fe4Anton Korobeynikov#include "llvm/Target/TargetFrameLowering.h"
1933464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov
2033464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikovnamespace llvm {
2133464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov
22cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hinesclass SparcSubtarget;
2316c29b5f285f375be53dabaa73e3e91107485fe4Anton Korobeynikovclass SparcFrameLowering : public TargetFrameLowering {
2433464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikovpublic:
25cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  explicit SparcFrameLowering(const SparcSubtarget &ST);
2633464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov
2733464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov  /// emitProlog/emitEpilog - These methods insert prolog and epilog code into
2833464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov  /// the function.
29dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  void emitPrologue(MachineFunction &MF) const override;
30dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  void emitEpilogue(MachineFunction &MF, MachineBasicBlock &MBB) const override;
31d0c38176690e9602a93a20a43f1bd084564a8116Anton Korobeynikov
32dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  void
33dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  eliminateCallFramePseudoInstr(MachineFunction &MF,
34dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                                MachineBasicBlock &MBB,
35dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                                MachineBasicBlock::iterator I) const override;
36700ed80d3da5e98e05ceb90e9bfb66058581a6dbEli Bendersky
37dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  bool hasReservedCallFrame(const MachineFunction &MF) const override;
38dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  bool hasFP(const MachineFunction &MF) const override;
39530086925695f074b0e1e38a0d88ee6a4c91c54cVenkatraman Govindaraju  void processFunctionBeforeCalleeSavedScan(MachineFunction &MF,
40dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                                     RegScavenger *RS = nullptr) const override;
41530086925695f074b0e1e38a0d88ee6a4c91c54cVenkatraman Govindaraju
42530086925695f074b0e1e38a0d88ee6a4c91c54cVenkatraman Govindarajuprivate:
431e06bcbd633175d75d13aaa5695ca0633ba86068Venkatraman Govindaraju  // Remap input registers to output registers for leaf procedure.
44530086925695f074b0e1e38a0d88ee6a4c91c54cVenkatraman Govindaraju  void remapRegsForLeafProc(MachineFunction &MF) const;
45530086925695f074b0e1e38a0d88ee6a4c91c54cVenkatraman Govindaraju
461e06bcbd633175d75d13aaa5695ca0633ba86068Venkatraman Govindaraju  // Returns true if MF is a leaf procedure.
47530086925695f074b0e1e38a0d88ee6a4c91c54cVenkatraman Govindaraju  bool isLeafProc(MachineFunction &MF) const;
483a1e76d62706f2773c23a684446b4c549c151669Bill Wendling
493a1e76d62706f2773c23a684446b4c549c151669Bill Wendling
503a1e76d62706f2773c23a684446b4c549c151669Bill Wendling  // Emits code for adjusting SP in function prologue/epilogue.
513a1e76d62706f2773c23a684446b4c549c151669Bill Wendling  void emitSPAdjustment(MachineFunction &MF,
523a1e76d62706f2773c23a684446b4c549c151669Bill Wendling                        MachineBasicBlock &MBB,
533a1e76d62706f2773c23a684446b4c549c151669Bill Wendling                        MachineBasicBlock::iterator MBBI,
543a1e76d62706f2773c23a684446b4c549c151669Bill Wendling                        int NumBytes, unsigned ADDrr, unsigned ADDri) const;
553a1e76d62706f2773c23a684446b4c549c151669Bill Wendling
5633464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov};
5733464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov
5833464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov} // End llvm namespace
5933464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov
6033464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov#endif
61