1b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum//=- HexagonFrameLowering.h - Define frame lowering for Hexagon --*- C++ -*--=//
2b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum//
3b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum//                     The LLVM Compiler Infrastructure
4b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum//
5b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum// This file is distributed under the University of Illinois Open Source
6b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum// License. See LICENSE.TXT for details.
7b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum//
8b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum//===----------------------------------------------------------------------===//
9b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum
10b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum#ifndef HEXAGON_FRAMEINFO_H
11b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum#define HEXAGON_FRAMEINFO_H
12b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum
13b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum#include "Hexagon.h"
14b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum#include "llvm/Target/TargetFrameLowering.h"
15b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum
16b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicumnamespace llvm {
17b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum
18b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicumclass HexagonFrameLowering : public TargetFrameLowering {
19b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicumprivate:
20b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum  void determineFrameLayout(MachineFunction &MF) const;
21b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum
22b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicumpublic:
23cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  explicit HexagonFrameLowering() : TargetFrameLowering(StackGrowsDown, 8, 0) {}
24b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum
25b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum  /// emitProlog/emitEpilog - These methods insert prolog and epilog code into
26b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum  /// the function.
27dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  void emitPrologue(MachineFunction &MF) const override;
28dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  void emitEpilogue(MachineFunction &MF, MachineBasicBlock &MBB) const override;
29dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  bool spillCalleeSavedRegisters(MachineBasicBlock &MBB,
30dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                                 MachineBasicBlock::iterator MI,
31dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                                 const std::vector<CalleeSavedInfo> &CSI,
32dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                                 const TargetRegisterInfo *TRI) const override;
33dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
34dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  void
35dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  eliminateCallFramePseudoInstr(MachineFunction &MF,
36dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                                MachineBasicBlock &MBB,
37dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                                MachineBasicBlock::iterator I) const override;
38dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
39dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  bool
40b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum  restoreCalleeSavedRegisters(MachineBasicBlock &MBB,
41b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum                              MachineBasicBlock::iterator MI,
42b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum                              const std::vector<CalleeSavedInfo> &CSI,
43dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                              const TargetRegisterInfo *TRI) const override;
44dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  int getFrameIndexOffset(const MachineFunction &MF, int FI) const override;
45dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  bool hasFP(const MachineFunction &MF) const override;
46b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum  bool hasTailCall(MachineBasicBlock &MBB) const;
47b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum};
48b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum
49b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum} // End llvm namespace
50b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum
51b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum#endif
52