blob: c042bec016cac17ccb1d7e2474e4fa08602a6ce4 [file] [log] [blame]
Pete Couperus2d1f6d62017-08-24 15:40:33 +00001//===- ARCFrameLowering.h - Define frame lowering for ARC -------*- C++ -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This class implements the ARC specific frame lowering.
11//
12//===----------------------------------------------------------------------===//
13
14#ifndef LLVM_LIB_TARGET_ARC_ARCFRAMELOWERING_H
15#define LLVM_LIB_TARGET_ARC_ARCFRAMELOWERING_H
16
17#include "ARC.h"
18#include "llvm/CodeGen/MachineBasicBlock.h"
19#include "llvm/CodeGen/MachineFrameInfo.h"
David Blaikie1be62f02017-11-03 22:32:11 +000020#include "llvm/CodeGen/TargetFrameLowering.h"
Pete Couperus2d1f6d62017-08-24 15:40:33 +000021
22namespace llvm {
23
24class MachineFunction;
25class ARCSubtarget;
26class ARCInstrInfo;
27
28class ARCFrameLowering : public TargetFrameLowering {
29public:
30 ARCFrameLowering(const ARCSubtarget &st)
31 : TargetFrameLowering(TargetFrameLowering::StackGrowsDown, 4, 0), ST(st) {
32 }
33
34 /// Insert Prologue into the function.
35 void emitPrologue(MachineFunction &MF, MachineBasicBlock &MBB) const override;
36
37 /// Insert Epilogue into the function.
38 void emitEpilogue(MachineFunction &MF, MachineBasicBlock &MBB) const override;
39
40 /// Add explicit callee save registers.
41 void determineCalleeSaves(MachineFunction &MF, BitVector &SavedRegs,
42 RegScavenger *RS) const override;
43
44 bool spillCalleeSavedRegisters(MachineBasicBlock &MBB,
45 MachineBasicBlock::iterator MI,
46 const std::vector<CalleeSavedInfo> &CSI,
47 const TargetRegisterInfo *TRI) const override;
48
49 bool
50 restoreCalleeSavedRegisters(MachineBasicBlock &MBB,
51 MachineBasicBlock::iterator MI,
52 std::vector<CalleeSavedInfo> &CSI,
53 const TargetRegisterInfo *TRI) const override;
54
55 void processFunctionBeforeFrameFinalized(MachineFunction &MF,
56 RegScavenger *RS) const override;
57
58 bool hasFP(const MachineFunction &MF) const override;
59
60 MachineBasicBlock::iterator
61 eliminateCallFramePseudoInstr(MachineFunction &MF, MachineBasicBlock &MBB,
62 MachineBasicBlock::iterator I) const override;
63
64 bool assignCalleeSavedSpillSlots(
65 llvm::MachineFunction &, const llvm::TargetRegisterInfo *,
66 std::vector<llvm::CalleeSavedInfo> &) const override;
67
68private:
69 void adjustStackToMatchRecords(MachineBasicBlock &MBB,
70 MachineBasicBlock::iterator MI,
71 bool allocate) const;
72
73 const ARCSubtarget &ST;
74};
75
76} // end namespace llvm
77
78#endif // LLVM_LIB_TARGET_ARC_ARCFRAMELOWERING_H