131d157ae1ac2cd9c787dc3c1d28e64c682803844Jia Liu//===-- XCoreFrameLowering.h - Frame info for XCore Target ------*- C++ -*-===//
2b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne//
3b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne//                     The LLVM Compiler Infrastructure
4b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne//
5b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne// This file is distributed under the University of Illinois Open Source
6b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne// License. See LICENSE.TXT for details.
7b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne//
8b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne//===----------------------------------------------------------------------===//
9b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne//
10b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne// This file contains XCore frame information that doesn't fit anywhere else
11b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne// cleanly...
12b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne//
13b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne//===----------------------------------------------------------------------===//
14b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne
15b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne#ifndef XCOREFRAMEINFO_H
16b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne#define XCOREFRAMEINFO_H
17b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne
1816c29b5f285f375be53dabaa73e3e91107485fe4Anton Korobeynikov#include "llvm/Target/TargetFrameLowering.h"
19b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne#include "llvm/Target/TargetMachine.h"
20b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne
21b25baef26f03b9909b65dd5f762b38f93000445dRichard Osbornenamespace llvm {
2233464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov  class XCoreSubtarget;
23b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne
2416c29b5f285f375be53dabaa73e3e91107485fe4Anton Korobeynikov  class XCoreFrameLowering: public TargetFrameLowering {
25b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne  public:
2616c29b5f285f375be53dabaa73e3e91107485fe4Anton Korobeynikov    XCoreFrameLowering(const XCoreSubtarget &STI);
2733464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov
2833464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov    /// emitProlog/emitEpilog - These methods insert prolog and epilog code into
2933464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov    /// the function.
30dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    void emitPrologue(MachineFunction &MF) const override;
31dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    void emitEpilogue(MachineFunction &MF,
32dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                      MachineBasicBlock &MBB) const override;
33b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne
34cd775ceff0b25a0b026f643a7990c2924bd310a3Anton Korobeynikov    bool spillCalleeSavedRegisters(MachineBasicBlock &MBB,
35dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                                  MachineBasicBlock::iterator MI,
36dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                                  const std::vector<CalleeSavedInfo> &CSI,
37dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                                  const TargetRegisterInfo *TRI) const override;
38cd775ceff0b25a0b026f643a7990c2924bd310a3Anton Korobeynikov    bool restoreCalleeSavedRegisters(MachineBasicBlock &MBB,
39dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                                  MachineBasicBlock::iterator MI,
40dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                                  const std::vector<CalleeSavedInfo> &CSI,
41dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                                  const TargetRegisterInfo *TRI) const override;
42cd775ceff0b25a0b026f643a7990c2924bd310a3Anton Korobeynikov
43700ed80d3da5e98e05ceb90e9bfb66058581a6dbEli Bendersky    void eliminateCallFramePseudoInstr(MachineFunction &MF,
44dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                                  MachineBasicBlock &MBB,
45dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                                  MachineBasicBlock::iterator I) const override;
46700ed80d3da5e98e05ceb90e9bfb66058581a6dbEli Bendersky
47dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    bool hasFP(const MachineFunction &MF) const override;
48d0c38176690e9602a93a20a43f1bd084564a8116Anton Korobeynikov
4994c5ae08750f314bc3cf1bf882b686244a3927d9Anton Korobeynikov    void processFunctionBeforeCalleeSavedScan(MachineFunction &MF,
50dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                                     RegScavenger *RS = nullptr) const override;
5194c5ae08750f314bc3cf1bf882b686244a3927d9Anton Korobeynikov
5236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    void processFunctionBeforeFrameFinalized(MachineFunction &MF,
53dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                                     RegScavenger *RS = nullptr) const override;
5436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
55b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne    //! Stack slot size (4 bytes)
56b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne    static int stackSlotSize() {
57b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne      return 4;
58b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne    }
59b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne  };
60b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne}
61b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne
62b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne#endif // XCOREFRAMEINFO_H
63